# 火山方舟文档全文 > 当前发布版本中全部公开列出的文档正文,按目录顺序排列。 Documents: 501 [Documentation index](https://ark.volcengine.com/llms.txt) --- # 产品简介 Source: https://ark.volcengine.com/region:cn-beijing/docs/product-overview # 快速调用 完成首次 API 调用,请参见 [快速入门](/docs/quick-start) **选项:Python** ```Python import os from arkruntime import Ark client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv('ARK_API_KEY'), ) response = client.responses.create( model="doubao-seed-2-1-pro-260915", input="hello", # Replace with your prompt # thinking={"type": "disabled"}, # Manually disable deep thinking ) print(response) ``` **选项:Curl** ```Bash # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "input": "hello" }' ``` Windows CMD 环境下请将 `$ARK_API_KEY` 替换为 `%ARK_API_KEY%`,PowerShell 环境下替换为 `$env:ARK_API_KEY`。 **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/responses" ) func main() { client := arkruntime.NewClientWithApiKey( // Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() resp, err := client.CreateResponses(ctx, &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", Input: responses.NewStringResponsesInput("hello"), }) if err != nil { fmt.Printf("response error: %v\n", err) return } fmt.Println(resp) } ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.service.ArkService; import com.volcengine.ark.runtime.models.responses.*; public class DemoSample { public static void main(String[] args) { // Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey String apiKey = System.getenv("ARK_API_KEY"); // The base URL for model invocation ArkService arkService = ArkService.builder().apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); ResponsesRequest request = ResponsesRequest.builder() .model("doubao-seed-2-1-pro-260915") .input(ResponsesInput.ofString("hello")) // Replace with your prompt // .thinking(Thinking.builder().type(ThinkingMode.DISABLED).build()) // Manually disable deep thinking .build(); Response resp = arkService.createResponse(request); System.out.println(resp); arkService.shutdownExecutor(); } } ``` **选项:OpenAI SDK** ```Python import os from openai import OpenAI client = OpenAI( base_url='https://ark.cn-beijing.volces.com/api/v3', # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv('ARK_API_KEY'), ) response = client.responses.create( model="doubao-seed-2-1-pro-260915", input="hello", # Replace with your prompt extra_body={ # "thinking": {"type": "disabled"}, # Manually disable deep thinking }, ) print(response) ``` # 浏览模型 完整模型列表:[模型列表](/docs/model-list) **[Doubao Seedance 2.5](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seedance-2-5)** 豆包高性能视频生成模型 4~30 秒视频生成,全模态参考输入 **[Doubao Seed Evolving](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-evolving)** Seed 最新 Coding&Agent 模型 周级迭代,持续进化 Coding 与 Agent 能力 **[Doubao Seedream 5.0 pro](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seedream-5-0-pro)** 最新图像创作模型 编辑更可控、生产更落地、效果更自然 # 基础使用 快速掌握模型使用规则、调用限制和常见场景示例。 [深度思考](/docs/deep-thinking) 先思考再回答,质量显著提升 [视频生成](/docs/video-generation-tutorial) 生成高清流畅的影视级视频 [图片理解](/docs/image-understanding) 接收图片,根据图片信息回复 [图片生成](/docs/seedream-4-0-5-0) 基于图文,生成高质量图片 [视频理解](/docs/video-understanding) 接收视频,根据视频信息回复 [联网搜索](/docs/web-search) 联网获取实时知识 [文档理解](/docs/document-understanding) 接收 PDF,根据文档信息回复 [函数调用](/docs/function-calling) 调用自定义工具,增强模型能力 # 进阶使用 了解如何拓展模型能力、提升性能、降低成本 [续写模式](/docs/continuation-mode) 预填部分 `assistant` 消息内容,引导和控制模型输出 [批量推理](/docs/batch-inference) 大幅提升吞吐,降低成本,适合无需即时响应的任务 [视觉定位](/docs/grounding) 在图片中找到对应的目标,并返回目标的坐标 [上下文缓存](/docs/context-cache) 缓存固定上下文,减少重复计算开销,降低成本 [文件输入](/docs/file-api) 使用 File API 上传并预处理视频、图片、PDF [云部署 MCP](/docs/mcp-remote-mcp) 调用各类垂直领域 MCP 工具,增强模型能力 [3D 生成](/docs/3d-generation) 快速生成具备多边形面片与 PBR 材质的高精度 3D 资产 [GUI Agent 能力](/docs/gui-task-processing) 在计算机等真实 GUI 环境中完成自动化任务 --- # 快速入门 Source: https://ark.volcengine.com/region:cn-beijing/docs/quick-start 数分钟内完成您的首次 API 调用。 **[快速入门(新手版)](/docs/quick-start-beginner)** 为零基础用户设计的快速入门 **[方舟文档 MCP](/docs/tutorials-mcp)** 极简配置,协同 AI 完成大模型开发 **[Agent Plan](/docs/agent-plan-personal-get-started)** 一站式智能体开发方案,快速搭建专属 AI Agent # 1 获取并配置 API Key 1. 获取 API Key:在控制台左下角切换到目标项目,在左侧导航中选择 [**API Key 管理**](https://ark.volcengine.com/region:cn-beijing/apiKey),创建或获取方舟 API Key。 2. 配置环境变量:在终端中运行下面命令(替换 `your_api_key_here` 为您的方舟 API Key),配置 API Key 到环境变量。 配置持久化环境变量方法参见 [环境变量配置指南](/docs/environment-variable-configuration-guide)。 **选项:macOS** ```Bash export ARK_API_KEY="your_api_key_here" ``` **选项:Linux** ```Bash export ARK_API_KEY="your_api_key_here" ``` **选项:Windows_CMD** ```Bash setx ARK_API_KEY "your_api_key_here" ``` **选项:Windows_PowerShell** ```PowerShell $env:ARK_API_KEY = "your_api_key_here" ``` # 2 开通模型服务 访问 [开通管理页面](https://ark.volcengine.com/region:cn-beijing/openManagement) 开通模型服务。 # 3 安装 SDK 安装方舟官方 SDK 或第三方 SDK。 **选项:Python** > 运行环境中需安装 [Python](https://www.python.org/downloads/) 版本 3.8 或以上。 * 安装方舟官方 SDK: ```Bash python -m pip install --upgrade arkruntime ``` * 安装 OpenAI SDK: ```Bash pip install openai ``` **选项:Go** > 环境中安装 [Go](https://golang.google.cn/doc/install) 版本 1.20 或以上。 运行以下命令安装方舟官方 Go SDK: ```Bash go get github.com/volcengine/ark-runtime-go@latest ``` 在代码中引入: ```Go import "github.com/volcengine/ark-runtime-go/arkruntime" ``` **选项:Java** > 环境中安装 [Java](https://www.java.com/en/download/help/index_installing.html) 版本 1.8 或以上。 在项目的 `pom.xml` 文件中添加以下依赖配置。 ```XML com.volcengine ark-runtime ``` > **说明** > > 请从 [Maven Central](https://central.sonatype.com/artifact/com.volcengine/ark-runtime) 获取最新稳定版本,并将 `` 替换为该版本号。 # 4 发起 API 请求 以下按输入输出类别列举的典型任务,选择任意示例代码体验如何通过 API 调用及体验大模型及方舟平台能力。 ## 文本生成 传入文本类信息给模型,进行问答、分析、改写、摘要、编程、翻译等任务,并返回文本结果。 |输入 |输出预览 | | --- | --- | |Hello |* 思考:Got it, let\'s see. The user said "hello". I need to respond in a friendly and welcoming way. Since the system prompt mentions a professional but friendly tone, I should keep it natural. Maybe something like "Hello! How can I assist you today?" That\'s simple, polite, and open-ended to encourage the user to share what they need help with. | \ | |* 回答:Hello! How can I assist you today? Whether you have a question, need help with something specific, or just want to chat, feel free to let me know. 😊 | **选项:Python** ```Python import os from arkruntime import Ark client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=os.getenv('ARK_API_KEY'), ) response = client.responses.create( model="doubao-seed-2-1-pro-260915", input="hello" ) for item in response.output: if item.type == "message": for content in item.content: if content.type == "output_text": print(content.text) ``` **选项:Curl** ```Bash # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "input": "hello" }' ``` * 关闭深度思考:配置 `"thinking":{"type": "disabled"} `。 **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/responses" ) func main() { client := arkruntime.NewClientWithApiKey( // Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() resp, err := client.CreateResponses(ctx, &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", Input: responses.NewStringResponsesInput("hello"), }) if err != nil { fmt.Printf("response error: %v\n", err) return } fmt.Println(resp) } ``` **选项:Java** ```Java package com.ark.example; import com.volcengine.ark.runtime.service.ArkService; import com.volcengine.ark.runtime.models.responses.*; public class demo { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); // The base URL for model invocation ArkService arkService = ArkService.builder().apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); ResponsesRequest request = ResponsesRequest.builder() .model("doubao-seed-2-1-pro-260915") .input(ResponsesInput.ofString("hello")) .build(); Response resp = arkService.createResponse(request); System.out.println(resp); arkService.shutdownExecutor(); } } ``` **选项:OpenAI SDK** ```Python import os from openai import OpenAI client = OpenAI( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=os.getenv('ARK_API_KEY'), ) response = client.responses.create( model="doubao-seed-2-1-pro-260915", input="hello" ) for item in response.output: if item.type == "message": for content in item.content: if content.type == "output_text": print(content.text) ``` * [文本生成](/docs/text-generation):文本生成使用指南。 * [深度思考](/docs/responses-api-deep-thinking):深度思考能力使用指南。 * [迁移至 Responses API](/docs/responses-api-migration):新用户推荐,更简洁的上下文管理能力、强大的工具调用能力。 * [Chat API](/docs/chat-api):存量业务迭代推荐,广泛使用的 API。 ## 多模态理解 传入图片、视频、PDF 文件给模型,进行分析、内容审核、问答、视觉定位等基于多模态理解相关任务,并返回文本结果。 |输入 |输出预览 | | --- | --- | |![](https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/planet_comparison.png) |* 思考:表格列出了水星、金星、地球、火星、木星、土星、天王星和海王星,共 8 颗行星。地球位于第 3 个数据行。 | \ | |* 回答:表格中列出了 8 颗行星。地球位于第 3 个数据行;如果把表头算作第 1 行,则地球位于第 4 行。 | \ |> 根据图片,表格中列出了多少颗行星,地球位于哪一行? | | **选项:Python** ```Python import os from arkruntime import Ark client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=os.getenv('ARK_API_KEY'), ) response = client.responses.create( model="doubao-seed-2-1-pro-260915", input=[ { "role": "user", "content": [ { "type": "input_image", "image_url": "https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/planet_comparison.png" }, { "type": "input_text", "text": "根据图片,表格中列出了多少颗行星,地球位于哪一行?" }, ], } ] ) for item in response.output: if item.type == "reasoning": for summary in item.summary: if summary.type == "summary_text": print(f"思考:{summary.text}") elif item.type == "message": for content in item.content: if content.type == "output_text": print(f"回答:{content.text}") ``` **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "input": [ { "role": "user", "content": [ { "type": "input_image", "image_url": "https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/planet_comparison.png" }, { "type": "input_text", "text": "根据图片,表格中列出了多少颗行星,地球位于哪一行?" } ] } ] }' ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/responses" ) func main() { client := arkruntime.NewClientWithApiKey( // Get API Key:https://ark.volcengine.com/region:cn-beijing/apikey os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() inputMessage := responses.InputItem{ OneOf: responses.NewItemEasyMessageInputItemSum( responses.ItemEasyMessage{ Role: responses.NewOptMessageRole(responses.MessageRoleUser), Content: responses.NewContentItemArrayMessageContent( []responses.ContentItem{ responses.ContentItem{OneOf: responses.NewContentItemImageContentItemSum(responses.ContentItemImage{Type: responses.ContentItemImageTypeInputImage, ImageURL: responses.NewOptString("https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/planet_comparison.png")})}, responses.ContentItem{OneOf: responses.NewContentItemTextContentItemSum(responses.ContentItemText{Type: responses.ContentItemTextTypeInputText, Text: "根据图片,表格中列出了多少颗行星,地球位于哪一行?"})}, }, ), }, ), } resp, err := client.CreateResponses(ctx, &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", Input: responses.NewInputItemArrayResponsesInput([]responses.InputItem{inputMessage}), }) if err != nil { fmt.Printf("response error: %v\n", err) return } fmt.Println(resp) } ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.service.ArkService; import com.volcengine.ark.runtime.models.responses.*; public class demo { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); ArkService arkService = ArkService.builder().apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); ResponsesRequest request = ResponsesRequest.builder() .model("doubao-seed-2-1-pro-260915") .input(ResponsesInput.ofList(java.util.Arrays.asList(ItemEasyMessage.builder().role(MessageRole.USER).content( MessageContent.ofList(java.util.Arrays.asList(ContentItemImage.builder() .imageUrl("https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/planet_comparison.png").build(), ContentItemText.builder().text("根据图片,表格中列出了多少颗行星,地球位于哪一行?").build()))) .build()))) .build(); Response resp = arkService.createResponse(request); System.out.println(resp); arkService.shutdownExecutor(); } } ``` **选项:OpenAI SDK** ```Python import os from openai import OpenAI client = OpenAI( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=os.getenv('ARK_API_KEY'), ) response = client.responses.create( model="doubao-seed-2-1-pro-260915", input=[ { "role": "user", "content": [ { "type": "input_image", "image_url": "https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/planet_comparison.png" }, { "type": "input_text", "text": "根据图片,表格中列出了多少颗行星,地球位于哪一行?" }, ], } ] ) for item in response.output: if item.type == "reasoning": for summary in item.summary: if summary.type == "summary_text": print(f"思考:{summary.text}") elif item.type == "message": for content in item.content: if content.type == "output_text": print(f"回答:{content.text}") ``` * [多模态理解](/docs/multimodal-understanding):多模态理解详细使用指南。 * [视觉定位 Grounding](/docs/grounding):图片中找到对应目标并返回坐标任务。 * [文件输入(Files API)](/docs/file-api):传入图片、视频、文档接口。 * [GUI Agent 能力](/docs/gui-task-processing):在计算机/移动设备中完成自动化任务。 ## 图片生成 传入图片、文字给模型,进行以下场景&任务: * 广告、海报、组图等图片生成; * 增改元素、颜色更换等图片编辑; * 油墨、水墨等风格切换。 |提示词 |输出预览 | | --- | --- | |充满活力的特写编辑肖像,模特眼神犀利,头戴雕塑感帽子,色彩拼接丰富,眼部焦点锐利,景深较浅,具有 Vogue 杂志封面的美学风格,采用中画幅拍摄,工作室灯光效果强烈。 |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/00fb66006eb84b16965b620b6e1f2d78~tplv-goo7wpa0wc-image.image) | **选项:Python** ```Python import os # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark client = Ark( # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key:https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv('ARK_API_KEY'), ) imagesResponse = client.images.generate( # Replace with Model ID model="doubao-seedream-5-0-260128", prompt="充满活力的特写编辑肖像,模特眼神犀利,头戴雕塑感帽子,色彩拼接丰富,眼部焦点锐利,景深较浅,具有Vogue杂志封面的美学风格,采用中画幅拍摄,工作室灯光效果强烈。", size="2K", response_format="url", watermark=True ) print(imagesResponse.data[0].url) ``` **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/images/generations \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seedream-5-0-260128", "prompt": "充满活力的特写编辑肖像,模特眼神犀利,头戴雕塑感帽子,色彩拼接丰富,眼部焦点锐利,景深较浅,具有Vogue杂志封面的美学风格,采用中画幅拍摄,工作室灯光效果强烈。", "size": "2K", "watermark": true }' ``` * 您可按需替换 Model ID。Model ID 查询见 [模型列表](/docs/model-list)。 **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.images.*; import com.volcengine.ark.runtime.service.ArkService; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; import java.util.concurrent.TimeUnit; public class ImageGenerationsExample { public static void main(String[] args) { // Get API Key:https://ark.volcengine.com/region:cn-beijing/apikey String apiKey = System.getenv("ARK_API_KEY"); ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); Dispatcher dispatcher = new Dispatcher(); ArkService service = ArkService.builder() .baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .build(); CreateImageGenerationRequest generateRequest = CreateImageGenerationRequest.builder() .model("doubao-seedream-5-0-260128") // Replace with Model ID .prompt("充满活力的特写编辑肖像,模特眼神犀利,头戴雕塑感帽子,色彩拼接丰富,眼部焦点锐利,景深较浅,具有Vogue杂志封面的美学风格,采用中画幅拍摄,工作室灯光效果强烈。") .size("2K") .sequentialImageGeneration(SequentialImageGenerationMode.DISABLED) .responseFormat(ResponseFormat.URL) .stream(false) .watermark(true) .build(); ImageGenerationResponse imagesResponse = service.generateImages(generateRequest); System.out.println(imagesResponse.getData().get(0).getUrl()); service.shutdownExecutor(); } } ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" model "github.com/volcengine/ark-runtime-go/arkruntime/model/images" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), // Get API Key:https://ark.volcengine.com/region:cn-beijing/apikey arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), // The base URL for model invocation ) ctx := context.Background() generateReq := &model.CreateImageGenerationRequest{ Model: "doubao-seedream-5-0-260128", // Replace with Model ID Prompt: model.NewOptString("充满活力的特写编辑肖像,模特眼神犀利,头戴雕塑感帽子,色彩拼接丰富,眼部焦点锐利,景深较浅,具有Vogue杂志封面的美学风格,采用中画幅拍摄,工作室灯光效果强烈。"), Size: model.NewOptString("2K"), ResponseFormat: model.NewOptResponseFormat(model.ResponseFormatURL), Watermark: model.NewOptBool(true), } imagesResponse, err := client.GenerateImages(ctx, generateReq) if err != nil { fmt.Printf("generate images error: %v\n", err) return } fmt.Printf("%s\n", imagesResponse.Data[0].URL.Or("")) } ``` **选项:OpenAI** ```Python import os from openai import OpenAI client = OpenAI( base_url="https://ark.cn-beijing.volces.com/api/v3", # The base URL for model invocation api_key=os.getenv('ARK_API_KEY'), # Get API Key:https://ark.volcengine.com/region:cn-beijing/apikey ) imagesResponse = client.images.generate( # Replace with Model ID model="doubao-seedream-5-0-260128", prompt="充满活力的特写编辑肖像,模特眼神犀利,头戴雕塑感帽子,色彩拼接丰富,眼部焦点锐利,景深较浅,具有Vogue杂志封面的美学风格,采用中画幅拍摄,工作室灯光效果强烈。", size="2K", response_format="url", extra_body={ "watermark": True, }, ) print(imagesResponse.data[0].url) ``` * [Doubao Seedream 4.0-5.0 教程](/docs/seedream-4-0-5-0):主流生图模型能力以及如何通过 API 调用。 * [Seedream 4.0-5.0 提示词指南](/docs/seedream-4-0-5-0-prompt-guide):使用生图模型时,如何编写提示词。 ## 视频生成 通过文本描述、图像素材、视频素材,快速生成高质量、风格多样的视频内容。 |提示词 |输出画面预览 | | --- | --- | |一位身穿绿色亮片礼服的女性站在粉红色背景前,周围飘落着五彩斑斓的彩纸。 |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/aae3d0c636954bdd9e66e7a23e98c480~tplv-goo7wpa0wc-image.image) | **选项:Python** ```Python import os import time # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark client = Ark( base_url="https://ark.cn-beijing.volces.com/api/v3", # The base URL for model invocation api_key=os.environ.get("ARK_API_KEY"), # Get API Key:https://ark.volcengine.com/region:cn-beijing/apikey ) if __name__ == "__main__": print("----- create request -----") create_result = client.content_generation.tasks.create( model="doubao-seedance-2-5-260628", # Replace with Model ID content=[ { # Combination of text prompt and parameters "type": "text", "text": "一位身穿绿色亮片礼服的女性站在粉红色背景前,周围飘落着五彩斑斓的彩纸 --wm true --dur 5" } ], watermark=True, ) print(create_result) # Polling query section print("----- polling task status -----") task_id = create_result.id max_wait = 600 # Maximum wait time in seconds interval = 10 # Initial polling interval start = time.time() while time.time() - start < max_wait: get_result = client.content_generation.tasks.get(task_id=task_id) status = get_result.status if status == "succeeded": print("----- task succeeded -----") print(get_result) break elif status == "failed": print("----- task failed -----") print(f"Error: {get_result.error}") break else: print(f"Current status: {status}, retrying after {interval:.0f}s...") time.sleep(interval) interval = min(interval * 1.5, 30) else: raise TimeoutError(f"Task {task_id} timed out after {max_wait}s. " f"Task may still be running - check status manually.") ``` **选项:Java** ```Java package com.ark.sample; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; import com.volcengine.ark.runtime.models.content_generation.*; import com.volcengine.ark.runtime.service.ArkService; public class ContentGenerationTaskExample { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); ArkService service = ArkService.builder() .baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation .apiKey(apiKey) .build(); System.out.println("----- create request -----"); List contents = new ArrayList<>(); contents.add(ContentItem.builder() .type(ContentType.TEXT) .text("一位身穿绿色亮片礼服的女性站在粉红色背景前,周围飘落着五彩斑斓的彩纸 --wm true --dur 5") .build()); // Create a video generation task CreateContentGenerationTaskRequest createRequest = CreateContentGenerationTaskRequest.builder() .model("doubao-seedance-2-5-260628") // Replace with Model ID .content(contents) .watermark(true) .build(); CreateContentGenerationTaskResponse createResult = service.createContentGenerationTask(createRequest); System.out.println(createResult); // Get the details of the task String taskId = createResult.getId(); String getRequest = taskId; System.out.println("----- polling task status -----"); while (true) { try { ContentGenerationTask getResponse = service.getContentGenerationTask(getRequest); String status = getResponse.getStatus().toString(); if ("succeeded".equalsIgnoreCase(status)) { System.out.println("----- task succeeded -----"); System.out.println(getResponse); service.shutdownExecutor(); break; } else if ("failed".equalsIgnoreCase(status)) { System.out.println("----- task failed -----"); System.out.println("Error: " + getResponse.getStatus()); service.shutdownExecutor(); break; } else { System.out.printf("Current status: %s, Retrying in 3 seconds...\n", status); TimeUnit.SECONDS.sleep(3); } } catch (InterruptedException ie) { Thread.currentThread().interrupt(); System.err.println("Polling interrupted"); service.shutdownExecutor(); break; } } } } ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "time" "github.com/volcengine/ark-runtime-go/arkruntime" model "github.com/volcengine/ark-runtime-go/arkruntime/model/contentgeneration" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), // Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), // The base URL for model invocation ) ctx := context.Background() // Replace with Model ID modelEp := "doubao-seedance-2-5-260628" fmt.Println("----- create request -----") createReq := &model.CreateContentGenerationTaskRequest{ Model: modelEp, Content: []model.ContentItem{ { Type: model.ContentTypeText, Text: model.NewOptString("一位身穿绿色亮片礼服的女性站在粉红色背景前,周围飘落着五彩斑斓的彩纸 --wm true --dur 5"), }, }, Watermark: model.NewOptBool(true), } createResp, err := client.CreateContentGenerationTask(ctx, createReq) if err != nil { fmt.Printf("create content generation error: %v", err) return } taskID := createResp.ID fmt.Printf("Task Created with ID: %s", taskID) // Polling query section fmt.Println("----- polling task status -----") for { getReq := taskID getResp, err := client.GetContentGenerationTask(ctx, getReq) if err != nil { fmt.Printf("get content generation task error: %v", err) return } status := getResp.Status if status == "succeeded" { fmt.Println("----- task succeeded -----") fmt.Printf("Task ID: %s \n", getResp.ID) fmt.Printf("Model: %s \n", getResp.Model) fmt.Printf("Video URL: %s \n", getResp.Content.Or(model.TaskContent{}).VideoURL.Or("")) fmt.Printf("Completion Tokens: %d \n", getResp.Usage.Or(model.TaskUsage{}).CompletionTokens) fmt.Printf("Created At: %d, Updated At: %d", getResp.CreatedAt.Or(0), getResp.UpdatedAt.Or(0)) return } else if status == "failed" { fmt.Println("----- task failed -----") if getResp.Error.IsSet() { fmt.Printf("Error Code: %s, Message: %s", getResp.Error.Value.Code, getResp.Error.Value.Message) } return } else { fmt.Printf("Current status: %s, Retrying in 3 seconds... \n", status) time.Sleep(3 * time.Second) } } } ``` * [视频生成教程](/docs/video-generation-tutorial):学习如何使用模型的视频生成能力,包括文本生成视频、首尾帧生视频、首帧生成视频等。 * [Doubao Seedance 2.5 提示词指南](/docs/seedance-2-5-prompt-guide):使用生视频模型时,如何编写提示词。 ## 工具使用 通过工具/插件让模型具体读取外部数据及函数的能力,包括 * 内置工具:联网搜索、图片处理、知识库检索等已集成至方舟平台的工具。 * 三方工具:兼容 MCP 的三方工具。 * 自定义工具:您自行定义及开发的工具。 |输入 |输出预览 | | --- | --- | |What's the weather like in Beijing? |According to the latest weather data as of March 10, 2026, the current weather in Beijing is sunny with a gentle wind (less than level 3). The temperature around 11:30 AM is approximately 9°C, and it is expected to reach a high of 12°C during the day. The weather will remain clear at night with a low temperature of 1°C. | \ | |**Source**: Weather forecasts updated on March 10, 2026, from the Central Meteorological Observatory. | \ | |**Note: Data is accurate as of the latest available update at 05:30 AM on March 10.** | **选项:Python** ```Python import os from arkruntime import Ark client = Ark( base_url="https://ark.cn-beijing.volces.com/api/v3", api_key=os.getenv("ARK_API_KEY"), ) response = client.responses.create( model="doubao-seed-2-1-pro-260915", input=[{"role": "user", "content": "What's the weather like in Beijing?"}], tools=[ { "type": "web_search", "max_keyword": 2, } ], stream=False, ) for item in response.output: if item.type == "message": for content in item.content: if content.type == "output_text": print(content.text) ``` **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Authorization: Bearer $ARK_API_KEY" \ -H 'Content-Type: application/json' \ -d '{ "model": "doubao-seed-2-1-pro-260915", "stream": false, "tools": [ { "type": "web_search", "max_keyword": 2 } ], "input": [ { "role": "user", "content": [ { "type": "input_text", "text": "What is the weather like in Beijing?" } ] } ] }' ``` **选项:Java** ```Java package com.ark.sample; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.JsonNode; import com.volcengine.ark.runtime.models.responses.*; import com.volcengine.ark.runtime.service.ArkService; import java.util.Arrays; import java.util.List; public class demo { public static ObjectMapper om = new ObjectMapper(); public demo() throws JsonProcessingException { } public static List buildTools() { WebSearchTool t = WebSearchTool.builder().maxKeyword(2).build(); System.out.println(Arrays.asList(t)); return Arrays.asList(t); } public static void main(String[] args) throws JsonProcessingException { String apiKey = System.getenv("ARK_API_KEY"); ArkService arkService = ArkService.builder().apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); ResponsesRequest req = ResponsesRequest.builder() .model("doubao-seed-2-1-pro-260915") .input(ResponsesInput.ofList(java.util.Arrays.asList(ItemEasyMessage.builder().role(MessageRole.USER).content( MessageContent.ofList(java.util.Arrays.asList(ContentItemText.builder().text("What's the weather like in Beijing?").build())) ).build()))) .tools(buildTools()) .build(); Response resp = arkService.createResponse(req); System.out.println(resp); arkService.shutdownExecutor(); } } ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/responses" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) request := &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", Input: responses.NewStringResponsesInput("What is the weather in Beijing today?"), Tools: []responses.Tool{ { OneOf: responses.NewWebSearchToolToolSum( responses.WebSearchTool{ Type: responses.WebSearchToolTypeWebSearch, MaxKeyword: responses.NewOptInt32(2), }, ), }, }, MaxToolCalls: responses.NewOptInt64(1), } response, err := client.CreateResponses(context.Background(), request) if err != nil { fmt.Printf("response error: %v\n", err) return } fmt.Printf("Response: %v\n", response) } ``` **选项:OpenAI SDK** ```Python import os from openai import OpenAI client = OpenAI( base_url="https://ark.cn-beijing.volces.com/api/v3", api_key=os.getenv("ARK_API_KEY"), ) response = client.responses.create( model="doubao-seed-2-1-pro-260915", input=[{"role": "user", "content": "What's the weather like in Beijing?"}], tools=[ { "type": "web_search", "max_keyword": 2, } ], stream=False, ) for item in response.output: if item.type == "message": for content in item.content: if content.type == "output_text": print(content.text) ``` * [工具调用](/docs/responses-api-tool-calling):学习如何让模型使用内置工具,如网页搜索、知识库检索、豆包助手等能力。 * [Function Calling(函数调用)](/docs/function-calling):学习如何让模型调用自定义的工具。 * [云部署 MCP / Remote MCP](/docs/mcp-remote-mcp):学习如何让模型使用 MCP 服务。 # 5 下一步 现在您已经完成了首次方舟模型服务的 API 调用,您可以探索模型的更多能力,包括: * [模型列表](/docs/model-list):快速浏览方舟提供的模型全集以及各个模型所具备的能力,快速根据您的实际场景匹配到合适的模型。 * [模型接入指南(LLM) - 标准流程](/docs/go-live-access-sop):把方舟大模型接入生产环境的完整流程(参数配置、Harness 接入、突发流量爬坡、上线监控)。 * [模型接入指南(LLM) - 常见问题](/docs/go-live-faq):接入 / 上线过程中的效果、可用性、接入配置、选型常见问题。 * [模型接入指南(LLM) - 性能评测](/docs/go-live-benchmark-guide):上线前跑一次性能基线评测(TTFT / TPOT / E2E / 缓存命中率)。 --- # 模型价格 Source: https://ark.volcengine.com/region:cn-beijing/docs/model-pricing 不同模型服务支持的能力及单价各不相同,本文为您介绍各模型的计费公式及单价,方便您进行模型价格查阅和比较。 > **说明** > > * 如需了解计费方式及详细计费逻辑,请参见 [模型服务计费说明](/docs/model-service-pricing)。 > > * 支持通过 [价格计算器](https://www.volcengine.com/pricing?product=ark_bd&tab=2) **预估** 满足业务需求所需的费用。 > * 本文价格和 [定价详情页](https://www.volcengine.com/pricing?product=ark_bd&tab=1) 仅作为商品规格和价格的参考,具体可购买的商品规格及费用请以实际下单结果为准。 # 大语言模型 ## 在线推理(常规) > **注意** > > deepseek-v4.1-flash 模型高峰、空闲时段如下。实际费用以**请求完成时间**对应的计费时段为准。 > - 高峰时段:**北京时间周一至周五 09:00–12:00、14:00–18:00**。 > - 空闲时段:除上述高峰时段外,其余均为空闲时段。 |模型名称 |条件 |输入(非音频) |输入(音频) |缓存存储 |缓存命中(非音频) |缓存命中(音频) |输出 | \ | |输入长度:千 token |元/百万token |元/百万token |元/百万token/小时 |元/百万token |元/百万token |元/百万token | |---|---|---|---|---|---|---|---| |doubao-seed-evolving |输入长度 [0, 1024] |6.00 |\- |0.017 |1.20 |\- |30.00 | |doubao-seed-2.1-pro |输入长度 [0, 1024] |6.00 |\- |0.017 |1.20 |\- |30.00 | |doubao-seed-2.1-lite |输入长度 [0, 1024] |0.80 |12.00 |0.017 |0.16 |2.40 |2.70 | |doubao-seed-2.1-turbo |输入长度 [0, 256] |3.00 |\- |0.017 |0.60 |\- |15.00 | |doubao-seed-2.0-pro |输入长度 [0, 32] |3.2 |\- |0.017 |0.64 |\- |16.0 | |^^| | | | | | | | \ | |输入长度 (32, 128] |4.8 |\- |0.017 |0.96 |\- |24.0 | |^^| | | | | | | | \ | |输入长度 (128, 256] |9.6 |\- |0.017 |1.92 |\- |48.0 | |doubao-seed-2.0-lite |输入长度 [0, 32] |0.6 |9.0 |0.017 |0.12 |1.8 |3.6 | |^^| | | | | | | | \ | |输入长度 (32, 128] |0.9 |13.5 |0.017 |0.18 |2.7 |5.4 | |^^| | | | | | | | \ | |输入长度 (128, 256] |1.8 |27.0 |0.017 |0.36 |5.4 |10.8 | |doubao-seed-2.0-mini |输入长度 [0, 32] |0.2 |3.0 |0.017 |0.04 |0.6 |2.0 | |^^| | | | | | | | \ | |输入长度 (32, 128] |0.4 |6.0 |0.017 |0.08 |1.2 |4.0 | |^^| | | | | | | | \ | |输入长度 (128, 256] |0.8 |12.0 |0.017 |0.16 |2.4 |8.0 | |doubao-seed-2.0-code |输入长度 [0, 32] |3.2 |\- |0.017 |0.64 |\- |16.0 | |^^| | | | | | | | \ | |输入长度 (32, 128] |4.8 |\- |0.017 |0.96 |\- |24.0 | |^^| | | | | | | | \ | |输入长度 (128, 256] |9.6 |\- |0.017 |1.92 |\- |48.0 | |doubao-seed-character |输入长度 [0, 32] |0.80 |\- |0.017 |0.16 |\- |2.00 | |^^| | | | | | | | \ | |输入长度 (32, 128] |1.20 |\- |0.017 |0.16 |\- |6.00 | |doubao-seed-translation |\- |1.20 |\- |\- |\- |\- |3.60 | |glm-5.3-flash |\- |0.80 |\- |0.017 |0.23 |\- |2.80 | |glm-5.2 |\- |8.00 |\- |0.017 |2.00 |\- |28.00 | |deepseek-v4-1-flash |空闲时段 |1.00 |\- |0.017 |0.02 |\- |4.00 | |^^| | | | | | | | \ | |高峰时段 |2.00 |\- |0.017 |0.04 |\- |8.00 | |deepseek-v4-1-flash经济版 |空闲时段 |0.80 |\- |0.017 |0.016 |\- |3.20 | |^^| | | | | | | | \ | |高峰时段 |1.60 |\- |0.017 |0.032 |\- |6.40 | |deepseek-v4-pro正式版 |\- |9.00 |\- |0.017 |0.30 |\- |27.00 | |deepseek-v4-flash正式版 |\- |3.00 |\- |0.017 |0.10 |\- |9.00 | |deepseek-v4-pro预览版 |\- |9.00 |\- |0.017 |0.30 |\- |27.00 | |deepseek-v4-flash正式版 |\- |1.00 |\- |0.017 |0.20 |\- |2.00 | \ |> 调整前价格,2026-08-21 起不适用 | | | | | | | | |deepseek-v4-pro预览版 |\- |12.00 |\- |0.017 |1.00 |\- |24.00 | \ |> 调整前价格,2026-08-28 起不适用 | | | | | | | | > * 按 token 后付费,计算公式: > * `在线推理费用 = 输入(非音频)单价 × 输入(非音频)token + 输入(音频)单价 × 输入(音频)token + 缓存命中(非音频)单价 × 缓存命中(非音频)token + 缓存命中(音频)单价 × 缓存命中(音频)token + 缓存存储单价 × 缓存存储token × 时长 + 输出单价 × 输出token` > * 分段计费:部分模型适用,不同输入长度(和输出长度),token单价不同: > * 举例:请求输入 200k tokens,输出 14k tokens,满足 **输入长度 (128, 256]** 条件,模型输入输出 token 按照:输入 2.4 元/百万 token,输出 24 元/百万 token 单价计费。 > * 常见问题: [如何查看历史调用的输入输出长度的区间分布?](/docs/modelark-faq#fba666f2) ## 在线推理(低延迟) |模型名称 |条件 |输入(非音频) |输入(音频) |缓存命中(非音频) |缓存命中(音频) |输出 | \ | |千 token |元/百万token |元/百万token |元/百万token |元/百万token |元/百万token | |---|---|---|---|---|---|---| |doubao-seed-2.1-lite |输入长度 [0, 1024] |1.60 |24.00 |0.32 |4.80 |5.40 | |doubao-seed-2.1-turbo |输入长度 [0, 256] |6.00 |\- |1.20 |\- |30.00 | |doubao-seed-2.0-pro |输入长度 [0, 32] |9.6 |\- |1.92 |\- |48.0 | |^^| | | | | | | \ | |输入长度 (32, 128] |14.4 |\- |2.88 |\- |72.0 | |^^| | | | | | | \ | |输入长度 (128, 256] |28.8 |\- |5.76 |\- |144.0 | |doubao-seed-2.0-lite |输入长度 [0, 32] |1.2 |18.0 |0.24 |3.6 |7.2 | |^^| | | | | | | \ | |输入长度 (32, 128] |1.8 |27.0 |0.36 |5.4 |10.8 | |^^| | | | | | | \ | |输入长度 (128, 256] |3.6 |54.0 |0.72 |10.8 |21.6 | |doubao-seed-2.0-mini |输入长度 [0, 32] |0.4 |6.0 |0.08 |1.2 |4.0 | |^^ | | | | | | | \ | |输入长度 (32, 128] |0.8 |12.0 |0.16 |2.4 |8.0 | |^^ | | | | | | | \ | |输入长度 (128, 256] |1.6 |24.0 |0.32 |4.8 |16.0 | ## 在线推理(低优) |模型名称 |条件 |输入(非音频) |输入(音频) |缓存命中(非音频) |缓存命中(音频) |输出 | \ | |千 token |元/百万token |元/百万token |元/百万token |元/百万token |元/百万token | |---|---|---|---|---|---|---| |doubao-seed-2.1-pro |输入长度 [0, 1024] |3.00 |\- |1.20 |\- |15.00 | |doubao-seed-2.1-lite |输入长度 [0, 1024] |0.40 |6.00 |0.16 |2.40 |1.35 | |doubao-seed-2.1-turbo |输入长度 [0, 256] |1.50 |\- |0.60 |\- |7.50 | |doubao-seed-2.0-pro |输入长度 [0, 32] |1.60 |\- |0.64 |\- |8.00 | |^^| | | | | | | \ | |输入长度 (32, 128] |2.40 |\- |0.96 |\- |12.00 | |^^| | | | | | | \ | |输入长度 (128, 256] |4.80 |\- |1.92 |\- |24.00 | |doubao-seed-2.0-lite |输入长度 [0, 32] |0.30 |4.50 |0.12 |1.80 |1.80 | |^^| | | | | | | \ | |输入长度 (32, 128] |0.45 |6.75 |0.18 |2.70 |2.70 | |^^| | | | | | | \ | |输入长度 (128, 256] |0.90 |13.50 |0.36 |5.40 |5.40 | |doubao-seed-2.0-mini |输入长度 [0, 32] |0.10 |1.50 |0.04 |0.60 |1.00 | |^^| | | | | | | \ | |输入长度 (32, 128] |0.20 |3.00 |0.08 |1.20 |2.00 | |^^| | | | | | | \ | |输入长度 (128, 256] |0.40 |6.00 |0.16 |2.40 |4.00 | |deepseek-v4-1-flash |空闲时段 |0.50 |\- |0.02 |\- |2.00 | |^^|高峰时段 |1.00 |\- |0.04 |\- |4.00 | |deepseek-v4-pro正式版 |\- |4.50 |\- |0.30 |\- |13.50 | |deepseek-v4-flash正式版 |\- |1.50 |\- |0.10 |\- |4.50 | > * 在线推理(低优)的输入和输出 token 单价约为在线推理(常规)的 50%,缓存命中单价与在线推理(常规)相同。 > * 在线推理(低优)仅支持隐式缓存,无额外缓存存储费用。 ## 在线推理(TPM 保障包) 暂无支持的模型 > * 相比普通的按token计费模式,TPM保障包具备更高并发,更低的延迟,更强稳定性。支持的模型,以 [接入点创建页](https://ark.volcengine.com/region:cn-beijing/endpoint/create) 可选的付费方式为准。 > * 支持「按购买时长后付费」和「包天预付费」两种方式叠加购买,可灵活组合。 > * **不同长度请求抵扣 TPM 速度不同**,可通过 TPM 计算器查看相应的抵扣系数,估算实际需购买的**可抵扣TPM**。 ## 批量推理 |模型名称 |条件 |输入(非音频) |输入(音频) |缓存命中(非音频) |缓存命中(音频) |输出 | \ | |千 token |元/百万token |元/百万token |元/百万token |元/百万token |元/百万token | |---|---|---|---|---|---|---| |doubao-seed-2.1-pro |输入长度 [0, 1024] |3.00 |\- |1.20 |\- |15.00 | |doubao-seed-2.1-lite |输入长度 [0, 1024] |0.40 |6.00 |0.16 |2.40 |1.35 | |doubao-seed-2.1-turbo |输入长度 [0, 256] |1.50 |\- |0.60 |\- |7.50 | |doubao-seed-2.0-pro |输入长度 [0, 32] |1.6 |\- |0.64 |\- |8.0 | |^^| | | | | | | \ | |输入长度 (32, 128] |2.4 |\- |0.96 |\- |12.0 | |^^| | | | | | | \ | |输入长度 (128, 256] |4.8 |\- |1.92 |\- |24.0 | |doubao-seed-2.0-lite |输入长度 [0, 32] |0.3 |4.5 |0.12 |1.8 |1.8 | |^^| | | | | | | \ | |输入长度 (32, 128] |0.45 |6.75 |0.18 |2.7 |2.7 | |^^| | | | | | | \ | |输入长度 (128, 256] |0.9 |13.5 |0.36 |5.4 |5.4 | |doubao-seed-2.0-mini |输入长度 [0, 32] |0.1 |1.5 |0.04 |0.6 |1.0 | |^^| | | | | | | \ | |输入长度 (32, 128] |0.2 |3.0 |0.08 |1.2 |2.0 | |^^| | | | | | | \ | |输入长度 (128, 256] |0.4 |6.0 |0.16 |2.4 |4.0 | |doubao-seed-2.0-code |输入长度 [0, 32] |1.6 |\- |0.64 |\- |8.0 | |^^| | | | | | | \ | |输入长度 (32, 128] |2.4 |\- |0.96 |\- |12.0 | |^^| | | | | | | \ | |输入长度 (128, 256] |4.8 |\- |1.92 |\- |24.0 | |doubao-seed-translation |\- |0.60 |\- |0.24 |\- |1.80 | |deepseek-v4-1-flash |空闲时段 |0.50 |\- |0.02 |\- |2.00 | |^^|高峰时段 |1.00 |\- |0.04 |\- |4.00 | |deepseek-v4-pro正式版 |\- |4.50 |\- |0.30 |\- |13.50 | |deepseek-v4-flash正式版 |\- |1.50 |\- |0.10 |\- |4.50 | |deepseek-v4-pro预览版 |\- |4.50 |\- |0.30 |\- |13.50 | |deepseek-v4-flash正式版 |\- |0.50 |\- |0.20 |\- |1.00 | \ |> 调整前价格,2026-08-21 起不适用 | | | | | | | |deepseek-v4-pro预览版 |\- |6.00 |\- |1.00 |\- |12.00 | \ |> 调整前价格,2026-08-28 起不适用 | | | | | | | > * 按 token 后付费,计算公式:`批量推理费用 = 输入单价 × 输入token + 缓存命中单价 × 缓存命中token + 输出单价 × 输出token` > * 部分模型已支持透明前缀缓存能力,无需任何配置,享受命中缓存后的更低单价。 > * doubao-seed-2.0-pro 系列支持分段计费,即根据每次请求的输入及输出长度,采用不同 token 单价。 > * 举例:当某次请求的输入长度为 200k,输出长度为 14k 时,满足 **输入长度 (128, 256]** 条件,模型产生的所有 token 按照:输入4.8 元/百万 token,输出 24.0 元/百万 token 单价计费。 > * 查看往期调用的输入输出长度分布,请查看常见问题 [如何查看历史调用的输入输出长度的区间分布?](/docs/modelark-faq#fba666f2) # 视频生成模型 > **说明:价格说明** > > 视频价格由 **token 单价** 和 **token 用量** 共同决定。一般来说同等条件下: > * 高分辨率的单条视频价格 > 低分辨率 > * 含输入视频的单条视频价格 > 不含输入视频 > > 每条视频的价格可使用 [Seedance 2.0 系列价格计算器](https://bytedance.larkoffice.com/share/base/form/shrcnP1Bl0mqCP9OHCbjpe1oBkf) 、[Seedance 2.5 系列价格计算器](https://bytedance.larkoffice.com/share/base/form/shrcnhVCMxKxcwW1QML5r9u8nvh) 估算,也可参考下方 [价格示例](/docs/model-pricing#2653dbb3) 了解典型场景的视频价格。 ## 按token单价 |模型 |在线推理 |离线推理 | \ | |元/百万token |元/百万token | |---|---|---| |doubao-seedance-2.5 |* 输出视频分辨率为 480p,720p |暂不支持 | \ |> 按输出视频分辨率和输入是否包含视频区分定价 | * 输入不含视频:70.00 | | \ | | * 输入包含视频:42.00 | | \ | |* 输出视频分辨率为 1080p | | \ | | * 输入不含视频:77.00 | | \ | | * 输入包含视频:46.00 | | |doubao-seedance-2.0 |* 输出视频分辨率为 480p,720p |暂不支持 | \ |> 按输出视频分辨率和输入是否包含视频区分定价 | * 输入不含视频:46.00 | | \ | | * 输入包含视频:28.00 | | \ | |* 输出视频分辨率为 1080p | | \ | | * 输入不含视频:51.00 | | \ | | * 输入包含视频:31.00 | | \ | |* 输出视频分辨率为 4k | | \ | | * 输入不含视频:26.00 | | \ | | * 输入包含视频:16.00 | | |doubao-seedance-2.0-fast |* 输出视频分辨率为 480p,720p |暂不支持 | \ |> 按输入是否包含视频区分定价 | * 输入不含视频:37.00 | | \ | | * 输入包含视频:22.00 | | |doubao-seedance-2.0-mini |* 输出视频分辨率为 480p,720p |暂不支持 | \ |> 按输入是否包含视频区分定价 | * 输入不含视频:23.00 | | \ | | * 输入包含视频:14.00 | | |doubao-seedance-1.0-pro |15.00 |7.50 | |doubao-seedance-1.0-pro-fast |4.20 |2.10 | > * 仅对成功生成的视频计费。因审核等原因导致生成失败的,不收取费用。 > * 视频价格估算公式:`token 单价 × token 用量` > * token 用量估算公式:`(输入视频时长+输出视频时长) × 输出视频的宽 × 输出视频的高 × 输出视频的帧率/1024`,该计算结果为估算值,准确 token 用量以调用 API 后返回的 usage.**completion_tokens** 字段为准。 > * [Seedance 2.5 样片(Draft)模式](/docs/seedance-2-5#2.5_draft_mode) 包含两步任务,每个任务独立计费: > * Step 1:生成 Draft 视频,按 480p 视频计费。 > * Step 2:基于 Draft 生成正式视频,按目标分辨率计费: > * token 单价**根据 Step 1 是否包含输入视频确定**。 > * 计算 token 用量时,**输入视频时长按 Step 1 的输入视频计算,Draft 视频不计入**。 ## 价格示例 基于 token 用量公式估算的视频单价,方便您直观了解不同规格的视频成本。更多价格示例请参见 [火山方舟视频生成模型价格快查表](https://bytedance.larkoffice.com/wiki/FXaYwxzJ5i5Zdik32ipcWzt7nxd?table=tblns3WjGMNbR8sL&view=vewPa39Do4#CategoryScheduledTask)。 > **说明:最低 token 用量限制说明** > > 对于 Seedance 2.0 系列、Seedance 2.5 模型,当输入包含视频时,存在最低 token 用量限制: > * 如果估算 token 用量 < 最低 token 用量,则按最低 token 用量计算视频价格。 > * 最低 token 用量与分辨率、宽高比、视频输出时长有关,可查询 [Seedance 2.0 系列最低 token 用量表格(估算值)](https://bytedance.larkoffice.com/wiki/FXaYwxzJ5i5Zdik32ipcWzt7nxd?table=tblheIYDXXwYM43b&view=vew2CR2JYM#CategoryScheduledTask) 、[Seedance 2.5 最低 token 用量表格(估算值)](https://bytedance.larkoffice.com/wiki/FXaYwxzJ5i5Zdik32ipcWzt7nxd?table=tblheIYDXXwYM43b&view=vew2CR2JYM#CategoryScheduledTask) 或使用 [Seedance 2.0 系列价格计算器](https://bytedance.larkoffice.com/share/base/form/shrcnP1Bl0mqCP9OHCbjpe1oBkf) 、[Seedance 2.5 系列价格计算器](https://bytedance.larkoffice.com/share/base/form/shrcnhVCMxKxcwW1QML5r9u8nvh) 估算视频任务的最低 token 用量,准确用量以调用 API 后返回的 usage.**completion_tokens** 字段为准。 ### doubao-seedance-2.5 * **输入不含视频** |分辨率 |宽高比 |输出视频时长(秒) |doubao-seedance-2.5 视频价格 || |^^ |^^ |^^ |(元/个) |(元/s) | |---|---|---|---|---| |480p |16:9 |5 |3.36 |0.67 | |720p |16:9 |5 |7.56 |1.51 | |1080p |16:9 |5 |18.71 |3.74 | * **输入包含视频** |分辨率 |宽高比 |输入视频时长(秒) |输出视频时长(秒) |doubao-seedance-2.5 视频价格(元/个) | |---|---|---|---|---| |480p |16:9 |2~30 |5 |3.63~14.12 | \ | | | | |> 最低价对应输入2~4秒 | \ | | | | |> 最高价对应输入30秒 | |720p |16:9 |2~30 |5 |8.16~31.75 | \ | | | | |> 最低价对应输入2~4秒 | \ | | | | |> 最高价对应输入30秒 | |1080p |16:9 |2~30 |5 |20.12~78.25 | \ | | | | |> 最低价对应输入2~4秒 | \ | | | | |> 最高价对应输入30秒 | ### doubao-seedance-2.0 系列 * **输入不含视频** |分辨率 |宽高比 |输出视频时长(秒) |doubao-seedance-2.0 视频价格 ||doubao-seedance-2.0-fast 视频价格 ||doubao-seedance-2.0-mini 视频价格 || |^^ |^^ |^^ |(元/个) |(元/s) |(元/个) |(元/s) |(元/个) |(元/s) | |---|---|---|---|---|---|---|---|---| |480p |16:9 |5 |2.31 |0.46 |1.86 |0.37 |1.16 |0.23 | |720p |16:9 |5 |4.97 |0.99 |4.00 |0.80 |2.48 |0.50 | |1080p |16:9 |5 |12.39 |2.48 |不支持 |不支持 |不支持 |不支持 | |4k |16:9 |5 |25.27 |5.05 |不支持 |不支持 |不支持 |不支持 | * **输入包含视频** |分辨率 |宽高比 |输入视频时长(秒) |输出视频时长(秒) |doubao-seedance-2.0 |doubao-seedance-2.0-fast |doubao-seedance-2.0-mini | \ | | | | |视频价格(元/个) |视频价格(元/个) |视频价格(元/个) | |---|---|---|---|---|---|---| |480p |16:9 |2~15 |5 |2.53~5.62 |1.99~4.42 |1.27~2.81 | \ | | | | |> 最低价对应输入2~4秒 |> 最低价对应输入2~4秒 |> 最低价对应输入2~4秒 | \ | | | | |> 最高价对应输入15秒 |> 最高价对应输入15秒 |> 最高价对应输入15秒 | |720p |16:9 |2~15 |5 |5.44~12.10 |4.28~9.50 |2.72~6.05 | \ | | | | |> 最低价对应输入2~4秒 |> 最低价对应输入2~4秒 |> 最低价对应输入2~4秒 | \ | | | | |> 最高价对应输入15秒 |> 最高价对应输入15秒 |> 最高价对应输入15秒 | |1080p |16:9 |2~15 |5 |13.56~30.13 |不支持 |不支持 | \ | | | | |> 最低价对应输入2~4秒 | | | \ | | | | |> 最高价对应输入15秒 | | | |4k |16:9 |2~15 |5 |27.99~62.21 |不支持 |不支持 | \ | | | | |> 最低价对应输入2~4秒 | | | \ | | | | |> 最高价对应输入15秒 | | | ## 版权 IP 使用版权 IP 生成视频时,不同版权单价不同。具体价格信息请在 [体验中心](https://ark.volcengine.com/region:cn-beijing/experience/gen_video?model=doubao-seedance-2-0-260128) 查看。 版权视频生成费用按各输入 IP 的单价和视频时长(秒)求和: `单条视频版权费用 = Σ(每个输入 IP 的单价 × 视频时长(秒))` # 图片生成模型 |模型名称 |输入图单价(元/张) |输出图单价(元/张) | |---|---|---| |doubao-seedream-5-0-pro |* 首张免费 |**单图生成场景:** | \ |> 按生图场景区分定价 |* 第 2 张起:0.02 |* ≤ 261 万像素(分辨率 1.5K 及以下):0.30 | \ | | |* \> 261 万像素(分辨率 1.5K 以上):0.60 | \ | | | | \ | | |**图层拆分场景:** | \ | | |* ≤ 261 万像素(分辨率 1.5K 及以下):0.15 | \ | | |* \> 261 万像素(分辨率 1.5K 以上):0.30 | |doubao-seedream-5-0-flash |免费 |0.12 | |doubao-seedream-5-0-lite |免费 |0.22 | |doubao-seedream-4-5 |免费 |0.25 | |doubao-seedream-4-0 |免费 |0.20 | > **注意** > > * 因审核等原因未成功输出的图片不计费。 > * Seedream 5.0 pro 图层拆分场景,同一次请求输出的图层可能分别落在不同像素档位,按每个图层实际像素档位单独计费。 > * Seedream 5.0 lite / 4.5 / 4.0 组图场景,按实际生成的图片数量计费。 # 3D生成模型 |模型 |产物(3D 文件) |输出单价 | \ | | |元/次 | |---|---|---| |doubao-seed3d-2.0 |带纹理和 PBR 材质的 3D 模型文件 |2.40 | \ | | |> `3.00 万 token / 次` * `0.80 元/万 token` | |Hyper3d-Gen2 |* 白模 |1.80 | \ | |* 带纹理模型 |> `3.00 万 token / 次` * `0.60 元/万 token` | \ | |* PBR 材质模型 | | \ | |* 带纹理 + PBR 材质模型 | | |Hitem3d-2.0 |标准白模 |5.80 | \ | | |> `7.25 万 token / 次` * `0.80 元/万 token` | |^^ | | | \ | |标准纹理模型 |10.15 | \ | | |> `12.6875 万 token / 次` * `0.80 元/万 token` | |^^ | | | \ | |高精白模 |8.70 | \ | | |> `10.875 万 token / 次` * `0.80 元/万 token` | |^^ | | | \ | |高精纹理模型 |13.05 | \ | | |> `16.3125 万 token / 次` * `0.80 元/万 token` | > * 按成功输出 3D 文件数计费。 > * Hyper3d-Gen2 模型提供优惠资源包,购买链接:[影眸大模型服务资源包](https://console.volcengine.com/common-buy/ark_ym_sanfang%7C%7C7291580783171506476) > * 300万 token:150元,可生成 100次,平均 1.5 元/次。 > * 3000万 token:1000元,可生成 1000次,平均 1 元/次。 # 向量模型 |模型 |文本输入 |图片输入 | \ | |元/百万 token |元/百万 token | |---|---|---| |doubao-embedding-vision |0.70 |1.80 | > 按输入的 tokens 计费: > 费用 = `文本输入 tokens × 文本输入单价 + 图片输入 tokens × 图片输入单价` > = `文本输入 tokens × 文本输入单价+ min((width × height)/784,1312 ) × 图片输入单价` # 模型精调 ## 精调-按 token 后付费 |基础模型 ID |LoRA精调 |全量精调 | \ | |元/百万token |元/百万token | |---|---|---| |doubao-seed-2.0-lite |40 |80 | |doubao-seed-2.0-mini |10 |20 | > 训练费用 = 总 token 数 x 精调单价 =(用户训练集token数+混入token数+验证集token数)x 迭代轮次 x 精调token单价 > * 若 token 数小于 1000,将会上取整为 1000 tokens 计算。 ## 精调-按算力付费 |算力规格 |计费方式 |定价 | \ | | |元/小时 | |---|---|---| |方舟A型模型单元 |按量后付费 |25 | |方舟B型模型单元 |按量后付费 |15 | |方舟C型模型单元 |按量后付费 |10 | |方舟D型模型单元 |按量后付费 |20 | > 训练费用=训练计费时长\*使用的模型单元单价=训练计费时长\*模型单元数\*模型单元单价。 ## 推理-在线推理 |精调模型对应的基础模型 |条件(千 token) |输入(非音频) |输入(音频) |输出 | \ | | |元/百万token |元/百万token |元/百万token | |---|---|---|---|---| |doubao-seed-2.0-lite |输入长度 [0, 32] |1.20 |18.00 |7.20 | |^^| | | | | \ | |输入长度 (32, 128] |1.80 |27.00 |10.80 | |^^| | | | | \ | |输入长度 (128, 256] |3.60 |54.00 |21.60 | |doubao-seed-2.0-mini |输入长度 [0, 32] |0.40 |6.00 |4.00 | |^^| | | | | \ | |输入长度 (32, 128] |0.80 |12.00 |8.00 | |^^| | | | | \ | |输入长度 (128, 256] |1.60 |24.00 |16.00 | > 按 token 后付费价格,仅部分 doubao 模型在精调后支持按 token 付费,以 [接入点创建页](https://ark.volcengine.com/region:cn-beijing/endpoint/create) 可选的付费方式为准。 ## 推理-批量推理 |精调模型对应的基础模型 |条件(千 token) |输入(非音频) |输入(音频) |缓存命中(非音频) |缓存命中(音频) |输出 | \ | | |元/百万token |元/百万token |元/百万token |元/百万token |元/百万token | |---|---|---|---|---|---|---| |doubao-seed-2.0-lite |输入长度 [0, 32] |1.20 |18.00 |0.24 |3.60 |7.20 | |^^| | | | | | | \ | |输入长度 (32, 128] |1.80 |27.00 |0.36 |5.40 |10.80 | |^^| | | | | | | \ | |输入长度 (128, 256] |3.60 |54.00 |0.72 |10.80 |21.60 | |doubao-seed-2.0-mini |输入长度 [0, 32] |0.40 |6.00 |0.08 |1.20 |4.00 | |^^| | | | | | | \ | |输入长度 (32, 128] |0.80 |12.00 |0.16 |2.40 |8.00 | |^^| | | | | | | \ | |输入长度 (128, 256] |1.60 |24.00 |0.32 |4.80 |16.00 | > 按token后付费,相比在线推理,价格低至50%。 # 模型单元 |机型 |计费方式 |定价 | \ | | |元/个 | |---|---|---| |方舟A型模型单元 |按购买时长后付费 |25.00 | |^^| | | \ | |包月预付费 |16700.00 | |方舟B型模型单元 |按购买时长后付费 |15.00 | |^^| | | \ | |包月预付费 |10400.00 | |方舟C型模型单元 |按购买时长后付费 |10.00 | |^^| | | \ | |包月预付费 |7100.00 | |方舟D型模型单元 |按购买时长后付费 |20.00 | |^^| | | \ | |包月预付费 |12800.00 | > 支持「按购买时长后付费」和「包月预付费」两种方式叠加购买,可灵活组合。 > **提供** [**单元计算器**](https://ark.volcengine.com/region:cn-beijing/endpoint/create) 估算需要的机型数量。更推荐通过实际业务流量压测,计算需要的机型和数量。 # Managed Agents 按照 Agent 运行过程中实际产生的模型用量、Agent 运行时时长和工具调用次数三项累加计费。 Seedance Managed Agent 不新增独立计费项。图片和视频生成归入模型调用费用,搜索和视频合成归入工具调用费用。 > **说明** > > Managed Agents 首次开通即赠送免费额度包:**30 小时 Agent 运行时** + **500 次 `web_search` 调用**。 > > - 每个账号仅赠送一次,有效期 2 年。 > - 免费额度可抵扣 Managed Agents 后付费费用,调用时优先消耗剩余免费额度。 > - 可在 [费用中心](https://console.volcengine.com/finance/resource-package) 查看免费额度使用情况;请注意费用中心数据更新与实际调用存在小时级延迟。 |计费项 |含义 |计费规则 |单价 | |---|---|---|---| |模型调用 |Agent 调用模型产生的费用。 |按 token 后付费,单价以实际调用的模型为准;仅支持常规在线推理;按小时出账。 |参见[在线推理(常规)](/docs/model-pricing#aa1874cf) | |^^ |Seedance Managed Agent 通过 `image_generate`、`video_generate` 调用绑定的图片或视频生成模型产生的费用。 |按实际调用的模型、生成规格和对应模型的计费规则结算。 |* [图片生成模型](/docs/model-pricing#457edfd0) | \ | | | |* [视频生成模型](/docs/model-pricing#02affcb8) | |Agent 运行时 |Agent 的云端隔离沙箱,用于在会话内执行代码、读写文件、运行命令行工具,会话结束后自动回收。 |仅在 Session 状态为 `running` 时计费;处于 `idle`(等待用户下一条消息或工具确认)、`rescheduling`、`terminated` 状态时不计费;运行时长精确到秒,按小时出账。 |0.5 元/小时 | \ ||||| |工具调用 |Agent 调用工具产生的费用,当前支持 `web_search`(实时联网搜索,返回网页标题、摘要与链接)与 `web_fetch`(网页内容抓取,返回正文 Markdown 或提炼文本)。 |按 Agent 实际调用次数计费,按小时出账。 |* web_search:0.02 元/次| \ | | | |* web_fetch:限时免费| |^^ |Seedance Managed Agent 调用搜索和视频合成工具产生的费用。 |按 Agent 实际调用次数计费,按小时出账。 |* `general_search`:0.02 元/次 | \ | | | |* `visual_search`:0.02 元/次 | \ | | | |* `compose_video`:限时免费 | > 计费公式:`Managed Agents 费用 = 模型调用费用 + Agent 运行时费用 + 工具调用费用` # 工具及插件 ## 联网内容插件 |服务项 |价格 |说明 | \ | |元/千次 | | |---|---|---| |联网资源 |4 |实时搜索互联网公开域内容,每月提供2万次免费额度。 | |头条资源 |6 |实时搜索今日头条图文内容,并提供内容详情信息供展示交互卡片。 | |抖音资源 |6 |实时搜索抖音百科内容,并提供内容详情信息供展示交互卡片。 | |墨迹天气 |6 |实时搜索墨迹天气内容资源。 | > * 出账及计费:按量后付费 > * 用量:每次请求产生的调用次数,可返回结构体的 **source_type** 字段计算得到。 > * 更多说明请参见 [联网内容插件功能说明](/docs/online-content-plugin-guide)。 ## 豆包助手 |服务项 |价格 |说明 | \ | |元/次 | | |---|---|---| |日常沟通 |0.1 |全能助手,自然交流,多轮对话,高情商人格化聊天。 | |深度沟通 |0.2 |深度理解,精准解析,先思考再回答,复杂问题尽在掌握。 | |联网搜索 |0.2 |全网搜索,信源丰富,无需费力找资料,一键搜索实时资讯。 | |边想边搜 |0.5 |逻辑缜密,深度洞察,遇难题问豆包,想得更深,答得更准。 | > * 出账及计费:按量后付费 > * 用量:每次请求产生的调用次数,可返回结构体的 **source_type** 字段计算得到。 > * 更多说明请参见 [豆包助手计费](/docs/doubao-assistant-pricing)。 ## 知识库 |服务项 |价格 | |---|---| |计算资源-知识库【旗舰版】 |0.45 元/CU/小时 | |离线存储资源-知识库【旗舰版】 |0.0015 元/GB/小时 | |标准计算资源-知识库【标准版】 |0.0416 元/知识库/小时 | |文本向量模型-知识库【通用】 |0.0005 元/千token | |文本向量模型(多功能版)-知识库【通用】 |0.0005 元/千token | |文本向量模型(Doubao-embedding)-知识库【通用】 |0.0005 元/千token | |文本向量模型(Doubao-embedding-large)-知识库【通用】 |0.0007 元/千token | |多模态向量模型(Doubao-embedding-vision-text)-知识库【通用】 |0.0007 元/千token | |多模态向量模型(Doubao-embedding-vision-image)-知识库【通用】 |0.0018 元/千token | |重排模型-知识库【通用】 |0.0005 元/千token | > 更多说明请参见 [知识库计费](/docs/knowledge-base-pricing)。 # Coding Plan 个人版 |套餐类型 |订阅时长 |价格 | |---|---|---| |Lite 套餐 |1 个月 |40 元/月 | |^^| | | \ | |3 个月 |120 元/季 | |Pro 套餐 |1 个月 |200 元/月 | |^^| | | \ | |3 个月 |600 元/季 | > 套餐信息及特惠活动参见[套餐概览](/docs/coding-plan-personal-plan-overview)。 # Agent Plan 个人版 |套餐类型 |价格 | |---|---| |Small 套餐 |40 元/月 | |Medium 套餐 |200 元/月 | |Large 套餐 |500 元/月 | |Max 套餐 |1000 元/月 | > 套餐信息参见[套餐概览](/docs/agent-plan-personal-plan-overview)。 --- # Agent 场景模型调用的正确姿势 Source: https://ark.volcengine.com/region:cn-beijing/docs/agent-model-invocation-practice > **警告:重要注意事项** > > 在 Agent 场景下,如果出现模型效果不及预期、任务通过率下降、输出被截断或缓存命中率异常等情况,建议优先排查模型调用方式,[正确的使用方式](/docs/agent-model-invocation-practice#recommended-practice) 如下: > * **回传思考内容**:按模型选择支持的回传方式。对需要回传思考内容加密原文的模型,**必须原样回传思考内容加密原文**。 > * **配置关键参数**:按推荐值配置输出长度参数、thinking 参数、reasoning_effort 参数、temperature 及 top_p 参数。 > * **遵循缓存命中原则**:在同一 Session 内保持采样参数、思考配置、工具定义与 System Prompt 的稳定,避免重置 Prefix Cache。 本文根据 Agent 场景下经常遇到的问题梳理可能原因,并给出推荐的使用方式,便于问题定位并修改。 > **说明** > > 本文聚焦"调用方式"层面的问题定位与参数配置。如需从零到一的完整接入流程(参数配置、Harness 接入、突发流量爬坡、生产上量监控),请参考 [模型接入指南(LLM) - 标准流程](/docs/go-live-access-sop)。 | 常见问题 | 可能的原因 | [推荐使用方式](/docs/agent-model-invocation-practice#recommended-practice) | | --- | --- | --- | | 多轮工具调用效果随轮数增加而下降 | 思考内容未回传,导致每一轮工具返回后丢失思考内容 | 回传思考内容 | | 相同模型、相同 Prompt 在不同实现下任务通过率差异明显 | 参数配置未按推荐值;上下文回传不完整 | 配置关键参数 | \ | | | 回传思考内容 | | 回答被截断、工具参数 JSON 不完整、`finish_reason` / `stop_reason` 为 `length` | `max_tokens` 未显式传入或值过小 | 调整输出长度参数 | | Prompt Cache 命中率异常偏低 | System Prompt 或工具定义在轮次间发生变化;Session 内改动参数 | 遵循缓存命中原则 | # 推荐使用方式 三种接口在字段名、层级与默认返回策略上存在差异,请依据实际使用的接口对照下表进行配置。 | 维度 | Chat API(OpenAI 兼容) | Responses API | Anthropic 兼容 API | \ | | `/api/v3/chat/completions` |`/api/v3/responses` |`/api/compatible/v1/messages` | | --- | --- | --- | --- | | 支持回传思考内容原文(明文)的模型 | Doubao 模型:doubao-seed-2-0-pro-260215、doubao-seed-2-0-lite-260215、doubao-seed-2-0-mini-260215 ||| \ | | 开源模型:deepseek-v4-pro-260425、deepseek-v4-flash-ga-260731、deepseek-v4-1-flash-261017、deepseek-v4-1-flash-260910、glm-5-2-260617 ||| | 回传思考内容原文对应的字段 | `choices[].message.reasoning_content` |* 手动回传:`output[reasoning].summary[].text` | `content[thinking].thinking` | \ |> 需要将思考内容原文拼回下一轮请求 | |* 使用 `previous_response_id`:配置 `store: true`,自动获取原始思考内容 | | | **支持回传思考内容加密原文的模型** | Doubao 模型:doubao-seed-evolving、doubao-seed-2-1-pro-260915、doubao-seed-2-1-lite-260915、doubao-seed-2-1-pro-260628、doubao-seed-2-1-turbo-260628、doubao-seed-2-0-lite-260428 ||| \ | | ||| \ | |* 使用支持的模型时,需要**回传思考内容加密原文**,回传时的关键规则及使用示例参见 [关键规则](/docs/agent-model-invocation-practice#key-rules)、[回传思考内容加密块使用示例](/docs/agent-model-invocation-practice#encrypted-thinking-block-examples)。模型调用时返回的内容是思考内容加密字段、明文摘要字段,不是思考内容原文。模型真正用于推理的完整思考内容存在于**加密字段**中。仅回传 `reasoning_content` 等摘要字段并不等同于回传了完整思考内容,会直接导致模型推理效果下降。 ||| \ | |* 同一模型的不同版本可能属于不同类别:`doubao-seed-2.0-lite-260215` 回传思考内容原文(明文),`doubao-seed-2.0-lite-260428` 起改为回传思考内容加密块。升级模型版本时,请务必同步更新调用代码,否则回传方式失效,且不会触发 API 报错。 ||| \ | | ||| | **回传思考内容加密原文对应的字段** | `choices[].message.encrypted_content` |* 手动回传:`output[reasoning].encrypted_content` | `content[thinking].signature` | \ |> 需要将思考内容加密原文拼回下一轮请求 | |* 使用 `previous_response_id`:配置 `store: true`,自动获取原始思考内容 | | | 是否默认返回思考内容加密字段 | 是 | 是 | 是 | | 回传思考内容明文摘要对应的字段 | `choices[].message.reasoning_content` | `output[reasoning].summary[].text` | `content[thinking].thinking` | \ | > 不能只回传思考内容明文摘要,会导致模型效果下降。| | | | | 配置输出长度参数 | `max_tokens` / `max_completion_tokens` | `max_output_tokens` | `max_tokens` | \ | | **推荐**:必须显式传,Agent 场景建议 ≥ `128000` | **推荐**:必须显式传,Agent 场景建议 ≥ `128000` | **推荐**:必须显式传,Agent 场景建议 ≥ `128000` | | 配置 thinking 参数 | `{"type": "enabled"}` | `{"type": "enabled"}` | `{"type": "enabled"}` | \ | | **推荐**:Agent 场景下显式开启,不要使用 `auto` | **推荐**:Agent 场景下显式开启,不要使用 `auto` | **推荐**:Agent 场景下显式开启,不要使用 `auto` | |配置 reasoning_effort 参数 | `"reasoning_effort": "high"` | `"reasoning": {"effort": "high"}` | `"output_config": {"effort": "high"}` | \ | | **推荐**:Agent 场景建议 `high` 或以上 | **推荐**:Agent 场景建议 `high` 或以上 | **推荐**:Agent 场景建议 `high` 或以上 | | 配置 temperature / top_p 参数| **推荐** `temperature=1`、`top_p=0.95` | **推荐** `temperature=1`、`top_p=0.95` | **推荐** `temperature=1`、`top_p=0.95` | > **注意** > > 请务必在同一 Session 内保持采样参数、思考配置、工具定义与 System Prompt 的稳定,任何中途修改都会重置 Prefix Cache。 # 核心机制:思考内容回传 ## 为什么需要回传思考内容 在 Agent 场景中,一个任务通常会经历多轮“推理 -> 调用工具 -> 等待结果 -> 继续推理 -> 调用工具”,工具结果返回后,模型需要继续在该推理链路上把后续步骤做完。 如果不回传思考内容,会有以下影响: - **推理连续性会被打断**:工具结果返回后,模型只能根据可见对话文本重新构建上下文。对于复杂任务这些隐含的中间判断无法被完整还原,容易出现推理衔接不顺或逻辑断层的情况。 - **多步执行稳定性下降**:由于缺少中间推理状态,模型可能重复做已做过的推导,或者在下一步采用与前一步不一致的假设,导致任务执行跑偏、步骤不稳定,影响结果的一致性与可复现性。 - **整体成本上升**:回传的思考内容会与 tool result 一起参与缓存,更容易命中 Prompt Cache。对包含多次工具调用的场景来说,缓存命中意味着减少重复 token 消耗,从而降低整体成本。 ## 回传方式与支持模型 方舟大模型的思考内容回传方式分为两类: - **回传思考内容原文(明文)**:将响应中的思考内容原文直接拼回下一轮请求。 - **回传思考内容加密原文**:将响应中的加密原文原样拼回下一轮请求。 两类回传方式支持的模型不同,具体参见 [推荐使用方式](/docs/agent-model-invocation-practice#recommended-practice)。 ## 关键规则 - 思考内容加密字段**要求原样、完整回传**。任何篡改或截断都会返回 `Invalid signature` 错误。 - 不回传思考内容加密原文**不会触发报错,但会影响推理效果**。 - 思考内容加密字段**优先级高于思考内容摘要**:同时传入时,明文摘要会被忽略。 - 输出思考内容部分计费会按原始思考内容 token 计算,如果不回传思考内容加密原文,已付费的思考内容不仅没有起到效果,还可能会导致推理效果下降。 --- # 其他关键参数配置建议 | 关键配置 | 推荐配置 | 配置错误的影响 | 自检方式 | | --- | --- | --- | --- | | thinking | Agent 场景显式设置为 `enabled`,不建议使用 `auto`。 | `auto` 模式下模型可能判定简单直接回答,多步任务的规划能力因此下降。 | 观察响应中是否包含思考内容块。 | | reasoning_effort | Agent 与多步工具调用场景设置为 `high` 或以上。 | 低档位下思考不足,工具选择与工具参数构造的错误率会上升。 | \- | | temperature 与 top_p | `temperature=1`,`top_p=0.95` | 会影响工具调用稳定性和推理质量。 | \- | \ | | |> 不建议同时大幅调整 `temperature` 与 `top_p`,两者叠加影响难以定位。 | | | max_tokens | **必须显式传入**,Agent 场景建议 ≥ `128000`。实际取值需结合模型 `max_output_tokens` 上限与业务场景。 | 回答被截断、工具参数 JSON 不完整、Agent Loop 中断。 | 观察 `finish_reason` / `stop_reason` 是否为 `length`。 | | 缓存命中率 | System Prompt 与工具定义放在请求的最前部,且在同一 Session 内保持稳定不变。 | Cache 命中率下降,整体成本上升。 | 观察响应中 Cache 命中的 token 数。 | \ | |:::warning| | | \ | |导致 Cache 失效的常见操作:修改 `thinking` 配置、修改 `reasoning_effort`、修改采样参数(`temperature`、`top_p` 等)、修改 System Prompt、修改工具定义。 | | | \ | |::: | | | # 回传思考内容加密块使用示例 **选项:Chat API(OpenAI 兼容)** ### 非流式响应 对于非流式响应,加密块位于 assistant 消息的**扁平字段** `encrypted_content`,与 `reasoning_content`、`tool_calls` 同级。`encrypted_content` 默认返回,无需额外声明。 **正确使用方式**:将响应中的 assistant message 对象整体加入到下一轮 `messages` 中,避免按字段挑选重建。 ```Bash curl https://ark.cn-beijing.volces.com/api/v3/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seed-evolving", "thinking": {"type": "enabled"}, "temperature": 1, "top_p": 0.95, "max_tokens": 128000, "messages": [ {"role": "system", "content": "你是人工智能助手。"}, {"role": "user", "content": "今天是 2026-08-10(星期一)。明天北京天气怎么样?"}, { "role": "assistant", "reasoning_content": "用户问明天北京天气,明天是 2026-08-11,调用天气工具。", "encrypted_content": "<完整加密块,原样回传>", "tool_calls": [ { "id": "call_wiezxeyae8jzxl3jx8nhfgb5", "type": "function", "function": {"name": "get_weather", "arguments": "{\"location\":\"北京\",\"date\":\"2026-08-11\"}"} } ] }, { "role": "tool", "tool_call_id": "call_wiezxeyae8jzxl3jx8nhfgb5", "content": "2026-08-11 北京:阴,11~16°C,北风4级。" } ], "tools": [ { "type": "function", "function": { "name": "get_weather", "description": "查询指定城市指定日期的天气", "parameters": { "type": "object", "properties": { "location": {"type": "string", "description": "城市名,如北京、上海"}, "date": {"type": "string", "description": "日期,格式 YYYY-MM-DD"} }, "required": ["location", "date"] } } } ] }' ``` ### 流式响应 流式响应下,思考内容加密块由**独立的 chunk** 下发,时机是思考内容输出完成之后、正式应答开始之前。该 chunk 的 `content` 与 `reasoning_content`**可能均为空**。 **正确使用方式**:请务必在流式合并逻辑中对 `encrypted_content` 字段做处理。仅处理 `delta.content` 或 `delta.reasoning_content`,会直接导致丢失思考内容加密块,从而影响推理效果。 ```Bash curl https://ark.cn-beijing.volces.com/api/v3/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seed-evolving", "stream": true, "thinking": {"type": "enabled"}, "max_tokens": 128000, "messages": [ {"role": "user", "content": "今天是 2026-08-10。明天北京天气怎么样?"} ] }' ``` 响应片段(示意): ```text data: {"choices":[{"delta":{"reasoning_content":"用户问明天"}}]} data: {"choices":[{"delta":{"reasoning_content":"北京天气…"}}]} data: {"choices":[{"delta":{"content":"","reasoning_content":"","encrypted_content":"<完整加密块>"}}]} data: {"choices":[{"delta":{"content":"明天北京"}}]} data: [DONE] ``` **选项:Responses API** ### 非流式响应 对于非流式响应,加密块位于 `output` 数组内 `type == "reasoning"` 的 item。 回传思考内容加密块的方式如下: - **previous_response_id**:**注意需显式配置 `store: true`**。由服务端托管 session 状态,客户端无需自行搬运历史 item,自动获取思考内容加密块并回传给模型参与推理。 - **手动回传思考内容加密块**:从响应中获取 Reasoning item,并在后续请求中原样回传 `encrypted_content`。 手动回传思考内容加密块注意事项: - Reasoning item 的 **`id`** 必须原样带回,不能自行生成。 - 回放时 `content` 可以是空数组 `[]`,但 `encrypted_content` **不能为空**。 - 连续多次工具调用时,从最后一条 user message 之后的所有 item(`reasoning` / `function_call` / `function_call_output`)必须按原顺序全部带回,不能只带最后一个。 手动回传思考内容加密块的示例如下: ```Bash curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seed-evolving", "store": false, "reasoning": {"effort": "high", "summary": "detailed"}, "max_output_tokens": 128000, "input": [ {"type": "message", "role": "user", "content": "今天是 2026-08-10(星期一)。明天天气怎么样?"}, { "id": "rs_0c2e0389c1bdc80f016a79c44c1fd08198bbdcb852ca75789b", "type": "reasoning", "content": [], "encrypted_content": "<完整加密块,原样回传>", "summary": [ {"type": "summary_text", "text": "先取用户所在城市,再查 2026-08-11 的天气。"} ] }, { "id": "fc_0c2e0389c1bdc80f016a79c44d9fac81988abe3597d1fbba88", "type": "function_call", "status": "completed", "call_id": "call_tjOpXT7tq4KbtdnpQYdBNTXz", "name": "get_location", "arguments": "{\"location_level\":\"city\"}" }, { "type": "function_call_output", "call_id": "call_tjOpXT7tq4KbtdnpQYdBNTXz", "output": "北京" }, { "id": "fc_0c2e0389c1bdc80f016a79c451d4348198a1c4eb858f8a858b", "type": "function_call", "status": "completed", "call_id": "call_cf3Sz3cE2fZkZBPdez5P9Ecb", "name": "get_weather", "arguments": "{\"location\":\"北京\",\"date\":\"2026-08-11\"}" }, { "type": "function_call_output", "call_id": "call_cf3Sz3cE2fZkZBPdez5P9Ecb", "output": "2026-08-11 北京:阴,11~16°C,北风4级。" } ], "tools": [ { "type": "function", "name": "get_location", "description": "获取用户当前位置", "parameters": { "type": "object", "properties": { "location_level": {"type": "string", "description": "所需粒度:country / province / city / street"} }, "required": ["location_level"], "additionalProperties": false }, "strict": true }, { "type": "function", "name": "get_weather", "description": "查询指定城市指定日期的天气", "parameters": { "type": "object", "properties": { "location": {"type": "string", "description": "城市名"}, "date": {"type": "string", "description": "日期,格式 YYYY-MM-DD"} }, "required": ["location", "date"], "additionalProperties": false }, "strict": true } ] }' ``` ### 流式响应 对于流式响应,思考内容加密块通过 `response.output_item.added` / `response.output_item.done` / `response.completed` 等相关事件下发,需要按事件中 **encrypted_content** 字段非空过滤,并获取思考内容加密加密原文。 获取到思考内容加密块后,回传方式参考上述示例。 **选项:Anthropic 兼容 API** 加密内容位于 assistant content 数组中 `type == "thinking"` 的块的 **`signature`** 字段(Anthropic 协议原生命名)。 **正确使用方式**: - thinking 块必须**整块回传**(`thinking` 文本 + `signature` 一起),并保持在 `tool_use` 块**之前**的原始顺序。 - **请勿按 `type == "thinking"` 做白名单过滤后重新构造 content 数组**。顺序或块被改动会导致校验失败。 ```Bash curl https://ark.cn-beijing.volces.com/api/v3/compatible/v1/messages \ -H "Content-Type: application/json" \ -H "x-api-key: $ARK_API_KEY" \ -H "anthropic-version: 2023-06-01" \ -d '{ "model": "doubao-seed-evolving", "max_tokens": 128000, "thinking": {"type": "enabled"}, "messages": [ {"role": "user", "content": "今天是 2026-08-10(星期一)。明天天气怎么样?"}, { "role": "assistant", "content": [ { "type": "thinking", "thinking": "用户问明天天气,明天是 2026-08-11。需要先获取城市,再查天气。", "signature": "<完整加密块,原样回传>" }, { "type": "tool_use", "id": "tool_4U01J2huMeLhTlTKyrU5rhI5", "name": "get_location", "input": {"location_level": "city"} } ] }, { "role": "user", "content": [ { "type": "tool_result", "tool_use_id": "tool_4U01J2huMeLhTlTKyrU5rhI5", "content": "北京" } ] } ], "tools": [ { "name": "get_location", "description": "获取用户当前位置", "input_schema": { "type": "object", "properties": { "location_level": {"type": "string", "description": "所需粒度:country / province / city / street"} }, "required": ["location_level"] } }, { "name": "get_weather", "description": "查询指定城市指定日期的天气", "input_schema": { "type": "object", "properties": { "location": {"type": "string", "description": "城市名"}, "date": {"type": "string", "description": "日期,格式 YYYY-MM-DD"} }, "required": ["location", "date"] } } ] }' ``` --- # 迁移到方舟官方 SDK Source: https://ark.volcengine.com/region:cn-beijing/docs/migrate-ark-runtime-sdk 方舟官方 SDK 为 Python、Go 和 Java 提供统一的模型调用接口。本指南介绍如何从旧版渠道 SDK 迁移到最新版方舟官方 SDK。 建议先在独立测试环境中安装最新稳定版,并验证请求、流式输出、错误处理和资源生命周期。验证通过后,在生产项目的依赖文件中锁定实际使用的版本,再移除旧版依赖。 迁移期间可以同时保留新版与旧版 SDK。新版 SDK 暂未覆盖的 API 可以继续使用旧版 SDK 或对应 REST API。两套 SDK 使用不同的包名和导入路径,请分别初始化客户端,不要混用请求或响应类型。 ## 安装新版 SDK - **Python**:运行 `python -m pip install --upgrade arkruntime`。官方来源:[GitHub](https://github.com/volcengine/ark-runtime-python)、[PyPI](https://pypi.org/project/arkruntime/)。 - **Go**:运行 `go get github.com/volcengine/ark-runtime-go@latest`。官方来源:[GitHub](https://github.com/volcengine/ark-runtime-go)。 - **Java**:在构建文件中使用 Maven Central 提供的最新稳定版本。官方来源:[GitHub](https://github.com/volcengine/ark-runtime-java)、[Maven Central](https://central.sonatype.com/artifact/com.volcengine/ark-runtime)。 ### Python ```bash python -m pip install --upgrade arkruntime ``` ```python import os from arkruntime import Ark client = Ark( api_key=os.environ.get("ARK_API_KEY"), base_url="https://ark.cn-beijing.volces.com/api/v3", ) ``` ### Go ```bash go get github.com/volcengine/ark-runtime-go@latest ``` ```go import ( "os" "github.com/volcengine/ark-runtime-go/arkruntime" ) client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ``` ### Java Maven 和 Gradle 的生产依赖必须使用具体版本。请从 [Maven Central](https://central.sonatype.com/artifact/com.volcengine/ark-runtime) 确认最新稳定版本,将 `ark-runtime.version` 设置为该版本,并在验证通过后提交锁定值。 不要在生产构建中使用 `LATEST` 或开放版本区间。 ```xml com.volcengine ark-runtime ${ark-runtime.version} ``` ```java import com.volcengine.ark.runtime.service.ArkService; ArkService service = ArkService.builder() .apiKey(System.getenv("ARK_API_KEY")) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); ``` ## 迁移要点 - **Python**:将 `volcengine-python-sdk[ark]`、`volcenginesdkarkruntime` 替换为 `arkruntime`。 - **Go**:将 `github.com/volcengine/volcengine-go-sdk/service/arkruntime` 替换为 `github.com/volcengine/ark-runtime-go/arkruntime`。 - **Java**:将 `com.volcengine:volcengine-java-sdk-ark-runtime`、`com.volcengine.ark.runtime.model.*` 替换为 `com.volcengine:ark-runtime`、`com.volcengine.ark.runtime.models.*`。 完成依赖替换后,按以下步骤调整代码: 1. 使用上文所示的客户端初始化方法,并显式传入文档提供的 Base URL。 2. 将模型 ID、推理接入点 ID 和文件 ID 等占位符替换为当前账号下的真实资源。 3. 更新请求和响应类型的 import 路径。Java 生成模型包使用 `models`;Go 请求中的联合类型按当前 SDK 提供的构造器创建。 4. 检查流式代码的结束条件和空内容处理。正常的流结束信号不应当作为请求失败上报。 5. 按类型遍历 Responses API 的输出项,不要假设第一个输出项一定是最终文本。 6. 对文件、内容生成和 Responses 等包含资源生命周期的调用,使用当前请求创建的资源 ID,不要复用示例中的历史 ID。 7. 对照当前 SDK 的类型定义和 API 文档更新参数,不要直接沿用旧版 SDK 的生成类型。 ## 兼容使用旧版 SDK SDK 支持的 API 会随版本更新。迁移前请查看 [Python](https://github.com/volcengine/ark-runtime-python)、[Go](https://github.com/volcengine/ark-runtime-go) 和 [Java](https://github.com/volcengine/ark-runtime-java) 仓库 README 中的 API coverage。如果当前版本尚未提供目标 API 或所需参数,请继续使用旧版 SDK 或对应 REST API,待新版支持后再迁移。 ## 迁移检查清单 1. 在独立环境安装最新稳定版。 2. 替换依赖、import 和客户端初始化代码。 3. 使用通用客户端初始化方法,并显式配置当前渠道的 Base URL。 4. 更新请求类型、响应解析和流式结束处理。 5. 将示例占位符替换为账号下可访问的真实资源,并核对 API Key 和所需授权。 6. 验证同步、异步、流式和资源生命周期调用。 7. 在依赖文件中锁定验证通过的版本,再移除对应的旧版 SDK 调用。 8. 新版 SDK 尚未覆盖的 API 继续使用旧版 SDK 或 REST API。 --- # 模型列表 Source: https://ark.volcengine.com/region:cn-beijing/docs/model-list 方舟提供多种模型供您使用。您可浏览所有模型,比较它们的能力。 # 模型推荐 **[Doubao Seedance 2.5](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seedance-2-5)** 豆包高性能视频生成模型 4~30 秒视频生成,全模态参考输入 **[Doubao Seed Evolving](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-evolving)** Seed 最新 Coding&Agent 模型 周级迭代,持续进化 Coding 与 Agent 能力 **[Doubao Seedream 5.0 pro](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seedream-5-0-pro)** 最新图像创作模型 编辑更可控、生产更落地、效果更自然 # 文本生成能力 教程: [文本生成](/docs/text-generation)、[深度思考](/docs/deep-thinking) | API: [Responses API](/docs/create-model-responses-api)、[Chat API](/docs/chat-api) > **注意** > > 本章节列出方舟平台所有支持文本生成能力的大语言模型。其中带"深度思考"能力标签的模型,默认调用即启用深度思考;如需仅执行文本生成任务,可通过调用参数关闭深度思考(Chat API 传入 `thinking.type=disabled`,Responses API 传入 `reasoning.effort=minimal`)后使用,参数详情参见[深度思考](/docs/deep-thinking)。未带"深度思考"能力标签的模型(如 doubao-seed-character-251128)本身不支持深度思考,直接调用即可。 ## 推荐模型 |模型 ID (Model ID) |**能力支持** |**长度限制(token)** |限流 | \ | | | |> 非刚性保障,受平台负载/调用方式影响,详见 [文档](/docs/traffic-burst-handling-best-practices#263ca129) | |---|---|---|---| |[doubao-seed-evolving](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-evolving) |深度思考 |上下文窗口: 1024k |最大 RPM: 500 | \ |> 快速迭代模型 |文本生成 |最大输入: 1024k |最大 TPM: 1000000 | \ | |多模态理解 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 256k | | \ | |GUI 任务处理 |最大思维链: 256k | | \ | |工具调用 | | | \ | |结构化输出 | | | |[doubao-seed-2-1-pro-260915](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-2-1-pro) |深度思考 |上下文窗口: 1024k |最大 RPM: 500 | \ | |文本生成 |最大输入: 1024k |最大 TPM: 1000000 | \ | |多模态理解 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 256k | | \ | |GUI 任务处理 |最大思维链: 256k | | \ | |工具调用 | | | \ | |结构化输出 | | | |[doubao-seed-2-1-lite-260915](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-2-1-lite) |深度思考 |上下文窗口: 1024k |最大 RPM: 30000 | \ | |文本生成 |最大输入: 1024k |最大 TPM: 5000000 | \ | |多模态理解 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 256k | | \ | |GUI 任务处理 |最大思维链: 256k | | \ | |工具调用 | | | \ | |结构化输出 | | | |[doubao-seed-2-1-turbo-260628](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-2-1-turbo) |深度思考 |上下文窗口: 256k |最大 RPM: 500 | \ | |文本生成 |最大输入: 256k |最大 TPM: 1000000 | \ | |多模态理解 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 256k | | \ | |GUI 任务处理 |最大思维链: 256k | | \ | |工具调用 | | | \ | |结构化输出 | | | ## **其他模型** |模型 ID (Model ID) |**能力支持** |**长度限制(token)** |限流 | \ | | | |> 非刚性保障,受平台负载/调用方式影响,详见 [文档](/docs/traffic-burst-handling-best-practices#263ca129) | |---|---|---|---| |[doubao-seed-2-1-pro-260628](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-2-1-pro) |深度思考 |上下文窗口: 256k |最大 RPM: 500 | \ | |文本生成 |最大输入: 256k |最大 TPM: 1000000 | \ | |多模态理解 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 256k | | \ | |GUI 任务处理 |最大思维链: 256k | | \ | |工具调用 | | | \ | |结构化输出(推荐使用 `json_schema` 模式) | | | |[doubao-seed-2-0-lite-260428](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-2-0-lite) |深度思考 |上下文窗口: 256k |最大 RPM: 30000 | \ | |文本生成 |最大输入: 224k |最大 TPM: 5000000 | \ | |多模态理解 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 128k | | \ | |GUI 任务处理 |最大思维链: 128k | | \ | |工具调用 | | | \ | |结构化输出(推荐使用 `json_schema` 模式) | | | |[doubao-seed-2-0-mini-260428](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-2-0-mini) |深度思考 |上下文窗口: 256k |最大 RPM: 30000 | \ | |文本生成 |最大输入: 224k |最大 TPM: 5000000 | \ | |多模态理解 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 128k | | \ | |GUI 任务处理 |最大思维链: 128k | | \ | |工具调用 | | | \ | |结构化输出 | | | |[doubao-seed-2-0-pro-260215](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-2-0-pro) `即将下线` |深度思考 |上下文窗口: 256k |最大 RPM: 30000 | \ | |文本生成 |最大输入: 224k |最大 TPM: 5000000 | \ | |多模态理解 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 128k | | \ | |GUI 任务处理 |最大思维链: 128k | | \ | |工具调用 | | | \ | |结构化输出 | | | |[doubao-seed-2-0-lite-260215](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-2-0-lite) `即将下线` |深度思考 |上下文窗口: 256k |最大 RPM: 30000 | \ | |文本生成 |最大输入: 224k |最大 TPM: 5000000 | \ | |多模态理解 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 128k | | \ | |GUI 任务处理 |最大思维链: 128k | | \ | |工具调用 | | | \ | |结构化输出 | | | |[doubao-seed-2-0-mini-260215](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-2-0-mini) `即将下线` |深度思考 |上下文窗口: 256k |最大 RPM: 30000 | \ | |文本生成 |最大输入: 224k |最大 TPM: 5000000 | \ | |多模态理解 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 128k | | \ | |GUI 任务处理 |最大思维链: 128k | | \ | |工具调用 | | | \ | |结构化输出 | | | |[doubao-seed-2-0-code-preview-260215](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-2-0-code) `即将下线` |深度思考 |上下文窗口: 256k |最大 RPM: 30000 | \ | |文本生成 |最大输入: 224k |最大 TPM: 5000000 | \ | |多模态理解 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 128k | | \ | |工具调用 |最大思维链: 128k | | |[doubao-seed-character-260628](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-character&_vtm_=a106466.b106468.0_0.0_0.0.1961_7630866813484467762&projectName=default) |深度思考 |上下文窗口: 128k |最大 RPM: 30000 | \ | |文本生成 |最大输入: 96k |最大 TPM: 5000000 | \ | |多模态理解 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 32k | | \ | |工具调用 |最大思维链: 128k | | \ | |结构化输出(推荐使用 `json_schema` 模式) | | | |[doubao-seed-character-251128](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-character) |文本生成 |上下文窗口: 128k |最大 RPM: 30000 | \ | |工具调用 |最大输入: 96k |最大 TPM: 5000000 | \ | | |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 32k | | |[doubao-seed-translation-250915](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-translation) |文本生成 |上下文窗口: 4k |最大 RPM: 5000 | \ | |> 翻译增强 |最大输入: 1k |500000 TPM | \ | | |[最大回答(默认 3k)](/docs/text-generation#3821b26a): 3k | | \ | | |最大思维链: - | | |[glm-5-3-flash-260828](https://ark.volcengine.com/region:cn-beijing/model/detail?name=glm-5-3-flash) |深度思考 |上下文窗口: 1024k |最大 RPM: 500 | \ | |文本生成 |最大输入: 1024k |最大 TPM: 1000000 | \ | |多模态理解 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 128k | | \ | |工具调用 |最大思维链: 128k | | |[glm-5-2-260617](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=glm-5-2) |深度思考 |上下文窗口: 1024k |最大 RPM: 500 | \ | |文本生成 |最大输入: 1024k |最大 TPM: 1000000 | \ | |工具调用 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 128k | | \ | | |最大思维链: 128k | | |[deepseek-v4-1-flash-261017](https://ark.volcengine.com/region:cn-beijing/model/detail?name=deepseek-v4-1-flash) |深度思考 |上下文窗口: 1024k |最大 RPM: 500 | \ | |文本生成 |最大输入: 1024k |最大 TPM: 1000000 | \ | |多模态理解 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 384k | | \ | |工具调用 |最大思维链: 384k | | \ | |结构化输出 | | | |[deepseek-v4-1-flash-260910](https://ark.volcengine.com/region:cn-beijing/model/detail?name=deepseek-v4-1-flash) |深度思考 |上下文窗口: 1024k |最大 RPM: 500 | \ | |文本生成 |最大输入: 1024k |最大 TPM: 1000000 | \ | |多模态理解 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 384k | | \ | |工具调用 |最大思维链: 384k | | \ | |结构化输出 | | | |[deepseek-v4-1-flash-economy-261017](https://ark.volcengine.com/region:cn-beijing/model/detail?name=deepseek-v4-1-flash-economy) |深度思考 |上下文窗口: 1024k |最大 RPM: 500 | \ | |文本生成 |最大输入: 1024k |最大 TPM: 1000000 | \ | |多模态理解 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 384k | | \ | |工具调用 |最大思维链: 384k | | \ | |结构化输出 | | | |[deepseek-v4-pro-ga-260813](https://ark.volcengine.com/region:cn-beijing/model/detail?name=deepseek-v4-pro-ga) |深度思考 |上下文窗口: 1024k |最大 RPM: 500 | \ | |文本生成 |最大输入: 1024k |最大 TPM: 1000000 | \ | |工具调用 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 384k
最大思维链: 128k | | \ | |结构化输出 | | | |[deepseek-v4-flash-ga-260731](https://ark.volcengine.com/region:cn-beijing/model/detail?name=deepseek-v4-flash-ga) |深度思考 |上下文窗口: 1024k |最大 RPM: 500 | \ | |文本生成 |最大输入: 1024k |最大 TPM: 1000000 | \ | |工具调用 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 384k
最大思维链: 128k | | \ | |结构化输出 | | | |[deepseek-v4-pro-260425](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=deepseek-v4-pro) `即将下线` |深度思考 |上下文窗口: 1024k |最大 RPM: 15000 | \ | |文本生成 |最大输入: 1024k |最大 TPM: 1500000 | \ | |工具调用 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 384k | | \ | | |最大思维链: 128k | | # 视觉理解能力 教程: [图片理解](/docs/image-understanding)、 [视频理解](/docs/video-understanding)、[文档理解](/docs/document-understanding) | API: [Responses API](/docs/create-model-responses-api)、[Chat API](/docs/chat-api) ## 推荐模型 |模型 ID (Model ID) |**能力支持** |**长度限制(token)** |限流 | |---|---|---|---| |[doubao-seed-evolving](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-evolving) |深度思考 |上下文窗口: 1024k |最大 RPM: 500 | \ |> 快速迭代模型 |文本生成 |最大输入: 1024k |最大 TPM: 1000000 | \ | |多模态理解 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 256k | | \ | |GUI 任务处理 |最大思维链: 256k | | \ | |工具调用 | | | \ | |结构化输出 | | | |[doubao-seed-2-1-pro-260915](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-2-1-pro) |深度思考 |上下文窗口: 1024k |最大 RPM: 500 | \ | |文本生成 |最大输入: 1024k |最大 TPM: 1000000 | \ | |多模态理解 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 256k | | \ | |GUI 任务处理 |最大思维链: 256k | | \ | |工具调用 | | | \ | |结构化输出 | | | |[doubao-seed-2-1-lite-260915](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-2-1-lite) |深度思考 |上下文窗口: 1024k |最大 RPM: 30000 | \ | |文本生成 |最大输入: 1024k |最大 TPM: 5000000 | \ | |多模态理解 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 256k | | \ | |GUI 任务处理 |最大思维链: 256k | | \ | |工具调用 | | | \ | |结构化输出 | | | |[doubao-seed-2-1-turbo-260628](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-2-1-turbo) |深度思考 |上下文窗口: 256k |最大 RPM: 500 | \ | |文本生成 |最大输入: 256k |最大 TPM: 1000000 | \ | |多模态理解 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 256k | | \ | |GUI 任务处理 |最大思维链: 256k | | \ | |工具调用 | | | \ | |结构化输出 | | | ## **其他模型** |模型 ID (Model ID) |**能力支持** |长度限制(token) |限流 | \ | | | |> 非刚性保障,受平台负载/调用方式影响,详见 [文档](/docs/traffic-burst-handling-best-practices#263ca129) | |---|---|---|---| |[doubao-seed-2-1-pro-260628](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-2-1-pro) |深度思考 |上下文窗口: 256k |最大 RPM: 500 | \ | |文本生成 |最大输入: 256k |最大 TPM: 1000000 | \ | |多模态理解 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 256k | | \ | |GUI 任务处理 |最大思维链: 256k | | \ | |工具调用 | | | \ | |结构化输出(推荐使用 `json_schema` 模式) | | | |[doubao-seed-2-0-lite-260428](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-2-0-lite) |深度思考 |上下文窗口: 256k |最大 RPM: 30000 | \ | |文本生成 |最大输入: 224k |最大 TPM: 5000000 | \ | |多模态理解 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 128k | | \ | |GUI 任务处理 |最大思维链: 128k | | \ | |工具调用 | | | \ | |结构化输出(推荐使用 `json_schema` 模式) | | | |[doubao-seed-2-0-mini-260428](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-2-0-mini) |深度思考 |上下文窗口: 256k |最大 RPM: 30000 | \ | |文本生成 |最大输入: 224k |最大 TPM: 5000000 | \ | |多模态理解 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 128k | | \ | |GUI 任务处理 |最大思维链: 128k | | \ | |工具调用 | | | \ | |结构化输出 | | | |[doubao-seed-2-0-pro-260215](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-2-0-pro) `即将下线` |深度思考 |上下文窗口: 256k |最大 RPM: 30000 | \ | |文本生成 |最大输入: 224k |最大 TPM: 5000000 | \ | |多模态理解 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 128k | | \ | |视觉定位 |最大思维链: 128k | | \ | |GUI 任务处理 | | | \ | |工具调用 | | | \ | |结构化输出 | | | |[doubao-seed-2-0-lite-260215](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-2-0-lite) `即将下线` |深度思考 |上下文窗口: 256k |最大 RPM: 30000 | \ | |文本生成 |最大输入: 224k |最大 TPM: 5000000 | \ | |多模态理解 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 128k | | \ | |视觉定位 |最大思维链: 128k | | \ | |GUI 任务处理 | | | \ | |工具调用 | | | \ | |结构化输出 | | | |[doubao-seed-2-0-mini-260215](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-2-0-mini) `即将下线` |深度思考 |上下文窗口: 256k |最大 RPM: 30000 | \ | |文本生成 |最大输入: 224k |最大 TPM: 5000000 | \ | |多模态理解 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 128k | | \ | |视觉定位 |最大思维链: 128k | | \ | |GUI 任务处理 | | | \ | |工具调用 | | | \ | |结构化输出 | | | |[doubao-seed-2-0-code-preview-260215](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-2-0-code) `即将下线` |深度思考 |上下文窗口: 256k |最大 RPM: 30000 | \ | |文本生成 |最大输入: 224k |最大 TPM: 5000000 | \ | |多模态理解 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 128k | | \ | |视觉定位 |最大思维链: 128k | | \ | |工具调用 | | | |[doubao-seed-character-260628](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-character&_vtm_=a106466.b106468.0_0.0_0.0.1961_7630866813484467762&projectName=default) |深度思考 |上下文窗口: 128k |最大 RPM: 30000 | \ | |文本生成 |最大输入: 96k |最大 TPM: 5000000 | \ | |多模态理解 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 32k | | \ | |工具调用 |最大思维链: 128k | | \ | |结构化输出(推荐使用 `json_schema` 模式) | | | |[glm-5-3-flash-260828](https://ark.volcengine.com/region:cn-beijing/model/detail?name=glm-5-3-flash) |深度思考 |上下文窗口: 1024k |最大 RPM: 500 | \ | |文本生成 |最大输入: 1024k |最大 TPM: 1000000 | \ | |多模态理解 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 128k | | \ | |工具调用 |最大思维链: 128k | | |[deepseek-v4-1-flash-261017](https://ark.volcengine.com/region:cn-beijing/model/detail?name=deepseek-v4-1-flash) |深度思考 |上下文窗口: 1024k |最大 RPM: 500 | \ | |文本生成 |最大输入: 1024k |最大 TPM: 1000000 | \ | |多模态理解 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 384k | | \ | |工具调用 |最大思维链: 384k | | \ | |结构化输出 | | | |[deepseek-v4-1-flash-260910](https://ark.volcengine.com/region:cn-beijing/model/detail?name=deepseek-v4-1-flash) |深度思考 |上下文窗口: 1024k |最大 RPM: 500 | \ | |文本生成 |最大输入: 1024k |最大 TPM: 1000000 | \ | |多模态理解 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 384k | | \ | |工具调用 |最大思维链: 384k | | \ | |结构化输出 | | | |[deepseek-v4-1-flash-economy-261017](https://ark.volcengine.com/region:cn-beijing/model/detail?name=deepseek-v4-1-flash-economy) |深度思考 |上下文窗口: 1024k |最大 RPM: 500 | \ | |文本生成 |最大输入: 1024k |最大 TPM: 1000000 | \ | |多模态理解 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 384k | | \ | |工具调用 |最大思维链: 384k | | \ | |结构化输出 | | | # 音频理解能力 教程: [音频理解](/docs/audio-understanding) | API: [Responses API](/docs/create-model-responses-api)、[Chat API](/docs/chat-api) ## 推荐模型 |模型 ID (Model ID) |**能力支持** |**长度限制(token)** |限流 | \ | | | |> 非刚性保障,受平台负载/调用方式影响,详见 [文档](/docs/traffic-burst-handling-best-practices#263ca129) | |---|---|---|---| |[doubao-seed-2-1-lite-260915](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-2-1-lite) |深度思考 |上下文窗口: 1024k |最大 RPM: 30000 | \ | |文本生成 |最大输入: 1024k |最大 TPM: 5000000 | \ | |多模态理解 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 256k | | \ | |工具调用 |最大思维链: 256k | | \ | |结构化输出 | | | |[doubao-seed-2-0-lite-260428](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-2-0-lite) |深度思考 |上下文窗口: 256k |最大 RPM: 30000 | \ | |文本生成 |最大输入: 224k |最大 TPM: 5000000 | \ | |多模态理解 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 128k | | \ | |工具调用 |最大思维链: 128k | | \ | |结构化输出(推荐使用 `json_schema` 模式) | | | |[doubao-seed-2-0-mini-260428](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-2-0-mini) |深度思考 |上下文窗口: 256k |最大 RPM: 30000 | \ | |文本生成 |最大输入: 224k |最大 TPM: 5000000 | \ | |多模态理解 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 128k | | \ | |工具调用 |最大思维链: 128k | | \ | |结构化输出 | | | # 决策评估能力(beta) 教程: [决策评估(beta)](/docs/decision-model) | API: [System One API(beta)](/docs/system-one-api) ## 推荐模型 |模型 ID (Model ID) |**能力支持** |**长度限制(token)** |限流 | \ | | | |> 非刚性保障,受平台负载/调用方式影响,详见 [文档](/docs/traffic-burst-handling-best-practices#263ca129) | |---|---|---|---| |[doubao-seed-2-1-lite-260915](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-2-1-lite) |决策评估 |上下文窗口: 128k |最大 RPM: 30000 | \ | |多模态理解 | |最大 TPM: 5000000 | # GUI 任务处理能力 教程: [GUI Agent 能力](/docs/gui-task-processing) | API: [Responses API](/docs/create-model-responses-api)、[Chat API](/docs/chat-api) ## 推荐模型 |模型 ID (Model ID) |**能力支持** |**长度限制(token)** |限流 | \ | | | |> 非刚性保障,受平台负载/调用方式影响,详见 [文档](/docs/traffic-burst-handling-best-practices#263ca129) | |---|---|---|---| |[doubao-seed-evolving](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-evolving) |深度思考 |上下文窗口: 1024k |最大 RPM: 500 | \ |> 快速迭代模型 |文本生成 |最大输入: 1024k |最大 TPM: 1000000 | \ | |多模态理解 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 256k | | \ | |GUI 任务处理 |最大思维链: 256k | | \ | |工具调用 | | | \ | |结构化输出 | | | |[doubao-seed-2-1-pro-260915](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-2-1-pro) |深度思考 |上下文窗口: 1024k |最大 RPM: 500 | \ | |文本生成 |最大输入: 1024k |最大 TPM: 1000000 | \ | |多模态理解 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 256k | | \ | |GUI 任务处理 |最大思维链: 256k | | \ | |工具调用 | | | \ | |结构化输出 | | | |[doubao-seed-2-1-lite-260915](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-2-1-lite) |深度思考 |上下文窗口: 1024k |最大 RPM: 30000 | \ | |文本生成 |最大输入: 1024k |最大 TPM: 5000000 | \ | |多模态理解 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 256k | | \ | |GUI 任务处理 |最大思维链: 256k | | \ | |工具调用 | | | \ | |结构化输出 | | | |[doubao-seed-2-1-turbo-260628](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-2-1-turbo) |深度思考 |上下文窗口: 256k |最大 RPM: 500 | \ | |文本生成 |最大输入: 256k |最大 TPM: 1000000 | \ | |多模态理解 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 256k | | \ | |GUI 任务处理 |最大思维链: 256k | | \ | |工具调用 | | | \ | |结构化输出 | | | ## 其他模型 |模型 ID (Model ID) |**能力支持** |长度限制(token) |限流 | \ | | | |> 非刚性保障,受平台负载/调用方式影响,详见 [文档](/docs/traffic-burst-handling-best-practices#263ca129) | |---|---|---|---| |[doubao-seed-2-1-pro-260628](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-2-1-pro) |深度思考 |上下文窗口: 256k |最大 RPM: 500 | \ | |文本生成 |最大输入: 256k |最大 TPM: 1000000 | \ | |多模态理解 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 256k | | \ | |GUI 任务处理 |最大思维链: 256k | | \ | |工具调用 | | | \ | |结构化输出(推荐使用 `json_schema` 模式) | | | |[doubao-seed-2-0-lite-260428](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-2-0-lite) |深度思考 |上下文窗口: 256k |最大 RPM: 30000 | \ | |文本生成 |最大输入: 224k |最大 TPM: 5000000 | \ | |多模态理解 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 128k | | \ | |GUI 任务处理 |最大思维链: 128k | | \ | |工具调用 | | | \ | |结构化输出(推荐使用 `json_schema` 模式) | | | |[doubao-seed-2-0-mini-260428](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-2-0-mini) |深度思考 |上下文窗口: 256k |最大 RPM: 30000 | \ | |文本生成 |最大输入: 224k |最大 TPM: 5000000 | \ | |多模态理解 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 128k | | \ | |GUI 任务处理 |最大思维链: 128k | | \ | |工具调用 | | | \ | |结构化输出 | | | |[doubao-seed-2-0-pro-260215](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-2-0-pro) `即将下线` |深度思考 |上下文窗口: 256k |最大 RPM: 30000 | \ | |文本生成 |最大输入: 224k |最大 TPM: 5000000 | \ | |多模态理解 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 128k | | \ | |GUI 任务处理 |最大思维链: 128k | | \ | |工具调用 | | | \ | |结构化输出 | | | |[doubao-seed-2-0-lite-260215](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-2-0-lite) `即将下线` |深度思考 |上下文窗口: 256k |最大 RPM: 30000 | \ | |文本生成 |最大输入: 224k |最大 TPM: 5000000 | \ | |多模态理解 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 128k | | \ | |GUI 任务处理 |最大思维链: 128k | | \ | |工具调用 | | | \ | |结构化输出 | | | |[doubao-seed-2-0-mini-260215](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-2-0-mini) `即将下线` |深度思考 |上下文窗口: 256k |最大 RPM: 30000 | \ | |文本生成 |最大输入: 224k |最大 TPM: 5000000 | \ | |多模态理解 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 128k | | \ | |GUI 任务处理 |最大思维链: 128k | | \ | |工具调用 | | | \ | |结构化输出 | | | # 工具调用能力 |**模型 ID(Model ID)** |**函数调用** |**知识库** |**MCP** |**联网内容插件** |**图像处理** |**豆包助手** | \ | |[Responses API](/docs/create-model-responses-api) & [Chat API](/docs/chat-api) |[Responses API](/docs/create-model-responses-api) |[Responses API](/docs/create-model-responses-api) |[Responses API](/docs/create-model-responses-api) |[Responses API](/docs/create-model-responses-api) |[Responses API](/docs/create-model-responses-api) | |---|---|---|---|---|---|---| |[doubao-seed-evolving](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-evolving)
快速迭代模型 |✓ |✓ |✓ |✓ |✓ |✓ | |[doubao-seed-2-1-pro-260915](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-2-1-pro) |✓ |✓ |✓ |✓ |✓ |✓ | |[doubao-seed-2-1-lite-260915](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-2-1-lite) |✓ |✓ |✓ |✓ |✓ |✓ | |[doubao-seed-2-1-pro-260628](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-2-1-pro) |✓ |✓ |✓ |✓ |✓ |✓ | |[doubao-seed-2-1-turbo-260628](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-2-1-turbo) |✓ |✓ |✓ |✓ |✓ |✓ | |[doubao-seed-2-0-lite-260428](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-2-0-lite) |✓ |✓ |✓ |✓ |✓ |✓ | |[doubao-seed-2-0-mini-260428](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-2-0-mini) |✓ |✓ |✓ |✓ |✓ |✓ | |[doubao-seed-2-0-pro-260215](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-2-0-pro) `即将下线` |✓ |✓ |✓ |✓ |✓ |✓ | |[doubao-seed-2-0-lite-260215](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-2-0-lite) `即将下线` |✓ |✓ |✓ |✓ |✓ |✓ | |[doubao-seed-2-0-mini-260215](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-2-0-mini) `即将下线` |✓ |✓ |✓ |✓ |✓ |✓ | |[doubao-seed-2-0-code-preview-260215](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-2-0-code) `即将下线` |✓ |✓ |✓ |✓ |✓ |✓ | |[doubao-seed-character-260628](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-character&_vtm_=a106466.b106468.0_0.0_0.0.1961_7630866813484467762&projectName=default) |✓ |✓ |✓ |✓ |✓ |✓ | |[doubao-seed-character-251128](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-character) |✓ |✗ |✗ |✗ |✗ |✗ | |[glm-5-3-flash-260828](https://ark.volcengine.com/region:cn-beijing/model/detail?name=glm-5-3-flash) |✓ |✓ |✓ |✓ |✗ |✗ | |[glm-5-2-260617](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=glm-5-2) |✓ |✓ |✓ |✓ |✗ |✗ | |[deepseek-v4-1-flash-261017](https://ark.volcengine.com/region:cn-beijing/model/detail?name=deepseek-v4-1-flash) |✓ |✓ |✓ |✓ |✗ |✗ | |[deepseek-v4-1-flash-260910](https://ark.volcengine.com/region:cn-beijing/model/detail?name=deepseek-v4-1-flash) |✓ |✓ |✓ |✓ |✗ |✗ | |[deepseek-v4-1-flash-economy-261017](https://ark.volcengine.com/region:cn-beijing/model/detail?name=deepseek-v4-1-flash-economy) |✓ |✓ |✓ |✓ |✗ |✗ | |[deepseek-v4-pro-ga-260813](https://ark.volcengine.com/region:cn-beijing/model/detail?name=deepseek-v4-pro-ga) |✓ |✓ |✓ |✓ |✗ |✗ | |[deepseek-v4-flash-ga-260731](https://ark.volcengine.com/region:cn-beijing/model/detail?name=deepseek-v4-flash-ga) |✓ |✓ |✓ |✓ |✗ |✗ | |[deepseek-v4-pro-260425](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=deepseek-v4-pro) `即将下线` |✓ |✓ |✓ |✓ |✗ |✗ | 相关教程: * [Function Calling(函数调用)](/docs/function-calling) * [私域知识库搜索 Knowledge Search](/docs/knowledge-search) * [云部署 MCP / Remote MCP](/docs/mcp-remote-mcp) * [联网搜索工具](/docs/web-search) * [图像处理 Image Process](/docs/image-process) * [豆包助手 API](/docs/doubao-assistant)(Beta) # 上下文缓存能力 介绍: [上下文缓存](/docs/context-cache) | API: [Responses API](/docs/create-model-responses-api) 、 [Context Create API](/docs/create-context-cache-api)、[Chat API](/docs/chat-api)、[Batch API](/docs/batch-inference-api-reference) ## 推荐模型 |模型ID(Model ID) |隐式缓存 |显式缓存 | | |---|---|---|---| |[doubao-seed-evolving](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-evolving) |[Responses API](/docs/create-model-responses-api) |[Responses API](/docs/create-model-responses-api) | | \ |> 快速迭代模型 |[Chat API](/docs/chat-api) |前缀缓存 | | \ | | |Session缓存 | | |[doubao-seed-2-1-pro-260915](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-2-1-pro) |[Responses API](/docs/create-model-responses-api) |[Responses API](/docs/create-model-responses-api) | | \ | |[Chat API](/docs/chat-api) |前缀缓存 | | \ | | |Session缓存 | | |[doubao-seed-2-1-lite-260915](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-2-1-lite) |[Responses API](/docs/create-model-responses-api) |[Responses API](/docs/create-model-responses-api) | | \ | |[Chat API](/docs/chat-api) |前缀缓存 | | \ | | |Session缓存 | | |[doubao-seed-2-1-turbo-260628](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-2-1-turbo) |[Responses API](/docs/create-model-responses-api) |[Responses API](/docs/create-model-responses-api) | | \ | |[Chat API](/docs/chat-api) |前缀缓存 | | \ | | |Session缓存 | | ## 其他模型 |模型ID(Model ID) |隐式缓存 |显式缓存 | | |---|---|---|---| |[doubao-seed-2-1-pro-260628](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-2-1-pro) |[Responses API](/docs/create-model-responses-api) |[Responses API](/docs/create-model-responses-api) | | \ | |[Chat API](/docs/chat-api) |前缀缓存 | | \ | | |Session缓存 | | |[doubao-seed-2-0-lite-260428](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-2-0-lite) |[Responses API](/docs/create-model-responses-api) |[Responses API](/docs/create-model-responses-api) | | \ | |[Chat API](/docs/chat-api) |前缀缓存 | | \ | | |Session缓存 | | |[doubao-seed-2-0-mini-260428](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-2-0-mini) |[Responses API](/docs/create-model-responses-api) |[Responses API](/docs/create-model-responses-api) | | \ | |[Chat API](/docs/chat-api) |前缀缓存 | | \ | | |Session缓存 | | |[doubao-seed-2-0-pro-260215](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-2-0-pro) `即将下线` |[Responses API](/docs/create-model-responses-api) |[Responses API](/docs/create-model-responses-api) | | \ | |[Chat API](/docs/chat-api) |前缀缓存 | | \ | | |Session缓存 | | |[doubao-seed-2-0-lite-260215](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-2-0-lite) `即将下线` |[Responses API](/docs/create-model-responses-api) |[Responses API](/docs/create-model-responses-api) | | \ | |[Chat API](/docs/chat-api) |前缀缓存 | | \ | | |Session缓存 | | |[doubao-seed-2-0-mini-260215](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-2-0-mini) `即将下线` |[Responses API](/docs/create-model-responses-api) |[Responses API](/docs/create-model-responses-api) | | \ | |[Chat API](/docs/chat-api) |前缀缓存 | | \ | | |Session缓存 | | |[doubao-seed-2-0-code-preview-260215](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-2-0-code) `即将下线` |[Responses API](/docs/create-model-responses-api) |[Responses API](/docs/create-model-responses-api) | | \ | |[Chat API](/docs/chat-api) |前缀缓存 | | \ | | |Session缓存 | | |[doubao-seed-character-260628](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-character&_vtm_=a106466.b106468.0_0.0_0.0.1961_7630866813484467762&projectName=default) |[Responses API](/docs/create-model-responses-api) |[Responses API](/docs/create-model-responses-api) | | \ | |[Chat API](/docs/chat-api) |前缀缓存 | | \ | | |Session缓存 | | |[doubao-seed-character-251128](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-character) |– |[Responses API](/docs/create-model-responses-api) | | \ | | |前缀缓存 | | \ | | |Session缓存 | | |[glm-5-3-flash-260828](https://ark.volcengine.com/region:cn-beijing/model/detail?name=glm-5-3-flash) |[Responses API](/docs/create-model-responses-api) |[Responses API](/docs/create-model-responses-api) | | \ | |[Chat API](/docs/chat-api) |前缀缓存 | | \ | | |Session缓存 | | |[glm-5-2-260617](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=glm-5-2) |[Responses API](/docs/create-model-responses-api) |[Responses API](/docs/create-model-responses-api) | | \ | |[Chat API](/docs/chat-api) |前缀缓存 | | \ | | |Session缓存 | | |[deepseek-v4-1-flash-261017](https://ark.volcengine.com/region:cn-beijing/model/detail?name=deepseek-v4-1-flash) |[Responses API](/docs/create-model-responses-api) |[Responses API](/docs/create-model-responses-api) | | \ | |[Chat API](/docs/chat-api) |前缀缓存 | | \ | | |Session缓存 | | |[deepseek-v4-1-flash-260910](https://ark.volcengine.com/region:cn-beijing/model/detail?name=deepseek-v4-1-flash) |[Responses API](/docs/create-model-responses-api) |[Responses API](/docs/create-model-responses-api) | | \ | |[Chat API](/docs/chat-api) |前缀缓存 | | \ | | |Session缓存 | | |[deepseek-v4-1-flash-economy-261017](https://ark.volcengine.com/region:cn-beijing/model/detail?name=deepseek-v4-1-flash-economy) |[Responses API](/docs/create-model-responses-api) |[Responses API](/docs/create-model-responses-api) | | \ | |[Chat API](/docs/chat-api) |前缀缓存 | | \ | | |Session缓存 | | |[deepseek-v4-pro-ga-260813](https://ark.volcengine.com/region:cn-beijing/model/detail?name=deepseek-v4-pro-ga) |[Responses API](/docs/create-model-responses-api) |[Responses API](/docs/create-model-responses-api) | | \ | |[Chat API](/docs/chat-api) |前缀缓存 | | \ | | |Session缓存 | | |[deepseek-v4-flash-ga-260731](https://ark.volcengine.com/region:cn-beijing/model/detail?name=deepseek-v4-flash-ga) |[Responses API](/docs/create-model-responses-api) |[Responses API](/docs/create-model-responses-api) | | \ | |[Chat API](/docs/chat-api) |前缀缓存 | | \ | | |Session缓存 | | |[deepseek-v4-pro-260425](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=deepseek-v4-pro) `即将下线` |[Responses API](/docs/create-model-responses-api) |[Responses API](/docs/create-model-responses-api) | | \ | |[Chat API](/docs/chat-api) |前缀缓存 | | \ | | |Session缓存 | | # 结构化输出能力(beta) 介绍: [结构化输出(beta)](/docs/structured-output-beta) | API: [Responses API](/docs/create-model-responses-api)、[Chat API](/docs/chat-api) ## 推荐模型 |模型 ID (Model ID) |能力支持 |**长度限制(token)** |限流 | \ | | | |> 非刚性保障,受平台负载/调用方式影响,详见 [文档](/docs/traffic-burst-handling-best-practices#263ca129) | |---|---|---|---| |[doubao-seed-evolving](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-evolving) |深度思考 |上下文窗口: 1024k |最大 RPM: 500 | \ |> 快速迭代模型 |文本生成 |最大输入: 1024k |最大 TPM: 1000000 | \ | |多模态理解 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 256k | | \ | |工具调用 |最大思维链: 256k | | \ | |结构化输出 | | | |[doubao-seed-2-1-pro-260915](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-2-1-pro) |深度思考 |上下文窗口: 1024k |最大 RPM: 500 | \ | |文本生成 |最大输入: 1024k |最大 TPM: 1000000 | \ | |多模态理解 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 256k | | \ | |工具调用 |最大思维链: 256k | | \ | |结构化输出 | | | |[doubao-seed-2-1-lite-260915](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-2-1-lite) |深度思考 |上下文窗口: 1024k |最大 RPM: 30000 | \ | |文本生成 |最大输入: 1024k |最大 TPM: 5000000 | \ | |多模态理解 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 256k | | \ | |工具调用 |最大思维链: 256k | | \ | |结构化输出 | | | |[doubao-seed-2-1-turbo-260628](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-2-1-turbo) |深度思考 |上下文窗口: 256k |最大 RPM: 500 | \ | |文本生成 |最大输入: 256k |最大 TPM: 1000000 | \ | |多模态理解 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 256k | | \ | |工具调用 |最大思维链: 256k | | \ | |结构化输出 | | | ## 其他模型 |模型 ID (Model ID) |能力支持 |**长度限制(token)** |限流 | \ | | | |> 非刚性保障,受平台负载/调用方式影响,详见 [文档](/docs/traffic-burst-handling-best-practices#263ca129) | |---|---|---|---| |[doubao-seed-2-1-pro-260628](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-2-1-pro) |深度思考 |上下文窗口: 256k |最大 RPM: 500 | \ | |文本生成 |最大输入: 256k |最大 TPM: 1000000 | \ | |多模态理解 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 256k | | \ | |工具调用 |最大思维链: 256k | | \ | |结构化输出(推荐使用 `json_schema` 模式) | | | |[doubao-seed-2-0-lite-260428](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-2-0-lite) |深度思考 |上下文窗口: 256k |最大 RPM: 30000 | \ | |文本生成 |最大输入: 224k |最大 TPM: 5000000 | \ | |多模态理解 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 128k | | \ | |工具调用 |最大思维链: 128k | | \ | |结构化输出(推荐使用 `json_schema` 模式) | | | |[doubao-seed-2-0-mini-260428](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-2-0-mini) |深度思考 |上下文窗口: 256k |最大 RPM: 30000 | \ | |文本生成 |最大输入: 224k |最大 TPM: 5000000 | \ | |多模态理解 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 128k | | \ | |工具调用 |最大思维链: 128k | | \ | |结构化输出 | | | |[doubao-seed-2-0-pro-260215](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-2-0-pro) `即将下线` |深度思考 |上下文窗口: 256k |最大 RPM: 30000 | \ | |文本生成 |最大输入: 224k |最大 TPM: 5000000 | \ | |多模态理解 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 128k | | \ | |工具调用 |最大思维链: 128k | | \ | |结构化输出 | | | |[doubao-seed-2-0-lite-260215](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-2-0-lite) `即将下线` |深度思考 |上下文窗口: 256k |最大 RPM: 30000 | \ | |文本生成 |最大输入: 224k |最大 TPM: 5000000 | \ | |多模态理解 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 128k | | \ | |工具调用 |最大思维链: 128k | | \ | |结构化输出 | | | |[doubao-seed-2-0-mini-260215](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-2-0-mini) `即将下线` |深度思考 |上下文窗口: 256k |最大 RPM: 30000 | \ | |文本生成 |最大输入: 224k |最大 TPM: 5000000 | \ | |多模态理解 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 128k | | \ | |工具调用 |最大思维链: 128k | | \ | |结构化输出 | | | |[doubao-seed-character-260628](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed-character&_vtm_=a106466.b106468.0_0.0_0.0.1961_7630866813484467762&projectName=default) |深度思考 |上下文窗口: 128k |最大 RPM: 30000 | \ | |文本生成 |最大输入: 96k |最大 TPM: 5000000 | \ | |多模态理解 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 32k | | \ | |工具调用 |最大思维链: 128k | | \ | |结构化输出(推荐使用 `json_schema` 模式) | | | |[deepseek-v4-1-flash-261017](https://ark.volcengine.com/region:cn-beijing/model/detail?name=deepseek-v4-1-flash) |深度思考 |上下文窗口: 1024k |最大 RPM: 500 | \ | |文本生成 |最大输入: 1024k |最大 TPM: 1000000 | \ | |多模态理解 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 384k | | \ | |工具调用 |最大思维链: 384k | | \ | |结构化输出 | | | |[deepseek-v4-1-flash-260910](https://ark.volcengine.com/region:cn-beijing/model/detail?name=deepseek-v4-1-flash) |深度思考 |上下文窗口: 1024k |最大 RPM: 500 | \ | |文本生成 |最大输入: 1024k |最大 TPM: 1000000 | \ | |多模态理解 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 384k | | \ | |工具调用 |最大思维链: 384k | | \ | |结构化输出 | | | |[deepseek-v4-1-flash-economy-261017](https://ark.volcengine.com/region:cn-beijing/model/detail?name=deepseek-v4-1-flash-economy) |深度思考 |上下文窗口: 1024k |最大 RPM: 500 | \ | |文本生成 |最大输入: 1024k |最大 TPM: 1000000 | \ | |多模态理解 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 384k | | \ | |工具调用 |最大思维链: 384k | | \ | |结构化输出 | | | |[deepseek-v4-pro-ga-260813](https://ark.volcengine.com/region:cn-beijing/model/detail?name=deepseek-v4-pro-ga) |深度思考 |上下文窗口: 1024k |最大 RPM: 500 | \ | |文本生成 |最大输入: 1024k |最大 TPM: 1000000 | \ | |工具调用 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 384k
最大思维链: 128k | | \ | |结构化输出 | | | |[deepseek-v4-flash-ga-260731](https://ark.volcengine.com/region:cn-beijing/model/detail?name=deepseek-v4-flash-ga) |深度思考 |上下文窗口: 1024k |最大 RPM: 500 | \ | |文本生成 |最大输入: 1024k |最大 TPM: 1000000 | \ | |工具调用 |[最大回答(默认 4k)](/docs/text-generation#3821b26a): 384k
最大思维链: 128k | | \ | |结构化输出 | | | # 视频生成能力 教程: [Doubao Seedance 2.0 系列教程](/docs/seedance-2-0) | API: [Video Generation API](/docs/create-video-generation-task-api) |**模型 ID(Model ID)** |**模型能力** |**输出视频格式** |在线推理限流 |离线推理限流 | \ | | | |> 非刚性保障,受平台负载/调用方式影响,详见 [文档](/docs/traffic-burst-handling-best-practices#263ca129) |> 非刚性保障,受平台负载/调用方式影响,详见 [文档](/docs/traffic-burst-handling-best-practices#263ca129) | |---|---|---|---|---| |[doubao-seedance-2-5-260628](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seedance-2-5) |* 全模态参考生视频 |* 分辨率: |* 最大 RPM: |* 暂不支持 | \ | | * 参考生视频 | * 480p(8bit 位深) | * 企业用户: 600 | | \ | | | * 720p(8bit 位深) | | | \ | | | * 1080p(10bit 位深) | | | \ | | * 编辑视频 |* 帧率: 24 fps | * 个人用户: 180 | | \ | | * 延长视频 |* 时长: 4~30 秒 |* 最大并发: | | \ | |* 首尾帧生视频 |* 视频格式: mp4, mov | * 企业用户: 10 | | \ | |* 首帧生视频 | | * 个人用户: 3 | | \ | |* 文生视频 | | | | |[doubao-seedance-2-0-260128](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seedance-2-0&projectName=default) |* 全模态参考生视频 |* 分辨率: |非 4k 分辨率: |* 暂不支持 | \ | | * 参考生视频 | * 480p(8bit 位深) |* 最大 RPM: | | \ | | | * 720p(8bit 位深) | | | \ | | | * 1080p(8bit 位深) | | | \ | | | * 4k(10bit 位深) | | | \ | | * 编辑视频 |* 帧率: 24 fps | * 企业用户: 600 | | \ | | * 延长视频 |* 时长: 4~15 秒 | * 个人用户: 180 | | \ | |* 首尾帧生视频 |* 视频格式: mp4 |* 最大并发: | | \ | |* 首帧生视频 | | * 企业用户: 10 | | \ | |* 文生视频 | | * 个人用户: 3 | | \ | | | | * 个人用户: 3 | | \ | | | | | | \ | | | |4k 分辨率: | | \ | | | |* 最大 RPM | | \ | | | | * 企业用户:15 | | \ | | | | * 个人用户:15 | | \ | | | |* 最大并发 | | \ | | | | * 企业用户:1 | | \ | | | | * 个人用户:1 | | |[doubao-seedance-2-0-fast-260128](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seedance-2-0-fast) |* 全模态参考生视频 |* 分辨率: |* 最大 RPM: |* 暂不支持 | \ | | * 参考生视频 | * 480p(8bit 位深) | * 企业用户: 600 | | \ | | | * 720p(8bit 位深) | | | \ | | * 编辑视频 |* 帧率: 24 fps | * 个人用户: 180 | | \ | | * 延长视频 |* 时长: 4~15 秒 |* 最大并发: | | \ | |* 首尾帧生视频 |* 视频格式: mp4 | * 企业用户: 10 | | \ | |* 首帧生视频 | | * 个人用户: 3 | | \ | |* 文生视频 | | | | |[doubao-seedance-2-0-mini-260615](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seedance-2-0-mini) |* 全模态参考生视频 |* 分辨率: |* 最大 RPM: |* 暂不支持 | \ | | * 参考生视频 | * 480p(8bit 位深) | * 企业用户: 600 | | \ | | | * 720p(8bit 位深) | | | \ | | * 编辑视频 |* 帧率: 24 fps | * 个人用户: 180 | | \ | | * 延长视频 |* 时长: 4~15 秒 |* 最大并发: | | \ | |* 首尾帧生视频 |* 视频格式: mp4 | * 企业用户: 10 | | \ | |* 首帧生视频 | | * 个人用户: 3 | | \ | |* 文生视频 | | | | |[doubao-seedance-1-0-pro-250528](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seedance-1-0-pro&projectName=default) `即将下线` |* 首尾帧生视频 |分辨率: |* 最大 RPM: 600 |* 最大 TPD: 5000亿 | \ | |* 首帧生视频 |480p, 720p, 1080p |* 最大并发: 10 | | \ | |* 文生视频 |帧率: 24 fps | | | \ | | |时长: 2~12 秒 | | | \ | | |视频格式: mp4 | | | |[doubao-seedance-1-0-pro-fast-251015](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seedance-1-0-pro-fast&projectName=default) `即将下线` |* 首帧生视频 |分辨率: |* 最大 RPM: 600 |* 最大 TPD: 5000亿 | \ | |* 文生视频 |480p, 720p, 1080p |* 最大并发: 10 | | \ | | |帧率: 24 fps | | | \ | | |时长: 2~12 秒 | | | \ | | |视频格式: mp4 | | | # 图片生成能力 教程: [Doubao Seedream 4.0-5.0 教程](/docs/seedream-4-0-5-0) | API: [Image generation API](/docs/image-generation-api) ## 推荐模型 |模型 ID (Model ID) |**能力支持** |限流 | | \ | | |> 非刚性保障,受平台负载/调用方式影响,详见 [文档](/docs/traffic-burst-handling-best-practices#263ca129) | | \ | | |**最大 IPM** | | \ | | |张 / 分钟 | | |---|---|---|---| |[doubao-seedream-5-0-pro-260628](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seedream-5-0-pro) |图层拆分 |500 | | \ | |单图生成 | | | \ | |* 文生图 | | | \ | |* 单张图生图 | | | \ | |* 多参考图生图 | | | |[doubao-seedream-5-0-flash-260915](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seedream-5-0-flash) |图层拆分 |500 | | \ | |单图生成 | | | \ | |* 文生图 | | | \ | |* 单张图生图 | | | \ | |* 多参考图生图 | | | |[doubao-seedream-5-0-260128](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seedream-5-0) |单图生成 |500 | | \ |(同时支持:doubao-seedream-5-0-lite-260128)`即将下线` |* 文生图 | | | \ | |* 单张图生图 | | | \ | |* 多参考图生图 | | | \ | | | | | \ | |组图生成 | | | \ | |* 文生组图 | | | \ | |* 单张图生组图 | | | \ | |* 多参考图生组图 | | | |[doubao-seedream-4-5-251128](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seedream-4-5) `即将下线` |单图生成 |500 | | \ | |* 文生图 | | | \ | |* 单张图生图 | | | \ | |* 多参考图生图 | | | \ | | | | | \ | |组图生成 | | | \ | |* 文生组图 | | | \ | |* 单张图生组图 | | | \ | |* 多参考图生组图 | | | |[doubao-seedream-4-0-250828](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seedream-4-0) `即将下线` |单图生成 |500 | | \ | |* 文生图 | | | \ | |* 单张图生图 | | | \ | |* 多参考图生图 | | | \ | | | | | \ | |组图生成 | | | \ | |* 文生组图 | | | \ | |* 单张图生组图 | | | \ | |* 多参考图生组图 | | | # 3D生成能力 教程: [3D 生成](/docs/3d-generation) | API: [3D生成 API](/docs/3d-generation-api) |**模型 ID (Model ID)** |**能力支持** |**产物规格** |**限流** |**免费额度** | \ | | | |> **非刚性保障,受平台负载/调用方式影响,详见 [文档](/docs/traffic-burst-handling-best-practices#263ca129)** |(token) | |---|---|---|---|---| |[doubao-seed3d-2-0-260328](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed3d-2-0) |图生3D |产物面数 |最大 RPM: 300 |200万 | \ | | | |最大并发: 5 | | \ | |* 生成带纹理和 PBR 材质的3D文件 |* 100000 | | | \ | | |* 500000 | | | \ | | |* 1000000 | | | \ | | | | | | \ | | |产物格式 | | | \ | | |* glb, obj, usd, usdz | | | \ | | | | | | |[hyper3d-gen2-260112](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=hyper3d-gen2) |文生3D、图生3D |产物面数 |最大 RPM: 60 |15万 | \ | | | |最大并发: 3 | | \ | |* 白模 |* 三角面模型:[500, 1,000,000] | | | \ | |* 带纹理模型 |* 四边面模型:[1,000, 200,000] | | | \ | |* PBR 材质模型 | | | | \ | |* 带纹理 + PBR 材质模型 |产物格式 | | | \ | | |* glb, obj, stl, fbx, usdz | | | \ | | | | | | |[hitem3d-2-0-251223](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=hitem3d-2-0) |图生3D |产物面数 |最大 RPM: 600 |50万 | \ | | | |最大并发: 30 | | \ | |* 标准白模 |* [100000, 2000000] | | | \ | |* 标准纹理模型 | | | | \ | |* 高精白模 |产物格式 | | | \ | |* 高精纹理模型 |* glb, obj, stl, fbx, usdz | | | \ | | | | | | \ | | |产物分辨率 | | | \ | | |* 1536、1536 pro | | | \ | | | | | | # 向量化能力 教程: [向量化](/docs/vectorization) | API: [Embeddings Multimodal API](/docs/multimodal-vectorization-api) |模型 ID (Model ID) |**能力支持** |**上下文窗口** |**最高向量维度** |限流 | \ | | | | |> 非刚性保障,受平台负载/调用方式影响,详见 [文档](/docs/traffic-burst-handling-best-practices#263ca129) | |---|---|---|---|---| |[doubao-embedding-vision-251215](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-embedding-vision) |多模态向量化 |128k |2048 |最大 RPM: 15000 | \ | |> 支持 视频、文本、图片输入 | |> 支持1024降维使用 |最大 TPM: 1200000 | |[doubao-embedding-vision-250615](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-embedding-vision) `即将下线` |多模态向量化 |128k |2048 |最大 RPM: 15000 | \ | |> 支持 视频、文本、图片输入 | |> 支持1024降维使用 |最大 TPM: 1200000 | --- # Seed-Evolving Source: https://ark.volcengine.com/region:cn-beijing/docs/latest-model Seed-Evolving 是面向 Agent 与 Coding 场景打造的 Seed 系列模型,具备复杂任务编排、长程规划、代码生成与工具调用能力。统一调用 Model ID `doubao-seed-evolving`,无需关注版本切换,即可持续获得最新模型能力。最新版本在 Agent 长程执行、可信调研与多模态理解方面的能力全面增强。 > **警告:重要注意事项** > > Seed-Evolving 模型调用时,建议先参考 [Agent 场景模型调用的正确姿势](/docs/agent-model-invocation-practice),按推荐方式**回传思考内容加密原文**、配置关键参数,并在同一 Session 内保持调用配置不变,以获得更稳定的模型推理效果。 ## 模型核心优势
**始终最新 | 一个 Model ID,无感获取新版本** 模型升级自动生效,无需迁移 Endpoint 或调整调用方式。
**快速迭代 | 聚焦真实场景持续优化** 围绕代码生成、工具调用、任务规划与长程执行等核心任务滚动升级。
## 最新更新亮点 **版本更新时间:2026/09/09** 更强的 Agent 执行能力与多模态理解,是本次更新的两大核心升级。模型能够持续推进复杂任务、协同并验收异步子任务,将图片、视频和页面理解用于推理判断与实际操作,让深度调研、办公协作和长程任务的交付更稳健。
**Agent | 复杂任务持续执行与验收** * **复杂多步骤、长周期任务稳健推进**,强化任务拆解、持续规划与工具协同,将工作推进到可验收的成果 * **异步子任务协同与验收更可靠**,依据真实状态和返回结果确认完成,减少提前收尾与反复返工
**多模态理解 | 理解深入,响应高效** * **图片、视频理解与视觉推理能力增强**,深入理解视觉信息中的逻辑关系,为真实环境感知与操作判断提供支撑 * **理解效果与处理效率同步提升**,图片和视频理解任务耗时较上一代减少 40%
**深度调研 | 可信分析,专业交付** * 强化**证据溯源、资料时效判断、来源权威性与数据核验**,让研究结论有据可查,深度分析更可靠 * **金融投研展现专家级研究深度与洞察力**,金融建模计算可信度与研究报告交付质量大幅提升
**工具执行 | 减少幻觉,反馈可信** * **Agent 幻觉大幅减少**,调用必要工具取证、等待真实结果并检查返回内容,让回复忠于事实与实际执行 * **如实说明工具不可用、证据不足与结论边界**,保留不确定性,减少编造结果或提前宣告完成
**Office 办公 | 全局一致,跨应用协同** * **文档、PPT 与表格的生成、修改和核验更实用**,优化基础版式、全局修改一致性,以及修改后的回读与视觉验收 * 结合**多模态理解与 Computer Use**,衔接浏览器、文档、表格和文件操作,支持跨软件办公流程
**Coding | 从设计还原到工程实践** * **视觉理解赋能前端开发**,理解设计图中的布局、样式与细节,支持 Web 界面还原与应用开发 * 覆盖**自然语言驱动的新项目构建、环境部署与运维**,衔接代码生成、终端操作与工程任务执行
## 模型能力 [文本生成](/docs/text-generation) Supported [深度思考](/docs/deep-thinking) Supported [函数调用](/docs/function-calling) Supported [上下文缓存](/docs/context-cache) Supported [文档理解](/docs/document-understanding) Supported [结构化输出](/docs/structured-output-beta) Supported [图片理解](/docs/image-understanding) Supported [视频理解](/docs/video-understanding) Supported ## 模型限制 **长度限制(token)** 上下文窗口:1024k | 最大输入长度:1024k 最大思维链内容长度:256k | 最大输出长度:256k **模型限流** 最大 RPM:500 最大 TPM:1,000,000 ## 使用说明 ### 深度思考 - 深度思考开关:通过 `thinking` 参数控制模型是否开启深度思考模式,默认开启思考。 - 调节思考长度:通过 `reasoning_effort` 参数调节思考长度,支持 `none`、`minimal`、`low`、`medium`、`high`、`xhigh`、`max` 七种模式,默认开启 `high` 模式。 - 输出思考内容摘要:默认开启 thinking summary 能力,不会输出模型原始的思考内容,会返回模型思考内容摘要和思考内容加密原文。建议全量回传,服务端会基于场景判断是否会丢弃思维链内容。具体见[回传思考内容加密原文](/docs/deep-thinking#8cfd447b)。 - Chat API:回传 `encrypted_content` 字段。 - Responses API:推荐使用 `previous_response_id` 回传。 ### 多模态理解 - Doubao-Seed-Evolving 面向 Coding 和 Agent 场景,支持图片、视频、文本理解,未支持音频理解及视频中的音频理解。 - 图片理解:通过 `detail` 参数控制模型理解图片的精细度,支持 `low`、`high`、`xhigh` 三种模式,默认值为 `high`。不同模式支持的单图 token 范围和图片像素区间如下。教程参见[图片理解](/docs/image-understanding)。 | detail 模式 | 单图 token 范围 | 图片像素区间 | | --- | --- | --- | | `low` | [1, 1280] | [1764, 2257920] | | `high` | 1280 | 2257920 | | `xhigh` | [1280, 5120] | [2257920, 9031680] | * 视频理解:通过 fps 控制视频理解的精细度,教程参见[视频理解](/docs/video-understanding)。 * Files API 上传:如果图片、视频、文档文件超过 10 MB,建议使用 Files API 上传,通过 File ID 方式进行多模态理解。 ### 工具调用 工具调用场景开启深度思考后,为给出更详尽准确的回答,将不会直接丢弃思维链内容,思维链内容可能参与后续轮次推理,输入 token 会增加。建议全量回传思考内容,服务端会基于场景判断是否会丢弃思维链内容。具体原理及请求示例参见[工具调用场景](/docs/context-management#a0247227)。 |流程图 |说明 | |---|---| |![](https://arkdocs.tos-cn-beijing.volces.com/flowcharts/advanced-usage/context-management-03.svg) |* 回答问题 1 时(请求 1.1 - 1.2),模型进行多次思考 + 工具调用后给出答案,方舟会输入完整上下文包括思维链内容给模型处理。 | \ | |* 开始回答问题2时(请求 2.1),方舟会自行判断并删除之前上下文中的思维链,输入给模型。 | ### 上下文缓存 利用缓存机制复用计算结果,避免模型对相同内容的重复处理,降低 token 成本。具体使用见[上下文缓存](/docs/context-cache)。 * 隐式缓存:自动模式,用户无需做额外配置。系统会自动识别请求中的公共前缀并进行缓存,但不保证缓存命中。支持 Responses API、Chat API,默认开启。 * 显式缓存:需要显式创建缓存,但能实现更高的缓存命中率。支持 Responses API,提供前缀缓存、Session 缓存。 ### 接入三方工具 方舟 API 兼容 OpenAI 和 Anthropic 接口协议,支持在三方工具中使用,如 Claude Code、OpenCode、Codex,具体见[接入三方工具](/docs/integrate-third-party-tools)。 ## 模型迁移 在 AI Agent 工具中使用 `ark-docs-assistant` Skill 进行模型升级/迁移分析,以及代码项目中的模型引用判断与替换风险分析。 1. 前提条件:需要安装 `ark-docs-mcp`,安装及使用参考 [方舟文档 MCP](/docs/tutorials-mcp)。 2. 推荐在项目根目录运行以下命令,通过方舟文档 Skills catalog 安装 `ark-docs-assistant` Skill。 ```bash npx --yes skills@latest add "https://arkdocs.tos-cn-beijing.volces.com/skills/" \ --skill ark-docs-assistant \ --yes ``` 如需手动安装,可以下载 [ark-docs-assistant-0.1.0.zip](https://arkdocs.tos-cn-beijing.volces.com/skills/artifacts/docs-platform/ark-docs-assistant/0.1.0/ark-docs-assistant-0.1.0.zip),解压后将 Skill 目录放入对应 Agent 的 skills 目录。 3. 在 Agent 中触发该 Skill 的方式可参见: ```text * 我可以将 doubao-seed-2-0-lite 升级到最新模型吗? * 扫描当前项目,将目标模型升级为最新模型,先给出迁移清单,不要直接修改。 ``` --- # DeepSeek-V4.1-Flash(升级 1017) Source: https://ark.volcengine.com/region:cn-beijing/docs/deepseek-v4-1-flash DeepSeek-V4.1-Flash 是 DeepSeek 全新架构系列中的轻量旗舰模型,以 552B 总参数 MoE 实现越级智能,在多项基准上超越包括 DeepSeek-V4-Pro 在内的主流旗舰模型,原生支持多模态视觉理解能力。 > **说明:重要升级** > > `deepseek-v4-1-flash-261017` 版本已上线。该版本在方舟平台继承 DeepSeek-V4.1-Flash 的多模态理解、深度思考、前缀续写、上下文缓存等能力。 - [DeepSeek-V4.1-Flash 模型](https://ark.volcengine.com/region:cn-beijing/model/detail?name=deepseek-v4-1-flash):查看模型支持能力、上下文及速率限制、支持 API 等模型信息。 - [模型价格](/docs/model-pricing#aa1874cf):查看高峰时段、空闲时段价格信息。 > **说明** > > [DeepSeek-V4.1-Flash经济版](https://ark.volcengine.com/region:cn-beijing/model/detail?name=deepseek-v4-1-flash-economy) 与标准版采用完全相同的模型权重,能力与效果完全一致。经济版价格更低,回答生成速度略慢,适合注重成本、对生成速度要求不高的场景。 > **注意:重要信息** > > 方舟 DeepSeek-V4.1-Flash 模型在功能完善度、使用体验及兼容性方面做了专项提升。本文将围绕支持场景,对方舟与 DeepSeek 官网的能力和 API 参数进行对比,帮助您快速了解方舟在对应场景的支持情况。 # 支持场景总览 ## 模型能力增强 | 场景 | DeepSeek 官网 | 方舟 | | --- | --- | --- | | 图片理解 | 单个图像不超过 `32MB` | 单个图像不超过 `50MB`,支持 detail 模式(`low`/`high`/`auto`/`xhigh`)。 | \ | | | | \ | | | > 详细见 [图片理解](/docs/deepseek-v4-1-flash#multimodal-differences)。 | | 视频理解 | 不支持 | 支持 | \ | | | 单视频文件不超过 `50MB`,支持 Files Id 方式。 | \ | | | > 抽帧策略与 doubao-seed-2.0 及后续模型一致,详细见 [视频理解](/docs/deepseek-v4-1-flash#video-understanding)。 | | 隐式缓存 | 支持 | 支持 | \ | | | 缓存最少 Token 数为 256 | | 显式缓存 | 不支持 | 支持 | | 前缀续写 | 支持 | 支持 | \ | | > 在 beta 接口中支持。 |* Chat API:与 DeepSeek 官网对齐。| \ | | |* Responses API:使用方舟原有 API 字段支持。 | \ | | | > 详细见 [前缀续写](/docs/deepseek-v4-1-flash#prefix-continuation)。 | ## 关键 API 参数 | 场景 | DeepSeek 官网 | 方舟 | | --- | --- | --- | | 最大输出长度:**max_tokens** | 控制模型回答和模型思维链内容长度,超出长度后会报错。 | **控制模型回答和模型思维链内容长度**,超出长度后不报错。 | | ^^ | Chat API 非思考模式默认 8K,思考模式默认 64K(**reasoning_effort** 为 `max` 时为 128K)。 | Chat API 默认值 128K。Responses API 对应 **max_output_tokens**,默认 128K。详细见 [最大输出长度](/docs/deepseek-v4-1-flash#max-tokens-parameter)。 | \ | | || \ | | |* `deepseek-v4-1-flash-261017`、`deepseek-v4-1-flash-260910`: **max_tokens** 控制模型回答和模型思维链内容长度,默认取值 128k,如果思维链内容超出 **max_tokens**,则会截断思考。| \ | | |* 除上述模型外的其他模型:**max_tokens** 控制模型回答长度,不包含思维链内容,默认取值 4k。 | \ | | | | | 调节思考长度:**reasoning_effort** / **reasoning.effort** / **output_config.effort** | Chat API / Responses API / Messages API 三个 API 均支持,默认取值 `high`。 | Chat API / Responses API / Messages API 三个 API 均支持,默认取值 `high`。 | |^^ |* OpenAI 格式 / Anthropic 格式:支持档位 `low`/`high`/`max`|* Chat API 格式 / Responses API 格式:支持档位 `none`/`low`/`high`/`max` | \ | |* Responses API 格式:支持档位 `none`/`low`/`high`/`max`|* Messages API 格式:支持档位 `low`/`high`/`max` | \ | | |> 详细见 [调节思考长度](/docs/deepseek-v4-1-flash#reasoning-effort)。| | 核采样阈值:**top_p** |* 思考模式:参数生效,传入值 `< 0.95` 时系统自动提升至 `0.95`;传入值 `≥ 0.95` 按实际传入使用。不传该参数时默认值为 1。 |* 思考模式:参数生效,传入值 `< 0.95` 时系统自动提升至 `0.95`;传入值 `≥ 0.95` 按实际传入使用。不传该参数时,使用 tool 时默认值为 0.95,其他情况默认值为 1。 | \ | |* 非思考模式:字段取值固定为 `1.0`,传入的值将被忽略。|* 非思考模式:字段取值固定为 `1.0`,传入的值将被忽略。 | | 对数概率:**logprobs** / **top_logprobs** | 支持 | 支持 | \ | | |为了保证与 OpenAI 协议的一致性,方舟开启 **logprobs** 后,接口会在 **choices[].logprobs.content** 中返回模型完整生成序列的逐 token 对数概率,包括思维链内容和最终回答。 | | 停止词:**stop** | 最多支持 `16` 个字符串。 |* Chat API 默认情况:最多支持 4 个停止词。 | \ | | |* Chat API `deepseek-v4-1-flash-261017`、`deepseek-v4-1-flash-260910` 模型:最多支持 `16` 个字符串。 | | **role** 是否支持 developer | 不支持 | 支持 | | **tool_choice** | 思考模式下不支持 **tool_choice** 为 `required`,接口会报错。 | 思考模式下支持 **tool_choice** 为 `required`。 | | Responses API 整体兼容性 | 弱校验,对不支持字段全部不校验,不报错。 | 强校验,不支持的字段仍然校验,会报错。 | \ | | | | \ | | | 如果 User Agent 里包含 `codex` 字样,也会进入弱校验,但不支持 **store**。| \ | | | | # 模型使用说明 ## 前缀续写 > 续写模式配置及使用方式,参见 [续写模式](/docs/continuation-mode#6eb2f599)。 DeepSeek-V4.1-Flash 模型前缀续写行为支持情况如下: | API | Chat API | Responses API | | --- | --- | --- | | 触发前缀续写条件 |* **messages** 列表里最后一条消息的 **role** 为 `assistant` |* **input** 列表里设置最后一条消息的 **role** 为 assistant | \ | |* 设置最后一条消息的 **prefix** 参数为 `true` |* 设置 **partial** 为 `true` 开启续写模式(不设置 **partial** 不会报错,只是不开启续写。) | ## 图片理解 > 图片理解支持的图片传入方式和使用,参见 [图片理解](/docs/image-understanding)。 DeepSeek-V4.1-Flash 模型在图片理解支持的 **detail 模式及缩放规则**如下: > 表格中图片像素区间指的是:传入的图片根据 detail 模式处理后的像素区间。 | detail 模式 | 图片像素区间 | Chat API | Responses API | Messages API | | --- | --- | --- | --- | --- | | low | 262144 | 图片会被保持长宽比自动缩放,缩放后的总像素相当于 512 × 512 的图片 | 图片会被保持长宽比自动缩放,缩放后的总像素相当于 512 × 512 的图片 |* 图片总像素小于 544 × 544 的图片会保持长宽比放大,放大后的总像素相当于 544 × 544 的图片。 | \ | | | | |* 图片总像素大于 1300 × 1300 的图片会保持长宽比缩小,缩小后的总像素相当于 1300 × 1300 的图片。 | | high | [295936, 1690000] |* 图片总像素小于 544 × 544 的图片会保持长宽比放大,放大后的总像素相当于 544 × 544 的图片。 |* 图片总像素小于 544 × 544 的图片会保持长宽比放大,放大后的总像素相当于 544 × 544 的图片。 |^^| \ | | |* 图片总像素大于 1300 × 1300 的图片会保持长宽比缩小,缩小后的总像素相当于 1300 × 1300 的图片。 |* 图片总像素大于 1300 × 1300 的图片会保持长宽比缩小,缩小后的总像素相当于 1300 × 1300 的图片。 | | | auto | ^^| ^^| ^^ |^^ | | xhigh | 1690000 | 图片会被保持长宽比自动缩放,缩放后的总像素相当于 1300 × 1300 的图片 | 图片会被保持长宽比自动缩放,缩放后的总像素相当于 1300 × 1300 的图片 | ^^ | DeepSeek-V4.1-Flash 模型在图片理解的**使用限制**如下: | 使用限制 | 要求 | | --- | --- | | 单图大小 | 50 MB | | 总请求体大小 | 64 MB | | 单请求中图片张数 | 3600 张 | | 单个请求中通过 URL 方式传入图片文件的总大小 | 200 MB | ## 视频理解 > 视频理解支持的视频传入方式及使用,参见 [视频理解](/docs/video-understanding)。 DeepSeek-V4.1-Flash 模型在视频理解场景下,抽帧策略与 doubao-seed-2.0 及后续模型保持一致,具体如下: |抽帧策略 | DeepSeek-V4.1-Flash模型 | |---|---| |单帧 tokens |支持 tokens 在 `[64, 384]` 区间内连续动态调整,默认值为 384。 | \ | |* 单帧最大 tokens 数,用于控制单帧质量的上限。 | \ | |* 单帧最小 tokens 数,用于控制单帧压缩的下限。默认值为 64。 | |单帧对应的最大像素 |单帧最大 tokens * 42 * 42 | \ | |[110K, 670K] | |抽帧数 |* 抽帧数范围:[16帧, 1280帧]。 | \ | |```Text | \ | |# 最大抽帧数 | \ | |80×1024 token ÷ 64 token/帧 = 1280 帧 | \ | |``` | |视频最大 tokens | 默认值为 81920(80 × 1024)。 | |抽帧方案 | | \ | |* 建议评估输出效果,按需调整fps字段配置或视频时长。 | \ | |* 如果视频二进制数据中未包含帧数编码信息,会按 fps 均匀抽帧。单次请求视频最大 Token 量如果超过模型最大输入长度则会报错;未超过则不报错,但视频输入的 token 可能会超过 80k。 | \ | | | \ | |* fps 过高或视频长度过长:处理的帧图像数量超出1280帧,则按帧图像64tokens,时间间隔 `视频时长/1280`,均匀抽取1280帧。 | \ | |* fps 过小或视频长度过短:处理的帧图像数量不足16帧时抽取方案如下: | \ | | * 视频总帧数 >= 16帧,均匀抽取16帧。 | \ | | * 视频总帧数 < 16帧,抽取视频所有帧。 | **视频理解工作原理**: 视频处理的核心方式为 “帧与时间戳的结构化拼接”,具体规则如下: * 对视频抽帧得到的每帧图像,在其前插入时间戳文本。 DeepSeek-V4.1-Flash 模型处理后的时间戳格式为 `[<时间戳> second]`。例如:`[4.0 second]、[4.5 second]`。 * 拼接后形成“时间戳+图像”的有序序列,模型通过该序列理解视频的时序逻辑和内容变化。 ## 回传思考内容 > 回传思考内容的教程,参见 [Agent 场景模型调用的正确姿势](/docs/agent-model-invocation-practice)。 DeepSeek-V4.1-Flash 模型支持**回传思考内容原文**(明文)。在 Agent 场景下,需要将思考内容原文拼回下一轮请求。 ## 调节思考长度:**reasoning_effort**/**reasoning.effort**/**output_config.effort** > Chat API 和 Responses API 中调节思考长度的配置及使用,参见 [调节思考长度](/docs/deep-thinking#fc5eac89)。 DeepSeek-V4.1-Flash 模型在方舟 API 的支持情况如下: | API | Chat API | Messages API | Responses API | | --- | --- | --- | --- | | 调节思考长度参数 | **reasoning_effort** | **output_config.effort** | **reasoning.effort** | | 默认取值 | `high` | `high` | `high` | | 兼容映射规则 |支持档位:`none`、`low`、`high`、`max`| 支持档位:`low`、`high`、`max` |支持档位:`none`、`low`、`high`、`max` | \ | |* 传入 `none`:将关闭思考||* 传入 `none`:将关闭思考 | \ | | | `thinking.type` 为 `adaptive`,`output_config.effort` 才有效。 | | \ | | | | | \ | |* 传入 `minimal`:将映射为 `low` |* 传入 `minimal`:将映射为 `low` |* 传入 `minimal`:将映射为 `low` | \ | |* 传入 `medium` / `xhigh`:将映射为 `high` |* 传入 `medium` / `xhigh`:将映射为 `high`|* 传入 `medium` / `xhigh`:将映射为 `high` | \ | |* 传入 `ultra`:将映射为 `max` |* 传入 `ultra`:将映射为 `max`| | ## 最大输出长度:**max_tokens**/**max_completion_tokens**/**max_output_tokens** > 最大输出长度的通用配置方式,参见 [设置最大输出长度](/docs/deep-thinking#cfc7c5a8)。 DeepSeek-V4.1-Flash 模型最大输出长度参数支持情况如下: | API | Chat API | Responses API | | --- | --- | --- | | 参数 | **max_tokens**/**max_completion_tokens** | **max_output_tokens** | | 规则 | **控制模型回答和模型思维链内容长度**,超出长度后不报错。 | 控制模型回答和模型思维链内容长度,超出长度后不报错。 | \ | || | \ | | 如果思维链内容超出 **max_tokens**,则会截断思考。| | \ | | | | | 默认值 | 128K | 128K | # 代码示例 Chat API 的示例代码如下: **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "deepseek-v4-1-flash-260910", "messages": [ { "role": "user", "content": [ {"type": "image_url","image_url": {"url": "https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/ark_demo_img_1-zh.png"}}, {"type": "text", "text": "Which model series supports image input?"} ] } ] }' ``` **选项:Python** ```Python import os # Install SDK: pip install arkruntime from arkruntime import Ark client = Ark( # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv('ARK_API_KEY'), ) completion = client.chat.completions.create( # Replace with Model ID model = "deepseek-v4-1-flash-260910", messages=[ { "role": "user", "content": [ {"type": "image_url","image_url": {"url": "https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/ark_demo_img_1-zh.png"}}, {"type": "text", "text": "Which model series supports image input?"}, ], } ], ) print(completion.choices[0]) ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/chat" ) func main() { client := arkruntime.NewClientWithApiKey( //Use os.Getenv to get ARK_API_KEY os.Getenv("ARK_API_KEY"), // The base URL for model invocation arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) // Create a context background ctx := context.Background() // Construct the content of the message contentParts := []chat.ChatCompletionContentPart{ chat.ChatCompletionContentPart{OneOf: chat.NewChatCompletionContentPartImageChatCompletionContentPartSum(chat.ChatCompletionContentPartImage{Type: chat.ChatCompletionContentPartImageTypeImageURL, ImageURL: chat.ChatCompletionContentPartImageImageUrl{URL: chat.NewOptString("https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/ark_demo_img_1-zh.png")}})}, chat.ChatCompletionContentPart{OneOf: chat.NewChatCompletionContentPartTextChatCompletionContentPartSum(chat.ChatCompletionContentPartText{Type: chat.ChatCompletionContentPartTextTypeText, Text: "Which model series supports image input?"})}, } // Construct chat, specify model and message req := &chat.ChatCompletionRequest{ // Replace with Model ID Model: "deepseek-v4-1-flash-260910", Messages: []chat.ChatCompletionRequestMessage{ chat.ChatCompletionRequestMessage{OneOf: chat.NewChatCompletionRequestUserMessageChatCompletionRequestMessageSum(chat.ChatCompletionRequestUserMessage{Role: chat.ChatCompletionRequestUserMessageRoleUser, Content: chat.NewChatCompletionContentPartArrayChatCompletionMessageContent(contentParts)})}, }, } // Send chat, store result in resp and any possible error in err resp, err := client.CreateChatCompletion(ctx, req) if err!= nil { fmt.Printf("standard chat error: %v\n", err) return } // Print response fmt.Println(resp.Choices[0].Message.Content) } ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.chat.*; import com.volcengine.ark.runtime.models.chat.ChatCompletionContentPart.*; import com.volcengine.ark.runtime.service.ArkService; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; public class MultiImageSample { static String apiKey = System.getenv("ARK_API_KEY"); static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); static Dispatcher dispatcher = new Dispatcher(); static ArkService service = ArkService.builder() .dispatcher(dispatcher) .connectionPool(connectionPool) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation . .apiKey(apiKey) .build(); public static void main(String[] args) throws Exception { List messagesForReqList = new ArrayList<>(); // Construct the content of the message List contentParts = new ArrayList<>(); // Use builder mode for the image contentParts.add(ChatCompletionContentPartImage.builder() .type(ChatCompletionContentPartType.IMAGE_URL) .imageUrl(ChatCompletionContentPartImageImageUrl.builder().url("https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/ark_demo_img_1-zh.png").build()) .build()); // Use builder mode for text contentParts.add(ChatCompletionContentPartText.builder() .type(ChatCompletionContentPartType.TEXT) .text("Which model series supports image input?") .build()); // Create message messagesForReqList.add(ChatCompletionRequestUserMessage.builder() .role(ChatCompletionRequestMessageType.USER) .content(ChatCompletionMessageContent.ofList(contentParts)) .build()); ChatCompletionRequest req = ChatCompletionRequest.builder() .model("deepseek-v4-1-flash-260910") //Replace with Model ID . .messages(messagesForReqList) .build(); service.createChatCompletion(req) .getChoices() .forEach(choice -> System.out.println(choice.getMessage().getContent())); // shutdown service after all requests are finished service.shutdownExecutor(); } } ``` --- # 文本生成 Source: https://ark.volcengine.com/region:cn-beijing/docs/text-generation 根据输入的提示词生成连贯清晰的文本内容。 > **说明** > > 方舟平台的新用户?获取 API Key 及 开通模型等准备工作,请参见 [快速入门](/docs/quick-start)。 # 快速开始 |输入 |输出预览 | |---|---| |```Plain Text |```Plain Text | \ |请将下面内容进行结构化处理:火山方舟是火山引擎推出的大模型服务平台,提供模型训练、推理、评测、精调等全方位功能与服务,并重点支撑大模型生态。 火山方舟通过稳定可靠的安全互信方案,保障模型提供方的模型安全与模型使用者的信息安全,加速大模型能力渗透到千行百业,助力模型提供方和使用者实现商业新增长。 |# 火山方舟大模型服务平台结构化信息 | \ |``` | | \ | |## 一、基本属性 | \ | |1. **推出主体**:火山引擎 | \ | |2. **平台定位**:大模型服务平台 | \ | | | \ | |## 二、核心功能与服务 | \ | |提供模型训练、推理、评测、精调等全方位大模型相关功能与服务,核心定位包括: | \ | |1. 支撑大模型生态建设 | \ | |2. 推动大模型能力向千行百业渗透 | \ | | | \ | |## 三、安全保障方案 | \ | |通过稳定可靠的安全互信方案,双向保障信息安全: | \ | |1. 模型提供方:保障其模型安全 | \ | |2. 模型使用者:保障其信息安全 | \ | | | \ | |## 四、价值目标 | \ | |助力模型提供方和使用者实现商业新增长,构建大模型生态下的商业共赢模式。 | \ | |``` | **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "messages": [ {"role": "user", "content": "请将下面内容进行结构化处理:火山方舟是火山引擎推出的大模型服务平台,提供模型训练、推理、评测、精调等全方位功能与服务,并重点支撑大模型生态。 火山方舟通过稳定可靠的安全互信方案,保障模型提供方的模型安全与模型使用者的信息安全,加速大模型能力渗透到千行百业,助力模型提供方和使用者实现商业新增长。"} ], "thinking":{ "type":"disabled" } }' ``` * 按需替换 Model ID,查询 Model ID 请参见 [模型列表](/docs/model-list)。 **选项:Python** ```Python import os # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark # 初始化Ark客户端 client = Ark( # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key:https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv('ARK_API_KEY'), ) completion = client.chat.completions.create( # Replace with Model ID model = "doubao-seed-2-1-pro-260915", messages=[ {"role": "user", "content": "请将下面内容进行结构化处理:火山方舟是火山引擎推出的大模型服务平台,提供模型训练、推理、评测、精调等全方位功能与服务,并重点支撑大模型生态。 火山方舟通过稳定可靠的安全互信方案,保障模型提供方的模型安全与模型使用者的信息安全,加速大模型能力渗透到千行百业,助力模型提供方和使用者实现商业新增长。"}, ], # thinking={"type": "disabled"}, # Manually disable deep thinking ) print(completion.choices[0].message.content) ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/chat" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), // The base URL for model invocation arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() req := &chat.ChatCompletionRequest{ // Replace with Model ID Model: "doubao-seed-2-1-pro-260915", Messages: []chat.ChatCompletionRequestMessage{ userMessage("请将下面内容进行结构化处理:火山方舟是火山引擎推出的大模型服务平台,提供模型训练、推理、评测、精调等全方位功能与服务,并重点支撑大模型生态。 火山方舟通过稳定可靠的安全互信方案,保障模型提供方的模型安全与模型使用者的信息安全,加速大模型能力渗透到千行百业,助力模型提供方和使用者实现商业新增长。"), }, Thinking: chat.NewOptThinking(chat.Thinking{Type: chat.NewOptThinkingMode(chat.ThinkingModeDisabled)}), } resp, err := client.CreateChatCompletion(ctx, req) if err != nil { fmt.Printf("standard chat error: %v\n", err) return } fmt.Println(resp.Choices[0].Message.Content) } func userMessage(content string) chat.ChatCompletionRequestMessage { return chat.ChatCompletionRequestMessage{ OneOf: chat.NewChatCompletionRequestUserMessageChatCompletionRequestMessageSum( chat.ChatCompletionRequestUserMessage{ Role: chat.ChatCompletionRequestUserMessageRoleUser, Content: chat.NewOptNilChatCompletionMessageContent(chat.NewStringChatCompletionMessageContent(content)), }, ), } } ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.chat.*; import com.volcengine.ark.runtime.service.ArkService; import java.util.ArrayList; import java.util.List; public class ChatCompletionsExample { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); // The base URL for model invocation ArkService service = ArkService.builder().apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); final List messages = new ArrayList<>(); final ChatCompletionRequestMessage userMessage = ChatCompletionRequestUserMessage.builder().role(ChatCompletionRequestMessageType.USER).content(ChatCompletionMessageContent.ofString("请将下面内容进行结构化处理:火山方舟是火山引擎推出的大模型服务平台,提供模型训练、推理、评测、精调等全方位功能与服务,并重点支撑大模型生态。 火山方舟通过稳定可靠的安全互信方案,保障模型提供方的模型安全与模型使用者的信息安全,加速大模型能力渗透到千行百业,助力模型提供方和使用者实现商业新增长。")).build(); messages.add(userMessage); ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder() .model("doubao-seed-2-1-pro-260915")//Replace with Model ID .messages(messages) // .thinking(Thinking.builder().type(ThinkingMode.DISABLED).build()) // Manually disable deep thinking .build(); service.createChatCompletion(chatCompletionRequest).getChoices().forEach(choice -> System.out.println(choice.getMessage().getContent())); // shutdown service service.shutdownExecutor(); } } ``` > **说明** > > 使用 Responses API 实现单轮对话的示例,请参见[快速开始](/docs/responses-api-text-generation#17377051)。 # 模型与API 支持的模型:[文本生成能力](/docs/model-list#32e9e053) 支持的API : * [Responses API](/docs/create-model-responses-api):新推出的 API,简洁上下文管理,增强工具调用能力,缓存能力降低成本,新业务及用户推荐。 * [Chat API](/docs/chat-api):使用广泛的 API,存量业务迁移成本低。 # 使用示例 ## 多轮对话 实现多轮对话,需将包含系统消息、模型消息和用户消息的对话历史组合成一个列表,以便模型理解上下文,并延续之前的话题进行问答。 |传入方式 |手动管理上下文 |通过ID管理上下文 | |---|---|---| |使用示例 |```JSON |```JSON | \ | |... |... | \ | | "model": "doubao-seed-2-1-pro-260915", | "model": "doubao-seed-2-1-pro-260915", | \ | | "messages":[ | "previous_response_id":"", | \ | | {"role": "user", "content": "Hi, tell a joke."}, | "input": "What is the punchline of this joke?" | \ | | {"role": "assistant", "content": "Why did the math book look sad? Because it had too many problems! 😄"}, |... | \ | | {"role": "user", "content": "What's the punchline of this joke?"} |``` | \ | | ] | | \ | |... | | \ | |``` | | |API |[Chat API](/docs/chat-api) |[Responses API](/docs/create-model-responses-api) | > 更多说明及完整示例请参见 [上下文管理](/docs/context-management)。 ## 流式输出 |预览 |优势 | |---|---| |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/0b0ed47ec1b94b20a4f4966aa80130e6) |* **改善等待体验**:无需等待完整内容生成完毕,可立即处理过程内容。 | \ | |* **实时过程反馈**:多轮交互场景,实时了解任务当前的处理阶段。 | \ | |* **更高的容错性**:中途出错,也能获取到已生成内容,避免非流式输出失败无返回的情况。 | \ | |* **简化超时管理**:保持客户端与服务端的连接状态,避免复杂任务耗时过长而连接超时。 | 通过配置 **stream** 为 `true`,来启用流式输出。 ```JSON ... "model": "doubao-seed-2-1-pro-260915", "messages": [ {"role": "user", "content": "深度思考模型与非深度思考模型区别"} ], "stream": true ... ``` > 完整示例及更多说明请参见 [流式输出](/docs/streaming-output)。 ## 设置最大回答 当控制成本或者回答问题时间,可通过限制模型回答长度实现。当回答篇幅较长,如翻译长文本,避免中途截断,可通过设置`max_tokens`更大值实现。 > **注意** > > DeepSeek-V4.1-flash 模型`max_tokens`:控制模型回答和模型思维链内容长度,超出长度后不报错,默认值 128k。 ```JSON ... "model": "doubao-seed-2-1-pro-260915", "messages": [ {"role": "user","content": "What are some common cruciferous plants?"} ], "max_tokens": 300 ... ``` > 完整示例代码,请参见 [控制回答长度](/docs/context-management#c7fbdbe3)。 ## 异步输出 当任务较为复杂或者多个任务并发等场景下,可使用 Asyncio 接口实现并发调用,提高程序的效率,优化体验。 * Chat API 代码示例: **选项:Python** ```Python import asyncio import os # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import AsyncArk # 初始化Ark客户端 client = AsyncArk( # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key:https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv('ARK_API_KEY'), ) async def main() -> None: stream = await client.chat.completions.create( # Replace with Model ID model = "doubao-seed-2-1-pro-260915", messages=[ {"role": "system", "content": "你是 AI 人工智能助手"}, {"role": "user", "content": "常见的十字花科植物有哪些?"}, ], stream=True ) async for completion in stream: print(completion.choices[0].delta.content, end="") print() if __name__ == "__main__": asyncio.run(main()) ``` * Responses API 代码示例: **选项:Python** ```Python import asyncio import os from arkruntime import AsyncArk from arkruntime.types.responses.response_completed_event import ResponseCompletedEvent from arkruntime.types.responses.response_reasoning_summary_text_delta_event import ResponseReasoningSummaryTextDeltaEvent from arkruntime.types.responses.response_output_item_added_event import ResponseOutputItemAddedEvent from arkruntime.types.responses.response_text_delta_event import ResponseTextDeltaEvent from arkruntime.types.responses.response_text_done_event import ResponseTextDoneEvent client = AsyncArk( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=os.getenv('ARK_API_KEY') ) async def main(): stream = await client.responses.create( model="doubao-seed-2-1-pro-260915", input=[ {"role": "system", "content": "你是 AI 人工智能助手"}, {"role": "user", "content": "常见的十字花科植物有哪些?"}, ], stream=True ) async for event in stream: if isinstance(event, ResponseReasoningSummaryTextDeltaEvent): print(event.delta, end="") if isinstance(event, ResponseOutputItemAddedEvent): print("\noutPutItem " + event.type + " start:") if isinstance(event, ResponseTextDeltaEvent): print(event.delta,end="") if isinstance(event, ResponseTextDoneEvent): print("\noutPutTextDone.") if isinstance(event, ResponseCompletedEvent): print("Response Completed. Usage = " + event.response.usage.model_dump_json()) if __name__ == "__main__": asyncio.run(main()) ``` # 更多使用 ## 深度思考 模型在输出回答前,先对输入问题进行系统性分析与逻辑拆解,再基于拆解结果生成回答。 可以显著提升回复质量,但会增加 token 消耗,详细信息请参见[深度思考](/docs/deep-thinking)。 ## 提示词工程 正确设计和编写提示词,如提供说明、示例、好的规范等方法可提高模型输出的质量和准确性。进行提示词优化的工作也被称为提示词工程(Prompt Engineering)。详细信息请参见[提示词工程](/docs/prompt-engineering)。 ## 工具调用 通过集成内置工具或连接远程 MCP 服务器,您可以扩展模型的功能,以便更好回答问题或执行任务。当前支持: * 内置工具:搜索网络、检索数据、图片处理等。 * 调用自定义函数。 * 访问三方MCP服务。 详细信息请参见[工具概述](/docs/tools-overview)。 ## 续写模式 通过预填(Prefill)部分 **assistant** 角色的内容,引导和控制模型从已有的文本片段继续输出,以及控制模型在角色扮演场景中保持一致性。 * [续写模式](/docs/continuation-mode):使用 [Chat API](/docs/chat-api) 实现续写模式。 * [续写模式](/docs/responses-api-text-generation#a1384090):使用 [Responses API](/docs/create-model-responses-api) 实现续写模式。 ## 结构化输出(beta) 控制模型输出程序可处理的标准格式(主要是 JSON)而非自然语言,方便标准化处理或展示。 * [结构化输出(beta)](/docs/structured-output-beta):使用 [Chat API](/docs/chat-api) 实现结构化输出。 * [结构化输出(beta)](/docs/structured-output-beta):使用 [Responses API](/docs/create-model-responses-api) 实现结构化输出。 ## 批量推理 方舟为您提供批量推理的能力,当您有大批量数据处理任务,可使用批量推理能力,以获得更大吞吐量和更低的成本。详细介绍和使用,请参见 [批量推理](/docs/batch-inference)。 ## 异常处理 增加异常处理,帮助定位问题。 **选项:Python** ```Python import os # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark from arkruntime._exceptions import ArkAPIError # 初始化Ark客户端 client = Ark( # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", api_key=os.getenv('ARK_API_KEY'), ) # Streaming try: stream = client.chat.completions.create( # Replace with Model ID model = "doubao-seed-2-1-pro-260915", messages=[ {"role": "system", "content": "你是 AI 人工智能助手"}, {"role": "user", "content": "常见的十字花科植物有哪些?"}, ], stream=True ) for chunk in stream: if not chunk.choices: continue print(chunk.choices[0].delta.content, end="") print() except ArkAPIError as e: print(e) ``` **选项:Go** ```Go package main import ( "context" "errors" "fmt" "io" "os" "github.com/volcengine/ark-runtime-go/arkruntime" arkmodel "github.com/volcengine/ark-runtime-go/arkruntime/model" "github.com/volcengine/ark-runtime-go/arkruntime/model/chat" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), // The base URL for model invocation arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() fmt.Println("----- streaming request -----") req := &chat.ChatCompletionRequest{ // Replace with Model ID Model: "doubao-seed-2-1-pro-260915", Messages: []chat.ChatCompletionRequestMessage{ systemMessage("你是 AI 人工智能助手"), userMessage("常见的十字花科植物有哪些?"), }, } stream, err := client.CreateChatCompletionStream(ctx, req) if err != nil { apiErr := &arkmodel.APIError{} if errors.As(err, &apiErr) { fmt.Printf("stream chat error: %v\n", apiErr) } return } defer stream.Close() for { recv, err := stream.Recv() if err == io.EOF { return } if err != nil { apiErr := &arkmodel.APIError{} if errors.As(err, &apiErr) { fmt.Printf("stream chat error: %v\n", apiErr) } return } if len(recv.Choices) > 0 { fmt.Print(recv.Choices[0].Delta.Content.Or("")) } } } func systemMessage(content string) chat.ChatCompletionRequestMessage { return chat.ChatCompletionRequestMessage{ OneOf: chat.NewChatCompletionRequestSystemMessageChatCompletionRequestMessageSum( chat.ChatCompletionRequestSystemMessage{ Role: chat.ChatCompletionRequestSystemMessageRoleSystem, Content: chat.NewStringChatCompletionMessageContent(content), }, ), } } func userMessage(content string) chat.ChatCompletionRequestMessage { return chat.ChatCompletionRequestMessage{ OneOf: chat.NewChatCompletionRequestUserMessageChatCompletionRequestMessageSum( chat.ChatCompletionRequestUserMessage{ Role: chat.ChatCompletionRequestUserMessageRoleUser, Content: chat.NewOptNilChatCompletionMessageContent(chat.NewStringChatCompletionMessageContent(content)), }, ), } } ``` **选项:Java** ```Java package com.volcengine.ark.runtime; import com.volcengine.ark.runtime.models.chat.*; import com.volcengine.ark.runtime.exception.ArkHttpException; import com.volcengine.ark.runtime.service.ArkService; import java.util.ArrayList; import java.util.List; public class ChatCompletionsExample { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); // The base URL for model invocation ArkService service = ArkService.builder().apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); System.out.println("----- streaming request -----"); final List streamMessages = new ArrayList<>(); final ChatCompletionRequestMessage streamSystemMessage = ChatCompletionRequestSystemMessage.builder().role(ChatCompletionRequestMessageType.SYSTEM).content(ChatCompletionMessageContent.ofString("你是 AI 人工智能助手")).build(); final ChatCompletionRequestMessage streamUserMessage = ChatCompletionRequestUserMessage.builder().role(ChatCompletionRequestMessageType.USER).content(ChatCompletionMessageContent.ofString("常见的十字花科植物有哪些?")).build(); streamMessages.add(streamSystemMessage); streamMessages.add(streamUserMessage); ChatCompletionRequest streamChatCompletionRequest = ChatCompletionRequest.builder() .model("doubao-seed-2-1-pro-260915")//Replace with Model ID .messages(streamMessages) .build(); try { service.streamChatCompletion(streamChatCompletionRequest) .doOnError(Throwable::printStackTrace) .blockingForEach( choice -> { if (choice.getChoices().size() > 0) { System.out.print(choice.getChoices().get(0).getDelta().getContent()); } } ); } catch (ArkHttpException e) { System.out.print(e.toString()); } // shutdown service service.shutdownExecutor(); } } ``` ## 对话加密 除了默认的网络层加密,火山方舟还提供免费的应用层加密功能,为您的推理会话数据提供更强的安全保护。您只需增加一行代码即可启用。完整示例代码请参见 [加密数据](/docs/sdk-common-examples#23274b89);更多原理信息,请参见[推理会话数据应用层加密方案](/docs/application-layer-encryption-for-inference-session-data)。 # 使用说明 * 模型关键限制: * 最大上下文长度(Context Window):即单次请求模型能处理的内容长度,包括用户输入和模型输出,单位 token 。超出最大上下文长度的内容时,会截断并停止输出。如碰到上下文限制导致的内容截断,可选择支持更大上下文长度规格的模型。 * 最大输出长度(Max Tokens):即单次模型输出的内容的最大长度。如碰到这种情况,可参考[续写模式](/docs/continuation-mode),通过多次续写回复,拼接出完整内容。 * 每分钟处理内容量(TPM):即账号下同模型(不区分版本)每分钟能处理的内容量限制,单位 token。如默认 TPM 限制无法满足您的业务,可通过 [工单](https://console.volcengine.com/workorder/create?step=2&SubProductID=P00001166) 联系售后提升配额。举例:某模型的 TPM 为 500w,一个主账号下创建的该模型的所有版本接入点共享此配额。 * 每分钟处理请求数(RPM):即账号下同模型(不区分版本)每分钟能处理的请求数上限,与上面 TPM 类似。如默认 RPM 限制无法满足您的业务,可通过 [工单](https://console.volcengine.com/workorder/create?step=2&SubProductID=P00001166) 联系售后提升配额。 * 各模型详细的规格信息,请参见 [模型列表](/docs/model-list)。 * 用量查询: * 对于某次请求 token 用量:可在返回的 **usage** 结构体中查看。 * 输入/输出内容的 token 用量:可使用 [Tokenization API](/docs/tokenization-api) 或 [Token 计算器](https://ark.volcengine.com/region:cn-beijing/tokenCalculator) 来估算。 * 账号/项目/接入点维度 token 用量:可在 [用量统计](https://ark.volcengine.com/region:cn-beijing/usageTracking) 页面查看。 # 常见问题 [常见问题](/docs/modelark-faq)-[在线推理](/docs/modelark-faq#aa45e6c0):在线推理的常见问题,如遇到错误,可尝试在这里找解决方案。 --- # 图片理解 Source: https://ark.volcengine.com/region:cn-beijing/docs/image-understanding 部分大模型具备图片视觉理解能力,支持本地文件和图片 URL 方式传入图片,适用于图片描述、分类、视觉定位等场景。 > **说明** > > 方舟平台的新用户?获取 API Key 及 开通模型等准备工作,请参见 [快速入门](/docs/quick-start)。 # 快速开始 通过图片 URL 方式传入模型快速体验图片理解效果,Responses API 示例代码如下。 |输入 |输出预览 | |---|---| |![行星对比表示例图](https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/planet_comparison.png) |* 思考:表格列出了水星、金星、地球、火星、木星、土星、天王星和海王星,共 8 颗行星。地球位于第 3 个数据行。 | \ | |* 回答:表格中列出了 8 颗行星。地球位于第 3 个数据行;如果把表头算作第 1 行,则地球位于第 4 行。 | \ |> 根据图片,表格中列出了多少颗行星,地球位于哪一行? | | **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "input": [ { "role": "user", "content": [ { "type": "input_image", "image_url": "https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/planet_comparison.png" }, { "type": "input_text", "text": "根据图片,表格中列出了多少颗行星,地球位于哪一行?" } ] } ] }' ``` **选项:Python** ```Python import os from arkruntime import Ark client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=os.getenv('ARK_API_KEY'), ) response = client.responses.create( model="doubao-seed-2-1-pro-260915", input=[ { "role": "user", "content": [ { "type": "input_image", "image_url": "https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/planet_comparison.png" }, { "type": "input_text", "text": "根据图片,表格中列出了多少颗行星,地球位于哪一行?" }, ], } ] ) for item in response.output: if item.type == "reasoning": for summary in item.summary: if summary.type == "summary_text": print(f"思考:{summary.text}") elif item.type == "message": for content in item.content: if content.type == "output_text": print(f"回答:{content.text}") ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/responses" ) func main() { client := arkruntime.NewClientWithApiKey( // Get API Key:https://ark.volcengine.com/region:cn-beijing/apikey os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() inputMessage := responses.InputItem{ OneOf: responses.NewItemEasyMessageInputItemSum( responses.ItemEasyMessage{ Role: responses.NewOptMessageRole(responses.MessageRoleUser), Content: responses.NewContentItemArrayMessageContent( []responses.ContentItem{ responses.ContentItem{OneOf: responses.NewContentItemImageContentItemSum(responses.ContentItemImage{Type: responses.ContentItemImageTypeInputImage, ImageURL: responses.NewOptString("https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/planet_comparison.png")})}, responses.ContentItem{OneOf: responses.NewContentItemTextContentItemSum(responses.ContentItemText{Type: responses.ContentItemTextTypeInputText, Text: "根据图片,表格中列出了多少颗行星,地球位于哪一行?"})}, }, ), }, ), } resp, err := client.CreateResponses(ctx, &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", Input: responses.NewInputItemArrayResponsesInput([]responses.InputItem{inputMessage}), }) if err != nil { fmt.Printf("response error: %v\n", err) return } fmt.Println(resp) } ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.service.ArkService; import com.volcengine.ark.runtime.models.responses.*; public class demo { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); ArkService arkService = ArkService.builder().apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); ResponsesRequest request = ResponsesRequest.builder() .model("doubao-seed-2-1-pro-260915") .input(ResponsesInput.ofList(java.util.Arrays.asList(ItemEasyMessage.builder().role(MessageRole.USER).content( MessageContent.ofList(java.util.Arrays.asList(ContentItemImage.builder() .imageUrl("https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/planet_comparison.png").build(), ContentItemText.builder().text("根据图片,表格中列出了多少颗行星,地球位于哪一行?").build()))) .build()))) .build(); Response resp = arkService.createResponse(request); System.out.println(resp); arkService.shutdownExecutor(); } } ``` **选项:OpenAI SDK** ```Python import os from openai import OpenAI client = OpenAI( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=os.getenv('ARK_API_KEY'), ) response = client.responses.create( model="doubao-seed-2-1-pro-260915", input=[ { "role": "user", "content": [ { "type": "input_image", "image_url": "https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/planet_comparison.png" }, { "type": "input_text", "text": "根据图片,表格中列出了多少颗行星,地球位于哪一行?" }, ], } ] ) for item in response.output: if item.type == "reasoning": for summary in item.summary: if summary.type == "summary_text": print(f"思考:{summary.text}") elif item.type == "message": for content in item.content: if content.type == "output_text": print(f"回答:{content.text}") ``` # 支持模型 * 请参见[视觉理解能力](/docs/model-list#76df97c8)。 # API 接口 * [Responses API](/docs/create-model-responses-api):支持图片作为输入进行分析。支持 File ID 方式进行图片理解,使用方式参见 [Files API 上传(推荐)](/docs/image-understanding#2c38c01b)。 * [Chat API](/docs/chat-api):支持图片作为输入进行分析。支持 File ID 方式进行图片理解,使用方式参见 [Files API 上传(推荐)](/docs/image-understanding#2c38c01b)。 # 图片传入方式 支持的图片传入方式如下: * 本地文件上传: * [Files API 上传(推荐)](/docs/image-understanding#2c38c01b):通过 Files API 上传图片文件,文件大小不能超过 512 MB。 * [Base64 编码传入](/docs/image-understanding#477e51ce):适用于图片文件体积较小的场景,单张图片小于 10 MB,请求体不能超过 64 MB。 * [图片 URL 传入](/docs/image-understanding#d86010f4):适用于图片文件已存在公网可访问 URL 的场景,单张图片小于 10 MB。 > **说明** > > Chat API 是无状态的,如需模型对同一张图片进行多轮理解,则每次请求时都需传入该图片信息。 ## 本地文件上传 ### Files API 上传(推荐) 建议优先采用文件路径方式上传本地文件,该方式可以支持最大 512MB 文件的处理。通过 Files API 上传图片并待文件状态变为 `active` 后,Responses API 和 Chat API 均支持通过 `file_id` 方式传入图片。 以下示例先调用 Files API 上传本地文件并等待处理完成,再通过 File ID 调用 Responses API 或 Chat API 进行图片分析: > * 如果需要实时获取分析内容,或者要规避复杂任务引发的客户端超时失败问题,可采用流式输出的方式,使用方式可参见[示例代码](/docs/streaming-output#9346c907)。 > * 支持直接使用 Files API 上传本地文件,具体请参见[文件输入(Files API)](/docs/file-api)。
  • Responses API 示例代码:
**选项:Python** ```Python import os from pathlib import Path from arkruntime import Ark client = Ark( base_url="https://ark.cn-beijing.volces.com/api/v3", api_key=os.environ.get("ARK_API_KEY"), ) file_path = Path(os.getenv("FILE_PATH", "/Users/doc/demo.png")) uploaded_file = client.files.create(file=file_path, purpose="user_data") client.files.wait_for_processing(uploaded_file.id) response = client.responses.create( model=os.getenv("MODEL_ID", "doubao-seed-2-1-pro-260915"), input=[ { "role": "user", "content": [ {"type": "input_image", "file_id": uploaded_file.id}, {"type": "input_text", "text": "请描述图片的主要内容。"}, ], } ], ) print(response) ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/file" "github.com/volcengine/ark-runtime-go/arkruntime/model/responses" ) func main() { ctx := context.Background() client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) filePath := os.Getenv("FILE_PATH") if filePath == "" { filePath = "/Users/doc/demo.png" } data, err := os.Open(filePath) if err != nil { panic(err) } defer data.Close() uploaded, err := client.UploadFile(ctx, &file.FileCreateRequest{Purpose: file.PurposeUserData}, data) if err != nil { panic(err) } uploaded, err = client.WaitForFileProcessing(ctx, uploaded.ID, arkruntime.WaitForFileProcessingOptions{}) if err != nil || uploaded.Status != file.StatusActive { panic(fmt.Sprintf("file processing failed: %v, status=%s", err, uploaded.Status)) } media := responses.ContentItem{OneOf: responses.NewContentItemImageContentItemSum( responses.ContentItemImage{Type: responses.ContentItemImageTypeInputImage, FileID: responses.NewOptString(uploaded.ID)}, )} text := responses.ContentItem{OneOf: responses.NewContentItemTextContentItemSum( responses.ContentItemText{Type: responses.ContentItemTextTypeInputText, Text: "请描述图片的主要内容。"}, )} message := responses.InputItem{OneOf: responses.NewItemEasyMessageInputItemSum( responses.ItemEasyMessage{ Role: responses.NewOptMessageRole(responses.MessageRoleUser), Content: responses.NewContentItemArrayMessageContent([]responses.ContentItem{media, text}), }, )} modelID := os.Getenv("MODEL_ID") if modelID == "" { modelID = "doubao-seed-2-1-pro-260915" } response, err := client.CreateResponses(ctx, &responses.ResponsesRequest{ Model: modelID, Input: responses.NewInputItemArrayResponsesInput([]responses.InputItem{message}), }) if err != nil { panic(err) } fmt.Println(response) } ``` **选项:Java** ```Java import com.volcengine.ark.runtime.models.file.FileCreateRequest; import com.volcengine.ark.runtime.models.file.FileObject; import com.volcengine.ark.runtime.models.file.Purpose; import com.volcengine.ark.runtime.models.file.Status; import com.volcengine.ark.runtime.models.responses.*; import com.volcengine.ark.runtime.service.ArkService; import java.io.File; import java.util.Arrays; public class Main { public static void main(String[] args) { ArkService service = ArkService.builder() .apiKey(System.getenv("ARK_API_KEY")) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); String filePath = System.getenv().getOrDefault("FILE_PATH", "/Users/doc/demo.png"); String modelId = System.getenv().getOrDefault("MODEL_ID", "doubao-seed-2-1-pro-260915"); FileObject uploaded = service.uploadFile( FileCreateRequest.builder().purpose(Purpose.USER_DATA).build(), new File(filePath) ); uploaded = service.waitForFileProcessing(uploaded.getId()); if (uploaded.getStatus() != Status.ACTIVE) { throw new IllegalStateException("File processing failed: " + uploaded.getStatus()); } ContentItem media = ContentItemImage.builder() .type(ContentItemType.INPUT_IMAGE) .fileId(uploaded.getId()) .build(); ContentItem text = ContentItemText.builder() .type(ContentItemType.INPUT_TEXT) .text("请描述图片的主要内容。") .build(); ResponsesRequest request = ResponsesRequest.builder() .model(modelId) .input(ResponsesInput.ofList(Arrays.asList( ItemEasyMessage.builder() .role(MessageRole.USER) .content(MessageContent.ofList(Arrays.asList(media, text))) .build() ))) .build(); Response response = service.createResponse(request); System.out.println(response); service.shutdownExecutor(); } } ```
  • Chat API 示例代码:
**选项:Python** ```Python import os from pathlib import Path from arkruntime import Ark client = Ark( base_url="https://ark.cn-beijing.volces.com/api/v3", api_key=os.environ.get("ARK_API_KEY"), ) file_path = Path(os.getenv("FILE_PATH", "/Users/doc/demo.png")) uploaded_file = client.files.create( file=file_path, purpose="user_data", ) client.files.wait_for_processing(uploaded_file.id) completion = client.chat.completions.create( model=os.getenv("MODEL_ID", "doubao-seed-2-1-pro-260915"), messages=[ { "role": "user", "content": [ {"type": "image_url", "image_url": {"file_id": uploaded_file.id}}, {"type": "text", "text": "请描述图片的主要内容。"}, ], } ], ) print(f"id={completion.id}") print(completion.choices[0].message.content) ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/chat" "github.com/volcengine/ark-runtime-go/arkruntime/model/file" ) func main() { ctx := context.Background() client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) filePath := os.Getenv("FILE_PATH") if filePath == "" { filePath = "/Users/doc/demo.png" } data, err := os.Open(filePath) if err != nil { panic(err) } defer data.Close() uploaded, err := client.UploadFile(ctx, &file.FileCreateRequest{ Purpose: file.PurposeUserData, }, data) if err != nil { panic(err) } uploaded, err = client.WaitForFileProcessing( ctx, uploaded.ID, arkruntime.WaitForFileProcessingOptions{}, ) if err != nil || uploaded.Status != file.StatusActive { panic(fmt.Sprintf("file processing failed: %v, status=%s", err, uploaded.Status)) } media := chat.ChatCompletionContentPart{OneOf: chat.NewChatCompletionContentPartImageChatCompletionContentPartSum(chat.ChatCompletionContentPartImage{Type: chat.ChatCompletionContentPartImageTypeImageURL, ImageURL: chat.NewChatCompletionContentPartImageImageUrlChatCompletionContentPartImageImageURL(chat.ChatCompletionContentPartImageImageUrl{FileID: chat.NewOptString(uploaded.ID)})})} text := chat.ChatCompletionContentPart{OneOf: chat.NewChatCompletionContentPartTextChatCompletionContentPartSum( chat.ChatCompletionContentPartText{Type: chat.ChatCompletionContentPartTextTypeText, Text: "请描述图片的主要内容。"}, )} message := chat.ChatCompletionRequestMessage{OneOf: chat.NewChatCompletionRequestUserMessageChatCompletionRequestMessageSum( chat.ChatCompletionRequestUserMessage{ Role: chat.ChatCompletionRequestUserMessageRoleUser, Content: chat.NewOptNilChatCompletionMessageContent(chat.NewChatCompletionContentPartArrayChatCompletionMessageContent( []chat.ChatCompletionContentPart{media, text}, )), }, )} modelID := os.Getenv("MODEL_ID") if modelID == "" { modelID = "doubao-seed-2-1-pro-260915" } response, err := client.CreateChatCompletion(ctx, &chat.ChatCompletionRequest{ Model: modelID, Messages: []chat.ChatCompletionRequestMessage{message}, }) if err != nil { panic(err) } fmt.Printf("id=%s\n%s\n", response.ID, response.Choices[0].Message.Content) } ``` **选项:Java** ```Java import com.volcengine.ark.runtime.models.chat.*; import com.volcengine.ark.runtime.models.file.FileCreateRequest; import com.volcengine.ark.runtime.models.file.FileObject; import com.volcengine.ark.runtime.models.file.PreprocessConfigs; import com.volcengine.ark.runtime.models.file.Purpose; import com.volcengine.ark.runtime.models.file.Status; import com.volcengine.ark.runtime.models.file.Video; import com.volcengine.ark.runtime.service.ArkService; import java.io.File; import java.util.Arrays; public class Main { public static void main(String[] args) { ArkService service = ArkService.builder() .apiKey(System.getenv("ARK_API_KEY")) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); String filePath = System.getenv().getOrDefault("FILE_PATH", "/Users/doc/demo.png"); String modelId = System.getenv().getOrDefault("MODEL_ID", "doubao-seed-2-1-pro-260915"); FileObject uploaded = service.uploadFile( FileCreateRequest.builder() .purpose(Purpose.USER_DATA) .build(), new File(filePath) ); uploaded = service.waitForFileProcessing(uploaded.getId()); if (uploaded.getStatus() != Status.ACTIVE) { throw new IllegalStateException("File processing failed: " + uploaded.getStatus()); } ChatCompletionContentPart media = ChatCompletionContentPartImage.builder().type(ChatCompletionContentPartType.IMAGE_URL).imageUrl(ChatCompletionContentPartImageImageUrl2.ofChatCompletionContentPartImageImageUrl(ChatCompletionContentPartImageImageUrl.builder().fileId(uploaded.getId()).build())).build(); ChatCompletionContentPart text = ChatCompletionContentPartText.builder() .type(ChatCompletionContentPartType.TEXT) .text("请描述图片的主要内容。") .build(); ChatCompletionRequestMessage message = ChatCompletionRequestUserMessage.builder() .role(ChatCompletionRequestMessageType.USER) .content(ChatCompletionMessageContent.builder() .value(Arrays.asList(media, text)) .build()) .build(); ChatCompletionRequest request = ChatCompletionRequest.builder() .model(modelId) .messages(Arrays.asList(message)) .build(); ChatCompletionResponse response = service.createChatCompletion(request); System.out.println("id=" + response.getId()); System.out.println(response.getChoices().get(0).getMessage().getContent()); service.shutdownExecutor(); } } ``` ### Base64 编码传入 将本地文件转换为 Base64 编码字符串,然后提交给大模型。该方式适用于图片文件体积较小的情况,单张图片小于 10 MB,请求体不能超过 64MB。(Responses API 和 Chat API 都支持该方式。) > **注意** > > 将图片文件转换为Base64编码字符串,然后遵循`data:{mime_type};base64,{base64_data}`格式拼接,传入模型。 > * `{mime_type}`:文件的媒体类型,需要与文件格式mime_type对应。支持的图片格式详细见[图片格式说明](/docs/image-understanding#51efc45f)。 > * `{base64_data}`:文件经过Base64编码后的字符串。 |[Chat API](/docs/chat-api) |[Responses API](/docs/create-model-responses-api) | |---|---| |```Python |```Python | \ |... |... | \ |model="doubao-seed-2-1-pro-260915", |model="doubao-seed-2-1-pro-260915", | \ |messages=[ |input=[ | \ | { | { | \ | "role": "user", | "role": "user", | \ | "content": [ | "content": [ | \ | { | { | \ | "type": "image_url", | "type": "input_image", | \ | "image_url": { | "image_url": f"data:image/png;base64,{base64_image}" | \ | "url": f"data:image/png;base64,{base64_image}" | }, | \ | } | { | \ | }, | "type": "input_text", | \ | { | "text": "根据图片,表格中列出了多少颗行星,地球位于哪一行?" | \ | "type": "text", | } | \ | "text": "根据图片,表格中列出了多少颗行星,地球位于哪一行?" | ] | \ | } | } | \ | ] |] | \ | } |... | \ |] |``` | \ |... | | \ |``` | |
  • Responses API 示例代码:
**选项:Curl** ```Bash BASE64_IMAGE=$(base64 < planet_comparison.png) && curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d @- <
  • Chat API 示例代码:
  • **选项:Curl** ```Bash BASE64_IMAGE=$(base64 < planet_comparison.png) && curl https://ark.cn-beijing.volces.com/api/v3/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d @- <;base64,{base64_image}: # PNG图片:"url": f"data:image/png;base64,{base64_image}" # JPEG图片:"url": f"data:image/jpeg;base64,{base64_image}" # WEBP图片:"url": f"data:image/webp;base64,{base64_image}" "url": f"data:image/;base64,{base64_image}" }, }, { "type": "text", "text": "根据图片,表格中列出了多少颗行星,地球位于哪一行?", }, ], } ], ) print(completion.choices[0]) ``` **选项:Go** ```Go package main import ( "context" "encoding/base64" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/chat" ) func main() { // 读取本地图片文件 imageBytes, err := os.ReadFile("planet_comparison.png") // 替换为实际图片路径 if err != nil { fmt.Printf("读取图片失败: %v\n", err) return } base64Image := base64.StdEncoding.EncodeToString(imageBytes) client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), // The base URL for model invocation . arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() req := &chat.ChatCompletionRequest{ // Replace with Model ID Model: "doubao-seed-2-1-pro-260915", Messages: []chat.ChatCompletionRequestMessage{ chat.ChatCompletionRequestMessage{OneOf: chat.NewChatCompletionRequestUserMessageChatCompletionRequestMessageSum(chat.ChatCompletionRequestUserMessage{Role: chat.ChatCompletionRequestUserMessageRoleUser, Content: chat.NewOptNilChatCompletionMessageContent(chat.NewChatCompletionContentPartArrayChatCompletionMessageContent( []chat.ChatCompletionContentPart{ chat.ChatCompletionContentPart{OneOf: chat.NewChatCompletionContentPartImageChatCompletionContentPartSum(chat.ChatCompletionContentPartImage{Type: chat.ChatCompletionContentPartImageTypeImageURL, ImageURL: chat.NewChatCompletionContentPartImageImageUrlChatCompletionContentPartImageImageURL(chat.ChatCompletionContentPartImageImageUrl{URL: chat.NewOptString(fmt.Sprintf("data:image/png;base64,%s", base64Image))})})}, chat.ChatCompletionContentPart{OneOf: chat.NewChatCompletionContentPartTextChatCompletionContentPartSum(chat.ChatCompletionContentPartText{Type: chat.ChatCompletionContentPartTextTypeText, Text: "根据图片,表格中列出了多少颗行星,地球位于哪一行?"})}, }, ))})}, }, } resp, err := client.CreateChatCompletion(ctx, req) if err != nil { fmt.Printf("standard chat error: %v\n", err) return } fmt.Println(resp.Choices[0].Message.Content) } ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.chat.*; import com.volcengine.ark.runtime.models.chat.ChatCompletionContentPart.*; import com.volcengine.ark.runtime.service.ArkService; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; import java.nio.file.Files; import java.nio.file.Path; import java.util.Base64; import java.io.IOException; public class Sample { static String apiKey = System.getenv("ARK_API_KEY"); static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); static Dispatcher dispatcher = new Dispatcher(); static ArkService service = ArkService.builder() .dispatcher(dispatcher) .connectionPool(connectionPool) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation . .apiKey(apiKey) .build(); // Base64编码方法 private static String encodeImage(String imagePath) throws IOException { byte[] imageBytes = Files.readAllBytes(java.nio.file.Paths.get(imagePath)); return Base64.getEncoder().encodeToString(imageBytes); } public static void main(String[] args) throws Exception { List messagesForReqList = new ArrayList<>(); // 本地图片路径(替换为实际路径) String imagePath = "planet_comparison.png"; // 生成Base64数据URL String base64Data = "data:image/png;base64," + encodeImage(imagePath); // 构建消息内容(修复内容部分构建方式) List contentParts = new ArrayList<>(); // 图片部分使用builder模式 contentParts.add(ChatCompletionContentPartImage.builder() .type(ChatCompletionContentPartType.IMAGE_URL) .imageUrl(ChatCompletionContentPartImageImageUrl2.ofChatCompletionContentPartImageImageUrl(ChatCompletionContentPartImageImageUrl.builder().url(base64Data).build())) .build()); // 文本部分使用builder模式 contentParts.add(ChatCompletionContentPartText.builder() .type(ChatCompletionContentPartType.TEXT) .text("根据图片,表格中列出了多少颗行星,地球位于哪一行?") .build()); // 创建消息 messagesForReqList.add(ChatCompletionRequestUserMessage.builder() .role(ChatCompletionRequestMessageType.USER) .content(ChatCompletionMessageContent.ofList(contentParts)) .build()); ChatCompletionRequest req = ChatCompletionRequest.builder() .model("doubao-seed-2-1-pro-260915") //Replace with Model ID . .messages(messagesForReqList) .maxTokens(300) .build(); service.createChatCompletion(req) .getChoices() .forEach(choice -> System.out.println(choice.getMessage().getContent())); // shutdown service after all requests are finished service.shutdownExecutor(); } } ``` ## 图片 URL 传入 如果图片已存在公网可访问URL,可以在请求中直接填入图片的公网URL,单张图片不能超过 10 MB。(Responses API 和 Chat API 都支持该方式。) > **说明** > > 如果使用 URL,建议使用火山引擎TOS(对象存储)存储图片并生成访问链接,不仅能保证图片的稳定存储,还能利用方舟与TOS的内网通信优势,有效降低模型回复的时延和公网流量费用。 |[Chat API](/docs/chat-api) |[Responses API](/docs/create-model-responses-api) | |---|---| |```Python |```Python | \ |... |... | \ |model="doubao-seed-2-1-pro-260915", |model="doubao-seed-2-1-pro-260915", | \ |messages=[ |input=[ | \ | { | { | \ | "role": "user", | "role": "user", | \ | "content": [ | "content": [ | \ | { | { | \ | "type": "image_url", | "type": "input_image", | \ | "image_url": { | "image_url": "https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/planet_comparison.png" | \ | "url": "https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/planet_comparison.png" | }, | \ | } | { | \ | }, | "type": "input_text", | \ | { | "text": "根据图片,表格中列出了多少颗行星,地球位于哪一行?" | \ | "type": "text", | } | \ | "text": "根据图片,表格中列出了多少颗行星,地球位于哪一行?" | ] | \ | } | } | \ | ] |] | \ | } |... | \ |] |``` | \ |... | | \ |``` | | * Responses API 示例代码:[快速开始](/docs/image-understanding#18cf565a)
    • Chat API 示例代码:
    **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "messages": [ { "role": "user", "content": [ {"type": "image_url","image_url": {"url": "https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/planet_comparison.png"}}, {"type": "text", "text": "根据图片,表格中列出了多少颗行星,地球位于哪一行?"} ] } ], "max_tokens": 300 }' ``` **选项:Python** ```Python import os # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark client = Ark( # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv('ARK_API_KEY'), ) completion = client.chat.completions.create( # Replace with Model ID model = "doubao-seed-2-1-pro-260915", messages=[ { "role": "user", "content": [ {"type": "image_url","image_url": {"url": "https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/planet_comparison.png"}}, {"type": "text", "text": "根据图片,表格中列出了多少颗行星,地球位于哪一行?"}, ], } ], ) print(completion.choices[0]) ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/chat" ) func main() { client := arkruntime.NewClientWithApiKey( //Use os.Getenv to get ARK_API_KEY os.Getenv("ARK_API_KEY"), // The base URL for model invocation arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) // Create a context background ctx := context.Background() // Construct the content of the message contentParts := []chat.ChatCompletionContentPart{ chat.ChatCompletionContentPart{OneOf: chat.NewChatCompletionContentPartImageChatCompletionContentPartSum(chat.ChatCompletionContentPartImage{Type: chat.ChatCompletionContentPartImageTypeImageURL, ImageURL: chat.NewChatCompletionContentPartImageImageUrlChatCompletionContentPartImageImageURL(chat.ChatCompletionContentPartImageImageUrl{URL: chat.NewOptString("https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/planet_comparison.png")})})}, chat.ChatCompletionContentPart{OneOf: chat.NewChatCompletionContentPartTextChatCompletionContentPartSum(chat.ChatCompletionContentPartText{Type: chat.ChatCompletionContentPartTextTypeText, Text: "根据图片,表格中列出了多少颗行星,地球位于哪一行?"})}, } // Construct chat, specify model and message req := &chat.ChatCompletionRequest{ // Replace with Model ID Model: "doubao-seed-2-1-pro-260915", Messages: []chat.ChatCompletionRequestMessage{ chat.ChatCompletionRequestMessage{OneOf: chat.NewChatCompletionRequestUserMessageChatCompletionRequestMessageSum(chat.ChatCompletionRequestUserMessage{Role: chat.ChatCompletionRequestUserMessageRoleUser, Content: chat.NewOptNilChatCompletionMessageContent(chat.NewChatCompletionContentPartArrayChatCompletionMessageContent(contentParts))})}, }, } // Send chat, store result in resp and any possible error in err resp, err := client.CreateChatCompletion(ctx, req) if err!= nil { fmt.Printf("standard chat error: %v\n", err) return } // Print response fmt.Println(resp.Choices[0].Message.Content) } ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.chat.*; import com.volcengine.ark.runtime.models.chat.ChatCompletionContentPart.*; import com.volcengine.ark.runtime.service.ArkService; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; public class MultiImageSample { static String apiKey = System.getenv("ARK_API_KEY"); static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); static Dispatcher dispatcher = new Dispatcher(); static ArkService service = ArkService.builder() .dispatcher(dispatcher) .connectionPool(connectionPool) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation . .apiKey(apiKey) .build(); public static void main(String[] args) throws Exception { List messagesForReqList = new ArrayList<>(); // Construct the content of the message List contentParts = new ArrayList<>(); // Use builder mode for the image contentParts.add(ChatCompletionContentPartImage.builder() .type(ChatCompletionContentPartType.IMAGE_URL) .imageUrl(ChatCompletionContentPartImageImageUrl2.ofChatCompletionContentPartImageImageUrl(ChatCompletionContentPartImageImageUrl.builder().url("https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/planet_comparison.png").build())) .build()); // Use builder mode for text contentParts.add(ChatCompletionContentPartText.builder() .type(ChatCompletionContentPartType.TEXT) .text("根据图片,表格中列出了多少颗行星,地球位于哪一行?") .build()); // Create message messagesForReqList.add(ChatCompletionRequestUserMessage.builder() .role(ChatCompletionRequestMessageType.USER) .content(ChatCompletionMessageContent.ofList(contentParts)) .build()); ChatCompletionRequest req = ChatCompletionRequest.builder() .model("doubao-seed-2-1-pro-260915") //Replace with Model ID . .messages(messagesForReqList) .build(); service.createChatCompletion(req) .getChoices() .forEach(choice -> System.out.println(choice.getMessage().getContent())); // shutdown service after all requests are finished service.shutdownExecutor(); } } ``` # 使用场景 ## 多图输入 API 可支持接受和处理多个图像输入,这些图像可通过图片可访问 URL 或图片转为 Base64 编码后输入,模型将结合所有传入的图像中的信息来回答问题。
    • Responses API 示例代码:
    **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "input": [ { "role": "user", "content": [ { "type": "input_image", "image_url": "https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/planet_comparison.png" }, { "type": "input_image", "image_url": "https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/country_list.png" }, { "type": "input_text", "text": "根据第一张图片,表格中列出了多少颗行星,地球位于哪一行?第二张图片的表格中列出了多少个国家?" } ] } ] }' ``` **选项:Python** ```Python import os from arkruntime import Ark client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=os.getenv('ARK_API_KEY') ) response = client.responses.create( model="doubao-seed-2-1-pro-260915", input=[ { "role": "user", "content": [ { "type": "input_image", "image_url": "https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/planet_comparison.png" }, { "type": "input_image", "image_url": "https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/country_list.png" }, { "type": "input_text", "text": "根据第一张图片,表格中列出了多少颗行星,地球位于哪一行?第二张图片的表格中列出了多少个国家?" } ] } ] ) print(response.output) ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/responses" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() inputMessage := responses.InputItem{ OneOf: responses.NewItemEasyMessageInputItemSum( responses.ItemEasyMessage{ Role: responses.NewOptMessageRole(responses.MessageRoleUser), Content: responses.NewContentItemArrayMessageContent( []responses.ContentItem{ responses.ContentItem{OneOf: responses.NewContentItemImageContentItemSum(responses.ContentItemImage{Type: responses.ContentItemImageTypeInputImage, ImageURL: responses.NewOptString("https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/planet_comparison.png")})}, responses.ContentItem{OneOf: responses.NewContentItemImageContentItemSum(responses.ContentItemImage{Type: responses.ContentItemImageTypeInputImage, ImageURL: responses.NewOptString("https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/country_list.png")})}, responses.ContentItem{OneOf: responses.NewContentItemTextContentItemSum(responses.ContentItemText{Type: responses.ContentItemTextTypeInputText, Text: "根据第一张图片,表格中列出了多少颗行星,地球位于哪一行?第二张图片的表格中列出了多少个国家?"})}, }, ), }, ), } resp, err := client.CreateResponses(ctx, &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", Input: responses.NewInputItemArrayResponsesInput([]responses.InputItem{inputMessage}), }) if err != nil { fmt.Printf("response error: %v\n", err) return } fmt.Println(resp) } ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.service.ArkService; import com.volcengine.ark.runtime.models.responses.*; public class demo { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); ArkService arkService = ArkService.builder().apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); ResponsesRequest request = ResponsesRequest.builder() .model("doubao-seed-2-1-pro-260915") .input(ResponsesInput.ofList(java.util.Arrays.asList(ItemEasyMessage.builder().role(MessageRole.USER).content( MessageContent.ofList(java.util.Arrays.asList(ContentItemImage.builder().imageUrl("https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/planet_comparison.png").build(), ContentItemImage.builder().imageUrl("https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/country_list.png").build(), ContentItemText.builder().text("根据第一张图片,表格中列出了多少颗行星,地球位于哪一行?第二张图片的表格中列出了多少个国家?").build())) ).build()))) .build(); Response resp = arkService.createResponse(request); System.out.println(resp); arkService.shutdownExecutor(); } } ```
    • Chat API 示例代码:
    **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "messages": [ { "role": "user", "content": [ {"type": "image_url","image_url": {"url": "https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/ark_demo_img_1-zh.png"}}, {"type": "image_url","image_url": {"url": "https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/ark_demo_img_2.png"}}, {"type": "text", "text": "支持输入图片的模型系列是哪个?同时,豆包应用场景有哪些?"} ] } ], "max_tokens": 300 }' ``` **选项:Python** ```Python import os # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark client = Ark( # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv('ARK_API_KEY'), ) completion = client.chat.completions.create( # Replace with Model ID model = "doubao-seed-2-1-pro-260915", messages=[ { "role": "user", "content": [ {"type": "image_url","image_url": {"url": "https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/ark_demo_img_1-zh.png"}}, {"type": "image_url","image_url": {"url": "https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/ark_demo_img_2.png"}}, {"type": "text", "text": "支持输入图片的模型系列是哪个?同时,豆包应用场景有哪些?"}, ], } ], ) print(completion.choices[0]) ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/chat" ) func main() { client := arkruntime.NewClientWithApiKey( //Use os.Getenv to get ARK_API_KEY os.Getenv("ARK_API_KEY"), // The base URL for model invocation arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) // Create context background ctx := context.Background() // Construct message, including 2 images and a text contentParts := []chat.ChatCompletionContentPart{ chat.ChatCompletionContentPart{OneOf: chat.NewChatCompletionContentPartImageChatCompletionContentPartSum(chat.ChatCompletionContentPartImage{Type: chat.ChatCompletionContentPartImageTypeImageURL, ImageURL: chat.NewChatCompletionContentPartImageImageUrlChatCompletionContentPartImageImageURL(chat.ChatCompletionContentPartImageImageUrl{URL: chat.NewOptString("https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/ark_demo_img_1-zh.png")})})}, chat.ChatCompletionContentPart{OneOf: chat.NewChatCompletionContentPartImageChatCompletionContentPartSum(chat.ChatCompletionContentPartImage{Type: chat.ChatCompletionContentPartImageTypeImageURL, ImageURL: chat.NewChatCompletionContentPartImageImageUrlChatCompletionContentPartImageImageURL(chat.ChatCompletionContentPartImageImageUrl{URL: chat.NewOptString("https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/ark_demo_img_2.png")})})}, chat.ChatCompletionContentPart{OneOf: chat.NewChatCompletionContentPartTextChatCompletionContentPartSum(chat.ChatCompletionContentPartText{Type: chat.ChatCompletionContentPartTextTypeText, Text: "支持输入图片的模型系列是哪个?同时,豆包应用场景有哪些?"})}, } // Construct chat request req := &chat.ChatCompletionRequest{ // Replace with Model ID Model: "doubao-seed-2-1-pro-260915", Messages: []chat.ChatCompletionRequestMessage{ chat.ChatCompletionRequestMessage{OneOf: chat.NewChatCompletionRequestUserMessageChatCompletionRequestMessageSum(chat.ChatCompletionRequestUserMessage{Role: chat.ChatCompletionRequestUserMessageRoleUser, Content: chat.NewOptNilChatCompletionMessageContent(chat.NewChatCompletionContentPartArrayChatCompletionMessageContent(contentParts))})}, }, MaxTokens: chat.NewOptInt32(int32(300)), // Set max output token count } // Send the chat completion request resp, err := client.CreateChatCompletion(ctx, req) if err!= nil { fmt.Printf("standard chat error: %v\n", err) return } // Print response fmt.Println(resp.Choices[0].Message.Content) } ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.chat.*; import com.volcengine.ark.runtime.models.chat.ChatCompletionContentPart.*; import com.volcengine.ark.runtime.service.ArkService; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; public class MultiImageSample { static String apiKey = System.getenv("ARK_API_KEY"); static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); static Dispatcher dispatcher = new Dispatcher(); static ArkService service = ArkService.builder() .dispatcher(dispatcher) .connectionPool(connectionPool) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation .apiKey(apiKey) .build(); public static void main(String[] args) throws Exception { List messagesForReqList = new ArrayList<>(); // Construct content of the message List contentParts = new ArrayList<>(); // Use builder mode for the first image contentParts.add(ChatCompletionContentPartImage.builder() .type(ChatCompletionContentPartType.IMAGE_URL) .imageUrl(ChatCompletionContentPartImageImageUrl2.ofChatCompletionContentPartImageImageUrl(ChatCompletionContentPartImageImageUrl.builder().url("https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/ark_demo_img_1-zh.png").build())) .build()); // contentParts.add(ChatCompletionContentPartImage.builder() .type(ChatCompletionContentPartType.IMAGE_URL) .imageUrl(ChatCompletionContentPartImageImageUrl2.ofChatCompletionContentPartImageImageUrl(ChatCompletionContentPartImageImageUrl.builder().url("https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/ark_demo_img_2.png").build())) .build()); contentParts.add(ChatCompletionContentPartText.builder() .type(ChatCompletionContentPartType.TEXT) .text("支持输入图片的模型系列是哪个?同时,豆包应用场景有哪些?") .build()); messagesForReqList.add(ChatCompletionRequestUserMessage.builder() .role(ChatCompletionRequestMessageType.USER) .content(ChatCompletionMessageContent.ofList(contentParts)) .build()); ChatCompletionRequest req = ChatCompletionRequest.builder() .model("doubao-seed-2-1-pro-260915") //Replace with Model ID .messages(messagesForReqList) .maxTokens(300) .build(); service.createChatCompletion(req) .getChoices() .forEach(choice -> System.out.println(choice.getMessage().getContent())); // shutdown service after all requests are finished service.shutdownExecutor(); } } ``` ## 控制图片理解的精细度 控制图片理解的精细度(指对画面的精细): **image_pixel_limit 、detail** 字段,2个字段若同时配置,则生效逻辑如下: * 生效前提:图片像素范围在 [196, 36,000,000] px,否则直接报错。 * 生效优先级:**image_pixel_limit** 高于 **detail** 字段,即同时配置 **detail** 与 **image_pixel_limit** 字段时,生效 **image_pixel_limit** 字段配置。 * 缺省时生效:**image_pixel_limit** 字段的 **min_pixels** / **max_pixels** 字段未设置,则使用 **detail** 默认值配置所对应的值。具体范围参见[通过 detail 字段(图片理解)](/docs/image-understanding#885d96dc)。 下面分别介绍如何通过 **detail** 、 **image_pixel_limit** 控制视觉理解的精度。 ### 通过 detail 字段(图片理解) 通过`detail`参数来控制模型理解图片的精细度, 不同模型支持的 detail 模式、token 用量、图片像素区间如下: **方式一**: > **说明** > > doubao-seed-2.0 及以后模型 detail 默认值为 `high`,单图固定 1280 个 tokens,在不牺牲效果的同时消耗的 tokens 更少。 |detail模式 |doubao-seed-2.0 及以后模型 || \ | |> detail 默认值为 `high` | | |---|---|---| | |单图token范围 |图片像素区间 | |low |[1, 1280] |[1764, 2257920] | |high |1280 |2257920 | |xhigh |[1280, 5120] |[2257920, 9031680] | * detail 为 `low` 时,图片处理速度会提高,适合图片本身细节较少或者只需模型理解图片大致信息或者对速度有要求的场景。 * detail 为 `high` 或 `xhigh` 时,模型可感知图片更多的细节,但是图片处理速度会降低,适合图像像素值高且需关注细节信息的场景,如街道地图分析等。 **图片缩放规则**:不在指定模式对应的图片像素区间时,方舟会等比例缩放至范围内。 **方式二**: DeepSeek-v4.1-flash 模型在图片理解支持的 detail 模式及缩放规则如下: | detail 模式 | 图片像素区间 | Chat API | Responses API | Messages API | | --- | --- | --- | --- | --- | | low | 262144 | 图片会被保持长宽比自动缩放到 512 × 512 | 图片会被保持长宽比自动缩放到 512 × 512 | 图片会被保持长宽比自动缩放,按照 544 × 544 到 1300 × 1300 缩放。 | | high | [295936, 1690000] | 图片会被保持长宽比自动缩放,按照 544 × 544 到 1300 × 1300 缩放 | 图片会被保持长宽比自动缩放,按照 544 × 544 到 1300 × 1300 缩放 | ^^ | | auto | ^^| ^^| ^^ |^^ | | xhigh | 1690000 | 图片会被保持长宽比自动缩放到 1300 × 1300 | 图片会被保持长宽比自动缩放到 1300 × 1300 | ^^ | DeepSeek-V4.1-Flash 系列模型在图片理解的**使用限制**如下: | 使用限制 | 要求 | | --- | --- | | 单图大小 | 50 MB | | 总请求体大小 | 64 MB | | 单请求中图片张数 | 3600 张 | | 单个请求中通过 URL 方式传入图片文件的总大小 | 200 MB | **代码示例**:
    • Responses API 示例代码:
    **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Authorization: Bearer $ARK_API_KEY" \ -H 'Content-Type: application/json' \ -d '{ "model": "doubao-seed-2-1-pro-260915", "input": [ { "role": "user", "content": [ { "type": "input_image", "image_url": "https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/planet_comparison.png", "detail": "high" }, { "type": "input_text", "text": "根据图片,表格中列出了多少颗行星,地球位于哪一行?" } ] } ] }' ``` **选项:Python** ```Python import os from arkruntime import Ark client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=os.getenv('ARK_API_KEY') ) response = client.responses.create( model="doubao-seed-2-1-pro-260915", input=[ { "role": "user", "content": [ { "type": "input_image", "image_url": "https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/planet_comparison.png", "detail": "high" }, { "type": "input_text", "text": "根据图片,表格中列出了多少颗行星,地球位于哪一行?" } ] } ] ) print(response.output) ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/responses" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() inputMessage := responses.InputItem{ OneOf: responses.NewItemEasyMessageInputItemSum( responses.ItemEasyMessage{ Role: responses.NewOptMessageRole(responses.MessageRoleUser), Content: responses.NewContentItemArrayMessageContent( []responses.ContentItem{ responses.ContentItem{OneOf: responses.NewContentItemImageContentItemSum(responses.ContentItemImage{Type: responses.ContentItemImageTypeInputImage, ImageURL: responses.NewOptString("https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/planet_comparison.png"), Detail: responses.NewOptImageDetail(responses.ImageDetailHigh)})}, responses.ContentItem{OneOf: responses.NewContentItemTextContentItemSum(responses.ContentItemText{Type: responses.ContentItemTextTypeInputText, Text: "根据图片,表格中列出了多少颗行星,地球位于哪一行?"})}, }, ), }, ), } resp, err := client.CreateResponses(ctx, &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", Input: responses.NewInputItemArrayResponsesInput([]responses.InputItem{inputMessage}), }) if err != nil { fmt.Printf("response error: %v\n", err) return } fmt.Println(resp) } ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.service.ArkService; import com.volcengine.ark.runtime.models.responses.*; public class demo { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); ArkService arkService = ArkService.builder().apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); ResponsesRequest request = ResponsesRequest.builder() .model("doubao-seed-2-1-pro-260915") .input(ResponsesInput.ofList(java.util.Arrays.asList(ItemEasyMessage.builder().role(MessageRole.USER).content( MessageContent.ofList(java.util.Arrays.asList(ContentItemImage.builder().imageUrl("https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/planet_comparison.png").detail(ImageDetail.HIGH).build(), ContentItemText.builder().text("根据图片,表格中列出了多少颗行星,地球位于哪一行?").build())) ).build()))) .build(); Response resp = arkService.createResponse(request); System.out.println(resp); arkService.shutdownExecutor(); } } ```
    • Chat API 示例代码:
    **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "messages": [ { "role": "user", "content": [ {"type": "image_url","image_url": {"url": "https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/planet_comparison.png","detail": "high"}}, {"type": "text", "text": "根据图片,表格中列出了多少颗行星,地球位于哪一行?"} ] } ] }' ``` **选项:Python** ```Python import os # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark client = Ark( # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv('ARK_API_KEY'), ) completion = client.chat.completions.create( # Replace with Model ID model = "doubao-seed-2-1-pro-260915", messages=[ { "role": "user", "content": [ {"type": "image_url","image_url": {"url": "https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/planet_comparison.png","detail": "high"}}, {"type": "text", "text": "根据图片,表格中列出了多少颗行星,地球位于哪一行?"}, ], } ], ) print(completion.choices[0]) ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/chat" ) func main() { client := arkruntime.NewClientWithApiKey( //Use os.Getenv to get ARK_API_KEY os.Getenv("ARK_API_KEY"), // The base URL for model invocation arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) // Construct a context background ctx := context.Background() // Message content contentParts := []chat.ChatCompletionContentPart{ chat.ChatCompletionContentPart{OneOf: chat.NewChatCompletionContentPartImageChatCompletionContentPartSum(chat.ChatCompletionContentPartImage{Type: chat.ChatCompletionContentPartImageTypeImageURL, ImageURL: chat.NewChatCompletionContentPartImageImageUrlChatCompletionContentPartImageImageURL(chat.ChatCompletionContentPartImageImageUrl{URL: chat.NewOptString("https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/planet_comparison.png"), Detail: chat.NewOptImageDetail(chat.ImageDetailHigh)})})}, chat.ChatCompletionContentPart{OneOf: chat.NewChatCompletionContentPartTextChatCompletionContentPartSum(chat.ChatCompletionContentPartText{Type: chat.ChatCompletionContentPartTextTypeText, Text: "根据图片,表格中列出了多少颗行星,地球位于哪一行?"})}, } req := &chat.ChatCompletionRequest{ // Replace with Model ID Model: "doubao-seed-2-1-pro-260915", Messages: []chat.ChatCompletionRequestMessage{ chat.ChatCompletionRequestMessage{OneOf: chat.NewChatCompletionRequestUserMessageChatCompletionRequestMessageSum(chat.ChatCompletionRequestUserMessage{Role: chat.ChatCompletionRequestUserMessageRoleUser, Content: chat.NewOptNilChatCompletionMessageContent(chat.NewChatCompletionContentPartArrayChatCompletionMessageContent(contentParts))})}, }, MaxTokens: chat.NewOptInt32(int32(300)), // Max output token } resp, err := client.CreateChatCompletion(ctx, req) if err!= nil { fmt.Printf("standard chat error: %v\n", err) return } fmt.Println(resp.Choices[0].Message.Content) } ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.chat.*; import com.volcengine.ark.runtime.models.chat.ChatCompletionContentPart.*; import com.volcengine.ark.runtime.service.ArkService; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; public class MultiImageSample { static String apiKey = System.getenv("ARK_API_KEY"); static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); static Dispatcher dispatcher = new Dispatcher(); static ArkService service = ArkService.builder() .dispatcher(dispatcher) .connectionPool(connectionPool) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation . .apiKey(apiKey) .build(); public static void main(String[] args) throws Exception { List messagesForReqList = new ArrayList<>(); List contentParts = new ArrayList<>(); contentParts.add(ChatCompletionContentPartImage.builder() .type(ChatCompletionContentPartType.IMAGE_URL) .imageUrl(ChatCompletionContentPartImageImageUrl2.ofChatCompletionContentPartImageImageUrl(ChatCompletionContentPartImageImageUrl.builder().url("https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/planet_comparison.png").detail(ImageDetail.fromValue("high")).build())) .build()); contentParts.add(ChatCompletionContentPartText.builder() .type(ChatCompletionContentPartType.TEXT) .text("根据图片,表格中列出了多少颗行星,地球位于哪一行?") .build()); messagesForReqList.add(ChatCompletionRequestUserMessage.builder() .role(ChatCompletionRequestMessageType.USER) .content(ChatCompletionMessageContent.ofList(contentParts)) .build()); ChatCompletionRequest req = ChatCompletionRequest.builder() .model("doubao-seed-2-1-pro-260915") //Replace with Model ID . .messages(messagesForReqList) .maxTokens(300) .build(); service.createChatCompletion(req) .getChoices() .forEach(choice -> System.out.println(choice.getMessage().getContent())); // shutdown service after all requests are finished service.shutdownExecutor(); } } ``` ### **通过 image_pixel_limit 结构体** 控制传入给方舟的图像像素大小范围,如果不在此范围,则会等比例放大或者缩小至该范围内,后传给模型进行理解。你可通过 **image_pixel_limit** 结构体,精细控制模型可理解的图片像素多少。 对应结构体如下: > **说明** > > `max_pixels` 为图片最大像素,`min_pixels` 为图片最小像素。 ```JSON ... "image_pixel_limit": { "max_pixels": 3014080, "min_pixels": 3136 } ... ``` 示例代码如下: > Java SDK、 Go SDK 不支持此字段。
    • Responses API 示例代码:
    **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Authorization: Bearer $ARK_API_KEY" \ -H 'Content-Type: application/json' \ -d '{ "model": "doubao-seed-2-1-pro-260915", "input": [ { "role": "user", "content": [ { "type": "input_image", "image_url": "https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/planet_comparison.png", "image_pixel_limit": { "max_pixels": 3014080, "min_pixels": 3136 } }, { "type": "input_text", "text": "根据图片,表格中列出了多少颗行星,地球位于哪一行?" } ] } ] }' ``` **选项:Python** ```Python import os from arkruntime import Ark client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=os.getenv('ARK_API_KEY') ) response = client.responses.create( model="doubao-seed-2-1-pro-260915", input=[ { "role": "user", "content": [ { "type": "input_image", "image_url": "https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/planet_comparison.png", "image_pixel_limit": { "max_pixels": 3014080, "min_pixels": 3136, } }, { "type": "input_text", "text": "根据图片,表格中列出了多少颗行星,地球位于哪一行?" } ] } ] ) print(response.output) ```
    • Chat API 示例代码:
    **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "messages": [ { "role": "user", "content": [ {"type": "image_url","image_url": {"url": "https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/ark_demo_img_1-zh.png","image_pixel_limit": {"max_pixels": 3014080,"min_pixels": 3136}}}, {"type": "text", "text": "Which model series supports image input?"} ] } ], "max_tokens": 300 }' ``` **选项:Python** ```Python import os # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark client = Ark( # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv('ARK_API_KEY'), ) completion = client.chat.completions.create( # Replace with Model ID model = "doubao-seed-2-1-pro-260915", messages=[ { "role": "user", "content": [ { "type": "image_url", "image_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/ark_demo_img_1-zh.png", "image_pixel_limit": { "max_pixels": 3014080, "min_pixels": 3136, }, }, }, {"type": "text", "text": "Which model series supports image input?"}, ], } ], ) print(completion.choices[0]) ``` ## 图文混排 支持灵活地传入提示词和图片信息的方式,你可任意调整传入图片和文本的顺序,以及在`system message`或者`User message`传入图文信息。模型会根据顺序返回处理信息的结果,示例如下。 > **说明** > > 图文混排场景,图文顺序可能影响模型输出效果,若结果不符预期,可调整顺序。当多图+一段文字时,建议将文字放在图片之后。
    • Responses API 示例代码:
    **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Authorization: Bearer $ARK_API_KEY" \ -H 'Content-Type: application/json' \ -d '{ "model": "doubao-seed-2-1-pro-260915", "input": [ { "role": "system", "content": [ { "type": "input_text", "text": "下面人物是目标人物" }, { "type": "input_image", "image_url": "https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/target.png" }, { "type": "input_text", "text": "请确认下面图片中是否含有目标人物" } ] }, { "role": "user", "content": [ { "type": "input_text", "text": "图片1中是否含有目标人物" }, { "type": "input_image", "image_url": "https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/scene_01.png" }, { "type": "input_text", "text": "图片2中是否含有目标人物" }, { "type": "input_image", "image_url": "https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/scene_02.png" } ] } ] }' ``` **选项:Python** ```Python import os from arkruntime import Ark client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=os.getenv('ARK_API_KEY') ) response = client.responses.create( model="doubao-seed-2-1-pro-260915", input=[ { "role": "system", "content": [ { "type": "input_text", "text": "下面人物是目标人物" }, { "type": "input_image", "image_url": "https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/target.png" }, { "type": "input_text", "text": "请确认下面图片中是否含有目标人物" } ] }, { "role": "user", "content": [ { "type": "input_text", "text": "图片1中是否含有目标人物" }, { "type": "input_image", "image_url": "https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/scene_01.png" }, { "type": "input_text", "text": "图片2中是否含有目标人物" }, { "type": "input_image", "image_url": "https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/scene_02.png" } ] } ] ) print(response.output) ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/responses" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() systemMessage := responses.InputItem{ OneOf: responses.NewItemEasyMessageInputItemSum( responses.ItemEasyMessage{ Role: responses.NewOptMessageRole(responses.MessageRoleSystem), Content: responses.NewContentItemArrayMessageContent( []responses.ContentItem{ responses.ContentItem{OneOf: responses.NewContentItemTextContentItemSum(responses.ContentItemText{Type: responses.ContentItemTextTypeInputText, Text: "下面人物是目标人物"})}, responses.ContentItem{OneOf: responses.NewContentItemImageContentItemSum(responses.ContentItemImage{Type: responses.ContentItemImageTypeInputImage, ImageURL: responses.NewOptString("https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/target.png")})}, responses.ContentItem{OneOf: responses.NewContentItemTextContentItemSum(responses.ContentItemText{Type: responses.ContentItemTextTypeInputText, Text: "请确认下面图片中是否含有目标人物"})}, }, ), }, ), } userMessage := responses.InputItem{ OneOf: responses.NewItemEasyMessageInputItemSum( responses.ItemEasyMessage{ Role: responses.NewOptMessageRole(responses.MessageRoleUser), Content: responses.NewContentItemArrayMessageContent( []responses.ContentItem{ responses.ContentItem{OneOf: responses.NewContentItemTextContentItemSum(responses.ContentItemText{Type: responses.ContentItemTextTypeInputText, Text: "图片1中是否含有目标人物"})}, responses.ContentItem{OneOf: responses.NewContentItemImageContentItemSum(responses.ContentItemImage{Type: responses.ContentItemImageTypeInputImage, ImageURL: responses.NewOptString("https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/scene_01.png")})}, responses.ContentItem{OneOf: responses.NewContentItemTextContentItemSum(responses.ContentItemText{Type: responses.ContentItemTextTypeInputText, Text: "图片2中是否含有目标人物"})}, responses.ContentItem{OneOf: responses.NewContentItemImageContentItemSum(responses.ContentItemImage{Type: responses.ContentItemImageTypeInputImage, ImageURL: responses.NewOptString("https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/scene_02.png")})}, }, ), }, ), } resp, err := client.CreateResponses(ctx, &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", Input: responses.NewInputItemArrayResponsesInput([]responses.InputItem{systemMessage, userMessage}), }) if err != nil { fmt.Printf("response error: %v\n", err) return } fmt.Println(resp) } ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.service.ArkService; import com.volcengine.ark.runtime.models.responses.*; public class demo { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); ArkService arkService = ArkService.builder().apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); ResponsesRequest request = ResponsesRequest.builder() .model("doubao-seed-2-1-pro-260915") .input(ResponsesInput.ofList(java.util.Arrays.asList(ItemEasyMessage.builder().role(MessageRole.SYSTEM).content( MessageContent.ofList(java.util.Arrays.asList(ContentItemText.builder().text("下面人物是目标人物").build(), ContentItemImage.builder().imageUrl("https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/target.png").build(), ContentItemText.builder().text("请确认下面图片中是否含有目标人物").build())) ).build(), ItemEasyMessage.builder().role(MessageRole.USER).content( MessageContent.ofList(java.util.Arrays.asList(ContentItemText.builder().text("图片1中是否含有目标人物").build(), ContentItemImage.builder().imageUrl("https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/scene_01.png").build(), ContentItemText.builder().text("图片2中是否含有目标人物").build(), ContentItemImage.builder().imageUrl("https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/scene_02.png").build())) ).build())) ).build(); Response resp = arkService.createResponse(request); System.out.println(resp); arkService.shutdownExecutor(); } } ```
    • Chat API 示例代码:
    **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "messages": [ { "role": "system", "content": [ {"type": "text", "text": "下面人物是目标人物"}, { "type": "image_url", "image_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/target.png" } }, {"type": "text", "text": "请确认下面图片中是否含有目标人物"} ] }, { "role": "user", "content": [ {"type": "text", "text": "图片1中是否含有目标人物"}, { "type": "image_url", "image_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/scene_01.png" } }, {"type": "text", "text": "图片2中是否含有目标人物"}, { "type": "image_url", "image_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/scene_02.png" } } ] } ], "max_tokens": 300 }' ``` **选项:Python** ```Python import os # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark client = Ark( # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv('ARK_API_KEY'), ) completion = client.chat.completions.create( # Replace with Model ID model = "doubao-seed-2-1-pro-260915", messages=[ { "role": "system", "content": [ {"type": "text", "text": "下面人物是目标人物"}, { "type": "image_url", "image_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/target.png" }, }, {"type": "text", "text": "请确认下面图片中是否含有目标人物"}, ], }, { "role": "user", "content": [ {"type": "text", "text": "图片1中是否含有目标人物"}, { "type": "image_url", "image_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/scene_01.png" }, }, {"type": "text", "text": "图片2中是否含有目标人物"}, { "type": "image_url", "image_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/scene_02.png" }, }, ], }, ], ) print(completion.choices[0].message.content) ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/chat" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), // The base URL for model invocation arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) // Create a context, typically used to pass request context information, such as timeouts and cancellations ctx := context.Background() // Build the system message content systemContentParts := []chat.ChatCompletionContentPart{ chat.ChatCompletionContentPart{OneOf: chat.NewChatCompletionContentPartTextChatCompletionContentPartSum(chat.ChatCompletionContentPartText{Type: chat.ChatCompletionContentPartTextTypeText, Text: "下面人物是目标人物"})}, chat.ChatCompletionContentPart{OneOf: chat.NewChatCompletionContentPartImageChatCompletionContentPartSum(chat.ChatCompletionContentPartImage{Type: chat.ChatCompletionContentPartImageTypeImageURL, ImageURL: chat.NewChatCompletionContentPartImageImageUrlChatCompletionContentPartImageImageURL(chat.ChatCompletionContentPartImageImageUrl{URL: chat.NewOptString("https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/target.png")})})}, chat.ChatCompletionContentPart{OneOf: chat.NewChatCompletionContentPartTextChatCompletionContentPartSum(chat.ChatCompletionContentPartText{Type: chat.ChatCompletionContentPartTextTypeText, Text: "请确认下面图片中是否含有目标人物"})}, } // Build the user message content userContentParts := []chat.ChatCompletionContentPart{ chat.ChatCompletionContentPart{OneOf: chat.NewChatCompletionContentPartTextChatCompletionContentPartSum(chat.ChatCompletionContentPartText{Type: chat.ChatCompletionContentPartTextTypeText, Text: "图片1中是否含有目标人物"})}, chat.ChatCompletionContentPart{OneOf: chat.NewChatCompletionContentPartImageChatCompletionContentPartSum(chat.ChatCompletionContentPartImage{Type: chat.ChatCompletionContentPartImageTypeImageURL, ImageURL: chat.NewChatCompletionContentPartImageImageUrlChatCompletionContentPartImageImageURL(chat.ChatCompletionContentPartImageImageUrl{URL: chat.NewOptString("https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/scene_01.png")})})}, chat.ChatCompletionContentPart{OneOf: chat.NewChatCompletionContentPartTextChatCompletionContentPartSum(chat.ChatCompletionContentPartText{Type: chat.ChatCompletionContentPartTextTypeText, Text: "图片2中是否含有目标人物"})}, chat.ChatCompletionContentPart{OneOf: chat.NewChatCompletionContentPartImageChatCompletionContentPartSum(chat.ChatCompletionContentPartImage{Type: chat.ChatCompletionContentPartImageTypeImageURL, ImageURL: chat.NewChatCompletionContentPartImageImageUrlChatCompletionContentPartImageImageURL(chat.ChatCompletionContentPartImageImageUrl{URL: chat.NewOptString("https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/scene_02.png")})})}, } // Build a chat completion request and set the model and message content req := &chat.ChatCompletionRequest{ // Replace with Model ID Model: "doubao-seed-2-1-pro-260915", Messages: []chat.ChatCompletionRequestMessage{ chat.ChatCompletionRequestMessage{OneOf: chat.NewChatCompletionRequestSystemMessageChatCompletionRequestMessageSum(chat.ChatCompletionRequestSystemMessage{Role: chat.ChatCompletionRequestSystemMessageRoleSystem, Content: chat.NewChatCompletionContentPartArrayChatCompletionMessageContent(systemContentParts)})}, chat.ChatCompletionRequestMessage{OneOf: chat.NewChatCompletionRequestUserMessageChatCompletionRequestMessageSum(chat.ChatCompletionRequestUserMessage{Role: chat.ChatCompletionRequestUserMessageRoleUser, Content: chat.NewOptNilChatCompletionMessageContent(chat.NewChatCompletionContentPartArrayChatCompletionMessageContent(userContentParts))})}, }, MaxTokens: chat.NewOptInt32(int32(300)), } // Send the chat completion request, store the result in resp, and store any possible errors in err resp, err := client.CreateChatCompletion(ctx, req) if err!= nil { fmt.Printf("standard chat error: %v\n", err) return } fmt.Println(resp.Choices[0].Message.Content) } ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.chat.*; import com.volcengine.ark.runtime.models.chat.ChatCompletionContentPart.*; import com.volcengine.ark.runtime.service.ArkService; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; public class MultiImageSample { static String apiKey = System.getenv("ARK_API_KEY"); static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); static Dispatcher dispatcher = new Dispatcher(); static ArkService service = ArkService.builder() .dispatcher(dispatcher) .connectionPool(connectionPool) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation .apiKey(apiKey) .build(); public static void main(String[] args) throws Exception { List messagesForReqList = new ArrayList<>(); // Build the system message content List systemContentParts = new ArrayList<>(); systemContentParts.add(ChatCompletionContentPartText.builder() .type(ChatCompletionContentPartType.TEXT) .text("下面人物是目标人物") .build()); systemContentParts.add(ChatCompletionContentPartImage.builder() .type(ChatCompletionContentPartType.IMAGE_URL) .imageUrl(ChatCompletionContentPartImageImageUrl2.ofChatCompletionContentPartImageImageUrl(ChatCompletionContentPartImageImageUrl.builder().url("https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/target.png").build())) .build()); systemContentParts.add(ChatCompletionContentPartText.builder() .type(ChatCompletionContentPartType.TEXT) .text("请确认下面图片中是否含有目标人物") .build()); // Create the system message messagesForReqList.add(ChatCompletionRequestSystemMessage.builder() .role(ChatCompletionRequestMessageType.SYSTEM) .content(ChatCompletionMessageContent.ofList(systemContentParts)) .build()); // Build the user message content List userContentParts = new ArrayList<>(); userContentParts.add(ChatCompletionContentPartText.builder() .type(ChatCompletionContentPartType.TEXT) .text("图片1中是否含有目标人物") .build()); userContentParts.add(ChatCompletionContentPartImage.builder() .type(ChatCompletionContentPartType.IMAGE_URL) .imageUrl(ChatCompletionContentPartImageImageUrl2.ofChatCompletionContentPartImageImageUrl(ChatCompletionContentPartImageImageUrl.builder().url("https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/scene_01.png").build())) .build()); userContentParts.add(ChatCompletionContentPartText.builder() .type(ChatCompletionContentPartType.TEXT) .text("图片2中是否含有目标人物") .build()); userContentParts.add(ChatCompletionContentPartImage.builder() .type(ChatCompletionContentPartType.IMAGE_URL) .imageUrl(ChatCompletionContentPartImageImageUrl2.ofChatCompletionContentPartImageImageUrl(ChatCompletionContentPartImageImageUrl.builder().url("https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/scene_02.png").build())) .build()); // Create user message messagesForReqList.add(ChatCompletionRequestUserMessage.builder() .role(ChatCompletionRequestMessageType.USER) .content(ChatCompletionMessageContent.ofList(userContentParts)) .build()); ChatCompletionRequest req = ChatCompletionRequest.builder() .model("doubao-seed-2-1-pro-260915") //Replace with Model ID .messages(messagesForReqList) .maxTokens(300) .build(); service.createChatCompletion(req) .getChoices() .forEach(choice -> System.out.println(choice.getMessage().getContent())); // shutdown service after all requests are finished service.shutdownExecutor(); } } ``` ## 视觉定位(Visual Grounding) 请参见教程 [视觉定位 Grounding](/docs/grounding)。 ## GUI任务处理 请参见教程 [GUI Agent 能力](/docs/gui-task-processing)。 # 使用说明 > **说明** > > 处理完图片/视频后,文件会从方舟服务器删除。方舟不会保留你提交的图片、视频以及文本信息等用户数据来训练模型。 ## 图片像素说明 1. 传入图片像素要求如下,超出限制后会直接报错。 * 宽 > 14px 且高 > 14px * 宽*高范围:[196px, 36000000px] * 宽高比范围:[1/150, 150] 2. 图片预处理: 根据使用的模型、设置的 detail 模式,将图片等比例缩放至相应的范围(具体见[通过 detail 字段(图片理解)](/docs/image-understanding#885d96dc)),可降低模型响应时延及 token 消耗。 ## 图片 token 用量说明 根据图片宽高像素计算得到 token 用量。不同模型的图片 token 用量估算逻辑如下。单图 token 范围参见[通过 detail 字段(图片理解)](/docs/image-understanding#885d96dc)。 doubao-seed-2.0 及后续模型估算逻辑: ```Text min(image_width * image_height ÷ 1764, max_image_tokens) ``` 以传入 doubao-seed-2.0 模型的单图 token 最大值为 1280 为例,计算图片消耗的 token 数的逻辑如下: * 图片尺寸为 `1280 px × 960 px`:理解这张图消耗的 token 为`1280×960÷1764=697`,该值小于 1280,根据公式计算消耗 token 数为 697。 * 图片尺寸为 `2560 px × 1440 px`:理解这张图消耗的 token 为`2560×1440÷1764=2090`,该值大于 1280,根据公式计算消耗 token 数为 1280。 这种情况会对图片进行压缩,即图片会丢失部分细节。譬如字体很小的图片,模型可能会无法识别文字内容。 ## 图片数量说明 单次请求传入图片数量受限于模型上下文窗口。当输入过长,触发模型上下文窗口,信息会被截断。 > 模型上下文窗口请参见[模型列表](/docs/model-list)。 > 举例说明: > * 当图片总像素值大,使用的模型上下文窗口为 32k token,每张图片转为 1312 token ,单次请求可传入的图片数量为 `32000 ÷ 1312 = 24 `张。 > * 当图片总像素值小,使用的模型上下文窗口为 32k token,每张图片转为 256 token,单次请求可传入的数量为 `32000 ÷ 256 = 125` 张。 > **说明** > > 模型回复的质量,受输入图片信息量影响。过多的图片会导致模型回复质量下滑,请合理控制单次请求传入图片的数量。 ## 图片文件容量 * 非 DeepSeek-V4.1-Flash 系列模型在图片文件的**使用限制**如下: * 使用 URL 方式传入图片,单张图片不能超过 10MB。 * 使用 Base64 编码传入图片,单张图片不能超过 10MB,请求体不能超过 64MB。 * 使用文件路径传入图片,图片不能超过 512 MB。 * DeepSeek-V4.1-Flash 系列模型在图片文件的**使用限制**参见:[通过 detail 字段(图片理解)](/docs/image-understanding#885d96dc)。 ## 图片格式说明 支持的图片格式如下表,注意文件后缀匹配图片格式,即图片文件扩展名(URL传入时)、图片格式声明(Base64 编码传入时)需与图片实际信息一致。 |**图片格式** |**文件扩展名** |**内容格式** **Content Type** | |---|---|---| |JPEG |.jpg, .jpeg |`image/jpeg` | |PNG |.png |`image/png` | |GIF |.gif |`image/gif` | |WEBP |.webp |`image/webp` | |BMP |.bmp |`image/bmp` | |TIFF |.tiff, .tif |`image/tiff` | |ICO |.ico |`image/x-icon` | |DIB |.dib |`image/bmp` | |ICNS |.icns |`image/x-icns` | |SGI |.sgi |`image/sgi` | |JPEG2000 |.j2c, .j2k, .jp2, .jpc, .jpf, .jpx |`image/jp2` | |HEIC |.heic |`image/heic` | \ | | |> doubao-1.5-vision-pro及以后模型支持 | |HEIF |.heif |`image/heic` | \ | | |> doubao-1.5-vision-pro及以后模型支持 | > **说明** > > * 上传文件至对象存储时设置,详情请参见 [文档](https://docs.volcengine.com/docs/6349/145523?lang=zh#%E8%AE%BE%E7%BD%AE%E6%96%87%E4%BB%B6%E5%85%83%E6%95%B0%E6%8D%AE)。 > * 传入 Base64编码时使用:[Base64 编码输入](/docs/image-understanding#477e51ce)。 > * 图片格式需小写。 > * TIFF、 SGI、ICNS、JPEG2000 几种格式图片,需保证和元数据对齐,如在对象存储中正确设置文件元数据,否则会解析失败,详细请参见 [使用视觉理解模型时,报错InvalidParameter?](/docs/modelark-faq#effccb14) ## API 参数字段说明 以下字段视觉理解暂不支持。 * 不支持设置频率惩罚系数,无 **frequency_penalty** 字段。 * 不支持设置存在惩罚系数,**presence_penalty** 字段。 * 不支持为单个请求生成多个返回,无 **n** 字段。 # 常见问题 * [使用视觉理解模型时,报错InvalidParameter?](/docs/modelark-faq#effccb14) --- # 视频理解 Source: https://ark.volcengine.com/region:cn-beijing/docs/video-understanding 视觉大模型可理解视频中的视觉信息,完成如描述其中的物体、分析动作逻辑等视觉相关任务,可用于自动化视频内容审核、智能监控分析等,大幅节省人工成本,适用于智能安防、体育赛事分析、媒体内容管理等领域。这篇教程帮助您通过 API 完成含视频输入的各类任务。 > **说明** > > 方舟平台的新用户?获取 API Key 及 开通模型等准备工作,请参见 [快速入门](/docs/quick-start)。 # 支持模型 请参见[视觉理解能力](/docs/model-list#76df97c8)。 # API 接口 * [Responses API](/docs/create-model-responses-api):支持视频作为输入进行分析。支持 File ID 方式进行视频理解,使用方式参见[Files API 上传(推荐)](/docs/video-understanding#35d3ebc5)。 * [Chat API](/docs/chat-api):支持视频作为输入进行分析。支持 File ID 方式进行视频理解,使用方式参见[Files API 上传(推荐)](/docs/video-understanding#35d3ebc5)。 # 视频传入方式 支持的视频文件传入方式如下: * 本地文件上传: * [Files API 上传(推荐)](/docs/video-understanding#35d3ebc5):直接传入本地文件,文件存储在方舟平台托管的默认存储空间中时,支持最大 512 MB 文件的上传;文件存储在火山引擎对象存储 TOS Bucket 中时,支持最大 2 GB 的视频文件的上传,从而满足大文件处理需求。 * [Base64 编码传入](/docs/video-understanding#22314028):适用于文件体积较小的场景,视频文件小于 50 MB,请求体不能超过 64 MB。 * [视频 URL 传入](/docs/video-understanding#8e3a48ed):适用于文件已存在公网可访问 URL 的场景,视频文件大小不能超过 50 MB。 ## 本地文件上传 ### Files API 上传(推荐) 建议优先使用 Files API 上传本地文件。该方式下,文件存储在方舟平台托管的默认存储空间时,支持最大 512 MB 文件上传;存储在火山引擎对象存储 TOS Bucket 时,支持最大 2 GB 视频文件上传,可充分满足大文件处理需求。同时可避免请求时重复上传内容,减少预处理时延,文件还能在多次请求中复用,节省公网下载耗时。 通过 Files API 上传视频时,需在上传请求的 `preprocess_configs.video.model` 中传入支持视频理解的模型 ID。该配置用于指定视频预处理和抽帧策略;后续调用 Responses API 或 Chat API 时,仍需在请求的 `model` 中传入实际用于推理的模型或接入点。 上传成功并待文件状态变为 `active` 后,Responses API 和 Chat API 均支持通过 `file_id` 方式传入视频。 > * 该方式上传的文件默认存储 7 天,存储有效期取值范围为1-30天。 > * 如果需要实时获取分析内容,或者要规避复杂任务引发的客户端超时失败问题,可采用流式输出的方式,具体示例见[流式输出](/docs/video-understanding#5cfd1f60)。 不传 TOS 参数时,文件默认存储至方舟平台托管的默认存储空间。示例代码如下:
    • Responses API 示例代码:
    **选项:Curl** 1. 上传视频文件获取File ID。 ```Bash curl https://ark.cn-beijing.volces.com/api/v3/files \ -H "Authorization: Bearer $ARK_API_KEY" \ -F 'purpose=user_data' \ -F 'file=@/Users/doc/demo.mp4' \ -F 'preprocess_configs[video][model]=doubao-seed-2-1-pro-260915' \ -F 'preprocess_configs[video][fps]=0.3' ``` 2. 在Responses API中引用File ID。 ```Bash curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Authorization: Bearer $ARK_API_KEY" \ -H 'Content-Type: application/json' \ -d '{ "model": "doubao-seed-2-1-pro-260915", "input": [ { "role": "user", "content": [ { "type": "input_video", "file_id": "file-20251018****" }, { "type": "input_text", "text": "请你描述下视频中的人物的一系列动作,以JSON格式输出开始时间(start_time)、结束时间(end_time)、事件(event)、是否危险(danger),请使用HH:mm:ss表示时间戳。" } ] } ] }' ``` **选项:Python** ```Python import os from pathlib import Path from arkruntime import Ark client = Ark( base_url="https://ark.cn-beijing.volces.com/api/v3", api_key=os.environ.get("ARK_API_KEY"), ) file_path = Path(os.getenv("FILE_PATH", "/Users/doc/demo.mp4")) uploaded_file = client.files.create( file=file_path, purpose="user_data", preprocess_configs={"video": {"model": "doubao-seed-2-1-pro-260915", "fps": 0.3}}, ) client.files.wait_for_processing(uploaded_file.id) response = client.responses.create( model=os.getenv("MODEL_ID", "doubao-seed-2-1-pro-260915"), input=[ { "role": "user", "content": [ {"type": "input_video", "file_id": uploaded_file.id}, {"type": "input_text", "text": "请你描述下视频中的人物的一系列动作,以JSON格式输出开始时间(start_time)、结束时间(end_time)、事件(event)、是否危险(danger),请使用HH:mm:ss表示时间戳。"}, ], } ], ) print(response) ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/file" "github.com/volcengine/ark-runtime-go/arkruntime/model/responses" ) func main() { ctx := context.Background() client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) filePath := os.Getenv("FILE_PATH") if filePath == "" { filePath = "/Users/doc/demo.mp4" } data, err := os.Open(filePath) if err != nil { panic(err) } defer data.Close() uploaded, err := client.UploadFile(ctx, &file.FileCreateRequest{ Purpose: file.PurposeUserData, PreprocessConfigs: file.NewOptPreprocessConfigs(file.PreprocessConfigs{ Video: file.NewOptVideo(file.Video{ Model: file.NewOptString("doubao-seed-2-1-pro-260915"), Fps: file.NewOptFloat64(0.3), }), }), }, data) if err != nil { panic(err) } uploaded, err = client.WaitForFileProcessing( ctx, uploaded.ID, arkruntime.WaitForFileProcessingOptions{}, ) if err != nil || uploaded.Status != file.StatusActive { panic(fmt.Sprintf("file processing failed: %v, status=%s", err, uploaded.Status)) } media := responses.ContentItem{OneOf: responses.NewContentItemVideoContentItemSum(responses.ContentItemVideo{Type: responses.ContentItemVideoTypeInputVideo, VideoURL: "", FileID: responses.NewOptString(uploaded.ID)})} text := responses.ContentItem{OneOf: responses.NewContentItemTextContentItemSum( responses.ContentItemText{Type: responses.ContentItemTextTypeInputText, Text: "请你描述下视频中的人物的一系列动作,以JSON格式输出开始时间(start_time)、结束时间(end_time)、事件(event)、是否危险(danger),请使用HH:mm:ss表示时间戳。"}, )} message := responses.InputItem{OneOf: responses.NewItemEasyMessageInputItemSum( responses.ItemEasyMessage{ Role: responses.NewOptMessageRole(responses.MessageRoleUser), Content: responses.NewContentItemArrayMessageContent([]responses.ContentItem{media, text}), }, )} modelID := os.Getenv("MODEL_ID") if modelID == "" { modelID = "doubao-seed-2-1-pro-260915" } response, err := client.CreateResponses(ctx, &responses.ResponsesRequest{ Model: modelID, Input: responses.NewInputItemArrayResponsesInput([]responses.InputItem{message}), }) if err != nil { panic(err) } fmt.Println(response) } ``` **选项:Java** ```Java import com.volcengine.ark.runtime.models.file.*; import com.volcengine.ark.runtime.models.responses.*; import com.volcengine.ark.runtime.service.ArkService; import java.io.File; import java.util.Arrays; public class Main { public static void main(String[] args) { ArkService service = ArkService.builder() .apiKey(System.getenv("ARK_API_KEY")) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); String filePath = System.getenv().getOrDefault("FILE_PATH", "/Users/doc/demo.mp4"); String modelId = System.getenv().getOrDefault("MODEL_ID", "doubao-seed-2-1-pro-260915"); FileObject uploaded = service.uploadFile( FileCreateRequest.builder() .purpose(Purpose.USER_DATA) .preprocessConfigs(PreprocessConfigs.builder().video(Video.builder().model("doubao-seed-2-1-pro-260915").fps(0.3).build()).build()) .build(), new File(filePath) ); uploaded = service.waitForFileProcessing(uploaded.getId()); if (uploaded.getStatus() != Status.ACTIVE) { throw new IllegalStateException("File processing failed: " + uploaded.getStatus()); } ContentItem media = ContentItemVideo.builder().type(ContentItemType.INPUT_VIDEO).fileId(uploaded.getId()).build(); ContentItem text = ContentItemText.builder() .type(ContentItemType.INPUT_TEXT) .text("请你描述下视频中的人物的一系列动作,以JSON格式输出开始时间(start_time)、结束时间(end_time)、事件(event)、是否危险(danger),请使用HH:mm:ss表示时间戳。") .build(); ResponsesRequest request = ResponsesRequest.builder() .model(modelId) .input(ResponsesInput.ofList(Arrays.asList( ItemEasyMessage.builder() .role(MessageRole.USER) .content(MessageContent.ofList(Arrays.asList(media, text))) .build() ))) .build(); Response response = service.createResponse(request); System.out.println(response); service.shutdownExecutor(); } } ``` **选项:OpenAI SDK** ```Python import os import time from openai import OpenAI api_key = os.getenv('ARK_API_KEY') client = OpenAI( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) file = client.files.create( file=open("/Users/doc/demo.mp4", "rb"), purpose="user_data", extra_body={ "preprocess_configs": { "video": { "model": "doubao-seed-2-1-pro-260915", "fps": 0.3, } } }, ) # Wait for the file to finish processing while (file.status == "processing"): time.sleep(2) file = client.files.retrieve(file.id) print(f"File processed: {file}") response = client.responses.create( model="doubao-seed-2-1-pro-260915", input=[ { "role": "user", "content": [ { "type": "input_video", "file_id": file.id, }, { "type": "input_text", "text": "请你描述下视频中的人物的一系列动作,以JSON格式输出开始时间(start_time)、结束时间(end_time)、事件(event)、是否危险(danger),请使用HH:mm:ss表示时间戳。", }, ] } ] ) print(response) ```
    • Chat API 示例代码:
    **选项:Curl** 1. 上传视频文件获取 File ID。 ```Bash curl https://ark.cn-beijing.volces.com/api/v3/files \ -H "Authorization: Bearer $ARK_API_KEY" \ -F 'purpose=user_data' \ -F 'file=@/Users/doc/demo.mp4' \ -F 'preprocess_configs[video][model]=doubao-seed-2-1-pro-260915' \ -F 'preprocess_configs[video][fps]=0.3' ``` 2. 在 Chat API 中引用 File ID。 ```Bash curl https://ark.cn-beijing.volces.com/api/v3/chat/completions \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "messages": [ { "role": "user", "content": [ { "type": "video_url", "video_url": { "file_id": "file-20251018****" } }, { "type": "text", "text": "请你描述下视频中的人物的一系列动作,以 JSON 格式输出开始时间(start_time)、结束时间(end_time)、事件(event)、是否危险(danger),请使用 HH:mm:ss 表示时间戳。" } ] } ] }' ``` **选项:Python** ```Python import os from pathlib import Path from arkruntime import Ark client = Ark( base_url="https://ark.cn-beijing.volces.com/api/v3", api_key=os.environ.get("ARK_API_KEY"), ) file_path = Path(os.getenv("FILE_PATH", "/Users/doc/demo.mp4")) uploaded_file = client.files.create( file=file_path, purpose="user_data", preprocess_configs={"video": {"model": "doubao-seed-2-1-pro-260915", "fps": 0.3}}, ) client.files.wait_for_processing(uploaded_file.id) completion = client.chat.completions.create( model=os.getenv("MODEL_ID", "doubao-seed-2-1-pro-260915"), messages=[ { "role": "user", "content": [ {"type": "video_url", "video_url": {"file_id": uploaded_file.id}}, {"type": "text", "text": "请你描述下视频中的人物的一系列动作,以 JSON 格式输出开始时间(start_time)、结束时间(end_time)、事件(event)、是否危险(danger),请使用 HH:mm:ss 表示时间戳。"}, ], } ], ) print(f"id={completion.id}") print(completion.choices[0].message.content) ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/chat" "github.com/volcengine/ark-runtime-go/arkruntime/model/file" ) func main() { ctx := context.Background() client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) filePath := os.Getenv("FILE_PATH") if filePath == "" { filePath = "/Users/doc/demo.mp4" } data, err := os.Open(filePath) if err != nil { panic(err) } defer data.Close() uploaded, err := client.UploadFile(ctx, &file.FileCreateRequest{ Purpose: file.PurposeUserData, PreprocessConfigs: file.NewOptPreprocessConfigs(file.PreprocessConfigs{ Video: file.NewOptVideo(file.Video{ Model: file.NewOptString("doubao-seed-2-1-pro-260915"), Fps: file.NewOptFloat64(0.3), }), }), }, data) if err != nil { panic(err) } uploaded, err = client.WaitForFileProcessing( ctx, uploaded.ID, arkruntime.WaitForFileProcessingOptions{}, ) if err != nil || uploaded.Status != file.StatusActive { panic(fmt.Sprintf("file processing failed: %v, status=%s", err, uploaded.Status)) } media := chat.ChatCompletionContentPart{OneOf: chat.NewChatCompletionContentPartVideoChatCompletionContentPartSum(chat.ChatCompletionContentPartVideo{Type: chat.ChatCompletionContentPartVideoTypeVideoURL, VideoURL: chat.ChatCompletionContentPartVideoVideoUrl{FileID: chat.NewOptString(uploaded.ID)}})} text := chat.ChatCompletionContentPart{OneOf: chat.NewChatCompletionContentPartTextChatCompletionContentPartSum( chat.ChatCompletionContentPartText{Type: chat.ChatCompletionContentPartTextTypeText, Text: "请你描述下视频中的人物的一系列动作,以 JSON 格式输出开始时间(start_time)、结束时间(end_time)、事件(event)、是否危险(danger),请使用 HH:mm:ss 表示时间戳。"}, )} message := chat.ChatCompletionRequestMessage{OneOf: chat.NewChatCompletionRequestUserMessageChatCompletionRequestMessageSum( chat.ChatCompletionRequestUserMessage{ Role: chat.ChatCompletionRequestUserMessageRoleUser, Content: chat.NewOptNilChatCompletionMessageContent(chat.NewChatCompletionContentPartArrayChatCompletionMessageContent( []chat.ChatCompletionContentPart{media, text}, )), }, )} modelID := os.Getenv("MODEL_ID") if modelID == "" { modelID = "doubao-seed-2-1-pro-260915" } response, err := client.CreateChatCompletion(ctx, &chat.ChatCompletionRequest{ Model: modelID, Messages: []chat.ChatCompletionRequestMessage{message}, }) if err != nil { panic(err) } fmt.Printf("id=%s\n%s\n", response.ID, response.Choices[0].Message.Content) } ``` **选项:Java** ```Java import com.volcengine.ark.runtime.models.chat.*; import com.volcengine.ark.runtime.models.file.FileCreateRequest; import com.volcengine.ark.runtime.models.file.FileObject; import com.volcengine.ark.runtime.models.file.PreprocessConfigs; import com.volcengine.ark.runtime.models.file.Purpose; import com.volcengine.ark.runtime.models.file.Status; import com.volcengine.ark.runtime.models.file.Video; import com.volcengine.ark.runtime.service.ArkService; import java.io.File; import java.util.Arrays; public class Main { public static void main(String[] args) { ArkService service = ArkService.builder() .apiKey(System.getenv("ARK_API_KEY")) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); String filePath = System.getenv().getOrDefault("FILE_PATH", "/Users/doc/demo.mp4"); String modelId = System.getenv().getOrDefault("MODEL_ID", "doubao-seed-2-1-pro-260915"); FileObject uploaded = service.uploadFile( FileCreateRequest.builder() .purpose(Purpose.USER_DATA) .preprocessConfigs(PreprocessConfigs.builder().video(Video.builder().model("doubao-seed-2-1-pro-260915").fps(0.3).build()).build()) .build(), new File(filePath) ); uploaded = service.waitForFileProcessing(uploaded.getId()); if (uploaded.getStatus() != Status.ACTIVE) { throw new IllegalStateException("File processing failed: " + uploaded.getStatus()); } ChatCompletionContentPart media = ChatCompletionContentPartVideo.builder().type(ChatCompletionContentPartType.VIDEO_URL).videoUrl(ChatCompletionContentPartVideoVideoUrl.builder().fileId(uploaded.getId()).build()).build(); ChatCompletionContentPart text = ChatCompletionContentPartText.builder() .type(ChatCompletionContentPartType.TEXT) .text("请你描述下视频中的人物的一系列动作,以 JSON 格式输出开始时间(start_time)、结束时间(end_time)、事件(event)、是否危险(danger),请使用 HH:mm:ss 表示时间戳。") .build(); ChatCompletionRequestMessage message = ChatCompletionRequestUserMessage.builder() .role(ChatCompletionRequestMessageType.USER) .content(ChatCompletionMessageContent.builder() .value(Arrays.asList(media, text)) .build()) .build(); ChatCompletionRequest request = ChatCompletionRequest.builder() .model(modelId) .messages(Arrays.asList(message)) .build(); ChatCompletionResponse response = service.createChatCompletion(request); System.out.println("id=" + response.getId()); System.out.println(response.getChoices().get(0).getMessage().getContent()); service.shutdownExecutor(); } } ``` 传 TOS 参数时,文件存储至用户指定的火山引擎对象存储 TOS Bucket,支持最大 2 GB 的视频文件上传。示例代码如下:
    • Responses API 示例代码:
    **选项:Curl** ```Bash curl -X POST "https://ark.cn-beijing.volces.com/api/v3/files" \ -H "Authorization: Bearer $ARK_API_KEY" \ -F "purpose=user_data" \ -F "url=tos://my-bucket/videos/long-video.mp4" \ -F "tos[bucket]=my-bucket" \ -F "tos[prefix]=ark-files/" \ -F "preprocess_configs[video][model]=doubao-seed-2-1-pro-260915" \ -F "preprocess_configs[video][max_video_tokens]=200000" \ -F "preprocess_configs[video][min_frames]=16" ``` **选项:Python SDK** ```Python import os from arkruntime import Ark client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=os.getenv('ARK_API_KEY') ) prompt = "请你描述下视频中的人物的一系列动作,以JSON格式输出开始时间(start_time)、结束时间(end_time)、事件(event)、是否危险(danger),请使用HH:mm:ss表示时间戳。" file = client.files.create( url="tos://my-bucket/videos/long-video.mp4", purpose="user_data", tos={ "bucket": "my-bucket", "prefix": "ark-files/" }, preprocess_configs={ "video": { "model": "doubao-seed-2-1-pro-260915", "max_video_tokens": 200000, "min_frames": 16 } } ) print(file) response = client.responses.create( model="doubao-seed-2-1-pro-260915", input=[ { "role": "user", "content": [ { "type": "input_video", "file_id": file.id }, { "type": "input_text", "text": prompt } ] } ] ) print(response) ``` **选项:Go SDK** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/volcengine-go-sdk/service/arkruntime" "github.com/volcengine/volcengine-go-sdk/service/arkruntime/model/file" "github.com/volcengine/volcengine-go-sdk/volcengine" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() fileInfo, err := client.UploadFile(ctx, &file.UploadFileRequest{ Purpose: file.PurposeUserData, URL: volcengine.String("tos://my-bucket/videos/long-video.mp4"), Tos: &file.TosStorage{ Bucket: volcengine.String("my-bucket"), Prefix: volcengine.String("ark-files/"), }, PreprocessConfigs: &file.PreprocessConfigs{ Video: &file.Video{ Model: volcengine.String("doubao-seed-2-1-pro-260915"), MaxVideoTokens: volcengine.Int64(200000), MinFrames: volcengine.Int64(16), }, }, }) if err != nil { fmt.Printf("upload file error: %v", err) return } fmt.Printf("file info: %v\n", fileInfo) } ``` **选项:Java SDK** ```Java package com.ark.sample; import com.volcengine.ark.runtime.model.files.*; import com.volcengine.ark.runtime.service.ArkService; public class demo { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); ArkService service = ArkService.builder() .apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); System.out.println("===== Upload File Example ====="); FileMeta fileMeta; try { fileMeta = service.uploadFile( UploadFileRequest.builder() .url("tos://my-bucket/videos/long-video.mp4") .purpose("user_data") .tos(TosStorage.builder() .bucket("my-bucket") .prefix("ark-files/") .build()) .preprocessConfigs(PreprocessConfigs.builder() .video(Video.builder() .model("doubao-seed-2-1-pro-260915") .maxVideoTokens(200000L) .minFrames(16L) .build()) .build()) .build()); System.out.println("Uploaded file Meta: " + fileMeta); } catch (Exception e) { e.printStackTrace(); } service.shutdownExecutor(); } } ```
    • Chat API 示例代码:
    **选项:Curl** 1. 上传视频文件获取 File ID。 ```Bash curl -X POST "https://ark.cn-beijing.volces.com/api/v3/files" \ -H "Authorization: Bearer $ARK_API_KEY" \ -F "purpose=user_data" \ -F "url=tos:///videos/long-video.mp4" \ -F "tos[bucket]=" \ -F "tos[prefix]=ark-files/" \ -F "preprocess_configs[video][model]=doubao-seed-2-1-pro-260915" \ -F "preprocess_configs[video][max_video_tokens]=200000" \ -F "preprocess_configs[video][min_frames]=16" ``` 2. 在 Chat API 中引用 File ID。 ```Bash curl https://ark.cn-beijing.volces.com/api/v3/chat/completions \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "messages": [ { "role": "user", "content": [ { "type": "video_url", "video_url": { "file_id": "file-20251018****" } }, { "type": "text", "text": "请你描述下视频中的人物的一系列动作,以 JSON 格式输出开始时间(start_time)、结束时间(end_time)、事件(event)、是否危险(danger),请使用 HH:mm:ss 表示时间戳。" } ] } ] }' ``` **选项:Python SDK** ```Python import os from arkruntime import Ark client = Ark( base_url="https://ark.cn-beijing.volces.com/api/v3", api_key=os.getenv("ARK_API_KEY"), ) prompt = "请你描述下视频中的人物的一系列动作,以JSON格式输出开始时间(start_time)、结束时间(end_time)、事件(event)、是否危险(danger),请使用HH:mm:ss表示时间戳。" file = client.files.create( url="tos://my-bucket/videos/long-video.mp4", purpose="user_data", tos={ "bucket": "my-bucket", "prefix": "ark-files/", }, preprocess_configs={ "video": { "model": "doubao-seed-2-1-pro-260915", "max_video_tokens": 200000, "min_frames": 16, } }, ) print(file) completion = client.chat.completions.create( model="doubao-seed-2-1-pro-260915", messages=[ { "role": "user", "content": [ { "type": "video_url", "video_url": { "file_id": file.id, }, }, { "type": "text", "text": prompt, }, ], } ], ) print(completion.choices[0].message.content) ``` ### Base64 编码传入 将本地文件转换为 Base64 编码字符串,然后提交给大模型。该方式适用于视频文件体积较小的情况,文件不能超过 50 MB,请求体不能超过 64 MB。(Responses API 和 Chat API 都支持该方式。) > **注意** > > 将视频文件转换为Base64编码字符串,然后遵循`data:{mime_type};base64,{base64_data}`格式拼接,传入模型。 > * `{mime_type}`:文件的媒体类型,需要与文件格式mime_type对应。支持的视频格式详细见[视频格式说明](/docs/video-understanding#1d125314)。 > * `{base64_data}`:文件经过Base64编码后的字符串。
    • 使用 Responses API 的示例代码如下:
    **选项:Curl** ```Bash BASE64_FILE=$(base64 < demo.mp4) && curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d @- <
  • 使用 Chat API 的示例代码如下:
  • **选项:Curl** ```Bash BASE64_VIDEO=$(base64 < demo.mp4) && curl https://ark.cn-beijing.volces.com/api/v3/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d @- <;base64,{base64_video}" }, }, { "type": "text", "text": "What's in the video?", }, ], } ], ) print(completion.choices[0]) ``` **选项:Go** ```Go package main import ( "context" "encoding/base64" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/chat" ) func main() { // 读取本地视频文件 videoBytes, err := os.ReadFile("demo.mp4") // 替换为实际视频路径 if err != nil { fmt.Printf("读取视频失败: %v\n", err) return } base64Video := base64.StdEncoding.EncodeToString(videoBytes) client := arkruntime.NewClientWithApiKey( // Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey os.Getenv("ARK_API_KEY"), // The base URL for model invocation . arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() req := &chat.ChatCompletionRequest{ // Replace with Model ID Model: "doubao-seed-2-1-pro-260915", Messages: []chat.ChatCompletionRequestMessage{ chat.ChatCompletionRequestMessage{OneOf: chat.NewChatCompletionRequestUserMessageChatCompletionRequestMessageSum(chat.ChatCompletionRequestUserMessage{Role: chat.ChatCompletionRequestUserMessageRoleUser, Content: chat.NewOptNilChatCompletionMessageContent(chat.NewChatCompletionContentPartArrayChatCompletionMessageContent( []chat.ChatCompletionContentPart{ chat.ChatCompletionContentPart{OneOf: chat.NewChatCompletionContentPartVideoChatCompletionContentPartSum(chat.ChatCompletionContentPartVideo{Type: chat.ChatCompletionContentPartVideoTypeVideoURL, VideoURL: chat.ChatCompletionContentPartVideoVideoUrl{URL: chat.NewOptString(fmt.Sprintf("data:video/mp4;base64,%s", base64Video))}})}, chat.ChatCompletionContentPart{OneOf: chat.NewChatCompletionContentPartTextChatCompletionContentPartSum(chat.ChatCompletionContentPartText{Type: chat.ChatCompletionContentPartTextTypeText, Text: "What's in the video?"})}, }, ))})}, }, } resp, err := client.CreateChatCompletion(ctx, req) if err != nil { fmt.Printf("standard chat error: %v\n", err) return } fmt.Println(resp.Choices[0].Message.Content) } ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.chat.*; import com.volcengine.ark.runtime.models.chat.ChatCompletionContentPart.*; import com.volcengine.ark.runtime.service.ArkService; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; import java.nio.file.Files; import java.nio.file.Path; import java.util.Base64; import java.io.IOException; public class Sample { static String apiKey = System.getenv("ARK_API_KEY"); static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); static Dispatcher dispatcher = new Dispatcher(); static ArkService service = ArkService.builder() .dispatcher(dispatcher) .connectionPool(connectionPool) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation .apiKey(apiKey) //Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey .build(); // Base64编码方法 private static String encodeVideo(String videoPath) throws IOException { byte[] videoBytes = Files.readAllBytes(java.nio.file.Paths.get(videoPath)); return Base64.getEncoder().encodeToString(videoBytes); } public static void main(String[] args) throws Exception { List messagesForReqList = new ArrayList<>(); // 本地视频路径(替换为实际路径) String videoPath = "demo.mp4"; // 生成Base64数据URL String base64Data = "data:video/mp4;base64," + encodeVideo(videoPath); // 构建消息内容(修复内容部分构建方式) List contentParts = new ArrayList<>(); // 图片部分使用builder模式 contentParts.add(ChatCompletionContentPartVideo.builder() .type(ChatCompletionContentPartType.VIDEO_URL) .videoUrl(ChatCompletionContentPartVideoVideoUrl.builder().url(base64Data).fps(2.0).build()) .build()); // 文本部分使用builder模式 contentParts.add(ChatCompletionContentPartText.builder() .type(ChatCompletionContentPartType.TEXT) .text("What's in the video?") .build()); // 创建消息 messagesForReqList.add(ChatCompletionRequestUserMessage.builder() .role(ChatCompletionRequestMessageType.USER) .content(ChatCompletionMessageContent.ofList(contentParts)) .build()); ChatCompletionRequest req = ChatCompletionRequest.builder() .model("doubao-seed-2-1-pro-260915") //Replace with Model ID . .messages(messagesForReqList) .build(); service.createChatCompletion(req) .getChoices() .forEach(choice -> System.out.println(choice.getMessage().getContent())); // shutdown service after all requests are finished service.shutdownExecutor(); } } ``` ## 视频 URL 传入 如果视频文件已存在公网可访问URL,可以在请求中直接填入视频文件的公网URL,文件不能超过50 MB。(Responses API 和 Chat API 都支持该方式。)
    • 使用 Responses API 的示例代码如下:
    **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Authorization: Bearer $ARK_API_KEY" \ -H 'Content-Type: application/json' \ -d '{ "model": "doubao-seed-2-1-pro-260915", "input": [ { "role": "user", "content": [ { "type": "input_video", "video_url": "https://arkdocs.tos-cn-beijing.volces.com/videos/advanced-usage/ark_vlm_video_input.mp4", "fps":1 } ] } ] }' ``` **选项:Python** ```Python import os from arkruntime import Ark # 从环境变量中获取您的API KEY,配置方法见:https://ark.volcengine.com/region:cn-beijing/docs/quick-start api_key = os.getenv('ARK_API_KEY') client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) response = client.responses.create( model="doubao-seed-2-1-pro-260915", input=[ { "role": "user", "content": [ { "type": "input_video", "video_url": "https://arkdocs.tos-cn-beijing.volces.com/videos/advanced-usage/ark_vlm_video_input.mp4", "fps":1 } ], } ] ) print(response) ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/responses" ) func main() { client := arkruntime.NewClientWithApiKey( //通过 os.Getenv 从环境变量中获取 ARK_API_KEY os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) // 创建一个上下文,通常用于传递请求的上下文信息,如超时、取消等 ctx := context.Background() inputMessage := responses.InputItem{ OneOf: responses.NewItemEasyMessageInputItemSum( responses.ItemEasyMessage{ Role: responses.NewOptMessageRole(responses.MessageRoleUser), Content: responses.NewContentItemArrayMessageContent( []responses.ContentItem{ responses.ContentItem{OneOf: responses.NewContentItemVideoContentItemSum(responses.ContentItemVideo{Type: responses.ContentItemVideoTypeInputVideo, VideoURL: "https://arkdocs.tos-cn-beijing.volces.com/videos/advanced-usage/ark_vlm_video_input.mp4", Fps: responses.NewOptFloat64(1)})}, }, ), }, ), } resp, err := client.CreateResponses(ctx, &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", Input: responses.NewInputItemArrayResponsesInput([]responses.InputItem{inputMessage}), }) if err != nil { fmt.Printf("response error: %v\n", err) return } fmt.Println(resp) } ``` **选项:Java** ```Java package com.ark.example; import com.volcengine.ark.runtime.service.ArkService; import com.volcengine.ark.runtime.models.responses.*; public class demo { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); // 创建ArkService实例 ArkService arkService = ArkService.builder().apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); ResponsesRequest request = ResponsesRequest.builder() .model("doubao-seed-2-1-pro-260915") .input(ResponsesInput.ofList(java.util.Arrays.asList(ItemEasyMessage.builder().role(MessageRole.USER).content( MessageContent.ofList(java.util.Arrays.asList(ContentItemVideo.builder().videoUrl("https://arkdocs.tos-cn-beijing.volces.com/videos/advanced-usage/ark_vlm_video_input.mp4").fps(1D).build())) ).build()))) .build(); Response resp = arkService.createResponse(request); System.out.println(resp); arkService.shutdownExecutor(); } } ``` **选项:OpenAI SDK** ```Python import os from openai import OpenAI # 从环境变量中获取您的API KEY,配置方法见:https://ark.volcengine.com/region:cn-beijing/docs/quick-start api_key = os.getenv('ARK_API_KEY') client = OpenAI( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) response = client.responses.create( model="doubao-seed-2-1-pro-260915", input=[ { "role": "user", "content": [ { "type": "input_video", "video_url": "https://arkdocs.tos-cn-beijing.volces.com/videos/advanced-usage/ark_vlm_video_input.mp4", "fps":1 } ], } ] ) print(response) ```
    • 使用 Chat API 的示例代码如下:(可参见[控制视频理解的精细度](/docs/video-understanding#bf4d9224))
    **选项:Python SDK** ```Python import os # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark client = Ark( # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv('ARK_API_KEY'), ) completion = client.chat.completions.create( # Replace with Model ID . model = "doubao-seed-2-1-pro-260915", messages = [ { "role": "user", "content": [ { "type": "video_url", "video_url": { # Replace the link with your actual video link "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/advanced-usage/ark_vlm_video_input.mp4", "fps": 1 } }, ], } ], ) print(completion.choices[0].message.content) ``` # 使用场景 ## 控制视频理解的精细度 您可通过 **fps** 字段,控制从视频中抽取图像的频率,默认为1,即每秒从视频中抽取一帧图像,输入给模型进行视觉理解。 可通过 **fps** 字段,控制模型对于视频中图像变化的敏感度。 * 当视频画面变化剧烈或需关注画面变化,如计算视频中角色动作次数,可调高 **fps** 设置(最高 `5`),防止抽帧频率低导致误判。 * 当视频画面变化不频繁或无需关注画面变化,如画面中人数,可调低 **fps** (最低`0.2`),可提升处理速度,节省 token 用量。 示例代码如下: **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "messages": [ { "role": "user", "content": [ {"type": "video_url","video_url": {"url": "https://arkdocs.tos-cn-beijing.volces.com/videos/advanced-usage/ark_vlm_video_input.mp4", "fps": 2}}, {"type": "text", "text": "What is in the video?"} ] } ], "max_tokens": 300 }' ``` * 按需替换 Model ID,查询 Model ID 参见 [模型列表](/docs/model-list)。 **选项:Python** ```Python import os # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark client = Ark( # The base URL for model invocation . base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv('ARK_API_KEY'), ) completion = client.chat.completions.create( # Replace with Model ID . model = "doubao-seed-2-1-pro-260915", messages=[ { # 消息角色为用户 "role": "user", "content": [ { "type": "video_url", "video_url": { # 替换链接为实际视频链接 "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/advanced-usage/ark_vlm_video_input.mp4", "fps": 2, # 每秒截取2帧画面,用于视频理解 } }, # 文本类型的消息内容,询问视频里有什么 {"type": "text", "text": "What's in the video?"}, ], } ], ) print(completion.choices[0]) ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/chat" ) func main() { client := arkruntime.NewClientWithApiKey( //Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey os.Getenv("ARK_API_KEY"), // The base URL for model invocation . arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) // 创建一个上下文,通常用于传递请求的上下文信息,如超时、取消等 ctx := context.Background() // 构建消息内容 contentParts := []chat.ChatCompletionContentPart{ chat.ChatCompletionContentPart{OneOf: chat.NewChatCompletionContentPartVideoChatCompletionContentPartSum(chat.ChatCompletionContentPartVideo{Type: chat.ChatCompletionContentPartVideoTypeVideoURL, VideoURL: chat.ChatCompletionContentPartVideoVideoUrl{URL: chat.NewOptString("https://arkdocs.tos-cn-beijing.volces.com/videos/advanced-usage/ark_vlm_video_input.mp4"), Fps: chat.NewOptFloat64(2)}})}, chat.ChatCompletionContentPart{OneOf: chat.NewChatCompletionContentPartTextChatCompletionContentPartSum(chat.ChatCompletionContentPartText{Type: chat.ChatCompletionContentPartTextTypeText, Text: "What's in the video?"})}, } // 构建聊天完成请求,设置请求的模型和消息内容 req := &chat.ChatCompletionRequest{ // Replace with Model ID Model: "doubao-seed-2-1-pro-260915", Messages: []chat.ChatCompletionRequestMessage{ chat.ChatCompletionRequestMessage{OneOf: chat.NewChatCompletionRequestUserMessageChatCompletionRequestMessageSum(chat.ChatCompletionRequestUserMessage{Role: chat.ChatCompletionRequestUserMessageRoleUser, Content: chat.NewOptNilChatCompletionMessageContent(chat.NewChatCompletionContentPartArrayChatCompletionMessageContent(contentParts))})}, }, MaxTokens: chat.NewOptInt32(int32(300)), // 设置模型输出最大 token 数 } // 发送聊天完成请求,并将结果存储在 resp 中,将可能出现的错误存储在 err 中 resp, err := client.CreateChatCompletion(ctx, req) if err!= nil { // 若出现错误,打印错误信息并终止程序 fmt.Printf("standard chat error: %v\n", err) return } // 打印聊天完成请求的响应结果 fmt.Println(resp.Choices[0].Message.Content) } ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.chat.*; import com.volcengine.ark.runtime.models.chat.ChatCompletionContentPart.*; import com.volcengine.ark.runtime.service.ArkService; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; public class VideoSample { static String apiKey = System.getenv("ARK_API_KEY"); static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); static Dispatcher dispatcher = new Dispatcher(); static ArkService service = ArkService.builder() .dispatcher(dispatcher) .connectionPool(connectionPool) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation . .apiKey(apiKey) //Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey .build(); public static void main(String[] args) throws Exception { List messagesForReqList = new ArrayList<>(); // 构建消息内容 List contentParts = new ArrayList<>(); contentParts.add(ChatCompletionContentPartVideo.builder() .type(ChatCompletionContentPartType.VIDEO_URL) .videoUrl(ChatCompletionContentPartVideoVideoUrl.builder().url("https://arkdocs.tos-cn-beijing.volces.com/videos/advanced-usage/ark_vlm_video_input.mp4").fps(2.0).build()) .build()); contentParts.add(ChatCompletionContentPartText.builder() .type(ChatCompletionContentPartType.TEXT) .text("What's in the video?") .build()); // 创建消息 messagesForReqList.add(ChatCompletionRequestUserMessage.builder() .role(ChatCompletionRequestMessageType.USER) .content(ChatCompletionMessageContent.ofList(contentParts)) .build()); ChatCompletionRequest req = ChatCompletionRequest.builder() .model("doubao-seed-2-1-pro-260915") //Replace with Model ID . .messages(messagesForReqList) .maxTokens(300) .build(); service.createChatCompletion(req) .getChoices() .forEach(choice -> System.out.println(choice.getMessage().getContent())); // shutdown service after all requests are finished service.shutdownExecutor(); } } ``` ## 感知视频时序 视频理解可理解视频时间和图像关系信息,如回答事件发生什么时间点,在哪些时间发生了某事件等和时间相关的信息,原理见 [视频理解工作原理](/docs/video-understanding#b5f696d3)。 下面是简单示例代码 **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "messages": [ { "role": "user", "content": [ {"type": "video_url","video_url": {"url": "https://arkdocs.tos-cn-beijing.volces.com/videos/advanced-usage/video-understanding.mp4", "fps": 5}}, {"type": "text", "text": "裁判什么时间点出现的?"} ] } ], "max_tokens": 300 }' ``` * 按需替换 Model ID,查询 Model ID 参见 [模型列表](/docs/model-list)。 **选项:Python** ```Python import os # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark client = Ark( # The base URL for model invocation . base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv('ARK_API_KEY'), ) completion = client.chat.completions.create( # Replace with Model ID . model = "doubao-seed-2-1-pro-260915", messages=[ { # 消息角色为用户 "role": "user", "content": [ { "type": "video_url", "video_url": { # 替换链接为实际视频链接 "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/advanced-usage/video-understanding.mp4", "fps": 5, # 每秒截取5帧画面,用于视频理解 } }, # 文本类型的消息内容,询问视频里有什么 {"type": "text", "text": "裁判什么时间点出现的?"}, ], } ], ) print(completion.choices[0]) ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/chat" ) func main() { client := arkruntime.NewClientWithApiKey( // Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey os.Getenv("ARK_API_KEY"), // The base URL for model invocation . arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) // 创建一个上下文,通常用于传递请求的上下文信息,如超时、取消等 ctx := context.Background() // 构建消息内容 contentParts := []chat.ChatCompletionContentPart{ chat.ChatCompletionContentPart{OneOf: chat.NewChatCompletionContentPartVideoChatCompletionContentPartSum(chat.ChatCompletionContentPartVideo{Type: chat.ChatCompletionContentPartVideoTypeVideoURL, VideoURL: chat.ChatCompletionContentPartVideoVideoUrl{URL: chat.NewOptString("https://arkdocs.tos-cn-beijing.volces.com/videos/advanced-usage/video-understanding.mp4"), Fps: chat.NewOptFloat64(5)}})}, chat.ChatCompletionContentPart{OneOf: chat.NewChatCompletionContentPartTextChatCompletionContentPartSum(chat.ChatCompletionContentPartText{Type: chat.ChatCompletionContentPartTextTypeText, Text: "裁判什么时间点出现的?"})}, } // 构建聊天完成请求,设置请求的模型和消息内容 req := &chat.ChatCompletionRequest{ // Replace with Model ID Model: "doubao-seed-2-1-pro-260915", Messages: []chat.ChatCompletionRequestMessage{ chat.ChatCompletionRequestMessage{OneOf: chat.NewChatCompletionRequestUserMessageChatCompletionRequestMessageSum(chat.ChatCompletionRequestUserMessage{Role: chat.ChatCompletionRequestUserMessageRoleUser, Content: chat.NewOptNilChatCompletionMessageContent(chat.NewChatCompletionContentPartArrayChatCompletionMessageContent(contentParts))})}, }, MaxTokens: chat.NewOptInt32(int32(300)), // 设置模型输出最大 token 数 } // 发送聊天完成请求,并将结果存储在 resp 中,将可能出现的错误存储在 err 中 resp, err := client.CreateChatCompletion(ctx, req) if err!= nil { // 若出现错误,打印错误信息并终止程序 fmt.Printf("standard chat error: %v\n", err) return } // 打印聊天完成请求的响应结果 fmt.Println(resp.Choices[0].Message.Content) } ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.chat.*; import com.volcengine.ark.runtime.models.chat.ChatCompletionContentPart.*; import com.volcengine.ark.runtime.service.ArkService; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; public class VideoSample { static String apiKey = System.getenv("ARK_API_KEY"); static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); static Dispatcher dispatcher = new Dispatcher(); static ArkService service = ArkService.builder() .dispatcher(dispatcher) .connectionPool(connectionPool) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation . .apiKey(apiKey) //Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey .build(); public static void main(String[] args) throws Exception { List messagesForReqList = new ArrayList<>(); // 构建消息内容 List contentParts = new ArrayList<>(); contentParts.add(ChatCompletionContentPartVideo.builder() .type(ChatCompletionContentPartType.VIDEO_URL) .videoUrl(ChatCompletionContentPartVideoVideoUrl.builder().url("https://arkdocs.tos-cn-beijing.volces.com/videos/advanced-usage/video-understanding.mp4").fps(5.0).build()) .build()); contentParts.add(ChatCompletionContentPartText.builder() .type(ChatCompletionContentPartType.TEXT) .text("裁判什么时间点出现的?") .build()); // 创建消息 messagesForReqList.add(ChatCompletionRequestUserMessage.builder() .role(ChatCompletionRequestMessageType.USER) .content(ChatCompletionMessageContent.ofList(contentParts)) .build()); ChatCompletionRequest req = ChatCompletionRequest.builder() .model("doubao-seed-2-1-pro-260915") //Replace with Model ID . .messages(messagesForReqList) .maxTokens(300) .build(); service.createChatCompletion(req) .getChoices() .forEach(choice -> System.out.println(choice.getMessage().getContent())); // shutdown service after all requests are finished service.shutdownExecutor(); } } ``` 回复预览 ```Plaintext 根据视频描述,裁判在**3.7秒**左右出现。此时,画面中两位拳击手(左为黑T恤红短裤、右为白T恤黑短裤)原本处于对峙状态,随后裁判(穿着黑色西装、戴白手套)站到两人中间,似乎在准备开始比赛或暂停当前回合,观众仍在背景中欢呼。 ``` ## 流式输出 流式输出支持内容动态实时呈现,既能够缓解用户等待焦虑,又可以规避复杂任务因长时间推理引发的客户端超时失败问题,保障请求流程顺畅。 **选项:Python SDK** ```Python import asyncio import os from arkruntime import AsyncArk from arkruntime.types.responses.response_completed_event import ResponseCompletedEvent from arkruntime.types.responses.response_reasoning_summary_text_delta_event import ResponseReasoningSummaryTextDeltaEvent from arkruntime.types.responses.response_output_item_added_event import ResponseOutputItemAddedEvent from arkruntime.types.responses.response_text_delta_event import ResponseTextDeltaEvent from arkruntime.types.responses.response_text_done_event import ResponseTextDoneEvent client = AsyncArk( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=os.getenv('ARK_API_KEY') ) async def main(): # upload video file print("Upload video file") file = await client.files.create( # replace with your local video path file=open("/Users/doc/demo.mp4", "rb"), purpose="user_data", preprocess_configs={ "video": { "model": "doubao-seed-2-1-pro-260915", "fps": 0.3, # define the sampling fps of the video, default is 1.0 } } ) print(f"File uploaded: {file.id}") # Wait for the file to finish processing await client.files.wait_for_processing(file.id) print(f"File processed: {file.id}") stream = await client.responses.create( model="doubao-seed-2-1-pro-260915", input=[ {"role": "user", "content": [ { "type": "input_video", "file_id": file.id # ref video file id }, { "type": "input_text", "text": "请你描述下视频中的人物的一系列动作,以JSON格式输出开始时间(start_time)、结束时间(end_time)、事件(event)、是否危险(danger),请使用HH:mm:ss表示时间戳。" } ]}, ], caching={ "type": "enabled", }, store=True, stream=True ) async for event in stream: if isinstance(event, ResponseReasoningSummaryTextDeltaEvent): print(event.delta, end="") if isinstance(event, ResponseOutputItemAddedEvent): print("\noutPutItem " + event.type + " start:") if isinstance(event, ResponseTextDeltaEvent): print(event.delta,end="") if isinstance(event, ResponseTextDoneEvent): print("\noutPutTextDone.") if isinstance(event, ResponseCompletedEvent): print("Response Completed. Usage = " + event.response.usage.model_dump_json()) if __name__ == "__main__": asyncio.run(main()) ``` **选项:Go SDK** ```Go package main import ( "context" "fmt" "io" "os" "time" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/file" "github.com/volcengine/ark-runtime-go/arkruntime/model/responses" ) func main() { client := arkruntime.NewClientWithApiKey( // Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() fmt.Println("----- upload video data -----") data, err := os.Open("/Users/doc/demo.mp4") if err != nil { fmt.Printf("read file error: %v\n", err) return } fileInfo, err := client.UploadFile(ctx, &file.FileCreateRequest{ Purpose: file.PurposeUserData, PreprocessConfigs: file.NewOptPreprocessConfigs(file.PreprocessConfigs{ Video: file.NewOptVideo(file.Video{ Model: file.NewOptString("doubao-seed-2-1-pro-260915"), Fps: file.NewOptFloat64(0.3), }), }), }, data) if err != nil { fmt.Printf("upload file error: %v", err) return } // Wait for the file to finish processing for fileInfo.Status == file.StatusProcessing { fmt.Println("Waiting for video to be processed...") time.Sleep(2 * time.Second) fileInfo, err = client.RetrieveFile(ctx, fileInfo.ID) // update file info if err != nil { fmt.Printf("get file status error: %v", err) return } } fmt.Printf("Video processing completed: %s, status: %s\n", fileInfo.ID, fileInfo.Status) inputMessage := responses.InputItem{ OneOf: responses.NewItemEasyMessageInputItemSum( responses.ItemEasyMessage{ Role: responses.NewOptMessageRole(responses.MessageRoleUser), Content: responses.NewContentItemArrayMessageContent( []responses.ContentItem{ responses.ContentItem{OneOf: responses.NewContentItemVideoContentItemSum(responses.ContentItemVideo{Type: responses.ContentItemVideoTypeInputVideo, VideoURL: "", FileID: responses.NewOptString(fileInfo.ID)})}, responses.ContentItem{OneOf: responses.NewContentItemTextContentItemSum(responses.ContentItemText{Type: responses.ContentItemTextTypeInputText, Text: "请你描述下视频中的人物的一系列动作,以JSON格式输出开始时间(start_time)、结束时间(end_time)、事件(event)、是否危险(danger),请使用HH:mm:ss表示时间戳。"})}, }, ), }, ), } createResponsesReq := &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", Input: responses.NewInputItemArrayResponsesInput([]responses.InputItem{inputMessage}), } resp, err := client.CreateResponsesStream(ctx, createResponsesReq) if err != nil { fmt.Printf("stream error: %v\n", err) return } var responseId string for { event, err := resp.Recv() if err == io.EOF { break } if err != nil { fmt.Printf("stream error: %v\n", err) return } handleEvent(event) if event.OneOf.Type == responses.ResponseCreatedEventResponseStreamEventSum { responseId = event.OneOf.ResponseCreatedEvent.Response.ID fmt.Printf("Response ID: %s", responseId) } } } func handleEvent(event *responses.ResponseStreamEvent) { switch event.OneOf.Type { case responses.ResponseReasoningSummaryTextDeltaEventResponseStreamEventSum: print(event.OneOf.ResponseReasoningSummaryTextDeltaEvent.Delta.Or("")) case responses.ResponseReasoningSummaryTextDoneEventResponseStreamEventSum: fmt.Printf("\nAggregated reasoning text: %s\n", event.OneOf.ResponseReasoningSummaryTextDoneEvent.Text.Or("")) case responses.ResponseTextDeltaEventResponseStreamEventSum: print(event.OneOf.ResponseTextDeltaEvent.Delta.Or("")) case responses.ResponseTextDoneEventResponseStreamEventSum: fmt.Printf("\nAggregated output text: %s\n", event.OneOf.ResponseTextDoneEvent.Text.Or("")) } } ``` **选项:Java SDK** ```Java package com.ark.example; import com.volcengine.ark.runtime.models.file.*; import com.volcengine.ark.runtime.service.ArkService; import com.volcengine.ark.runtime.models.responses.*; import java.io.File; import java.util.concurrent.TimeUnit; public class demo { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); ArkService service = ArkService.builder().apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); System.out.println("===== Upload File Example====="); // upload a video for responses FileObject fileMeta; fileMeta = service.uploadFile(FileCreateRequest.builder() // replace with your video file path .purpose(Purpose.USER_DATA) .preprocessConfigs(PreprocessConfigs.builder().video(Video.builder().model("doubao-seed-2-1-pro-260915").fps(0.3).build()).build()) .build(), new File("/Users/doc/demo.mp4")); System.out.println("Uploaded file Meta: " + fileMeta); System.out.println("status:" + fileMeta.getStatus()); try { while ("processing".equalsIgnoreCase(fileMeta.getStatus().toString())) { System.out.println("Waiting for video to be processed..."); TimeUnit.SECONDS.sleep(2); fileMeta = service.retrieveFile(fileMeta.getId()); } } catch (Exception e) { System.err.println("get file status error:" + e.getMessage()); } System.out.println("Uploaded file Meta: " + fileMeta); ResponsesRequest request = ResponsesRequest.builder() .model("doubao-seed-2-1-pro-260915") .stream(true) .input(ResponsesInput.ofList(java.util.Arrays.asList(ItemEasyMessage.builder().role(MessageRole.USER).content( MessageContent.ofList(java.util.Arrays.asList(ContentItemVideo.builder().fileId(fileMeta.getId()).build(), ContentItemText.builder().text("请你描述下视频中的人物的一系列动作,以JSON格式输出开始时间(start_time)、结束时间(end_time)、事件(event)、是否危险(danger),请使用HH:mm:ss表示时间戳。").build())) ).build()))) .build(); service.streamResponse(request) .doOnError(Throwable::printStackTrace) .blockingForEach(event -> { if (event instanceof ResponseReasoningSummaryTextDeltaEvent) { System.out.print(((ResponseReasoningSummaryTextDeltaEvent) event).getDelta()); } if (event instanceof ResponseOutputItemAddedEvent) { System.out.println("\nOutputItem " + (((ResponseOutputItemAddedEvent) event).getItem().getType()) + " Start: "); } if (event instanceof ResponseTextDeltaEvent) { System.out.print(((ResponseTextDeltaEvent) event).getDelta()); } if (event instanceof ResponseTextDoneEvent) { System.out.println("\nOutputText End."); } if (event instanceof ResponseOutputItemDoneEvent) { System.out.println("\nOutputItem " + ((ResponseOutputItemDoneEvent) event).getItem().getType() + " End."); } if (event instanceof ResponseFunctionCallArgumentsDoneEvent) { System.out.println("\nFunctionCall Arguments: " + ((ResponseFunctionCallArgumentsDoneEvent) event).getArguments()); } if (event instanceof ResponseCompletedEvent) { System.out.println("\nResponse Completed. Usage = " + ((ResponseCompletedEvent) event).getResponse().getUsage()); } }); service.shutdownExecutor(); } } ``` **选项:兼容 OpenAI SDK** ```Python import os import time from openai import OpenAI api_key = os.getenv('ARK_API_KEY') client = OpenAI( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) file = client.files.create( file=open("/Users/doc/demo.mp4", "rb"), purpose="user_data", extra_body={ "preprocess_configs": { "video": { "model": "doubao-seed-2-1-pro-260915", "fps": 0.3, } } }, ) # Wait for the file to finish processing while (file.status == "processing"): time.sleep(2) file = client.files.retrieve(file.id) print(f"File processed: {file}") response = client.responses.create( model="doubao-seed-2-1-pro-260915", input=[ { "role": "user", "content": [ { "type": "input_video", "file_id": file.id, }, { "type": "input_text", "text": "请你描述下视频中的人物的一系列动作,以JSON格式输出开始时间(start_time)、结束时间(end_time)、事件(event)、是否危险(danger),请使用HH:mm:ss表示时间戳。", }, ] } ], stream=True ) for event in response: if event.type == "response.reasoning_summary_text.delta": print(event.delta, end="") if event.type == "response.output_item.added": print("\noutPutItem " + event.type + " start:") if event.type == "response.output_text.delta": print(event.delta,end="") if event.type == "response.output_item.done": print("\noutPutTextDone.") if event.type == "response.completed": print("\nResponse Completed. Usage = " + event.response.usage.model_dump_json()) ``` # 使用说明 > **说明** > > 处理完图片/视频后,文件会从方舟服务器删除。方舟不会保留您提交的图片、视频以及文本信息等用户数据来训练模型。 ## 时序信息 基于 FPS 的抽帧获取视频关键帧,再通过`时间戳+图像`拼接标记时序信息,模型基于该请求中的时序标记和图像内容,实现对视频的完整理解(包括内容变化、动作逻辑、时序关联等)。 详细原理见 [视频理解工作原理](/docs/video-understanding#b5f696d3)。 ## 视频格式说明 |**视频格式** |**文件扩展名** |**内容格式** **Content Type** | |---|---|---| |MP4 |.mp4 |`video/mp4` | |AVI |.avi |`video/x-msvideo` | |MOV |.mov |`video/quicktime` | > 视频文件格式变种较多,不能保证所有文件都能被识别,请通过测试验证文件能够被正常识别。 > **说明** > > * 常见问题及解决方案参见[支持 TS 格式的视频文件吗?](/docs/modelark-faq#85251eec) > > * 上传视频至对象存储时设置,详情请参见 [文档](https://docs.volcengine.com/docs/TorchObjectStorage/Managingobjectmetadata?lang=zh#.6K6-572u5paH5Lu25YWD5pWw5o2u)。 > * 传入 Base64 编码时使用:[Base64 编码输入](/docs/video-understanding#22314028)。 > * 视频格式需小写。 ## 视频文件容量 * 使用 URL 方式传入视频,视频文件不能超过 50MB。 * 使用 Base64 编码传入视频,视频文件不能超过 50MB,请求体不能超过 64MB。 * 使用 Files API 上传视频,文件存储在方舟平台托管的默认存储空间中时,支持最大 512 MB 文件的上传;文件存储在火山引擎对象存储 TOS Bucket 中时,支持最大 2 GB 的视频文件的上传,从而满足大文件处理需求。 ## **支持音频理解** 部分模型支持对视频文件中的音频信息进行理解,详见[视频内嵌音频输入](/docs/audio-understanding#0a9900d2)。 ## **抽帧策略** 用量说明:单视频最大 token 用量为 80k,单次请求视频最大 token 量还受模型的最大上下文窗口以及最大输入长度(当启用深度思考模式)限制,超出则需调整传入视频数量或视频长度。 基本概念: * 帧图像:某个时刻的视频画面,本文特指输入给模型的帧图像 * 帧图像张数:视频时长 * **fps** 方舟会根据帧图像张数,对帧图像进行压缩,以平衡视频的理解精度和 token 用量。 不同模型的抽帧策略不同,具体如下: |抽帧策略 |doubao-seed-2.0 及后续模型 | |---|---| |单帧 tokens |* `max_frame_tokens`:单帧最大 tokens 数,用于控制单帧质量的上限。 | \ | |* `min_frame_tokens`:单帧最小 tokens 数,用于控制单帧压缩的下限,支持 tokens 在 `[64, 384]` 区间内连续动态调整,默认值为 384。 | |单帧对应的max_pixels |单帧最大 tokens * 42 * 42 | \ | |[11w, 67w] | |抽帧数 |* 抽帧数范围:[16帧, 1280帧]。 | \ | |```Bash | \ | |# 最大抽帧数 | \ | |80×1024 token ÷ 64 token/帧 = 1280 帧 | \ | |``` | \ | |* `min_frames`:最小抽帧数,默认值为 16。若按 `fps` 计算的抽帧总数小于 16,则优先按 16 帧处理。 | |视频最大 tokens |`max_video_tokens`:单个视频所有抽取帧的 tokens 总数上限,默认值为 81920(80 × 1024)。 | |抽帧方案 |说明 | \ | |* 建议评估输出效果,按需调整fps字段配置或视频时长。 | \ | |* 如果视频二进制数据中未包含帧数编码信息,会按 fps 均匀抽帧。单次请求视频最大 Token 量如果超过模型最大输入长度则会报错;未超过则不报错,但视频输入的 token 可能会超过 80k。 | | |* fps 过高或视频长度过长:处理的帧图像数量超出1280帧,则按帧图像64tokens,时间间隔 `视频时长/1280`,均匀抽取1280帧。 | \ | |* fps 过小或视频长度过短:处理的帧图像数量不足16帧时抽取方案如下: | \ | | * 视频总帧数 >= 16帧,均匀抽取16帧。 | \ | | * 视频总帧数 < 16帧,抽取视频所有帧。 | # 视频理解工作原理 视频处理的核心方式为 “帧与时间戳的结构化拼接”,具体规则如下: * 对视频抽帧得到的每帧图像,在其前插入时间戳文本。 * `doubao-seed-2.0` 及后续模型:时间戳格式为 `<时间戳> second`。例如:`4.0 second`、`4.5 second`。 * `doubao-seed-2.0` 之前模型:时间戳格式为 `[<时间戳> second]`。例如:`[4.0 second]`、`[4.5 second]`。 * 拼接后形成“时间戳+图像”的有序序列,模型通过该序列理解视频的时序逻辑和内容变化。 ## 抽帧逻辑举例 | |FPS 1 |FPS 0.5 |FPS 2 | |---|---|---|---| |时间戳 |0.0 second |0.0 second |0.0 second | |视频帧 |`` |`` |`` | |时间戳 |1.0 second |2.0 second |0.5 second | |视频帧 |`` |`` |`` | |时间戳 |2.0 second |4.0 second |1.0 second | |视频帧 |`` |`` |`` | |时间戳 |3.0 second | |1.5 second | |视频帧 |`` | |`` | |时间戳 |4.0 second | |2.0 second | |视频帧 |`` | |`` | |时间戳 |5.0 second | |2.5 second | |视频帧 |`` | |`` | |时间戳 | | |3.0 second | |视频帧 | | |`` | |时间戳 | | |3.5 second | |视频帧 | | |`` | |时间戳 | | |4.0 second | |视频帧 | | |`` | |时间戳 | | |4.5 second | |视频帧 | | |`` | |时间戳 | | |5.0 second | |视频帧 | | |`` | | |*共6帧* |*共3帧* |*共11帧* | ## 多图请求等效 视频理解请求等效于下面示例的多图理解请求。 ```JSON { "model": "doubao-seed-2-1-pro-260915", "messages": [ { "role": "user", "content": [ { "type":"text", "text":"你觉得这个恐怖吗?" }, { "type":"text", "text":"0.0 second" }, { "type":"image_url", "image_url":{ "url":""} }, { "type":"text", "text":"1.0 second" }, { "type":"image_url", "image_url":{ "url":""} }, { "type":"text", "text":"2.0 second" }, { "type":"image_url", "image_url":{ "url":""} }, { "type":"text", "text":"3.0 second" }, { "type":"image_url", "image_url":{ "url":""} }, { "type":"text", "text":"4.0 second" }, { "type":"image_url", "image_url":{ "url":""} }, { "type":"text", "text":"5.0 second" }, { "type":"image_url", "image_url":{ "url":""} } ] } ] } ``` --- # 文档理解 Source: https://ark.volcengine.com/region:cn-beijing/docs/document-understanding 部分模型支持处理PDF格式的文档,会通过视觉功能来理解整个文档的上下文。当传入PDF文档时,大模型会将文件分页处理成多图,然后分析解读对应的文本、图片等信息,并结合这些信息完成文档理解相关任务。 > **说明** > > 方舟平台的新用户?获取 API Key 及 开通模型等准备工作,请参见 [快速入门](/docs/quick-start)。 # 支持模型 请参见[视觉理解能力](/docs/model-list#76df97c8)。 # API 接口 * [Responses API](/docs/create-model-responses-api):支持 PDF 文档作为输入进行分析。支持通过 `file_id` 方式进行文档理解,使用方式参见[Files API 上传(推荐)](/docs/document-understanding#d6d033c5)。 * [Chat API](/docs/chat-api):支持 PDF 文档作为输入进行分析。支持通过 `file_id` 方式进行文档理解,使用方式参见[Files API 上传(推荐)](/docs/document-understanding#d6d033c5)。 # 文档输入方式 支持文档传入方式如下: * 本地文件上传: * [Files API 上传(推荐)](/docs/document-understanding#d6d033c5):直接传入本地文件路径,文件大小不能超过 512 MB。 * [Base64 编码传入](/docs/document-understanding#8160343d):适用于文件体积较小的场景,文件小于 50 MB,请求体不能超过 64 MB。 * [文件 URL 传入](/docs/document-understanding#69145d66):适用于文件已存在公网可访问 URL 的场景,文件大小不能超过 50 MB。 ## 本地文件上传 ### Files API 上传(推荐) 建议优先使用 Files API 上传本地文件,不仅可以支持最大 512MB 文件的处理,还可以避免请求时重新上传内容,减少预处理导致的时延,同时可在多次请求中重复使用,节省公网下载时延。上传成功并待文件状态变为 `active` 后,Responses API 和 Chat API 均支持通过 `file_id` 方式传入 PDF 文档。其中文件预处理的原理,参见[附:文件预处理](/docs/document-understanding#dbf9c161)。 > * 该方式上传的文件默认存储 7 天,存储有效期取值范围为1-30天。 > * 如果需要实时获取分析内容,或者要规避复杂任务引发的客户端超时失败问题,可采用流式输出的方式,具体示例见[流式输出](/docs/document-understanding#8e18e610)。
    • Responses API 示例代码:
    **选项:Curl** 1. 上传PDF文件获取File ID。 ```Bash curl https://ark.cn-beijing.volces.com/api/v3/files \ -H "Authorization: Bearer $ARK_API_KEY" \ -F 'purpose=user_data' \ -F 'file=@/Users/doc/demo.pdf' ``` 2. 在Responses API中引用File ID。 ```Bash curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Authorization: Bearer $ARK_API_KEY" \ -H 'Content-Type: application/json' \ -d '{ "model": "doubao-seed-2-1-pro-260915", "input": [ { "role": "user", "content": [ { "type": "input_file", "file_id": "file-20251018****" }, { "type": "input_text", "text": "按段落给出文档中的文字内容,以JSON格式输出,包括段落类型(type)、文字内容(content)信息。" } ] } ] }' ``` **选项:Python** ```Python import os from pathlib import Path from arkruntime import Ark client = Ark( base_url="https://ark.cn-beijing.volces.com/api/v3", api_key=os.environ.get("ARK_API_KEY"), ) file_path = Path(os.getenv("FILE_PATH", "/Users/doc/demo.pdf")) uploaded_file = client.files.create(file=file_path, purpose="user_data") client.files.wait_for_processing(uploaded_file.id) response = client.responses.create( model=os.getenv("MODEL_ID", "doubao-seed-2-1-pro-260915"), input=[ { "role": "user", "content": [ {"type": "input_file", "file_id": uploaded_file.id}, {"type": "input_text", "text": "按段落给出文档中的文字内容,以JSON格式输出,包括段落类型(type)、文字内容(content)信息。"}, ], } ], ) print(response) ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/file" "github.com/volcengine/ark-runtime-go/arkruntime/model/responses" ) func main() { ctx := context.Background() client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) filePath := os.Getenv("FILE_PATH") if filePath == "" { filePath = "/Users/doc/demo.pdf" } data, err := os.Open(filePath) if err != nil { panic(err) } defer data.Close() uploaded, err := client.UploadFile(ctx, &file.FileCreateRequest{ Purpose: file.PurposeUserData, }, data) if err != nil { panic(err) } uploaded, err = client.WaitForFileProcessing( ctx, uploaded.ID, arkruntime.WaitForFileProcessingOptions{}, ) if err != nil || uploaded.Status != file.StatusActive { panic(fmt.Sprintf("file processing failed: %v, status=%s", err, uploaded.Status)) } media := responses.ContentItem{OneOf: responses.NewContentItemFileContentItemSum(responses.ContentItemFile{Type: responses.ContentItemFileTypeInputFile, FileID: responses.NewOptString(uploaded.ID)})} text := responses.ContentItem{OneOf: responses.NewContentItemTextContentItemSum( responses.ContentItemText{Type: responses.ContentItemTextTypeInputText, Text: "按段落给出文档中的文字内容,以JSON格式输出,包括段落类型(type)、文字内容(content)信息。"}, )} message := responses.InputItem{OneOf: responses.NewItemEasyMessageInputItemSum( responses.ItemEasyMessage{ Role: responses.NewOptMessageRole(responses.MessageRoleUser), Content: responses.NewContentItemArrayMessageContent([]responses.ContentItem{media, text}), }, )} modelID := os.Getenv("MODEL_ID") if modelID == "" { modelID = "doubao-seed-2-1-pro-260915" } response, err := client.CreateResponses(ctx, &responses.ResponsesRequest{ Model: modelID, Input: responses.NewInputItemArrayResponsesInput([]responses.InputItem{message}), }) if err != nil { panic(err) } fmt.Println(response) } ``` **选项:Java** ```Java import com.volcengine.ark.runtime.models.file.*; import com.volcengine.ark.runtime.models.responses.*; import com.volcengine.ark.runtime.service.ArkService; import java.io.File; import java.util.Arrays; public class Main { public static void main(String[] args) { ArkService service = ArkService.builder() .apiKey(System.getenv("ARK_API_KEY")) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); String filePath = System.getenv().getOrDefault("FILE_PATH", "/Users/doc/demo.pdf"); String modelId = System.getenv().getOrDefault("MODEL_ID", "doubao-seed-2-1-pro-260915"); FileObject uploaded = service.uploadFile( FileCreateRequest.builder() .purpose(Purpose.USER_DATA) .build(), new File(filePath) ); uploaded = service.waitForFileProcessing(uploaded.getId()); if (uploaded.getStatus() != Status.ACTIVE) { throw new IllegalStateException("File processing failed: " + uploaded.getStatus()); } ContentItem media = ContentItemFile.builder().type(ContentItemType.INPUT_FILE).fileId(uploaded.getId()).build(); ContentItem text = ContentItemText.builder() .type(ContentItemType.INPUT_TEXT) .text("按段落给出文档中的文字内容,以JSON格式输出,包括段落类型(type)、文字内容(content)信息。") .build(); ResponsesRequest request = ResponsesRequest.builder() .model(modelId) .input(ResponsesInput.ofList(Arrays.asList( ItemEasyMessage.builder() .role(MessageRole.USER) .content(MessageContent.ofList(Arrays.asList(media, text))) .build() ))) .build(); Response response = service.createResponse(request); System.out.println(response); service.shutdownExecutor(); } } ``` **选项:OpenAI SDK** ```Python import os import time from openai import OpenAI api_key = os.getenv('ARK_API_KEY') client = OpenAI( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) file = client.files.create( file=open("/Users/doc/demo.pdf", "rb"), purpose="user_data" ) # Wait for the file to finish processing while (file.status == "processing"): time.sleep(2) file = client.files.retrieve(file.id) print(f"File processed: {file}") response = client.responses.create( model="doubao-seed-2-1-pro-260915", input=[ { "role": "user", "content": [ { "type": "input_file", "file_id": file.id, }, { "type": "input_text", "text": "按段落给出文档中的文字内容,以JSON格式输出,包括段落类型(type)、文字内容(content)信息。", }, ] } ] ) print(response) ``` 输出示例: ``` { "text": [ { "type": "heading", "content": "1 Introduction" }, { "type": "paragraph", "content": "Diffusion models [3–5] learn to reverse a process that incrementally corrupts data with noise, effectively decomposing a complex distribution into a hierarchy of simplified representations. This coarse-to-fine generative approach has proven remarkably successful across a wide range of applications, including image and video synthesis [6] as well as solving complex challenges in natural sciences [7]." }, ... { "type": "heading", "content": "3 Seed Diffusion" }, { "type": "paragraph", "content": "As the first experimental model in our Seed Diffusion series, Seed Diffusion Preview is specifically focused on code generation, thus adopting the data pipeline (code/code-related data only) and processing methodology of the open-sourced Seed Coder project [20]. The architecture is a standard dense Transformer, and we intentionally omit complex components such as LongCoT reasoning in this initial version to first establish a strong and efficient performance baseline. This section introduces its key components and training strategies." } ] } ```
    • Chat API 示例代码:
    **选项:Curl** 1. 上传 PDF 文件获取 File ID。 ```Bash curl https://ark.cn-beijing.volces.com/api/v3/files \ -H "Authorization: Bearer $ARK_API_KEY" \ -F 'purpose=user_data' \ -F 'file=@/Users/doc/demo.pdf' ``` 2. 在 Chat API 中引用 File ID。 ```Bash curl https://ark.cn-beijing.volces.com/api/v3/chat/completions \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "messages": [ { "role": "user", "content": [ { "type": "file", "file": { "file_id": "file-20251018****" } }, { "type": "text", "text": "按段落给出文档中的文字内容,以JSON格式输出,包括段落类型(type)、文字内容(content)信息。" } ] } ] }' ``` **选项:Python** ```Python import os from pathlib import Path from arkruntime import Ark client = Ark( base_url="https://ark.cn-beijing.volces.com/api/v3", api_key=os.environ.get("ARK_API_KEY"), ) file_path = Path(os.getenv("FILE_PATH", "/Users/doc/demo.pdf")) uploaded_file = client.files.create( file=file_path, purpose="user_data", ) client.files.wait_for_processing(uploaded_file.id) completion = client.chat.completions.create( model=os.getenv("MODEL_ID", "doubao-seed-2-1-pro-260915"), messages=[ { "role": "user", "content": [ {"type": "file", "file": {"file_id": uploaded_file.id}}, {"type": "text", "text": "按段落给出文档中的文字内容,以JSON格式输出,包括段落类型(type)、文字内容(content)信息。"}, ], } ], ) print(f"id={completion.id}") print(completion.choices[0].message.content) ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/chat" "github.com/volcengine/ark-runtime-go/arkruntime/model/file" ) func main() { ctx := context.Background() client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) filePath := os.Getenv("FILE_PATH") if filePath == "" { filePath = "/Users/doc/demo.pdf" } data, err := os.Open(filePath) if err != nil { panic(err) } defer data.Close() uploaded, err := client.UploadFile(ctx, &file.FileCreateRequest{ Purpose: file.PurposeUserData, }, data) if err != nil { panic(err) } uploaded, err = client.WaitForFileProcessing( ctx, uploaded.ID, arkruntime.WaitForFileProcessingOptions{}, ) if err != nil || uploaded.Status != file.StatusActive { panic(fmt.Sprintf("file processing failed: %v, status=%s", err, uploaded.Status)) } media := chat.ChatCompletionContentPart{OneOf: chat.NewChatCompletionContentPartFileChatCompletionContentPartSum(chat.ChatCompletionContentPartFile{Type: chat.ChatCompletionContentPartFileTypeFile, File: chat.ChatCompletionContentPartFileFile{FileID: chat.NewOptString(uploaded.ID)}})} text := chat.ChatCompletionContentPart{OneOf: chat.NewChatCompletionContentPartTextChatCompletionContentPartSum( chat.ChatCompletionContentPartText{Type: chat.ChatCompletionContentPartTextTypeText, Text: "按段落给出文档中的文字内容,以JSON格式输出,包括段落类型(type)、文字内容(content)信息。"}, )} message := chat.ChatCompletionRequestMessage{OneOf: chat.NewChatCompletionRequestUserMessageChatCompletionRequestMessageSum( chat.ChatCompletionRequestUserMessage{ Role: chat.ChatCompletionRequestUserMessageRoleUser, Content: chat.NewOptNilChatCompletionMessageContent(chat.NewChatCompletionContentPartArrayChatCompletionMessageContent( []chat.ChatCompletionContentPart{media, text}, )), }, )} modelID := os.Getenv("MODEL_ID") if modelID == "" { modelID = "doubao-seed-2-1-pro-260915" } response, err := client.CreateChatCompletion(ctx, &chat.ChatCompletionRequest{ Model: modelID, Messages: []chat.ChatCompletionRequestMessage{message}, }) if err != nil { panic(err) } fmt.Printf("id=%s\n%s\n", response.ID, response.Choices[0].Message.Content) } ``` **选项:Java** ```Java import com.volcengine.ark.runtime.models.chat.*; import com.volcengine.ark.runtime.models.file.FileCreateRequest; import com.volcengine.ark.runtime.models.file.FileObject; import com.volcengine.ark.runtime.models.file.PreprocessConfigs; import com.volcengine.ark.runtime.models.file.Purpose; import com.volcengine.ark.runtime.models.file.Status; import com.volcengine.ark.runtime.models.file.Video; import com.volcengine.ark.runtime.service.ArkService; import java.io.File; import java.util.Arrays; public class Main { public static void main(String[] args) { ArkService service = ArkService.builder() .apiKey(System.getenv("ARK_API_KEY")) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); String filePath = System.getenv().getOrDefault("FILE_PATH", "/Users/doc/demo.pdf"); String modelId = System.getenv().getOrDefault("MODEL_ID", "doubao-seed-2-1-pro-260915"); FileObject uploaded = service.uploadFile( FileCreateRequest.builder() .purpose(Purpose.USER_DATA) .build(), new File(filePath) ); uploaded = service.waitForFileProcessing(uploaded.getId()); if (uploaded.getStatus() != Status.ACTIVE) { throw new IllegalStateException("File processing failed: " + uploaded.getStatus()); } ChatCompletionContentPart media = ChatCompletionContentPartFile.builder().type(ChatCompletionContentPartType.FILE)._file(ChatCompletionContentPartFileFile.builder().fileId(uploaded.getId()).build()).build(); ChatCompletionContentPart text = ChatCompletionContentPartText.builder() .type(ChatCompletionContentPartType.TEXT) .text("按段落给出文档中的文字内容,以JSON格式输出,包括段落类型(type)、文字内容(content)信息。") .build(); ChatCompletionRequestMessage message = ChatCompletionRequestUserMessage.builder() .role(ChatCompletionRequestMessageType.USER) .content(ChatCompletionMessageContent.builder() .value(Arrays.asList(media, text)) .build()) .build(); ChatCompletionRequest request = ChatCompletionRequest.builder() .model(modelId) .messages(Arrays.asList(message)) .build(); ChatCompletionResponse response = service.createChatCompletion(request); System.out.println("id=" + response.getId()); System.out.println(response.getChoices().get(0).getMessage().getContent()); service.shutdownExecutor(); } } ``` ### Base64 编码传入 将本地文件转换为 Base64 编码字符串,然后提交给大模型。该方式适用于文档体积较小的情况,文件不能超过 50 MB,请求体不能超过 64 MB。 > **注意** > > 将文档转换为Base64编码字符串,然后遵循`data:{mime_type};base64,{base64_data}`格式拼接,传入模型。 > * `{mime_type}`:文件的媒体类型,需要与文件格式mime_type对应(`application/pdf`)。 > * `{base64_data}`:文件经过Base64编码后的字符串。 **选项:Curl** ```Bash BASE64_FILE=$(base64 < demo.pdf) && curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d @- < ## 文件 URL 传入 如果文档已存在公网可访问 URL,可以在 Responses API 请求中直接填入文档的公网 URL,文件不能超过50 MB。 **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Authorization: Bearer $ARK_API_KEY" \ -H 'Content-Type: application/json' \ -d '{ "model": "doubao-seed-2-1-pro-260915", "input": [ { "role": "user", "content": [ { "type": "input_file", "file_url": "https://arkdocs.tos-cn-beijing.volces.com/files/resources/demo.pdf" }, { "type": "input_text", "text": "按段落给出文档中的文字内容,以JSON格式输出,包括段落类型(type)、文字内容(content)信息。" } ] } ] }' ``` **选项:Python** ```Python import os from arkruntime import Ark api_key = os.getenv('ARK_API_KEY') client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) response = client.responses.create( model="doubao-seed-2-1-pro-260915", input=[ { "role": "user", "content": [ { "type": "input_file", "file_url": "https://arkdocs.tos-cn-beijing.volces.com/files/resources/demo.pdf" }, { "type": "input_text", "text": "按段落给出文档中的文字内容,以JSON格式输出,包括段落类型(type)、文字内容(content)信息。" }, ], } ] ) print(response) ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/responses" ) func main() { client := arkruntime.NewClientWithApiKey( // Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() inputMessage := responses.InputItem{ OneOf: responses.NewItemEasyMessageInputItemSum( responses.ItemEasyMessage{ Role: responses.NewOptMessageRole(responses.MessageRoleUser), Content: responses.NewContentItemArrayMessageContent( []responses.ContentItem{ responses.ContentItem{OneOf: responses.NewContentItemFileContentItemSum(responses.ContentItemFile{Type: responses.ContentItemFileTypeInputFile, FileURL: responses.NewOptString("https://arkdocs.tos-cn-beijing.volces.com/files/resources/demo.pdf")})}, responses.ContentItem{OneOf: responses.NewContentItemTextContentItemSum(responses.ContentItemText{Type: responses.ContentItemTextTypeInputText, Text: "按段落给出文档中的文字内容,以JSON格式输出,包括段落类型(type)、文字内容(content)信息。"})}, }, ), }, ), } resp, err := client.CreateResponses(ctx, &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", Input: responses.NewInputItemArrayResponsesInput([]responses.InputItem{inputMessage}), }) if err != nil { fmt.Printf("response error: %v", err) return } fmt.Println(resp) } ``` **选项:Java** ```Java package com.ark.example; import com.volcengine.ark.runtime.service.ArkService; import com.volcengine.ark.runtime.models.responses.*; public class demo { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); // The base URL for model invocation ArkService arkService = ArkService.builder().apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); ResponsesRequest request = ResponsesRequest.builder() .model("doubao-seed-2-1-pro-260915") .input(ResponsesInput.ofList(java.util.Arrays.asList(ItemEasyMessage.builder().role(MessageRole.USER).content( MessageContent.ofList(java.util.Arrays.asList(ContentItemFile.builder().fileUrl("https://arkdocs.tos-cn-beijing.volces.com/files/resources/demo.pdf").build(), ContentItemText.builder().text("按段落给出文档中的文字内容,以JSON格式输出,包括段落类型(type)、文字内容(content)信息。").build())) ).build()))) .build(); Response resp = arkService.createResponse(request); System.out.println(resp); arkService.shutdownExecutor(); } } ``` **选项:OpenAI SDK** ```Python import os from openai import OpenAI api_key = os.getenv('ARK_API_KEY') client = OpenAI( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) response = client.responses.create( model="doubao-seed-2-1-pro-260915", input=[ { "role": "user", "content": [ { "type": "input_file", "file_url": "https://arkdocs.tos-cn-beijing.volces.com/files/resources/demo.pdf" }, { "type": "input_text", "text": "按段落给出文档中的文字内容,以JSON格式输出,包括段落类型(type)、文字内容(content)信息。" }, ], } ] ) print(response) ``` # 流式输出 流式输出支持内容动态实时呈现,既能够缓解用户等待焦虑,又可以规避复杂任务因长时间推理引发的客户端超时失败问题,保障请求流程顺畅。 **选项:Python** ```Python import asyncio import os from arkruntime import AsyncArk from arkruntime.types.responses.response_completed_event import ResponseCompletedEvent from arkruntime.types.responses.response_reasoning_summary_text_delta_event import ResponseReasoningSummaryTextDeltaEvent from arkruntime.types.responses.response_output_item_added_event import ResponseOutputItemAddedEvent from arkruntime.types.responses.response_text_delta_event import ResponseTextDeltaEvent from arkruntime.types.responses.response_text_done_event import ResponseTextDoneEvent client = AsyncArk( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=os.getenv('ARK_API_KEY') ) async def main(): # upload pdf file print("Upload pdf file") file = await client.files.create( # replace with your local pdf path file=open("/Users/doc/demo.pdf", "rb"), purpose="user_data" ) print(f"File uploaded: {file.id}") # Wait for the file to finish processing await client.files.wait_for_processing(file.id) print(f"File processed: {file.id}") stream = await client.responses.create( model="doubao-seed-2-1-pro-260915", input=[ {"role": "user", "content": [ { "type": "input_file", "file_id": file.id # ref pdf file id }, { "type": "input_text", "text": "按段落给出文档中的文字内容,以JSON格式输出,包括段落类型(type)、文字内容(content)信息。" } ]}, ], caching={ "type": "enabled", }, store=True, stream=True ) async for event in stream: if isinstance(event, ResponseReasoningSummaryTextDeltaEvent): print(event.delta, end="") if isinstance(event, ResponseOutputItemAddedEvent): print("\noutPutItem " + event.type + " start:") if isinstance(event, ResponseTextDeltaEvent): print(event.delta,end="") if isinstance(event, ResponseTextDoneEvent): print("\noutPutTextDone.") if isinstance(event, ResponseCompletedEvent): print("Response Completed. Usage = " + event.response.usage.model_dump_json()) if __name__ == "__main__": asyncio.run(main()) ``` **选项:Go** ```Go package main import ( "context" "fmt" "io" "os" "time" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/file" "github.com/volcengine/ark-runtime-go/arkruntime/model/responses" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() fmt.Println("----- upload file data -----") data, err := os.Open("/Users/doc/demo.pdf") if err != nil { fmt.Printf("read file error: %v\n", err) return } fileInfo, err := client.UploadFile(ctx, &file.FileCreateRequest{ Purpose: file.PurposeUserData, }, data) if err != nil { fmt.Printf("upload file error: %v", err) return } // Wait for the file to finish processing for fileInfo.Status == file.StatusProcessing { fmt.Println("Waiting for file to be processed...") time.Sleep(2 * time.Second) fileInfo, err = client.RetrieveFile(ctx, fileInfo.ID) // update file info if err != nil { fmt.Printf("get file status error: %v", err) return } } fmt.Printf("File processing completed: %s, status: %s\n", fileInfo.ID, fileInfo.Status) inputMessage := responses.InputItem{ OneOf: responses.NewItemEasyMessageInputItemSum( responses.ItemEasyMessage{ Role: responses.NewOptMessageRole(responses.MessageRoleUser), Content: responses.NewContentItemArrayMessageContent( []responses.ContentItem{ responses.ContentItem{OneOf: responses.NewContentItemFileContentItemSum(responses.ContentItemFile{Type: responses.ContentItemFileTypeInputFile, FileID: responses.NewOptString(fileInfo.ID)})}, responses.ContentItem{OneOf: responses.NewContentItemTextContentItemSum(responses.ContentItemText{Type: responses.ContentItemTextTypeInputText, Text: "按段落给出文档中的文字内容,以JSON格式输出,包括段落类型(type)、文字内容(content)信息。"})}, }, ), }, ), } createResponsesReq := &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", Input: responses.NewInputItemArrayResponsesInput([]responses.InputItem{inputMessage}), } resp, err := client.CreateResponsesStream(ctx, createResponsesReq) if err != nil { fmt.Printf("stream error: %v\n", err) return } var responseId string for { event, err := resp.Recv() if err == io.EOF { break } if err != nil { fmt.Printf("stream error: %v\n", err) return } handleEvent(event) if event.OneOf.Type == responses.ResponseCreatedEventResponseStreamEventSum { responseId = event.OneOf.ResponseCreatedEvent.Response.ID fmt.Printf("Response ID: %s", responseId) } } } func handleEvent(event *responses.ResponseStreamEvent) { switch event.OneOf.Type { case responses.ResponseReasoningSummaryTextDeltaEventResponseStreamEventSum: print(event.OneOf.ResponseReasoningSummaryTextDeltaEvent.Delta.Or("")) case responses.ResponseReasoningSummaryTextDoneEventResponseStreamEventSum: fmt.Printf("\nAggregated reasoning text: %s\n", event.OneOf.ResponseReasoningSummaryTextDoneEvent.Text.Or("")) case responses.ResponseTextDeltaEventResponseStreamEventSum: print(event.OneOf.ResponseTextDeltaEvent.Delta.Or("")) case responses.ResponseTextDoneEventResponseStreamEventSum: fmt.Printf("\nAggregated output text: %s\n", event.OneOf.ResponseTextDoneEvent.Text.Or("")) } } ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.file.*; import com.volcengine.ark.runtime.service.ArkService; import com.volcengine.ark.runtime.models.responses.*; import java.io.File; import java.util.concurrent.TimeUnit; public class demo { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); ArkService service = ArkService.builder().apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); System.out.println("===== Upload File Example====="); // upload a file for responses FileObject fileMeta; fileMeta = service.uploadFile(FileCreateRequest.builder() // replace with your file file path .purpose(Purpose.USER_DATA) .build(), new File("/Users/doc/demo.pdf")); System.out.println("Uploaded file Meta: " + fileMeta); System.out.println("status:" + fileMeta.getStatus()); try { while ("processing".equalsIgnoreCase(fileMeta.getStatus().toString())) { System.out.println("Waiting for file to be processed..."); TimeUnit.SECONDS.sleep(2); fileMeta = service.retrieveFile(fileMeta.getId()); } } catch (Exception e) { System.err.println("get file status error: " + e.getMessage()); } System.out.println("Uploaded file Meta: " + fileMeta); ResponsesRequest request = ResponsesRequest.builder() .model("doubao-seed-2-1-pro-260915") .stream(true) .input(ResponsesInput.ofList(java.util.Arrays.asList(ItemEasyMessage.builder().role(MessageRole.USER).content( MessageContent.ofList(java.util.Arrays.asList(ContentItemFile.builder().fileId(fileMeta.getId()).build(), ContentItemText.builder().text("按段落给出文档中的文字内容,以JSON格式输出,包括段落类型(type)、文字内容(content)信息。").build())) ).build()))) .build(); service.streamResponse(request) .doOnError(Throwable::printStackTrace) .blockingForEach(event -> { if (event instanceof ResponseReasoningSummaryTextDeltaEvent) { System.out.print(((ResponseReasoningSummaryTextDeltaEvent) event).getDelta()); } if (event instanceof ResponseOutputItemAddedEvent) { System.out.println("\nOutputItem " + (((ResponseOutputItemAddedEvent) event).getItem().getType()) + " Start: "); } if (event instanceof ResponseTextDeltaEvent) { System.out.print(((ResponseTextDeltaEvent) event).getDelta()); } if (event instanceof ResponseTextDoneEvent) { System.out.println("\nOutputText End."); } if (event instanceof ResponseOutputItemDoneEvent) { System.out.println("\nOutputItem " + ((ResponseOutputItemDoneEvent) event).getItem().getType() + " End."); } if (event instanceof ResponseFunctionCallArgumentsDoneEvent) { System.out.println("\nFunctionCall Arguments: " + ((ResponseFunctionCallArgumentsDoneEvent) event).getArguments()); } if (event instanceof ResponseCompletedEvent) { System.out.println("\nResponse Completed. Usage = " + ((ResponseCompletedEvent) event).getResponse().getUsage()); } }); service.shutdownExecutor(); } } ``` **选项:OpenAI SDK** ```Python import os import time from openai import OpenAI api_key = os.getenv('ARK_API_KEY') client = OpenAI( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) file = client.files.create( file=open("/Users/doc/demo.pdf", "rb"), purpose="user_data" ) # Wait for the file to finish processing while (file.status == "processing"): time.sleep(2) file = client.files.retrieve(file.id) print(f"File processed: {file}") response = client.responses.create( model="doubao-seed-2-1-pro-260915", input=[ { "role": "user", "content": [ { "type": "input_file", "file_id": file.id, }, { "type": "input_text", "text": "按段落给出文档中的文字内容,以JSON格式输出,包括段落类型(type)、文字内容(content)信息。", }, ] } ], stream=True ) for event in response: if event.type == "response.reasoning_summary_text.delta": print(event.delta, end="") if event.type == "response.output_item.added": print("\noutPutItem " + event.type + " start:") if event.type == "response.output_text.delta": print(event.delta,end="") if event.type == "response.output_item.done": print("\noutPutTextDone.") if event.type == "response.completed": print("\nResponse Completed. Usage = " + event.response.usage.model_dump_json()) ``` # 附:文件预处理 对于PDF文件会分页来处理成多图,在预处理时不会对拆分的图片做分辨率缩放,以确保图片能够完整且清晰地保留PDF文件中的原始信息。在作为输入的时候,会根据模型**input.content.detail**参数的`auto`行为自动缩放。 --- # 音频理解 Source: https://ark.volcengine.com/region:cn-beijing/docs/audio-understanding 部分大模型支持音频理解能力,可通过本地文件和音频 URL 方式传入音频,可对音频内容进行语义理解与解析,适用于语音内容转写、对话语义提取、音频内容审核、会议纪要生成、视频伴音分析等场景。 > **说明** > > 方舟平台的新用户?获取 API Key 及 开通模型等准备工作,请参见 [快速入门](/docs/quick-start)。 # 支持模型 请参见[音频理解能力](/docs/model-list#9619c0ba)。 # API接口 * [Responses API](/docs/create-model-responses-api):支持音频作为输入进行分析。支持 File ID 方式进行音频理解,使用方式参见[Files API上传(推荐)](/docs/audio-understanding#dba3306f)。 * [Chat API](/docs/chat-api):支持音频作为输入进行分析。支持 File ID 方式进行音频理解,使用方式参见[Files API上传(推荐)](/docs/audio-understanding#dba3306f)。 # 音频输入方式 支持的音频文件传入方式如下: * 本地文件上传: * [Files API上传(推荐)](/docs/audio-understanding#dba3306f):直接传入本地文件,音频文件大小不能超过 512 MB,适用于在多个请求中重复使用文件的场景。 * [Base64编码传入](/docs/audio-understanding#607f74ca):适用于文件体积较小的场景,音频文件大小不能超过 25 MB,音频时长不超过 120 分钟。 * [音频URL传入](/docs/audio-understanding#268050a0):适用于文件已存在公网可访问 URL 的场景,音频文件大小不能超过 25 MB,音频时长不超过 120 分钟。 ## 本地文件上传 ### **Files API上传(推荐)** 建议优先使用 Files API 上传本地文件,不仅可以支持最大 512MB 文件的处理,还可以避免请求时重新上传内容,减少预处理导致的时延,同时可在多次请求中重复使用,节省公网下载时延。上传成功并待文件状态变为 `active` 后,Responses API 和 Chat API 均支持通过 `file_id` 方式传入音频。 > * 该方式上传的文件默认存储 7 天,存储有效期取值范围为1-30天。 > * 如果需要实时获取分析内容,或者要规避复杂任务引发的客户端超时失败问题,可采用流式输出的方式,具体示例见[流式输出](/docs/audio-understanding#3fe052be)。
    • Responses API 示例代码:
    **选项:Curl** 1. 上传音频文件获取File ID ```Bash curl https://ark.cn-beijing.volces.com/api/v3/files \ -H "Authorization: Bearer $ARK_API_KEY" \ -F 'purpose=user_data' \ -F 'file=@/Users/doc/demo.mp3' ``` 2. 在Responses API中引用File ID ```Bash curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Authorization: Bearer $ARK_API_KEY" \ -H 'Content-Type: application/json' \ -d '{ "model": "doubao-seed-2-1-lite-260915", "input": [ { "role": "user", "content": [ { "type": "input_audio", "file_id": "file-20260415****" }, { "type": "input_text", "text": "请识别音频中的内容,以文字形式返回识别结果。" } ] } ] }' ``` * 按需替换 Model ID,查询 Model ID 参见 [模型列表](/docs/model-list)。 **选项:Python** ```Python import os from pathlib import Path from arkruntime import Ark client = Ark( base_url="https://ark.cn-beijing.volces.com/api/v3", api_key=os.environ.get("ARK_API_KEY"), ) file_path = Path(os.getenv("FILE_PATH", "/Users/doc/demo.mp3")) uploaded_file = client.files.create(file=file_path, purpose="user_data") client.files.wait_for_processing(uploaded_file.id) response = client.responses.create( model=os.getenv("MODEL_ID", "doubao-seed-2-1-lite-260915"), input=[ { "role": "user", "content": [ {"type": "input_audio", "file_id": uploaded_file.id}, { "type": "input_text", "text": "请识别音频中的内容,以文字形式返回识别结果。", }, ], } ], ) print(response) ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/file" "github.com/volcengine/ark-runtime-go/arkruntime/model/responses" ) func main() { ctx := context.Background() client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) filePath := os.Getenv("FILE_PATH") if filePath == "" { filePath = "/Users/doc/demo.mp3" } data, err := os.Open(filePath) if err != nil { panic(err) } defer data.Close() uploaded, err := client.UploadFile(ctx, &file.FileCreateRequest{ Purpose: file.PurposeUserData, }, data) if err != nil { panic(err) } uploaded, err = client.WaitForFileProcessing( ctx, uploaded.ID, arkruntime.WaitForFileProcessingOptions{}, ) if err != nil || uploaded.Status != file.StatusActive { panic(fmt.Sprintf("file processing failed: %v, status=%s", err, uploaded.Status)) } media := responses.ContentItem{OneOf: responses.NewContentItemAudioContentItemSum(responses.ContentItemAudio{Type: responses.ContentItemAudioTypeInputAudio, FileID: responses.NewOptString(uploaded.ID)})} text := responses.ContentItem{OneOf: responses.NewContentItemTextContentItemSum( responses.ContentItemText{Type: responses.ContentItemTextTypeInputText, Text: "请识别音频中的内容,以文字形式返回识别结果。"}, )} message := responses.InputItem{OneOf: responses.NewItemEasyMessageInputItemSum( responses.ItemEasyMessage{ Role: responses.NewOptMessageRole(responses.MessageRoleUser), Content: responses.NewContentItemArrayMessageContent([]responses.ContentItem{media, text}), }, )} modelID := os.Getenv("MODEL_ID") if modelID == "" { modelID = "doubao-seed-2-1-lite-260915" } response, err := client.CreateResponses(ctx, &responses.ResponsesRequest{ Model: modelID, Input: responses.NewInputItemArrayResponsesInput([]responses.InputItem{message}), }) if err != nil { panic(err) } fmt.Println(response) } ``` **选项:Java** ```Java import com.volcengine.ark.runtime.models.file.*; import com.volcengine.ark.runtime.models.responses.*; import com.volcengine.ark.runtime.service.ArkService; import java.io.File; import java.util.Arrays; public class Main { public static void main(String[] args) { ArkService service = ArkService.builder() .apiKey(System.getenv("ARK_API_KEY")) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); String filePath = System.getenv().getOrDefault("FILE_PATH", "/Users/doc/demo.mp3"); String modelId = System.getenv().getOrDefault("MODEL_ID", "doubao-seed-2-1-lite-260915"); FileObject uploaded = service.uploadFile( FileCreateRequest.builder() .purpose(Purpose.USER_DATA) .build(), new File(filePath) ); uploaded = service.waitForFileProcessing(uploaded.getId()); if (uploaded.getStatus() != Status.ACTIVE) { throw new IllegalStateException("File processing failed: " + uploaded.getStatus()); } ContentItem media = ContentItemAudio.builder().type(ContentItemType.INPUT_AUDIO).fileId(uploaded.getId()).build(); ContentItem text = ContentItemText.builder() .type(ContentItemType.INPUT_TEXT) .text("请识别音频中的内容,以文字形式返回识别结果。") .build(); ResponsesRequest request = ResponsesRequest.builder() .model(modelId) .input(ResponsesInput.ofList(Arrays.asList( ItemEasyMessage.builder() .role(MessageRole.USER) .content(MessageContent.ofList(Arrays.asList(media, text))) .build() ))) .build(); Response response = service.createResponse(request); System.out.println(response); service.shutdownExecutor(); } } ``` **选项:OpenAI SDK** ```Python import os import time from openai import OpenAI api_key = os.getenv('ARK_API_KEY') client = OpenAI( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) file = client.files.create( file=open("/Users/doc/demo.mp3", "rb"), purpose="user_data" ) # Wait for the file to finish processing while file.status == "processing": time.sleep(2) file = client.files.retrieve(file.id) print(f"File processed: {file.id}") response = client.responses.create( model="doubao-seed-2-1-lite-260915", input=[ { "role": "user", "content": [ { "type": "input_audio", "file_id": file.id, }, { "type": "input_text", "text": "请识别音频中的内容,以文字形式返回识别结果。" }, ] } ] ) print(response) ```
    • Chat API 示例代码:
    **选项:Curl** 1. 上传音频文件获取 File ID。 ```Bash curl https://ark.cn-beijing.volces.com/api/v3/files \ -H "Authorization: Bearer $ARK_API_KEY" \ -F 'purpose=user_data' \ -F 'file=@/Users/doc/demo.mp3' ``` 2. 在 Chat API 中引用 File ID。 ```Bash curl https://ark.cn-beijing.volces.com/api/v3/chat/completions \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "doubao-seed-2-1-lite-260915", "messages": [ { "role": "user", "content": [ { "type": "input_audio", "input_audio": { "file_id": "file-20260415****" } }, { "type": "text", "text": "请识别音频中的内容,以文字形式返回识别结果。" } ] } ] }' ``` * 按需替换 Model ID,查询 Model ID 参见 [模型列表](/docs/model-list)。 **选项:Python** ```Python import os from pathlib import Path from arkruntime import Ark client = Ark( base_url="https://ark.cn-beijing.volces.com/api/v3", api_key=os.environ.get("ARK_API_KEY"), ) file_path = Path(os.getenv("FILE_PATH", "/Users/doc/demo.mp3")) uploaded_file = client.files.create( file=file_path, purpose="user_data", ) client.files.wait_for_processing(uploaded_file.id) completion = client.chat.completions.create( model=os.getenv("MODEL_ID", "doubao-seed-2-1-lite-260915"), messages=[ { "role": "user", "content": [ {"type": "input_audio", "input_audio": {"file_id": uploaded_file.id}}, {"type": "text", "text": "请识别音频中的内容,以文字形式返回识别结果。"}, ], } ], ) print(f"id={completion.id}") print(completion.choices[0].message.content) ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/chat" "github.com/volcengine/ark-runtime-go/arkruntime/model/file" ) func main() { ctx := context.Background() client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) filePath := os.Getenv("FILE_PATH") if filePath == "" { filePath = "/Users/doc/demo.mp3" } data, err := os.Open(filePath) if err != nil { panic(err) } defer data.Close() uploaded, err := client.UploadFile(ctx, &file.FileCreateRequest{ Purpose: file.PurposeUserData, }, data) if err != nil { panic(err) } uploaded, err = client.WaitForFileProcessing( ctx, uploaded.ID, arkruntime.WaitForFileProcessingOptions{}, ) if err != nil || uploaded.Status != file.StatusActive { panic(fmt.Sprintf("file processing failed: %v, status=%s", err, uploaded.Status)) } media := chat.ChatCompletionContentPart{OneOf: chat.NewChatCompletionContentPartAudioChatCompletionContentPartSum(chat.ChatCompletionContentPartAudio{Type: chat.ChatCompletionContentPartAudioTypeInputAudio, InputAudio: chat.ChatCompletionContentPartAudioInputAudio{FileID: chat.NewOptString(uploaded.ID)}})} text := chat.ChatCompletionContentPart{OneOf: chat.NewChatCompletionContentPartTextChatCompletionContentPartSum( chat.ChatCompletionContentPartText{Type: chat.ChatCompletionContentPartTextTypeText, Text: "请识别音频中的内容,以文字形式返回识别结果。"}, )} message := chat.ChatCompletionRequestMessage{OneOf: chat.NewChatCompletionRequestUserMessageChatCompletionRequestMessageSum( chat.ChatCompletionRequestUserMessage{ Role: chat.ChatCompletionRequestUserMessageRoleUser, Content: chat.NewOptNilChatCompletionMessageContent(chat.NewChatCompletionContentPartArrayChatCompletionMessageContent( []chat.ChatCompletionContentPart{media, text}, )), }, )} modelID := os.Getenv("MODEL_ID") if modelID == "" { modelID = "doubao-seed-2-1-lite-260915" } response, err := client.CreateChatCompletion(ctx, &chat.ChatCompletionRequest{ Model: modelID, Messages: []chat.ChatCompletionRequestMessage{message}, }) if err != nil { panic(err) } fmt.Printf("id=%s\n%s\n", response.ID, response.Choices[0].Message.Content) } ``` **选项:Java** ```Java import com.volcengine.ark.runtime.models.chat.*; import com.volcengine.ark.runtime.models.file.FileCreateRequest; import com.volcengine.ark.runtime.models.file.FileObject; import com.volcengine.ark.runtime.models.file.PreprocessConfigs; import com.volcengine.ark.runtime.models.file.Purpose; import com.volcengine.ark.runtime.models.file.Status; import com.volcengine.ark.runtime.models.file.Video; import com.volcengine.ark.runtime.service.ArkService; import java.io.File; import java.util.Arrays; public class Main { public static void main(String[] args) { ArkService service = ArkService.builder() .apiKey(System.getenv("ARK_API_KEY")) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); String filePath = System.getenv().getOrDefault("FILE_PATH", "/Users/doc/demo.mp3"); String modelId = System.getenv().getOrDefault("MODEL_ID", "doubao-seed-2-1-lite-260915"); FileObject uploaded = service.uploadFile( FileCreateRequest.builder() .purpose(Purpose.USER_DATA) .build(), new File(filePath) ); uploaded = service.waitForFileProcessing(uploaded.getId()); if (uploaded.getStatus() != Status.ACTIVE) { throw new IllegalStateException("File processing failed: " + uploaded.getStatus()); } ChatCompletionContentPart media = ChatCompletionContentPartAudio.builder().type(ChatCompletionContentPartType.INPUT_AUDIO).inputAudio(ChatCompletionContentPartAudioInputAudio.builder().fileId(uploaded.getId()).build()).build(); ChatCompletionContentPart text = ChatCompletionContentPartText.builder() .type(ChatCompletionContentPartType.TEXT) .text("请识别音频中的内容,以文字形式返回识别结果。") .build(); ChatCompletionRequestMessage message = ChatCompletionRequestUserMessage.builder() .role(ChatCompletionRequestMessageType.USER) .content(ChatCompletionMessageContent.builder() .value(Arrays.asList(media, text)) .build()) .build(); ChatCompletionRequest request = ChatCompletionRequest.builder() .model(modelId) .messages(Arrays.asList(message)) .build(); ChatCompletionResponse response = service.createChatCompletion(request); System.out.println("id=" + response.getId()); System.out.println(response.getChoices().get(0).getMessage().getContent()); service.shutdownExecutor(); } } ``` ### Base64编码传入 将本地文件转换为 Base64 编码字符串,然后提交给大模型。该方式适用于音频文件体积较小的情况,音频文件大小不能超过 25 MB,音频时长不超过 120 分钟。(Responses API 和 Chat API 都支持该方式。) > **注意** > > 使用 Base64 编码传入音频时,需根据不同的 API 类型对数据格式进行处理: > * Responses API:遵循`data:{mime_type};base64,{base64_data}`格式拼接,通过`audio_url`字段传入模型。`{mime_type}`:文件的媒体类型,需要与文件格式`mime_type`对应。支持的音频格式详细见音频格式说明。`{base64_data}`:文件经过Base64编码后的字符串。 > * Chat API:直接将 Base64 编码后的音频数据`{base64_data}`填入 `input_audio.data`,音频格式(如 mp3/wav)通过 `input_audio.format` 字段单独指定。
    • 使用 Responses API 的示例代码如下:
    **选项:Curl** ```Bash BASE64_FILE=$(base64 < /Users/doc/demo.mp3) && curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d @- < **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.responses.*; import com.volcengine.ark.runtime.service.ArkService; import java.nio.file.Files; import java.nio.file.Paths; import java.util.Base64; import java.io.IOException; public class Sample { private static String encodeFile(String filePath) throws IOException { byte[] fileBytes = Files.readAllBytes(Paths.get(filePath)); return Base64.getEncoder().encodeToString(fileBytes); } public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); ArkService arkService = ArkService.builder() .apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); // Convert local audio file to Base64 data URL String base64AudioData = ""; try { base64AudioData = "data:audio/mpeg;base64," + encodeFile("/Users/doc/demo.mp3"); } catch (IOException e) { System.err.println("Encode audio file failed: " + e.getMessage()); return; } ResponsesRequest request = ResponsesRequest.builder() .model("doubao-seed-2-1-lite-260915") .input(ResponsesInput.ofList(java.util.Arrays.asList(ItemEasyMessage.builder() .role(MessageRole.USER) .content(MessageContent.ofList(java.util.Arrays.asList(ContentItemAudio.builder().audioUrl(base64AudioData).build(), ContentItemText.builder().text("请识别音频中的内容").build())) ).build()))) .build(); Response resp = arkService.createResponse(request); System.out.println(resp); arkService.shutdownExecutor(); } } ``` **选项:OpenAI SDK** ```Python import os from openai import OpenAI import base64 api_key = os.getenv('ARK_API_KEY') client = OpenAI( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) # Convert local files to Base64-encoded strings. def encode_file(file_path): with open(file_path, "rb") as read_file: return base64.b64encode(read_file.read()).decode('utf-8') # 音频文件路径 base64_file = encode_file("/Users/doc/demo.mp3") response = client.responses.create( model="doubao-seed-2-1-lite-260915", input=[ { "role": "user", "content": [ { "type": "input_audio", "audio_url": f"data:audio/mpeg;base64,{base64_file}" }, { "type": "input_text", "text": "请识别音频中的内容" } ], } ] ) print(response) ```
    • 使用 Chat API 的示例代码如下:
    **选项:Curl** ```Bash BASE64_FILE=$(base64 < /Users/doc/demo.mp3) && curl https://ark.cn-beijing.volces.com/api/v3/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d @- < messagesForReqList = new ArrayList<>(); // 你的音频路径(改成自己实际路径) String audioPath = "/Users/doc/demo.mp3"; // 音频Base64 String base64Data = encodeAudio(audioPath); // 构建多模态内容 List contentParts = new ArrayList<>(); // 音频部分(input_audio + data + format) ChatCompletionContentPartAudioInputAudio inputAudio = new ChatCompletionContentPartAudioInputAudio(); inputAudio.setData(base64Data); inputAudio.setFormat("mp3"); contentParts.add(ChatCompletionContentPartAudio.builder() .type(ChatCompletionContentPartType.INPUT_AUDIO) .inputAudio(inputAudio) .build()); // 文本指令 contentParts.add(ChatCompletionContentPartText.builder() .type(ChatCompletionContentPartType.TEXT) .text("请识别音频中的内容") .build()); // 构造用户消息 messagesForReqList.add(ChatCompletionRequestUserMessage.builder() .role(ChatCompletionRequestMessageType.USER) .content(ChatCompletionMessageContent.ofList(contentParts)) .build()); // 请求体 ChatCompletionRequest req = ChatCompletionRequest.builder() .model("doubao-seed-2-1-lite-260915") .messages(messagesForReqList) .build(); // 调用并打印结果 service.createChatCompletion(req) .getChoices() .forEach(choice -> System.out.println(choice.getMessage().getContent())); service.shutdownExecutor(); } } ``` ## 音频URL传入 如果音频文件已存在公网可访问URL,可以在请求中直接填入音频文件的公网URL,音频文件大小不能超过 25 MB,音频时长不超过 120 分钟。(Responses API 和 Chat API 都支持该方式。)
    • 使用 Responses API 的示例代码如下:
    **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Authorization: Bearer $ARK_API_KEY" \ -H 'Content-Type: application/json' \ -d '{ "model": "doubao-seed-2-1-lite-260915", "input": [ { "role": "user", "content": [ { "type": "input_audio", "audio_url": "https://arkdocs.tos-cn-beijing.volces.com/files/advanced-usage/ark_demo_audio.mp3" }, { "type": "input_text", "text": "请识别这段音频内容" } ] } ] }' ``` * 按需替换 Model ID,查询 Model ID 参见 [模型列表](/docs/model-list)。 **选项:Python** ```Python import os from arkruntime import Ark # Get API Key from environment variable api_key = os.getenv('ARK_API_KEY') client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) # Call responses API with audio URL input response = client.responses.create( model="doubao-seed-2-1-lite-260915", input=[ { "role": "user", "content": [ { "type": "input_audio", "audio_url": "https://arkdocs.tos-cn-beijing.volces.com/files/advanced-usage/ark_demo_audio.mp3" }, { "type": "input_text", "text": "请识别这段音频内容" } ], } ] ) print(response) ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/responses" ) func main() { client := arkruntime.NewClientWithApiKey( // Get ARK_API_KEY from environment variable os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() // Construct user input: audio URL + text prompt inputMessage := responses.InputItem{ OneOf: responses.NewItemEasyMessageInputItemSum( responses.ItemEasyMessage{ Role: responses.NewOptMessageRole(responses.MessageRoleUser), Content: responses.NewContentItemArrayMessageContent( []responses.ContentItem{ responses.ContentItem{OneOf: responses.NewContentItemAudioContentItemSum(responses.ContentItemAudio{Type: responses.ContentItemAudioTypeInputAudio, AudioURL: responses.NewOptString("https://arkdocs.tos-cn-beijing.volces.com/files/advanced-usage/ark_demo_audio.mp3")})}, responses.ContentItem{OneOf: responses.NewContentItemTextContentItemSum(responses.ContentItemText{Type: responses.ContentItemTextTypeInputText, Text: "请识别这段音频内容"})}, }, ), }, ), } // Send request to CreateResponses API resp, err := client.CreateResponses(ctx, &responses.ResponsesRequest{ Model: "doubao-seed-2-1-lite-260915", Input: responses.NewInputItemArrayResponsesInput([]responses.InputItem{inputMessage}), }) if err != nil { fmt.Printf("response error: %v\n", err) return } fmt.Println(resp) } ``` **选项:Java** ```Java package com.ark.example; import com.volcengine.ark.runtime.service.ArkService; import com.volcengine.ark.runtime.models.responses.*; public class demo { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); ArkService arkService = ArkService.builder().apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); ResponsesRequest request = ResponsesRequest.builder() .model("doubao-seed-2-1-lite-260915") .input(ResponsesInput.ofList(java.util.Arrays.asList(ItemEasyMessage.builder().role(MessageRole.USER).content( MessageContent.ofList(java.util.Arrays.asList(ContentItemAudio.builder().audioUrl("https://arkdocs.tos-cn-beijing.volces.com/files/advanced-usage/ark_demo_audio.mp3").build(), ContentItemText.builder().text("请识别这段音频内容").build())) ).build()))) .build(); Response resp = arkService.createResponse(request); System.out.println(resp); arkService.shutdownExecutor(); } } ``` **选项:OpenAI SDK** ```Python import os from openai import OpenAI # 从环境变量中获取您的API KEY api_key = os.getenv('ARK_API_KEY') client = OpenAI( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) response = client.responses.create( model="doubao-seed-2-1-lite-260915", input=[ { "role": "user", "content": [ { "type": "input_audio", "audio_url": "https://arkdocs.tos-cn-beijing.volces.com/files/advanced-usage/ark_demo_audio.mp3" }, { "type": "input_text", "text": "请识别这段音频内容" } ] } ] ) print(response) ```
    • 使用 Chat API 的示例代码如下:
    **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seed-2-1-lite-260915", "messages": [ { "role": "user", "content": [ { "type": "input_audio", "input_audio": { "url": "https://arkdocs.tos-cn-beijing.volces.com/files/advanced-usage/ark_demo_audio.mp3", "format": "mp3" } }, { "type": "text", "text": "请识别音频中的内容" } ] } ] }' ``` * 按需替换 Model ID,查询 Model ID 参见 [模型列表](/docs/model-list)。 **选项:Python** ```Python import os # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark client = Ark( # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv('ARK_API_KEY'), ) completion = client.chat.completions.create( # Replace with Model ID model = "doubao-seed-2-1-lite-260915", messages=[ { "role": "user", "content": [ { "type": "input_audio", "input_audio": { "url": "https://arkdocs.tos-cn-beijing.volces.com/files/advanced-usage/ark_demo_audio.mp3", "format": "mp3" } }, {"type": "text", "text": "请识别音频中的内容"}, ], } ], ) print(completion.choices[0]) ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.chat.*; import com.volcengine.ark.runtime.models.chat.ChatCompletionContentPart.*; import com.volcengine.ark.runtime.service.ArkService; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; public class Sample { static String apiKey = System.getenv("ARK_API_KEY"); static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); static Dispatcher dispatcher = new Dispatcher(); static ArkService service = ArkService.builder() .dispatcher(dispatcher) .connectionPool(connectionPool) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .apiKey(apiKey) .build(); public static void main(String[] args) throws Exception { List messagesForReqList = new ArrayList<>(); List contentParts = new ArrayList<>(); ChatCompletionContentPartAudioInputAudio inputAudio = new ChatCompletionContentPartAudioInputAudio(); inputAudio.setUrl("https://arkdocs.tos-cn-beijing.volces.com/files/advanced-usage/ark_demo_audio.mp3"); inputAudio.setFormat("mp3"); contentParts.add(ChatCompletionContentPartAudio.builder() .type(ChatCompletionContentPartType.INPUT_AUDIO) .inputAudio(inputAudio) .build()); contentParts.add(ChatCompletionContentPartText.builder() .type(ChatCompletionContentPartType.TEXT) .text("请识别音频中的内容") .build()); messagesForReqList.add(ChatCompletionRequestUserMessage.builder() .role(ChatCompletionRequestMessageType.USER) .content(ChatCompletionMessageContent.ofList(contentParts)) .build()); ChatCompletionRequest req = ChatCompletionRequest.builder() .model("doubao-seed-2-1-lite-260915") .messages(messagesForReqList) .build(); service.createChatCompletion(req) .getChoices() .forEach(choice -> System.out.println(choice.getMessage().getContent())); service.shutdownExecutor(); } } ``` # **使用场景** ## 视频内嵌音频输入 支持对视频中内嵌的音频轨道进行解析与语义理解。无需单独提取音频,可直接将完整视频作为输入,模型会自动抽取音轨并完成语音识别、内容理解、情感与语气分析等相关任务。具体使用格式与入参规范可参考[视频理解](/docs/video-understanding)。 通过 Files API 上传包含音频轨道的视频时,需要在上传请求的 `preprocess_configs.video.model` 中传入支持音频理解的模型 ID。该字段用于指定视频预处理策略;后续调用 Responses API 或 Chat API 时,仍需在请求的 `model` 中传入实际用于推理的模型或接入点。两个 `model` 字段相互独立,可按上传预处理和推理两个阶段分别配置。 以下示例使用 Files API 上传视频,再通过 Responses API 引用 File ID。 **选项:Curl** 1. 上传视频文件获取 File ID。 ```Bash curl https://ark.cn-beijing.volces.com/api/v3/files \ -H "Authorization: Bearer $ARK_API_KEY" \ -F 'purpose=user_data' \ -F 'file=@/Users/doc/demo.mp4' \ -F 'preprocess_configs[video][model]=doubao-seed-2-1-lite-260915' ``` 2. 在 Responses API 中引用 File ID。 ```Bash curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seed-2-1-lite-260915", "input": [ { "role": "user", "content": [ { "type": "input_video", "file_id": "file-20251018****" }, { "type": "input_text", "text": "请识别视频中的音频内容,同时分析音频中的音色特点、说话人语气、语速及情感倾向,输出完整清晰的文本结果" } ] } ] }' ``` **选项:Python** ```Python import os from pathlib import Path from arkruntime import Ark client = Ark( base_url="https://ark.cn-beijing.volces.com/api/v3", api_key=os.environ.get("ARK_API_KEY"), ) file_path = Path(os.getenv("FILE_PATH", "/Users/doc/demo.mp4")) uploaded_file = client.files.create( file=file_path, purpose="user_data", preprocess_configs={ "video": { "model": "doubao-seed-2-1-lite-260915", } }, ) client.files.wait_for_processing(uploaded_file.id) response = client.responses.create( model="doubao-seed-2-1-lite-260915", input=[ { "role": "user", "content": [ { "type": "input_video", "file_id": uploaded_file.id, }, { "type": "input_text", "text": "请识别视频中的音频内容,同时分析音频中的音色特点、说话人语气、语速及情感倾向,输出完整清晰的文本结果" } ], } ] ) print(response) ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/file" "github.com/volcengine/ark-runtime-go/arkruntime/model/responses" ) func main() { ctx := context.Background() client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) filePath := os.Getenv("FILE_PATH") if filePath == "" { filePath = "/Users/doc/demo.mp4" } data, err := os.Open(filePath) if err != nil { panic(err) } defer data.Close() uploaded, err := client.UploadFile(ctx, &file.FileCreateRequest{ Purpose: file.PurposeUserData, PreprocessConfigs: file.NewOptPreprocessConfigs(file.PreprocessConfigs{ Video: file.NewOptVideo(file.Video{ Model: file.NewOptString("doubao-seed-2-1-lite-260915"), }), }), }, data) if err != nil { panic(err) } uploaded, err = client.WaitForFileProcessing( ctx, uploaded.ID, arkruntime.WaitForFileProcessingOptions{}, ) if err != nil || uploaded.Status != file.StatusActive { panic(fmt.Sprintf("file processing failed: %v, status=%s", err, uploaded.Status)) } inputMessage := responses.InputItem{ OneOf: responses.NewItemEasyMessageInputItemSum( responses.ItemEasyMessage{ Role: responses.NewOptMessageRole(responses.MessageRoleUser), Content: responses.NewContentItemArrayMessageContent( []responses.ContentItem{ responses.ContentItem{OneOf: responses.NewContentItemVideoContentItemSum(responses.ContentItemVideo{Type: responses.ContentItemVideoTypeInputVideo, VideoURL: "", FileID: responses.NewOptString(uploaded.ID)})}, responses.ContentItem{OneOf: responses.NewContentItemTextContentItemSum(responses.ContentItemText{Type: responses.ContentItemTextTypeInputText, Text: "请识别视频中的音频内容,同时分析音频中的音色特点、说话人语气、语速及情感倾向,输出完整清晰的文本结果"})}, }, ), }, ), } resp, err := client.CreateResponses(ctx, &responses.ResponsesRequest{ Model: "doubao-seed-2-1-lite-260915", Input: responses.NewInputItemArrayResponsesInput([]responses.InputItem{inputMessage}), }) if err != nil { fmt.Printf("response error: %v\n", err) return } fmt.Println(resp) } ``` **选项:Java** ```Java package com.ark.example; import com.volcengine.ark.runtime.models.file.*; import com.volcengine.ark.runtime.service.ArkService; import com.volcengine.ark.runtime.models.responses.*; import java.io.File; public class demo { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); ArkService arkService = ArkService.builder().apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); String filePath = System.getenv().getOrDefault("FILE_PATH", "/Users/doc/demo.mp4"); FileObject uploaded = arkService.uploadFile( FileCreateRequest.builder() .purpose(Purpose.USER_DATA) .preprocessConfigs(PreprocessConfigs.builder().video(Video.builder().model("doubao-seed-2-1-lite-260915").build()).build()) .build(), new File(filePath) ); uploaded = arkService.waitForFileProcessing(uploaded.getId()); if (uploaded.getStatus() != Status.ACTIVE) { throw new IllegalStateException("File processing failed: " + uploaded.getStatus()); } ResponsesRequest request = ResponsesRequest.builder() .model("doubao-seed-2-1-lite-260915") .input(ResponsesInput.ofList(java.util.Arrays.asList(ItemEasyMessage.builder().role(MessageRole.USER).content( MessageContent.ofList(java.util.Arrays.asList(ContentItemVideo.builder().fileId(uploaded.getId()).build(), ContentItemText.builder().text("请识别视频中的音频内容,同时分析音频中的音色特点、说话人语气、语速及情感倾向,输出完整清晰的文本结果").build())) ).build()))) .build(); Response resp = arkService.createResponse(request); System.out.println(resp); arkService.shutdownExecutor(); } } ``` **选项:OpenAI SDK** ```Python import os import time from openai import OpenAI client = OpenAI( base_url="https://ark.cn-beijing.volces.com/api/v3", api_key=os.environ.get("ARK_API_KEY"), ) file_path = os.getenv("FILE_PATH", "/Users/doc/demo.mp4") with open(file_path, "rb") as video_file: file = client.files.create( file=video_file, purpose="user_data", extra_body={ "preprocess_configs": { "video": { "model": "doubao-seed-2-1-lite-260915", } } }, ) for _ in range(60): if file.status != "processing": break time.sleep(2) file = client.files.retrieve(file.id) if file.status != "processed" and file.status != "active": raise RuntimeError(f"File processing failed or timed out: {file.status}") response = client.responses.create( model="doubao-seed-2-1-lite-260915", input=[ { "role": "user", "content": [ { "type": "input_video", "file_id": file.id, }, { "type": "input_text", "text": "请识别视频中的音频内容,同时分析音频中的音色特点、说话人语气、语速及情感倾向,输出完整清晰的文本结果" } ], } ] ) print(response) ``` > **注意** > > 按需替换 Model ID 。如需处理视频中内嵌的音频信息,请使用支持音频理解的模型,具体可参考 [模型列表](/docs/model-list#9619c0ba)。 ## 通用音频理解问答 围绕音频内容开展开放式语义理解与智能问答,模型可完整解析音频信息,结合用户文本问题,输出结构化、可分析的专业回答。根据交互形式,分为两大子场景:单轮对话和多轮对话。 ### 单轮对话 采用一问一答的轻量化交互模式,适配音频类型判别、环境场景识别、内容细节查询、基础信息解读等轻量化诉求。 下面是简单示例代码 ```Bash curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "doubao-seed-2-1-lite-260915", "instructions": "你是音频理解专家,擅长分析音频信息来回答问题。", "input": [ { "type": "message", "role": "user", "content": [ { "type": "input_audio", "audio_url": "https://arkdocs.tos-cn-beijing.volces.com/files/advanced-usage/audio_understanding_single_qa.wav" }, { "type": "input_text", "text": "我穿的是套头毛衣、T恤、夹克还是吊带?" } ] } ] }' ``` 按需替换 Model ID,查询 Model ID 参见 [模型列表](/docs/model-list)。 回复预览 ```Plaintext 你穿的是夹克。这段音频里除了持续的整理揉搓衣料的摩擦声,还出现了两次非常典型的短促有力的长拉链拉动咬合声,套头毛衣、普通T恤、吊带都不存在这种需要操作前中长拉链的典型动作特征,这两声正是你整理完衣物后操作夹克拉链的声音。 ``` ### 多轮对话 适用于客服复盘、语言陪练、听力答疑等需连续交互的场景。在该场景下,用户可在每一轮交互中追加新的音频输入,模型将结合"历史全部音频 + 历史全部文本回复 + 本轮新问题"综合推理并输出全新的文本答复,确保对话上下文的连贯性与答复的准确性。 > **说明** > > Responses API 提供原生的多轮串联能力,客户端无需手动拼接历史。只需在请求里传入 `previous_response_id = <上一次响应的 id>`,服务端会自动把前序所有 `input` 和 `assistant` 输出作为上下文继续推理。 下面是简单示例代码 * 第一轮请求:用户上传第一段录音,询问人员情况 ```Bash curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "doubao-seed-2-1-lite-260915", "instructions": "你是音频理解专家,擅长分析音频信息来回答问题。", "input": [ { "type": "message", "role": "user", "content": [ { "type": "input_audio", "audio_url": "https://arkdocs.tos-cn-beijing.volces.com/files/advanced-usage/audio_demo_video_multispeaker_01.m4a" }, { "type": "input_text", "text": "这段录音里有几个人在说话?各自是什么性别和年龄段?" } ] } ] }' ``` 按需替换 Model ID,查询 Model ID 参见 [模型列表](/docs/model-list)。 第一轮响应: ``` { "id": "resp_0217772771288531389853d7d0951ef6849890aa76b17cc5b65ac", "object": "response", "model": "doubao-seed-2-1-lite-260915", "output": [ { "type": "message", "role": "assistant", "content": [ { "type": "output_text", "text": "这段录音里一共有3名说话人,所有说话人都属于青年年龄段:\n1. 第一位是青年男性,声线偏浑厚,参与内容讨论;\n2. 第二位是青年女性,声线清亮,是内容的主要讲解者;\n3. 第三位是另一名青年男性,参与对话互动,验证相关内容的呈现效果。" } ] } ], "usage": { "input_tokens": 150, "output_tokens": 732, "total_tokens": 882 } } ``` 记录响应体的 `id`(此处为 `resp_0217772771288531389853d7d0951ef6849890aa76b17cc5b65ac`),它将作为下一轮的 `previous_response_id`。 * 第二轮请求:追加第二段录音,询问情绪变化(使用 `previous_response_id` 串接上轮内容) ```Bash curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "doubao-seed-2-1-lite-260915", "previous_response_id": "resp_0217772771288531389853d7d0951ef6849890aa76b17cc5b65ac", "input": [ { "type": "message", "role": "user", "content": [ { "type": "input_audio", "audio_url": "https://arkdocs.tos-cn-beijing.volces.com/files/advanced-usage/audio_demo_video_multispeaker_02.m4a" }, { "type": "input_text", "text": "这段还是刚才那几个人吗?他们的情绪相比上一段有什么变化?" } ] } ] }' ``` 第二轮响应: ``` { "id": "resp_021777277730499f0fcebbb8d813ae358cfc99ccc356325bebca4", "object": "response", "model": "doubao-seed-2-1-lite-260915", "output": [ { "type": "message", "role": "assistant", "content": [ { "type": "output_text", "text": "这段依旧是之前的三位说话人,没有更换或新增参与者,还是2位青年男性+1位青年女性的组合。\n\n情绪变化非常明显:\n上一段对话里他们整体处于边操作边核验内容、核对排版和内容匹配度的状态,情绪偏向专注务实,只有确认内容匹配上了的浅层次的稳妥感;\n到了这段,他们的情绪直接从平稳的核验状态跳转到了亢奋愉悦的状态,完全被最终呈现的效果惊艳到,满是直白的夸赞,满是“效果远超预期、需求被完美满足”的畅快的满意感,氛围从之前偏严谨的核对感,变成了轻松雀跃的高度正向认可的氛围。" } ] } ], "previous_response_id": "resp_0217772771288531389853d7d0951ef6849890aa76b17cc5b65ac", "usage": { "input_tokens": 285, "output_tokens": 538, "total_tokens": 823 } } ``` ## 音频分析(Caption) 依托大模型能力对音频进行全方位结构化描述与解析,覆盖音频基础属性、核心内容、说话人信息、环境声音事件、背景音乐等多维度内容。广泛应用于媒资智能编目、内容合规审核前置打标等业务场景。 下面是简单示例代码 ```Bash curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "doubao-seed-2-1-lite-260915", "instructions": "# 角色与目标\n【角色定位】你是一位资深音频描述专家,听觉灵敏、逻辑严谨、有良好的文学创作素养和通感能力,擅长听音频写描述。\n【任务说明】我会给你一段音频,你的任务是完整地听完这段音频,进行深度、全面地分析。你需要精准地识别音频中的每一个声音元素(人声、音效、音乐),分析它的声学特征和叙事作用。然后遵守内容要求和输出格式,生成结构清晰、内容详实、语言生动的音频分析报告。", "input": [ { "type": "message", "role": "user", "content": [ { "type": "input_audio", "audio_url": "https://arkdocs.tos-cn-beijing.volces.com/files/advanced-usage/audio_demo_video_caption.m4a" }, { "type": "input_text", "text": "请整体描述这段音频,按markdown格式输出。# 内容要求\n### 音频概述\n整体概述 音频的 物理属性(比如时长、音色音量、清晰度),核心内容构成,整体听感;\n### 内容分析(如有)\n概括对话或独白的主要内容发展,总结标题和摘要\n### 说话人信息(如有)\n对音频说话部分进行说话人语音特征分析\n### 声音事件信息\n对音频非言语部分进行音频特征分析\n### 音乐信息\n对音频音乐部分进行音频特征分析" } ] } ] }' ``` 按需替换 Model ID,查询 Model ID 参见 [模型列表](/docs/model-list)。 回复预览 ```Plaintext # 音频概述\n这是一段时长约11秒的中文美妆电商种草口播音频,整体清晰度极高,无额外背景杂音干扰,音量平稳适中,核心由带货人声和适配产品调性的背景音构成,整体听感轻快亲和,是典型的短视频美妆产品推广片段。\n# 内容分析\n### 内容标题\n本命面霜安利种草\n### 内容摘要\n带货主播向受众分享自己发掘到的心仪面霜产品,先是描述产品云朵般软糯、一抹就吸收的优秀质地,随后点明该面霜兼具熬夜急救、补水保湿的核心功效,快速完成产品核心优势的输出。\n# 说话人信息\n音频中仅出现一名青年女性带货主播,声线明亮饱满,语气热情富有感染力,带着明显的正向安利情绪,语速适中,表达说服力强,完全贴合美妆类电商推广的说话风格。\n# 声音事件信息\n该音频片段未出现独立的非言语类环境音效,全程人声清晰突出,无多余杂音干扰。\n# 音乐信息\n背景搭配一段轻柔舒缓的纯音乐,以钢琴为核心演奏乐器,旋律流畅平缓,氛围温馨治愈,和护肤产品的舒适调性高度契合,音量控制得当,不会喧宾夺主,起到烘托松弛种草氛围的作用。 ``` ## 语音识别(ASR) 可对输入音频进行结构化描述性解析,实时转写为纯文本,或附带时间戳的结构化文本,是各类语音理解任务的基础核心能力。结合业务输出需求,能力可覆盖通用文本转写、时间戳标记、多人区分转写、说话人分离日志等细分应用场景。 > **说明** > > * 共支持 **19 种语种识别**:zh(中文)、en(英语)、yue(粤语)、ar(阿拉伯语)、nl(荷兰语)、vi(越南语)、fr(法语)、de(德语)、id(印尼语)、it(意大利语)、ja(日语)、ko(韩语)、ms(马来语)、pt(葡萄牙语)、ru(俄语)、es(西班牙语)、th(泰语)、tr(土耳其语)、fil(菲律宾语)。 > * **中文方言适配**:支持江淮官话、冀鲁官话、兰银官话、中原官话、四川话、粤语、闽南语、上海话、客家话、晋语方言识别。 ### 普通ASR 仅输出原始纯转写文本,不含额外格式与冗余信息,结果简洁干净。适用于会议纪要、语音笔记等对文本纯净度要求较高的业务场景。 下面是简单示例代码: ```Bash curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "doubao-seed-2-1-lite-260915", "instructions": "You are a highly advanced AI specialized in Automatic Speech Recognition (ASR). Your sole function is to transcribe the audio provided by the user.\nYou must adhere to the following rules STRICTLY:\n1. Your output must contain ONLY the transcribed text from the audio.\n2. Do not include any introductory phrases, explanations, apologies, or any other conversational text. For example, never start your response with \"Here is the transcription:\" or \"The transcribed text is:\".\n3. Do not use any formatting, such as markdown, bolding, or italics.\n4. If the audio is unclear, inaudible, or contains no speech, you must output an empty string.", "input": [ { "type": "message", "role": "user", "content": [ { "type": "input_audio", "audio_url": "https://arkdocs.tos-cn-beijing.volces.com/files/advanced-usage/audio_demo_video_caption.m4a" }, { "type": "input_text", "text": "这段语音的内容是:" } ] } ] }' ``` 按需替换 Model ID,查询 Model ID 参见 [模型列表](/docs/model-list)。 回复预览 ```Plaintext 挖到本命面霜了质地像云朵一样软糯一抹就吸收熬夜急救补水保湿全搞定 ``` ### 输出时间戳 在音频转写的基础上,为每个字(或每句)附带时间戳信息。根据业务使用场景,可进一步分为两种模式:由模型自主完成音频转写并同步打上时间戳,或基于已有的转写文本,完成时间戳精准对齐。 #### 音频转写时间戳 模型输出转写文本的同时,为每个字符同步返回精细化起止时间信息,以秒为单位计量。可满足音频检索、视频字幕打轴、音频片段精准定位等业务需求,高效提升内容检索与编辑处理效率。 下面是简单示例代码 ```Bash curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "doubao-seed-2-1-lite-260915", "instructions": "你是一个多语种语音识别专家,能够理解捕捉在语音识别过程中的时序关系。你必须按着用户给定的模板进行输出,避免其他无关的输出内容。", "input": [ { "type": "message", "role": "user", "content": [ { "type": "input_audio", "audio_url": "https://arkdocs.tos-cn-beijing.volces.com/files/advanced-usage/audio_demo_video_caption.m4a" }, { "type": "input_text", "text": "请转录这段音频文件。对于识别出的每一个字请提供其精确的开始时间和结束时间。\n你需要按着一字一行的格式来排列结果,每一行用'';''隔开。每一行的由三部分组成,分别为开始时间、结束时间、转写字符,并且用''-''将它们分割开。要注意开始时间和结束时间的单位为秒,可以精确到小数点后两位。\n可以参考下面的模板:\n{开始时间}-{结束时间}-{转写字符};{开始时间}-{结束时间}-{转写字符};...{开始时间}-{结束时间}-{转写字符};\n注意你只能按着模板输出结果,请勿输出其它无关的信息和内容。" } ] } ] }' ``` 按需替换 Model ID,查询 Model ID 参见 [模型列表](/docs/model-list)。 回复预览 ```Plaintext 0.03-0.24-挖;0.24-0.45-到;0.45-0.66-本;0.66-0.84-命;0.84-1.02-面;1.02-1.26-霜;1.26-1.61-了;2.64-2.84-质;2.84-2.98-地;2.98-3.15-像;3.15-3.42-云;3.42-3.60-朵;3.60-3.68-一;3.68-3.87-样;3.87-4.07-软;4.07-4.39-糯;4.42-4.59-一;4.59-4.80-抹;4.80-4.92-就;4.92-5.16-吸;5.16-5.54-收;8.16-8.40-熬;8.40-8.64-夜;8.64-8.85-急;8.85-9.15-救;9.18-9.33-补;9.33-9.48-水;9.48-9.69-保;9.69-10.07-湿;10.14-10.47-全;10.47-10.65-搞;10.65-10.91-定; ``` #### 字幕对齐时间戳 适用于已具备完整音频文本的场景,如人工校对完成的字幕内容。仅由模型完成文本与音频的时间轴对齐,严格保留原文内容、不做文本修改。适合字幕制作、卡拉 OK 打轴等。 下面是简单示例代码 ```Bash curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "doubao-seed-2-1-lite-260915", "instructions": "你拥有对齐语音内容与转写文本的能力,你能深刻理解语音中存在的时序关系,现在需要你按照用户的要求输出用户所需要的识别结果。你必须按照用户给定的模板进行输出,避免其他无关的输出内容。", "input": [ { "type": "message", "role": "user", "content": [ { "type": "input_audio", "audio_url": "https://arkdocs.tos-cn-beijing.volces.com/files/advanced-usage/audio_demo_video_caption.m4a" }, { "type": "input_text", "text": "听写这段音频,音频对应转写结果为:「挖到本命面霜了质地像云朵一样软糯一抹就吸收熬夜急救补水保湿全搞定」。现在我需要你根据音频的转写结果把音频中的每个字符都对应上它的开始时间和结束时间。要求你不要篡改转写结果,只需要根据音频的转写结果输出对应的时间信息。\n你需要按着一字一行的格式来排列结果,每一行用'';''隔开。每一行的由三部分组成,分别为开始时间、结束时间、转写字符,并且用''-''将它们分割开。要注意开始时间和结束时间的单位为秒,可以精确到小数点后两位。\n可以参考下面的模板:\n{开始时间}-{结束时间}-{转写字符};...;{开始时间}-{结束时间}-{转写字符};\n注意你只能按着模板输出结果,请勿输出其它无关的信息和内容。" } ] } ] }' ``` 按需替换 Model ID,查询 Model ID 参见 [模型列表](/docs/model-list)。 回复预览 ```Plaintext 0.03-0.24-挖;0.24-0.45-到;0.45-0.65-本;0.65-0.84-命;0.84-1.02-面;1.02-1.25-霜;1.25-1.58-了;2.65-2.85-质;2.85-2.98-地;2.98-3.15-像;3.15-3.42-云;3.42-3.62-朵;3.62-3.72-一;3.72-3.87-样;3.87-4.05-软;4.05-4.38-糯;4.41-4.59-一;4.59-4.80-抹;4.80-4.92-就;4.92-5.14-吸;5.14-5.52-收;7.98-8.25-熬;8.25-8.46-夜;8.46-8.67-急;8.67-8.99-救;9.02-9.15-补;9.15-9.33-水;9.33-9.51-保;9.51-9.93-湿;9.96-10.31-全;10.31-10.50-搞;10.50-10.77-定; ``` ## 多说话人语音识别(Multispeaker ASR) 支持多人对话音频转写,区分不同发言主体,并为每段内容标注独立说话人编号(`spk0`、`spk1` 等)。适用于访谈交流、日常对话、客服录音等场景,便于内容整理与分类归纳。 下面是简单示例代码 ```Bash curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "doubao-seed-2-1-lite-260915", "instructions": "下面是一段多人说话的语音,你需要识别说话内容并标记每句话对应的说话人。对话中出现的第一个人用[spk0]表示,第二个人用[spk1]表示,以此类推。", "input": [ { "type": "message", "role": "user", "content": [ { "type": "input_audio", "audio_url": "https://arkdocs.tos-cn-beijing.volces.com/files/advanced-usage/audio_demo_video_multispeaker_01.m4a" }, { "type": "input_text", "text": "请顺序输出说话人编号以及语音内容:" } ] } ] }' ``` 按需替换 Model ID,查询 Model ID 参见 [模型列表](/docs/model-list)。 回复预览 ```Plaintext [spk1]而且还把账号跟它连上,你看,排版没错吧?\n[spk0]哎呦,这排版挺像回事儿啊,没毛病啊,我我打开公众号都这样。\n[spk1]你看,就是这个数据的。\n[spk0]这个图表正好是跟这个内容匹配上的。\n[spk1]没错,对,说的是价格走势,底下放的就是价格走势。\n[spk0]哎呦。\n[spk1]然后哎,然后怎么怎么。 ``` ## 说话人日志(Speaker Diarization and ASR) 在多人语音识别能力基础上,进一步为每段发言匹配精准起止时间。统一输出「说话人编号 + 时间范围 + 转录文本」的结构化格式:`[spkN][开始-结束] 说话内容`。 下面是简单示例代码 ```Bash curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "doubao-seed-2-1-lite-260915", "instructions": "你是一位顶尖的音频分析专家,能够精准地识别出每一位说话者,并为他们说的话标注精确的时间点。", "input": [ { "type": "message", "role": "user", "content": [ { "type": "input_audio", "audio_url": "https://arkdocs.tos-cn-beijing.volces.com/files/advanced-usage/audio_demo_video_multispeaker_01.m4a" }, { "type": "input_text", "text": "我有个录音,你帮我整理一下。主要就是把不同人的发言时间都给我找出来,告诉我谁在什么时候说了话。\n你需要按着说话人、时间戳的格式来排列结果。其中时间戳包括开始时间和结束时间,要注意开始时间和结束时间的单位为秒,可以精确到小数点后两位,说话人可以按着出场顺序标记成 spk0、spk1、spk2 等等来代替。\n可以参考下面的模板:\n[说话人][开始时间-结束时间]说话内容[说话人][开始时间-结束时间]说话内容...\n注意你只能按着模板输出结果,请勿输出其它无关的信息和内容。" } ] } ] }' ``` 按需替换 Model ID,查询 Model ID 参见 [模型列表](/docs/model-list)。 回复预览 ```Plaintext [spk0][0.00-1.50]哎呀把账号跟他连上你看[spk1][1.54-2.81]排版还挺像回事啊[spk0][2.83-3.32]对吧[spk1][3.44-4.95]没毛病啊我我打开公众号都这样[spk0][5.21-6.44]就是这个数据的[spk1][6.45-7.87]图表正好是跟这个内容[spk0][7.89-8.33]没错[spk1][8.35-8.84]匹配上的[spk0][8.87-11.18]对说的是价格走势底下放的就是价格走势[spk1][11.20-11.55]哎呦[spk0][11.66-12.97]然后哎然后怎么怎么 ``` ## 语音翻译(AST) 对音频口语内容进行跨语言翻译,输出目标语种文本。支持多语种双向互译,可满足国际会议实时同传、多语言视频字幕本地化、出海音频内容审核校对等业务需求。 > **说明** > > * **语种与互译规则**:AST 共覆盖 **15 个语种**,包含:zh(中文)、en(英语)、yue(粤语)、ar(阿拉伯语)、vi(越南语)、fr(法语)、de(德语)、id(印尼语)、it(意大利语)、ja(日语)、ko(韩语)、pt(葡萄牙语)、ru(俄语)、es(西班牙语)、th(泰语)。仅支持中文、英语与其余 14 个语种双向互译,暂不支持其它语种之间两两互译。 > * **关联能力联动**:结合语音转写(ASR)能力,可提供 **19 个语种**高精度音频转写服务,覆盖语种:zh(中文)、en(英语)、yue(粤语)、ar(阿拉伯语)、nl(荷兰语)、vi(越南语)、fr(法语)、de(德语)、id(印尼语)、it(意大利语)、ja(日语)、ko(韩语)、ms(马来语)、pt(葡萄牙语)、ru(俄语)、es(西班牙语)、th(泰语)、tr(土耳其语)、fil(菲律宾语)。若业务所需翻译语向超出 AST 支持范围,且源语种或目标语种在 ASR 语种列表内,可采用 **ASR 语音转写 + 文本翻译** 组合方案: > > * **语音转写**:上传原始音频,调用 ASR 能力,将源语言音频精准转写为原文文本。 > > * **文本翻译**:以 ASR 输出的文本作为输入,调用文本翻译能力,生成目标语种译文。 下面是简单示例代码 ```Bash curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "doubao-seed-2-1-lite-260915", "instructions": "Your task is to accurately translate the spoken content in the audio and return it in text form.", "input": [ { "type": "message", "role": "user", "content": [ { "type": "input_text", "text": "把这句话翻译成德语,最终输出仅能是翻译结果,不要返回任何其他多余的内容。" }, { "type": "input_audio", "audio_url": "https://arkdocs.tos-cn-beijing.volces.com/files/advanced-usage/audio_demo_video_caption.m4a" } ] } ] }' ``` 按需替换 Model ID,查询 Model ID 参见 [模型列表](/docs/model-list)。 回复预览 ```Plaintext Ich habe endlich meine absolute Traum-Gesichtscreme gefunden! Ihre Textur ist so weich und fluffig wie eine Wolke, sie zieht sofort nach dem Auftragen in die Haut ein. Als perfekte Notlösung nach langen Nächten meistert sie alles mühelos: Sie versorgt die Haut intensiv mit Feuchtigkeit und hält sie langanhaltend feucht. ``` ## 流式输出 流式输出支持内容动态实时呈现,既能够缓解用户等待焦虑,又可以规避复杂任务因长时间推理引发的客户端超时失败问题,保障请求流程顺畅。 示例代码如下: **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Authorization: Bearer $ARK_API_KEY" \ -H 'Content-Type: application/json' \ -d '{ "model": "doubao-seed-2-1-lite-260915", "stream": true, "input": [ { "role": "user", "content": [ { "type": "input_audio", "audio_url": "https://arkdocs.tos-cn-beijing.volces.com/files/advanced-usage/ark_demo_audio.mp3" }, { "type": "input_text", "text": "请识别这段音频内容" } ] } ] }' ``` 按需替换 Model ID,查询 Model ID 参见 [模型列表](/docs/model-list)。 **选项:Python** ```Python import asyncio import os from arkruntime import AsyncArk from arkruntime.types.responses.response_completed_event import ResponseCompletedEvent from arkruntime.types.responses.response_reasoning_summary_text_delta_event import ResponseReasoningSummaryTextDeltaEvent from arkruntime.types.responses.response_output_item_added_event import ResponseOutputItemAddedEvent from arkruntime.types.responses.response_text_delta_event import ResponseTextDeltaEvent from arkruntime.types.responses.response_text_done_event import ResponseTextDoneEvent client = AsyncArk( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=os.getenv('ARK_API_KEY') ) async def main(): # Directly use remote audio URL (no need to upload file) print("Use remote audio URL for transcription") # Streaming Responses API request (matches your curl) stream = await client.responses.create( model="doubao-seed-2-1-lite-260915", input=[ {"role": "user", "content": [ { "type": "input_audio", "audio_url": "https://arkdocs.tos-cn-beijing.volces.com/files/advanced-usage/ark_demo_audio.mp3" }, { "type": "input_text", "text": "请识别这段音频内容" } ]}, ], caching={ "type": "enabled", }, store=True, stream=True ) # Handle streaming events (same format as your video script) async for event in stream: if isinstance(event, ResponseReasoningSummaryTextDeltaEvent): print(event.delta, end="") if isinstance(event, ResponseOutputItemAddedEvent): print("\noutPutItem " + event.type + " start:") if isinstance(event, ResponseTextDeltaEvent): print(event.delta,end="") if isinstance(event, ResponseTextDoneEvent): print("\noutPutTextDone.") if isinstance(event, ResponseCompletedEvent): print("Response Completed. Usage = " + event.response.usage.model_dump_json()) if __name__ == "__main__": asyncio.run(main()) ``` **选项:Go** ```Go package main import ( "context" "fmt" "io" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/responses" ) func main() { client := arkruntime.NewClientWithApiKey( // Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() fmt.Println("----- Use remote audio URL -----") inputMessage := responses.InputItem{ OneOf: responses.NewItemEasyMessageInputItemSum( responses.ItemEasyMessage{ Role: responses.NewOptMessageRole(responses.MessageRoleUser), Content: responses.NewContentItemArrayMessageContent( []responses.ContentItem{ {OneOf: responses.NewContentItemAudioContentItemSum(responses.ContentItemAudio{Type: responses.ContentItemAudioTypeInputAudio, AudioURL: responses.NewOptString("https://arkdocs.tos-cn-beijing.volces.com/files/advanced-usage/ark_demo_audio.mp3")})}, {OneOf: responses.NewContentItemTextContentItemSum(responses.ContentItemText{Type: responses.ContentItemTextTypeInputText, Text: "请识别这段音频内容"})}, }, ), }, ), } request := &responses.ResponsesRequest{ Model: "doubao-seed-2-1-lite-260915", Input: responses.NewInputItemArrayResponsesInput( []responses.InputItem{inputMessage}, ), } stream, err := client.CreateResponsesStream(ctx, request) if err != nil { fmt.Printf("stream error: %v\n", err) return } for { event, err := stream.Recv() if err == io.EOF { break } if err != nil { fmt.Printf("stream error: %v\n", err) return } handleEvent(event) if event.OneOf.Type == responses.ResponseCreatedEventResponseStreamEventSum { fmt.Printf("\nResponse ID: %s\n", event.OneOf.ResponseCreatedEvent.Response.ID) } } fmt.Println("\n----- Audio recognition completed -----") } func handleEvent(event *responses.ResponseStreamEvent) { switch event.OneOf.Type { case responses.ResponseReasoningSummaryTextDeltaEventResponseStreamEventSum: fmt.Print(event.OneOf.ResponseReasoningSummaryTextDeltaEvent.Delta.Or("")) case responses.ResponseReasoningSummaryTextDoneEventResponseStreamEventSum: fmt.Printf( "\nAggregated reasoning text: %s\n", event.OneOf.ResponseReasoningSummaryTextDoneEvent.Text.Or(""), ) case responses.ResponseTextDeltaEventResponseStreamEventSum: fmt.Print(event.OneOf.ResponseTextDeltaEvent.Delta.Or("")) case responses.ResponseTextDoneEventResponseStreamEventSum: fmt.Printf( "\nAggregated output text: %s\n", event.OneOf.ResponseTextDoneEvent.Text.Or(""), ) } } ``` **选项:Java** ```Java package com.ark.example; import com.volcengine.ark.runtime.service.ArkService; import com.volcengine.ark.runtime.models.responses.*; public class demo { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); ArkService service = ArkService.builder().apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); System.out.println("===== Use Remote Audio URL Example ====="); ResponsesRequest request = ResponsesRequest.builder() .model("doubao-seed-2-1-lite-260915") .stream(true) .input(ResponsesInput.ofList(java.util.Arrays.asList(ItemEasyMessage.builder().role(MessageRole.USER).content( MessageContent.ofList(java.util.Arrays.asList(ContentItemAudio.builder() .audioUrl("https://arkdocs.tos-cn-beijing.volces.com/files/advanced-usage/ark_demo_audio.mp3") .build(), ContentItemText.builder() .text("请识别这段音频内容") .build())) ).build()))) .build(); service.streamResponse(request) .doOnError(Throwable::printStackTrace) .blockingForEach(event -> { if (event instanceof ResponseReasoningSummaryTextDeltaEvent) { System.out.print(((ResponseReasoningSummaryTextDeltaEvent) event).getDelta()); } if (event instanceof ResponseOutputItemAddedEvent) { System.out.println("\nOutputItem " + (((ResponseOutputItemAddedEvent) event).getItem().getType()) + " Start: "); } if (event instanceof ResponseTextDeltaEvent) { System.out.print(((ResponseTextDeltaEvent) event).getDelta()); } if (event instanceof ResponseTextDoneEvent) { System.out.println("\nOutputText End."); } if (event instanceof ResponseOutputItemDoneEvent) { System.out.println("\nOutputItem " + ((ResponseOutputItemDoneEvent) event).getItem().getType() + " End."); } if (event instanceof ResponseFunctionCallArgumentsDoneEvent) { System.out.println("\nFunctionCall Arguments: " + ((ResponseFunctionCallArgumentsDoneEvent) event).getArguments()); } if (event instanceof ResponseCompletedEvent) { System.out.println("\nResponse Completed. Usage = " + ((ResponseCompletedEvent) event).getResponse().getUsage()); } }); service.shutdownExecutor(); } } ``` **选项:OpenAI SDK** ```Python import os from openai import OpenAI api_key = os.getenv('ARK_API_KEY') client = OpenAI( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) # Directly use remote audio URL (no need to upload file) print("Use remote audio URL for transcription") response = client.responses.create( model="doubao-seed-2-1-lite-260915", input=[ { "role": "user", "content": [ { "type": "input_audio", "audio_url": "https://arkdocs.tos-cn-beijing.volces.com/files/advanced-usage/ark_demo_audio.mp3" }, { "type": "input_text", "text": "请识别这段音频内容" }, ] } ], stream=True ) # Handle streaming events (same format as your video script) for event in response: if event.type == "response.reasoning_summary_text.delta": print(event.delta, end="") if event.type == "response.output_item.added": print("\noutPutItem " + event.type + " start:") if event.type == "response.output_text.delta": print(event.delta, end="") if event.type == "response.output_item.done": print("\noutPutTextDone.") if event.type == "response.completed": print("\nResponse Completed. Usage = " + str(event.response.usage)) ``` # **使用说明** ## 音频格式说明 支持的音频格式 MIME 类型如下: **纯音频格式** * mp3:`audio/mpeg` * wav:`audio/wav` * aac:`audio/aac` * m4a:`audio/x-m4a` **视频内嵌音频格式** * mp3:`audio/mpeg` * wav:`audio/wav` * aac:`audio/aac` * m4a:`audio/x-m4a` * ac3:`audio/ac3` * alac:`audio/mp4` ## 音频 token 用量说明 每秒音频约 6.25 token,实际 token 用量以接口返回的`audio_tokens`为准。 ## 音频文件容量限制 不同音频输入方式对应的文件大小及时长限制如下: * Files API 上传(推荐):单文件大小不超过 512 MB。 * Base64 编码传入:单文件大小不超过 25 MB,音频时长不超过 120 分钟。 * 公网 URL 传入:单文件大小不超过 25 MB,音频时长不超过 120 分钟。 --- # Doubao Seedance 2.5 教程 Source: https://ark.volcengine.com/region:cn-beijing/docs/seedance-2-5 Doubao Seedance 2.5(下文简称 Seedance 2.5)是新一代视频创作模型,在长叙事能力、全模态参考能力和编辑能力上全面提升。单次生成时长提升至 30 秒并支持多轮延长,单次参考多模态素材上限提升至 50 个,提供基于时间戳的精准编辑控制。画面质感全面优化,成片更接近实拍的影视质感。本文介绍 Seedance 2.5 模型的特色能力与使用方法,帮助您快速实现 [创建视频生成任务 API](/docs/create-video-generation-task-api) 调用。 > **说明:模型开通条件** > > 开通 Seedance 2.5 模型前,请确保您满足以下任一条件: > * **【推荐】账户余额 > 200 元**([前往充值](https://console.volcengine.com/finance/fund/recharge)) > * **【推荐】购买 200 元档位及以上专属节省计划**,购买入口:[购买节省计划](https://console.volcengine.com/common-buy/AI-SavingsPlans%7C%7Cd682ppeeq1mp7kd5q0e0)。 > * 已购买 Seedance 2.5 系列资源包且有可用余量 ([前往购买](https://console.volcengine.com/common-buy/ark_bd%7C%7Cd9li7rchmjlhari755h0)) > > 详细规则见 [Seedance 2.5 与 Seedance 2.0 系列模型开通、使用与退订说明](/docs/seedance-model-activation-usage-and-refund)。 # 使用前必读 > **警告** > > Seedance 2.5 模型在视频编辑、首帧/首尾帧、视频延长任务下存在特殊限制,如不遵循将触发 [报错](/docs/seedance-2-5#2.5_error_handling)。 > > **请务必在调用模型前仔细阅读下文,确保任务类型、提示词意图和参数配置一致。** ## 任务类型与限制 Seedance 2.5 会根据输入素材和提示词意图判断任务类型。任务类型包括文生视频、首帧/首尾帧生视频,以及**全模态参考生视频任务**;其中全模态参考生视频任务根据提示词意图进一步分为参考生视频、视频编辑和视频延长 3 类子任务。 |任务类型 ||触发条件 |特殊限制 | |---|---|---|---| |文生视频 ||仅传入文本提示词 | `ratio` / `duration` 无特殊限制 | |首帧/首尾帧生视频 ||`content.role` 设置为 `first_frame` / `last_frame` |`ratio` 必须为 `adaptive` | \ | | | |
    模型自动保持输出视频宽高比和 `first_frame` 指定的首帧图片一致
    | |全模态生视频任务 |参考生视频 |`content` 中至少包含一个 `role` 为 `reference_image`、`reference_video` 或 `reference_audio` 的参考素材 |`ratio` / `duration` 无特殊限制 | |^^ |视频编辑 |`content` 中至少包含一个 `role` 为 `reference_video` 的参考视频,并通过提示词表达编辑意图 |* `ratio` 必须为 `adaptive`、`duration` 必须为 `-1` | \ | | | |
    模型根据提示词意图选定待编辑视频,并自动保持输出视频宽高比、时长和待编辑视频一致
    | \ | | | |* 参考视频时长必须为 4-30 秒 | |^^ |视频延长 |`content` 中至少包含一个 `role` 为 `reference_video` 的参考视频,并通过提示词表达延长意图 |`ratio` 必须为 `adaptive` | \ | | | |
    模型根据提示词意图选定待延长视频,并自动保持输出视频宽高比和待延长视频一致
    | > **注意** > > 为减少因特殊限制触发的异步报错,全模态参考生视频任务可通过配置`omni_reference_task_type`显示引导任务类型将报错前置,具体参考下文配置方法。 ## 配置方法 ### 全模态参考生视频(不区分子任务) 对于全模态参考生视频任务,如果您没有明确区分具体的子任务类型,**推荐按以下方式配置参数**: 1. `omni_reference_task_type` 设置为 `auto`。 2. `content.role` 设置为 `reference_image`、`reference_video` 或 `reference_audio`。 3. 推荐将 `ratio` 设置为 `adaptive`、`duration` 设置为 `-1`。如果传入参考视频,建议单个参考视频时长为 4–30 秒。 > **说明** > > `omni_reference_task_type` 设置为 `auto` 时,模型根据提示词意图,可能将任务判定为参考生视频、视频编辑、视频延长任务。其中视频编辑、视频延长任务对配置参数有特殊限制。**按推荐方式配置,可以兼容这些限制,减少任务创建后触发 [异步报错](/docs/seedance-2-5#2.5_async_error)**。 ### 视频编辑 > 对原视频的画面或音频进行编辑操作,如替换视频主体、增删视频中对象、局部画面重绘或修复等 对于明确的视频编辑类任务,推荐以下**配置方法:** 1. `omni_reference_task_type` 设置为 `edit`。 2. `content` 中至少包含一个 `role` 为 `reference_video` 的参考视频。 3. `ratio` 必须为 `adaptive`;`duration` 必须为 `-1`;参考视频时长必须为 4–30 秒。 4. 提示词中需包含至少一个关键词:编辑视频、增加/加上、删除/去掉、修改/替换/改成。 > 提示词示例:@video1 中加一些小动物;把 @video1 的人物修改为 @image1;删掉 @video1 的背景音乐 ### 视频延长 > 对原视频进行向前或向后延长 对于明确的视频延长类任务,推荐以下**配置方法:** 1. `omni_reference_task_type` 设置为 `extend`。 2. `content` 中至少包含一个 `role` 为 `reference_video` 的参考视频。 3. `ratio` 必须为 `adaptive`。 4. 提示词中需包含至少一个关键词:向前/向后延长、延续、续写。 > 提示词示例:向后延长 @video1,@image1 的角色从天而降...;续写 @video1 前 5s,@video2 女人入画说... ### 首帧/首尾帧生视频 > 输入 1 张图作为首帧生成视频,或输入 2 张图分别作为首帧和尾帧生成视频 1. `content` 中需包含 `role` 为 `first_frame` 的图片;首尾帧生视频还需包含 `role` 为 `last_frame` 的图片。 2. `ratio` 必须为 `adaptive`。 ## 报错机制 Seedance 2.5 存在以下两种参数校验与报错机制。 ### 同步报错(提交任务时) * 对于全模态参考生视频任务,显式指定 `omni_reference_task_type` 为 `edit` 或 `extend` 时,接口将前置校验特殊参数限制,若不符合要求,接口立即返回错误。 > **注意** > > 实际处理任务时,模型仍会进一步结合提示词判断任务类型。若实际判定的任务类型和指定的不一致,仍会触发异步报错(错误码: [`InvalidParameter.TaskTypeMismatch`](/docs/error-codes))。建议遵循各任务类型提示词写法,降低报错概率。 ### 异步报错(任务启动后) * 对于全模态参考生视频任务,未传入 `omni_reference_task_type` 或将其设置为 `auto` 时,模型先根据输入素材和提示词判断实际任务类型,再校验该类型的特殊参数限制。不符合要求时,任务异步报错。 * 对于首帧/首尾帧生视频,参数配置不符合任务特殊限制时,任务异步报错 > **说明** > > 因参数配置和任务类型不兼容导致的异步报错,错误码:[`InvalidParameter.TaskTypeConstraint`](/docs/error-codes)。 # 新手入门 > **说明** > > * 若您是编程零基础用户,推荐使用 [控制台体验中心](https://ark.volcengine.com/region:cn-beijing/experience/gen_video?model=doubao-seedance-2-5-260628),包含丰富的模板库,可一键生成同款视频,无需编写代码即可快速上手创作。 > * 若您想快速体验 API 调用,推荐使用API Explorer,内置预设参数模板,可一键发起 API 调用;同时也支持灵活调整参数(例如设置视频水印等),满足多样化的测试和使用场景。 > * 若您想真正开始编程开发,但苦于搭建开发环境、依赖安装等问题,推荐阅读本节内容。 本入门教程专为 **API 新手用户** 设计,帮助您一键搭建 Python 开发环境、完成虚拟环境创建和方舟 SDK 安装,并提供直接可运行的 Seedance 2.5 调用代码,您只需修改对应的输入素材,即可开始您的视频生成创作。 **1. 准备工作** 在开始之前,请确保您已经完成以下准备: 1. **注册账号**:确保您拥有火山引擎账号并已 [登录](https://console.volcengine.com/)。 2. **获取 API Key**:访问 [API Key 管理页面](https://ark.volcengine.com/region:cn-beijing/apikey),点击 **创建 API Key**,并复制保存您的 API Key。注意请妥善保管您的 API Key,不要泄露给他人。 3. [**开通模型**](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=model&projectName=default&tab=ComputerVision):请确保您的账户余额大于等于 200 元,或已 [购买资源包](https://console.volcengine.com/common-buy/ark_bd%7C%7Cd9li7rchmjlhari755h0),否则无法开通 Seedance 2.5 模型。 4. **下载并解压文件**:点击下载下方附件,将其解压到您的本地目录(如桌面或“下载”文件夹)。 [ark_seedance2.5_quickstart_package.zip](https://arkdocs.tos-cn-beijing.volces.com/files/video-generation/ark_seedance2.5_quickstart_package_arkruntime-20260909.zip) **2.操作步骤** **选项:Windows 用户** 1. 进入 `scripts/init_dev_env` 目录。 2. 双击运行 `setup_windows.bat`。 3. 脚本会自动执行以下操作: * 下载 uv 工具。 * 自动下载 Python 3.12(如果不干扰您的系统 Python)。 * 创建虚拟环境 .`venv`。 * 安装方舟 SDK。 4. 完成后,在项目根目录会生成一个 `run_demo.bat`。 5. 双击 `run_demo.bat`,即可运行 Python SDK 示例代码(python/demo_standard.py)。 **选项:macOS 用户** 1. 打开终端,进入 `scripts/init_dev_env` 目录。 2. 运行构建脚本: ```Plain Text ./setup_mac.sh ``` 3. 脚本会自动配置好所有环境。 4. 完成后,在项目根目录会生成一个 `run_demo.sh`。 5. 运行 `./run_demo.sh` 即可运行 Python SDK 示例代码(python/demo_standard.py)。 **3.运行说明** 运行脚本后,您将看到如下流程: 1. **API Key 校验**:脚本会自动检测您本地是否配置了`ARK_API_KEY`环境变量。如果没有,会提示您手动输入。 2. **素材预览**:脚本会自动在您的默认浏览器中弹出一个本地生成的 HTML 页面,直观地展示本次任务的文本提示词、待替换的参考图片以及原始参考视频。 3. **任务创建与轮询**:脚本向火山方舟服务器发起异步请求。由于视频生成需要一定时间,控制台会每隔 30 秒打印一次任务状态(如 `running`等)。 4. **获取结果**:任务成功后,控制台会输出一段最终生成的视频 URL。您可以复制该链接到浏览器下载或在线播放。 **4.下一步** 在成功跑通本示例后,您可以尝试修改 `python/``demo_standard.py`,来打造您专属的视频生成任务: 1. 修改文本提示词 找到代码中的 `user_content` 变量,更改为您想要的画面描述。 2. 替换输入素材 (图片、视频、音频) 您可以将 `reference_image_url`、`reference_video_url` 和 `reference_audio_url` 替换为您自己的素材链接。 **注意**:请确保 URL 是公网可公开访问的链接(建议存放在 TOS 对象存储服务中,并配置为公共读。详细介绍请参见 [TOS 数据订阅](https://docs.volcengine.com/docs/TorchObjectStorage/Datasubscription-5?lang=zh))。 3. 继续学习下文中丰富的使用示例。 # 最新能力
    **[生成视频时长翻倍](/docs/seedance-2-5#2.5_30s_video)** * 生成视频时长上限由 15 秒延长至 30 秒。
    **[参考素材数量增加](/docs/seedance-2-5#2.5_50_reference)** * 参考图数量上限由 9 张增至 30 张, * 参考音/视频数量上限由 3 个增至 10 个 * 参考音/视频总时长由 15 秒增至 30 秒
    **[更智能的宽高比/时长控制](/docs/seedance-2-5#2.5_smart_ratio_duration)** * 视频编辑任务,自动保持输出视频的宽高比、时长和输入视频一致。 * 视频延长、首帧/首尾帧任务,自动保持输出视频的宽高比和输入视频一致。
    **[新增 mov 输出格式](/docs/seedance-2-5#2.5_output_format)** * 输出视频新增 mov 格式(H.264 视频编码 + yuv444p 色度采样 + PCM 音频编码),提升视频编辑和视频延长场景下的色彩保真度与声画一致性。
    **[原生多语言](/docs/seedance-2-5#2.5_multi_language)** * 支持中文、英语、西班牙语、印度尼西亚语、马来语、泰语、阿拉伯语、葡萄牙语、越南语、日语、韩语等 11 种语言。
    # 能力概述 |模型名称 | |[Seedance 2.5](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seedance-2-5&projectName=default) |[Seedance 2.0](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seedance-2-0&projectName=default) |[Seedance 2.0 fast](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seedance-2-0-fast&projectName=default) |[Seedance 2.0 mini](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seedance-2-0-mini&projectName=default) | |---|---|---|---|---|---| |Model ID | |doubao-seedance-2-5-260628 |doubao-seedance-2-0-260128 |doubao-seedance-2-0-fast-260128 |doubao-seedance-2-0-mini-260615 | |[文生视频](/docs/video-generation-tutorial#4e74bcee) | |✓ |✓ |✓ |✓ | |[首帧生视频](/docs/video-generation-tutorial#979b2d28) | |✓ |✓ |✓ |✓ | |[首尾帧生视频](/docs/video-generation-tutorial#0d55ca07) | |✓ |✓ |✓ |✓ | |[全模态参考](/docs/seedance-2-5#2.5_50_reference) |图片参考 |✓ |✓ |✓ |✓ | |^^| | | | | | \ | |视频参考 |✓ |✓ |✓ |✓ | |^^| | | | | | \ | |音频参考 |✓ |✗(需搭配图片/视频) |✗(需搭配图片/视频) |✗(需搭配图片/视频) | |^^| | | | | | \ | |组合参考 |✓ |✓ |✓ |✓ | \ | | | | | | | \ | |* 图片 + 音频 | | | | | \ | |* 图片 + 视频 | | | | | \ | |* 视频 + 音频 | | | | | \ | |* 图片 + 视频 + 音频 | | | | | |[编辑视频](/docs/seedance-2-5#2.5_edit) | |✓ |✓ |✓ |✓ | |[延长视频](/docs/seedance-2-5#2.5_extend) | |✓ |✓ |✓ |✓ | |[生成有声视频](/docs/seedance-2-5#2.5_multi_language) | |✓ |✓ |✓ |✓ | |参考素材数量上限 | |50(30张图+10个视频+10个音频) |15(9张图+3个视频+3个音频) |15(9张图+3个视频+3个音频) |15(9张图+3个视频+3个音频) | |[联网搜索工具](/docs/seedance-2-0#c40ed3ef) | |✓ |✓ |✓ |✓ | |[样片模式](/docs/seedance-2-5#2.5_draft_mode) | |✓ |✗ |✗ |✗ | |[返回尾帧](/docs/video-generation-tutorial#141cf7fa) | |✓ |✓ |✓ |✓ | |[输出视频规格](/docs/seedance-2-5#2.5_video_output_specs) |[输出分辨率](/docs/seedance-2-5#2.5_resolution) |* 480p(8bit 位深) |* 480p(8bit 位深) |* 480p(8bit 位深) |* 480p(8bit 位深) | \ | | |* 720p(8bit 位深) |* 720p(8bit 位深) |* 720p(8bit 位深) |* 720p(8bit 位深) | \ | | |* 1080p(10bit 位深) |* 1080p(8bit 位深) | | | \ | | | |* 4k(10bit 位深) | | | |^^ |[输出宽高比](/docs/seedance-2-5#2.5_ratio) |21:9, 16:9, 4:3, |21:9, 16:9, 4:3, |21:9, 16:9, 4:3, |21:9, 16:9, 4:3, | \ | | | 1:1, 3:4, 9:16, adaptive | 1:1, 3:4, 9:16, adaptive | 1:1, 3:4, 9:16, adaptive | 1:1, 3:4, 9:16, adaptive | |^^ |[输出时长](/docs/seedance-2-5#2.5_duration) |4~30 秒;-1(在有效时长内由模型自动选择最佳时长) |4~15 秒;-1(在有效时长内由模型自动选择最佳时长) |4~15 秒;-1(在有效时长内由模型自动选择最佳时长) |4~15 秒;-1(在有效时长内由模型自动选择最佳时长) | |^^ |[输出视频格式](/docs/seedance-2-5#2.5_output_format) |mp4, mov |mp4 |mp4 |mp4 | |[离线推理](/docs/video-generation-tutorial#c3588bd1) | |✗ |✗ |✗ |✗ | # 特色能力 ## 30 秒视频连贯直出 Seedance 2.5 视频生成时长上限由 Seedance 2.0 系列的 15 秒延长至 30 秒,支持一次性生成长达 30 秒的连贯视频,无需多段拼接即可呈现完整故事。 |输入:文本 + 8 张图片 ||||输出 | |---|---|---|---|---| |
    ![](https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_30s_reference1.png)![](https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_30s_reference2.png)![](https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_30s_reference3.png)![](https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_30s_reference4.png)![](https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_30s_reference5.png)![](https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_30s_reference6.png)![](https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_30s_reference7.png)![](https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_30s_reference8.png)
    提示词:一镜到底,镜头平稳跟随一个穿黑色大衣的人从左向右穿过六个相连的不同色调、不同氛围的房间...(详见下方代码示例中的完整提示词)
    ||||[视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_30s_output1.mp4) | **选项:Curl** ```Bash curl -X POST https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seedance-2-5-260628", "content": [ { "type": "text", "text": "一镜到底,镜头平稳跟随一个穿黑色大衣的人(参考【图片 1】)从左向右穿过六个相连的不同色调、不同氛围的房间。每个房间结构相同:白墙、人字拼浅色木地板、法式双开落地窗、白纱帘,参考【图片 2】但窗外风景和室内氛围完全不同。主角全程匀速走动,穿过墙壁上敞开的每一扇门。0-5秒,第一个房间,主题为美漫打斗,主角进入屋内与人物(【图片 3】)打斗,人物落败;5-10秒,第二个房间,主题为温暖,毛毡风格,窗外场景为向日葵田(【图片 4】),室内光线暖橙柔光,有一个画家正在画向日葵(【图片 5】)。主角进入后也变成毛毡风格;10-15秒,第三个房间,主题为悲伤,整个画面为黑白漫画定格动画风格,窗外阴雨,室内光线冷灰低沉,一个人独自坐在空房间中央地板上,低头抱膝,身旁一只手机亮着无人接听的通话界面。主角进入房间后关上房间的灯,马上开灯,房间内变为彩色,瞬间生长出满屋鲜花;15-20秒,第四个房间,主题为欢乐,整个场景为浸泡在海里的房间,参考【图片 6】,主角游进房间,身旁有美丽的珊瑚礁和鱼群;20-25秒,第五个房间,主题为惊喜,窗外场景漫天烟花夜空,参考【图片 7】,室内光线彩色闪烁映射,主角被卷入欢呼气氛。25-30秒,最后主角来到一个空白房间,站在中央打了个响指,同时音效为响指声,画面整体黑屏,中间出现“seedance”字样,参考【图片 8】。整体电影质感,高级时装广告风格,光线完全由窗外场景决定形成强烈情绪反差,画面无文字。" }, { "type": "image_url", "role": "reference_image", "image_url": { "url": "asset://asset-20260831133727-94rtr" } }, { "type": "image_url", "role": "reference_image", "image_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_30s_reference2.png" } }, { "type": "image_url", "role": "reference_image", "image_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_30s_reference3.png" } }, { "type": "image_url", "role": "reference_image", "image_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_30s_reference4.png" } }, { "type": "image_url", "role": "reference_image", "image_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_30s_reference5.png" } }, { "type": "image_url", "role": "reference_image", "image_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_30s_reference6.png" } }, { "type": "image_url", "role": "reference_image", "image_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_30s_reference7.png" } }, { "type": "image_url", "role": "reference_image", "image_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_30s_reference8.png" } } ], "generate_audio": true, "ratio": "16:9", "duration": 30, "watermark": true }' ``` **选项:Python** ```Python import os import time # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark client = Ark( # The base URL for model invocation base_url='https://ark.cn-beijing.volces.com/api/v3', # Get API Key:https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.environ.get("ARK_API_KEY"), ) if __name__ == "__main__": prompt = "一镜到底,镜头平稳跟随一个穿黑色大衣的人(参考【图片 1】)从左向右穿过六个相连的不同色调、不同氛围的房间。每个房间结构相同:白墙、人字拼浅色木地板、法式双开落地窗、白纱帘,参考【图片 2】但窗外风景和室内氛围完全不同。主角全程匀速走动,穿过墙壁上敞开的每一扇门。0-5秒,第一个房间,主题为美漫打斗,主角进入屋内与人物(【图片 3】)打斗,人物落败;5-10秒,第二个房间,主题为温暖,毛毡风格,窗外场景为向日葵田(【图片 4】),室内光线暖橙柔光,有一个画家正在画向日葵(【图片 5】)。主角进入后也变成毛毡风格;10-15秒,第三个房间,主题为悲伤,整个画面为黑白漫画定格动画风格,窗外阴雨,室内光线冷灰低沉,一个人独自坐在空房间中央地板上,低头抱膝,身旁一只手机亮着无人接听的通话界面。主角进入房间后关上房间的灯,马上开灯,房间内变为彩色,瞬间生长出满屋鲜花;15-20秒,第四个房间,主题为欢乐,整个场景为浸泡在海里的房间,参考【图片 6】,主角游进房间,身旁有美丽的珊瑚礁和鱼群;20-25秒,第五个房间,主题为惊喜,窗外场景漫天烟花夜空,参考【图片 7】,室内光线彩色闪烁映射,主角被卷入欢呼气氛。25-30秒,最后主角来到一个空白房间,站在中央打了个响指,同时音效为响指声,画面整体黑屏,中间出现“seedance”字样,参考【图片 8】。整体电影质感,高级时装广告风格,光线完全由窗外场景决定形成强烈情绪反差,画面无文字。" reference_images = [ "asset://asset-20260831133727-94rtr", "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_30s_reference2.png", "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_30s_reference3.png", "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_30s_reference4.png", "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_30s_reference5.png", "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_30s_reference6.png", "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_30s_reference7.png", "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_30s_reference8.png", ] content = [{"type": "text", "text": prompt}] content.extend( { "type": "image_url", "role": "reference_image", "image_url": {"url": image_url}, } for image_url in reference_images ) print("----- create request -----") create_result = client.content_generation.tasks.create( model="doubao-seedance-2-5-260628", # Replace with Model ID content=content, generate_audio=True, ratio="16:9", duration=30, watermark=True, ) print(create_result) # Polling query section print("----- polling task status -----") task_id = create_result.id deadline = time.monotonic() + 30 * 60 while time.monotonic() < deadline: get_result = client.content_generation.tasks.get(task_id=task_id) status = get_result.status if status == "succeeded": print("----- task succeeded -----") print(get_result) break elif status == "failed": raise RuntimeError(f"Video generation task failed: {get_result.error}") else: print(f"Current status: {status}, Retrying after 30 seconds...") time.sleep(30) else: raise TimeoutError("Video generation task did not finish within 30 minutes") ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.content_generation.*; import com.volcengine.ark.runtime.service.ArkService; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; public class ContentGenerationTaskExample { // Client initialization static String apiKey = System.getenv("ARK_API_KEY"); static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); static Dispatcher dispatcher = new Dispatcher(); static ArkService service = ArkService.builder() .baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .build(); public static void main(String[] args) { // Model ID final String modelId = "doubao-seedance-2-5-260628"; // Text prompt final String prompt = "一镜到底,镜头平稳跟随一个穿黑色大衣的人(参考【图片 1】)从左向右穿过六个相连的不同色调、不同氛围的房间。每个房间结构相同:白墙、人字拼浅色木地板、法式双开落地窗、白纱帘,参考【图片 2】但窗外风景和室内氛围完全不同。主角全程匀速走动,穿过墙壁上敞开的每一扇门。0-5秒,第一个房间,主题为美漫打斗,主角进入屋内与人物(【图片 3】)打斗,人物落败;5-10秒,第二个房间,主题为温暖,毛毡风格,窗外场景为向日葵田(【图片 4】),室内光线暖橙柔光,有一个画家正在画向日葵(【图片 5】)。主角进入后也变成毛毡风格;10-15秒,第三个房间,主题为悲伤,整个画面为黑白漫画定格动画风格,窗外阴雨,室内光线冷灰低沉,一个人独自坐在空房间中央地板上,低头抱膝,身旁一只手机亮着无人接听的通话界面。主角进入房间后关上房间的灯,马上开灯,房间内变为彩色,瞬间生长出满屋鲜花;15-20秒,第四个房间,主题为欢乐,整个场景为浸泡在海里的房间,参考【图片 6】,主角游进房间,身旁有美丽的珊瑚礁和鱼群;20-25秒,第五个房间,主题为惊喜,窗外场景漫天烟花夜空,参考【图片 7】,室内光线彩色闪烁映射,主角被卷入欢呼气氛。25-30秒,最后主角来到一个空白房间,站在中央打了个响指,同时音效为响指声,画面整体黑屏,中间出现“seedance”字样,参考【图片 8】。整体电影质感,高级时装广告风格,光线完全由窗外场景决定形成强烈情绪反差,画面无文字。"; // Example resource URLs final String[] referenceImages = { "asset://asset-20260831133727-94rtr", "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_30s_reference2.png", "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_30s_reference3.png", "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_30s_reference4.png", "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_30s_reference5.png", "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_30s_reference6.png", "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_30s_reference7.png", "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_30s_reference8.png" }; // Output video parameters final boolean generateAudio = true; final String videoRatio = "16:9"; final long videoDuration = 30L; System.out.println("----- create request -----"); // Build request content List contents = new ArrayList<>(); // 1. Text prompt contents.add(ContentItem.builder() .type(ContentType.TEXT) .text(prompt) .build()); // 2. Reference images for (String referenceImage : referenceImages) { contents.add(ContentItem.builder() .type(ContentType.IMAGE_URL) .imageUrl(ImageURL.builder() .url(referenceImage) .build()) .role("reference_image") .build()); } // Create video generation task CreateContentGenerationTaskRequest createRequest = CreateContentGenerationTaskRequest.builder() .generateAudio(generateAudio) .model(modelId) .content(contents) .ratio(videoRatio) .duration(videoDuration) .watermark(true) .build(); CreateContentGenerationTaskResponse createResult = service.createContentGenerationTask(createRequest); System.out.println("Task Created: " + createResult); // Get task details and poll status String taskId = createResult.getId(); pollTaskStatus(taskId); } /** * Poll task status * @param taskId Task ID */ private static void pollTaskStatus(String taskId) { String getRequest = taskId; System.out.println("----- polling task status -----"); try { long deadlineNanos = System.nanoTime() + TimeUnit.MINUTES.toNanos(30); while (System.nanoTime() < deadlineNanos) { ContentGenerationTask getResponse = service.getContentGenerationTask(getRequest); String status = getResponse.getStatus().toString(); if ("succeeded".equalsIgnoreCase(status)) { System.out.println("----- task succeeded -----"); System.out.println(getResponse); return; } else if ("failed".equalsIgnoreCase(status)) { throw new IllegalStateException( "Video generation task failed: " + getResponse.getError()); } else { System.out.printf("Current status: %s, Retrying in 10 seconds...%n", status); TimeUnit.SECONDS.sleep(10); } } throw new IllegalStateException( "Video generation task did not finish within 30 minutes"); } catch (InterruptedException ie) { Thread.currentThread().interrupt(); throw new RuntimeException("Polling interrupted", ie); } catch (Exception e) { throw new RuntimeException("Error occurred while polling", e); } finally { service.shutdownExecutor(); } } } ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "time" "github.com/volcengine/ark-runtime-go/arkruntime" model "github.com/volcengine/ark-runtime-go/arkruntime/model/contentgeneration" ) func main() { // Initialize Ark client client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), // The base URL for model invocation arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute) defer cancel() // Model ID modelID := "doubao-seedance-2-5-260628" // Text prompt prompt := "一镜到底,镜头平稳跟随一个穿黑色大衣的人(参考【图片 1】)从左向右穿过六个相连的不同色调、不同氛围的房间。每个房间结构相同:白墙、人字拼浅色木地板、法式双开落地窗、白纱帘,参考【图片 2】但窗外风景和室内氛围完全不同。主角全程匀速走动,穿过墙壁上敞开的每一扇门。0-5秒,第一个房间,主题为美漫打斗,主角进入屋内与人物(【图片 3】)打斗,人物落败;5-10秒,第二个房间,主题为温暖,毛毡风格,窗外场景为向日葵田(【图片 4】),室内光线暖橙柔光,有一个画家正在画向日葵(【图片 5】)。主角进入后也变成毛毡风格;10-15秒,第三个房间,主题为悲伤,整个画面为黑白漫画定格动画风格,窗外阴雨,室内光线冷灰低沉,一个人独自坐在空房间中央地板上,低头抱膝,身旁一只手机亮着无人接听的通话界面。主角进入房间后关上房间的灯,马上开灯,房间内变为彩色,瞬间生长出满屋鲜花;15-20秒,第四个房间,主题为欢乐,整个场景为浸泡在海里的房间,参考【图片 6】,主角游进房间,身旁有美丽的珊瑚礁和鱼群;20-25秒,第五个房间,主题为惊喜,窗外场景漫天烟花夜空,参考【图片 7】,室内光线彩色闪烁映射,主角被卷入欢呼气氛。25-30秒,最后主角来到一个空白房间,站在中央打了个响指,同时音效为响指声,画面整体黑屏,中间出现“seedance”字样,参考【图片 8】。整体电影质感,高级时装广告风格,光线完全由窗外场景决定形成强烈情绪反差,画面无文字。" // Example resource URLs referenceImages := []string{ "asset://asset-20260831133727-94rtr", "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_30s_reference2.png", "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_30s_reference3.png", "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_30s_reference4.png", "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_30s_reference5.png", "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_30s_reference6.png", "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_30s_reference7.png", "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_30s_reference8.png", } // Output video parameters generateAudio := true videoRatio := "16:9" videoDuration := int64(30) content := []model.ContentItem{ { Type: model.ContentTypeText, Text: model.NewOptString(prompt), }, } for _, referenceImage := range referenceImages { content = append(content, model.ContentItem{ Type: model.ContentTypeImageURL, ImageURL: model.NewOptImageURL(model.ImageURL{ URL: referenceImage, }), Role: model.NewOptString("reference_image"), }) } // 1. Create video generation task fmt.Println("----- create request -----") createReq := &model.CreateContentGenerationTaskRequest{ Model: modelID, GenerateAudio: model.NewOptBool(generateAudio), Ratio: model.NewOptString(videoRatio), Duration: model.NewOptInt64(videoDuration), Content: content, Watermark: model.NewOptBool(true), } createResp, err := client.CreateContentGenerationTask(ctx, createReq) if err != nil { panic(fmt.Errorf("create content generation task: %w", err)) } taskID := createResp.ID fmt.Printf("Task Created with ID: %s\n", taskID) // 2. Poll task status pollTaskStatus(ctx, client, taskID) } // poll task status func pollTaskStatus(ctx context.Context, client *arkruntime.Client, taskID string) { fmt.Println("----- polling task status -----") for { getReq := taskID getResp, err := client.GetContentGenerationTask(ctx, getReq) if err != nil { panic(fmt.Errorf("get content generation task: %w", err)) } status := getResp.Status if status == "succeeded" { fmt.Println("----- task succeeded -----") fmt.Printf("Task ID: %s \n", getResp.ID) fmt.Printf("Model: %s \n", getResp.Model) fmt.Printf("Video URL: %s \n", getResp.Content.Or(model.TaskContent{}).VideoURL.Or("")) fmt.Printf("Completion Tokens: %d \n", getResp.Usage.Or(model.TaskUsage{}).CompletionTokens) fmt.Printf("Created At: %d, Updated At: %d\n", getResp.CreatedAt.Or(0), getResp.UpdatedAt.Or(0)) return } else if status == "failed" { if getResp.Error.IsSet() { panic(fmt.Errorf("video generation task failed: %s: %s", getResp.Error.Value.Code, getResp.Error.Value.Message)) } panic("video generation task failed") } else { fmt.Printf("Current status: %s, Retrying in 10 seconds... \n", status) time.Sleep(10 * time.Second) } } } ``` ## 50 个全模态参考素材输入 Seedance 2.5 单次输入素材上限提升至 50 个(30 张图片 + 10 段视频 + 10 段音频),可自由组合图片、视频、音频等多模态素材,实现更丰富的创意表达。同时,Seedance 2.5 新增支持纯音频参考生成视频,无需搭配图片或视频素材。 |输入:文本 + 1 张图片 + 6 段视频 |||输出 | |---|---|---|---| |![](https://arkdocs.tos-cn-beijing.volces.com/images/resources/seedacne2.5_reference1.png) |[视频](https://arkdocs.tos-cn-beijing.volces.com/videos/resources/seedacne2.5_reference2.mp4) |[视频](https://arkdocs.tos-cn-beijing.volces.com/videos/resources/seedacne2.5_reference3.mp4) |[视频](https://arkdocs.tos-cn-beijing.volces.com/videos/resources/eedacne2.5_reference_output.mp4) | \ | |[视频](https://arkdocs.tos-cn-beijing.volces.com/videos/resources/seedacne2.5_reference4.mp4) |[视频](https://arkdocs.tos-cn-beijing.volces.com/videos/resources/seedacne2.5_reference5.mp4) | | \ | |[视频](https://arkdocs.tos-cn-beijing.volces.com/videos/resources/seedacne2.5_reference6.mp4) |[视频](https://arkdocs.tos-cn-beijing.volces.com/videos/resources/seedacne2.5_reference7.mp4) | | \ | | | | | \ |
    提示词:明亮多彩的广告片风格,果味饼干为主角...(详见下方代码示例中的完整提示词)
    | | | | **选项:Curl** ```Bash curl -X POST https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seedance-2-5-260628", "content": [ { "type": "text", "text": "明亮多彩的广告片风格,果味饼干为主角,包含草莓、苹果、葡萄、橙子四种口味,草莓味参考@图像1,饼干与对应水果以强秩序感的几何阵列排布,整体画面干净、高级、节奏强。开场水果快速建立视觉聚焦,参考@视频1的构图,音乐重拍切入。随后不同口味饼干整齐排列,切特写,参考@视频2的动态和运镜。高潮段一块饼干被折断,瞬间进入慢动作,果味夹心爆开,碎屑飞溅,果汁感与颗粒冲击被放大展示,参考@视频3的冲击感。横向阵列,形成节奏抛物感,参考@视频4的运动,突出秩序美感与产品丰富度。随后迅速回到快节奏剪辑。结尾英文文字 One bite of crispness, a heart full of delight 快速分词切换入画,配合强节奏文字运动与产品定格,参考@视频5,最终品牌感收束,饼干和水果向四周发散,参考@视频6画面充满年轻、活力、好吃、想分享的广告氛围。" }, { "type": "image_url", "image_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_reference1.png" }, "role": "reference_image" }, { "type": "video_url", "video_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference2.mp4" }, "role": "reference_video" }, { "type": "video_url", "video_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference3.mp4" }, "role": "reference_video" }, { "type": "video_url", "video_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference4.mp4" }, "role": "reference_video" }, { "type": "video_url", "video_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference5.mp4" }, "role": "reference_video" }, { "type": "video_url", "video_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference6.mp4" }, "role": "reference_video" }, { "type": "video_url", "video_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference7.mp4" }, "role": "reference_video" } ], "generate_audio": true, "ratio": "16:9", "duration": 15, "omni_reference_task_type": "reference", "output_format": "mov", "watermark": true }' ``` **选项:Python** ```Python import os import time # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark client = Ark( # The base URL for model invocation base_url='https://ark.cn-beijing.volces.com/api/v3', # Get API Key:https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.environ.get("ARK_API_KEY"), ) if __name__ == "__main__": print("----- create request -----") create_result = client.content_generation.tasks.create( model="doubao-seedance-2-5-260628", # Replace with Model ID content=[ { "type": "text", "text": "明亮多彩的广告片风格,果味饼干为主角,包含草莓、苹果、葡萄、橙子四种口味,草莓味参考@图像1,饼干与对应水果以强秩序感的几何阵列排布,整体画面干净、高级、节奏强。开场水果快速建立视觉聚焦,参考@视频1的构图,音乐重拍切入。随后不同口味饼干整齐排列,切特写,参考@视频2的动态和运镜。高潮段一块饼干被折断,瞬间进入慢动作,果味夹心爆开,碎屑飞溅,果汁感与颗粒冲击被放大展示,参考@视频3的冲击感。横向阵列,形成节奏抛物感,参考@视频4的运动,突出秩序美感与产品丰富度。随后迅速回到快节奏剪辑。结尾英文文字 One bite of crispness, a heart full of delight 快速分词切换入画,配合强节奏文字运动与产品定格,参考@视频5,最终品牌感收束,饼干和水果向四周发散,参考@视频6画面充满年轻、活力、好吃、想分享的广告氛围。", }, { "type": "image_url", "image_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_reference1.png" }, "role": "reference_image", }, { "type": "video_url", "video_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference2.mp4" }, "role": "reference_video", }, { "type": "video_url", "video_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference3.mp4" }, "role": "reference_video", }, { "type": "video_url", "video_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference4.mp4" }, "role": "reference_video", }, { "type": "video_url", "video_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference5.mp4" }, "role": "reference_video", }, { "type": "video_url", "video_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference6.mp4" }, "role": "reference_video", }, { "type": "video_url", "video_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference7.mp4" }, "role": "reference_video", }, ], generate_audio=True, ratio="16:9", duration=15, extra_body={ "omni_reference_task_type": "reference", "output_format": "mov", }, watermark=True, ) print(create_result) # Polling query section print("----- polling task status -----") task_id = create_result.id deadline = time.monotonic() + 30 * 60 while time.monotonic() < deadline: get_result = client.content_generation.tasks.get(task_id=task_id) status = get_result.status if status == "succeeded": print("----- task succeeded -----") print(get_result) break elif status == "failed": raise RuntimeError(f"Video generation task failed: {get_result.error}") else: print(f"Current status: {status}, Retrying after 10 seconds...") time.sleep(10) else: raise TimeoutError("Video generation task did not finish within 30 minutes") ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.content_generation.*; import com.volcengine.ark.runtime.service.ArkService; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; import retrofit2.Call; import retrofit2.Retrofit; import retrofit2.http.Body; import retrofit2.http.POST; import java.io.IOException; import java.time.Duration; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; public class ContentGenerationTaskExample { interface ContentGenerationApi { @POST("contents/generations/tasks") Call create(@Body Map request); } // Client initialization static String apiKey = System.getenv("ARK_API_KEY"); static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); static Dispatcher dispatcher = new Dispatcher(); static ArkService service = ArkService.builder() .baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .build(); static Retrofit retrofit = ArkService.defaultRetrofit( ArkService.defaultApiKeyClient(apiKey, Duration.ofSeconds(180)), ArkService.defaultObjectMapper(), "https://ark.cn-beijing.volces.com/api/v3/", Runnable::run); static ContentGenerationApi contentGenerationApi = retrofit.create(ContentGenerationApi.class); public static void main(String[] args) throws IOException { // Model ID final String modelId = "doubao-seedance-2-5-260628"; // Text prompt final String prompt = "明亮多彩的广告片风格,果味饼干为主角,包含草莓、苹果、葡萄、橙子四种口味,草莓味参考@图像1,饼干与对应水果以强秩序感的几何阵列排布,整体画面干净、高级、节奏强。开场水果快速建立视觉聚焦,参考@视频1的构图,音乐重拍切入。随后不同口味饼干整齐排列,切特写,参考@视频2的动态和运镜。高潮段一块饼干被折断,瞬间进入慢动作,果味夹心爆开,碎屑飞溅,果汁感与颗粒冲击被放大展示,参考@视频3的冲击感。横向阵列,形成节奏抛物感,参考@视频4的运动,突出秩序美感与产品丰富度。随后迅速回到快节奏剪辑。结尾英文文字 One bite of crispness, a heart full of delight 快速分词切换入画,配合强节奏文字运动与产品定格,参考@视频5,最终品牌感收束,饼干和水果向四周发散,参考@视频6画面充满年轻、活力、好吃、想分享的广告氛围。"; // Example resource URLs final String refImage1 = "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_reference1.png"; final String refVideo1 = "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference2.mp4"; final String refVideo2 = "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference3.mp4"; final String refVideo3 = "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference4.mp4"; final String refVideo4 = "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference5.mp4"; final String refVideo5 = "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference6.mp4"; final String refVideo6 = "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference7.mp4"; // Output video parameters final boolean generateAudio = true; final String videoRatio = "16:9"; final long videoDuration = 15L; System.out.println("----- create request -----"); // Build request content List contents = new ArrayList<>(); // 1. Text prompt contents.add(ContentItem.builder() .type(ContentType.TEXT) .text(prompt) .build()); // 2. Reference image 1 contents.add(ContentItem.builder() .type(ContentType.IMAGE_URL) .imageUrl(ImageURL.builder() .url(refImage1) .build()) .role("reference_image") .build()); // 3. Reference video 1 contents.add(ContentItem.builder() .type(ContentType.VIDEO_URL) .videoUrl(VideoURL.builder() .url(refVideo1) .build()) .role("reference_video") .build()); // 4. Reference video 2 contents.add(ContentItem.builder() .type(ContentType.VIDEO_URL) .videoUrl(VideoURL.builder() .url(refVideo2) .build()) .role("reference_video") .build()); // 5. Reference video 3 contents.add(ContentItem.builder() .type(ContentType.VIDEO_URL) .videoUrl(VideoURL.builder() .url(refVideo3) .build()) .role("reference_video") .build()); // 6. Reference video 4 contents.add(ContentItem.builder() .type(ContentType.VIDEO_URL) .videoUrl(VideoURL.builder() .url(refVideo4) .build()) .role("reference_video") .build()); // 7. Reference video 5 contents.add(ContentItem.builder() .type(ContentType.VIDEO_URL) .videoUrl(VideoURL.builder() .url(refVideo5) .build()) .role("reference_video") .build()); // 8. Reference video 6 contents.add(ContentItem.builder() .type(ContentType.VIDEO_URL) .videoUrl(VideoURL.builder() .url(refVideo6) .build()) .role("reference_video") .build()); // Create video generation task Map createRequest = new LinkedHashMap<>(); createRequest.put("model", modelId); createRequest.put("content", contents); createRequest.put("generate_audio", generateAudio); createRequest.put("ratio", videoRatio); createRequest.put("duration", videoDuration); createRequest.put("omni_reference_task_type", "reference"); createRequest.put("output_format", "mov"); createRequest.put("watermark", true); retrofit2.Response response = contentGenerationApi.create(createRequest).execute(); if (!response.isSuccessful() || response.body() == null) { throw new IOException("Unexpected code " + response.code()); } CreateContentGenerationTaskResponse createResult = response.body(); System.out.println("Task Created: " + createResult); // Get task details and poll status String taskId = createResult.getId(); pollTaskStatus(taskId); } /** * Poll task status * @param taskId Task ID */ private static void pollTaskStatus(String taskId) { String getRequest = taskId; System.out.println("----- polling task status -----"); try { long deadlineNanos = System.nanoTime() + TimeUnit.MINUTES.toNanos(30); while (System.nanoTime() < deadlineNanos) { ContentGenerationTask getResponse = service.getContentGenerationTask(getRequest); String status = getResponse.getStatus().toString(); if ("succeeded".equalsIgnoreCase(status)) { System.out.println("----- task succeeded -----"); System.out.println(getResponse); return; } else if ("failed".equalsIgnoreCase(status)) { throw new IllegalStateException( "Video generation task failed: " + getResponse.getError()); } else { System.out.printf("Current status: %s, Retrying in 10 seconds...%n", status); TimeUnit.SECONDS.sleep(10); } } throw new IllegalStateException( "Video generation task did not finish within 30 minutes"); } catch (InterruptedException ie) { Thread.currentThread().interrupt(); throw new RuntimeException("Polling interrupted", ie); } catch (Exception e) { throw new RuntimeException("Error occurred while polling", e); } finally { service.shutdownExecutor(); } } } ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "time" "github.com/volcengine/ark-runtime-go/arkruntime" model "github.com/volcengine/ark-runtime-go/arkruntime/model/contentgeneration" ) func main() { // Initialize Ark client client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), // The base URL for model invocation arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute) defer cancel() // Model ID modelID := "doubao-seedance-2-5-260628" // Text prompt prompt := "明亮多彩的广告片风格,果味饼干为主角,包含草莓、苹果、葡萄、橙子四种口味,草莓味参考@图像1,饼干与对应水果以强秩序感的几何阵列排布,整体画面干净、高级、节奏强。开场水果快速建立视觉聚焦,参考@视频1的构图,音乐重拍切入。随后不同口味饼干整齐排列,切特写,参考@视频2的动态和运镜。高潮段一块饼干被折断,瞬间进入慢动作,果味夹心爆开,碎屑飞溅,果汁感与颗粒冲击被放大展示,参考@视频3的冲击感。横向阵列,形成节奏抛物感,参考@视频4的运动,突出秩序美感与产品丰富度。随后迅速回到快节奏剪辑。结尾英文文字 One bite of crispness, a heart full of delight 快速分词切换入画,配合强节奏文字运动与产品定格,参考@视频5,最终品牌感收束,饼干和水果向四周发散,参考@视频6画面充满年轻、活力、好吃、想分享的广告氛围。" // Example resource URLs refImage1 := "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_reference1.png" refVideo1 := "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference2.mp4" refVideo2 := "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference3.mp4" refVideo3 := "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference4.mp4" refVideo4 := "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference5.mp4" refVideo5 := "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference6.mp4" refVideo6 := "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference7.mp4" // Output video parameters generateAudio := true videoRatio := "16:9" videoDuration := int64(15) omniReferenceTaskType := "reference" outputFormat := "mov" // 1. Create video generation task fmt.Println("----- create request -----") createReq := &model.CreateContentGenerationTaskRequest{ Model: modelID, GenerateAudio: model.NewOptBool(generateAudio), Ratio: model.NewOptString(videoRatio), Duration: model.NewOptInt64(videoDuration), Content: []model.ContentItem{ { Type: model.ContentTypeText, Text: model.NewOptString(prompt), }, { Type: model.ContentTypeImageURL, ImageURL: model.NewOptImageURL(model.ImageURL{ URL: refImage1, }), Role: model.NewOptString("reference_image"), }, { Type: model.ContentTypeVideoURL, VideoURL: model.NewOptVideoURL(model.VideoURL{ URL: refVideo1, }), Role: model.NewOptString("reference_video"), }, { Type: model.ContentTypeVideoURL, VideoURL: model.NewOptVideoURL(model.VideoURL{ URL: refVideo2, }), Role: model.NewOptString("reference_video"), }, { Type: model.ContentTypeVideoURL, VideoURL: model.NewOptVideoURL(model.VideoURL{ URL: refVideo3, }), Role: model.NewOptString("reference_video"), }, { Type: model.ContentTypeVideoURL, VideoURL: model.NewOptVideoURL(model.VideoURL{ URL: refVideo4, }), Role: model.NewOptString("reference_video"), }, { Type: model.ContentTypeVideoURL, VideoURL: model.NewOptVideoURL(model.VideoURL{ URL: refVideo5, }), Role: model.NewOptString("reference_video"), }, { Type: model.ContentTypeVideoURL, VideoURL: model.NewOptVideoURL(model.VideoURL{ URL: refVideo6, }), Role: model.NewOptString("reference_video"), }, }, Watermark: model.NewOptBool(true), } createResp, err := client.CreateContentGenerationTask( ctx, createReq, arkruntime.WithExtraBody(map[string]interface{}{ "omni_reference_task_type": omniReferenceTaskType, "output_format": outputFormat, }), ) if err != nil { panic(fmt.Errorf("create content generation task: %w", err)) } taskID := createResp.ID fmt.Printf("Task Created with ID: %s\n", taskID) // 2. Poll task status pollTaskStatus(ctx, client, taskID) } // poll task status func pollTaskStatus(ctx context.Context, client *arkruntime.Client, taskID string) { fmt.Println("----- polling task status -----") for { getReq := taskID getResp, err := client.GetContentGenerationTask(ctx, getReq) if err != nil { panic(fmt.Errorf("get content generation task: %w", err)) } status := getResp.Status if status == "succeeded" { fmt.Println("----- task succeeded -----") fmt.Printf("Task ID: %s \n", getResp.ID) fmt.Printf("Model: %s \n", getResp.Model) fmt.Printf("Video URL: %s \n", getResp.Content.Or(model.TaskContent{}).VideoURL.Or("")) fmt.Printf("Completion Tokens: %d \n", getResp.Usage.Or(model.TaskUsage{}).CompletionTokens) fmt.Printf("Created At: %d, Updated At: %d\n", getResp.CreatedAt.Or(0), getResp.UpdatedAt.Or(0)) return } else if status == "failed" { if getResp.Error.IsSet() { panic(fmt.Errorf("video generation task failed: %s: %s", getResp.Error.Value.Code, getResp.Error.Value.Message)) } panic("video generation task failed") } else { fmt.Printf("Current status: %s, Retrying in 10 seconds... \n", status) time.Sleep(10 * time.Second) } } } ``` ## 更智能的时长和宽高比控制 Seedance 2.5 模型支持通过配置`ratio` 为 `adaptive`、`duration` 为 `-1`以智能控制输出视频的宽高比和时长;但在**视频编辑、视频延长、首帧或首尾帧生视频**任务中,具有特殊的控制行为,详情参考以下示例。 ### 使用示例-视频编辑 在视频编辑任务中,Seedance 2.5 会根据提示词意图选定待编辑视频,并自动保持输出视频宽高比、时长和待编辑视频一致(参数 `ratio` 默认且仅支持配置为 `adaptive`,参数 `duration` 默认且仅支持配置为 `-1`,均不支持另行设置)。 > **注意** > > 受输入帧处理影响,输出时长可能略短于输入视频(误差不超过 0.4 秒)。 |输入:文本 + 视频(宽高比 5:4,时长 16 秒) |输出(宽高比 5:4,时长 16 秒) | |---|---| |[视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_edit_input.mov) |[视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_edit_output.mov) | \ |
    提示词:视频编辑:删除 @视频1中的所有人,除了主角。
    |
    输出视频宽高比自动和待编辑视频的 5:4 保持一致;输出视频时长和待编辑视频的 16 秒基本一致
    | **选项:Curl** ```Bash curl -X POST https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seedance-2-5-260628", "content": [ { "type": "text", "text": "视频编辑:删除 @视频1中的所有人,除了主角。" }, { "type": "video_url", "video_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_edit_input.mov" }, "role": "reference_video" } ], "generate_audio": true, "ratio": "adaptive", "duration": -1, "omni_reference_task_type": "edit", "output_format": "mov", "watermark": true }' ``` **选项:Python** ```Python import os import time # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark client = Ark( # The base URL for model invocation base_url='https://ark.cn-beijing.volces.com/api/v3', # Get API Key:https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.environ.get("ARK_API_KEY"), ) if __name__ == "__main__": print("----- create request -----") create_result = client.content_generation.tasks.create( model="doubao-seedance-2-5-260628", # Replace with Model ID content=[ { "type": "text", "text": "视频编辑:删除 @视频1中的所有人,除了主角。", }, { "type": "video_url", "video_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_edit_input.mov" }, "role": "reference_video", }, ], generate_audio=True, ratio="adaptive", duration=-1, extra_body={ "omni_reference_task_type": "edit", "output_format": "mov", }, watermark=True, ) print(create_result) # Polling query section print("----- polling task status -----") task_id = create_result.id deadline = time.monotonic() + 30 * 60 while time.monotonic() < deadline: get_result = client.content_generation.tasks.get(task_id=task_id) status = get_result.status if status == "succeeded": print("----- task succeeded -----") print(get_result) break elif status == "failed": raise RuntimeError(f"Video generation task failed: {get_result.error}") else: print(f"Current status: {status}, Retrying after 10 seconds...") time.sleep(10) else: raise TimeoutError("Video generation task did not finish within 30 minutes") ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.content_generation.*; import com.volcengine.ark.runtime.service.ArkService; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; import retrofit2.Call; import retrofit2.Retrofit; import retrofit2.http.Body; import retrofit2.http.POST; import java.io.IOException; import java.time.Duration; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; public class ContentGenerationTaskExample { interface ContentGenerationApi { @POST("contents/generations/tasks") Call create(@Body Map request); } // Client initialization static String apiKey = System.getenv("ARK_API_KEY"); static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); static Dispatcher dispatcher = new Dispatcher(); static ArkService service = ArkService.builder() .baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .build(); static Retrofit retrofit = ArkService.defaultRetrofit( ArkService.defaultApiKeyClient(apiKey, Duration.ofSeconds(180)), ArkService.defaultObjectMapper(), "https://ark.cn-beijing.volces.com/api/v3/", Runnable::run); static ContentGenerationApi contentGenerationApi = retrofit.create(ContentGenerationApi.class); public static void main(String[] args) throws IOException { // Model ID final String modelId = "doubao-seedance-2-5-260628"; // Text prompt final String prompt = "视频编辑:删除 @视频1中的所有人,除了主角。"; // Example resource URLs final String refVideo = "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_edit_input.mov"; // Output video parameters final boolean generateAudio = true; final String videoRatio = "adaptive"; final long videoDuration = -1L; System.out.println("----- create request -----"); // Build request content List contents = new ArrayList<>(); // 1. Text prompt contents.add(ContentItem.builder() .type(ContentType.TEXT) .text(prompt) .build()); // 2. Reference video contents.add(ContentItem.builder() .type(ContentType.VIDEO_URL) .videoUrl(VideoURL.builder() .url(refVideo) .build()) .role("reference_video") .build()); // Create video generation task Map createRequest = new LinkedHashMap<>(); createRequest.put("model", modelId); createRequest.put("content", contents); createRequest.put("generate_audio", generateAudio); createRequest.put("ratio", videoRatio); createRequest.put("duration", videoDuration); createRequest.put("omni_reference_task_type", "edit"); createRequest.put("output_format", "mov"); createRequest.put("watermark", true); retrofit2.Response response = contentGenerationApi.create(createRequest).execute(); if (!response.isSuccessful() || response.body() == null) { throw new IOException("Unexpected code " + response.code()); } CreateContentGenerationTaskResponse createResult = response.body(); System.out.println("Task Created: " + createResult); // Get task details and poll status String taskId = createResult.getId(); pollTaskStatus(taskId); } /** * Poll task status * @param taskId Task ID */ private static void pollTaskStatus(String taskId) { String getRequest = taskId; System.out.println("----- polling task status -----"); try { long deadlineNanos = System.nanoTime() + TimeUnit.MINUTES.toNanos(30); while (System.nanoTime() < deadlineNanos) { ContentGenerationTask getResponse = service.getContentGenerationTask(getRequest); String status = getResponse.getStatus().toString(); if ("succeeded".equalsIgnoreCase(status)) { System.out.println("----- task succeeded -----"); System.out.println(getResponse); return; } else if ("failed".equalsIgnoreCase(status)) { throw new IllegalStateException( "Video generation task failed: " + getResponse.getError()); } else { System.out.printf("Current status: %s, Retrying in 10 seconds...%n", status); TimeUnit.SECONDS.sleep(10); } } throw new IllegalStateException( "Video generation task did not finish within 30 minutes"); } catch (InterruptedException ie) { Thread.currentThread().interrupt(); throw new RuntimeException("Polling interrupted", ie); } catch (Exception e) { throw new RuntimeException("Error occurred while polling", e); } finally { service.shutdownExecutor(); } } } ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "time" "github.com/volcengine/ark-runtime-go/arkruntime" model "github.com/volcengine/ark-runtime-go/arkruntime/model/contentgeneration" ) func main() { // Initialize Ark client client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), // The base URL for model invocation arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute) defer cancel() // Model ID modelID := "doubao-seedance-2-5-260628" // Text prompt prompt := "视频编辑:删除 @视频1中的所有人,除了主角。" // Example resource URLs refVideo := "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_edit_input.mov" // Output video parameters generateAudio := true videoRatio := "adaptive" videoDuration := int64(-1) omniReferenceTaskType := "edit" outputFormat := "mov" // 1. Create video generation task fmt.Println("----- create request -----") createReq := &model.CreateContentGenerationTaskRequest{ Model: modelID, GenerateAudio: model.NewOptBool(generateAudio), Ratio: model.NewOptString(videoRatio), Duration: model.NewOptInt64(videoDuration), Content: []model.ContentItem{ { Type: model.ContentTypeText, Text: model.NewOptString(prompt), }, { Type: model.ContentTypeVideoURL, VideoURL: model.NewOptVideoURL(model.VideoURL{ URL: refVideo, }), Role: model.NewOptString("reference_video"), }, }, Watermark: model.NewOptBool(true), } createResp, err := client.CreateContentGenerationTask( ctx, createReq, arkruntime.WithExtraBody(map[string]interface{}{ "omni_reference_task_type": omniReferenceTaskType, "output_format": outputFormat, }), ) if err != nil { panic(fmt.Errorf("create content generation task: %w", err)) } taskID := createResp.ID fmt.Printf("Task Created with ID: %s\n", taskID) // 2. Poll task status pollTaskStatus(ctx, client, taskID) } // poll task status func pollTaskStatus(ctx context.Context, client *arkruntime.Client, taskID string) { fmt.Println("----- polling task status -----") for { getReq := taskID getResp, err := client.GetContentGenerationTask(ctx, getReq) if err != nil { panic(fmt.Errorf("get content generation task: %w", err)) } status := getResp.Status if status == "succeeded" { fmt.Println("----- task succeeded -----") fmt.Printf("Task ID: %s \n", getResp.ID) fmt.Printf("Model: %s \n", getResp.Model) fmt.Printf("Video URL: %s \n", getResp.Content.Or(model.TaskContent{}).VideoURL.Or("")) fmt.Printf("Completion Tokens: %d \n", getResp.Usage.Or(model.TaskUsage{}).CompletionTokens) fmt.Printf("Created At: %d, Updated At: %d\n", getResp.CreatedAt.Or(0), getResp.UpdatedAt.Or(0)) return } else if status == "failed" { if getResp.Error.IsSet() { panic(fmt.Errorf("video generation task failed: %s: %s", getResp.Error.Value.Code, getResp.Error.Value.Message)) } panic("video generation task failed") } else { fmt.Printf("Current status: %s, Retrying in 10 seconds... \n", status) time.Sleep(10 * time.Second) } } } ``` ### 使用示例-视频延长 在视频延长任务中,Seedance 2.5 会根据提示词意图选定待延长视频,并自动保持输出视频宽高比和待延长视频一致(参数 `ratio` 默认且仅支持配置为 `adaptive`)。视频输出时长可以自行设置或由模型智能判断(参数 `duration` 支持配置为 `[4, 30]` 或 `-1`)。 |输入:文本 + 视频(视频1宽高比 7:5,视频2、视频3宽高比 16:9) ||输出(宽高比 7:5)| |---|---|---| |[视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/r2v_extend_video1_75.mov) |[视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/r2v_extend_video2.mp4) |[视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/r2v_extend_output_75.mov) | \ | | | | \ |
    提示词:延长@视频1,窗户打开后进入@视频2的美术馆室内,最后镜头进入@视频3的画内
    |[视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/r2v_extend_video3.mp4) |
    输出视频宽高比自动和待延长视频的 7:5 保持一致
    | **选项:Curl** ```Bash curl -X POST https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seedance-2-5-260628", "content": [ { "type": "text", "text": "延长@视频1,窗户打开后进入@视频2的美术馆室内,最后镜头进入@视频3的画内" }, { "type": "video_url", "video_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/r2v_extend_video1_75.mov" }, "role": "reference_video" }, { "type": "video_url", "video_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/r2v_extend_video2.mp4" }, "role": "reference_video" }, { "type": "video_url", "video_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/r2v_extend_video3.mp4" }, "role": "reference_video" } ], "generate_audio": true, "ratio": "adaptive", "duration": 11, "omni_reference_task_type": "extend", "output_format": "mov", "watermark": true }' ``` **选项:Python** ```Python import os import time # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark client = Ark( # The base URL for model invocation base_url='https://ark.cn-beijing.volces.com/api/v3', # Get API Key:https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.environ.get("ARK_API_KEY"), ) if __name__ == "__main__": print("----- create request -----") create_result = client.content_generation.tasks.create( model="doubao-seedance-2-5-260628", # Replace with Model ID content=[ { "type": "text", "text": "延长@视频1,窗户打开后进入@视频2的美术馆室内,最后镜头进入@视频3的画内", }, { "type": "video_url", "video_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/r2v_extend_video1_75.mov" }, "role": "reference_video", }, { "type": "video_url", "video_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/r2v_extend_video2.mp4" }, "role": "reference_video", }, { "type": "video_url", "video_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/r2v_extend_video3.mp4" }, "role": "reference_video", }, ], generate_audio=True, ratio="adaptive", duration=11, extra_body={ "omni_reference_task_type": "extend", "output_format": "mov", }, watermark=True, ) print(create_result) # Polling query section print("----- polling task status -----") task_id = create_result.id deadline = time.monotonic() + 30 * 60 while time.monotonic() < deadline: get_result = client.content_generation.tasks.get(task_id=task_id) status = get_result.status if status == "succeeded": print("----- task succeeded -----") print(get_result) break elif status == "failed": raise RuntimeError(f"Video generation task failed: {get_result.error}") else: print(f"Current status: {status}, Retrying after 10 seconds...") time.sleep(10) else: raise TimeoutError("Video generation task did not finish within 30 minutes") ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.content_generation.*; import com.volcengine.ark.runtime.service.ArkService; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; import retrofit2.Call; import retrofit2.Retrofit; import retrofit2.http.Body; import retrofit2.http.POST; import java.io.IOException; import java.time.Duration; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; public class ContentGenerationTaskExample { interface ContentGenerationApi { @POST("contents/generations/tasks") Call create(@Body Map request); } // Client initialization static String apiKey = System.getenv("ARK_API_KEY"); static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); static Dispatcher dispatcher = new Dispatcher(); static ArkService service = ArkService.builder() .baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .build(); static Retrofit retrofit = ArkService.defaultRetrofit( ArkService.defaultApiKeyClient(apiKey, Duration.ofSeconds(180)), ArkService.defaultObjectMapper(), "https://ark.cn-beijing.volces.com/api/v3/", Runnable::run); static ContentGenerationApi contentGenerationApi = retrofit.create(ContentGenerationApi.class); public static void main(String[] args) throws IOException { // Model ID final String modelId = "doubao-seedance-2-5-260628"; // Text prompt final String prompt = "延长@视频1,窗户打开后进入@视频2的美术馆室内,最后镜头进入@视频3的画内"; // Example resource URLs final String refVideo1 = "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/r2v_extend_video1_75.mov"; final String refVideo2 = "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/r2v_extend_video2.mp4"; final String refVideo3 = "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/r2v_extend_video3.mp4"; // Output video parameters final boolean generateAudio = true; final String videoRatio = "adaptive"; final long videoDuration = 11L; System.out.println("----- create request -----"); // Build request content List contents = new ArrayList<>(); // 1. Text prompt contents.add(ContentItem.builder() .type(ContentType.TEXT) .text(prompt) .build()); // 2. Reference video 1 contents.add(ContentItem.builder() .type(ContentType.VIDEO_URL) .videoUrl(VideoURL.builder() .url(refVideo1) .build()) .role("reference_video") .build()); // 3. Reference video 2 contents.add(ContentItem.builder() .type(ContentType.VIDEO_URL) .videoUrl(VideoURL.builder() .url(refVideo2) .build()) .role("reference_video") .build()); // 4. Reference video 3 contents.add(ContentItem.builder() .type(ContentType.VIDEO_URL) .videoUrl(VideoURL.builder() .url(refVideo3) .build()) .role("reference_video") .build()); // Create video generation task Map createRequest = new LinkedHashMap<>(); createRequest.put("model", modelId); createRequest.put("content", contents); createRequest.put("generate_audio", generateAudio); createRequest.put("ratio", videoRatio); createRequest.put("duration", videoDuration); createRequest.put("omni_reference_task_type", "extend"); createRequest.put("output_format", "mov"); createRequest.put("watermark", true); retrofit2.Response response = contentGenerationApi.create(createRequest).execute(); if (!response.isSuccessful() || response.body() == null) { throw new IOException("Unexpected code " + response.code()); } CreateContentGenerationTaskResponse createResult = response.body(); System.out.println("Task Created: " + createResult); // Get task details and poll status String taskId = createResult.getId(); pollTaskStatus(taskId); } /** * Poll task status * @param taskId Task ID */ private static void pollTaskStatus(String taskId) { String getRequest = taskId; System.out.println("----- polling task status -----"); try { long deadlineNanos = System.nanoTime() + TimeUnit.MINUTES.toNanos(30); while (System.nanoTime() < deadlineNanos) { ContentGenerationTask getResponse = service.getContentGenerationTask(getRequest); String status = getResponse.getStatus().toString(); if ("succeeded".equalsIgnoreCase(status)) { System.out.println("----- task succeeded -----"); System.out.println(getResponse); return; } else if ("failed".equalsIgnoreCase(status)) { throw new IllegalStateException( "Video generation task failed: " + getResponse.getError()); } else { System.out.printf("Current status: %s, Retrying in 10 seconds...%n", status); TimeUnit.SECONDS.sleep(10); } } throw new IllegalStateException( "Video generation task did not finish within 30 minutes"); } catch (InterruptedException ie) { Thread.currentThread().interrupt(); throw new RuntimeException("Polling interrupted", ie); } catch (Exception e) { throw new RuntimeException("Error occurred while polling", e); } finally { service.shutdownExecutor(); } } } ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "time" "github.com/volcengine/ark-runtime-go/arkruntime" model "github.com/volcengine/ark-runtime-go/arkruntime/model/contentgeneration" ) func main() { // Initialize Ark client client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), // The base URL for model invocation arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute) defer cancel() // Model ID modelID := "doubao-seedance-2-5-260628" // Text prompt prompt := "延长@视频1,窗户打开后进入@视频2的美术馆室内,最后镜头进入@视频3的画内" // Example resource URLs refVideo1 := "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/r2v_extend_video1_75.mov" refVideo2 := "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/r2v_extend_video2.mp4" refVideo3 := "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/r2v_extend_video3.mp4" // Output video parameters generateAudio := true videoRatio := "adaptive" videoDuration := int64(11) omniReferenceTaskType := "extend" outputFormat := "mov" // 1. Create video generation task fmt.Println("----- create request -----") createReq := &model.CreateContentGenerationTaskRequest{ Model: modelID, GenerateAudio: model.NewOptBool(generateAudio), Ratio: model.NewOptString(videoRatio), Duration: model.NewOptInt64(videoDuration), Content: []model.ContentItem{ { Type: model.ContentTypeText, Text: model.NewOptString(prompt), }, { Type: model.ContentTypeVideoURL, VideoURL: model.NewOptVideoURL(model.VideoURL{ URL: refVideo1, }), Role: model.NewOptString("reference_video"), }, { Type: model.ContentTypeVideoURL, VideoURL: model.NewOptVideoURL(model.VideoURL{ URL: refVideo2, }), Role: model.NewOptString("reference_video"), }, { Type: model.ContentTypeVideoURL, VideoURL: model.NewOptVideoURL(model.VideoURL{ URL: refVideo3, }), Role: model.NewOptString("reference_video"), }, }, Watermark: model.NewOptBool(true), } createResp, err := client.CreateContentGenerationTask( ctx, createReq, arkruntime.WithExtraBody(map[string]interface{}{ "omni_reference_task_type": omniReferenceTaskType, "output_format": outputFormat, }), ) if err != nil { panic(fmt.Errorf("create content generation task: %w", err)) } taskID := createResp.ID fmt.Printf("Task Created with ID: %s\n", taskID) // 2. Poll task status pollTaskStatus(ctx, client, taskID) } // poll task status func pollTaskStatus(ctx context.Context, client *arkruntime.Client, taskID string) { fmt.Println("----- polling task status -----") for { getReq := taskID getResp, err := client.GetContentGenerationTask(ctx, getReq) if err != nil { panic(fmt.Errorf("get content generation task: %w", err)) } status := getResp.Status if status == "succeeded" { fmt.Println("----- task succeeded -----") fmt.Printf("Task ID: %s \n", getResp.ID) fmt.Printf("Model: %s \n", getResp.Model) fmt.Printf("Video URL: %s \n", getResp.Content.Or(model.TaskContent{}).VideoURL.Or("")) fmt.Printf("Completion Tokens: %d \n", getResp.Usage.Or(model.TaskUsage{}).CompletionTokens) fmt.Printf("Created At: %d, Updated At: %d\n", getResp.CreatedAt.Or(0), getResp.UpdatedAt.Or(0)) return } else if status == "failed" { if getResp.Error.IsSet() { panic(fmt.Errorf("video generation task failed: %s: %s", getResp.Error.Value.Code, getResp.Error.Value.Message)) } panic("video generation task failed") } else { fmt.Printf("Current status: %s, Retrying in 10 seconds... \n", status) time.Sleep(10 * time.Second) } } } ``` ### 使用示例-首帧/首尾帧生视频 在首帧/首尾帧生视频任务中,Seedance 2.5 会自动保持输出视频宽高比和 `first_frame` 指定的首帧图片一致(参数 `ratio` 默认且仅支持配置为 `adaptive`)。视频输出时长可以自行设置或由模型智能判断(参数 `duration` 支持配置为 `[4, 30]` 或 `-1`)。 |输入:文本 + 首帧(宽高比 1:1) + 尾帧 ||输出(宽高比 1:1)| |---|---|---| |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/649cb2057eae48d6a6eec872d912c75c~tplv-goo7wpa0wc-image.image) |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/e39fd8e500a34bbdad50d06659c4ea6b~tplv-goo7wpa0wc-image.image) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/3aa8c84b8a29408ab29e95992d61c559) | \ | | | | \ |
    提示词:图中女孩对着镜头说“茄子”,360 度环绕运镜
    | |
    输出视频宽高比自动和首帧图片的 1:1 保持一致
    | **选项:Curl** ```Bash curl -X POST https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seedance-2-5-260628", "content": [ { "type": "text", "text": "草莓夹心饼干缓慢旋转一周,镜头平滑环绕,保持产品居中" }, { "type": "image_url", "image_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_reference1.png" }, "role": "first_frame" }, { "type": "image_url", "image_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_reference1.png" }, "role": "last_frame" } ], "generate_audio": true, "ratio": "adaptive", "duration": 5, "watermark": true }' ``` **选项:Python** ```Python import os import time # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark client = Ark( # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.environ.get("ARK_API_KEY"), ) if __name__ == "__main__": print("----- create request -----") create_result = client.content_generation.tasks.create( model="doubao-seedance-2-5-260628", # Replace with Model ID content=[ { "type": "text", "text": "草莓夹心饼干缓慢旋转一周,镜头平滑环绕,保持产品居中", }, { "type": "image_url", "image_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_reference1.png" }, "role": "first_frame", }, { "type": "image_url", "image_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_reference1.png" }, "role": "last_frame", }, ], generate_audio=True, ratio="adaptive", duration=5, watermark=True, ) print(create_result) # Polling query section print("----- polling task status -----") task_id = create_result.id deadline = time.monotonic() + 30 * 60 while time.monotonic() < deadline: get_result = client.content_generation.tasks.get(task_id=task_id) status = get_result.status if status == "succeeded": print("----- task succeeded -----") print(get_result) break if status == "failed": raise RuntimeError(f"Video generation task failed: {get_result.error}") print(f"Current status: {status}, Retrying after 10 seconds...") time.sleep(10) else: raise TimeoutError("Video generation task did not finish within 30 minutes") ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.content_generation.*; import com.volcengine.ark.runtime.service.ArkService; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; public class ContentGenerationTaskExample { // Client initialization static String apiKey = System.getenv("ARK_API_KEY"); static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); static Dispatcher dispatcher = new Dispatcher(); static ArkService service = ArkService.builder() .baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .build(); public static void main(String[] args) { // Model ID final String modelId = "doubao-seedance-2-5-260628"; // Text prompt final String prompt = "草莓夹心饼干缓慢旋转一周,镜头平滑环绕,保持产品居中"; // Example resource URLs final String firstFrameUrl = "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_reference1.png"; final String lastFrameUrl = "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_reference1.png"; // Output video parameters final boolean generateAudio = true; final String videoRatio = "adaptive"; final long videoDuration = 5L; System.out.println("----- create request -----"); // Build request content List contents = new ArrayList<>(); // 1. Text prompt contents.add(ContentItem.builder() .type(ContentType.TEXT) .text(prompt) .build()); // 2. First frame image contents.add(ContentItem.builder() .type(ContentType.IMAGE_URL) .imageUrl(ImageURL.builder() .url(firstFrameUrl) .build()) .role("first_frame") .build()); // 3. Last frame image contents.add(ContentItem.builder() .type(ContentType.IMAGE_URL) .imageUrl(ImageURL.builder() .url(lastFrameUrl) .build()) .role("last_frame") .build()); // Create video generation task CreateContentGenerationTaskRequest createRequest = CreateContentGenerationTaskRequest.builder() .generateAudio(generateAudio) .model(modelId) .content(contents) .ratio(videoRatio) .duration(videoDuration) .watermark(true) .build(); CreateContentGenerationTaskResponse createResult = service.createContentGenerationTask(createRequest); System.out.println("Task Created: " + createResult); // Get task details and poll status String taskId = createResult.getId(); pollTaskStatus(taskId); } /** * Poll task status * @param taskId Task ID */ private static void pollTaskStatus(String taskId) { String getRequest = taskId; System.out.println("----- polling task status -----"); try { long deadlineNanos = System.nanoTime() + TimeUnit.MINUTES.toNanos(30); while (System.nanoTime() < deadlineNanos) { ContentGenerationTask getResponse = service.getContentGenerationTask(getRequest); String status = getResponse.getStatus().toString(); if ("succeeded".equalsIgnoreCase(status)) { System.out.println("----- task succeeded -----"); System.out.println(getResponse); return; } else if ("failed".equalsIgnoreCase(status)) { throw new IllegalStateException( "Video generation task failed: " + getResponse.getError()); } else { System.out.printf("Current status: %s, Retrying in 10 seconds...%n", status); TimeUnit.SECONDS.sleep(10); } } throw new IllegalStateException( "Video generation task did not finish within 30 minutes"); } catch (InterruptedException ie) { Thread.currentThread().interrupt(); throw new RuntimeException("Polling interrupted", ie); } catch (Exception e) { throw new RuntimeException("Error occurred while polling", e); } finally { service.shutdownExecutor(); } } } ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "time" "github.com/volcengine/ark-runtime-go/arkruntime" model "github.com/volcengine/ark-runtime-go/arkruntime/model/contentgeneration" ) func main() { // Initialize Ark client client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), // The base URL for model invocation arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute) defer cancel() // Model ID modelID := "doubao-seedance-2-5-260628" // Text prompt prompt := "草莓夹心饼干缓慢旋转一周,镜头平滑环绕,保持产品居中" // Example resource URLs firstFrameURL := "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_reference1.png" lastFrameURL := "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_reference1.png" // Output video parameters generateAudio := true videoRatio := "adaptive" videoDuration := int64(5) // 1. Create video generation task fmt.Println("----- create request -----") createReq := &model.CreateContentGenerationTaskRequest{ Model: modelID, GenerateAudio: model.NewOptBool(generateAudio), Ratio: model.NewOptString(videoRatio), Duration: model.NewOptInt64(videoDuration), Content: []model.ContentItem{ { Type: model.ContentTypeText, Text: model.NewOptString(prompt), }, { Type: model.ContentTypeImageURL, ImageURL: model.NewOptImageURL(model.ImageURL{ URL: firstFrameURL, }), Role: model.NewOptString("first_frame"), }, { Type: model.ContentTypeImageURL, ImageURL: model.NewOptImageURL(model.ImageURL{ URL: lastFrameURL, }), Role: model.NewOptString("last_frame"), }, }, Watermark: model.NewOptBool(true), } createResp, err := client.CreateContentGenerationTask(ctx, createReq) if err != nil { panic(fmt.Errorf("create content generation task: %w", err)) } taskID := createResp.ID fmt.Printf("Task Created with ID: %s\n", taskID) // 2. Poll task status pollTaskStatus(ctx, client, taskID) } // poll task status func pollTaskStatus(ctx context.Context, client *arkruntime.Client, taskID string) { fmt.Println("----- polling task status -----") for { getReq := taskID getResp, err := client.GetContentGenerationTask(ctx, getReq) if err != nil { panic(fmt.Errorf("get content generation task: %w", err)) } status := getResp.Status if status == "succeeded" { fmt.Println("----- task succeeded -----") fmt.Printf("Task ID: %s \n", getResp.ID) fmt.Printf("Model: %s \n", getResp.Model) fmt.Printf("Video URL: %s \n", getResp.Content.Or(model.TaskContent{}).VideoURL.Or("")) fmt.Printf("Completion Tokens: %d \n", getResp.Usage.Or(model.TaskUsage{}).CompletionTokens) fmt.Printf("Created At: %d, Updated At: %d\n", getResp.CreatedAt.Or(0), getResp.UpdatedAt.Or(0)) return } else if status == "failed" { if getResp.Error.IsSet() { panic(fmt.Errorf("video generation task failed: %s: %s", getResp.Error.Value.Code, getResp.Error.Value.Message)) } panic("video generation task failed") } else { fmt.Printf("Current status: %s, Retrying in 10 seconds... \n", status) time.Sleep(10 * time.Second) } } } ``` ## 原生多语言生成 Seedance 2.5 原生支持多种语言的提示词输入和有声视频生成,覆盖支持中文、英语、西班牙语、印度尼西亚语、马来语、泰语、阿拉伯语、葡萄牙语、越南语、日语、韩语。 |输入:文本 + 图片 |输出 | |---|---| |![](https://arkdocs.tos-cn-beijing.volces.com/images/resources/seedacne2.5_muti_language_input.png) |[视频](https://arkdocs.tos-cn-beijing.volces.com/videos/resources/seedacne2.5_muti_language_output.mp4) | \ | | | \ |
    提示词:电影级 hip-hop / 说唱音乐视频,歌词覆盖 8 种语言...(详见下方代码示例中的完整提示词)
    | | **选项:Curl** ```Bash curl -X POST https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seedance-2-5-260628", "content": [ { "type": "text", "text": "电影级 hip-hop / 说唱音乐视频,真实照片级质感,高端调性,海边场景。以@图像1构建画面:一支乐队在金色沙滩、海浪拍岸的岸边表演 —— 一名主唱手握麦克风、麦架立于湿沙上激情演唱,一名吉他手立于画面左侧,一名吉他手立于画面右侧,一名鼓手坐在后方的架子鼓后敲击;辽阔的海岸线在身后展开,滚滚海浪层层涌来,巨大而温暖的黄金时刻夕阳斜掠过沙滩、在水面上粼粼闪耀,空气中漂浮着海雾与咸湿水汽。 红色运动服的主唱对着镜头充满节奏感地 RAP 演唱 —— 口型与下颌随每一个字精准对位,头随节拍用力点动,带动整段 flow。乐手们随节奏摇摆律动,身后海浪层层拍岸。这是一首明快带劲的说唱曲 —— 语速快、自信、节拍强劲。踩着节拍硬切(HARD CUT),每次切换双重反差(景别与镜头类型同时改变)。 歌词(主唱依次演唱以下每种语言的「你好」,精准对口型): 英语:\"Hello\" 中文:\"你好\" 日语:\"こんにちは\" 韩语:\"안녕하세요\" 葡萄牙语:\"Olá\" 泰语:\"สวัสดี\" 西班牙语:\"Hola\" 阿拉伯语:\"مرحبا\" 镜头 1 [0:00–0:03] —— 低角度大远景定场,斯坦尼康在黄金夕照与海雾中缓缓推进,海浪在乐队身后翻涌。歌词第 1 句(英语「Hello」)。硬切。镜头 2 [0:03–0:05] —— 红运动服主唱对镜头 RAP 的特写,手持甩镜切入,身后海面虚焦粼粼波光。歌词第 2 句(中文「你好」)。硬切。镜头 3 [0:05–0:08] —— 微距插入镜头,固定机位,吉他手的手指在弦上快速拨动,沙粒与咸湿水雾从画面前掠过。歌词第 3 句(日语「こんにちは」)。硬切。镜头 4 [0:08–0:10] —— 对某位乐手的 3/4 侧中景,缓慢潜行环绕,乐器金属件与湿润高光映着海面低斜的夕阳。歌词第 4 句(韩语「안녕하세요」)。硬切。镜头 5 [0:10–0:13] —— 岸边一名乐手,快速横移轨道掠过他,他转向镜头,身后一道浪花破碎。歌词第 5 句(葡萄牙语「Olá」)。硬切。镜头 6 [0:13–0:15] —— 水边的鼓手,手持快速上摇,海风与水花吹动他的头发,他随节拍律动敲击。歌词第 6 句(泰语「สวัสดี」)。硬切。镜头 7 [0:15–0:18] —— 对红运动服主唱 flow 正酣时的紧凑猛推,富攻击性的手持,身后暮色海面衬着乐队剪影。歌词第 7 句(西班牙语「Hola」)。硬切。镜头 8 [0:18–0:20] —— 全乐队英雄式大远景,富攻击性的手持推进,主唱与乐手踩着节拍向镜头迈步,海浪拍碎、金色夕光在整支乐队身后炸开光晕。歌词第 8 句(阿拉伯语「مرحبا」)。 白平衡 4000K,青橙(teal-and-amber)调色,35mm,浅景深,胶片颗粒,弥漫的海雾,黄金时刻光晕。质感扎实、高级、高端。节奏感说唱表演,精准对口型,头随节拍点动。无字幕、无文字叠加、无叠化转场、无重复人物,仅用硬切。总时长 20 秒。" }, { "type": "image_url", "image_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_multi_language_input.png" }, "role": "reference_image" } ], "generate_audio": true, "ratio": "16:9", "duration": 20, "watermark": true }' ``` **选项:Python** ```Python import os import time # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark client = Ark( # The base URL for model invocation base_url='https://ark.cn-beijing.volces.com/api/v3', # Get API Key:https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.environ.get("ARK_API_KEY"), ) if __name__ == "__main__": print("----- create request -----") create_result = client.content_generation.tasks.create( model="doubao-seedance-2-5-260628", # Replace with Model ID content=[ { "type": "text", "text": "电影级 hip-hop / 说唱音乐视频,真实照片级质感,高端调性,海边场景。以@图像1构建画面:一支乐队在金色沙滩、海浪拍岸的岸边表演 —— 一名主唱手握麦克风、麦架立于湿沙上激情演唱,一名吉他手立于画面左侧,一名吉他手立于画面右侧,一名鼓手坐在后方的架子鼓后敲击;辽阔的海岸线在身后展开,滚滚海浪层层涌来,巨大而温暖的黄金时刻夕阳斜掠过沙滩、在水面上粼粼闪耀,空气中漂浮着海雾与咸湿水汽。 红色运动服的主唱对着镜头充满节奏感地 RAP 演唱 —— 口型与下颌随每一个字精准对位,头随节拍用力点动,带动整段 flow。乐手们随节奏摇摆律动,身后海浪层层拍岸。这是一首明快带劲的说唱曲 —— 语速快、自信、节拍强劲。踩着节拍硬切(HARD CUT),每次切换双重反差(景别与镜头类型同时改变)。 歌词(主唱依次演唱以下每种语言的「你好」,精准对口型): 英语:\"Hello\" 中文:\"你好\" 日语:\"こんにちは\" 韩语:\"안녕하세요\" 葡萄牙语:\"Olá\" 泰语:\"สวัสดี\" 西班牙语:\"Hola\" 阿拉伯语:\"مرحبا\" 镜头 1 [0:00–0:03] —— 低角度大远景定场,斯坦尼康在黄金夕照与海雾中缓缓推进,海浪在乐队身后翻涌。歌词第 1 句(英语「Hello」)。硬切。镜头 2 [0:03–0:05] —— 红运动服主唱对镜头 RAP 的特写,手持甩镜切入,身后海面虚焦粼粼波光。歌词第 2 句(中文「你好」)。硬切。镜头 3 [0:05–0:08] —— 微距插入镜头,固定机位,吉他手的手指在弦上快速拨动,沙粒与咸湿水雾从画面前掠过。歌词第 3 句(日语「こんにちは」)。硬切。镜头 4 [0:08–0:10] —— 对某位乐手的 3/4 侧中景,缓慢潜行环绕,乐器金属件与湿润高光映着海面低斜的夕阳。歌词第 4 句(韩语「안녕하세요」)。硬切。镜头 5 [0:10–0:13] —— 岸边一名乐手,快速横移轨道掠过他,他转向镜头,身后一道浪花破碎。歌词第 5 句(葡萄牙语「Olá」)。硬切。镜头 6 [0:13–0:15] —— 水边的鼓手,手持快速上摇,海风与水花吹动他的头发,他随节拍律动敲击。歌词第 6 句(泰语「สวัสดี」)。硬切。镜头 7 [0:15–0:18] —— 对红运动服主唱 flow 正酣时的紧凑猛推,富攻击性的手持,身后暮色海面衬着乐队剪影。歌词第 7 句(西班牙语「Hola」)。硬切。镜头 8 [0:18–0:20] —— 全乐队英雄式大远景,富攻击性的手持推进,主唱与乐手踩着节拍向镜头迈步,海浪拍碎、金色夕光在整支乐队身后炸开光晕。歌词第 8 句(阿拉伯语「مرحبا」)。 白平衡 4000K,青橙(teal-and-amber)调色,35mm,浅景深,胶片颗粒,弥漫的海雾,黄金时刻光晕。质感扎实、高级、高端。节奏感说唱表演,精准对口型,头随节拍点动。无字幕、无文字叠加、无叠化转场、无重复人物,仅用硬切。总时长 20 秒。", }, { "type": "image_url", "image_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_multi_language_input.png" }, "role": "reference_image", }, ], generate_audio=True, ratio="16:9", duration=20, watermark=True, ) print(create_result) # Polling query section print("----- polling task status -----") task_id = create_result.id deadline = time.monotonic() + 30 * 60 while time.monotonic() < deadline: get_result = client.content_generation.tasks.get(task_id=task_id) status = get_result.status if status == "succeeded": print("----- task succeeded -----") print(get_result) break elif status == "failed": raise RuntimeError(f"Video generation task failed: {get_result.error}") else: print(f"Current status: {status}, Retrying after 30 seconds...") time.sleep(30) else: raise TimeoutError("Video generation task did not finish within 30 minutes") ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.content_generation.*; import com.volcengine.ark.runtime.service.ArkService; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; public class ContentGenerationTaskExample { // Client initialization static String apiKey = System.getenv("ARK_API_KEY"); static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); static Dispatcher dispatcher = new Dispatcher(); static ArkService service = ArkService.builder() .baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .build(); public static void main(String[] args) { // Model ID final String modelId = "doubao-seedance-2-5-260628"; // Text prompt final String prompt = "电影级 hip-hop / 说唱音乐视频,真实照片级质感,高端调性,海边场景。以@图像1构建画面:一支乐队在金色沙滩、海浪拍岸的岸边表演 —— 一名主唱手握麦克风、麦架立于湿沙上激情演唱,一名吉他手立于画面左侧,一名吉他手立于画面右侧,一名鼓手坐在后方的架子鼓后敲击;辽阔的海岸线在身后展开,滚滚海浪层层涌来,巨大而温暖的黄金时刻夕阳斜掠过沙滩、在水面上粼粼闪耀,空气中漂浮着海雾与咸湿水汽。 红色运动服的主唱对着镜头充满节奏感地 RAP 演唱 —— 口型与下颌随每一个字精准对位,头随节拍用力点动,带动整段 flow。乐手们随节奏摇摆律动,身后海浪层层拍岸。这是一首明快带劲的说唱曲 —— 语速快、自信、节拍强劲。踩着节拍硬切(HARD CUT),每次切换双重反差(景别与镜头类型同时改变)。 歌词(主唱依次演唱以下每种语言的「你好」,精准对口型): 英语:\"Hello\" 中文:\"你好\" 日语:\"こんにちは\" 韩语:\"안녕하세요\" 葡萄牙语:\"Olá\" 泰语:\"สวัสดี\" 西班牙语:\"Hola\" 阿拉伯语:\"مرحبا\" 镜头 1 [0:00–0:03] —— 低角度大远景定场,斯坦尼康在黄金夕照与海雾中缓缓推进,海浪在乐队身后翻涌。歌词第 1 句(英语「Hello」)。硬切。镜头 2 [0:03–0:05] —— 红运动服主唱对镜头 RAP 的特写,手持甩镜切入,身后海面虚焦粼粼波光。歌词第 2 句(中文「你好」)。硬切。镜头 3 [0:05–0:08] —— 微距插入镜头,固定机位,吉他手的手指在弦上快速拨动,沙粒与咸湿水雾从画面前掠过。歌词第 3 句(日语「こんにちは」)。硬切。镜头 4 [0:08–0:10] —— 对某位乐手的 3/4 侧中景,缓慢潜行环绕,乐器金属件与湿润高光映着海面低斜的夕阳。歌词第 4 句(韩语「안녕하세요」)。硬切。镜头 5 [0:10–0:13] —— 岸边一名乐手,快速横移轨道掠过他,他转向镜头,身后一道浪花破碎。歌词第 5 句(葡萄牙语「Olá」)。硬切。镜头 6 [0:13–0:15] —— 水边的鼓手,手持快速上摇,海风与水花吹动他的头发,他随节拍律动敲击。歌词第 6 句(泰语「สวัสดี」)。硬切。镜头 7 [0:15–0:18] —— 对红运动服主唱 flow 正酣时的紧凑猛推,富攻击性的手持,身后暮色海面衬着乐队剪影。歌词第 7 句(西班牙语「Hola」)。硬切。镜头 8 [0:18–0:20] —— 全乐队英雄式大远景,富攻击性的手持推进,主唱与乐手踩着节拍向镜头迈步,海浪拍碎、金色夕光在整支乐队身后炸开光晕。歌词第 8 句(阿拉伯语「مرحبا」)。 白平衡 4000K,青橙(teal-and-amber)调色,35mm,浅景深,胶片颗粒,弥漫的海雾,黄金时刻光晕。质感扎实、高级、高端。节奏感说唱表演,精准对口型,头随节拍点动。无字幕、无文字叠加、无叠化转场、无重复人物,仅用硬切。总时长 20 秒。"; // Example resource URLs final String refImage1 = "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_multi_language_input.png"; // Output video parameters final boolean generateAudio = true; final String videoRatio = "16:9"; final long videoDuration = 20L; System.out.println("----- create request -----"); // Build request content List contents = new ArrayList<>(); // 1. Text prompt contents.add(ContentItem.builder() .type(ContentType.TEXT) .text(prompt) .build()); // 2. Reference image contents.add(ContentItem.builder() .type(ContentType.IMAGE_URL) .imageUrl(ImageURL.builder() .url(refImage1) .build()) .role("reference_image") .build()); // Create video generation task CreateContentGenerationTaskRequest createRequest = CreateContentGenerationTaskRequest.builder() .generateAudio(generateAudio) .model(modelId) .content(contents) .ratio(videoRatio) .duration(videoDuration) .watermark(true) .build(); CreateContentGenerationTaskResponse createResult = service.createContentGenerationTask(createRequest); System.out.println("Task Created: " + createResult); // Get task details and poll status String taskId = createResult.getId(); pollTaskStatus(taskId); } /** * Poll task status * @param taskId Task ID */ private static void pollTaskStatus(String taskId) { String getRequest = taskId; System.out.println("----- polling task status -----"); try { long deadlineNanos = System.nanoTime() + TimeUnit.MINUTES.toNanos(30); while (System.nanoTime() < deadlineNanos) { ContentGenerationTask getResponse = service.getContentGenerationTask(getRequest); String status = getResponse.getStatus().toString(); if ("succeeded".equalsIgnoreCase(status)) { System.out.println("----- task succeeded -----"); System.out.println(getResponse); return; } else if ("failed".equalsIgnoreCase(status)) { throw new IllegalStateException( "Video generation task failed: " + getResponse.getError()); } else { System.out.printf("Current status: %s, Retrying in 10 seconds...%n", status); TimeUnit.SECONDS.sleep(10); } } throw new IllegalStateException( "Video generation task did not finish within 30 minutes"); } catch (InterruptedException ie) { Thread.currentThread().interrupt(); throw new RuntimeException("Polling interrupted", ie); } catch (Exception e) { throw new RuntimeException("Error occurred while polling", e); } finally { service.shutdownExecutor(); } } } ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "time" "github.com/volcengine/ark-runtime-go/arkruntime" model "github.com/volcengine/ark-runtime-go/arkruntime/model/contentgeneration" ) func main() { // Initialize Ark client client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), // The base URL for model invocation arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute) defer cancel() // Model ID modelID := "doubao-seedance-2-5-260628" // Text prompt prompt := "电影级 hip-hop / 说唱音乐视频,真实照片级质感,高端调性,海边场景。以@图像1构建画面:一支乐队在金色沙滩、海浪拍岸的岸边表演 —— 一名主唱手握麦克风、麦架立于湿沙上激情演唱,一名吉他手立于画面左侧,一名吉他手立于画面右侧,一名鼓手坐在后方的架子鼓后敲击;辽阔的海岸线在身后展开,滚滚海浪层层涌来,巨大而温暖的黄金时刻夕阳斜掠过沙滩、在水面上粼粼闪耀,空气中漂浮着海雾与咸湿水汽。 红色运动服的主唱对着镜头充满节奏感地 RAP 演唱 —— 口型与下颌随每一个字精准对位,头随节拍用力点动,带动整段 flow。乐手们随节奏摇摆律动,身后海浪层层拍岸。这是一首明快带劲的说唱曲 —— 语速快、自信、节拍强劲。踩着节拍硬切(HARD CUT),每次切换双重反差(景别与镜头类型同时改变)。 歌词(主唱依次演唱以下每种语言的「你好」,精准对口型): 英语:\"Hello\" 中文:\"你好\" 日语:\"こんにちは\" 韩语:\"안녕하세요\" 葡萄牙语:\"Olá\" 泰语:\"สวัสดี\" 西班牙语:\"Hola\" 阿拉伯语:\"مرحبا\" 镜头 1 [0:00–0:03] —— 低角度大远景定场,斯坦尼康在黄金夕照与海雾中缓缓推进,海浪在乐队身后翻涌。歌词第 1 句(英语「Hello」)。硬切。镜头 2 [0:03–0:05] —— 红运动服主唱对镜头 RAP 的特写,手持甩镜切入,身后海面虚焦粼粼波光。歌词第 2 句(中文「你好」)。硬切。镜头 3 [0:05–0:08] —— 微距插入镜头,固定机位,吉他手的手指在弦上快速拨动,沙粒与咸湿水雾从画面前掠过。歌词第 3 句(日语「こんにちは」)。硬切。镜头 4 [0:08–0:10] —— 对某位乐手的 3/4 侧中景,缓慢潜行环绕,乐器金属件与湿润高光映着海面低斜的夕阳。歌词第 4 句(韩语「안녕하세요」)。硬切。镜头 5 [0:10–0:13] —— 岸边一名乐手,快速横移轨道掠过他,他转向镜头,身后一道浪花破碎。歌词第 5 句(葡萄牙语「Olá」)。硬切。镜头 6 [0:13–0:15] —— 水边的鼓手,手持快速上摇,海风与水花吹动他的头发,他随节拍律动敲击。歌词第 6 句(泰语「สวัสดี」)。硬切。镜头 7 [0:15–0:18] —— 对红运动服主唱 flow 正酣时的紧凑猛推,富攻击性的手持,身后暮色海面衬着乐队剪影。歌词第 7 句(西班牙语「Hola」)。硬切。镜头 8 [0:18–0:20] —— 全乐队英雄式大远景,富攻击性的手持推进,主唱与乐手踩着节拍向镜头迈步,海浪拍碎、金色夕光在整支乐队身后炸开光晕。歌词第 8 句(阿拉伯语「مرحبا」)。 白平衡 4000K,青橙(teal-and-amber)调色,35mm,浅景深,胶片颗粒,弥漫的海雾,黄金时刻光晕。质感扎实、高级、高端。节奏感说唱表演,精准对口型,头随节拍点动。无字幕、无文字叠加、无叠化转场、无重复人物,仅用硬切。总时长 20 秒。" // Example resource URLs refImage1 := "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_multi_language_input.png" // Output video parameters generateAudio := true videoRatio := "16:9" videoDuration := int64(20) // 1. Create video generation task fmt.Println("----- create request -----") createReq := &model.CreateContentGenerationTaskRequest{ Model: modelID, GenerateAudio: model.NewOptBool(generateAudio), Ratio: model.NewOptString(videoRatio), Duration: model.NewOptInt64(videoDuration), Content: []model.ContentItem{ { Type: model.ContentTypeText, Text: model.NewOptString(prompt), }, { Type: model.ContentTypeImageURL, ImageURL: model.NewOptImageURL(model.ImageURL{ URL: refImage1, }), Role: model.NewOptString("reference_image"), }, }, Watermark: model.NewOptBool(true), } createResp, err := client.CreateContentGenerationTask(ctx, createReq) if err != nil { panic(fmt.Errorf("create content generation task: %w", err)) } taskID := createResp.ID fmt.Printf("Task Created with ID: %s\n", taskID) // 2. Poll task status pollTaskStatus(ctx, client, taskID) } // poll task status func pollTaskStatus(ctx context.Context, client *arkruntime.Client, taskID string) { fmt.Println("----- polling task status -----") for { getReq := taskID getResp, err := client.GetContentGenerationTask(ctx, getReq) if err != nil { panic(fmt.Errorf("get content generation task: %w", err)) } status := getResp.Status if status == "succeeded" { fmt.Println("----- task succeeded -----") fmt.Printf("Task ID: %s \n", getResp.ID) fmt.Printf("Model: %s \n", getResp.Model) fmt.Printf("Video URL: %s \n", getResp.Content.Or(model.TaskContent{}).VideoURL.Or("")) fmt.Printf("Completion Tokens: %d \n", getResp.Usage.Or(model.TaskUsage{}).CompletionTokens) fmt.Printf("Created At: %d, Updated At: %d\n", getResp.CreatedAt.Or(0), getResp.UpdatedAt.Or(0)) return } else if status == "failed" { if getResp.Error.IsSet() { panic(fmt.Errorf("video generation task failed: %s: %s", getResp.Error.Value.Code, getResp.Error.Value.Message)) } panic("video generation task failed") } else { fmt.Printf("Current status: %s, Retrying in 10 seconds... \n", status) time.Sleep(10 * time.Second) } } } ``` # 更多能力 Seedance 2.5 同样支持以下基础能力,详细使用方式和代码示例请参考对应链接: - [**文生视频**](/docs/video-generation-tutorial#4e74bcee):输入文本提示词生成一段视频。 - [**使用联网搜索**](/docs/seedance-2-0#c40ed3ef):根据提示词自主判断是否搜索互联网内容(如商品、天气等)。提升生成视频的时效性。 - [**样片模式**](/docs/seedance-2-5#2.5_draft_mode):先生成 480p Draft 视频验证效果,再基于 Draft 视频生成高质量成片。 ## 样片模式 **样片(Draft)模式是一种“先快速验证效果,再生成高质量成片”的两步式视频生成方式**。开启该功能后,您可以更快速地生成一段低分辨率的预览视频,用于验证其场景结构、镜头调度、主体动作和提示词意图等关键要素;确认结果符合预期后,再使用 Draft 视频任务 ID 生成高质量成片。 |输入 |Draft 视频 |正式视频 | |---|---|---| |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/ebb5217645b04cfc94209a6f7d36a523~tplv-goo7wpa0wc-image.image) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/7c190b3a0ed34b29bc1192acbce2f4d2) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/a82cd582a5d54f34a8adec10f2815081) | \ | | | | \ |
    提示词:女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动,可以听到风声
    |
    生成一段 Draft 视频,预览并确认生成效果。
    |
    复用 Draft 视频使用的模型、提示词、输入素材、种子值、音频设置、视频宽高比、视频时长等关键参数生成正式视频,保证视频关键要素一致。
    | ### Step1:生成 Draft 视频 在调用 `POST /contents/generations/tasks` 接口创建生视频任务时,通过配置 `draft=true`,即可开启 Draft 模式。 > **注意** > > * 仅支持生成 480p 分辨率的 Draft 视频,设置其他分辨率将触发报错。 > * 生成 480p Draft 视频的 token 用量和单价,均与正常生成 480p 视频一致。 > * Draft 视频任务 ID 的有效期为 7 天(从 `created_at` 时间戳开始计算),超时后将无法使用该 Draft 视频生成正式视频。 **选项:Curl** 1. 创建 Draft 视频生成任务。 > 请求成功后,系统将返回一个任务 ID。此 ID 即为 Draft 视频任务 ID,后续需基于这个 ID 生成最终视频。 ```Bash curl https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seedance-2-5-260628", "content": [ { "type": "text", "text": "女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,镜头缓缓拉远" }, { "type": "image_url", "image_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/i2v_foxrgirl.png" } } ], "duration": 5, "ratio": "adaptive", "resolution": "480p", "output_format": "mov", "service_tier": "default", "draft": true, "watermark": true }' ``` 2. 使用 Draft 视频任务 ID,查询生成状态和结果。 > 当任务状态变为 `succeeded` 后,可在 `content.video_url` 字段处下载生成的 Draft 视频文件。确认 Draft 视频效果符合预期后,即可按照后续步骤生成最终视频。 ```Bash curl "https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks/" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" ``` ### Step2:生成正式视频 如果确认 Draft 视频符合预期,可基于 Step1 返回的 Draft 视频任务 ID,再次调用 `POST /contents/generations/tasks` 接口,生成最终视频。 > **注意** > > - 基于 Draft 视频生成正式视频时,当前仅支持生成 1080p 分辨率的视频,设置其他分辨率将触发报错。 > - Draft 视频任务 ID 的有效期为 7 天(从 `created_at` 时间戳开始计算),超时后将无法使用该 Draft 视频生成正式视频。 > - Step 1 和 Step 2 两类任务独立计费: > - Step 1:生成 Draft 视频,按 480p 视频计费。 > - Step 2:基于 Draft 生成正式视频,按目标分辨率计费: > - token 单价**根据 Step 1 是否包含输入视频确定**。 > - 计算 token 用量时,**输入视频时长按 Step 1 的输入视频计算,Draft 视频不计入**。 基于 Draft 视频生成正式视频时,不同参数的处理方式不同:部分需固定传入,部分由模型自动复用,部分可按成片需求重新设置。请按下表规则配置参数,避免请求报错。 | 类型 | 参数 | 规则 | | --- | --- | --- | | 取值固定参数 | * 模型 ID(`model`) | * `model` 必须与创建 Draft 任务时使用的一致。 | \ | | * 样片模式(`draft`) | * `draft` 可不传入或设置为 `false`。 | \ | | * 分辨率(`resolution`) | * `resolution` 必须传入,仅支持设置为 `1080p`。 | | 自动复用参数 | * 提示词(`content.text`) | * 模型自动复用创建 Draft 任务时使用的参数取值。 | \ | | * 参考图片/视频/音频(`content.image_url`、`content.video_url`、`content.audio_url`) | * **禁止传入。即使传入值与 Draft 阶段使用的一致,也会触发报错**。 | \ | | * 时长(`duration`) | | \ | | * 宽高比(`ratio`) | | \ | | * 随机种子数(`seed`) | | \ | | * 是否生成有声视频(`generate_audio`) | | \ | | * 任务类型(`omni_reference_task_type`) | | | 可重新指定参数 | * 返回尾帧(`return_last_frame`) | * 不传入时,自动使用模型默认值,不会沿用 Draft 视频的实际取值。 | \ | | | * 参数取值需满足 Seedance 2.5 模型对应的限制,详见 [创建视频生成任务 API](/docs/create-video-generation-task-api)。 | \ | | * 输出格式(`output_format`) | | \ | | * 水印(`watermark`) | | \ | | * 服务等级(`service_tier`) | | \ | | * 任务超时阈值(`execution_expires_after`) | | \ | | * 执行优先级(`priority`) | | \ | | * 回调地址(`callback_url`) | | \ | | * 用户标识(`safety_identifier`) | | **选项:Curl** 1. 基于 `content.draft_task.id` 创建视频生成任务。 ```Bash curl https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seedance-2-5-260628", "content": [ { "type": "draft_task", "draft_task": { "id": "" } } ], "resolution": "1080p", "output_format": "mov", "watermark": true }' ``` 2. 使用视频任务 ID,查询生成状态和结果。 > 当任务状态变为 `succeeded` 后,可在 `content.video_url` 字段处下载生成的视频文件。 ```Bash curl "https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks/" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" ``` # 自定义视频输出规格 通过 API 参数控制输出视频的规格,包括分辨率、宽高比、时长、输出格式、是否包含水印等。 * **resolution**:指定输出视频的分辨率。 * **ratio**:指定输出视频的宽高比。 * **duration**:指定输出视频的时长。 * **output_format**:指定输出视频的格式。 * **watermark**:指定是否为输出视频添加水印。 ## 分辨率 通过 **resolution** 参数指定输出视频的分辨率。 * 默认值:`720p` * 可选值: * `480p`(8bit 位深) * `720p`(8bit 位深) * `1080p`(10bit 位深) > **说明** > > **Seedance 2.5 输出的 1080p 视频采用 10bit 位深与 H.265/HEVC 编码**。 > * 相较于一般的 8bit 位深,10bit 位深能够保留更丰富的色彩层次与更平滑的渐变过渡,满足专业影视制作与 HDR 视频内容的要求。 > * H.265/HEVC 编码在少数播放环境中可能不兼容。如遇问题,建议升级系统、更换设备,或使用 VLC、MPV、QuickTime Player 等 [播放器](/docs/seedance-2-0#4k_player) 查看。 ```Json { "resolution": "720p" } ``` ## 宽高比 通过 **ratio** 参数指定输出视频的宽高比。 * 默认值:`adaptive`:即模型根据输入的提示词和参考素材,自动适配视频宽高比。 * 可选值:`16:9`、`4:3`、`1:1`、`3:4`、`9:16`、`21:9`、`adaptive` > **说明:adaptive 适配规则** > > * **视频编辑 / 视频延长**:模型根据提示词意图选定待编辑视频或待延长视频,并自动保持输出视频宽高比和待编辑视频或待延长视频一致。 > * **首帧 / 首尾帧生视频**:保持输出视频宽高比和 `first_frame` 指定的首帧图片一致。 > * **文生视频/参考生视频**:根据提示词选择可选宽高比中(`16:9`、`4:3`、`1:1`、`3:4`、`9:16`、`21:9`)最合适的宽高比。 > **注意** > > `Seedance 2.5` 在视频编辑、视频延长、首帧 / 首尾帧生视频任务中,仅支持配置 `ratio` 为 `adaptive`,不可指定具体宽高比。 ```Json { "ratio": "16:9" } ``` 不同宽高比对应的宽高像素值: | 分辨率 | 宽高比 | 像素尺寸(宽×高) | | --- | --- | --- | | 480p | 16:9 | 854×480 | | ^^ | 4:3 | 752×560 | | ^^ | 1:1 | 640×640 | | ^^ | 3:4 | 560×752 | | ^^ | 9:16 | 480×854 | | ^^ | 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 | | 1080p | 16:9 | 1920×1080 | | ^^ | 4:3 | 1664×1248 | | ^^ | 1:1 | 1440×1440 | | ^^ | 3:4 | 1248×1664 | | ^^ | 9:16 | 1080×1920 | | ^^ | 21:9 | 2206×946 | ## 视频时长 通过 **duration** 参数指定生成视频的时长(单位:秒)。 * 默认值:`-1`:即模型根据输入的提示词和参考素材,自动适配视频时长。 * 取值范围:`[4, 30]` 或 `-1` > **说明:duration = -1 适配规则** > > * 视频编辑任务:模型根据提示词意图选定待编辑视频,并自动保持输出视频时长和待编辑视频基本一致。 > * 输出视频可能是非整数秒 > * 输出视频可能略短于待编辑视频,误差不超过 0.4 秒 > * 其他生视频任务:模型在 `[4, 30]` 范围内,自主选择合适的视频长度(整数秒)。 > **注意** > > `Seedance 2.5` 在视频编辑任务仅支持配置 `duration` 为 `-1`,不可指定具体时长;且传入的待编辑视频时长需在 `[4, 30]s` 内,否则将触发报错。 ```Json { "duration": 10 } ``` ## 输出格式 通过 **output_format** 参数控制输出视频的格式。 * `mp4`(默认):通用格式,兼容性最好,采用标准色彩精度可在网页、移动端、各类播放器及分发平台直接播放。 * `mov`:面向专业场景的高色彩精度格式,更好地保持画面色彩与亮度一致性、适用于调色、抠像、合成等对色彩还原要求高的专业后期加工。推荐在视频编辑和视频延长场景使用 mov 格式作为输入和输出。 > **说明:mov 格式播放兼容性** > > mov 格式采用专业编码(H.264视频编码+yuv444p 色度采样+PCM 音频编码),部分播放器可能不兼容。以下为常见的支持播放 mov 格式的播放器: > > > | 播放器 | macOS | Windows | > | --- | --- | --- | > | IINA | ✓ | ✕ | > | VLC | ✓ | ✓ | > | mpv | ✓ | ✓ | > | ffplay | ✓ | ✓ | ```Json { "output_format": "mov" } ``` ## 视频中添加水印 通过 **watermark** 参数,来控制是否在生成的视频中添加水印。 - true:在视频右下角添加`AI生成`水印标识。 - false(默认):不添加水印。 ```Json { "watermark": true } ``` # 便利创作含肖像视频 Seedance 2.5 支持与 Seedance 2.0 系列相同的便利创作功能,详细教程请参见 [Doubao Seedance 便利创作含肖像视频](/docs/seedance-portrait-asset-guide): |方案 |介绍 | |---|---| |[信任模型产物作为输入素材](/docs/seedance-portrait-asset-guide#trust-model-output) | 本账号下部分模型生成的含人脸原始产物可作为输入素材,再次调用 Seedance 2.5 系列模型进行二次创作,不会触发输入审核拦截。 | | [使用预置虚拟人像](/docs/seedance-portrait-asset-guide#preset-avatar) |平台预置虚拟人像库,为创作者提供免费、合规、丰富多样的肖像素材。适用于需真人风格人脸但无需指定具体人物,追求零合规风险、快速创作的场景。 | |[使用已授权真人素材](/docs/seedance-portrait-asset-guide#authorized-real-person) |支持使用已获得授权的真人肖像素材进行视频生成。 | # 提示词技巧 ## 提示词 Skill 平台提供 **Seedance 2.5 提示词优化技能**,方便您对提示词进行调优。 1. **在本地项目中通过 NPX 安装**: ```Bash npx --yes skills@latest add \ "https://arkdocs.tos-cn-beijing.volces.com/skills/" \ --skill sd25-pe \ --yes ``` 2. **使用方式**:在 AI 对话框输入 `/sd25-pe + 你的提示词内容`,开始调试提示词。 ## 提示词规则 - **遵循基础公式**:按照"主体 + 动作/事件 + 场景与环境 + 视觉风格 + 运镜/切镜 + 声音"的顺序组织提示词,不需要的部分可省略。 - **明确素材职责**:使用 `@图片1`、`@视频1`、`@音频1` 指代参考素材,说明每份素材具体提供什么(如外貌、动作、音色),以及不采用什么。 - **声音用特殊字符区分**:音乐用 `()`、音效用 `<>`、台词用 `{}`、字幕用 `【】`。非中文台词建议在台词前明确语言。 完整的提示词撰写方法、模板和进阶技法详见 [Seedance 2.5 提示词指南](/docs/seedance-2-5-prompt-guide)。 # 使用限制 ## 全模态输入 > **注意** > > Seedance 2.5 不支持直接上传含有真人人脸的参考图/视频。 > 为了便利创作者对肖像的使用,平台推出了一系列解决方案,详情参见 [Doubao Seedance 便利创作含肖像视频](/docs/seedance-portrait-asset-guide)。 **图片要求** * 传入方式:图片 URL、图片 Base64 编码、素材 ID。 * 图片格式:jpeg、png、webp、bmp、tiff、gif、heic、heif。 * 单个图片尺寸: * 宽高比(宽/高): [0.4, 2.5] * 宽高长度(px):[300, 6000] * 大小:单张图片小于 30 MB。请求体大小不超过 64 MB。大文件请勿使用Base64编码。 * 图片数量: * 图生视频-首帧:1 张 * 图生视频-首尾帧:2 张 * 全模态参考生视频:1~30 张 **视频要求** * 传入方式:视频URL、素材 ID。 * 视频格式:mp4、mov,支持编码格式见下表。 * 分辨率:480p,720p,1080p,4k * 时长: * 非视频编辑任务:单个视频时长 [2, 30] s。 * [视频编辑任务](/docs/seedance-2-5#2.5_task_type_intro):单个视频时长 [4, 30] s。 * 最多传入 10 个参考视频,所有视频总时长不超过 30 s。 * 单个视频尺寸: * 宽高比(宽/高):[0.4, 2.5] * 宽高长度(px):[300, 6000] * 总像素数:[614×664=407696, 3326×2494=8295044],即宽和高的乘积符合 [407696, 8295044] 的区间要求。 * 大小:单个视频不超过 200 MB。 * 帧率 (FPS):[24, 60] |**容器格式** |**常用文件扩展名** |**MIME** |**支持编码** | |---|---|---|---| |MP4 |.mp4 |video/mp4 |视频:H.264/AVC、H.265/HEVC | \ | | | |音频:AAC、MP3 | |QuickTime |.mov |video/quicktime |视频:H.264/AVC、H.265/HEVC | \ | | | |音频:AAC、MP3、PCM | **音频要求** * 传入方式:音频 URL 、音频 Base64 编码、素材 ID。 * 音频格式:wav、mp3 * 时长:单个音频时长 [2, 30] s,最多传入 10 段参考音频,所有音频总时长不超过 30 s。 * 大小:单个音频不超过 15 MB,请求体大小不超过 64 MB。大文件请勿使用Base64编码。 ## 保存时间 - 任务记录:保存 7 天,查询区间 [T-7天, T),T 为请求发起时刻的 UTC 秒级时间戳。 - 视频 URL:保存 24 小时(超时后无法访问),下载次数上限为 100 次,请及时下载或转存。 ## 限流说明 同一主账号下,使用同一模型(不区分版本)的请求受到以下限制。超过对应限制会返回 “429: 'Too Many Requests'” 错误。 ### 模型维度的限流 * **RPM(Requests Per Minute)**:每分钟允许创建的视频生成任务数上限。超过上限时,创建任务请求将因触发限流而失败。 * **最大并发任务数**:同一时刻可处于处理状态的任务数上限。达到上限后,新创建的任务将进入队列等待处理。 |限流维度 |企业用户 |个人用户 | |---|---|---| |最大 RPM |600 |180 | |最大并发数 |10 |3 | ### 非推理 API 请求频率限制 * **QPS(Queries Per Second)**:每秒允许的请求数上限。超过上限时,任务请求将因触发限流而失败。 |接口名称 |账号维度的 QPS 上限 | |---|---| |查询视频生成任务 |20 | |查询视频生成任务列表 |1 | |取消或删除视频生成任务 |20 | --- # Doubao Seedance 2.5 提示词指南 Source: https://ark.volcengine.com/region:cn-beijing/docs/seedance-2-5-prompt-guide 本文介绍 Doubao Seedance 2.5(下文简称 Seedance 2.5)模型的提示词(Prompt)使用方法和相关技巧,帮助您更高效地利用该模型生成符合需求的优质视频作品。 > **注意** > > 本指南中呈现的所有视觉(图片、视频)及音频素材,均由 Seedance/Seedream 系列视觉生成模型自主生成。 # 获取 Skill 强烈推荐使用 Seedance 2.5 skill 对您的提示词进行调优。 1. 在本地项目中通过 NPX 安装: ```Bash npx --yes skills@latest add \ "https://arkdocs.tos-cn-beijing.volces.com/skills/" \ --skill sd25-pe \ --yes ``` 2. 使用方式:在 AI 对话框输入 `/sd25-pe + 你的提示词内容`,开始调试提示词。 # 总体介绍 Seedance 2.5 模型支持单段 **30 秒视频直出**,单次可输入图像/音频/视频**最多 50 个参考素材**,具备更强的指令控制,专业级可控的**视频编辑与延长**能力;同时,原生支持生成 **10 余种语言**,保障专业级叙事在全球化场景中稳定落地,让视频生成迈入「**长叙事 × 强参考 × 准编辑 × 多语言**」的工业级新阶段。 模型创作能力持续深化,画面**真实感**显著增强,在**光影表现**、**表演理解与执行**、**镜头运动**上都更**接近真实拍摄**,成片质感与叙事可信度大幅提升,为专业创作者与企业客户提供更高效、更可控的视频生产能力。 ## 全模态典型能力清单 > Seedance 2.5 支持文本、图片、视频和音频等全模态输入的灵活组合。下表仅列举部分典型能力,更多使用方式可根据实际场景进行探索。 | **任务类型** | **Seedance 2.5 支持的 R2V 能力/任务** | **能力细化说明** | | --- | --- | --- | | **参考生视频** | **主体参考** - 参考人/物/场景/虚拟角色等主体的外观 ID/声音 | * 主体图参考 |\ | | | * 主体音视频参考 |\ | | | * 主体图+主体音色音频参考 | | ^^ | **运动参考** - 参考图/视频的运动/动态信息 | * 动作/表情/运镜/创意/特效等运动参考 |\ | | | * 运动+主体参考 | | ^^ | **白模参考/渲染** - 输入粗粒度或者细粒度白模视频参考其动态信息、进行渲染 | * 白模参考 |\ | | | * 白模参考+主体参考 |\ | | | * 白模参考+主体参考+场景参考 | | ^^ | **风格参考** - 参考图/视频的风格 | * 风格图/视频参考 |\ | | | * 风格图/视频参考+主体参考 | | ^^ | **音频参考** - 参考音频的音乐/台词/音色等声音信息 | * 音频(音乐/旋律/台词/音色)参考 |\ | | | * 音频+主体参考 | | ^^ | **宫格分镜/故事板参考** - 参考分镜图的主体/构图/动作/剧情等信息 | * 多宫格分镜参考 |\ | | | * 分镜+主体参考 | | ^^ | **关键帧参考** - 输入单/多个图作为关键帧生成视频 | * 关键帧分镜参考生视频 |\ | | | * 首帧/首尾帧参考生视频 | | **首尾帧生视频** | **首帧/首尾帧生视频** - 输入首帧一张图/首尾帧两张图生成视频 | 严格通过 `content.role = first_frame/last_frame` 来控制 | | **编辑视频** | **视频指令编辑** - 通过文本对视频画面进行增删改编辑,支持输入时间戳指定编辑生效时段 | * 增加:增加主体/服饰/运镜/特效/... |\ | | | * 修改:修改主体/主体局部/风格/背景/颜色/材质/运镜/机位/... |\ | | | * 删除:删除主体/字幕/水印/... | | ^^ | **视频参考图编辑** - 通过文本+参考图对视频画面进行增删改编辑,支持输入时间戳指定编辑生效时段 | ^^ | | ^^ | **视频音频编辑** - 对视频声音进行增删改 | * 增加:增加人声/音乐/音效/... |\ | | | * 修改:修改人声/音乐/音效/... |\ | | | * 删除:删除人声/音乐/音效/... | | **延长视频** | **视频延长** - 向前/向后延续输入的视频,可要求画面/音频无缝衔接 | * 向前延长/向后延长 |\ | | | * 向前/向后延长+主体参考 | | **其他** | **一键成片** - 输入多个图/视频生成短片,可添加文字/贴纸/转场/等 | * 素材一键成片 |\ | | | * 素材+参考视频一键成片 | | ^^ | **视频无缝转场** - 输入两段视频,模型生成补全间隙实现无缝转场 | - | | ^^ | **组合能力** - 上述提及能力的自由组合应用 | - | ## 任务使用说明 Seedance 2.5 从传入素材最终是否会锁定输出视频的属性,把任务区分为两类(Seedance 2.0 没有这个区分): - 有锁定:素材会严格成为输出视频时间轴上的一段,是模型输出去适应传入的素材,因此会锁定输出视频的宽高比、甚至时长。 - 无锁定:仅对素材进行语义上的参考,因此用户可以指定输出视频的宽高/时长属性。 ### 有锁定:编辑/首尾帧/延长 编辑/首尾帧/延长会根据输入素材自动锁定部分生成参数,不支持用户自定义。具体规则如下: | **任务类型** | 任务详细定义 | 对输出视频锁定的说明 | 任务触发条件 | | --- | --- | --- | --- | | **视频编辑** | 对原视频的画面或音频进行编辑操作(如替换视频主体、视频中对象增删改、局部画面重绘/修复等) | * **锁定输出视频的宽高比**,严格对齐用户待编辑视频的宽高比;参数 `ratio` 必须等于 `adaptive` | 1. 参数 `content.role` 需设置为 `reference_image` / `reference_video` / `reference_audio` |\ | | | * **锁定输出视频的时长**,*基本对齐*用户待编辑视频的时长,参数 `duration` 必须为 **-1**

    存在多个输入视频时,由模型根据提示词意图判定待编辑视频。

    受模型输入帧处理机制影响,输出视频时长可能与输入存在轻微差异(最大约 0.3 秒),但只是部分过渡帧被压缩,输出视频内容*基本对齐*输入、保持完整/不变。

    如果使用 Seedance 2.5 生成的视频作为编辑输入,输出时长不会有差距。

    | 2. **提示词触发关键词,包含其一即可:** 编辑视频、增加/加上、删除/去掉、修改/替换/改成
    @video1 中加一些小动物;把 @video1 的人物修改为 @image1;删掉 @video1 的背景音乐
    |\ | | | * 建议 **output_format** 使用 mov 格式 | | | **首帧/首尾帧** | 输入 1 张图作为首帧生成视频,或输入 2 张图分别作为首帧和尾帧生成视频 | * **锁定输出视频的宽高比**,严格对齐用户输入的首帧图;参数 `ratio` 必须等于 `adaptive`
    如果输入尾帧与首帧画幅不一致,尾帧会被拉伸,因此建议输入画幅一致的首帧和尾帧
    | 参数 `content.role` 需设置为 `first_frame` / `last_frame` |\ | | | * 时长,支持用户自定义 | | | **视频延长** | 对原视频进行向前/向后延长 | * **锁定输出视频的宽高比**,严格对齐用户待延长视频的宽高比;参数 `ratio` 必须等于 `adaptive`
    存在多个输入视频时,由模型根据提示词意图判定待延长视频
    | 1. 参数 `content.role` 需设置为 `reference_image` / `reference_video` / `reference_audio` |\ | | | * 时长,支持用户自定义 | 2. **提示词触发关键词,包含其一即可:** 向前/向后延长、延续、续写
    向后延长 @video1,@image1 的角色从天而降...;续写 @video1 前 5s,@video2 女人入画说...
    |\ | | | * 建议 **output_format** 使用 mov 格式 | | ### 无锁定:参考任务/多宫格分镜/关键帧 参考类任务对于输出视频的宽高比和时长没有来自输入素材的锁定,特别注意以下两类任务也是没有锁定的: | **R2V 能力** | 推理策略说明 | 示意图 | | | | --- | --- | --- | --- | --- | | **多宫格分镜/故事板** | * **生成画面不是严格对齐分镜图:** 输入多宫格分镜图(即多个分镜合并在一张图),生成视频画面不会严格对齐分镜图(比如分镜中具体的画面细节),分镜图主要提供大致的剧情参考 |![img_001_D1WGdoTCUosz6Nxs5cRc9hgyn2b.png](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/img_001_D1WGdoTCUosz6Nxs5cRc9hgyn2b.png)|\ | | * **推荐使用相对简约的线稿分镜图**,并通过 prompt 补齐分镜图中没有的信息(如动作、运镜和风格等基础信息) | | | **关键帧** | * **生成画面对齐关键帧:** 将多张独立的分镜图(可能包含首/尾帧分镜图)作为关键帧输入,生成视频画面相对严格对齐输入图 |![img_002_DwRTdAYJhoPCYAxlq1Acypfcn9e.png](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/img_002_DwRTdAYJhoPCYAxlq1Acypfcn9e.png)|![img_003_Ey86dklhnoS8Q6xr1BBcCqUgnwb.png](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/img_003_Ey86dklhnoS8Q6xr1BBcCqUgnwb.png) |![img_004_WVY6dMcTIoDWm1xfXZzcYXQdncd.png](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/img_004_WVY6dMcTIoDWm1xfXZzcYXQdncd.png) |\ | | * 时长,支持用户自定义 | ![img_005_Y3BsdKO7Vov0Foxl9PPceRkLned.png](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/img_005_Y3BsdKO7Vov0Foxl9PPceRkLned.png)|![img_006_FbLvdj4Rao2njbxc0EicyNYFnxc.png](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/img_006_FbLvdj4Rao2njbxc0EicyNYFnxc.png)|![img_007_P5SAdYqZjom7FSxE5eicG54hnOd.png](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/img_007_P5SAdYqZjom7FSxE5eicG54hnOd.png)|\ ||| ![img_008_DIYudkBHno6uuOxX8lgckyoQnuh.png](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/img_008_DIYudkBHno6uuOxX8lgckyoQnuh.png)| # 素材输入建议 Seedance 2.5 单次可输入图像/音频/视频**最多 50 个参考素材**,这些素材可能指向的是同一个或者不同的主体(人物、动物、道具、场所等)。为了充分激发模型的能力,对素材的输入有以下建议: | **场景** | **输入建议** | | --- | --- | | 输入素材总上限 | * 图片:最多 30 张 4K 分辨率以内的图片 |\ | | * 视频:最多 10 段视频,所有视频总时长不超过 30s |\ | | * 音频:最多 10 段音频,所有音频总时长不超过 30s | | 主体音视频,建议输入多少个主体 | 1-5 主体效果较好;更多可尝试 6-10 主体,但稳定性下降、可能需要抽卡 | | 主体音视频,建议输入多长时间 | 5-10s 时长效果较好;更长时长稳定性下降、可能需要抽卡 | | 主体图,建议输入多少个主体 | 1-8 主体效果较好;更多可尝试 9-12 主体,但稳定性下降、可能需要抽卡 | | 不同视角主体图的输入效果差异 | * 1-5 主体,「单视图」「多视图」均可 |\ | | * 超过 5 主体,「单视图」效果较稳定;如需输入多视角,建议拆分为多张不同视图输入,而非输入一张包含多视角的图 | | 宫格图参考,建议输入多少个分镜 | * 多宫格目前更适用于 15 个以下分镜 |\ | | * 推荐火柴人/线稿分镜,不推荐在分镜图上写过多文字 | | 白模参考,建议粗粒度还是细粒度 | 简单建模(粗粒度)参考效果较好,建议仅用简单几何体拼接表示人物/物体/动物等 | | 视频编辑,建议输入多长的视频 | 20s 以内效果较好;更长时长稳定性下降、可能需要抽卡 | | 视频参考图编辑,建议输入多少张图 | 1-5 张参考图效果较好;更多可尝试 6-8 张,但稳定性下降、可能需要抽卡 | | 视频延长,建议的格式 | 为获得最佳的声画衔接效果,输入视频、输出视频均采用 mov 格式 | # 提示词写作建议 > 把 Seedance 2.5 当作一个视觉内容生产者,用导演的思维书写 [ 结构化 Prompt ]。 > 如需了解不同任务类型的详细提示词模板,请阅读 [Seedance 2.5 提示词模板](https://bytedance.larkoffice.com/docx/OsiUdR1OxoDqvnxsK8LczYx7nPd) ## 基础写作 **`(R2V)素材指代`** 明确每个图/视频/音频的编号(按照上传顺序)与用途(谁是形象、谁是音色、谁是动作、谁是场景...)。 **`一句话概述`** 主体 + 地点 + 事件 + 题材/风格 + 特殊运镜... **`具体情节描述`** 镜头顺序/时间轴(均可):用时间戳或「镜头 N」切分,逐段描述画面具体内容、运镜、动作、台词、音效等,尽量使用正向描述。 反向描述支持:字幕、音频控制,比如「不要字幕」、「不要 bgm」。 **`结尾`** 补充说明一些贯穿始终的画面细节,比如机位/运镜,环境/场景,声音,氛围等。 ```Plain Text 写实自然纪录片风格,电影级真实光影,温暖的午后, 在森林草坡上, 一只圆滚滚的熊猫幼崽从坡上滚下来. 熊猫黑白毛发蓬松真实,体型小而胖,动作笨拙可爱。场景为绿色森林斜坡,地面覆盖青草、苔藓、三叶草、泥土、小石块、枯枝和少量小黄花,虚化背景中有高大树干与树林。镜头为低机位中远景,轻微手持感,整体基本固定,始终保持熊猫在画面中。 0s-3s:一只熊猫幼崽趴在绿色草坡上,身体圆滚滚, 它刚开始顺着斜坡慢慢侧滚,动作笨拙,草叶被身体轻轻压弯。微风拂过, 阳光从左上方穿过树林,形成斑驳光影。 3s-8s:熊猫滚到画面右下方,动作逐渐停止,从侧躺变成趴卧。它的圆脸朝向镜头,前爪压在草地上,熊猫趴在前景草丛中,身体调整到舒服的姿势,头部小幅抬起又放低, 发出轻微哼唧声。 低机位,轻微手持感,轻微跟随熊猫向右下方移动。景深自然,前景草叶轻微虚化,熊猫主体清晰,背景树林柔和虚化。自然环境音,风声、熊猫滚动时轻微柔软的扑通声, 整体温暖、真实、自然。 ``` [视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/vid_000_panda-cub-basic.mp4) ### 参考类(多素材映射) 参考素材变多后,**素材的映射和指代关系说明非常重要**。按照上传素材的顺序对应编号(图 1 / 视频 1 / 音频 1),每个素材进行文本绑定,**不建议只在图片里呈现映射信息**,比如主角图片上写「张三」,然后 Prompt 中直接写「张三在学校里 xxxx」,容易导致多人混淆或重复角色。 - 多主体逐一列清映射关系,人数多时用清单罗列,避免混淆。 - 示例 1:*「图 1 的侠客」* - 示例 2:*「img1-2 是人物 1,对应音频 1;img3-4 是人物 2,对应音频 2」* - 示例 3:*「图片 1 是主角张三,图片 1 使用音频 1 音色」* - 分工要具体到「参考什么」,如果是部分参考,要写明「参考哪一部分」。 - 示例 1:*「参考视频 1 中施法的动作,视频 2 的环绕式运镜」* - 示例 2:*「参考图片 1 的光影和滤镜」* - 当参考素材本身已足够精准时,建议只做「指代」、减少画面复述。 - 示例:*「严格参考视频 1 的动作与运镜,顺序与视频保持一致」*(不需要在 prompt 中写「先抬手、再转身、镜头缓慢环绕……」等等具体细节,*不必额外描述*) ### 编辑类 明确需要修改的范围和内容,可以配合时间戳进行部分编辑,尽可能说明修改内容从 A->B 的过程。 - 示例 1:*「仅编辑视频 1 中男人的台词,修改为「你不要过来啊」,口音调整为东北口音…」* - 示例 2:*「把视频 1 中 4-6 秒男人喝咖啡的动作改变为拖地,其余内容不要变化」* - 示例 3:*「编辑任务:把视频 1 中右侧的亚洲女生改为图片 1 中的黑人女生」* ### 首尾帧 - 优先使用参数设置图片的role为:first_frame/last_frame; 注意此方式会锁定输出视频的宽高比,严格对齐用户输入视频的首帧图。 - 也支持设置 role 为 reference_image,在 prompt 中指定具体图片为首帧&尾帧。注意此方式不会锁定输出视频的宽高比,视频效果与首帧&尾帧参考图相近,但不完全匹配。 - 示例 1:*「图片 1 为首帧」* - 示例 2:*「图片 3 为首帧,图片 5 为尾帧」* ### 时间戳 时间戳可以更好地理清故事剧情发展,以「1 秒」为单位: - 指定时间段内剧情如果较少,模型会进行一定自由发挥。 - 指定时间段内容过多,则会导致过度剪切或剧情遗漏,请注意时长安排的合理性。 - 不建议用时间戳控制频率/频次,比如「一秒摇头 3 次」。 支持的时间控制方式: - 明确的时间区间 [注意时间轴的连续性,避免出现「0-3 秒...5-6 秒...」表达]。 - 示例 1:*「0-3 秒......3-7 秒.....7-15 秒」* - 示例 2:*「[1s-4s]....[4s-8s]....[8s-12s]」* - 时间点控制。 - 示例 1:*「第 5s 快速向左横移转场」* - 示例 2:*「第 2 秒一道金雷能量自画面顶部破空直落...」* - 相对时间控制。 - 示例 1:*「张三呆滞的站在原地,3 秒后周围的人纷纷摇头」* - 示例 2:*「....主角按下快门后画面定格 1 秒」* ### 负向控制 - 支持负向控制字幕。 - 示例 1:*「不额外加入对白字幕」* - 示例 2:*「不要字幕」* - 支持负向控制音频:支持更细维度的单独控制:音效、背景音乐(bgm)、对白。 - 示例 1:*「无 bgm,只生成环境音和动作音」* - 示例 2:*「不要任何声音」* ## 进阶写作 ### 镜头语言 - 基础的通识性内容可以直接写,比如景别(大全景/全景/中景/近景/特写)、运镜(推/拉/摇/移/跟/环绕/俯冲/后拉/上摇/手持晃动)、机位(低角度/俯视/第一人称)。 - 热门的运镜方式可以直接写,比如一镜到底、希区柯克变焦、航拍视角、FPV、子弹时间、手持镜头、回弹变速等。 - 过于小众、专业的名词需要转换为 [名词 + 描述性解释]。 - 示例:*「移焦,画面焦点发生平滑转变,原本在前景清晰的树木变模糊,背景中的人物由模糊逐渐变得清晰。」* - 转场镜头写清触发点与方式,尽可能把转场时间、方式都写明。 - 示例:*「第 5s 快速向左横移转场(向左擦除+自然叠化)」* ### 动作/表情描述 - **动作**:优先用概括性描述(如「连续做了几组高抬腿和空翻」「双方展开近身搏斗」),只在少数有记忆点的动作上写出具体细节,不建议重复写相同的动作。 - **表情**:建议写描述性语句,减少成语使用,比如「津津有味地吃饭」写为「脸上带着满足的笑容,大口地吃饭」。 ### 白模参考/渲染 - 文本中写明希望参考白模视频中的什么元素。 - 示例 1:白模中没有光影变化,只希望参考运镜和运动 → *「参考 [视频 1] 的运镜、动作...」* - 示例 2:白模有光影变化且需要参考 → *「参考 [视频 1] 的光影变化和...」* - 如果叠加输入了参考图,需写明参考图和白模的对应关系。 - 示例:*「将 [图片 1] 中穿灰色衣服的男人对应 [视频 1] 中的红色模型、[视频 2] 中的红发少女替换 [视频 1] 中的绿色模型 2」* - 输入了白模视频,也**建议在 Prompt 中详细描述希望生成的视频内容**,以获得更好的效果,并且注意文本描述需要和白模内容相吻合;对于没有叠加参考图/视频的白模主体,详细描述主体外表/特征效果更佳。 ### 多宫格分镜/故事板 - **减少超多分镜输入**:多宫格目前更适用于 **15 个以下分镜**,单次输入过多(比如 18 宫格)容易出现静止、顺序错乱等问题,同时分镜图会限制模型发挥,请确保分镜准确、合理。 - **避免脏/锐化的分镜图**:不推荐过度锐化、杂乱的 AI 直出分镜图;不推荐在分镜图上写过多文字。 多宫格分镜 badcase 示例: ![img_009_XAnedIcrLoYcTOxTbvccxrKznfh.png](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/img_009_XAnedIcrLoYcTOxTbvccxrKznfh.png) ![img_010_P4uodRd1VoGtlKxa3rccsEHonTd.png](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/img_010_P4uodRd1VoGtlKxa3rccsEHonTd.png) ![img_011_FLdHd8tNgoJaW2x2woccLQ67nnc.png](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/img_011_FLdHd8tNgoJaW2x2woccLQ67nnc.png) - **prompt 避免前后矛盾**:注意避免 prompt 前后矛盾或运镜、运动设计不合理等问题。 - **宫格图并不会严格对齐分镜内容**,视频会有一定自主性发挥,如需严格按照分镜图生成时,推荐使用多关键帧参考方式。 - **火柴人/线稿分镜使用 [推荐]**:推荐使用相对简约的线稿分镜图,并通过 prompt 进行指令控制: - step1:写明参考素材的指代关系 - step2:写整体故事梗概 - step3:按照分镜完整描述情节内容,至少补齐分镜图中没有的信息,可以考虑组合时间戳明确剧情逻辑 线稿分镜案例: ```Plain Text 素材绑定:故事板分镜@图片1,卧室@图片2,李天@图片3,李倩@图片4,《快快乐乐》书籍@图片5。 镜头一: 【全景固定镜头,平视三分构图】冬夜落雪房间,落地窗前,男子双手插裤兜侧立望向窗外飞雪,少女站在身侧静静看向男子,氛围安静克制,雪花持续落在玻璃窗。 镜头二: 【中景过肩镜头】少女后背作为前景,男子转头温和看向少女,少女微微低头沉默,窗外落雪持续。 镜头三: 【中近景,对角线构图】男子捧着书籍《快快乐乐》缓缓递出,少女抬手接过书本。 镜头四: 【少女面部近景,中心构图】少女把书本抱紧在胸口,眼眶泛红,泪珠缓缓滑落,神色感伤。 镜头五: 【男子面部近景,斜向构图】男子温柔浅笑,静静注视落泪少女,眼底带着怅然。 镜头六: 【全景固定镜头】少女转身缓步走出画面,窗前只剩男子独自伫立,双手插兜望向漫天风雪,房间空旷寂静。 ``` ![img_001_D1WGdoTCUosz6Nxs5cRc9hgyn2b.png](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/img_001_D1WGdoTCUosz6Nxs5cRc9hgyn2b.png) ![img_013_A8ZfdshHnorwKHxxn9vcJZ36n5P.png](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/img_013_A8ZfdshHnorwKHxxn9vcJZ36n5P.png) - **概念分镜使用**:如果分镜是概念分镜或关键帧设计,可以直接简写 prompt。 - 示例:*「按照分镜图的顺序,构建一个完整的故事剧情,运镜合理连贯」* ![img_014_To54dlVwsoe0grxwLOxcoOKWnbG.png](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/img_014_To54dlVwsoe0grxwLOxcoOKWnbG.png) ### 关键帧参考 视频需要严格按照分镜图生成时使用,关键帧参考就是将分镜按照独立参考输入,并按照顺序传入,prompt 需要在第一句写明「以图片 x 至图片 x 的顺序作为关键帧」。 - 示例:「**以图片 1 至图片 7 的顺序作为关键帧**,在云海群山间,蓝粉长尾灵鱼凌空遨游,镜头缓缓推向依山而建的古镇,聚焦山顶古塔;画面一转进入雅致中式厅堂,灵鱼穿窗飞入,落入厅堂中央圆池悠然游动;最终视角切至幽暗古寺,白须老僧背对而立,静静凝望巨幅画框,画内正是厅堂与池中灵鱼,新国风浮世绘插画风格」 ![img_015_LmUsdFzCfoUVGsx1uoXcS51TnUg.png](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/img_015_LmUsdFzCfoUVGsx1uoXcS51TnUg.png) ![img_016_O6GfdOchEokX1WxachycYQO6n2c.png](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/img_016_O6GfdOchEokX1WxachycYQO6n2c.png) ![img_017_VaV5dOFvGouMVhxrL75cZ8DLncb.png](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/img_017_VaV5dOFvGouMVhxrL75cZ8DLncb.png) ![img_018_RX5ydLzxmonwNrx0u8CcZ1GLnDg.png](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/img_018_RX5ydLzxmonwNrx0u8CcZ1GLnDg.png) ![img_019_KO88dDOFsoPElXxQd6tcoUdXnKf.png](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/img_019_KO88dDOFsoPElXxQd6tcoUdXnKf.png) ![img_020_V606dSWxgoGbp0x0brxcIgBsnic.png](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/img_020_V606dSWxgoGbp0x0brxcIgBsnic.png) ![img_021_Z5mBdYZqGoVRYpxMcA4c4whvnVa.png](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/img_021_Z5mBdYZqGoVRYpxMcA4c4whvnVa.png) ## 与 Seedance 2.0 的差异点 1. 响应时间戳:Seedance 2.0 不响应时间戳只响应镜头序号,而 Seedance 2.5 响应整数秒的时间戳。 2. 支持多视图:Seedance 2.0 不建议使用多视图作为主体参考,而 Seedance 2.5 是可以支持的。 3. 自由宽高比:Seedance 2.0 的输出宽高比只有固定的 6 档,Seedance 2.5 可以通过控制输入素材的方式支持 [0.4, 2.5] 之间的任意宽高比输出。 4. 提升 V2V 的画质:Seedance 2.5 的输出支持 MOV 格式,在延长/编辑任务中更好地保持颜色与亮度一致性、声画一致性。 # 常见问题 本节整理 Seedance 2.5 在视频生成、编辑与翻译任务中的常见问题及处理方法,供您遇到类似问题时快速定位并优化提示词。 ## 美学风格差异 **典型现象** Seedance 2.5 与 Seedance 2.0 的美学风格偏好差异较大,使用相同参考图与提示词生成的视频风格明显不同;如需混用两个模型的输出,风格不连贯。 **解决方案** 如需在 Seedance 2.5 的任务中保留 Seedance 2.0 的风格,建议将 Seedance 2.0 生成的视频作为延长任务的输入,并将输出格式选择为 MOV,可较大程度保持原有风格。 本案例使用的输入参考图: ![](https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/sd25-v01-ref-01.png) |Seedance 2.0 生成 |Seedance 2.5 生成 |延长处理后 | |---|---|---| |[视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-v01-style-diff-01.mp4) |[视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-v01-style-diff-02.mp4) |[视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-v01-style-diff-03.mov) | \ | | | | \ |> 相同参考图与提示词下的 2.0 输出 |> 相同输入下的 2.5 输出,风格差异明显 |> 以 2.0 视频为延长任务输入并输出 MOV,风格保持一致 | 输出静帧对比(左为 Seedance 2.0 输出,右为 Seedance 2.5 输出): ![](https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/sd25-v01-out-20.png) ![](https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/sd25-v01-out-25.png) 三帧画面对比: ![](https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/sd25-v01-compare.png) ## 情绪过度响应(眼睛发光) **典型现象** 模型对人物情绪过度响应,瞳孔出现蓝光、红光或其他非自然发光。 **解决方案** 1. 在提示词中以最高优先级明确约束“人物为正常人眼、不发光”,并限制环境光仅作用于面部轮廓。 2. 避免将情绪直接描述为眼睛的特效化表现,将“狂热”“极度震惊”等强烈情绪词改为“惊叹”等常规描述,可降低发光概率。 |优化前 |优化后 | |---|---| |[视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-v02-emotion-glow-01.mp4) |[视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-v02-emotion-glow-02.mp4) | \ | | | \ |> 强烈情绪描述导致瞳孔发光 |> 约束正常人眼不发光并改用常规情绪词后恢复 | 示例提示词 优化前后的差异仅在镜头 2 的情绪描述:将“狂热膜拜”改为“惊叹(人物眼睛不发光)”,避免将情绪直接描述为眼睛的特效化表现。 案例使用的参考素材,从左至右为图片 1(医院住院部走廊场景)、图片 2(高砚)、图片 3(周晚星)、图片 4(患者甲): ![](https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/sd25-v02-ref-01.png) ![](https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/sd25-v02-ref-02.png) ![](https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/sd25-v02-ref-03.png) ![](https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/sd25-v02-ref-04.png) **优化前提示词** ```Plain Text 【视频约束】 3D 风格。严格按照台词生成音频,禁止增加或删减台词;人声干净无杂音,吐字清晰标准。仅生成台词音频,不要生成背景音乐。视频画面中禁止出现任何形式的字幕。根据画面内容适配相应的音效。场景和人物保持一致。人物轨迹符合脚本描述,逻辑场景合理。生成的视频色温、光影、亮度参考图片中人物和场景。人物、场景透视和构图比例符合物理逻辑,避免人物过大或过小、比例失衡、头身比失调、近景变全景。人物自然微动。 【场景设定】 医院住院部走廊@图片1,夜。 【人物设定】 高砚@图片2比医院住院部走廊画面中的门低一个头的距离;周晚星@图片3比高砚低。 【站位设定】 参考图 1。高砚站在图 1 画面右边,面朝画面左侧,周晚星站在画面右边看着高砚。 高砚站在医院住院部走廊画面过道的椅子旁边;患者甲@图片4坐在画面左侧过道椅子上面朝画面右侧,挂着输液吊瓶,位于左边;高砚在右边;周晚星站在高砚右边,看着高砚。 镜头时序: 镜头 1 MCU 中景,固定镜头,画面左侧是患者甲,画面右侧是站着的高砚和周晚星。 背景为医院住院部走廊,夜。 镜头 2 MCU 中近景,固定镜头,仰角拍摄高砚。 高砚闻言,双眼瞬间睁大,极度惊骇,微表情呈现大脑宕机状态。高砚双手微微颤抖,发出一声惊叹。 高砚说:“竟能将药液直入血脉?简直是仙家法术!” 语气中充满对现代医学手段的狂热膜拜。 镜头 3 MCU 中近景,固定镜头,保持仰角。 高砚原本高兴的眼神突然变得伤心,缓缓垂下眼眸,情绪急速转折,微表情流露出深深的无力感。 ``` **优化后提示词** ```Plain Text 【视频约束】 3D 风格。严格按照台词生成音频,禁止增加或删减台词;人声干净无杂音,吐字清晰标准。仅生成台词音频,不要生成背景音乐。视频画面中禁止出现任何形式的字幕。根据画面内容适配相应的音效。场景和人物保持一致。人物轨迹符合脚本描述,逻辑场景合理。生成的视频色温、光影、亮度参考图片中人物和场景。人物、场景透视和构图比例符合物理逻辑,避免人物过大或过小、比例失衡、头身比失调、近景变全景。人物自然微动。 【场景设定】 医院住院部走廊@图片1,夜。 【人物设定】 高砚@图片2比医院住院部走廊画面中的门低一个头的距离;周晚星@图片3比高砚低。 【站位设定】 参考图 1。高砚站在图 1 画面右边,面朝画面左侧,周晚星站在画面右边看着高砚。 高砚站在医院住院部走廊画面过道的椅子旁边;患者甲@图片4坐在画面左侧过道椅子上面朝画面右侧,挂着输液吊瓶,位于左边;高砚在右边;周晚星站在高砚右边,看着高砚。 镜头时序: 镜头 1 MCU 中景,固定镜头,画面左侧是患者甲,画面右侧是站着的高砚和周晚星。 背景为医院住院部走廊,夜。 镜头 2 MCU 中近景,固定镜头,仰角拍摄高砚。 高砚闻言,双眼瞬间睁大,极度惊骇,微表情呈现大脑宕机状态。高砚双手微微颤抖,发出一声惊叹。 高砚说:“竟能将药液直入血脉?简直是仙家法术!” 语气中充满对现代医学手段的惊叹(人物眼睛不发光)。 镜头 3 MCU 中近景,固定镜头,保持仰角。 高砚原本高兴的眼神突然变得伤心,缓缓垂下眼眸,情绪急速转折,微表情流露出深深的无力感。 ``` 优化前输出中瞳孔发黄光的画面细节: ![](https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/sd25-v02-effect.png) ## 角色对应错误 **典型现象** 多人物视频中,角色与参考图片、音色或出场顺序发生错位,例如先出场的人物被其他参考角色替换。 **解决方案** 按人物首次出场顺序上传参考素材,并同步调整提示词中的图片、音频编号,确保每个角色与参考素材一一对应。 |优化前 |优化后 | |---|---| |[视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-v03-role-mismatch-01.mp4) |[视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-v03-role-mismatch-02.mp4) | \ | | | \ |> 先出场角色被其他参考角色替换 |> 按首次出场顺序调整参考素材与编号后对应正确 | 示例提示词 优化前后仅【参考素材】段的图片编号不同:按人物首次出场顺序对调图片 1 与图片 3,使每个角色与参考素材一一对应。 案例使用的参考素材(按优化后提示词中的图片编号排序,从左至右依次为图片 1-8): ![](https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/sd25-v03-people-03.png) ![](https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/sd25-v03-people-02.png) ![](https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/sd25-v03-people-01.png) ![](https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/sd25-v03-child-01.png) ![](https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/sd25-v03-child-02.png) ![](https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/sd25-v03-child-03.png) ![](https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/sd25-v03-scene-station.png) ![](https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/sd25-v03-scene-bedroom.png) **优化前提示词** ```Plain Text 【统一风格与约束】 真实材质质感,细腻光影;角色面部和身体比例稳定,肢体结构自然,动作连贯,不僵硬,无穿模,无卡顿,无扭曲肢体,动作符合现实物理逻辑;禁止生成同款分身、双胞胎效果,同一画面中仅保留单个对应角色,不出现角色重复复刻;无字幕,无水印,无 logo,无乱码,无无关文字;无多余背景音乐。 【参考素材】 将图片 3 中的角色定义为秦秀莲; 将图片 1 中的角色定义为刘春香; 将图片 2 中的角色定义为王强; 将图片 6 中的角色定义为小乐; 将图片 7 中的角色定义为小石头; 将图片 8 中的角色定义为二妞; 将图片 5 定义为县城火车站售票处的参考场景; 将图片 4 定义为刘春香家卧室的参考场景; 将纸质车票定义为去大城的火车票。 镜头 1|0 秒 - 2 秒 以人物为中心构图,近景,平视,正面机位,日、内,固定。 县城火车站售票处。 秦秀莲站在售票窗口前看向售票窗口。 秦秀莲说:“一张去大城的票。” 镜头 2|2 秒 - 4 秒 局部构图,特写,平视,正面机位,日、内,固定。 县城火车站售票处。 秦秀莲握紧去羊城的火车票,低头看向车票目的地,嘴唇闭合。 秦秀莲(V.O.)说:“刘春香能做,我也能做。” 镜头 3|4 秒 - 5 秒 三分法构图,中景,平视,斜 45 度侧面机位,夜、内,固定。 刘春香家卧室。 刘春香和王强坐在桌边清点当天收入。 刘春香看向桌上钱币,说:“七百多。” 镜头 4|5 秒 - 7 秒 以人物为中心构图,近景,平视,正面机位,夜、内,固定。 刘春香家卧室。 王强看向桌上钱币,说:“比开业那天还多。” 镜头 5|7 秒 - 9 秒 以人物为中心构图,近景,平视,正面机位,夜、内,固定。 刘春香家卧室。 小乐爬到刘春香身边,看向刘春香,说:“麻麻,我给你捶背!” 镜头 6|9 秒 - 10 秒 以人物为中心构图,近景,平视,正面机位,夜、内,固定。 刘春香家卧室。 小石头看向刘春香,说:“我也来。” 镜头 7|10 秒 - 11 秒 以人物为中心构图,近景,平视,正面机位,夜、内,固定。 刘春香家卧室。 二妞看向刘春香,说:“还有我!” 镜头 8|11 秒 - 13 秒 对称构图,中景,平视,侧面机位,夜、内,固定。 刘春香家卧室。 小乐、小石头、二妞围着刘春香捶肩捶背。 刘春香悄悄握住王强的手,王强反握刘春香的手。 ``` **优化后提示词** ```Plain Text 【统一风格与约束】 真实材质质感,细腻光影;角色面部和身体比例稳定,肢体结构自然,动作连贯,不僵硬,无穿模,无卡顿,无扭曲肢体,动作符合现实物理逻辑;禁止生成同款分身、双胞胎效果,同一画面中仅保留单个对应角色,不出现角色重复复刻;无字幕,无水印,无 logo,无乱码,无无关文字;无多余背景音乐。 【参考素材】 将图片 1 中的角色定义为秦秀莲; 将图片 3 中的角色定义为刘春香; 将图片 2 中的角色定义为王强; 将图片 4 中的角色定义为小乐; 将图片 5 中的角色定义为小石头; 将图片 6 中的角色定义为二妞; 将图片 7 定义为县城火车站售票处的参考场景; 将图片 8 定义为刘春香家卧室的参考场景; 将纸质车票定义为去大城的火车票。 镜头 1|0 秒 - 2 秒 以人物为中心构图,近景,平视,正面机位,日、内,固定。 县城火车站售票处。 秦秀莲站在售票窗口前看向售票窗口。 秦秀莲说:“一张去大城的票。” 镜头 2|2 秒 - 4 秒 局部构图,特写,平视,正面机位,日、内,固定。 县城火车站售票处。 秦秀莲握紧去羊城的火车票,低头看向车票目的地,嘴唇闭合。 秦秀莲(V.O.)说:“刘春香能做,我也能做。” 镜头 3|4 秒 - 5 秒 三分法构图,中景,平视,斜 45 度侧面机位,夜、内,固定。 刘春香家卧室。 刘春香和王强坐在桌边清点当天收入。 刘春香看向桌上钱币,说:“七百多。” 镜头 4|5 秒 - 7 秒 以人物为中心构图,近景,平视,正面机位,夜、内,固定。 刘春香家卧室。 王强看向桌上钱币,说:“比开业那天还多。” 镜头 5|7 秒 - 9 秒 以人物为中心构图,近景,平视,正面机位,夜、内,固定。 刘春香家卧室。 小乐爬到刘春香身边,看向刘春香,说:“麻麻,我给你捶背!” 镜头 6|9 秒 - 10 秒 以人物为中心构图,近景,平视,正面机位,夜、内,固定。 刘春香家卧室。 小石头看向刘春香,说:“我也来。” 镜头 7|10 秒 - 11 秒 以人物为中心构图,近景,平视,正面机位,夜、内,固定。 刘春香家卧室。 二妞看向刘春香,说:“还有我!” 镜头 8|11 秒 - 13 秒 对称构图,中景,平视,侧面机位,夜、内,固定。 刘春香家卧室。 小乐、小石头、二妞围着刘春香捶肩捶背。 刘春香悄悄握住王强的手,王强反握刘春香的手。 ``` ## 文字拼写错误 **典型现象** 画面中的文字出错:英文单词中的字母被替换、增加或缺失(高频如 E 误写为 A 或 I);中文出现错别字(如“稳健”误写为“稳键”)。 **解决方案** 1. 将单词拆分为独立字母,并要求字母按顺序依次出现,降低模型联想与简化字形。 2. 将需要准确展示的文字制成图片,作为参考素材提供给模型。 **案例一:英文单词拼写错误** |优化前 |优化后 | |---|---| |[视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-v04-text-spelling-01.mp4) |[视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-v04-text-spelling-02.mp4) | \ | | | \ |> 单词 DIHETAO 被错拼为 DIHERTAO |> 拆分为独立字母并要求按顺序出现后拼写正确 | 示例提示词 **案例一:英文单词拼写错误** 将单词拆分为独立字母,并要求按顺序依次出现: **优化前提示词** ```Plain Text Create an opening title sequence for a beetle game called 'DIHETAO'. The text should be white colored. There should be many beetles. ``` **优化后提示词** ```Plain Text Create an opening animation for a beetle-themed game. The text should be white, and the scene must feature a large number of beetles.Then, the letters "D", "I", "H", "E", "T", "A", and "O" should appear in sequence. ``` **案例二:中文文案错别字** |优化前 |优化后 | |---|---| |[视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance-2-5-prompt-guide/seedance25-tire-before.mp4) |[视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance-2-5-prompt-guide/seedance25-tire-after.mp4) | \ | | | \ |> “稳健抓地”被错写为“稳键抓地” |> 将展示文字制成图片作为参考素材后正确 | 示例提示词 **案例二:中文文案错别字** 在画面文字描述后追加参考图片编号,将正确文字以图片形式提供给模型: 案例二使用的参考素材,从左至右为图片 1(商品图)与参考图 2-4(三处展示文字的正确文案): ![](https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance-2-5-prompt-guide/seedance25-tire.png) ![](https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/sd25-v04-ref-text-01.png) ![](https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/sd25-v04-ref-text-02.jpg) ![](https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/sd25-v04-ref-text-03.jpg) **优化前提示词** ```Plain Text 为图1中的商品生成视频,由中国中年自然肤色黑色寸头日常户外风男模特出镜,手持商品进行动态展示与解说。镜头 1,镜头从中景缓慢推进至近景。阳光明媚的广阔户外公路旁,一位中国中年、自然肤色、黑色寸头、穿着日常户外冲锋衣的男模特,一手扶着立在地上的大品牌轮胎,面向镜头自信地进行解说。 男主播:“大品牌轮胎,伴你安心出行。” 背景音乐:节奏轻快的户外运动风纯音乐。 画面正下方显示粗体黑字“大品牌轮胎 伴你安心出行”镜头 2,镜头特写轮胎正面花纹。男模特的手指顺着轮胎上深深的纵向排水沟槽滑动,随后手掌有力地拍打胎面,动态展示轮胎清晰的纹理和扎实的质感。 男主播:“强效排水,稳健抓地。” 背景音乐持续,伴随轻微的摩擦音效。 画面左侧弹出黑体大字“强效排水 稳健抓地”镜头 3,镜头平移转至轮胎侧面特写。男模特用手掌按压轮胎侧壁展示其优良的韧性与弹性,随后手指指向侧面凸起的品牌标识区域。 男主播:“静音舒适,坚韧耐用。” 背景音乐持续。 画面右侧弹出黑体大字“静音舒适 坚韧耐用”镜头 4,镜头拉远回到中景。男模特双手扶住轮胎边缘,轻松地将其向前滚动半圈,随后站定,微笑着向镜头竖起大拇指,背景是充满活力的自然风光。 画外音:“你的安心之选。” 音乐高潮处有力收尾。 画面中央浮现黑体大字“伴你安心出行” ``` **优化后提示词** ```Plain Text 为图1中的商品生成视频,由中国中年自然肤色黑色寸头日常户外风男模特出镜,手持商品进行动态展示与解说。镜头 1,镜头从中景缓慢推进至近景。阳光明媚的广阔户外公路旁,一位中国中年、自然肤色、黑色寸头、穿着日常户外冲锋衣的男模特,一手扶着立在地上的大品牌轮胎,面向镜头自信地进行解说。 男主播:“大品牌轮胎,伴你安心出行。” 背景音乐:节奏轻快的户外运动风纯音乐。 画面正下方显示粗体黑字“大品牌轮胎 伴你安心出行” 参考图2。镜头 2,镜头特写轮胎正面花纹。男模特的手指顺着轮胎上深深的纵向排水沟槽滑动,随后手掌有力地拍打胎面,动态展示轮胎清晰的纹理和扎实的质感。 男主播:“强效排水,稳健抓地。” 背景音乐持续,伴随轻微的摩擦音效。 画面左侧弹出黑体大字“强效排水 稳健抓地” 参考图3。镜头 3,镜头平移转至轮胎侧面特写。男模特用手掌按压轮胎侧壁展示其优良的韧性与弹性,随后手指指向侧面凸起的品牌标识区域。 男主播:“静音舒适,坚韧耐用。” 背景音乐持续。 画面右侧弹出黑体大字“静音舒适 坚韧耐用” 参考图4。镜头 4,镜头拉远回到中景。男模特双手扶住轮胎边缘,轻松地将其向前滚动半圈,随后站定,微笑着向镜头竖起大拇指,背景是充满活力的自然风光。 画外音:“你的安心之选。” 音乐高潮处有力收尾。 画面中央浮现黑体大字“伴你安心出行” 参考图2 ``` ## 字幕约束不生效 **典型现象** 提示词中已写明“不要字幕”,生成的视频仍可能出现字幕。相较 Seedance 2.0,该问题已明显优化,但仍有概率出现。 **解决方案** > **说明** > > 目前无法完全避免该问题,可通过以下方法降低字幕出现概率。 1. 避免在台词后复述词语并追加语气、表情、动作等描述,此类描述容易诱发字幕生成。 2. 需要对台词做差异化要求时,按“角色台词(情绪):内容”的格式拆分描述,例如:周女士台词(难以置信):“像……”;周女士台词(声音发颤):“太像了。” 3. 确保参考视频本身不含字幕,否则“无字幕”指令可能失效。 **案例一:台词复述引发字幕** |优化前 |优化后 | |---|---| |[视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-v05-subtitle-01.mp4) |[视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-v05-subtitle-02.mp4) | \ | | | \ |> 台词后复述词语并追加语气描述,输出出现字幕 |> 按“角色台词(情绪):内容”格式拆分描述后无字幕 | 示例提示词 **案例一:台词复述引发字幕** 案例一使用的参考素材,从左至右为图片 1(山神殿场景)、图片 2(林秀兰)、图片 3(周婆婆)、图片 4(人物参考): ![](https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/sd25-v05-ref-01.png) ![](https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/sd25-v05-ref-02.png) ![](https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/sd25-v05-ref-03.png) ![](https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/sd25-v05-ref-04.png) **优化前提示词**(台词后复述词语并追加情绪、动作描述,诱发字幕): ```Plain Text 【生成目标】 生成周婆婆在山神殿内走近林秀兰、反复确认她的面容并激动落泪的连续场景。古装悬疑奇幻真人电影风格,电影级写实质感。昏暗古朴的山神殿内有陈旧木梁、旧神龛、烛台和祭祀陈设,暖色烛火轻轻摇曳,空气中漂浮细小尘埃。 【主体与关系】 全程只有林秀兰、周婆婆、春丫、石头四人。春丫与石头分别搀扶周婆婆左右两侧;林秀兰始终站在周婆婆前方。保持参考人物的脸型、年龄、发型、服装和身高关系。周婆婆始终佩戴同一副老花眼镜。 【资产锁定】 周婆婆严格参考@[图片3] 。 林秀兰严格参考@[图片2], 山神殿场景严格参考@[图片3] 。 【事件脚本】 0—4 秒:中景镜头围绕周婆婆缓慢向前推近。春丫与石头小心搀扶周婆婆起身,三人步履缓慢地走到林秀兰面前。周婆婆始终凝视林秀兰的脸;认出她后,脚步短暂停顿,嘴唇轻颤,双眼逐渐睁大,神情从震惊转为难以抑制的激动,仿佛见到等待多年的故人。林秀兰安静站立,困惑而警觉地回望她。结束时周婆婆在林秀兰面前站定,春丫和石头仍扶住她。 4—9 秒:切至周婆婆与林秀兰的面部近景。周婆婆先颤抖着扶正眼镜,再用一只手短暂揉一次自己的眼睛;确认没有看错后,她才伸出双手,轻轻捏住林秀兰两侧脸颊,缓慢左右拨看,再轻轻揉捏和拉扯确认。动作依次发生,不同时抢拍。手指准确接触脸颊,不遮挡眼睛、鼻子和嘴部。林秀兰被捏得轻微嘟嘴,露出错愕不解的神情,身体下意识稍稍后仰,但不挣扎、不躲开。周婆婆动作急切失态,却始终轻柔。结束时两人面部清晰可见,林秀兰的五官与脸型保持完整。 9—14 秒:镜头先切至周婆婆逐渐湿润的双眼,再平稳移至周婆婆与林秀兰的双人近景。周婆婆松开林秀兰的脸,双手轻微颤抖。周婆婆使用苍老沙哑、生涩蹩脚、带轻微异族口音但清晰可辨的普通话,在画内完整说一次:{像…… 太像了。终于等到你了,乡亲们有救了。} “像” 后短暂停顿,“太像了” 带着难以置信,“终于等到你了” 声音发颤,“乡亲们有救了” 充满如释重负的激动。最后一个字说完时,泪水从周婆婆眼中涌出,画面停留在她含泪而欣慰的神情上。林秀兰、春丫和石头全程自然闭口,只用眼神和表情回应。 【摄影与声音】 采用稳定、缓慢、克制的电影运镜。人物面部始终清晰,背景自然虚化;暖色烛光勾勒人物轮廓,幽暗山神殿保持空间层次。表演细腻真实,不过度夸张。 <烛火轻微燃烧声、衣料摩擦声和山神殿细微声响> 极轻的低沉弦乐铺底,不遮盖台词。 没有旁白,画面不显示字幕、文字或标牌。 【保持一致】 保持四名角色的身份、数量、外貌、服装、身高关系、空间方位和视线方向连续。老花眼镜始终正确佩戴,不漂浮、不消失。搀扶、停步、揉眼、捏脸、松手和说话严格按顺序衔接。手部结构正常,手指与脸颊接触准确;捏脸过程中林秀兰不换脸,五官位置和脸部结构保持稳定。 【排除内容】 排除卡通感、滑稽恶搞、现代物品、掌掴、推搡和粗暴动作;排除人物换脸、年龄或服装变化、身高突变、角色增减、空间位置跳变和动作顺序混乱;排除手掌穿模、多余手指、手指粘连、手部畸形、脸部塌陷、五官扭曲、眼镜漂浮或消失;排除错误人物发声、多人同时说话、重复台词、漏词、口型错位和声画不同步;排除快速剪辑、跳帧、剧烈抖动、画面闪烁、字幕、文字、标志和水印。 ``` 需要对不同台词做差异化要求时,按“角色台词(情绪):内容”的格式拆分描述: ```Plain Text 周婆婆台词(难以置信):“像……” 周婆婆台词(声音发颤):“太像了。” 周婆婆台词(惊喜):“终于等到你了,乡亲们有救了。” ``` **优化后提示词**: ```Plain Text 【生成目标】 生成周婆婆在山神殿内走近林秀兰、反复确认她的面容并激动落泪的连续场景。古装悬疑奇幻真人电影风格,电影级写实质感。昏暗古朴的山神殿内有陈旧木梁、旧神龛、烛台和祭祀陈设,暖色烛火轻轻摇曳,空气中漂浮细小尘埃。 【主体与关系】 全程只有林秀兰、周婆婆、春丫、石头四人。春丫与石头分别搀扶周婆婆左右两侧;林秀兰始终站在周婆婆前方。保持参考人物的脸型、年龄、发型、服装和身高关系。周婆婆始终佩戴同一副老花眼镜。 【资产锁定】 周婆婆严格参考@[图片3] 。 林秀兰严格参考@[图片2], 山神殿场景严格参考@[图片3] 。 【事件脚本】 0—4 秒:中景镜头围绕周婆婆缓慢向前推近。春丫与石头小心搀扶周婆婆起身,三人步履缓慢地走到林秀兰面前。周婆婆始终凝视林秀兰的脸;认出她后,脚步短暂停顿,嘴唇轻颤,双眼逐渐睁大,神情从震惊转为难以抑制的激动,仿佛见到等待多年的故人。林秀兰安静站立,困惑而警觉地回望她。结束时周婆婆在林秀兰面前站定,春丫和石头仍扶住她。 4—9 秒:切至周婆婆与林秀兰的面部近景。周婆婆先颤抖着扶正眼镜,再用一只手短暂揉一次自己的眼睛;确认没有看错后,她才伸出双手,轻轻捏住林秀兰两侧脸颊,缓慢左右拨看,再轻轻揉捏和拉扯确认。动作依次发生,不同时抢拍。手指准确接触脸颊,不遮挡眼睛、鼻子和嘴部。林秀兰被捏得轻微嘟嘴,露出错愕不解的神情,身体下意识稍稍后仰,但不挣扎、不躲开。周婆婆动作急切失态,却始终轻柔。结束时两人面部清晰可见,林秀兰的五官与脸型保持完整。 9—14 秒:镜头先切至周婆婆逐渐湿润的双眼,再平稳移至周婆婆与林秀兰的双人近景。周婆婆松开林秀兰的脸,双手轻微颤抖。周婆婆使用苍老沙哑、生涩蹩脚、带轻微异族口音但清晰可辨的普通话,周婆婆台词(难以置信):“像……“ 周婆婆台词(声音发颤):“太像了。“ 周婆婆台词(惊喜):“终于等到你了,乡亲们有救了。“最后一个字说完时,泪水从周婆婆眼中涌出,画面停留在她含泪而欣慰的神情上。林秀兰、春丫和石头全程自然闭口,只用眼神和表情回应。 【摄影与声音】 采用稳定、缓慢、克制的电影运镜。人物面部始终清晰,背景自然虚化;暖色烛光勾勒人物轮廓,幽暗山神殿保持空间层次。表演细腻真实,不过度夸张。 <烛火轻微燃烧声、衣料摩擦声和山神殿细微声响> 极轻的低沉弦乐铺底,不遮盖台词。 没有旁白,画面不显示字幕、文字或标牌。 【保持一致】 保持四名角色的身份、数量、外貌、服装、身高关系、空间方位和视线方向连续。老花眼镜始终正确佩戴,不漂浮、不消失。搀扶、停步、揉眼、捏脸、松手和说话严格按顺序衔接。手部结构正常,手指与脸颊接触准确;捏脸过程中林秀兰不换脸,五官位置和脸部结构保持稳定。 【排除内容】 排除卡通感、滑稽恶搞、现代物品、掌掴、推搡和粗暴动作;排除人物换脸、年龄或服装变化、身高突变、角色增减、空间位置跳变和动作顺序混乱;排除手掌穿模、多余手指、手指粘连、手部畸形、脸部塌陷、五官扭曲、眼镜漂浮或消失;排除错误人物发声、多人同时说话、重复台词、漏词、口型错位和声画不同步;排除快速剪辑、跳帧、剧烈抖动、画面闪烁、字幕、文字、标志和水印。 ``` **案例二:参考视频自带字幕** |优化前 |优化后 | |---|---| |[视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-v05-subtitle-04.mp4) |[视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-v05-subtitle-06.mp4) | \ | | | \ |> 参考视频含字幕,输出跟随生成字幕 |> 更换无字幕参考视频后输出正常 | **两版参考视频对比** |含字幕的参考视频 |去除字幕后的参考视频 | |---|---| |[视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-v05-subtitle-03.mp4) |[视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-v05-subtitle-05.mp4) | \ | | | \ |> 案例二的原参考视频,自带字幕 |> 去除字幕后的参考视频 | 示例提示词 **案例二:参考视频自带字幕** 续写任务的原始提示词如下。该案例的处理方式是更换无字幕的参考视频,提示词本身无改动: ```Plain Text 风格:顶级3D国漫仙侠,超清细腻,水墨仙气光影,云海山门场景,动态微风拂动衣袂发丝,人物动作自然流畅,比例标准,电影级氛围感。 人物设定:清冷白衣女仙、黑衣少年修士,双人对峙站立山巅云台,云雾缭绕。 镜头:中景固定镜头,双人同框,构图均衡,仙气粒子浮动。 续写视频,全程无字幕禁止出现字幕。 镜头设计: 0-3秒:双人中景固定镜头延续。白衣女仙眉眼微冷,目光锁定黑衣少年,手中仙气逐渐凝聚。白衣女仙淡然轻语:“执迷不悟,只会送命。” 3-6秒:镜头轻微推进黑衣少年。黑衣少年黑发被风吹起,肩背灵剑,眼神坚定不退,周身浮现淡金色灵纹。黑衣少年沉声回应:“我命由我,不由天定!” 声音要求: 仅保留人物对白、轻风声、细碎仙气嗡鸣、剑鸣与灵光凝聚声。无背景音乐。 ``` ## 特殊格式 JPG 图片报错 **典型现象** 部分 JPG 图片在上传或处理时报错,提示图片解码失败(如 invalid image: heic: decode failed)。 **根因分析** 该类图片并非文件截断或数据损坏,而是采用了非常规、非对称的色度采样(如 Y 分量 2x2、Cb 分量 1x1、Cr 分量 2x1),超出了标准 JPEG 采样格式(4:2:0 / 4:2:2 / 4:4:4)的解码范围。 **解决方案** 使用 ffmpeg 将图片转为标准像素格式后重新上传: ```Bash ffmpeg -i test-jpg.jpg -pix_fmt yuvj420p fixed.jpg ``` 或直接将图片转换为 PNG 等其他格式。 ## 编辑前后时长不一致 **典型现象** 视频编辑任务的输出比原视频短约 0.33 秒。 **解决方案** 1. 切换为参考生成模式并指定输出时长;该模式非严格编辑,内容可能有差异,但时长可精确控制。 2. 保持编辑任务时,将输入视频的帧数调整为 8n+1(n 为正整数),输出时长即可与原视频保持一致。 **方法一:切换为参考生成模式** |输入视频 |优化前(编辑输出) |优化后(参考生成输出) | |---|---|---| |[视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-v07-edit-duration-01.mp4) |[视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-v07-edit-duration-02.mp4) |[视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-v07-edit-duration-03.mp4) | \ | | | | \ |> 任务输入视频 |> 编辑输出比原视频短约 0.33 秒 |> 参考生成模式下时长精确 | **方法二:将输入帧数调整为 8n+1** |调整后的输入视频 |编辑输出 | |---|---| |[视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-v07-edit-duration-04.mp4) |[视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-v07-edit-duration-05.mp4) | \ | | | \ |> 输入帧数调整为 161 帧(6 秒 17 帧) |> 输出同为 6 秒 17 帧,时长一致 | 在剪辑软件中查看视频时间码的示例: ![](https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/sd25-v07-time-01.png) ![](https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/sd25-v07-time-02.png) 时间码放大细节: ![](https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/sd25-v07-time-03.png) ![](https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/sd25-v07-time-04.png) 示例提示词 视频编辑任务的原始提示词: ```Plain Text 这是视频编辑任务。请对视频进行视频编辑,仅修改指令明确要求改变的内容,其余主体、构图、时序和风格保持一致。编辑指令:编辑并且移除视频中的红色线条,红色数字,红色箭头。 ``` ## 复杂任务效果不稳定 **典型现象** 一次生成同时承担多项参考、编辑要求时,整体效果不稳定。 **解决方案** 将复杂任务拆解为多个简单任务,分多次生成或编辑完成,再通过后期剪辑整合。 |优化前 |优化后 | |---|---| |[视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-v08-complex-task-02.mp4) |[视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-v08-complex-task-06.mp4) | \ | | | \ |> 一次生成承担全部复杂要求,输出出现红色轨迹线 |> 拆解为参考任务与编辑任务后输出正常 | **任务拆解方式** 将原始复杂任务拆解为两个简单任务依次完成: 1. **第 1 步 · 参考任务**:输入带轨迹标注的图片素材,生成一段帽子沿轨迹飞行的动画(无需音频),作为第 2 步的参考素材。 2. **第 2 步 · 编辑任务**:编辑原输入视频,增加帽子飞到男子头上的效果;帽子的形态与飞行轨迹参考第 1 步生成的动画,其余画面保持不变。 |第 1 步输入 |第 1 步输出 |第 2 步输入 |第 2 步输出 | |---|---|---|---| |![sd25-v08-trajectory-01.png](https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/sd25-v08-trajectory-01.png) |[视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-v08-complex-task-03.mp4) |[视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-v08-complex-task-01.mp4) |[视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-v08-complex-task-06.mp4) | \ | | | | | \ |> 带轨迹标注的图片素材 |> 参考任务生成的帽子飞行动画 |> 待编辑的原视频(含红色轨迹标注),并以第 1 步的输出作为参考素材 |> 编辑任务输出,完成帽子佩戴效果 | 示例提示词 原始任务提示词(一次生成同时承担多项要求): ```Plain Text 编辑视频1,增加一个帽子沿图片1标注的轨迹飞到男子头上,红色轨迹不展示 ``` 拆解后的第 1 步参考任务提示词(生成帽子沿轨迹飞行的素材,不需要音频): ```Plain Text 生成一段 5 秒的视频,一个帽子沿图片1标注的轨迹飞到男子头上,红色轨迹不展示 ``` 拆解后的第 2 步编辑任务提示词(帽子形态与轨迹参考第 1 步的输出): ```Plain Text 编辑视频1,增加一个帽子飞到男子头上;帽子的形态和轨迹参考视频2中的帽子,其他保持不变 ``` ## 编辑宽高比效果差 **典型现象** 通过编辑改变宽高比时,模型为填充新画幅而生成额外画面,导致原画面内容或时序不一致。 **解决方案** 改用参考生成完成任务,并在提示词中补充具体剧情描述,强调逐帧、逐镜头的时序对应与画面内容完整性。 |输入视频 |优化前(编辑输出) |优化后(参考生成输出) | |---|---|---| |[视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-v09-edit-aspect-01.mp4) |[视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-v09-edit-aspect-02.mp4) |[视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-v09-edit-aspect-03.mp4) | \ | | | | \ |> 任务输入视频 |> 编辑填充新画幅,画面内容与时序不一致 |> 参考生成并补充剧情描述后内容一致 | 示例提示词 优化前的原始任务使用英文提示词,仅含时序约束,缺少具体剧情描述: **优化前提示词** ```Plain Text Create a new video using @Video 1 as the strict visual and temporal reference. Follow the output dimensions and duration selected in the generation settings. [Timeline Fidelity — Highest Priority] Create a continuous one-to-one temporal correspondence with @Video 1 from the first frame through the final frame. Each output moment corresponds to the same moment in @Video 1 at the same playback speed. Every source frame and every distinct shot is mandatory. Include all very brief shots, flash frames, inserts, reaction shots, transitional images, motion-blurred frames, whip pans, and sub-second visual events. Give each one its original screen time and its original position in the sequence. Reproduce every cut and transition at its corresponding source moment. Maintain the exact shot order, cut frequency, transition style, action progression, and rhythm. Rapid passages retain all their individual shots as separate visible moments with full timeline coverage. For every shot, preserve its opening state, intermediate motion trajectory, and closing state. Preserve every entrance, exit, gesture, pose, camera movement, occlusion, and lighting transition occurring between those states. [Reference Content] @Video 1 defines the complete scene, subjects, objects, actions, expressions, poses, spatial relationships, camera movement, lens behavior, focus, lighting, shadows, reflections, colors, textures, frame sequence, cuts, timing, motion, and audio. Keep the complete original field of view visible within the output canvas with matching composition, geometry, perspective, subject scale, subject placement, camera path, motion speed, and audiovisual synchronization. Every person, face, body, hand, garment, object, prop, surface, background element, text, logo, color, texture, shadow, reflection, motion blur, and occlusion remains consistent with @Video 1 throughout the sequence. [Additional Canvas] The additional canvas areas show a seamless continuation of the surroundings visible at the boundaries of @Video 1. Continue intersecting surfaces, objects, shadows, reflections, and environmental elements with matching geometry, depth, perspective, lighting, texture, focus, motion blur, camera movement, and parallax. Maintain strict frame-to-frame continuity across the entire canvas. Static environmental details stay fixed in world space. Moving elements remain synchronized with the camera and scene motion in @Video 1. The finished video contains the complete frame sequence, all rapid visual events, the same subjects and actions, the original audio, and the exact narrative and temporal order of @Video 1, presented on the newly selected canvas. Shift + Enter 换行 ``` **优化后提示词**(补充画面时间轴,强调逐帧、逐镜头的时序对应与画面内容完整性): ```Plain Text 使用 @视频1 作为严格的视觉与时序参考,生成一段新视频。请遵循生成设置中选定的输出尺寸与时长。【时间线保真度——最高优先级】与 @视频1 建立从第一帧到最后一帧的完整一一对应关系,以相同播放速度在同一时刻对应同一画面。所有源帧和每个独立镜头都必须保留,包括所有极短镜头、闪帧、插入镜头、反应镜头、过渡画面、动态模糊帧、急速摇摄以及不足一秒的视觉事件。每个镜头保留原始时长及其在序列中的原始位置。在对应源时刻还原每一个剪切点与转场,保持精确的镜头顺序、剪切频率、转场风格、动作推进节奏和整体节律。快速段落保留所有单独可见的镜头,每个镜头均有完整的时间线覆盖。每个镜头均需保留其起始状态、中间运动轨迹及结束状态,包括起始状态与结束状态之间的所有入画、出画、手势、姿态、镜头运动、遮挡关系及光影过渡。【参考内容】@视频1 定义了完整的场景、主体、物件、动作、表情、姿态、空间关系、镜头运动、镜头特性、焦点、光照、阴影、反射、色彩、纹理、帧序列、剪切点、时序、运动及音频。在输出画布内保留完整的原始视野,保持构图、几何关系、透视关系、主体比例、主体位置、镜头路径、运动速度及视听同步一致。全片中,每一个人物、面部、身体、手部、服装、物件、道具、表面、背景元素、文字、Logo、色彩、纹理、阴影、反射、动态模糊及遮挡关系,均与 @视频1 保持一致。【扩展画布】扩展画布区域展示 @视频1 边界处可见环境的无缝延伸,以匹配的几何关系、景深、透视、光照、纹理、焦点、动态模糊、镜头运动和视差,延续交叉的表面、物件、阴影、反射及环境元素。整个画布逐帧保持严格的连续性。静态环境细节在世界空间中保持固定,运动元素与 @视频1 中的镜头及场景运动保持同步。最终视频包含完整帧序列、所有快速视觉事件、相同的主体与动作、原始音频,以及 @视频1 的精确叙事顺序与时序,呈现于新选定的画布上。画面的时间轴如下:【00:00–00:01】老虎面部极近特写,双眼直视镜头,眼神犀利深邃。画面采用双重曝光叠影效果,虎脸轮廓上叠加了波光粼粼的海浪影像。夕阳斜照,虎毛呈现温暖金橙色。【00:01–00:04】老虎在海滩上行走,全身近景。背景是翻滚的浅蓝色海浪和被晚霞染黄的天空,脚下是平坦潮湿的沙滩。老虎正对镜头稳健走来,步伐坚定有力,目光始终锁定前方。低角度拍摄,增强老虎的威严压迫感。【00:04–00:06】一只洁白海鸟(燕鸥/海鸥)在空中翱翔,背景是明亮蓝天与几朵白云。背随跟拍,镜头跟随海鸟飞行轨迹移动,展翅动作轻盈舒展。 ``` ## 画面出现指纹状纹理 **典型现象** 高分辨率 AI 生成图片作为参考素材时,草地、树叶等纹理密集区域可能出现指纹或鞋印状纹理。 **解决方案** > **说明** > > 该问题将在后续模型迭代中持续优化,当前可通过以下方法降低出现概率。 调整输入图片大小,使其不超过输出视频的分辨率。输出 1080p 时该问题的出现概率低于 720p。 案例使用的输入图片,从左至右为原始高分辨率参考图、指纹状纹理特写与调整分辨率后的参考图: ![](https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/sd25-v10-fingerprint-01.png) ![](https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/sd25-v10-fingerprint-02.png) ![](https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/sd25-v10-fingerprint-03.png) |优化前 |优化后 | |---|---| |[视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-v10-fingerprint-01.mp4) |[视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-v10-fingerprint-02.mp4) | \ | | | \ |> 高分辨率参考图引发指纹状纹理 |> 调整输入图片分辨率不超过输出分辨率后不再出现 | ## 背景音乐约束不生效 **典型现象** 提示词中已写明“禁止背景音乐”,部分特效音仍可能被生成为背景音乐。 **解决方案** **方案一:提示词约束** 1. 在提示词中明确“音频仅保留角色人声声源”“不产出任何音乐类音轨”,并一次性穷举音乐类同义词(音乐、背景音乐、BGM、配乐、器乐、旋律、合成器音效、氛围铺底音等),避免模型替换表述绕过约束。 2. 将音频约束在提示词的开头与结尾各写一遍,强化模型注意力。 **方案二:后期编辑** 1. 生成完成后,通过后期编辑分离出人声并移除非人声部分。注意:该方法会同时移除音效。 |优化前 |优化后(方案一:提示词约束) |优化后(方案二:后期编辑) | |---|---|---| |[视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-a01-bgm-02.mp4) |[视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-a01-bgm-01.mp4) |[视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-a01-bgm-03.mp4) | \ | | | | \ |> 已写明禁止背景音乐,特效音仍被生成为背景音乐 |> 穷举音乐类同义词并在提示词首尾重复音频约束,仅保留角色人声 |> 后期分离人声并移除非人声部分(含音效) | 示例提示词 示例为方案一的英文提示词。优化后在提示词开头增加音频策略约束段,穷举音乐类同义词,并在镜头之间补充音频说明,实现首尾双重强调: **优化前提示词** ```Plain Text No background music. (0s – 5s) | 5s Visual: (a young child with soft, short black hair and round, dark brown eyes, wearing light blue one-piece pajamas) lies on her side on a blanket in front of an old wooden cabin's porch; she breathes gently, gazing into the distance with half-open eyes. (a small, cream-colored lop-eared rabbit with a pinkish nose and ears resting softly against its sides) lies quietly in her arms, its nose twitching gently. The scene is set outside a quiet country cabin just as night falls; scattered fireflies blink slowly amidst the grass. Shot using a low-angle, wide-angle static shot aligned with the eye level of the child and rabbit; the camera is completely still. Cool blue moonlight serves as the key light, while soft, warm yellow light spills from the cabin window; the porch floorboards catch a faint amber reflection, and the surrounding grass appears deep green. The atmosphere is quiet, gentle, and slightly dreamlike. Dialogue: None. (5s – 10s) | 5s Visual: is now dressed in a white short-sleeved top, light purple overalls, and beige canvas shoes; she slowly sits up and points a finger at a particularly bright firefly in the grass. lifts its head, long ears drooping gently, and follows the direction of her finger with its shiny black eyes. Both remain on the blanket by the cabin porch. A low-angle medium close-up shot; the camera performs a restrained, steady, and slow zoom-in on their faces. Cool-toned moonlight outlines their silhouettes, while warm yellow window light gently illuminates ’s cheek and ’s fur; the green glow of fireflies flickers faintly in the foreground. The atmosphere is serene and intimate. Dialogue: speaks in natural American English, using a young, soft, and curious child's voice: {It’s showing us the way. } (10s – 14s) | 4s Visual: The frame is filled with the depths of a grassy area; dozens of fireflies flutter slowly, their flickering points of light loosely tracing a winding path toward the indistinct silhouettes of trees bathed in moonlight in the distance. There are no human figures in the shot. Low-angle POV (close to the blades of grass), static shot, stationary camera. The color palette is dominated by a deep blue night sky and dark green grass, with the fireflies emitting a soft yellow-green glow, creating an atmosphere that is quiet, mysterious, and evocative of childhood fantasy. Dialogue/Audio: No dialogue, no background music. ``` **优化后提示词** ```Plain Text Audio policy (applies to ALL shots): the soundtrack contains ONLY the specified spoken dialogue plus faint natural night ambience at a low, constant level. Absolute silence otherwise. No music, no BGM, no score, no instrumental, no melody, no soundtrack, no synth, no ambient pad, no drone, no swelling tone, no crescendo, no musical build or stinger at any moment — especially not at any reveal or when the camera looks up. (0s – 5s) | 5s Visual: (a young child with soft, short black hair and round, dark brown eyes, wearing light blue one-piece pajamas) lies on her side on a blanket in front of the porch of an old wooden cabin; she breathes gently, gazing into the distance with half-open eyes. (a small, cream-colored lop-eared rabbit with a pinkish nose and ears resting softly against its sides) lies quietly in her arms, its nose twitching slightly. The scene is set outside a quiet wooden cabin in the countryside just after nightfall; scattered fireflies blink slowly amidst the grass. A low-angle, wide-angle static shot aligns with the eye level of the child and rabbit; the camera remains completely still. Cool blue moonlight serves as the key light, while soft, warm yellow light spills from the cabin windows; the porch floorboards catch a faint amber reflection, and the surrounding grass appears deep green. The atmosphere is quiet, tender, and slightly dreamlike. Dialogue: None. Audio: faint crickets and light wind only, low constant level. No music, no score, no rising tone of any kind. (5s – 10s) | 5s Visual: is now dressed in a white short-sleeved top, light purple overalls, and beige canvas shoes; she slowly sits up and points a finger at a particularly bright firefly in the grass. lifts its head, its long ears drooping gently, and gazes in the direction of her finger with bright, dark eyes. (10s – 14s) | 4s Shot: The frame is filled with tall grass; dozens of fireflies drift slowly, their flickering lights loosely tracing a winding path toward the indistinct silhouettes of trees in the distance under the moonlight. No characters are visible—a low-angle POV shot close to the blades of grass, static camera. The color palette is dominated by the deep blue of the night sky and the dark green of the grass, with the fireflies emitting a soft yellow-green glow, creating an atmosphere of quiet mystery and childhood wonder. Dialogue: None; no background music. Audio: ONLY faint crickets and light wind at a low constant level, unchanged from the previous shots. Absolute silence otherwise. No music, no score, no swelling tone, no rising pad, no synth, no ambient drone, no crescendo, no musical build at the reveal. ``` ## 音频翻译语种混淆 **典型现象** 多角色视频翻译后仍残留原语言、角色声线串位,或目标语言口型不准确。 **解决方案** 1. 在提示词中明确所有角色(含背景中可辨识的对白、低语、感叹词与语气词)都必须翻译为目标语言,不得遗漏。 2. 按角色提供完整的目标语言台词及时间轴。 3. 要求逐字同步口型,并明确验收标准:全片无可辨识的原语言残留、无字幕、口型与台词精准同步;除语言与口型外,其余画面与声音内容保持不变。 |翻译任务的输入视频 |优化前 |优化后 | |---|---|---| |[视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-a02-audio-translate-01.mp4) |[视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-a02-audio-translate-02.mp4) |[视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-a02-audio-translate-03.mp4) | \ | | | | \ |> 多角色原语言视频 |> 翻译后残留原语言、角色声线串位 |> 按角色提供完整台词与时间轴后正常 | 示例提示词 **优化前提示词**(仅笼统要求翻译,未提供目标语言台词与时间轴): ```Plain Text 将视频中的配音翻译成中文,口型做出对应的精准改变,其余均保持不变。要求:禁止出现韩文和中文字幕 ``` **优化后提示词**(明确所有角色必须翻译、无字幕,并按角色提供完整中文台词与时间轴): ```Plain Text 将视频中@视频1的所有人声台词(包括男性和女性的台词),所有台词都要翻译成中文,无字幕,口型做出对应的精准改变,其余均保持不变。请对原视频进行中文配音与精准口型重制。核心要求:1. 完整识别并替换视频中的所有韩语人声,包括男性、女性以及背景中可辨识的对白、低语、感叹词和语气词,不得遗漏任何一句。2. 所有韩语台词必须全部改为中文普通话。最终视频中禁止出现任何韩语语音、韩语文字或韩语字幕,也不得保留原韩语人声作为背景音。3. 严格按照原视频中每位人物的说话顺序、起止时间、情绪、语气、停顿和音量进行中文配音;男女角色必须与原人物对应,不得串角色。4. 根据中文台词逐字调整人物口型,使嘴部动作与中文发音、节奏和台词时长精准同步,避免口型提前、延迟、错位或仍匹配韩语发音。5. 不添加任何字幕、标题、贴纸或文字。6. 除人声语言和对应口型外,其他内容必须保持不变,包括人物身份、表情、动作、服装、场景、镜头、构图、画面风格、时长、帧率、环境音、背景音乐及音效。7. 若实际韩语对白与下方时间轴存在细微差异,以原视频的完整对白为准,但中文含义和角色关系必须与参考译文一致;不得因时间轴不完整而保留韩语。8. 输出前逐段检查:确保全部人声均已转换为中文,韩语残留为零,且全程无字幕。中文台词及时间轴:00:05–00:09 女生:那今天晚饭,要不要去吃你最喜欢的炸鸡? 00:16–00:21 男生:比起炸鸡……我更喜欢像这样和你一起喝咖啡的时间。 00:23–00:24 女生:噢……最终验收标准:全片所有可辨识台词均为中文普通话;不含任何韩语语音或韩语文字;无字幕;中文口型准确同步;其他画面与声音元素不变。 ``` ## 音频出现水波纹噪声 **典型现象** 生成的音频中出现预期外的冒水泡声、回音或较弱啸叫等噪声。 **解决方案** > **说明** > > 该问题将在后续模型迭代中持续优化,当前可通过以下方法降低出现概率。 移除提示词中与水、波浪、回音相关的描述,可降低噪声出现概率。 |优化前 |优化后 | |---|---| |[视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-a03-ripple-noise-01.mp4) |[视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-a03-ripple-noise-02.mp4) | \ | | | \ |> 音频出现水波纹噪声 |> 移除提示词中水、波浪、回音相关描述后噪声减少 | # 提示词案例 ## 参考生视频 主体/运动/音频/风格参考的使用方式与 Seedance 2.0 一致,可以参考 [附录:提示词案例](/docs/seedance-2-0-prompt-guide#ff5fb3e6),下文介绍 Seedance 2.5 新增的参考能力。 ### 白模参考/渲染 #### 粗粒度白模 - 支持输入含有**运动、运镜、动线和光照**等动态/时序信息的白模视频进行渲染;还支持叠加输入**主体、场景和道具**等参考图控制渲染效果。 - 当前版本对于简单建模的参考效果较好,建议仅用**简单几何体**拼接表示人物/物体/动物等。 > **说明** > > 白模视频主体建议仅保留躯体,避免包含【四肢/翅膀】等涉及精细运动的元素;如已包含,需补全其动作序列,以防止渲染结果出现四肢僵化。 白模类型:含切镜/运镜/光照 **输入:文本** prompt:以白模参考视频 `` 作为整支视频唯一的运镜、镜头节奏、景别变化、主体运动轨迹和镜头调度参考,严格保持白模视频的镜头顺序、机位变化、运动方式和节奏,不改变镜头结构,不新增镜头,不改变主体运动逻辑。结合各阶段关键帧参考图,生成一部 30 秒电影级 3D 动画短片,整体风格梦幻、童话、温暖,具有儿童幻想色彩,角色外形与各阶段的关键帧保持一致,不要改变角色形象,人物表情情绪随场景变化而改变。 - 0-3s(首帧参考 `<2pic>`)镜头由全景俯视缓缓推向地上的小女孩,小女孩坐在房间的地毯上玩飞机,小女孩起身左转,右手使劲一挥将手里的飞机放飞。 - 3-5s(参考 `<3pic>`)飞机从左至右穿过房间悬挂的星星挂件,小女孩乘坐飞机进入幻想的天空。 - 5-8s(参考 `<4pic>`)镜头继续侧跟,以小女孩为中心的环绕。 - 8-10s(参考 `<5pic>`)镜头环绕到小女孩驾驶的飞机背面、飞机开始缓缓俯冲海面。 - 10-19s(参考 `<6pic>`、参考 `<7pic>`)小女孩继续向海底游去,一条鳐鱼游过来入画。 - 19-23s(参考 `<8pic>`)小女孩从时空裂缝冲出来到幻想宇宙。 - 23-24s(参考 `<9pic>`)前景小女孩和星球开始前翻转并,逐渐幻化消失。 - 24-28s(参考 `<9pic>`)俯视镜头持续推进,小女孩躺在地的毯上熟睡。 - 28-30s(参考 `<10pic>`)镜头继续推进绘本,随后爸爸进入画面。 整体要求:所有画面均参考对应关键帧,白模视频仅作为运镜、镜头运动和角色动画参考,不参考画面内容。最终输出 30 秒 16:9 横构图宽屏视频。 **输入:视频、图** [视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/vid_001_video-1.mp4) video1 ![img_022_AjpddkViSolsPfxJTv7c9uDEnCe.png](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/img_022_AjpddkViSolsPfxJTv7c9uDEnCe.png) 2pic ![img_023_KTDddO41Vod4W1xxY2icesjzn0f.png](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/img_023_KTDddO41Vod4W1xxY2icesjzn0f.png) 3pic ![img_024_A8AcdIHcQolmt7xFxTTcAhHonsb.png](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/img_024_A8AcdIHcQolmt7xFxTTcAhHonsb.png) 4pic ![img_025_FLzjd3zABo9HmqxDVEIcRwKZnLf.jpg](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/img_025_FLzjd3zABo9HmqxDVEIcRwKZnLf.jpg) 5pic **输入:视频、图(续)** ![img_026_HFQid7k5AovyMhxXJcHcZc96nOc.png](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/img_026_HFQid7k5AovyMhxXJcHcZc96nOc.png) 6pic ![img_027_J6vWd5GW0oH8LYxYXhYceCvxnVj.png](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/img_027_J6vWd5GW0oH8LYxYXhYceCvxnVj.png) 7pic ![img_028_F0pkdLxQVok07Ax1Ge9cbDP5nxc.jpg](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/img_028_F0pkdLxQVok07Ax1Ge9cbDP5nxc.jpg) 8pic ![img_029_Ol7PdZ0choM5KRxCNaZcJBrDn2g.png](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/img_029_Ol7PdZ0choM5KRxCNaZcJBrDn2g.png) 9pic ![img_030_S0XidqVTDoTVw0xFaiIcsvY4nAe.png](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/img_030_S0XidqVTDoTVw0xFaiIcsvY4nAe.png) 10pic **输出** [视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/vid_002_10.mp4) 同步对比视频: [视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/vid_003_8%E6%9C%883%E6%97%A5%281%29.mp4) #### 细粒度白模 - 服务于建模完整,重点解决重渲染的场景,给「白模上色」获得更好更丰富的渲染效果。 - 尽量提供完整且清晰的细粒度白模视频,**不含【轨迹线】【坐标线】【相机 cone】等干扰信息**的视频,否则容易泄露到生成后的视频中。 **输入:文本** 将视频 1 进行白模渲染,无 bgm,只生成环境音和动作音。 渲染要求:背景为深蓝与紫色色调的夜晚赛博朋克都市,密集的摩天大楼,楼宇间是巨大的全息广告牌与霓虹灯光,数个飞行器在空中穿梭,闪着微弱的灯光,发出微弱的机械声响;人物为一个身着黑色夜行衣的小浣熊,身影为一道剪影,脚步小心翼翼;人物移动的地点是摩天大楼中的一栋楼的屋顶。 **输入:视频** [视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/vid_004_%E5%81%B7%E6%84%9F%E5%BE%88%E9%87%8D.mp4) **输出** [视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/vid_005_seedance25-cyberpunk-rooftop-raccoon-render-6s-720p-20260804-baseline-run01_cgt-20260804112511-lpq4w.mp4) **高难度白模预演** [视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/vid_006_%E9%A3%9E%E8%88%B9-594%E9%9F%B3%E4%B9%90.mov) > 复杂 3D 白模的结构与镜头调度逐帧承接,渲染出成片质感。 ### 多宫格分镜/故事板参考 **输入:文本** image1: 九宫格分镜参考,用于整体镜头结构、景别与运镜节奏。 image2: 火箭发射场黄昏草原实拍参考,用于环境构图、暖金夕照与冷暮蓝的写实彩色实拍质感基准。 image3: 主体 1 (守护机器人) 角色外观参考。 image4: 主体 2 (老奶奶) 角色外观参考。 【主体设定】 主体 1 (守护机器人): 参考 image3,近未来做旧复古机器人,做旧蓝绿色金属机身、斑驳锈蚀,圆顶头,两只发光的红色圆形机眼,细天线,细长关节四肢;体型高大,约为人类两倍高。 主体 2 (老奶奶): 参考 image4,瘦小年迈女性,银发挽成低髻,皱纹深刻,身穿明黄金色及地长裙、缀金蓝刺绣胸襟,神情不舍;身高只及机器人胸口。 环境 (黄昏草原・发射场): 参考 image2,近未来黄昏草原,暮色天空由暖金渐入冷蓝,远处地平线一座发射台矗立白色火箭、蒸汽升腾;及膝野草随风起伏,广袤空旷。 【整体风格】 真人实拍彩色电影正片,写实照片级质感,全程真实彩色画面;彩色 35mm 电影胶片质感,细腻真实胶片颗粒,浓郁饱满的电影级调色,IMAX 大画幅质感;手持摄影,呼吸感摇晃,浅景深大光圈,前景持续飘散的草叶、火星与灰烬,微微倾斜荷兰角,暖金夕照与冷暮蓝、爆炸暖橙强烈对撞,16:9 横屏。近未来温情灾难片氛围,静谧、悲壮、守护与不舍。 【严格排除】黑白、单色、灰度、去色;手绘、素描、线稿、插画、漫画、动画;分镜稿 / 故事板、草图;移轴微缩、玩偶感、塑料 CG、油腻过曝 CG。 【分镜头】(9 镜 ≈ 30s) 镜头 1 (0-3s): 超远景低机位仰视,黄昏草原两人背影仰望远方火箭。台词 (机器人): "I'm right here. I won't let go." 镜头 2 (3-6s): 正面中景手持,机器人搀扶老奶奶。 镜头 3 (6-10s): 面部特写,老奶奶眼含不舍。台词 (老奶奶): "Fly safe, my child. Come back to me." 镜头 4 (10-14s): 超远景仰摇,火箭升空拖曳浓白烟迹。台词 (老奶奶): "There he goes... there he goes." 镜头 5 (14-18s): 超远景,火箭在半空爆炸碎裂。台词 (老奶奶): "No... no, no—" 镜头 6 (18-22s): 面部大特写,老奶奶瞳孔骤缩泪滑落。台词 (老奶奶): "...he was almost there." 镜头 7 (22-25s): 特写转近景,老奶奶崩溃痛哭。台词 (老奶奶): "Bring him back! Please— bring him back!" 镜头 8 (25-28s): 超低视角近乎垂直仰拍,机器人环抱老奶奶罩成保护穹顶。台词 (机器人): "Don't look up. I've got you." 镜头 9 (28-30s): 超远景背影,两人紧紧相拥剪影。台词 (机器人): "I'm still here. I'll stay... as long as you need." **输入:图** ![img_031_GDwhdxBqTooHB9xSGIpcQNz2nDb.png](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/img_031_GDwhdxBqTooHB9xSGIpcQNz2nDb.png) image1 ![img_032_RkIdd31hTo7VtBxs5ZacIQY4nhH.png](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/img_032_RkIdd31hTo7VtBxs5ZacIQY4nhH.png) image2 ![img_033_SAkwdVijHoYqmzxxvtncFt9pnsg.png](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/img_033_SAkwdVijHoYqmzxxvtncFt9pnsg.png) image3 ![img_034_ZdDydqSsIoiTbbx0na3cTYLanPg.png](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/img_034_ZdDydqSsIoiTbbx0na3cTYLanPg.png) image4 **输出** [视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/vid_007_%E5%AE%88%E6%8A%A4%E6%9C%BA%E5%99%A8%E4%BA%BA_%E7%81%AB%E7%AE%AD%E5%8F%91%E5%B0%84_30s.mp4) ### 关键帧参考 **输入:文本** 根据 @图片1 - @图片6 制作一镜到底的像素武侠主题竖版视频,背景音乐使用国风 8bit 武侠风格音乐。全片统一浅蓝底色,像素风格统一,画面干净通透。 镜头 1:静止展示 @图片 1 的「江湖风云」水墨风格 logo,背景为统一浅蓝底色,画面保持约 1 秒静止。 镜头 2:@图片 1 中的文字区域消失后,@图片 2 的武侠男性角色像素脸部特写从画面底部滑入;角色眨眨眼看向镜头,随后快速向下位移离场;角色离场后,原本 logo 处变为 @图片 3 的蓝色「武功秘籍」像素书。 镜头 3:紧接 @图片 4,像素武侠小人角色从画面下方用力向上跃出,顶起上方的蓝色菱形问号标,问号标上方弹出深蓝色粗体字「今日闯江湖!」;角色落地后摆出 @图片 4 的站姿 pose,随后抬手打招呼,接着做出预备跑动作,转身向画面右侧奔跑(奔跑姿态参考 @图片 5),镜头跟随角色向右移动,角色从画面右侧跳出画面。 镜头 4:@图片 6 的 UI 界面从画面右侧位移入画,像素武侠角色从画面右上角跳入,落在「三月廿七日」大字的右下方,张开双臂摆出热情展示的定格姿势,最终定格在该画面。 整体像素武侠美术风格,色调统一浅蓝底,运镜连贯顺滑呈现一镜到底的连续位移与跟随,元素过渡自然、角色动作衔接流畅,画面无卡顿、无闪烁;文字与 UI 清晰稳定。 **输入:图** ![img_035_F1jNda7EvoU6s8xZOu6c3OW6ngg.png](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/img_035_F1jNda7EvoU6s8xZOu6c3OW6ngg.png) 图片 1 ![img_036_N5M0du2QZoBTRTxltFYcmgnCnsb.png](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/img_036_N5M0du2QZoBTRTxltFYcmgnCnsb.png) 图片 2 ![img_037_F38XdqrFkokBhRxHyA0caAnCnmc.png](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/img_037_F38XdqrFkokBhRxHyA0caAnCnmc.png) 图片 3 **输入:图(续)** ![img_038_Oj26dVH9Po2wSzxHmp2cGRjcnTf.png](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/img_038_Oj26dVH9Po2wSzxHmp2cGRjcnTf.png) 图片 4 ![img_039_NJ6rdj0RcoiL8ExidO7cWlLznvj.png](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/img_039_NJ6rdj0RcoiL8ExidO7cWlLznvj.png) 图片 5 ![img_040_FKETdT9WroMFs6xgJa1cl4lWnEf.png](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/img_040_FKETdT9WroMFs6xgJa1cl4lWnEf.png) 图片 6 **输出** [视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/vid_008_pixel_cgt-20260805221932-s8jkr.mp4) ## 编辑视频 ### 视频指令编辑 通过 Prompt 对视频画面内容进行增删改等编辑操作。 **输入:文本** 保留 @视频 1 的构图、机位、光线与表演节奏,只改写画面里女主的样貌与神情:让她从二十多岁自然地老去到六十岁,眼神里的隐忍慢慢化开,泪光滑过眼角,嘴角一点点扬起,最后破涕为笑。全程一镜到底,不跳切、不闪烁,五官随年龄渐变而不漂移。 **输入:视频** [视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/vid_009_%E5%AF%B9%E9%95%9C%E5%90%AB%E6%B3%AA%E5%87%9D%E8%A7%86.mp4) **输出** [视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/vid_010_20260803T215035_2614ad0b51c3_%E8%A1%A8%E6%83%85%E5%8F%98%E5%8C%96.mp4) ### 视频参考图编辑 通过 Prompt 对视频画面内容进行增删改等编辑操作,支持额外输入参考图引导编辑结果。 **输入:文本** 将两人武打素版视频 @视频 1 替换为冷兵器对决前的空手试探风。 场景替换为中世纪石堡平台、古老庭院平地、山间堡垒外平台或简洁石砖决斗场,背景为古堡墙体、风、雾、远处山线,地面平整石质 @图片 1。 视频中深色衣服的男子的服饰替换为 @图片 2,视频中浅色衣服的男子替换为 @图片 3。动作仍然保持不变,不改变原始节奏。 AI 特效仅做环境和质感强化:风吹衣摆、轻雾、接触点少量尘土、金属冷色反光质感、轻微颗粒和史诗感调色。整体风格为克制、真实、古典硬派决斗氛围。背景音乐卡点。 **输入:视频、图** ![img_041_TEd5dsNe8oQ8zAxxygRcgnqAnug.png](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/img_041_TEd5dsNe8oQ8zAxxygRcgnqAnug.png) 图片 1 ![img_042_AEsxdxoL2oCC5CxHuvMcSnoLnab.png](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/img_042_AEsxdxoL2oCC5CxHuvMcSnoLnab.png) 图片 2 **输入:视频、图(续)** ![img_043_Z0shdkGCbo0aTFxxJrfcN1h7n4d.png](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/img_043_Z0shdkGCbo0aTFxxJrfcN1h7n4d.png) 图片 3 [视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/vid_011_reference1.mp4) 视频 1 **输出** [视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/vid_012_output.mp4) ### 视频音频编辑 **输入:文本** 将视频中的人声台词,翻译成中文,无字幕,口型做出对应的精准改变,其余均保持不变。 **输入:视频** [视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/vid_013_30%E7%A7%92%E5%8A%A8%E6%BC%AB%E7%8B%AC%E7%99%BD.mp4) **输出** [视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/vid_014_%E5%8A%A8%E6%BC%AB%E4%B8%AD%E6%96%87%E8%BE%93%E5%87%BA.mp4) ## 其他 ### 视频延长 延长任务,生成视频的音量较输入视频可能发生轻微变化;输入 Seedance 2.5 模型本身生成的视频做延长,音量变化相对较小,无缝衔接的效果更好。 **输入:文本** 在 @视频 1 的基础上续写 5 秒的视频,讲一只蜜蜂飞来落在画上,接着微距特写蜜蜂腿部和腹部沾满金黄色花粉颗粒,蜜蜂振翅起飞,镜头跟随它飞向另一朵同种花上,慢镜头中,花粉从蜜蜂绒毛上抖落,精准落入花蕊——授粉瞬间被放大。 > **注意** > > 输出格式选择 MOV **输入:视频** [视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/vid_015_0615_%E5%8F%91%E8%8A%BD.mp4) **输出** [视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/vid_016_seedance25-extend-bee-pollination-5s-720p-mov-20260803-baseline-run01_cgt-20260803215229-28wbd.mov) 拼接后的视频: [视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/vid_017_8%E6%9C%883%E6%97%A5.mp4) > 注意观察第 15s 附近,没有拼接痕迹 ### 一键成片 **输入:文本** 将所有图片进行一键成片,图片顺序自由安排,生成一个手绘动态涂鸦抠像风格的咖啡店 vlog,记录一只小狗穿着不同可爱服装在咖啡店打卡拍照的趣味日常。生成具有网感的趣味音频或者 bgm。 图片可以微微动起来,live 图的效果,但不要改变原图,保持和原图的高度一致。 **输入:图** ![img_044_YmwkduFMtopY2zxd5WxcgISrnCd.jpg](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/img_044_YmwkduFMtopY2zxd5WxcgISrnCd.jpg) 图片 1 ![img_045_JRY2dVlgMohjLWxPTsUcosBbneb.jpg](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/img_045_JRY2dVlgMohjLWxPTsUcosBbneb.jpg) 图片 2 ![img_046_HJDQdOr6IoxSIdxqHItc1NvKn8t.jpg](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/img_046_HJDQdOr6IoxSIdxqHItc1NvKn8t.jpg) 图片 3 **输入:图(续)** ![img_047_MEbKdxSqxoCRuSxcC5QcBOyrnWf.jpg](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/img_047_MEbKdxSqxoCRuSxcC5QcBOyrnWf.jpg) 图片 4 ![img_048_VhAtdRoM5osPffxjKuZcrpHInde.jpg](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/img_048_VhAtdRoM5osPffxjKuZcrpHInde.jpg) 图片 5 ![img_049_Rp2Sdg6OUosVCKxsnjMcGC3Anhh.jpg](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/img_049_Rp2Sdg6OUosVCKxsnjMcGC3Anhh.jpg) 图片 6 **输入:图(续)** ![img_050_ScYudGz7So5oHoxJp8Icsk94nRc.jpg](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/img_050_ScYudGz7So5oHoxJp8Icsk94nRc.jpg) 图片 7 ![img_051_MLVNdsa65oMMAYxdVouc7pysndb.jpg](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/img_051_MLVNdsa65oMMAYxdVouc7pysndb.jpg) 图片 8 **输出** [视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/vid_018_8282ec97-0d00-4a2f-9896-9c1d88c600bc.mp4) ### 视频无缝转场 **输入:文本** 将【视频 1】和【视频 2】衔接起来,【视频 1】的视角急需飞行至顶端快速折返,视角垂直向下俯冲,然后无缝自然地衔接转场到【视频 2】,在镜头切换的过程中麻将牌慢慢变成高楼。整个场景也对应变化,同时不要改变上传的两个视频。 **输入:视频** [视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/vid_019_1.mp4) 视频 1 [视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/vid_020_2.mp4) 视频 2 **输出** [视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/sd25-pe/vid_021_%E7%A7%AF%E6%9C%A8%E8%BD%AC%E5%9C%BA%E8%A7%86%E9%A2%91.mov) # 总结 Seedance 2.0 已经完成了核心生成能力的明显突破,而 Seedance 2.5 是在此基础上面向真实生产场景做系统性补强:包括更长视频生成、更多素材参考、更稳定的编辑/续写能力,以及在画面宽高比、音画衔接、可控性和工作流适配上的优化。 Seedance 2.5 的价值不只是「单条视频效果更好」,而是让模型在可复用、可交付、可规模化生产这些关键环节上更进一步。它把 Seedance 从「效果惊艳的创作模型」,继续推进到更接近端到端工业化视频生产的阶段。 --- # Doubao Seedance 2.0 系列教程 Source: https://ark.volcengine.com/region:cn-beijing/docs/seedance-2-0 Doubao Seedance 2.0 系列(下文简称 Seedance 2.0 系列)模型支持图像、视频、音频、文本等多种模态内容输入,具备视频生成、视频编辑、视频延长等能力,可高精度还原物品细节、音色、效果、风格、运镜等,保持稳定角色特征,赋予使用者如同导演般的掌控权。本文介绍 Seedance 2.0 系列模型的专属能力,帮助您快速实现 [Video Generation API](/docs/create-video-generation-task-api) 调用。 > **说明:模型开通条件** > > 开通 Seedance 2.0 系列模型前,请确保您满足以下任一条件: > * **【推荐】账户余额 > 200 元**([前往充值](https://console.volcengine.com/finance/fund/recharge)) > * **【推荐】购买 200 元档位及以上专属节省计划**,购买入口:[购买节省计划](https://console.volcengine.com/common-buy/AI-SavingsPlans%7C%7Cd682ppeeq1mp7kd5q0e0)。 > * 已购买 Seedance 2.0 系列资源包且有可用余量 ([前往购买](https://console.volcengine.com/common-buy/fast/ark_bd%7C%7Cd682ppeeq1mp7kd5q0e0)) > > 详细规则见 [Seedance 2.5 与 Seedance 2.0 系列模型开通、使用与退订说明](/docs/seedance-model-activation-usage-and-refund)。 # 新手入门 本入门教程专为 **API 新手用户** 设计,帮助您一键搭建 Python 开发环境、完成虚拟环境创建和方舟 SDK 安装,并提供直接可运行的 Seedance 2.0 系列调用代码,您只需修改对应的输入素材,即可开始您的视频生成创作。 **1. 准备工作** 在开始之前,请确保您已经完成以下准备: 1. **注册账号**:确保您拥有火山引擎账号并已 [登录](https://console.volcengine.com/)。 2. **获取 API Key**:访问 [API Key 管理页面](https://ark.volcengine.com/region:cn-beijing/apikey),点击 **创建 API Key**,并复制保存您的 API Key。注意请妥善保管您的 API Key,不要泄露给他人。 3. [**开通模型**](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=model&projectName=default&tab=ComputerVision):请确保您的账户余额大于等于 200 元,或已 [购买资源包](https://console.volcengine.com/common-buy/fast/ark_bd%7C%7Cd682ppeeq1mp7kd5q0e0),否则无法开通 Seedance 2.0 系列模型。 4. **下载并解压文件**:点击下载下方附件,将其解压到您的本地目录(如桌面或“下载”文件夹)。 [ark_seedance2.0_quickstart_package.zip](https://arkdocs.tos-cn-beijing.volces.com/files/video-generation/ark_seedance2.0_quickstart_package_arkruntime-20260909.zip) **2.操作步骤** **选项:Windows 用户** 1. 进入 `scripts/init_dev_env` 目录。 2. 双击运行 `setup_windows.bat`。 3. 脚本会自动执行以下操作: * 下载 uv 工具。 * 自动下载 Python 3.12(如果不干扰您的系统 Python)。 * 创建虚拟环境 .`venv`。 * 安装方舟 SDK。 4. 完成后,在项目根目录会生成一个 `run_demo.bat`。 5. 双击 `run_demo.bat`,即可运行 Python SDK 示例代码(python/demo_standard.py)。 **选项:macOS 用户** 1. 打开终端,进入 `scripts/init_dev_env` 目录。 2. 运行构建脚本: ```Plain Text ./setup_mac.sh ``` 3. 脚本会自动配置好所有环境。 4. 完成后,在项目根目录会生成一个 `run_demo.sh`。 5. 运行 `./run_demo.sh` 即可运行 Python SDK 示例代码(python/demo_standard.py)。 **3.运行说明** 运行脚本后,您将看到如下流程: 1. **API Key 校验**:脚本会自动检测您本地是否配置了`ARK_API_KEY`环境变量。如果没有,会提示您手动输入。 2. **素材预览**:脚本会自动在您的默认浏览器中弹出一个本地生成的 HTML 页面,直观地展示本次任务的文本提示词、待替换的参考图片以及原始参考视频。 3. **任务创建与轮询**:脚本向火山方舟服务器发起异步请求。由于视频生成需要一定时间,控制台会每隔 30 秒打印一次任务状态(如 `running`等)。 4. **获取结果**:任务成功后,控制台会输出一段最终生成的视频 URL。您可以复制该链接到浏览器下载或在线播放。 **4.下一步** 在成功跑通本示例后,您可以尝试修改 `python/``demo_standard.py`,来打造您专属的视频生成任务: 1. 修改文本提示词 找到代码中的 `user_content` 变量,更改为您想要的画面描述。 2. 替换输入素材 (图片、视频、音频) 您可以将 `reference_image_url`、`reference_video_url` 和 `reference_audio_url` 替换为您自己的素材链接。 **注意**:请确保 URL 是公网可公开访问的链接(建议存放在 TOS 对象存储服务中,并配置为公共读)。 3. 继续学习下文中丰富的使用示例。 # 模型能力 Seedance 2.0 系列模型目前包括 Doubao Seedance 2.0(下文简称 Seedance 2.0)、Doubao Seedance 2.0 Fast(下文简称 Seedance 2.0 Fast)和 Doubao Seedance 2.0 Mini(下文简称 Seedance 2.0 Mini)。三者支持的功能基本一致,主要区别在于生成品质与成本的取舍: - 追求最高生成品质,推荐使用 Seedance 2.0; - 兼顾成本与生成速度,不要求极致品质,推荐使用 Seedance 2.0 Fast; - 追求更低成本,推荐使用 Seedance 2.0 Mini。 |模型名称 | |[Seedance 2.0](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seedance-2-0&projectName=default) |[Seedance 2.0 Fast](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seedance-2-0-fast&projectName=default) |[Seedance 2.0 Mini](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seedance-2-0-mini&projectName=default) | |---|---|---|---|---| |Model ID | |doubao-seedance-2-0-260128 |doubao-seedance-2-0-fast-260128 |doubao-seedance-2-0-mini-260615 | \ | | | | | | |[文生视频](/docs/video-generation-tutorial#4e74bcee) | |✓ |✓ |✓ | |[图生视频-首帧](/docs/video-generation-tutorial#979b2d28) | |✓ |✓ |✓ | |[图生视频-首尾帧](/docs/video-generation-tutorial#0d55ca07) | |✓ |✓ |✓ | |[全模态参考](/docs/seedance-2-0#50e1b4ea)【New】 |图片参考 |✓ |✓ |✓ | |^^| | | | | \ | |视频参考 |✓ |✓ |✓ | |^^| | | | | \ | |组合参考 |✓ |✓ |✓ | \ | | | | | | \ | |* 图片 + 音频 | | | | \ | |* 图片 + 视频 | | | | \ | |* 视频 + 音频 | | | | \ | |* 图片 + 视频 + 音频 | | | | |[编辑视频](/docs/seedance-2-0#75a28782)【New】 | |✓ |✓ |✓ | |[延长视频](/docs/seedance-2-0#46d77653)【New】 | |✓ |✓ |✓ | |[生成有声视频](/docs/video-generation-tutorial#979b2d28) | |✓ |✓ |✓ | \ |> "generate_audio": "true" | | | | | |[联网搜索工具](/docs/seedance-2-0#c40ed3ef)【New】 | |✓ |✓ |✓ | |[样片模式](/docs/video-generation-tutorial#5acd28c8) | |✗ |✗ |✗ | |[返回视频产物对应的尾帧图](/docs/video-generation-tutorial#141cf7fa) | |✓ |✓ |✓ | \ |> "return_last_frame": | | | | | \ |> "true" | | | | | |[输出视频规格](/docs/video-generation-tutorial#9fe4cce0) |输出分辨率 |* 480p(8bit 位深) |* 480p(8bit 位深) |* 480p(8bit 位深) | \ | | |* 720p(8bit 位深) |* 720p(8bit 位深) |* 720p(8bit 位深) | \ | | |* 1080p(8bit 位深) | | | \ | | |* 4k(10bit 位深) | | | \ | |> "resolution": "720p" | | | | | |输出宽高比 |21:9, 16:9, 4:3, |21:9, 16:9, 4:3, |21:9, 16:9, 4:3, | \ | |> "ratio":"16:9" | 1:1, 3:4, 9:16 | 1:1, 3:4, 9:16 | 1:1, 3:4, 9:16 | | |输出时长 |4~15 秒 |4~15 秒 |4~15 秒 | \ | |> "duration": 5 | | | | | |输出视频格式 |mp4 |mp4 |mp4 | |[离线推理](/docs/video-generation-tutorial#c3588bd1) | |✗ |✗ |✗ | \ |> "service_tier": "flex" | | | | | |在线推理限流 |最大 RPM |非 4k 分辨率: |* 企业用户:600 |* 企业用户:600 | \ | | |* 企业用户:600 |* 个人用户:180 |* 个人用户:180 | \ | | |* 个人用户:180 | | | \ | | | | | | \ | | |4k 分辨率: | | | \ | | |* 企业用户:15 | | | \ | | |* 个人用户:15 | | | | |最大并发数 |非 4k 分辨率: |* 企业用户:10 |* 企业用户:10 | \ | | |* 企业用户:10 |* 个人用户:3 |* 个人用户:3 | \ | | |* 个人用户:3 | | | \ | | | | | | \ | | |4k 分辨率: | | | \ | | |* 企业用户:1 | | | \ | | |* 个人用户:1 | | | |离线推理限流 |TPD |\- |\- |\- | # 基础使用 ## 全模态参考 输入文本、参考图、视频(可带音轨)和音频等内容,来生成一段新视频。可继承参考图片的角色形象、视觉风格、画面构图;参考视频的主体内容、运镜方式、动作表现、整体风格;以及参考音频的音色、音乐旋律、对话内容等核心信息。 效果预览如下(访问 [模型卡片](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seedance-2-0) 查看更多示例): |输入:文本 |输入:图片、视频、音频 |输出 | |---|---|---| |全程使用**视频1**的第一视角构图,全程使用**音频1**作为背景音乐。第一人称视角果茶宣传广告,seedance牌「苹苹安安」苹果果茶限定款;首帧为**图片1**,你的手摘下一颗带晨露的阿克苏红苹果,清脆的苹果碰撞声;2-4 秒:快速切镜,你的手将苹果块投入雪克杯,加入冰块与茶底,用力摇晃,冰块碰撞声与摇晃声卡点轻快鼓点,背景音:「鲜切现摇」;4-6 秒:第一人称成品特写,分层果茶倒入透明杯,你的手轻挤奶盖在顶部铺展,在杯身贴上粉红包标,镜头拉近看奶盖与果茶的分层纹理;6-8 秒:第一人称手持举杯,你将**图片2**中的果茶举到镜头前(模拟递到观众面前的视角),杯身标签清晰可见,背景音「来一口鲜爽」,尾帧定格为**图片2**。背景声音统一为女生音色。 |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/0ba05cd435f543c5bc65c378d94d094a) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/dab46ce2289a4a8ead76711bb02f2e1d) | \ | | | | \ | | | | \ | |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/37ef4b6af8944a6d9b54ef1c541c1b0e~tplv-goo7wpa0wc-image.image) | | \ | | | | \ | |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/7b904d6b46d24f059de7697620058b7f~tplv-goo7wpa0wc-image.image) | | \ | | | | \ | | | | **选项:Python** ```Python import os import time # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark client = Ark( # The base URL for model invocation base_url='https://ark.cn-beijing.volces.com/api/v3', # Get API Key:https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.environ.get("ARK_API_KEY"), ) if __name__ == "__main__": print("----- create request -----") create_result = client.content_generation.tasks.create( model="doubao-seedance-2-0-260128", # Replace with Model ID content=[ { "type": "text", "text": "全程使用视频1的第一视角构图,全程使用音频1作为背景音乐。第一人称视角果茶宣传广告,seedance牌「苹苹安安」苹果果茶限定款;首帧为图片1,你的手摘下一颗带晨露的阿克苏红苹果,轻脆的苹果碰撞声;2-4 秒:快速切镜,你的手将苹果块投入雪克杯,加入冰块与茶底,用力摇晃,冰块碰撞声与摇晃声卡点轻快鼓点,背景音:「鲜切现摇」;4-6 秒:第一人称成品特写,分层果茶倒入透明杯,你的手轻挤奶盖在顶部铺展,在杯身贴上粉红包标,镜头拉近看奶盖与果茶的分层纹理;6-8 秒:第一人称手持举杯,你将图片2中的果茶举到镜头前(模拟递到观众面前的视角),杯身标签清晰可见,背景音「来一口鲜爽」,尾帧定格为图片2。背景声音统一为女生音色。", }, { "type": "image_url", "image_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/r2v_tea_pic1-zh.jpg" }, "role": "reference_image", }, { "type": "image_url", "image_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/r2v_tea_pic2-zh.jpg" }, "role": "reference_image", }, { "type": "video_url", "video_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/r2v_tea_video1.mp4" }, "role": "reference_video", }, { "type": "audio_url", "audio_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/files/video-generation/r2v_tea_audio1.mp3" }, "role": "reference_audio", }, ], generate_audio=True, ratio="16:9", duration=11, watermark=True, ) print(create_result) # Polling query section print("----- polling task status -----") task_id = create_result.id while True: get_result = client.content_generation.tasks.get(task_id=task_id) status = get_result.status if status == "succeeded": print("----- task succeeded -----") print(get_result) break elif status == "failed": print("----- task failed -----") print(f"Error: {get_result.error}") break else: print(f"Current status: {status}, Retrying after 30 seconds...") time.sleep(30) ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.content_generation.*; import com.volcengine.ark.runtime.service.ArkService; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; public class ContentGenerationTaskExample { // Client initialization static String apiKey = System.getenv("ARK_API_KEY"); static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); static Dispatcher dispatcher = new Dispatcher(); static ArkService service = ArkService.builder() .baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .build(); public static void main(String[] args) { // Model ID final String modelId = "doubao-seedance-2-0-260128"; // Text prompt final String prompt = "全程使用视频1的第一视角构图,全程使用音频1作为背景音乐。第一人称视角果茶宣传广告,seedance牌「苹苹安安」苹果果茶限定款;" + "首帧为图片1,你的手摘下一颗带晨露的阿克苏红苹果,轻脆的苹果碰撞声;" + "2-4 秒:快速切镜,你的手将苹果块投入雪克杯,加入冰块与茶底,用力摇晃,冰块碰撞声与摇晃声卡点轻快鼓点,背景音:「鲜切现摇」;" + "4-6 秒:第一人称成品特写,分层果茶倒入透明杯,你的手轻挤奶盖在顶部铺展,在杯身贴上粉红包标,镜头拉近看奶盖与果茶的分层纹理;" + "6-8 秒:第一人称手持举杯,你将图片2中的果茶举到镜头前(模拟递到观众面前的视角),杯身标签清晰可见,背景音「来一口鲜爽」,尾帧定格为图片2。" + "背景声音统一为女生音色。"; // Example resource URLs final String refImage1 = "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/r2v_tea_pic1-zh.jpg"; final String refImage2 = "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/r2v_tea_pic2-zh.jpg"; final String refVideo = "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/r2v_tea_video1.mp4"; final String refAudio = "https://arkdocs.tos-cn-beijing.volces.com/files/video-generation/r2v_tea_audio1.mp3"; // Output video parameters final boolean generateAudio = true; final String videoRatio = "16:9"; final long videoDuration = 11L; final boolean showWatermark = true; System.out.println("----- create request -----"); // Build request content List contents = new ArrayList<>(); // 1. Text prompt contents.add(ContentItem.builder() .type(ContentType.TEXT) .text(prompt) .build()); // 2. Reference image 1 contents.add(ContentItem.builder() .type(ContentType.IMAGE_URL) .imageUrl(ImageURL.builder() .url(refImage1) .build()) .role("reference_image") .build()); // 3. Reference image 2 contents.add(ContentItem.builder() .type(ContentType.IMAGE_URL) .imageUrl(ImageURL.builder() .url(refImage2) .build()) .role("reference_image") .build()); // 4. Reference video contents.add(ContentItem.builder() .type(ContentType.VIDEO_URL) .videoUrl(VideoURL.builder() .url(refVideo) .build()) .role("reference_video") .build()); // 5. Reference audio contents.add(ContentItem.builder() .type(ContentType.AUDIO_URL) .audioUrl(AudioURL.builder() .url(refAudio) .build()) .role("reference_audio") .build()); // Create video generation task CreateContentGenerationTaskRequest createRequest = CreateContentGenerationTaskRequest.builder() .generateAudio(generateAudio) .model(modelId) .content(contents) .ratio(videoRatio) .duration(videoDuration) .watermark(showWatermark) .build(); CreateContentGenerationTaskResponse createResult = service.createContentGenerationTask(createRequest); System.out.println("Task Created: " + createResult); // Get task details and poll status String taskId = createResult.getId(); pollTaskStatus(taskId); } /** * Poll task status * @param taskId Task ID */ private static void pollTaskStatus(String taskId) { String getRequest = taskId; System.out.println("----- polling task status -----"); try { while (true) { ContentGenerationTask getResponse = service.getContentGenerationTask(getRequest); String status = getResponse.getStatus().toString(); if ("succeeded".equalsIgnoreCase(status)) { System.out.println("----- task succeeded -----"); System.out.println(getResponse); break; } else if ("failed".equalsIgnoreCase(status)) { System.out.println("----- task failed -----"); if (getResponse.getError() != null) { System.out.println("Error: " + getResponse.getError().getMessage()); } break; } else { System.out.printf("Current status: %s, Retrying in 10 seconds...%n", status); TimeUnit.SECONDS.sleep(10); } } } catch (InterruptedException ie) { Thread.currentThread().interrupt(); System.err.println("Polling interrupted"); } catch (Exception e) { System.err.println("Error occurred: " + e.getMessage()); } finally { service.shutdownExecutor(); } } } ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "time" "github.com/volcengine/ark-runtime-go/arkruntime" model "github.com/volcengine/ark-runtime-go/arkruntime/model/contentgeneration" ) func main() { // Initialize Ark client client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), // The base URL for model invocation arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() // Model ID modelID := "doubao-seedance-2-0-260128" // Text prompt prompt := "全程使用视频1的第一视角构图,全程使用音频1作为背景音乐。第一人称视角果茶宣传广告,seedance牌「苹苹安安」苹果果茶限定款;" + "首帧为图片1,你的手摘下一颗带晨露的阿克苏红苹果,轻脆的苹果碰撞声;" + "2-4 秒:快速切镜,你的手将苹果块投入雪克杯,加入冰块与茶底,用力摇晃,冰块碰撞声与摇晃声卡点轻快鼓点,背景音:「鲜切现摇」;" + "4-6 秒:第一人称成品特写,分层果茶倒入透明杯,你的手轻挤奶盖在顶部铺展,在杯身贴上粉红包标,镜头拉近看奶盖与果茶的分层纹理;" + "6-8 秒:第一人称手持举杯,你将图片2中的果茶举到镜头前(模拟递到观众面前的视角),杯身标签清晰可见,背景音「来一口鲜爽」,尾帧定格为图片2。" + "背景声音统一为女生音色。" // Example resource URLs refImage1 := "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/r2v_tea_pic1-zh.jpg" refImage2 := "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/r2v_tea_pic2-zh.jpg" refVideo := "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/r2v_tea_video1.mp4" refAudio := "https://arkdocs.tos-cn-beijing.volces.com/files/video-generation/r2v_tea_audio1.mp3" // Output video parameters generateAudio := true videoRatio := "16:9" videoDuration := int64(11) showWatermark := true // 1. Create video generation task fmt.Println("----- create request -----") createReq := &model.CreateContentGenerationTaskRequest{ Model: modelID, GenerateAudio: model.NewOptBool(generateAudio), Ratio: model.NewOptString(videoRatio), Duration: model.NewOptInt64(videoDuration), Watermark: model.NewOptBool(showWatermark), Content: []model.ContentItem{ { Type: model.ContentTypeText, Text: model.NewOptString(prompt), }, { Type: model.ContentTypeImageURL, ImageURL: model.NewOptImageURL(model.ImageURL{ URL: refImage1, }), Role: model.NewOptString("reference_image"), }, { Type: model.ContentTypeImageURL, ImageURL: model.NewOptImageURL(model.ImageURL{ URL: refImage2, }), Role: model.NewOptString("reference_image"), }, { Type: model.ContentTypeVideoURL, VideoURL: model.NewOptVideoURL(model.VideoURL{ URL: refVideo, }), Role: model.NewOptString("reference_video"), }, { Type: model.ContentTypeAudioURL, AudioURL: model.NewOptAudioURL(model.AudioURL{ URL: refAudio, }), Role: model.NewOptString("reference_audio"), }, }, } createResp, err := client.CreateContentGenerationTask(ctx, createReq) if err != nil { fmt.Printf("create content generation error: %v\n", err) return } taskID := createResp.ID fmt.Printf("Task Created with ID: %s\n", taskID) // 2. Poll task status pollTaskStatus(ctx, client, taskID) } // poll task status func pollTaskStatus(ctx context.Context, client *arkruntime.Client, taskID string) { fmt.Println("----- polling task status -----") for { getReq := taskID getResp, err := client.GetContentGenerationTask(ctx, getReq) if err != nil { fmt.Printf("get content generation task error: %v\n", err) return } status := getResp.Status if status == "succeeded" { fmt.Println("----- task succeeded -----") fmt.Printf("Task ID: %s \n", getResp.ID) fmt.Printf("Model: %s \n", getResp.Model) fmt.Printf("Video URL: %s \n", getResp.Content.Or(model.TaskContent{}).VideoURL.Or("")) fmt.Printf("Completion Tokens: %d \n", getResp.Usage.Or(model.TaskUsage{}).CompletionTokens) fmt.Printf("Created At: %d, Updated At: %d\n", getResp.CreatedAt.Or(0), getResp.UpdatedAt.Or(0)) return } else if status == "failed" { fmt.Println("----- task failed -----") if getResp.Error.IsSet() { fmt.Printf("Error Code: %s, Message: %s\n", getResp.Error.Value.Code, getResp.Error.Value.Message) } return } else { fmt.Printf("Current status: %s, Retrying in 10 seconds... \n", status) time.Sleep(10 * time.Second) } } } ``` > **说明** > > * 您可任意组合以下模态内容,注意不支持“文本+音频”、“纯音频” 输入。 > > * 文本 > > * 图片:0~9 张 > > * 视频:0~3 个 > > * 音频:0~3 个 > * **进阶用法**:全模态生视频可通过提示词指定参考图片作为首帧/尾帧,间接实现“首尾帧+全模态参考”效果。若需严格保障首尾帧和指定图片一致,**优先使用图生视频-首尾帧**(配置 role 为 first_frame/last_frame)。 > * 各个模态信息输入要求参见 [全模态输入](/docs/seedance-2-0#50e1b4ea)。 ## 编辑视频 您可以提供待编辑的视频、参考图片或音频,并结合使用提示词,完成多种视频编辑任务,例如:替换视频主体、视频中对象增删改、局部画面重绘/修复等。 效果预览如下(访问 [模型卡片](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seedance-2-0) 查看更多示例): |输入:文本 |输入:视频&图片 |输出 | |---|---|---| |将**视频1**礼盒中的香水替换成**图像1**中的面霜,运镜不变 |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/0a1afd3250d84b8995e9c0aa61b57d38) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/fd7bcf4eaf504f50aeeebd48ce35c06a) | \ | | | | \ | | | | \ | | | | \ | |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/791b783fc6cd4394b13f41b66b5ff461~tplv-goo7wpa0wc-image.image) | | **选项:Python** ```Python import os import time # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark client = Ark( # The base URL for model invocation base_url='https://ark.cn-beijing.volces.com/api/v3', # Get API Key:https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.environ.get("ARK_API_KEY"), ) if __name__ == "__main__": print("----- create request -----") create_result = client.content_generation.tasks.create( model="doubao-seedance-2-0-260128", # Replace with Model ID content=[ { "type": "text", "text": "将视频1礼盒中的香水替换成图片1中的面霜,运镜不变", }, { "type": "image_url", "image_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/r2v_edit_pic1.jpg" }, "role": "reference_image", }, { "type": "video_url", "video_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/r2v_edit_video1.mp4" }, "role": "reference_video", }, ], generate_audio=True, ratio="16:9", duration=5, watermark=True, ) print(create_result) # Polling query section print("----- polling task status -----") task_id = create_result.id while True: get_result = client.content_generation.tasks.get(task_id=task_id) status = get_result.status if status == "succeeded": print("----- task succeeded -----") print(get_result) break elif status == "failed": print("----- task failed -----") print(f"Error: {get_result.error}") break else: print(f"Current status: {status}, Retrying after 30 seconds...") time.sleep(30) ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.content_generation.*; import com.volcengine.ark.runtime.service.ArkService; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; public class ContentGenerationTaskExample { // Client initialization static String apiKey = System.getenv("ARK_API_KEY"); static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); static Dispatcher dispatcher = new Dispatcher(); static ArkService service = ArkService.builder() .baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .build(); public static void main(String[] args) { // Model ID final String modelId = "doubao-seedance-2-0-260128"; // Text prompt final String prompt = "将视频1礼盒中的香水替换成图片1中的面霜,运镜不变"; // Example resource URLs final String refImage1 = "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/r2v_edit_pic1.jpg"; final String refVideo = "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/r2v_edit_video1.mp4"; // Output video parameters final boolean generateAudio = true; final String videoRatio = "16:9"; final long videoDuration = 5L; final boolean showWatermark = true; System.out.println("----- create request -----"); // Build request content List contents = new ArrayList<>(); // 1. Text prompt contents.add(ContentItem.builder() .type(ContentType.TEXT) .text(prompt) .build()); // 2. Reference image 1 contents.add(ContentItem.builder() .type(ContentType.IMAGE_URL) .imageUrl(ImageURL.builder() .url(refImage1) .build()) .role("reference_image") .build()); // 3. Reference video contents.add(ContentItem.builder() .type(ContentType.VIDEO_URL) .videoUrl(VideoURL.builder() .url(refVideo) .build()) .role("reference_video") .build()); // Create video generation task CreateContentGenerationTaskRequest createRequest = CreateContentGenerationTaskRequest.builder() .generateAudio(generateAudio) .model(modelId) .content(contents) .ratio(videoRatio) .duration(videoDuration) .watermark(showWatermark) .build(); CreateContentGenerationTaskResponse createResult = service.createContentGenerationTask(createRequest); System.out.println("Task Created: " + createResult); // Get task details and poll status String taskId = createResult.getId(); pollTaskStatus(taskId); } /** * Poll task status * @param taskId Task ID */ private static void pollTaskStatus(String taskId) { String getRequest = taskId; System.out.println("----- polling task status -----"); try { while (true) { ContentGenerationTask getResponse = service.getContentGenerationTask(getRequest); String status = getResponse.getStatus().toString(); if ("succeeded".equalsIgnoreCase(status)) { System.out.println("----- task succeeded -----"); System.out.println(getResponse); break; } else if ("failed".equalsIgnoreCase(status)) { System.out.println("----- task failed -----"); if (getResponse.getError() != null) { System.out.println("Error: " + getResponse.getError().getMessage()); } break; } else { System.out.printf("Current status: %s, Retrying in 10 seconds...%n", status); TimeUnit.SECONDS.sleep(10); } } } catch (InterruptedException ie) { Thread.currentThread().interrupt(); System.err.println("Polling interrupted"); } catch (Exception e) { System.err.println("Error occurred: " + e.getMessage()); } finally { service.shutdownExecutor(); } } } ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "time" "github.com/volcengine/ark-runtime-go/arkruntime" model "github.com/volcengine/ark-runtime-go/arkruntime/model/contentgeneration" ) func main() { // Initialize Ark client client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), // The base URL for model invocation arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() // Model ID modelID := "doubao-seedance-2-0-260128" // Text prompt prompt := "将视频1礼盒中的香水替换成图片1中的面霜,运镜不变" // Example resource URLs refImage1 := "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/r2v_edit_pic1.jpg" refVideo1 := "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/r2v_edit_video1.mp4" // Output video parameters generateAudio := true videoRatio := "16:9" videoDuration := int64(5) showWatermark := true // 1. Create video generation task fmt.Println("----- create request -----") createReq := &model.CreateContentGenerationTaskRequest{ Model: modelID, GenerateAudio: model.NewOptBool(generateAudio), Ratio: model.NewOptString(videoRatio), Duration: model.NewOptInt64(videoDuration), Watermark: model.NewOptBool(showWatermark), Content: []model.ContentItem{ { Type: model.ContentTypeText, Text: model.NewOptString(prompt), }, { Type: model.ContentTypeImageURL, ImageURL: model.NewOptImageURL(model.ImageURL{ URL: refImage1, }), Role: model.NewOptString("reference_image"), }, { Type: model.ContentTypeVideoURL, VideoURL: model.NewOptVideoURL(model.VideoURL{ URL: refVideo1, }), Role: model.NewOptString("reference_video"), }, }, } createResp, err := client.CreateContentGenerationTask(ctx, createReq) if err != nil { fmt.Printf("create content generation error: %v\n", err) return } taskID := createResp.ID fmt.Printf("Task Created with ID: %s\n", taskID) // 2. Poll task status pollTaskStatus(ctx, client, taskID) } // poll task status func pollTaskStatus(ctx context.Context, client *arkruntime.Client, taskID string) { fmt.Println("----- polling task status -----") for { getReq := taskID getResp, err := client.GetContentGenerationTask(ctx, getReq) if err != nil { fmt.Printf("get content generation task error: %v\n", err) return } status := getResp.Status if status == "succeeded" { fmt.Println("----- task succeeded -----") fmt.Printf("Task ID: %s \n", getResp.ID) fmt.Printf("Model: %s \n", getResp.Model) fmt.Printf("Video URL: %s \n", getResp.Content.Or(model.TaskContent{}).VideoURL.Or("")) fmt.Printf("Completion Tokens: %d \n", getResp.Usage.Or(model.TaskUsage{}).CompletionTokens) fmt.Printf("Created At: %d, Updated At: %d\n", getResp.CreatedAt.Or(0), getResp.UpdatedAt.Or(0)) return } else if status == "failed" { fmt.Println("----- task failed -----") if getResp.Error.IsSet() { fmt.Printf("Error Code: %s, Message: %s\n", getResp.Error.Value.Code, getResp.Error.Value.Message) } return } else { fmt.Printf("Current status: %s, Retrying in 10 seconds... \n", status) time.Sleep(10 * time.Second) } } } ``` ## 延长视频 在原有视频基础上,向前或者向后延长视频,或多个视频片段(最多 3 个视频片段)串联成一个连贯视频。 效果预览如下(访问 [模型卡片](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seedance-2-0) 查看更多示例): |输入:文本 |输入:待延长视频 |输出 | |---|---|---| |**视频1**中的拱形窗户打开,进入美术馆室内,接**视频2**,之后镜头进入画内,接**视频3** |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/54519ff7266d4f1caa12b8cc95e2dd1d) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/849b3f86f609495ca09d559aa14c79ed) | \ | | | | \ | | | | \ | | | | \ | |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/b15d56c80c884faa8526beb6ca540b98) | | \ | | | | \ | | | | \ | | | | \ | |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/f5d327311e094361b15dca0a37b14ab4) | | **选项:Python** ```Python import os import time # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark client = Ark( # The base URL for model invocation base_url='https://ark.cn-beijing.volces.com/api/v3', # Get API Key:https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.environ.get("ARK_API_KEY"), ) if __name__ == "__main__": print("----- create request -----") create_result = client.content_generation.tasks.create( model="doubao-seedance-2-0-260128", # Replace with Model ID content=[ { "type": "text", "text": "视频1中的拱形窗户打开,进入美术馆室内,接视频2,之后镜头进入画内,接视频3", }, { "type": "video_url", "video_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/r2v_extend_video1.mp4" }, "role": "reference_video", }, { "type": "video_url", "video_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/r2v_extend_video2.mp4" }, "role": "reference_video", }, { "type": "video_url", "video_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/r2v_extend_video3.mp4" }, "role": "reference_video", }, ], generate_audio=True, ratio="16:9", duration=8, watermark=True, ) print(create_result) # Polling query section print("----- polling task status -----") task_id = create_result.id while True: get_result = client.content_generation.tasks.get(task_id=task_id) status = get_result.status if status == "succeeded": print("----- task succeeded -----") print(get_result) break elif status == "failed": print("----- task failed -----") print(f"Error: {get_result.error}") break else: print(f"Current status: {status}, Retrying after 30 seconds...") time.sleep(30) ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.content_generation.*; import com.volcengine.ark.runtime.service.ArkService; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; public class ContentGenerationTaskExample { // Client initialization static String apiKey = System.getenv("ARK_API_KEY"); static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); static Dispatcher dispatcher = new Dispatcher(); static ArkService service = ArkService.builder() .baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .build(); public static void main(String[] args) { // Model ID final String modelId = "doubao-seedance-2-0-260128"; // Text prompt final String prompt = "视频1中的拱形窗户打开,进入美术馆室内,接视频2,之后镜头进入画内,接视频3"; // Example resource URLs final String refVideo1 = "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/r2v_extend_video1.mp4"; final String refVideo2 = "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/r2v_extend_video2.mp4"; final String refVideo3 = "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/r2v_extend_video3.mp4"; // Output video parameters final boolean generateAudio = true; final String videoRatio = "16:9"; final long videoDuration = 8L; final boolean showWatermark = true; System.out.println("----- create request -----"); // Build request content List contents = new ArrayList<>(); // 1. Text prompt contents.add(ContentItem.builder() .type(ContentType.TEXT) .text(prompt) .build()); // 2. Reference video 1 contents.add(ContentItem.builder() .type(ContentType.VIDEO_URL) .videoUrl(VideoURL.builder() .url(refVideo1) .build()) .role("reference_video") .build()); // 3. Reference video 2 contents.add(ContentItem.builder() .type(ContentType.VIDEO_URL) .videoUrl(VideoURL.builder() .url(refVideo2) .build()) .role("reference_video") .build()); // 4. Reference video 3 contents.add(ContentItem.builder() .type(ContentType.VIDEO_URL) .videoUrl(VideoURL.builder() .url(refVideo3) .build()) .role("reference_video") .build()); // Create video generation task CreateContentGenerationTaskRequest createRequest = CreateContentGenerationTaskRequest.builder() .generateAudio(generateAudio) .model(modelId) .content(contents) .ratio(videoRatio) .duration(videoDuration) .watermark(showWatermark) .build(); CreateContentGenerationTaskResponse createResult = service.createContentGenerationTask(createRequest); System.out.println("Task Created: " + createResult); // Get task details and poll status String taskId = createResult.getId(); pollTaskStatus(taskId); } /** * Poll task status * @param taskId Task ID */ private static void pollTaskStatus(String taskId) { String getRequest = taskId; System.out.println("----- polling task status -----"); try { while (true) { ContentGenerationTask getResponse = service.getContentGenerationTask(getRequest); String status = getResponse.getStatus().toString(); if ("succeeded".equalsIgnoreCase(status)) { System.out.println("----- task succeeded -----"); System.out.println(getResponse); break; } else if ("failed".equalsIgnoreCase(status)) { System.out.println("----- task failed -----"); if (getResponse.getError() != null) { System.out.println("Error: " + getResponse.getError().getMessage()); } break; } else { System.out.printf("Current status: %s, Retrying in 10 seconds...%n", status); TimeUnit.SECONDS.sleep(10); } } } catch (InterruptedException ie) { Thread.currentThread().interrupt(); System.err.println("Polling interrupted"); } catch (Exception e) { System.err.println("Error occurred: " + e.getMessage()); } finally { service.shutdownExecutor(); } } } ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "time" "github.com/volcengine/ark-runtime-go/arkruntime" model "github.com/volcengine/ark-runtime-go/arkruntime/model/contentgeneration" ) func main() { // Initialize Ark client client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), // The base URL for model invocation arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() // Model ID modelID := "doubao-seedance-2-0-260128" // Text prompt prompt := "视频1中的拱形窗户打开,进入美术馆室内,接视频2,之后镜头进入画内,接视频3" // Example resource URLs refVideo1 := "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/r2v_extend_video1.mp4" refVideo2 := "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/r2v_extend_video2.mp4" refVideo3 := "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/r2v_extend_video3.mp4" // Output video parameters generateAudio := true videoRatio := "16:9" videoDuration := int64(8) showWatermark := true // 1. Create video generation task fmt.Println("----- create request -----") createReq := &model.CreateContentGenerationTaskRequest{ Model: modelID, GenerateAudio: model.NewOptBool(generateAudio), Ratio: model.NewOptString(videoRatio), Duration: model.NewOptInt64(videoDuration), Watermark: model.NewOptBool(showWatermark), Content: []model.ContentItem{ { Type: model.ContentTypeText, Text: model.NewOptString(prompt), }, { Type: model.ContentTypeVideoURL, VideoURL: model.NewOptVideoURL(model.VideoURL{ URL: refVideo1, }), Role: model.NewOptString("reference_video"), }, { Type: model.ContentTypeVideoURL, VideoURL: model.NewOptVideoURL(model.VideoURL{ URL: refVideo2, }), Role: model.NewOptString("reference_video"), }, { Type: model.ContentTypeVideoURL, VideoURL: model.NewOptVideoURL(model.VideoURL{ URL: refVideo3, }), Role: model.NewOptString("reference_video"), }, }, } createResp, err := client.CreateContentGenerationTask(ctx, createReq) if err != nil { fmt.Printf("create content generation error: %v\n", err) return } taskID := createResp.ID fmt.Printf("Task Created with ID: %s\n", taskID) // 2. Poll task status pollTaskStatus(ctx, client, taskID) } // poll task status func pollTaskStatus(ctx context.Context, client *arkruntime.Client, taskID string) { fmt.Println("----- polling task status -----") for { getReq := taskID getResp, err := client.GetContentGenerationTask(ctx, getReq) if err != nil { fmt.Printf("get content generation task error: %v\n", err) return } status := getResp.Status if status == "succeeded" { fmt.Println("----- task succeeded -----") fmt.Printf("Task ID: %s \n", getResp.ID) fmt.Printf("Model: %s \n", getResp.Model) fmt.Printf("Video URL: %s \n", getResp.Content.Or(model.TaskContent{}).VideoURL.Or("")) fmt.Printf("Completion Tokens: %d \n", getResp.Usage.Or(model.TaskUsage{}).CompletionTokens) fmt.Printf("Created At: %d, Updated At: %d\n", getResp.CreatedAt.Or(0), getResp.UpdatedAt.Or(0)) return } else if status == "failed" { fmt.Println("----- task failed -----") if getResp.Error.IsSet() { fmt.Printf("Error Code: %s, Message: %s\n", getResp.Error.Value.Code, getResp.Error.Value.Message) } return } else { fmt.Printf("Current status: %s, Retrying in 10 seconds... \n", status) time.Sleep(10 * time.Second) } } } ``` > **说明** > > * 向前或向后延长 1 段视频,生成的视频一般只包含原视频的尾部画面。但您也可以通过提示词灵活控制,使其包含原视频内容。 例如:向前延长视频1,[延长内容描述...],**最后接视频1**。 > * 传入 2~3 段视频,补全中间过渡部分,生成的视频会包含原视频内容和新生成的视频内容。 ## 输出 4k 视频 > 仅 Seedance 2.0 支持 Seedance 2.0 支持输出 4k 视频,并采用 10bit 位深编码,能够完整保留丰富的色彩层次与平滑的渐变过渡,满足专业影视制作与 HDR 视频内容的要求。 > **注意** > > 4k 视频采用 H.265/HEVC 编码格式输出,部分播放器或浏览器可能无法直接播放,详见 [10bit 位深与 H.265/HEVC 编码视频播放兼容性说明](/docs/seedance-2-0#4k_player)。 |效果预览1 |效果预览2 | |---|---| |[视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance-4k-makeup-music.mov) |[视频](https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance-4k-motorcycle-music.mov) | > 注:效果展示视频由 Seedance 2.0 生成的多个分镜拼接而成,非下述示例代码直接生成。 **选项:Python** ```Python import os import time # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark client = Ark( # The base URL for model invocation base_url='https://ark.cn-beijing.volces.com/api/v3', # Get API Key:https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.environ.get("ARK_API_KEY"), ) if __name__ == "__main__": print("----- create request -----") create_result = client.content_generation.tasks.create( model="doubao-seedance-2-0-260128", content=[ { "type": "text", "text": "生成一段15秒的越野摩托竞技广告感短片。参考图片作为中段飞跃高潮的参考。镜头逻辑依次为:1)中景跟拍,车手从远处沿土坡高速逼近跳台;2)超近低机位后轮飞砂特写,轮胎抓地甩出大量泥土和砂石;3)中近景展示骑手控车、手部发力、悬挂压缩与机械震动;4)侧向英雄中景拍车手冲坡腾空飞跃,画面状态接近图一,泥土在逆光中大面积飞散;5)腾空近景帅气细节,突出头盔护目镜、手部控把、轮胎悬空或车身侧面局部;6)中景跟拍落地,悬挂压缩回弹,随后继续沿土坡赛道高速冲刺收尾。全片同一名骑手、同一辆车、同一条赛道,镜头景别和角度区分清楚,不重复,动作连贯,画面有真实越野跟拍抖动感、速度感、扬土感和夕阳逆光竞技氛围。", }, { "type": "image_url", "image_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/i2v_4k.png" }, "role": "reference_image", }, ], generate_audio=True, resolution="4k", ratio="adaptive", duration=15, watermark=True, ) print(create_result) # Polling query section print("----- polling task status -----") task_id = create_result.id while True: get_result = client.content_generation.tasks.get(task_id=task_id) status = get_result.status if status == "succeeded": print("----- task succeeded -----") print(get_result) break elif status == "failed": print("----- task failed -----") print(f"Error: {get_result.error}") break else: print(f"Current status: {status}, Retrying after 30 seconds...") time.sleep(30) ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.content_generation.*; import com.volcengine.ark.runtime.service.ArkService; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; public class ContentGenerationTaskExample { // Client initialization static String apiKey = System.getenv("ARK_API_KEY"); static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); static Dispatcher dispatcher = new Dispatcher(); static ArkService service = ArkService.builder() .baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .build(); public static void main(String[] args) { // Model ID final String modelId = "doubao-seedance-2-0-260128"; // Text prompt final String prompt = "生成一段15秒的越野摩托竞技广告感短片。参考图片作为中段飞跃高潮的参考。" + "镜头逻辑依次为:1)中景跟拍,车手从远处沿土坡高速逼近跳台;" + "2)超近低机位后轮飞砂特写,轮胎抓地甩出大量泥土和砂石;" + "3)中近景展示骑手控车、手部发力、悬挂压缩与机械震动;" + "4)侧向英雄中景拍车手冲坡腾空飞跃,画面状态接近图一,泥土在逆光中大面积飞散;" + "5)腾空近景帅气细节,突出头盔护目镜、手部控把、轮胎悬空或车身侧面局部;" + "6)中景跟拍落地,悬挂压缩回弹,随后继续沿土坡赛道高速冲刺收尾。" + "全片同一名骑手、同一辆车、同一条赛道,镜头景别和角度区分清楚,不重复,动作连贯,画面有真实越野跟拍抖动感、速度感、扬土感和夕阳逆光竞技氛围。"; // Example resource URLs final String refImage = "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/i2v_4k.png"; // Output video parameters final boolean generateAudio = true; final String videoResolution = "4k"; final String videoRatio = "adaptive"; final long videoDuration = 15L; final boolean showWatermark = true; System.out.println("----- create request -----"); // Build request content List contents = new ArrayList<>(); // 1. Text prompt contents.add(ContentItem.builder() .type(ContentType.TEXT) .text(prompt) .build()); // 2. Reference image contents.add(ContentItem.builder() .type(ContentType.IMAGE_URL) .imageUrl(ImageURL.builder() .url(refImage) .build()) .role("reference_image") .build()); // Create video generation task CreateContentGenerationTaskRequest createRequest = CreateContentGenerationTaskRequest.builder() .generateAudio(generateAudio) .model(modelId) .content(contents) .resolution(videoResolution) .ratio(videoRatio) .duration(videoDuration) .watermark(showWatermark) .build(); CreateContentGenerationTaskResponse createResult = service.createContentGenerationTask(createRequest); System.out.println("Task Created: " + createResult); // Get task details and poll status String taskId = createResult.getId(); pollTaskStatus(taskId); } /** * Poll task status * @param taskId Task ID */ private static void pollTaskStatus(String taskId) { String getRequest = taskId; System.out.println("----- polling task status -----"); try { while (true) { ContentGenerationTask getResponse = service.getContentGenerationTask(getRequest); String status = getResponse.getStatus().toString(); if ("succeeded".equalsIgnoreCase(status)) { System.out.println("----- task succeeded -----"); System.out.println(getResponse); break; } else if ("failed".equalsIgnoreCase(status)) { System.out.println("----- task failed -----"); if (getResponse.getError() != null) { System.out.println("Error: " + getResponse.getError().getMessage()); } break; } else { System.out.printf("Current status: %s, Retrying in 10 seconds...%n", status); TimeUnit.SECONDS.sleep(10); } } } catch (InterruptedException ie) { Thread.currentThread().interrupt(); System.err.println("Polling interrupted"); } catch (Exception e) { System.err.println("Error occurred: " + e.getMessage()); } finally { service.shutdownExecutor(); } } } ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "time" "github.com/volcengine/ark-runtime-go/arkruntime" model "github.com/volcengine/ark-runtime-go/arkruntime/model/contentgeneration" ) func main() { // Initialize Ark client client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), // The base URL for model invocation arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() // Model ID modelID := "doubao-seedance-2-0-260128" // Text prompt prompt := "生成一段15秒的越野摩托竞技广告感短片。参考图片作为中段飞跃高潮的参考。" + "镜头逻辑依次为:1)中景跟拍,车手从远处沿土坡高速逼近跳台;" + "2)超近低机位后轮飞砂特写,轮胎抓地甩出大量泥土和砂石;" + "3)中近景展示骑手控车、手部发力、悬挂压缩与机械震动;" + "4)侧向英雄中景拍车手冲坡腾空飞跃,画面状态接近图一,泥土在逆光中大面积飞散;" + "5)腾空近景帅气细节,突出头盔护目镜、手部控把、轮胎悬空或车身侧面局部;" + "6)中景跟拍落地,悬挂压缩回弹,随后继续沿土坡赛道高速冲刺收尾。" + "全片同一名骑手、同一辆车、同一条赛道,镜头景别和角度区分清楚,不重复,动作连贯,画面有真实越野跟拍抖动感、速度感、扬土感和夕阳逆光竞技氛围。" // Example resource URLs refImage := "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/i2v_4k.png" // Output video parameters generateAudio := true videoResolution := "4k" videoRatio := "adaptive" videoDuration := int64(15) showWatermark := true // 1. Create video generation task fmt.Println("----- create request -----") createReq := &model.CreateContentGenerationTaskRequest{ Model: modelID, GenerateAudio: model.NewOptBool(generateAudio), Resolution: model.NewOptString(videoResolution), Ratio: model.NewOptString(videoRatio), Duration: model.NewOptInt64(videoDuration), Watermark: model.NewOptBool(showWatermark), Content: []model.ContentItem{ { Type: model.ContentTypeText, Text: model.NewOptString(prompt), }, { Type: model.ContentTypeImageURL, ImageURL: model.NewOptImageURL(model.ImageURL{ URL: refImage, }), Role: model.NewOptString("reference_image"), }, }, } createResp, err := client.CreateContentGenerationTask(ctx, createReq) if err != nil { fmt.Printf("create content generation error: %v\n", err) return } taskID := createResp.ID fmt.Printf("Task Created with ID: %s\n", taskID) // 2. Poll task status pollTaskStatus(ctx, client, taskID) } // poll task status func pollTaskStatus(ctx context.Context, client *arkruntime.Client, taskID string) { fmt.Println("----- polling task status -----") for { getReq := taskID getResp, err := client.GetContentGenerationTask(ctx, getReq) if err != nil { fmt.Printf("get content generation task error: %v\n", err) return } status := getResp.Status if status == "succeeded" { fmt.Println("----- task succeeded -----") fmt.Printf("Task ID: %s \n", getResp.ID) fmt.Printf("Model: %s \n", getResp.Model) fmt.Printf("Video URL: %s \n", getResp.Content.Or(model.TaskContent{}).VideoURL.Or("")) fmt.Printf("Completion Tokens: %d \n", getResp.Usage.Or(model.TaskUsage{}).CompletionTokens) fmt.Printf("Created At: %d, Updated At: %d\n", getResp.CreatedAt.Or(0), getResp.UpdatedAt.Or(0)) return } else if status == "failed" { fmt.Println("----- task failed -----") if getResp.Error.IsSet() { fmt.Printf("Error Code: %s, Message: %s\n", getResp.Error.Value.Code, getResp.Error.Value.Message) } return } else { fmt.Printf("Current status: %s, Retrying in 10 seconds... \n", status) time.Sleep(10 * time.Second) } } } ``` ## 使用联网搜索 > 联网搜索能力仅适用于纯文本输入 通过配置 tools.**type** 参数为`web_search`即可使用联网搜索工具。 * 开启联网搜索后,模型会根据用户的提示词自主判断是否搜索互联网内容(如商品、天气等)。可提升生成视频的时效性,但也会增加一定的时延。 * 实际搜索次数可通过 [查询视频生成任务 API](/docs/get-video-generation-task-api) 返回的 usage.tool_usage.**web_search** 字段获取,如果为 0 表示未搜索。 |输入:文本 |输出 | |---|---| |微距镜头对准叶片上翠绿的玻璃蛙。焦点逐渐从它光滑的皮肤,转移到它完全透明的腹部,一颗鲜红的心脏正在有力地、规律地收缩扩张。 |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/afad79fc76a34d1fbe7b2c809d1e19f1) | \ | | | \ |:::tip | | \ |联网搜索玻璃蛙的容貌特征。 | | \ |::: | | **选项:Python** ```Python import os import time # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark # Make sure that you have stored the API Key in the environment variable ARK_API_KEY # Initialize the Ark client to read your API Key from an environment variable client = Ark( # This is the default path. You can configure it based on the service location base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key:https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.environ.get("ARK_API_KEY"), ) if __name__ == "__main__": print("----- create request -----") create_result = client.content_generation.tasks.create( model="doubao-seedance-2-0-260128", # Replace with Model ID content=[ { # text prompt "type": "text", "text": "微距镜头对准叶片上翠绿的玻璃蛙。焦点逐渐从它光滑的皮肤,转移到它完全透明的腹部,一颗鲜红的心脏正在有力地、规律地收缩扩张。" } ], generate_audio=True, ratio="16:9", duration=11, watermark=True, tools=[{"type": "web_search"}], ) print(create_result) # Polling query section print("----- polling task status -----") task_id = create_result.id while True: get_result = client.content_generation.tasks.get(task_id=task_id) status = get_result.status if status == "succeeded": print("----- task succeeded -----") print(get_result) break elif status == "failed": print("----- task failed -----") print(f"Error: {get_result.error}") break else: print(f"Current status: {status}, Retrying after 10 seconds...") time.sleep(10) ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.content_generation.*; import com.volcengine.ark.runtime.service.ArkService; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; import java.util.Collections; public class ContentGenerationTaskExample { // Make sure that you have stored the API Key in the environment variable ARK_API_KEY // Initialize the Ark client to read your API Key from an environment variable static String apiKey = System.getenv("ARK_API_KEY"); static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); static Dispatcher dispatcher = new Dispatcher(); static ArkService service = ArkService.builder() .baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .build(); public static void main(String[] args) { String model = "doubao-seedance-2-0-260128"; // Replace with Model ID String prompt = "微距镜头对准叶片上翠绿的玻璃蛙。焦点逐渐从它光滑的皮肤,转移到它完全透明的腹部,一颗鲜红的心脏正在有力地、规律地收缩扩张。"; Boolean generateAudio = true; String videoRatio = "16:9"; Long videoDuration = 11L; Boolean showWatermark = true; // Create ContentGenerationTool Tool webSearchTool = Tool.builder().type(ToolType.WEB_SEARCH).build(); System.out.println("----- create request -----"); List contents = new ArrayList<>(); // text prompt contents.add(ContentItem.builder() .type(ContentType.TEXT) .text(prompt) .build()); // Create a video generation task CreateContentGenerationTaskRequest createRequest = CreateContentGenerationTaskRequest.builder() .model(model) .content(contents) .generateAudio(generateAudio) .ratio(videoRatio) .duration(videoDuration) .watermark(showWatermark) .tools(Collections.singletonList(webSearchTool)) .build(); CreateContentGenerationTaskResponse createResult = service.createContentGenerationTask(createRequest); System.out.println(createResult); // Get the details of the task String taskId = createResult.getId(); String getRequest = taskId; // Polling query section System.out.println("----- polling task status -----"); while (true) { try { ContentGenerationTask getResponse = service.getContentGenerationTask(getRequest); String status = getResponse.getStatus().toString(); if ("succeeded".equalsIgnoreCase(status)) { System.out.println("----- task succeeded -----"); System.out.println(getResponse); break; } else if ("failed".equalsIgnoreCase(status)) { System.out.println("----- task failed -----"); System.out.println("Error: " + getResponse.getStatus()); break; } else { System.out.printf("Current status: %s, Retrying in 10 seconds...", status); TimeUnit.SECONDS.sleep(10); } } catch (InterruptedException ie) { Thread.currentThread().interrupt(); System.err.println("Polling interrupted"); break; } } } } ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "time" "github.com/volcengine/ark-runtime-go/arkruntime" model "github.com/volcengine/ark-runtime-go/arkruntime/model/contentgeneration" ) func main() { // Make sure that you have stored the API Key in the environment variable ARK_API_KEY // Initialize the Ark client to read your API Key from an environment variable client := arkruntime.NewClientWithApiKey( // Get your API Key from the environment variable. This is the default mode and you can modify it as required os.Getenv("ARK_API_KEY"), // The base URL for model invocation arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() // Model ID modelID := "doubao-seedance-2-0-260128" // Text prompt prompt := "微距镜头对准叶片上翠绿的玻璃蛙。焦点逐渐从它光滑的皮肤,转移到它完全透明的腹部,一颗鲜红的心脏正在有力地、规律地收缩扩张。" // Output video parameters generateAudio := true videoRatio := "16:9" videoDuration := int64(11) showWatermark := true // Create ContentGenerationTool tools := []model.Tool{ {Type: model.ToolTypeWebSearch}, } // Generate a task fmt.Println("----- create request -----") createReq := &model.CreateContentGenerationTaskRequest{ Model: modelID, GenerateAudio: model.NewOptBool(generateAudio), Ratio: model.NewOptString(videoRatio), Duration: model.NewOptInt64(videoDuration), Watermark: model.NewOptBool(showWatermark), Tools: tools, Content: []model.ContentItem{ { // Combination of text prompt and parameters Type: model.ContentTypeText, Text: model.NewOptString(prompt), }, }, } createResp, err := client.CreateContentGenerationTask(ctx, createReq) if err != nil { fmt.Printf("create content generation error: %v\n", err) return } taskID := createResp.ID fmt.Printf("Task Created with ID: %s\n", taskID) // 2. Poll task status pollTaskStatus(ctx, client, taskID) } // poll task status func pollTaskStatus(ctx context.Context, client *arkruntime.Client, taskID string) { fmt.Println("----- polling task status -----") for { getReq := taskID getResp, err := client.GetContentGenerationTask(ctx, getReq) if err != nil { fmt.Printf("get content generation task error: %v\n", err) return } status := getResp.Status if status == "succeeded" { fmt.Println("----- task succeeded -----") fmt.Printf("Task ID: %s \n", getResp.ID) fmt.Printf("Model: %s \n", getResp.Model) fmt.Printf("Video URL: %s \n", getResp.Content.Or(model.TaskContent{}).VideoURL.Or("")) fmt.Printf("Completion Tokens: %d \n", getResp.Usage.Or(model.TaskUsage{}).CompletionTokens) fmt.Printf("Created At: %d, Updated At: %d\n", getResp.CreatedAt.Or(0), getResp.UpdatedAt.Or(0)) return } else if status == "failed" { fmt.Println("----- task failed -----") if getResp.Error.IsSet() { fmt.Printf("Error Code: %s, Message: %s\n", getResp.Error.Value.Code, getResp.Error.Value.Message) } return } else { fmt.Printf("Current status: %s, Retrying in 10 seconds... \n", status) time.Sleep(10 * time.Second) } } } ``` ## 更多能力 Seedance 2.0 系列模型也支持文生视频、首帧图生视频、首尾帧图生视频、自定义视频输出规格(包括:分辨率、宽高比、视频时长、视频中是否包含水印)等通用基础能力,详情请参见 [视频生成教程](/docs/video-generation-tutorial)。 # 便利创作 Seedance 2.0 系列模型不支持直接上传含有真人人脸的参考图/视频。为便利创作者使用肖像,平台推出了以下解决方案,详细教程请参见 [Doubao Seedance 便利创作含肖像视频](/docs/seedance-portrait-asset-guide): |方案 |介绍 | |---|---| |[信任模型产物作为输入素材](/docs/seedance-portrait-asset-guide#trust-model-output) | 本账号下部分模型生成的含人脸原始产物可作为输入素材,再次调用 Seedance 2.0 系列模型进行二次创作,不会触发输入审核拦截。 | | [使用预置虚拟人像](/docs/seedance-portrait-asset-guide#preset-avatar) |平台预置虚拟人像库,为创作者提供免费、合规、丰富多样的肖像素材。适用于需真人风格人脸但无需指定具体人物,追求零合规风险、快速创作的场景。 | |[使用已授权真人素材](/docs/seedance-portrait-asset-guide#authorized-real-person) |支持使用已获得授权的真人肖像素材进行视频生成。 | # 提示词技巧 ## 提示词 Skill 平台提供 **Seedance 2.0 提示词优化技能**,方便您对提示词进行调优。 * **配置方式**:推荐在本地项目中运行以下命令,通过方舟文档 Skills catalog 安装 `sd2-pe`: ```bash npx --yes skills@latest add "https://arkdocs.tos-cn-beijing.volces.com/skills/" \ --skill sd2-pe \ --yes ``` 如需手动安装,可以下载以下 `SKILL.md` 文件。以 OpenClaw 为例,将文件完整内容复制到对话输入框中,并发送“请帮我安装这个技能”,等待工具完成安装。 [SKILL.md](https://arkdocs.tos-cn-beijing.volces.com/files/video-generation/SKILL.md) * **使用方式**:在 AI 对话框输入 `/sd2-pe + 你的提示词内容`,开始调试提示词。 ## 提示词规则 - 提示词中必须使用"**素材类型+序号**”格式引用素材,序号为请求体中该素材在同类素材中的排序。例如 「图片 n」指代`content`数组中第 n 个`type="image_url"`的参考图片(按数组顺序从1开始计数)。**注意不支持使用 Asset ID 指代素材**。 - 不同任务的提示词公式及详细规则请参见 [Doubao Seedance 2.0 系列提示词指南](/docs/seedance-2-0-prompt-guide)。 # 使用限制 参见 [使用限制](/docs/seedance-2-0#66cb028f)。 # 常见问题 ## 10bit 位深与 H.265/HEVC 编码视频播放兼容性说明 以下为各平台浏览器及播放器对 10bit 位深与 H.265/HEVC 编码视频的播放兼容性测试结论,实际效果可能因设备配置有所差异。 **推荐使用:** - **macOS 端**:浏览器推荐 Safari、Chrome,播放器推荐 VLC、mpv、QuickTime Player - **Windows 端**:浏览器推荐 Edge、Chrome,播放器推荐 VLC、mpv ### Windows 平台 **选项:浏览器** | 浏览器 | 支持情况 | |------|---------| | Chrome | 有条件支持 | | Edge | 有条件支持 | | Firefox | 有条件支持 | | 360 浏览器 | 有条件支持 | | QQ 浏览器 | 有条件支持 | | Opera | 有条件支持 | **选项:播放器** | 播放器 | 支持情况 | |------|---------| | VLC | 支持 | | 系统「电影和电视」 | 有条件支持 | | PotPlayer | 有条件支持 | | 迅雷影音 | 支持 | | QQ 影音 | 有条件支持 | | MPC-HC / MPC-BE | 有条件支持 | | mpv | 支持 | | KMPlayer | 支持 | > **有条件支持说明**:需具备较高的硬件解码能力。已知在 Intel i7 + NVIDIA RTX 4070 + Windows 11 及更高配置下可正常播放,其他配置建议以实际测试为准。 ### macOS 平台 **选项:浏览器** | 浏览器 | 支持情况 | |------|---------| | Safari | 支持 | | Chrome | 有条件支持 | | Edge | 有条件支持 | | Firefox | 有条件支持 | | Opera | 有条件支持 | **选项:播放器** | 播放器 | 支持情况 | |------|---------| | VLC | 支持 | | QuickTime Player | 支持 | | IINA | 支持 | | mpv | 支持 | | Infuse | 支持 | | Kodi | 有条件支持 | > **有条件支持说明**:需具备较高的硬件解码能力。已知 Apple M2 及以上机型可正常播放,M1 及以下机型建议以实际测试为准。 ## 视频画面存在跳变 **典型现象** **首帧图生视频**、**首尾帧图生视频**场景中,生成视频部分帧出现画面拉伸、压缩等跳变问题。 **根因分析** 输入图片与输出视频的分辨率宽高不一致,引发视频画面帧间跳变。 **解决方案** 1. 裁剪输入图片:参考 Seedance 2.0 系列模型支持的宽高像素值表格(见 [创建视频生成任务 API](/docs/create-video-generation-task-api) ratio 字段),将输入图片裁剪为目标宽高像素值。 2. 将 API 的 **ratio** 字段设置为`adaptive`。 3. 使用 Seedance 2.0 系列模型重新发起首帧/首尾帧图生视频任务。 --- # Doubao Seedance 2.0 系列提示词指南 Source: https://ark.volcengine.com/region:cn-beijing/docs/seedance-2-0-prompt-guide Doubao Seedance 2.0 系列(下文简称 Seedance 2.0 系列)模型原生支持音频与视频联合生成,拥有卓越的语义理解与全模态交互能力。本文介绍 Seedance 2.0 系列模型的提示词(Prompt)使用方法和相关技巧,帮助您更高效地利用该模型生成符合需求的优质视频作品。 > **注意** > > 本指南中呈现的所有视觉(图片、视频)及音频素材,均由 Seedance/Seedream 系列视觉生成模型自主生成。 # 基础公式 Seedance 2.0 系列模型支持同时参考视频、图片、音频等全模态素材,能精准锁定人物样貌、动作特效、视觉风格、配音音色等特征,大幅降低提示词编写门槛。基于这一优势,我们可以通过简单的基础公式来引导模型,利用全模态素材的特点,快速生成满足特定需求的视频。 参考生视频可细分为三类任务:全模态参考、编辑视频和延长视频。您可根据任务类型选择提示词基础公式。 ## 全模态参考 从素材中提取部分元素(如主体、风格、场景、音效),生成一个全新视频。 * **适用场景**:动作迁移、主体复用、氛围借鉴等 * **推荐句式**: * **图片参考**:参考`<图片N>`中的`<主体N>`,生成... * **视频参考**:参考`<视频N>`中的`<动作/运镜/风格/音效>`,生成... * **音频参考**:参考`<音频N>`中的音色,生成... ## 编辑视频 在原视频基础上进行局部或全局修改。未提及的部分,默认保持不变。 * **适用场景**:局部替换、主体抹除、属性修改等 * **推荐句式**: * **增加元素**:清晰描述`<元素特征>` + `<出现时机>` + `<出现位置>` * **修改元素**:严格编辑`<视频N>`,将其中的`<原特征>`修改为`<新特征>` * **删除元素**:点明需要删除的元素,对于保持不变的元素,在提示词中加以强调,表现更佳 ## 延长视频 在时间维度上延续原视频,要求音视频风格、主体与叙事保持一致。 * **适用场景**:续写剧情、延展动作、补全片段等 * **推荐句式**: * **延长视频**:向前/向后延长`<视频N>`,生成... * **轨道补全**:`<视频1>` + `<过渡画面描述>` + 接 `<视频2>` + `<过渡画面描述>` +接 `<视频3>` > **注意** > > 编辑 / 延长视频任务,直接使用“`<视频N>`” 指代视频,请勿使用“参考`<视频N>`”,以免被误判为参考任务。 ## 组合任务 上述3种任务也支持组合使用。 * **适用场景**:参考某个素材,编辑另一个素材。 * **推荐句式**: * 参考`<图片/视频N>`的`[参考维度]`,严格编辑`<视频X>`,`[具体编辑内容]` # 进阶公式 Seedance 2.0 本质上是一个全模态 AI 导演:同时读取你的文字提示词、图片、视频、音频,并在内部拆成 “空间层”(画面里有什么)和 “时间层”(事情如何随时间变化)两个维度来理解和生成画面。 因此,好的提示词不是单纯的 “文案型形容”,而是 “工程型指令”:谁、在什么场景、做什么动作、镜头如何运动、按怎样的时间顺序发生,分别投递给空间层和时间层。具体公式如下: ```text 提示词进阶公式:精准主体 + 动作细节 + 场景环境 + 光影色调 + 镜头运镜 + 视觉风格 + 画质 + 约束条件 ``` ![](https://arkdocs.tos-cn-beijing.volces.com/flowcharts/video-generation/doubao-seedance-2-0-prompt-guide-01.svg) ![](https://arkdocs.tos-cn-beijing.volces.com/flowcharts/video-generation/doubao-seedance-2-0-prompt-guide-02.svg) ![](https://arkdocs.tos-cn-beijing.volces.com/flowcharts/video-generation/doubao-seedance-2-0-prompt-guide-03.svg) ![](https://arkdocs.tos-cn-beijing.volces.com/flowcharts/video-generation/doubao-seedance-2-0-prompt-guide-04.svg) 简单说就是,先锁定“谁”在“干什么”,再交代“在哪”,“什么氛围”,然后告诉模型“怎么拍”,最后用风格、画质和约束条件把结果收紧。下面详细拆解各要素。 ## 1 定义主体 实际参考的素材,一张图片中往往存在多个主体,为了精准引用素材中的特定对象,必须进行明确的主体定义。主体可以是人物、道具、场景等。 **选项:基本定义方式** * **推荐句式**: 将`<图片/视频N>`中的`[主体核心特征]`定义为`<主体N> ` * **核心特征要求**:使用 2–3 个清晰、稳定的静态特征(如服饰、发型、外观、类别)进行描述,确保唯一可识别性 * **示例**: * 将**图片1**中穿红色连衣裙、戴草帽的女人定义为**主体1** * 将**图片1**中穿红色连衣裙、戴草帽的女人定义为**张红** **选项:多素材同主体** 当多个素材中的对象指向同一主体时,应统一绑定: * **推荐句式**: 将**图片1**中的`[...]`、**图片2**中的`[...]`定义为 **`<主体N>`** **选项:多主体场景** 当视频中存在多个主体时,需要分别定义,并使用标签区分。标签应具备唯一性与稳定性,后续描述中需持续使用对应标签,避免指代混乱。 * **推荐句式**: 将<图片/视频N>中的[主体1核心特征]定义为<主体1>,将<图片/视频N>中的[主体2核心特征]定义为<主体2>... * **示例**: 将**视频1**中的高个子男人定义为**警察**,将另一个矮个子男人定义为**小偷**。场景设定为拥挤的白天集市,阳光明媚,周围有许多水果摊位和密集的行人,充满市井生活气息。**小偷**在拥挤的集市人群中惊慌失措地向前狂奔, **警察**在后方紧随其后全速追赶,两人快速穿梭在各个摊位之间。手持镜头向前快速跟拍,画面带有轻微真实的晃动感,营造追逐的紧张氛围。 > **注意** > > * 每次涉及主体时需明确指代,避免省略。支持以下两种用法: > > * 对于未定义主体的简单场景,每次提到主体时,都要使用`<主体N>@<图片N>`,强调主体和素材的绑定关系。例如:张三@图片1。 > > * 对于已提前定义主体的场景,每次提到主体时,都应使用同一标签。例如:将**视频1**中的高个子男人定义为**警察**,将另一个矮个子男人定义为**小偷**。后续描述涉及到高个子男人持续使用“**警察**”指代,涉及到矮个子男人持续使用“**小偷**”指代。 > * 使用素材库(Asset ID)时,仍需使用`<图片/视频N>`指代主体。因模型无法直接关联 Asset ID 与参考内容,故不得直接以 Asset ID 替代`<图片/视频N>`。 > * 描述尽量简洁,避免冗余,避免语义冲突(如同一主体出现矛盾特征)。 > * 空间关系建议优先通过参考图表达,减少复杂文字描述。 ## 2 使用分镜时序 模型的内部建模是空间和时间解耦的。因此,一个复杂视频的提示词,最理想的形态是时间轴化分镜:把视频拆成几个分镜,按事件发生顺序动态描述每个分镜: 谁 + 在哪 + 做什么 + 镜头怎么动。 **实操建议** 使用镜头顺序,对每一段视频都写一个简单的 “镜头 1 / 镜头 2 / 镜头 3” 分镜,再合并成完整的提示词。 * **反面案例**:“男人在街头紧张地奔跑,画面很有电影感。” * **正面案例**: * 镜头 1:街巷侧拍,男人缓慢起跑,带有急促的呼吸感。 * 镜头 2:男人撞翻水果摊,镜头快速摇动并给到男人惊恐的特写。 * 镜头 3:男人翻过矮墙消失,镜头缓慢拉远定格在空荡的街道。 **具体规则** * 使用`镜头1`、`镜头2`、`镜头3`等标识,按事件发生顺序(先主后次)组织内容。不强制限制每段时长,优先让模型根据剧情自然生成节奏。 > **说明** > > 模型对精确时间(如 0–3 秒)的支持不稳定,强行限制时长可能导致生成结果异常。 * 每个镜头推荐按以下逻辑组织: 1. **运镜或镜头切换方式**:如 “全景缓慢推近”“固定机位”“镜头切至…” 等。 2. **主体动作与表情**:描述核心角色 / 物体的关键动作、神态变化。 3. **位置或空间变化**:说明主体所处的场景、位置或空间关系。 4. **音频信息**:描述对应镜头的音效、人声或背景音乐等。 ## 3 **动作描述要求** * **肢体细化 + 程度量化** 动作需具体到手、腿、头部、肩背等肢体部位,同时补充**幅度、速度、力度**描述; 示例:缓慢抬手、快速转头、用力蹬地、微微低头。 * **优先低缓连续小动作** 优先选用缓慢、轻柔、连贯的细微动作,尽量规避狂奔、大跳、剧烈翻滚等高爆发、大动态动作。 示例:缓慢行走、轻轻抬手、微微低头、顺势坐下 * **补充动作过渡衔接** 写明前后动作的惯性与承接关系,保证画面动作连贯自然。 示例:借着转身惯性顺势抬手、从停顿状态自然过渡到举手。 * **情绪具象外化表达** 用具体的身体细节表现情绪,替代 “很悲伤”“非常愤怒” 这类抽象词汇。 具体示例参见下表: |抽象情绪 |外化为动作与细节 | |---|---| |悲伤 |低头、肩膀微微颤抖、眼眶泛红、手指无意识地攥紧衣角、泪水在眼眶里打转但没有落下 | |喜悦 |嘴角抑制不住地上扬、眉眼舒展、脚步变得轻快、下意识地哼起小曲、忍不住原地转个圈 | |紧张 / 焦虑 |频繁地看手表、手指不停敲击桌面、呼吸急促、眼神闪躲、无意识地啃咬指甲 | |愤怒 |双拳紧握、下颌线紧绷、胸口剧烈起伏、眼神如刀般锐利、从牙缝里挤出话语 | |释然 |长长地舒了一口气、紧绷的肩膀完全放松下来、脸上露出久违的、淡淡的微笑、抬头望向远方 | ## 4 运镜写法 模型对运镜词理解力很强,直接使用标准运镜术语即可,例如 “中景、特写、全景、缓慢推镜、平稳横移、固定镜头” 。更多请参见 [镜头语言](/docs/seedance-1-0-pro-pro-fast#afc80793)。 > **注意** > > 一个镜头里尽量只指定 1 种运镜方式,不要同时要求推拉摇移,会增加画面的不稳定性。 ## 5 画质、风格与约束词 画质、风格与约束词是把控视频生成效果的关键,能够为模型划定创作边界、统一画质与美术调性,同时规避画面瑕疵与随机偏差,是保障成片效果稳定合规的必要配置。 **1 画质** 定义画面清晰度、细节纹理与光影质感,提升成片基础画质。 **示例**:高清,细节丰富,电影质感,色彩自然,光影柔和 **2 风格** 设定整体美术画风与视觉调性,统一画面艺术氛围。 **示例**:赛博朋克冷蓝紫色调、复古胶片、日系清新 **3 约束词** 约束词十分重要,可有效规避画面瑕疵、畸形崩坏及不合理元素,约束生成边界与稳定性。 **常用约束词模板**: * **避免生成字幕**:“保持无字幕”、“避免生成任何文字或字幕” * **避免生成 Logo**:“不要生成Logo” * **避免生成水印**:“不要生成水印” ## 6 实战案例 展示如何使用上文介绍的进阶公式和各要素来编写提示词。 **选项:示例1:宿舍情感短剧(偏文戏 / 对话)** **素材准备**: * @图片 1:女主半身照 * @图片 2:宿舍场景参考图 * @视频 1:室内对话运镜参考(中景推拉或轻微摇移) * @音频 1:室内环境声或轻音乐 **提示词**: @图片 1 中的女孩作为主角,@图片 2 作为宿舍场景风格参考,参考 @视频 1 的运镜方式。 **镜头 1**:傍晚时分,**女孩 @图片 1** 脚步轻快地走到**宿舍门口 @图片 2**,镜头中景平稳跟拍,暖黄色日光从窗外洒进走廊,她在门口停顿一下,深呼吸,表情略带紧张。 **镜头 2**:**女孩 @图片 1** 推开门走进宿舍,镜头切到室内中景,舍友们一边整理书本一边抬头看向她,其中一人笑着问 {考得怎么样呀,过了吗},镜头在几人之间缓慢切换半身特写。 **镜头 3**:**女孩 @图片 1** 先低头露出落寞表情,镜头给到她的近景,随后她抬头憋不住笑意,哈哈大笑说 {骗你们的},舍友们追着打闹起来,镜头缓慢拉远,定格在宿舍内一片欢声笑语的全景画面。 全程画面高清电影纪实风,色调温暖,光影柔和;人物面部稳定不变形,动作自然流畅,无卡顿无闪烁;环境音效与 @音频 1 自然融合。 **选项:示例2:古风悬崖对手戏(偏动作/氛围)** **素材准备**: * @图片 1:红衣女主 * @图片 2:黑衣刺客(对手) * @图片 3:悬崖竹林场景图 * @视频 1:武打对决运镜参考 * @音频 1:紧凑的鼓点或打斗音效 **提示词**: @图片 1 的红衣女子作为女主,@图片 2 的黑衣女子作为对手,场景参考 @图片 3 的悬崖竹林环境,整体运镜和动作节奏参考 @视频 1,背景音效与 @音频 1 同步。 **镜头 1**:傍晚,镜头从**红衣女子 @图片 1** 侧面中景缓慢推进,她站在悬崖边拿起酒壶喝酒,衣袂在山风中轻轻摆动,镜头环绕她半圈,从正面推到背影,远处隐约可见竹林中的黑衣人影。 **镜头 2**:镜头变焦渐隐到远景,无人机视角俯瞰整片悬崖和竹林,两人分立山崖两端,山风卷起衣摆和尘土,节奏随鼓点略微加快。 **镜头 3**:镜头切回地面近景,二人缓慢拔剑对峙,**红衣女子@图片 1** 神情从漫不经心转为冷冽,**黑衣女子@图片 2** 目光坚毅,剑尖微微颤动,镜头平稳跟随两人绕圈移动,最后定格在两剑相交前一瞬间的特写。 整体画面烟雨江湖电影感,冷调低饱和,电影胶片质感,光影层次丰富;人物面部和身体比例稳定不变形,动作连贯自然,不僵硬,无穿模无卡顿。 # 其他技巧 ## 文字生成 Seedance 2.0 系列模型支持生成常用文字。模型能根据情境**自动匹配**合适的风格与颜色,也支持在提示词中**指定**文字的颜色、风格、出现方式、出现时机、出现位置。编写时请优先使用**常用字**,避免**生僻字**与**特殊符号**,以确保最佳呈现效果。当前支持广告语、字幕、气泡等场景,具体写法和案例请参见[文字生成](/docs/seedance-2-0-prompt-guide#081b2c64)。 ## 视频延长 vs 分段拼接 * **连续长镜头(视频延长)**:适用于单一场景内的 “文戏”,如长对话、情绪递进、单一路径移动,以实现沉浸式、连贯的一镜到底效果。 * **场景 / 动作转折(分段拼接)**:适用于剧情转折或复杂、快速的 “武戏”,如追逐、打斗、蒙太奇等,可通过独立生成片段再剪辑组合,保证节奏与视觉冲击力。 实际制作中通常结合两种方式,例如先用延长生成连贯对话,再拼接空镜或转场片段,兼顾沉浸感与节奏变化。 ## 素材配置策略 通常把素材分成四种 “功能角色”: 1. 角色锚定:锁定角色外观 2. 场景定调:锁定环境与风格 3. 运镜参考:锁定镜头语言与动作节奏 4. 节奏氛围:用音频控制情绪、音色 **推荐配置**(总计 4-5 个素材):角色图 1-2 张(面部特写 / 全身)+ 场景图 1 张 + 运镜视频 1 段 + 音频 1 段。 > **说明** > > 不建议用满素材上限,过多素材会导致模型难以判断特征优先级,易出现风格冲突、主体识别模糊、生成效果偏离预期等问题。 # 注意事项 ## 语言规范 台词语言需统一,避免中英文混用(专有名词除外)。 ## 特殊字符规范 提示词中合理使用符号有助于模型准确理解不同信息类型: |信息类型 |符号 |示例 | |---|---|---| |音乐 |() |(背景中播放着快节奏的摇滚乐) | |音效 | <> |<远处传来狗叫声> | |台词 | {} | {你好,世界}。如果台词为小语种(非中英文),需标注语种,如:用日语说道{こんにちは}。 | |字幕 |【】 |【第一章:启程】 | # 常见问题 ## 人脸参考不准确 **典型现象** 生成的角色形象与参考图不一致,或在视频中途发生“换脸”,导致视频中人物撞脸明星被审核拦截。 **根因分析** 人脸参考图的有效性不足 * **参考图混用**:将人脸参考图与全身/半身姿态图、服装参考图、细节图等合并在同一张图片中提供给模型。 * **人脸占比过小**:在混用参考图中,人脸区域占整张图的比例过小,模型在提取人脸特征时权重不够,容易被背景或其他元素干扰。 **解决方案** 强化人脸参考的独立性和权重: 1. **准备人脸特写图**:在原有全身照之外,额外准备一张**只包含角色头部的人脸特写图**(大头照,仅保留面部,无表情最佳,尽量减少肩颈、背景等干扰元素)。 2. **提示词中主体定义清晰**:<**主体1> 的面部特征参考图片1(大头照),妆造参考图片2(全身照)**。 3. **重要素材前置**:越需要**精准参考**的素材,放在提示词中**越靠前**的位置。 > **注意** > > 人物参考使用大头照 + 全身照即可,**不建议使用人物多视图**。多视图素材包含同一人物的不同角度,模型易将其识别为多个不同主体,反而加剧人脸参考不准确的问题。 |优化前 |优化后 | |---|---| |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/b76c5a82405f4a2e8885d45b74e28b5b) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/db53a9c92f48461f96d87900f92955a7) | \ | | | \ |> 视频中人物中途“换脸”,撞脸明星 |> 人脸与参考图全程保持一致 | ## 视频中包含字幕 **典型现象** 提示词中未要求生成字幕,生成的视频中包含字幕。 **解决方案** > **说明** > > 目前无法直接做到 100% 避免生成字幕,只能通过以下方法降低其出现概率、提升抽卡成功率。 1. 在提示词中加入明确的约束指令:“保持无字幕”、“避免生成任何文字或字幕”。 2. 如果参考的图片/视频中包含的文字并非必要信息,建议先通过工具去除文字(例如使用 Seedream/ Seedance 模型的图片/视频编辑能力),再使用无文字素材作为输入。 3. 在业务允许的前提下,优先选择横屏尺寸生成视频(横屏生成字幕的概率明显低于竖屏),后续可通过剪辑软件裁剪为竖屏。 ## 视频中有 Logo / 水印 **典型现象** 提示词中未提及水印相关内容,生成的视频包含其他视频平台的 Logo / 水印。 **解决方案** 在提示词中加入明确的约束指令:“不要生成水印”、“不要生成Logo” 。 ## 风格漂移 **典型现象** 期望生成 2D 或者 3D 动漫风格,但输入的参考图片的风格比较写实,并且提示词中未强调视频风格,生成的视频有概率漂移成真人写实风格。 **解决方案** 在提示词中加入明确的风格约束词,例如“2D日漫风格”、“3D国风漫画”。如果需要更精准的风格控制,建议将参考图先变为目标风格再进行生视频。 |优化前 |优化后 | |---|---| |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/5e4b8f2372d94fa189ccc881268f744b) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/6b870e9532ae4fa3b0ca61356415c32d) | \ | | | \ |> 仙侠风格漂移成真人风格 |> 保持 3D 国漫 CG 仙侠风格 | ## 延长视频衔接处跳变 **典型现象** 使用视频延长功能生成新视频后,将新视频与原视频进行拼接,在衔接处可能出现画面跳变、回退的问题。 **解决方案** 当前建议通过后期剪辑修补,对齐关键帧,后续将依托模型迭代进行根本性优化。 1. 将待拼接的视频导入剪映或其他专业视频剪辑软件。 2. 在第一个衔接处,将**前一段视频的末尾删减 6 帧**。 3. 同时,将**后一段视频的开头删减 1 帧**。 4. 对所有的拼接点重复以上操作。 5. 导出并检查拼接后视频的流畅度。 > **说明** > > 视频帧对齐后,仍可能存在细微跳变,建议在续写生成视频的时候以转场切镜的时刻结尾,下一段视频以结尾切镜后的新场景为起始。 |优化前 |优化后 | |---|---| |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/88a85ca9505e4356b8ad00a792f43bb7) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/45144713105e407abaa7a8152fc58d6d) | \ | | | \ |> 在衔接处(第 5s,第20s)出现**画面瞬间跳动**或**内容回退** |> 衔接处更加平滑 | ## 双胞胎问题 **典型现象** 在画面人物较多且传入人物三视图作为参考素材的场景下,生成视频同一画面中易出现两个完全相同的人物。 **根因分析** * 提示词中对人物主体的定义不清晰,模型无法精准区分不同人物角色; * 以人物三视图 / 多视图作为参考素材时,易造成模型人物识别混淆,从而生成重复同款人物。 **解决方案** > **说明** > > 目前无法直接做到 100% 避免双胞胎问题,只能通过以下方法降低其出现概率、提升抽卡成功率。 1. **明确人物主体关联** 在提示词中清晰定义每个人物角色,明确角色与参考图的对应关系。建议在人物名称后标注对应参考图,并保持格式统一。 示例:张三(对应图片 1)将绿色存折扔向站立的李四(对应图片 2)。 2. **添加全局约束指令** 在提示词末尾增加固定约束:**视频全程禁止出现外形、着装、配饰完全一致的人物,禁止生成同款分身、双胞胎效果,同一画面中仅保留单个对应人物,不出现人物重复复刻**。 3. **优化参考素材** 人物参考图优先使用单人独立照片,不建议使用三视图、多视图素材。 4. **精简优化提示词** 请勿直接将完整剧本作为提示词使用,文案内容过度冗余易造成模型理解混乱,需精简无关表述、保证指令清晰聚焦。 |优化前 |优化后 | |---|---| |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/07cde10b55ac45fea6a8bbb67d47d028) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/0fc18ac5b14247209c7355c40fae6337) | \ | | | \ |> 画面第8秒出现“双胞胎” | | ## 视频延长画质劣化 **典型现象** 将模型生成的视频作为输入素材进行延长续写时,会出现画质劣化。多次续写会叠加劣化效果,尤其人物人脸区域易出现斑驳色块。 **解决方案** 当前可通过以下方式缓解画质劣化,后续将依托模型迭代进行根本性优化: 1. 将原始视频通过 Seedance 2.0 转为白模视频,再作为续写输入素材。 参考提示词:将视频转为白色 3D 模型,人物统一为纯白 3D 模型,无色彩、无纹理、无阴影,纯白背景,结构稳定、运动流畅。 2. 优先选用高清图片作为参考素材。 3. 合理控制视频续写次数,避免多次叠加续写。 |优化前 |优化后 | |---|---| |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/0d2224f33882474d81714133ea44328f) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/f82a216fc45b42ad8953828e4bc36ff9) | \ | | | \ |> 直接对模型产物进行续写 |> 将模型产物转化为白模视频后再进行续写 | ## 特效效果不符合预期 **典型现象** 通过提示词文字描述特定特效时,可能会出现特效效果与预期不符的情况,例如:提示词指定「数字“2999”以倒计时动画出场」,实际生成的数字滚动特效出现无序跳变,不符合标准倒计时逻辑。 **解决方案** 建议采用**参考视频**定义特效:将目标特效视频作为参考素材输入模型,让模型精准理解特效形态与运动逻辑,生成效果更贴合预期。例如:数字“2999”出场方式参考视频1。 |优化前 |优化后 | |---|---| |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/0698e275fb5b42eba0404e10d66939d7) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/a1a54eb006b44ecb91d8256179b04b42) | \ | | | \ |> 数字滚动特效有明显的无序跳变感 |> 增加正确的数字滚动特效视频后,特效结果符合预期 | \ | | | \ | | | \ | |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/1ccd8fdc1e9c4f37921a4dd1bbcc74a7) | \ | | | \ | |> 特效动画 | ## 参考人物过多 **典型现象** 当参考人物数量超过 4 人时,模型输出稳定性下降,生成的视频可能出现人物数量不符(如少人、多人)或人物重复等问题。 **解决方案** 当前可通过以下方式缓解,后续将依托模型迭代进行根本性优化: 1. **分步生成图片**:将人物分组,确保每组生成的图片中人物数量不超过 4 人。例如,6 个人可分成 2 组,每组 3 人,分别生成图片。 2. **图片生成视频**:使用第一步生成的多张分组图片作为参考素材,再生成最终视频。 |优化前 |优化后 | |---|---| |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/c789760e98c64a42aec36e006550e2f9) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/cd7090f6d6694b01b3900d66d5ed36a1) | \ | | | \ |> 输入 8 个参考角色,输出视频有 9 人 |> 将 8 个角色生成 2 张图后,再使用图生视频 | ## 视频结尾有噪音 **典型现象** 视频中包含旁白时,视频片尾容易出现突兀咔哒声、截断杂音。 **解决方案** 重新生成视频,或使用剪映等剪辑工具,对片尾音轨通过**音量包络线**做音频淡出处理,消除截断噪音。 具体步骤 (使用剪映): 1. 将生成的视频导入剪映。 2. 在时间轴上选中视频轨道,点击工具栏中的**音频**。 3. 选择**音量包络线**功能(部分版本位于基础 / 调节菜单内),并选择关键点。此时音频轨道上会出现一条代表音量的线以及关键点。 4. 在视频临近结尾处,将末尾音量关键点下拉至音量为 0,形成一个向下的斜坡。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/465dc4f0a13b471f8e1a8c5216a08f2a~tplv-goo7wpa0wc-image.image)
    5. 预览确认片尾音频自然淡出,无突然截断与杂音即可。 |优化前 |优化后 | |---|---| |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/5d94410abb274588b0fa9aa1cd0d303b) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/81cb4ef06ce44175a4cc042020b0f9dc) | \ | | | \ |> 结尾有噪音 |> 结尾无噪音 | ## 中文发音不准 **典型现象** 模型对多音字、生僻字、形近字容易读错。 **解决方案** 可将易读错文字替换为**发音一致的常用同音字**,规避发音偏差,还原预期音频效果。注意该方案仅为优化手段,无法完全规避所有发音问题。 示例:可将提示词中“螭龙山”改写为同音字“吃龙山”。 |优化前 |优化后 | |---|---| |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/aceabaeb156f42b0bf040d4e37d8a28d) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/5e5841ca25954fb18566452ef17383f8) | \ | | | \ |> "螭龙山"的“螭”发音不对 |> 改成“吃龙山”后发音正确 | ## 音色参考不准 **典型现象** 使用参考音频指定音色时,最终生成视频的音频音色与参考音色存在明显偏差。 **解决方案** 1. 在提示词中补充细致的音色特征描述。 2. 保持视频台词风格与参考音频的语气、表述风格相近,有助于提升音色还原度与稳定性。 |优化前 |优化后 | |---|---| |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/02b2fa5093bb4985897e003306970021) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/9fc65b9b93ae496991afa41f28520e87) | \ | | | \ |> 音色与输入音频不匹配 |> 提示词中增加音色特征描述后,音色匹配度明显提升 | \ | |> “使用@音频1低厚温润带细碎颗粒感中年男声的音色说” | \ | | | \ |[音频.mp3](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/7cd70ed1fb50475c903181cc5d3c436b~tplv-goo7wpa0wc-image.image) | | \ | | | \ |> 输入的音频 | | # 附录:提示词案例 展示在不同场景下使用 Seedance 2.0 系列模型的提示词示例,帮助您更精准地实现全模态参考的指代控制及文字生成等功能。 更多优秀案例请参考 [控制台体验中心 Seedance2.0](https://ark.volcengine.com/region:cn-beijing/experience/gen_video?model=doubao-seedance-2-0-260128) 模板库。 ![image-sd2.0template.png](https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/image-sd2.0template.png) ## 文字生成 ### 广告语(Slogan) 提示词参考模板: ```Plain Text 「文字内容」+「出现时机」+「出现位置」+「出现方式」,「文字特征(颜色、风格)」 ``` > **说明** > > Seedance2.0 能根据情境匹配合适的文字风格,如果对文字表现效果的要求较为严格,可参考下文中的`多图参考 > Logo 参考`。 参考案例: **[成品效果]** [视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/35240ac6fe544bff8c53216beb132039) **[提示词]** 手绘漫画风格,三个人围坐在一起吃`图片1`中的炸鸡,气氛友好愉悦,后画面逐渐模糊,画面中部显示文字“快乐尽在 Seedance”。 **[参考素材]** ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/75c33cf8a57049dea19e659689d21b0d~tplv-goo7wpa0wc-image.image) ▲ 图片 1 ### 字幕 提示词参考模板: ```Plain Text 画面底部出现字幕,字幕内容为“……”,字幕需与音频节奏完全同步。 ``` 参考案例: **[成品效果]** [视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/13f58b60c41746a88d27a1b88e9bd5ca) **[参考素材]** ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/1aef460c4dc746eb98dfe84f63ac6edd~tplv-goo7wpa0wc-image.image) **[提示词]** 生成带有画外音的视频。一个深沉、平静的男声说:“在宏大的宇宙中,我们的世界不过是一个短暂的瞬间。然而,在其中,生命不顾一切地繁荣。”场景应从夜晚缓慢过渡到黎明,星星逐渐消失,太阳从山后升起。画面底部按照台词出现字幕。 **[成品效果]** [视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/b33da3f7807d421fbd9c5caa0a6ff3da) **[参考素材]** ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/9bf3df545226452e91cd7a2a7c70670a~tplv-goo7wpa0wc-image.image) **[提示词]** 图片中的两人在办公室聊天,女性先说话,她说道:“你每次卡点到,是不是很享受这种刚刚好的感觉?”男性笑着回应:“我有我的节奏”角色说话时,对话随意自然,画面底部出现对应台词字幕。 ### 气泡台词 提示词参考模板: ```Plain Text 「角色」说:“……”,角色说话时周围出现气泡,气泡里写着台词。 ``` 参考案例: **[成品效果]** [视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/b53cbfa4a7b847528d1c96dd1e4f6da3) **[参考素材]**
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/c7e0217865cf4545a602c3b966ca2b8f~tplv-goo7wpa0wc-image.image)
    **[提示词]** `图片1`中的两人穿着运动服在学校的操场跑步,女孩看向男孩,自信地笑着说:“We can definitely do it! ”镜头切到男孩的近景,他犹豫地回答:“Are you sure? ”镜头切回女孩的中近景,她语气轻快地说:“Yes! ”情绪明亮而坚定。说话的角色周边出现气泡,气泡里是对应台词。 **[成品效果]** [视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/c530f29add364cb4ad359bb80c1395e3) **[参考素材]**
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/2971e5eb1b2b42be99ae45c901b6836d~tplv-goo7wpa0wc-image.image)
    **[提示词]** 参考`图片1`、`图片2`中的女孩形象,女孩在一个草莓园里,摘下一颗,吃了一口,笑着说:“This is the real deal! ”女孩周围出现一个气泡,气泡里面写着台词。 ## 图片参考 Seedance 2.0 系列模型既支持主体多视角参考,也支持场景图、分镜图等多图参考。 使用过程中,如对图片顺序有要求,应**按顺序上传**,提示词中可使用`图片1`、`图片2`……`图片n`进行准确指代。 ### 主体多视角图参考 指代清楚参考对象即可,模型能够响应的指令包括但不限于以下示例。 商品: **3C 数码** --- **[成品效果]** [视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/d9baa8c1ac934ea1acaed0e56c8b5fb0) **[参考素材]**
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/f736506d529e4a8aa0095f8b3add39e9~tplv-goo7wpa0wc-image.image)
    **[提示词]** 提取`图片1`、`图片2`、`图片3`的相机,把背景换成白色,相机在一个白色桌子上,镜头以特写的形式聚焦相机,然后以相机为主体缓慢旋转,清晰展示相机的正面侧面以及背面。 **家居物品** --- **[成品效果]** [视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/b182c88d13c0483b8294265aca614cda) **[参考素材]**
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/be615f5537e0489fa29de8239f785464~tplv-goo7wpa0wc-image.image)
    **[提示词]** 背景为暖调居家场景,中景呈现参考图中的保温杯,镜头平稳推近至保温杯近景,镜头外一只手自然入镜轻握杯身拿起保温杯,镜头跟拍手部微微旋转动作展示。 --- 角色: **[成品效果]** [视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/25c17dee392e416ca0273cf67d8c310a) **[提示词]** 参考`图片1`、`图片2`、`图片3`中的女子形象,生成她在一家咖啡店吃蛋糕的画面。 **[参考素材]** ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/6e285ab828324ac2a2d2033f92bdad3c~tplv-goo7wpa0wc-image.image) ### 多图参考 **Logo 参考** --- **[成品效果]** [视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/22abee6dea5e499eadde76f8874b45d0) **[参考素材]**
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/9462730dc4fe4bda8eca885357be15c1~tplv-goo7wpa0wc-image.image)
    **[提示词]** 背景是霓虹闪烁的未来都市空中廊道,飞行器与全息广告交织,参考`图片2`中的女孩,先用中景展示女孩放飞带有全息投影的银色悬浮灯,再镜头拉远展现漫天悬浮灯,画面逐渐模糊,后出现`图片1`的 Logo,整体风格为 3D 赛博朋克科幻动画风格。 **多主体参考** --- **[成品效果]** [视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/9930cc70745944918395490b2809b9f1) **[参考素材]**
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/168fb0c205ea41d28ba4c354b85b48c9~tplv-goo7wpa0wc-image.image)
    **[提示词]** 参考图片中的猫猫和狗狗,在一个温馨的公寓里,狗狗在趴着吃狗粮,猫猫走过来,伸出爪子碰了碰狗狗,狗狗看到猫猫后停下吃饭,猫猫依偎在狗狗身边。画面采用暖色调。 **多元素参考** --- **[成品效果]** [视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/c5de349e1c2c4feeb651112d27090b55) **[参考素材]** ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/1434a96042e542818be224ff54a404db~tplv-goo7wpa0wc-image.image) **[提示词]** 场景设定在`图片4`中的餐厅内,店内人来人往。`图片1`里的女孩身着`图片2`中的服装,正在整理柜台上的物品。`图片3`中的男孩是一位顾客,他走上前,想要向女孩索要联系方式。`图片5`中的标识始终显示在画面的右下角。 **多宫格分镜图参考** --- **[成品效果]** [视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/e907b4ec99624d05822c606bddb8f027) **[参考素材]** ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/e6ca9955aee94defa93c4c83faa1f017~tplv-goo7wpa0wc-image.image) **[提示词]** 参考图片中的分镜图,生成打斗激烈的打斗场面。图片中的各个分镜构图要按照顺序出现,之后二人激烈打斗。 **分镜图参考** --- **[成品效果]** [视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/3a3a79effe8941febe9d64b61eaffff9) **[参考素材]** ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/54a850099e3341b7bb0d290d7e9aa7dc~tplv-goo7wpa0wc-image.image) **[提示词]** 参考`图片3`中的分镜构图,女孩正在等爸爸做好饭,她说:“아빠, 배고파요! 밥 다 됐어요?”,女孩形象参考`图片1`。接着镜头向右横摇,切换至`图片4`的画面和构图,爸爸形象参考`图片2`,爸爸回答她:“거의 다 됐어, 조금만 기다려!“,接着镜头切换回女儿略显失落的面部表情特写,她说:“아직 멀었어요? 맛있는 냄새 나는데……”,接着切换成爸爸的面部特写,他说:“이제 진짜 금방이야。 "빨리빨리" 하지 말고 손부터 씻고 와!”。 ## 视频参考 Seedance 2.0 系列模型支持视频参考,使用时指代清楚生成内容和参考对象即可。 使用过程中,如对视频顺序有要求,应**按顺序上传**,提示词中可使用`视频1`、`视频2`……`视频n`进行准确指代。 ### 动作参考 **影视** --- **[成品效果]** [视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/93e363e70b5d4cf69d39aa73a976cc70) **[参考素材]** [视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/06ffca9604a14ae4a289bed8cdc115b3) ▲ 视频 1
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/4b419b0cc45043dd8a865d719a50436b~tplv-goo7wpa0wc-image.image)
    **[提示词]** 参考`视频1`的人物动作和镜头语言,生成`图片2`和`图片1`的打斗场面,`图片2`是左边人物,`图片1`是右边人物。有激烈的背景音乐。 **营销** --- **[成品效果]** [视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/9b6fafc6e9f94a888da29c40403cc79b) **[参考素材]** [视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/95339be0b83b446496bebcaac0ed62e4) ▲ 视频 1 **[提示词]** 参考`视频1`中马的奔跑形态,生成一匹金色的骏马在草原上奔跑,随即定格其奔跑的华丽姿态,变成一个马形的金吊坠。 ### 运镜参考 **[成品效果]** [视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/13354294d83f4985be154abae7dec304) **[提示词]** 参考`视频1`的运镜,做一个科技园区的概念视频,以`图片1`中的高楼为视觉中心,同为第一视角俯冲,体现出`图片1`中园区的科技感。 **[参考素材]** [视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/94aa83c27b7f4731b82b4edda6b8e420) ▲ 视频 1
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/37e0d8db140e42f3805addfef1c867b1~tplv-goo7wpa0wc-image.image)
    ▲ 图片 1 ### 特效参考 **影视** --- **[成品效果]** [视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/d7968e92ea3241b5b43b0cf0ff545329) **[参考素材]** [视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/af1f7bd795664a7db0cda6dffad1c730) ▲ 视频 1
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/06ae5868c32043f9a6fc2526ff10b0ba~tplv-goo7wpa0wc-image.image)
    ▲ 图片 1 **[提示词]** 参考`视频1`的金色粒子特效,让`图片2`中的人物吹笛子的同时,身边环绕一样的粒子特效。 **玩法特效** --- **[成品效果]** [视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/a08a636518744c8dbe871fa65301baa9) **[参考素材]** [视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/eac58a8ac3fe464c88d8defcfb28fd7f) ▲ 视频 1
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/c119111b1c7148428c4e90652fe4743f~tplv-goo7wpa0wc-image.image)
    ▲ 图片 1 **[提示词]** 参考`视频1`的特效,让`图片1`中的女生长出相同的翅膀,翅膀生成轨迹一致。 ## 视频编辑 Seedance 2.0 系列模型支持视频编辑,支持增加、删除或修改元素,视频的向前或向后延长,以及轨道补齐。 使用过程中,如对视频顺序有要求,应**按顺序上传**,提示词中可使用`视频1`、`视频2`……`视频n`进行准确指代。 ### 元素增删改 **增加元素** --- **[成品效果]** [视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/55cae858cbb74d5087d456d8fe434977) **[参考素材]** [视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/42938974be554af3a602dbe5f5d29375) ▲ 视频 1 **[提示词]** 在`视频1`的台面上添加炸鸡、披萨等小吃。 **删除元素** --- **[成品效果]** [视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/b77bc49e97214ab29b29b557fdd77676) **[参考素材]** [视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/bf6418b7c3c544f5aea83c11c7442b98) ▲ 视频 1 **[提示词]** 清除`视频1`桌面上的其他零件和工具,保持桌面整洁干净,桌面上只有他俩手里的。 **修改元素** --- **[成品效果]** [视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/08616496462d4c588e94045f0ff8fd65) **[参考素材]** [视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/0a45a3b5ff6c424da49049d7d334279e) ▲ 视频 1
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/3025b17affbd41ca9e8f0c937bd9de5a~tplv-goo7wpa0wc-image.image)
    ▲ 图片 1 **[提示词]** 将`视频1`中的香水替换成`图片1`中的面霜,动作和运镜不变。 ### 视频延长 > **注意** > > 模型将自动截取衔接部分进行合成,输入视频原有片段,不会重复生成。 **向后延长** --- **[成品效果]** [视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/7e1ab1dbeeb04253a39c775c17a29d33) **[参考素材]** [视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/127e451399294911aa6803c857ee262b) ▲ 视频 1 **[提示词]** 生成`视频1`之后的内容,迟到的两个男士跑向他们,五个人终于见面,友好聊天。 **向前延长** --- **[成品效果]** [视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/db312f0e771a4b28ad08f71f24cdc71f) **[参考素材]** [视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/1a2f2a1e351d4367abbf4af1fc69a890) ▲ 视频 1 **[提示词]** 向前延长`视频1`,给白衣男子过肩镜头,白衣男子说:“It’s not that bad. You're just stressed. Everyone goes through this, you just need to keep going.” ### 轨道补齐 > **说明** > > * Seedance 2.0 系列模型最多支持 3 段视频输入,总时长不得超过 15 秒。 > * 生成时将自动截取首尾视频的衔接部分,仅保留必要片段参与合成。 参考案例: **[成品效果]** [视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/70187e67162b44548755d1624eb8a9fe) **[提示词]** `视频1`,树叶落地的瞬间,激起金色粒子特效,一阵风吹过,接`视频2`**。** **[参考素材]** [视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/a9834c4281f04b3596b1367555cbc409) ▲ 视频 1 [视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/3a2ca254f5e14d64b2cbcf2a0ebb637c) ▲ 视频 2 --- # 视频生成教程 Source: https://ark.volcengine.com/region:cn-beijing/docs/video-generation-tutorial Seedance 模型具备出色的语义理解能力,可根据用户输入的文本、图片、视频、音频等全模态内容,快速生成优质的视频片段。本文为您介绍视频生成模型的通用基础能力,指导您调用 [Video Generation API](/docs/create-video-generation-task-api) 生成视频。如需了解各版本模型的特色能力,请参见 [Doubao Seedance 2.5 教程](/docs/seedance-2-5)、[Doubao Seedance 2.0 系列教程](/docs/seedance-2-0)。 # 效果预览 访问 [模型卡片](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seedance-2-0) 查看更多示例。 |场景 |输入:提示词 |输入:图片、视频、音频 |输出 | |---|---|---|---| |全模态参考 |以**图片1**为首帧,画面放大至飞机舷窗外,一团团云朵缓缓飘至画面中,其中一朵为彩色糖豆点缀的云朵,始终在画面中居中,然后缓缓变形为**图片2**中的冰淇淋,镜头推远回到机舱内,坐在窗边的**图片3**中的角色伸手从窗外拿进冰淇淋,吃了一口,嘴巴上沾满奶油,脸上洋溢出甜蜜的笑容,此时视频配音为**音频1** |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/52bdd8074d41430b97afb773ac6acb91~tplv-goo7wpa0wc-image.image) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/8eaeafa52ae04afe8d8894be0145c8c8) | \ |> 可参考图、 | | | | \ |> 视频和音频 | | | | \ | | | | | \ | | |[冰淇淋 .mp3](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/8d84cc7bbb5f486cbe66c26ddd1f6e47~tplv-goo7wpa0wc-image.image) | | |编辑视频 |将**视频1**中的房子外立面墙壁刷成蓝色,天气和光线参考**图片1**的雪天 |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/0751d1ba97664456893058e914a1b44a) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/5c17f8570a3943ceaa0c806aeffcbac9) | \ |> 替换视频主体、视频中对象增删改、局部画面重绘/修复等 | | | | \ | | | | | \ | | | | | \ | | |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/666b1aa0e24143b285cf2325ad90de77~tplv-goo7wpa0wc-image.image) | | |延长视频 |将**视频1**向后延长,11秒视频,汽车丝滑行驶到一片沙漠绿洲,背景音乐使用**音频1** |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/7d84f0e0149348f598c8df548195b1c1) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/37e14c2c6b994ef6821b1bebb8c1bd47) | \ |> 向前或者向后延长视频,或多个视频片段串联成一个连贯视频 | | | | \ | | | | | \ | | | | | \ | | |[汽车背景音.mp3](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/245274e557ec477d92359c6468cc7ca2~tplv-goo7wpa0wc-image.image) | | |首帧图生视频 |镜头围绕人物推镜头拉近,特写人物面部,她正在用京剧唱腔唱“月移花影,疑是玉人来”,唱词充满情感,唱腔充满传统京剧特有的韵味与技巧,完美体现了花旦角色的内心世界 |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/bf9e55ee68e34671abbb12942aceb91a~tplv-goo7wpa0wc-image.image) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/2fe3d82baa1642b1926007968a44e022) | |首尾帧生视频 |360度环绕运镜 |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/f8fc1008f23a4908b7c897e8b7eb87df~tplv-goo7wpa0wc-image.image) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/9cb7768701564b73ac45616097452338) | # 新手入门 > **说明** > > 下文详细介绍使用不同编程语言调用视频生成 API 的示例代码。 > * 若您是编程零基础用户,推荐使用 [控制台体验中心](https://ark.volcengine.com/region:cn-beijing/experience/gen_video?model=doubao-seedance-2-0-260128),包含丰富的模板库,可一键生成同款视频,无需编写代码即可快速上手创作。 > * 若您想快速体验 API 调用,推荐使用API Explorer,内置预设参数模板,可一键发起 API 调用;同时也支持灵活调整参数(例如设置视频水印等),满足多样化的测试和使用场景。 > * 若您想真正开始编程开发,但苦于搭建开发环境、依赖安装等问题,推荐阅读 [Seedance 2.5 新手入门](/docs/seedance-2-5#2.5_quick_start) 或 [Seedance 2.0 新手入门](/docs/seedance-2-0)。 视频生成是一个异步过程: 1. 成功调用 `POST /contents/generations/tasks` 接口后,API 将返回一个任务 ID 。 2. 您可以轮询 `GET /contents/generations/tasks/{id}` 接口,直到任务状态变为 `succeeded`;或者使用 Webhook 自动接收视频生成任务的状态变化。 3. 任务完成后,您可在 content.**video_url** 字段处,下载最终生成的 MP4 文件。 > **说明** > > 方舟平台的新用户?获取 API Key 及 开通模型等准备工作,请参见 [快速入门](/docs/quick-start)。 ## Step1: 创建视频生成任务 通过 `POST /contents/generations/tasks` 创建视频生成任务。 **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seedance-2-5-260628", "content": [ { "type": "text", "text": "女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动,可以听到风声" }, { "type": "image_url", "image_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/i2v_foxrgirl.png" } } ], "generate_audio": true, "ratio": "adaptive", "duration": 5, "watermark": true }' ``` **选项:Python** ```Python import os from arkruntime import Ark # Get API Key:https://ark.volcengine.com/region:cn-beijing/apikey client = Ark(base_url="https://ark.cn-beijing.volces.com/api/v3", api_key=os.environ.get("ARK_API_KEY")) if __name__ == "__main__": print("----- create request -----") resp = client.content_generation.tasks.create( model="doubao-seedance-2-5-260628", # Replace with Model ID content=[ { "text": ( "女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动,可以听到风声" ), "type": "text" }, { "image_url": { "url": ( "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/i2v_foxrgirl.png" ) }, "type": "image_url" } ], generate_audio=True, ratio="adaptive", duration=5, watermark=True, ) print(resp) ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.content_generation.*; import com.volcengine.ark.runtime.service.ArkService; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; public class ContentGenerationTaskExample { // Make sure that you have stored the API Key in the environment variable ARK_API_KEY // Initialize the Ark client to read your API Key from an environment variable static String apiKey = System.getenv("ARK_API_KEY"); static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); static Dispatcher dispatcher = new Dispatcher(); static ArkService service = ArkService.builder() .baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .build(); public static void main(String[] args) { String model = "doubao-seedance-2-5-260628"; // Replace with Model ID Boolean generateAudio = true; String ratio = "adaptive"; Long duration = 5L; Boolean watermark = true; System.out.println("----- create request -----"); List contents = new ArrayList<>(); // Combination of text prompt and parameters contents.add(ContentItem.builder() .type(ContentType.TEXT) .text("女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动,可以听到风声") .build()); // The URL of the first frame image contents.add(ContentItem.builder() .type(ContentType.IMAGE_URL) .imageUrl(ImageURL.builder() .url("https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/i2v_foxrgirl.png") .build()) .build()); // Create a video generation task CreateContentGenerationTaskRequest createRequest = CreateContentGenerationTaskRequest.builder() .model(model) .content(contents) .generateAudio(generateAudio) .ratio(ratio) .duration(duration) .watermark(watermark) .build(); CreateContentGenerationTaskResponse createResult = service.createContentGenerationTask(createRequest); System.out.println(createResult); service.shutdownExecutor(); } } ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" model "github.com/volcengine/ark-runtime-go/arkruntime/model/contentgeneration" ) func main() { // Make sure that you have stored the API Key in the environment variable ARK_API_KEY // Initialize the Ark client to read your API Key from an environment variable client := arkruntime.NewClientWithApiKey( // Get your API Key from the environment variable. This is the default mode and you can modify it as required os.Getenv("ARK_API_KEY"), // The base URL for model invocation arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() // Replace with Model ID modelEp := "doubao-seedance-2-5-260628" // Generate a task fmt.Println("----- create request -----") createReq := &model.CreateContentGenerationTaskRequest{ Model: modelEp, GenerateAudio: model.NewOptBool(true), Ratio: model.NewOptString("adaptive"), Duration: model.NewOptInt64(5), Watermark: model.NewOptBool(true), Content: []model.ContentItem{ { // Combination of text prompt and parameters Type: model.ContentTypeText, Text: model.NewOptString("女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动,可以听到风声"), }, { // The URL of the first frame image Type: model.ContentTypeImageURL, ImageURL: model.NewOptImageURL(model.ImageURL{ URL: "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/i2v_foxrgirl.png", }), }, }, } createResp, err := client.CreateContentGenerationTask(ctx, createReq) if err != nil { fmt.Printf("create content generation error: %v", err) return } taskID := createResp.ID fmt.Printf("Task Created with ID: %s", taskID) } ``` 请求成功后,系统将返回一个任务 ID。 ```JSON { "id": "" } ``` ## Step2: 查询视频生成任务 利用创建视频生成任务时返回的 ID ,您可以查询视频生成任务的详细状态与结果。此接口会返回任务的当前状态(如 `queued` 、`running` 、 `succeeded` 等)以及生成的视频相关信息(如视频下载链接、分辨率、时长等)。 > **说明** > > 因模型、API负载和视频输出规格的不同,视频生成的过程可能耗时较长。为高效管理这一过程,您可以通过轮询 API 接口(详见 [基础使用](/docs/video-generation-tutorial#1bf58128) 和 [进阶使用](/docs/video-generation-tutorial#e190e738) 部分的 SDK 示例)来请求状态更新,或通过 [使用 Webhook 通知](/docs/video-generation-tutorial#caf01f12) 接收通知。 **选项:Curl** ```Bash # Replace with the ID acquired from "Create Video Generation Task". curl "https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks/" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" ``` **选项:Python** ```Python import os from arkruntime import Ark # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey client = Ark( api_key=os.environ.get("ARK_API_KEY"), base_url="https://ark.cn-beijing.volces.com/api/v3", ) if __name__ == "__main__": resp = client.content_generation.tasks.get( task_id="", ) print(resp) ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.content_generation.*; import com.fasterxml.jackson.core.JsonProcessingException; import com.volcengine.ark.runtime.service.ArkService; import java.util.concurrent.TimeUnit; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; public class Sample { static String apiKey = System.getenv("ARK_API_KEY"); static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); static Dispatcher dispatcher = new Dispatcher(); static ArkService service = ArkService.builder() .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); public static void main(String[] args) throws JsonProcessingException { String taskId = ""; String req = taskId; service.getContentGenerationTask(req).toString(); System.out.println(service.getContentGenerationTask(req)); service.shutdownExecutor(); } } ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() req := "" resp, err := client.GetContentGenerationTask(ctx, req) if err != nil { fmt.Printf("get content generation task error: %v\n", err) return } fmt.Printf("%+v\n", resp) } ``` 当任务状态变为 succeeded 后,您可在 content.**video_url** 字段处,下载最终生成的视频文件。 ```JSON { "id": "", "model": "doubao-seedance-2-5-260628", "status": "succeeded", "content": { // Video download URL (file format is MP4) "video_url": "" }, "usage": { "completion_tokens": 246840, "total_tokens": 246840 }, "created_at": 1765510475, "updated_at": 1765510559, "seed": 58944, "resolution": "1080p", "ratio": "16:9", "duration": 5, "framespersecond": 24, "service_tier": "default", "execution_expires_after": 172800 } ``` # 模型能力 本表格展示所有 Seedance 模型支持的能力,方便您对比和选型。如需了解各版本模型的特色能力,请参见 [Doubao Seedance 2.5 教程](/docs/seedance-2-5)、[Doubao Seedance 2.0 系列教程](/docs/seedance-2-0)。 |模型名称 | |[Seedance 2.5](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seedance-2-5&projectName=default) |[Seedance 2.0](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seedance-2-0&projectName=default) |[Seedance 2.0 fast](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seedance-2-0-fast&projectName=default) |[Seedance 2.0 mini](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seedance-2-0-mini&projectName=default) |[Seedance 1.0 pro](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seedance-1-0-pro&projectName=default) |[Seedance 1.0 pro fast](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seedance-1-0-pro-fast&projectName=default) | |---|---|---|---|---|---|---|---| |Model ID | |doubao-seedance-2-5-260628 |doubao-seedance-2-0-260128 |doubao-seedance-2-0-fast-260128 |doubao-seedance-2-0-mini-260615 |doubao-seedance-1-0-pro-250528 |doubao-seedance-1-0-pro-fast-251015 | |[文生视频](/docs/video-generation-tutorial#4e74bcee) | |✓ |✓ |✓ |✓ |✓ |✓ | |[图生视频-首帧](/docs/video-generation-tutorial#979b2d28) | |✓ |✓ |✓ |✓ |✓ |✓ | |[图生视频-首尾帧](/docs/video-generation-tutorial#0d55ca07) | |✓ |✓ |✓ |✓ |✓ |✗ | |[全模态参考](/docs/seedance-2-0#50e1b4ea) |图片参考 |✓ |✓ |✓ |✓ |✗ |✗ | |^^| | | | | | | | \ | |视频参考 |✓ |✓ |✓ |✓ |✗ |✗ | |^^| | | | | | | | \ | |音频参考 |✓ |✗(需搭配图片/视频) |✗(需搭配图片/视频) |✗(需搭配图片/视频) |✗ |✗ | |^^| | | | | | | | \ | |组合参考 |✓ |✓ |✓ |✓ |✗ |✗ | \ | | | | | | | | | \ | |* 图片 + 音频 | | | | | | | \ | |* 图片 + 视频 | | | | | | | \ | |* 视频 + 音频 | | | | | | | \ | |* 图片 + 视频 + 音频 | | | | | | | |[编辑视频](/docs/seedance-2-0#75a28782) | |✓ |✓ |✓ |✓ |✗ |✗ | |[延长视频](/docs/seedance-2-0#46d77653) | |✓ |✓ |✓ |✓ |✗ |✗ | |[生成有声视频](/docs/video-generation-tutorial#979b2d28) | |✓ |✓ |✓ |✓ |✗ |✗ | |[联网搜索工具](/docs/seedance-2-0#c40ed3ef) | |✓ |✓ |✓ |✓ |✗ |✗ | |[返回视频产物对应的尾帧图](/docs/video-generation-tutorial#141cf7fa) | |✓ |✓ |✓ |✓ |✓ |✓ | |[输出视频规格](/docs/video-generation-tutorial#9fe4cce0) |输出分辨率 |* 480p(8bit 位深) |* 480p(8bit 位深) |* 480p(8bit 位深) |* 480p(8bit 位深) |480p |480p | \ | | |* 720p(8bit 位深) |* 720p(8bit 位深) |* 720p(8bit 位深) |* 720p(8bit 位深) |720p |720p | \ | | |* 1080p(10bit 位深) |* 1080p(8bit 位深) | | |1080p |1080p | \ | | | |* 4k(10bit 位深) | | | | | | |输出宽高比 |21:9 |21:9 |21:9 |21:9 |21:9 |21:9 | \ | | |16:9 |16:9 |16:9 |16:9 |16:9 |16:9 | \ | | |4:3 |4:3 |4:3 |4:3 |4:3 |4:3 | \ | | |1:1 |1:1 |1:1 |1:1 |1:1 |1:1 | \ | | |3:4 |3:4 |3:4 |3:4 |3:4 |3:4 | \ | | |9:16 |9:16 |9:16 |9:16 |9:16 |9:16 | | |输出帧率 |24 fps |24 fps |24 fps |24 fps |24 fps |24 fps | | |输出时长 |4~30 秒 |4~15 秒 |4~15 秒 |4~15 秒 |2~12 秒 |2~12 秒 | | |输出视频格式 |mp4 |mp4 |mp4 |mp4 |mp4 |mp4 | |[离线推理](/docs/video-generation-tutorial#c3588bd1) | |✗ |✗ |✗ |✗ |✓ |✓ | # 基础使用 ## 文生视频 根据用户输入的提示词生成视频,结果具有较大的随机性,可以用于激发创作灵感。 |提示词 |输出 | |---|---| |写实风格,晴朗的蓝天之下,一大片白色的雏菊花田,镜头逐渐拉近,最终定格在一朵雏菊花的特写上,花瓣上有几颗晶莹的露珠 |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/b847f3e831c244b39f7b4d53d904988f) | **选项:Python** ```Python import os import time # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark # Make sure that you have stored the API Key in the environment variable ARK_API_KEY # Initialize the Ark client to read your API Key from an environment variable client = Ark( # This is the default path. You can configure it based on the service location base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key:https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.environ.get("ARK_API_KEY"), ) if __name__ == "__main__": print("----- create request -----") create_result = client.content_generation.tasks.create( model="doubao-seedance-2-5-260628", # Replace with Model ID content=[ { # Combination of text prompt and parameters "type": "text", "text": "写实风格,晴朗的蓝天之下,一大片白色的雏菊花田,镜头逐渐拉近,最终定格在一朵雏菊花的特写上,花瓣上有几颗晶莹的露珠" } ], ratio="16:9", duration=5, watermark=True, ) print(create_result) # Polling query section print("----- polling task status -----") task_id = create_result.id while True: get_result = client.content_generation.tasks.get(task_id=task_id) status = get_result.status if status == "succeeded": print("----- task succeeded -----") print(get_result) break elif status == "failed": print("----- task failed -----") print(f"Error: {get_result.error}") break else: print(f"Current status: {status}, Retrying after 10 seconds...") time.sleep(10) ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.content_generation.*; import com.volcengine.ark.runtime.service.ArkService; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; public class ContentGenerationTaskExample { // Make sure that you have stored the API Key in the environment variable ARK_API_KEY // Initialize the Ark client to read your API Key from an environment variable static String apiKey = System.getenv("ARK_API_KEY"); static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); static Dispatcher dispatcher = new Dispatcher(); static ArkService service = ArkService.builder() .baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .build(); public static void main(String[] args) { String model = "doubao-seedance-2-5-260628"; // Replace with Model ID String ratio = "16:9"; Long duration = 5L; Boolean watermark = true; System.out.println("----- create request -----"); List contents = new ArrayList<>(); // Combination of text prompt and parameters contents.add(ContentItem.builder() .type(ContentType.TEXT) .text("写实风格,晴朗的蓝天之下,一大片白色的雏菊花田,镜头逐渐拉近,最终定格在一朵雏菊花的特写上,花瓣上有几颗晶莹的露珠") .build()); // Create a video generation task CreateContentGenerationTaskRequest createRequest = CreateContentGenerationTaskRequest.builder() .model(model) .content(contents) .ratio(ratio) .duration(duration) .watermark(watermark) .build(); CreateContentGenerationTaskResponse createResult = service.createContentGenerationTask(createRequest); System.out.println(createResult); // Get the details of the task String taskId = createResult.getId(); String getRequest = taskId; // Polling query section System.out.println("----- polling task status -----"); while (true) { try { ContentGenerationTask getResponse = service.getContentGenerationTask(getRequest); String status = getResponse.getStatus().toString(); if ("succeeded".equalsIgnoreCase(status)) { System.out.println("----- task succeeded -----"); System.out.println(getResponse); break; } else if ("failed".equalsIgnoreCase(status)) { System.out.println("----- task failed -----"); System.out.println("Error: " + getResponse.getStatus()); break; } else { System.out.printf("Current status: %s, Retrying in 10 seconds...", status); TimeUnit.SECONDS.sleep(10); } } catch (InterruptedException ie) { Thread.currentThread().interrupt(); System.err.println("Polling interrupted"); break; } } } } ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "time" "github.com/volcengine/ark-runtime-go/arkruntime" model "github.com/volcengine/ark-runtime-go/arkruntime/model/contentgeneration" ) func main() { // Make sure that you have stored the API Key in the environment variable ARK_API_KEY // Initialize the Ark client to read your API Key from an environment variable client := arkruntime.NewClientWithApiKey( // Get your API Key from the environment variable. This is the default mode and you can modify it as required os.Getenv("ARK_API_KEY"), // The base URL for model invocation arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() // Replace with Model ID modelEp := "doubao-seedance-2-5-260628" // Generate a task fmt.Println("----- create request -----") createReq := &model.CreateContentGenerationTaskRequest{ Model: modelEp, Ratio: model.NewOptString("16:9"), Duration: model.NewOptInt64(5), Watermark: model.NewOptBool(true), Content: []model.ContentItem{ { // Combination of text prompt and parameters Type: model.ContentTypeText, Text: model.NewOptString("写实风格,晴朗的蓝天之下,一大片白色的雏菊花田,镜头逐渐拉近,最终定格在一朵雏菊花的特写上,花瓣上有几颗晶莹的露珠"), }, }, } createResp, err := client.CreateContentGenerationTask(ctx, createReq) if err != nil { fmt.Printf("create content generation error: %v", err) return } taskID := createResp.ID fmt.Printf("Task Created with ID: %s", taskID) // Polling query section fmt.Println("----- polling task status -----") for { getReq := taskID getResp, err := client.GetContentGenerationTask(ctx, getReq) if err != nil { fmt.Printf("get content generation task error: %v", err) return } status := getResp.Status if status == "succeeded" { fmt.Println("----- task succeeded -----") fmt.Printf("Task ID: %s \n", getResp.ID) fmt.Printf("Model: %s \n", getResp.Model) fmt.Printf("Video URL: %s \n", getResp.Content.Or(model.TaskContent{}).VideoURL.Or("")) fmt.Printf("Completion Tokens: %d \n", getResp.Usage.Or(model.TaskUsage{}).CompletionTokens) fmt.Printf("Created At: %d, Updated At: %d", getResp.CreatedAt.Or(0), getResp.UpdatedAt.Or(0)) return } else if status == "failed" { fmt.Println("----- task failed -----") if getResp.Error.IsSet() { fmt.Printf("Error Code: %s, Message: %s", getResp.Error.Value.Code, getResp.Error.Value.Message) } return } else { fmt.Printf("Current status: %s, Retrying in 10 seconds... \n", status) time.Sleep(10 * time.Second) } } } ``` ## 图生视频-基于首帧(`含音频`) 通过指定视频的首帧图片,模型能够基于该图片生成与之相关且画面连贯的视频内容。 |提示词 |首帧 |输出 | |---|---|---| |女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动,可以听到风声 |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/a28ec84ff9fc4287a0d98191020a3218~tplv-goo7wpa0wc-image.image) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/f1f7b95a38ee4ee094c724233e4da4f8) | **选项:Python** ```Python import os import time # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark # Make sure that you have stored the API Key in the environment variable ARK_API_KEY # Initialize the Ark client to read your API Key from an environment variable client = Ark( # This is the default path. You can configure it based on the service location base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key:https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.environ.get("ARK_API_KEY"), ) if __name__ == "__main__": print("----- create request -----") create_result = client.content_generation.tasks.create( model="doubao-seedance-2-5-260628", # Replace with Model ID content=[ { # Combination of text prompt and parameters "type": "text", "text": "女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动,可以听到风声" }, { # The URL of the first frame image "type": "image_url", "image_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/i2v_foxrgirl.png" } } ], generate_audio=True, ratio="adaptive", duration=5, watermark=True, ) print(create_result) # Polling query section print("----- polling task status -----") task_id = create_result.id while True: get_result = client.content_generation.tasks.get(task_id=task_id) status = get_result.status if status == "succeeded": print("----- task succeeded -----") print(get_result) break elif status == "failed": print("----- task failed -----") print(f"Error: {get_result.error}") break else: print(f"Current status: {status}, Retrying after 10 seconds...") time.sleep(10) ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.content_generation.*; import com.volcengine.ark.runtime.service.ArkService; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; public class ContentGenerationTaskExample { // Make sure that you have stored the API Key in the environment variable ARK_API_KEY // Initialize the Ark client to read your API Key from an environment variable static String apiKey = System.getenv("ARK_API_KEY"); static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); static Dispatcher dispatcher = new Dispatcher(); static ArkService service = ArkService.builder() .baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .build(); public static void main(String[] args) { String model = "doubao-seedance-2-5-260628"; // Replace with Model ID Boolean generateAudio = true; String ratio = "adaptive"; Long duration = 5L; Boolean watermark = true; System.out.println("----- create request -----"); List contents = new ArrayList<>(); // Combination of text prompt and parameters contents.add(ContentItem.builder() .type(ContentType.TEXT) .text("女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动,可以听到风声") .build()); // The URL of the first frame image contents.add(ContentItem.builder() .type(ContentType.IMAGE_URL) .imageUrl(ImageURL.builder() .url("https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/i2v_foxrgirl.png") .build()) .build()); // Create a video generation task CreateContentGenerationTaskRequest createRequest = CreateContentGenerationTaskRequest.builder() .model(model) .content(contents) .generateAudio(generateAudio) .ratio(ratio) .duration(duration) .watermark(watermark) .build(); CreateContentGenerationTaskResponse createResult = service.createContentGenerationTask(createRequest); System.out.println(createResult); // Get the details of the task String taskId = createResult.getId(); String getRequest = taskId; // Polling query section System.out.println("----- polling task status -----"); while (true) { try { ContentGenerationTask getResponse = service.getContentGenerationTask(getRequest); String status = getResponse.getStatus().toString(); if ("succeeded".equalsIgnoreCase(status)) { System.out.println("----- task succeeded -----"); System.out.println(getResponse); break; } else if ("failed".equalsIgnoreCase(status)) { System.out.println("----- task failed -----"); System.out.println("Error: " + getResponse.getStatus()); break; } else { System.out.printf("Current status: %s, Retrying in 10 seconds...", status); TimeUnit.SECONDS.sleep(10); } } catch (InterruptedException ie) { Thread.currentThread().interrupt(); System.err.println("Polling interrupted"); break; } } } } ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "time" "github.com/volcengine/ark-runtime-go/arkruntime" model "github.com/volcengine/ark-runtime-go/arkruntime/model/contentgeneration" ) func main() { // Make sure that you have stored the API Key in the environment variable ARK_API_KEY // Initialize the Ark client to read your API Key from an environment variable client := arkruntime.NewClientWithApiKey( // Get your API Key from the environment variable. This is the default mode and you can modify it as required os.Getenv("ARK_API_KEY"), // The base URL for model invocation arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() // Replace with Model ID modelEp := "doubao-seedance-2-5-260628" // Generate a task fmt.Println("----- create request -----") createReq := &model.CreateContentGenerationTaskRequest{ Model: modelEp, GenerateAudio: model.NewOptBool(true), Ratio: model.NewOptString("adaptive"), Duration: model.NewOptInt64(5), Watermark: model.NewOptBool(true), Content: []model.ContentItem{ { // Combination of text prompt and parameters Type: model.ContentTypeText, Text: model.NewOptString("女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动,可以听到风声"), }, { // The URL of the first frame image Type: model.ContentTypeImageURL, ImageURL: model.NewOptImageURL(model.ImageURL{ URL: "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/i2v_foxrgirl.png", }), }, }, } createResp, err := client.CreateContentGenerationTask(ctx, createReq) if err != nil { fmt.Printf("create content generation error: %v", err) return } taskID := createResp.ID fmt.Printf("Task Created with ID: %s", taskID) // Polling query section fmt.Println("----- polling task status -----") for { getReq := taskID getResp, err := client.GetContentGenerationTask(ctx, getReq) if err != nil { fmt.Printf("get content generation task error: %v", err) return } status := getResp.Status if status == "succeeded" { fmt.Println("----- task succeeded -----") fmt.Printf("Task ID: %s \n", getResp.ID) fmt.Printf("Model: %s \n", getResp.Model) fmt.Printf("Video URL: %s \n", getResp.Content.Or(model.TaskContent{}).VideoURL.Or("")) fmt.Printf("Completion Tokens: %d \n", getResp.Usage.Or(model.TaskUsage{}).CompletionTokens) fmt.Printf("Created At: %d, Updated At: %d", getResp.CreatedAt.Or(0), getResp.UpdatedAt.Or(0)) return } else if status == "failed" { fmt.Println("----- task failed -----") if getResp.Error.IsSet() { fmt.Printf("Error Code: %s, Message: %s", getResp.Error.Value.Code, getResp.Error.Value.Message) } return } else { fmt.Printf("Current status: %s, Retrying in 10 seconds... \n", status) time.Sleep(10 * time.Second) } } } ``` ## 图生视频-基于首尾帧(`含音频`) 通过指定视频的起始和结束图片,模型即可生成流畅衔接首、尾帧的视频,实现画面间自然、连贯的过渡效果。 |提示词 |首帧 |尾帧 |输出 | |---|---|---|---| |图中女孩对着镜头说“茄子”,360度环绕运镜 |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/649cb2057eae48d6a6eec872d912c75c~tplv-goo7wpa0wc-image.image) |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/e39fd8e500a34bbdad50d06659c4ea6b~tplv-goo7wpa0wc-image.image) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/3aa8c84b8a29408ab29e95992d61c559) | **选项:Python** ```Python import os import time # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark # Make sure that you have stored the API Key in the environment variable ARK_API_KEY # Initialize the Ark client to read your API Key from an environment variable client = Ark( # This is the default path. You can configure it based on the service location base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key:https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.environ.get("ARK_API_KEY"), ) if __name__ == "__main__": print("----- create request -----") create_result = client.content_generation.tasks.create( model="doubao-seedance-2-5-260628", # Replace with Model ID content=[ { # Combination of text prompt and parameters "type": "text", "text": "图中女孩对着镜头说\"茄子\",360度环绕运镜" }, { # The URL of the first frame image "type": "image_url", "image_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seepro_first_frame.jpeg" }, "role": "first_frame" }, { # The URL of the last frame image "type": "image_url", "image_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seepro_last_frame.jpeg" }, "role": "last_frame" } ], generate_audio=True, ratio="adaptive", duration=5, watermark=True, ) print(create_result) # Polling query section print("----- polling task status -----") task_id = create_result.id while True: get_result = client.content_generation.tasks.get(task_id=task_id) status = get_result.status if status == "succeeded": print("----- task succeeded -----") print(get_result) break elif status == "failed": print("----- task failed -----") print(f"Error: {get_result.error}") break else: print(f"Current status: {status}, Retrying after 10 seconds...") time.sleep(10) ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.content_generation.*; import com.volcengine.ark.runtime.service.ArkService; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; public class ContentGenerationTaskExample { // Make sure that you have stored the API Key in the environment variable ARK_API_KEY // Initialize the Ark client to read your API Key from an environment variable static String apiKey = System.getenv("ARK_API_KEY"); static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); static Dispatcher dispatcher = new Dispatcher(); static ArkService service = ArkService.builder() .baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .build(); public static void main(String[] args) { String model = "doubao-seedance-2-5-260628"; // Replace with Model ID Boolean generateAudio = true; String ratio = "adaptive"; Long duration = 5L; Boolean watermark = true; System.out.println("----- create request -----"); List contents = new ArrayList<>(); // Combination of text prompt and parameters contents.add(ContentItem.builder() .type(ContentType.TEXT) .text("图中女孩对着镜头说“茄子”,360度环绕运镜") .build()); // The URL of the first frame image contents.add(ContentItem.builder() .type(ContentType.IMAGE_URL) .imageUrl(ImageURL.builder() .url("https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seepro_first_frame.jpeg") .build()) .role("first_frame") .build()); // The URL of the last frame image contents.add(ContentItem.builder() .type(ContentType.IMAGE_URL) .imageUrl(ImageURL.builder() .url("https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seepro_last_frame.jpeg") .build()) .role("last_frame") .build()); // Create a video generation task CreateContentGenerationTaskRequest createRequest = CreateContentGenerationTaskRequest.builder() .model(model) .content(contents) .generateAudio(generateAudio) .ratio(ratio) .duration(duration) .watermark(watermark) .build(); CreateContentGenerationTaskResponse createResult = service.createContentGenerationTask(createRequest); System.out.println(createResult); // Get the details of the task String taskId = createResult.getId(); String getRequest = taskId; // Polling query section System.out.println("----- polling task status -----"); while (true) { try { ContentGenerationTask getResponse = service.getContentGenerationTask(getRequest); String status = getResponse.getStatus().toString(); if ("succeeded".equalsIgnoreCase(status)) { System.out.println("----- task succeeded -----"); System.out.println(getResponse); break; } else if ("failed".equalsIgnoreCase(status)) { System.out.println("----- task failed -----"); System.out.println("Error: " + getResponse.getStatus()); break; } else { System.out.printf("Current status: %s, Retrying in 10 seconds...", status); TimeUnit.SECONDS.sleep(10); } } catch (InterruptedException ie) { Thread.currentThread().interrupt(); System.err.println("Polling interrupted"); break; } } } } ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "time" "github.com/volcengine/ark-runtime-go/arkruntime" model "github.com/volcengine/ark-runtime-go/arkruntime/model/contentgeneration" ) func main() { // Make sure that you have stored the API Key in the environment variable ARK_API_KEY // Initialize the Ark client to read your API Key from an environment variable client := arkruntime.NewClientWithApiKey( // Get your API Key from the environment variable. This is the default mode and you can modify it as required os.Getenv("ARK_API_KEY"), // The base URL for model invocation arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() // Replace with Model ID modelEp := "doubao-seedance-2-5-260628" // Generate a task fmt.Println("----- create request -----") createReq := &model.CreateContentGenerationTaskRequest{ Model: modelEp, GenerateAudio: model.NewOptBool(true), Ratio: model.NewOptString("adaptive"), Duration: model.NewOptInt64(5), Watermark: model.NewOptBool(true), Content: []model.ContentItem{ { // Combination of text prompt and parameters Type: model.ContentTypeText, Text: model.NewOptString("图中女孩对着镜头说“茄子”,360度环绕运镜"), }, { // The URL of the first frame image Type: model.ContentTypeImageURL, ImageURL: model.NewOptImageURL(model.ImageURL{ URL: "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seepro_first_frame.jpeg", }), Role: model.NewOptString("first_frame"), }, { // The URL of the last frame image Type: model.ContentTypeImageURL, ImageURL: model.NewOptImageURL(model.ImageURL{ URL: "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seepro_last_frame.jpeg", }), Role: model.NewOptString("last_frame"), }, }, } createResp, err := client.CreateContentGenerationTask(ctx, createReq) if err != nil { fmt.Printf("create content generation error: %v", err) return } taskID := createResp.ID fmt.Printf("Task Created with ID: %s", taskID) // Polling query section fmt.Println("----- polling task status -----") for { getReq := taskID getResp, err := client.GetContentGenerationTask(ctx, getReq) if err != nil { fmt.Printf("get content generation task error: %v", err) return } status := getResp.Status if status == "succeeded" { fmt.Println("----- task succeeded -----") fmt.Printf("Task ID: %s \n", getResp.ID) fmt.Printf("Model: %s \n", getResp.Model) fmt.Printf("Video URL: %s \n", getResp.Content.Or(model.TaskContent{}).VideoURL.Or("")) fmt.Printf("Completion Tokens: %d \n", getResp.Usage.Or(model.TaskUsage{}).CompletionTokens) fmt.Printf("Created At: %d, Updated At: %d", getResp.CreatedAt.Or(0), getResp.UpdatedAt.Or(0)) return } else if status == "failed" { fmt.Println("----- task failed -----") if getResp.Error.IsSet() { fmt.Printf("Error Code: %s, Message: %s", getResp.Error.Value.Code, getResp.Error.Value.Message) } return } else { fmt.Printf("Current status: %s, Retrying in 10 seconds... \n", status) time.Sleep(10 * time.Second) } } } ``` ## ## 管理视频任务 ### 查询视频生成任务列表 该接口支持传入条件筛选参数,以查询符合条件的视频生成任务列表。 **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks?page_size=2&filter.status=succeeded& \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" ``` **选项:Python** ```Python import os from arkruntime import Ark # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey client = Ark( api_key=os.environ.get("ARK_API_KEY"), base_url="https://ark.cn-beijing.volces.com/api/v3", ) if __name__ == "__main__": resp = client.content_generation.tasks.get( task_id="", ) print(resp) ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.content_generation.*; import com.fasterxml.jackson.core.JsonProcessingException; import com.volcengine.ark.runtime.service.ArkService; import java.util.concurrent.TimeUnit; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; public class Sample { static String apiKey = System.getenv("ARK_API_KEY"); static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); static Dispatcher dispatcher = new Dispatcher(); static ArkService service = ArkService.builder() .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); public static void main(String[] args) throws JsonProcessingException { ListContentGenerationTasksRequest req = ListContentGenerationTasksRequest.builder().pageNum(1).pageSize(3).filterStatus(TaskStatus.SUCCEEDED).build(); System.out.println(service.listContentGenerationTasks(req)); // shutdown service after all requests is finished service.shutdownExecutor(); } } ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" model "github.com/volcengine/ark-runtime-go/arkruntime/model/contentgeneration" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() req := &arkruntime.ListContentGenerationTasksRequest{ PageSize: int32Pointer(3), Status: taskStatusPointer(model.TaskStatus("succeeded")), } resp, err := client.ListContentGenerationTasks(ctx, req) if err != nil { fmt.Printf("failed to list content generation tasks: %v\n", err) return } fmt.Printf("%+v\n", resp) } func int32Pointer(value int32) *int32 { return &value } func taskStatusPointer(value model.TaskStatus) *model.TaskStatus { return &value } ``` ### 删除或取消视频生成任务 取消排队中的视频生成任务,或者删除视频生成任务记录。 **选项:Curl** ```Bash # Replace with the ID acquired from "Create Video Generation Task". curl -X DELETE "https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks/" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" ``` **选项:Python** ```Python import os from arkruntime import Ark client = Ark( api_key=os.environ.get("ARK_API_KEY"), base_url="https://ark.cn-beijing.volces.com/api/v3", ) if __name__ == "__main__": try: client.content_generation.tasks.delete( task_id="", ) except Exception as e: print(f"failed to delete task: {e}") ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.content_generation.*; import com.fasterxml.jackson.core.JsonProcessingException; import com.volcengine.ark.runtime.service.ArkService; import java.util.concurrent.TimeUnit; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; public class Sample { static String apiKey = System.getenv("ARK_API_KEY"); static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); static Dispatcher dispatcher = new Dispatcher(); static ArkService service = ArkService.builder() .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); public static void main(String[] args) throws JsonProcessingException { String req = ""; service.deleteContentGenerationTask(req); service.shutdownExecutor(); } } ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() req := "" err := client.DeleteContentGenerationTask(ctx, req) if err != nil { fmt.Printf("delete content generation task error: %v\n", err) return } } ``` ## 自定义视频输出规格 通过 API 参数控制输出视频的规格,包括分辨率、宽高比、时长、是否包含水印等。 **常规方式(推荐)**:在 request body 中直接传入参数 > 此方式为强校验,若参数填写错误,模型会返回错误提示。 ```JSON "content": [ { "type": "text", "text": "" } ], "resolution": "720p", "ratio":"16:9", "duration": 5, "seed": 11, "camera_fixed": false, "watermark": true ``` 旧方式:在文本提示词后追加 --[parameters] > 此方式为弱校验,若参数填写错误,该参数将被忽略或触发报错。 ```JSON "content": [ { "type": "text", "text": " --rs 720p --rt 16:9 --dur 5 --seed 11 --cf false --wm true" } ] ``` ### 分辨率和宽高比 通过以下参数控制输出视频的分辨率和宽高比,分辨率和宽高比将共同决定输出视频的像素尺寸。 - **resolution**:指定输出视频的分辨率,支持 480p,720p,1080p,4k。 - **ratio**:指定输出视频的宽高比,支持 16:9,4:3,1:1,3:4,9:16,21:9,adaptive。 > **说明** > > Seedance 2.5 在视频编辑、视频延长、首帧/首尾帧生视频任务下,ratio 仅支持 adaptive(自动保持与输入视频一致的宽高比),不支持自行设置具体宽高比。详见 [配置方法](/docs/seedance-2-5#2.5_param_constraints)。 ```Json { "resolution": "720p", "ratio":"16:9" } ``` 各模型输出视频的像素尺寸如下: | 分辨率 | 宽高比 | Seedance 2.5 | Seedance 2.0 系列 | Seedance 1.0 系列 | | ------------------------------------- | --------- | -------------------- | -------------------- | -------------------- | | 480p | 16:9 | 854×480 | 864×496 | 864×480 | | ^^ | 4:3 | 752×560 | 752×560 | 736×544 | | ^^ | 1:1 | 640×640 | 640×640 | 640×640 | | ^^ | 3:4 | 560×752 | 560×752 | 544×736 | | ^^ | 9:16 | 480×854 | 496×864 | 480×864 | | ^^ | 21:9 | 992×432 | 992×432 | 960×416 | | 720p | 16:9 | 1280×720 | 1280×720 | 1248×704 | | ^^ | 4:3 | 1112×834 | 1112×834 | 1120×832 | | ^^ | 1:1 | 960×960 | 960×960 | 960×960 | | ^^ | 3:4 | 834×1112 | 834×1112 | 832×1120 | | ^^ | 9:16 | 720×1280 | 720×1280 | 704×1248 | | ^^ | 21:9 | 1470×630 | 1470×630 | 1504×640 | | 1080p | 16:9 | 1920×1080 | 1920×1080 | 1920×1088 | \ | > Seedance 2.0 Fast、Seedance 2.0 Mini 暂不支持 | | | | | | ^^ | 4:3 | 1664×1248 | 1664×1248 | 1664×1248 | | ^^ | 1:1 | 1440×1440 | 1440×1440 | 1440×1440 | | ^^ | 3:4 | 1248×1664 | 1248×1664 | 1248×1664 | | ^^ | 9:16 | 1080×1920 | 1080×1920 | 1088×1920 | | ^^ | 21:9 | 2206×946 | 2206×946 | 2176×928 | | 4k | 16:9 | — | 3840×2160 | — | \ | > 仅 Seedance 2.0 支持 | | | | | | ^^ | 4:3 | — | 3326×2494 | — | | ^^ | 1:1 | — | 2880×2880 | — | | ^^ | 3:4 | — | 2494×3326 | — | | ^^ | 9:16 | — | 2160×3840 | — | | ^^ | 21:9 | — | 4398×1886 | — | ### 视频时长 通过 **duration** 参数控制生成视频的时长(整数秒): - Seedance 1.0 系列: [2, 12] - Seedance 2.0 系列: [4,15] 或设置为-1 - Seedance 2.5: [4,30] 或设置为-1 > -1 表示智能指定时长,由模型在有效范围内自主选择合适的视频长度 > **说明** > > Seedance 2.5 在 [视频编辑任务](/docs/seedance-2-5#2.5_task_type_intro) 下,duration 仅支持 -1(自动保持与输入视频基本一致的时长),不支持自行设置具体秒数。详见 [配置方法](/docs/seedance-2-5#2.5_param_constraints)。 ```Json { "duration": 5 } ``` **Seedance 1.0 系列**模型还支持通过 **frames** 参数指定生成视频的帧数,从而生成小数秒的视频。 - 计算公式:帧数 = 时长 × 帧率(24)。 - 取值范围:frames 支持 [29, 289] 区间内所有满足 25 + 4n 格式的整数值,其中 n 为正整数。 - 注意事项:duration 和 frames 二选一即可,frames 的优先级高于 duration。 ```Json { "frames": 29 } ``` ### 视频中添加水印 通过 watermark 参数,来控制是否在生成的视频中添加水印。 - true:在视频右下角添加`AI生成`水印标识。 - false:不添加水印。 ```Json { "watermark": true } ``` ## 提示词建议 * **提示词 = 主体 + 运动, 背景 + 运动,镜头 + 运动 ...** * 用简洁准确的自然语言写出你想要的效果。 * 如果有较为明确的效果预期,建议先用生图模型生成符合预期的图片,再用图生视频进行视频片段的生成。 * 文生视频会有较大的结果随机性,可以用于激发创作灵感 * 图生视频时请尽量上传高清高质量的图片,上传图片的质量对图生视频影响较大。 * 当生成的视频不符合预期时,建议修改提示词,将抽象描述换成具象描述,并注意删除不重要的部分,将重要内容前置。 * 更多提示词的使用技巧请参见 [Doubao Seedance 2.0 系列提示词指南](/docs/seedance-2-0-prompt-guide)、[Seedance 1.0 系列提示词指南](/docs/seedance-1-0-pro-pro-fast)。 # 进阶使用 ## 离线推理 > Seedance 2.5、Seedance 2.0 系列不支持 针对推理时延敏感度低(例如小时级响应)的场景,建议将 **service_tier** 设为 `flex`,一键切换至离线推理模式——价格仅为在线推理的 50%,显著降低业务成本。 注意根据业务场景设置合适的超时时间,超过该时间后任务将自动终止。 **选项:Python** ```Python import os import time # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark # Make sure that you have stored the API Key in the environment variable ARK_API_KEY # Initialize the Ark client to read your API Key from an environment variable client = Ark( # This is the default path. You can configure it based on the service location base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.environ.get("ARK_API_KEY"), ) if __name__ == "__main__": print("----- create request -----") create_result = client.content_generation.tasks.create( model="doubao-seedance-1-0-pro-250528", # Replace with Model ID content=[ { # Combination of text prompt and parameters "type": "text", "text": "女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动" }, { # The URL of the first frame image "type": "image_url", "image_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/i2v_foxrgirl.png" } } ], ratio="adaptive", duration=5, watermark=True, service_tier="flex", execution_expires_after=172800, ) print(create_result) # Polling query section print("----- polling task status -----") task_id = create_result.id while True: get_result = client.content_generation.tasks.get(task_id=task_id) status = get_result.status if status == "succeeded": print("----- task succeeded -----") print(get_result) break elif status == "failed": print("----- task failed -----") print(f"Error: {get_result.error}") break else: print(f"Current status: {status}, Retrying after 60 seconds...") time.sleep(60) ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.content_generation.*; import com.volcengine.ark.runtime.service.ArkService; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; public class ContentGenerationTaskExample { // Make sure that you have stored the API Key in the environment variable ARK_API_KEY // Initialize the Ark client to read your API Key from an environment variable static String apiKey = System.getenv("ARK_API_KEY"); static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); static Dispatcher dispatcher = new Dispatcher(); static ArkService service = ArkService.builder() .baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .build(); public static void main(String[] args) { String model = "doubao-seedance-1-0-pro-250528"; // Replace with Model ID String ratio = "adaptive"; Long duration = 5L; Boolean watermark = true; String serviceTier = "flex"; Long executionExpiresAfter = 172800L; System.out.println("----- create request -----"); List contents = new ArrayList<>(); // Combination of text prompt and parameters contents.add(ContentItem.builder() .type(ContentType.TEXT) .text("女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动") .build()); // The URL of the first frame image contents.add(ContentItem.builder() .type(ContentType.IMAGE_URL) .imageUrl(ImageURL.builder() .url("https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/i2v_foxrgirl.png") .build()) .build()); // Create a video generation task CreateContentGenerationTaskRequest createRequest = CreateContentGenerationTaskRequest.builder() .model(model) .content(contents) .ratio(ratio) .duration(duration) .watermark(watermark) .serviceTier(serviceTier) .executionExpiresAfter(executionExpiresAfter) .build(); CreateContentGenerationTaskResponse createResult = service.createContentGenerationTask(createRequest); System.out.println(createResult); // Get the details of the task String taskId = createResult.getId(); String getRequest = taskId; // Polling query section System.out.println("----- polling task status -----"); while (true) { try { ContentGenerationTask getResponse = service.getContentGenerationTask(getRequest); String status = getResponse.getStatus().toString(); if ("succeeded".equalsIgnoreCase(status)) { System.out.println("----- task succeeded -----"); System.out.println(getResponse); break; } else if ("failed".equalsIgnoreCase(status)) { System.out.println("----- task failed -----"); System.out.println("Error: " + getResponse.getStatus()); break; } else { System.out.printf("Current status: %s, Retrying in 60 seconds...", status); TimeUnit.SECONDS.sleep(60); } } catch (InterruptedException ie) { Thread.currentThread().interrupt(); System.err.println("Polling interrupted"); break; } } } } ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "time" "github.com/volcengine/ark-runtime-go/arkruntime" model "github.com/volcengine/ark-runtime-go/arkruntime/model/contentgeneration" ) func main() { // Make sure that you have stored the API Key in the environment variable ARK_API_KEY // Initialize the Ark client to read your API Key from an environment variable client := arkruntime.NewClientWithApiKey( // Get your API Key from the environment variable. This is the default mode and you can modify it as required os.Getenv("ARK_API_KEY"), // The base URL for model invocation arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() // Replace with Model ID modelEp := "doubao-seedance-1-0-pro-250528" // Generate a task fmt.Println("----- create request -----") createReq := &model.CreateContentGenerationTaskRequest{ Model: modelEp, Ratio: model.NewOptString("adaptive"), Duration: model.NewOptInt64(5), Watermark: model.NewOptBool(true), ServiceTier: model.NewOptString("flex"), ExecutionExpiresAfter: model.NewOptInt64(172800), Content: []model.ContentItem{ { // Combination of text prompt and parameters Type: model.ContentTypeText, Text: model.NewOptString("女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动"), }, { // The URL of the first frame image Type: model.ContentTypeImageURL, ImageURL: model.NewOptImageURL(model.ImageURL{ URL: "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/i2v_foxrgirl.png", }), }, }, } createResp, err := client.CreateContentGenerationTask(ctx, createReq) if err != nil { fmt.Printf("create content generation error: %v", err) return } taskID := createResp.ID fmt.Printf("Task Created with ID: %s", taskID) // Polling query section fmt.Println("----- polling task status -----") deadline := time.Now().Add(24 * time.Hour) for { getReq := taskID getResp, err := client.GetContentGenerationTask(ctx, getReq) if err != nil { fmt.Printf("get content generation task error: %v", err) return } status := getResp.Status if status == "succeeded" { fmt.Println("----- task succeeded -----") fmt.Printf("Task ID: %s \n", getResp.ID) fmt.Printf("Model: %s \n", getResp.Model) fmt.Printf("Video URL: %s \n", getResp.Content.Or(model.TaskContent{}).VideoURL.Or("")) fmt.Printf("Completion Tokens: %d \n", getResp.Usage.Or(model.TaskUsage{}).CompletionTokens) fmt.Printf("Created At: %d, Updated At: %d", getResp.CreatedAt.Or(0), getResp.UpdatedAt.Or(0)) return } else if status == "failed" { fmt.Println("----- task failed -----") if getResp.Error.IsSet() { fmt.Printf("Error Code: %s, Message: %s", getResp.Error.Value.Code, getResp.Error.Value.Message) } return } else { if time.Now().After(deadline) { fmt.Printf("Task %s is still %s; query it later by task ID.\n", taskID, status) return } fmt.Printf("Current status: %s, Retrying in 60 seconds... \n", status) time.Sleep(60 * time.Second) } } } ``` ## 样片模式 样片(Draft)模式是一种“先预览生成效果,再生成高质量成片”的两步式视频生成方式。开启该功能后,您可以先生成一段低分辨率的预览视频,用于验证其场景结构、镜头调度、主体动作和提示词意图等关键要素;确认结果符合预期后,再使用 Draft 视频任务 ID 生成高质量成片。 目前仅 Doubao Seedance 2.5 支持样片模式。参数限制、计费方式和操作步骤参见 [Doubao Seedance 2.5 样片模式](/docs/seedance-2-5#2.5_draft_mode)。 ## 生成多个连续视频 使用前一个生成视频的尾帧,作为后一个视频任务的首帧,循环生成多个连续的视频。 后续您可以自行使用 FFmpeg 等工具,将生成的多个短视频拼接成一个完整长视频。 |输出1 |输出2 |输出3 | |---|---|---| |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/c984894e448f43ca8a593babe411a078) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/ccb8cebc70bd42738ba8d4bb894b69e6) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/b78ed8dd418a4c97ac94253cb0c00728) | \ | | | | \ |> 女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动 |> 女孩和狐狸在草地上奔跑,阳光明媚,女孩的笑容灿烂,狐狸欢快地跳跃 |> 女孩和狐狸坐在树下休息,女孩轻轻抚摸狐狸的毛发,狐狸温顺地趴在女孩腿上 | \ |> A girl holding a fox, the girl opens her eyes, looks gently at the camera, the fox hugs affectionately, the camera slowly pulls out, the girl's hair is blown by the wind |> A girl and a fox running on the grass, sunny weather, the girl's smile is brilliant, the fox jumps happily |> A girl and a fox resting under a tree, the girl gently strokes the fox's fur, the fox lies meekly on the girl's lap | ```Python import os import time # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark # Make sure that you have stored the API Key in the environment variable ARK_API_KEY # Initialize the Ark client to read your API Key from an environment variable client = Ark( # This is the default path. You can configure it based on the service location base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key:https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.environ.get("ARK_API_KEY"), ) def generate_video_with_last_frame(prompt, initial_image_url=None): """ Generate video and return video URL and last frame URL Parameters: prompt: Text prompt for video generation initial_image_url: Initial image URL (optional) Returns: video_url: Generated video URL last_frame_url: URL of the last frame of the video """ print(f"----- Generating video: {prompt} -----") # Build content list content = [{ "text": prompt, "type": "text" }] # If initial image is provided, add to content if initial_image_url: content.append({ "image_url": { "url": initial_image_url }, "type": "image_url" }) # Create video generation task create_result = client.content_generation.tasks.create( model="doubao-seedance-2-5-260628", # Replace with Model ID content=content, return_last_frame=True, ratio="adaptive", duration=5, watermark=True, ) # Poll to check task status task_id = create_result.id while True: get_result = client.content_generation.tasks.get(task_id=task_id) status = get_result.status if get_result.status == "succeeded": print("Video generation succeeded") try: if hasattr(get_result, 'content') and hasattr(get_result.content, 'video_url') and hasattr(get_result.content, 'last_frame_url'): return get_result.content.video_url, get_result.content.last_frame_url print("Failed to obtain video URL or last frame URL") return None, None except Exception as e: print(f"Error occurred while obtaining video URL and last frame URL: {e}") return None, None elif status == "failed": print(f"----- Video generation failed -----") print(f"Error: {get_result.error}") return None, None else: print(f"Current status: {status}, retrying in 10 seconds...") time.sleep(10) if __name__ == "__main__": # Define 3 video prompts prompts = [ "女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动", "女孩和狐狸在草地上奔跑,阳光明媚,女孩的笑容灿烂,狐狸欢快地跳跃", "女孩和狐狸坐在树下休息,女孩轻轻抚摸狐狸的毛发,狐狸温顺地趴在女孩腿上" ] # Store generated video URLs video_urls = [] # Initial image URL initial_image_url = "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/i2v_foxrgirl.png" # Generate 3 short videos for i, prompt in enumerate(prompts): print(f"Generating video {i+1}") video_url, last_frame_url = generate_video_with_last_frame(prompt, initial_image_url) if video_url and last_frame_url: video_urls.append(video_url) print(f"Video {i+1} URL: {video_url}") # Use the last frame of the current video as the first frame of the next video initial_image_url = last_frame_url else: print(f"Video {i+1} generation failed, exiting program") exit(1) print("All videos generated successfully!") print("Generated video URL list:") for i, url in enumerate(video_urls): print(f"Video {i+1}: {url}") ``` ## 使用 Webhook 通知 通过 **callback_url** 参数可以指定一个回调通知地址,当视频生成任务的状态发生变化时,方舟会向该地址发送一条 POST 请求,方便您及时获取任务最新情况。 请求内容结构与 [查询任务API](/docs/get-video-generation-task-api) 的返回体一致。 ```Bash { "id": "", "model": "doubao-seedance-2-5-260628", "status": "running", # Possible status values: queued, running, succeeded, failed, expired "created_at": 1765434920, "updated_at": 1765434920, "service_tier": "default", "execution_expires_after": 172800 } ``` 您需要自行搭建一个公网可访问的 Web Server 来接收 Webhook 通知。以下是一个简单的 Web Server 代码示例,供您参考。 ```Python # Building a Simple Web Server with Python Flask for Webhook Notification Processing from flask import Flask, request, jsonify import sqlite3 import logging from datetime import datetime import os # === Basic Configuration === app = Flask(__name__) # Configure logging logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s', handlers=[logging.FileHandler('webhook.log'), logging.StreamHandler()] ) # Database path DB_PATH = 'video_tasks.db' # === Database Initialization === def init_db(): """Automatically create task table on first run, aligning fields with callback parameters""" conn = sqlite3.connect(DB_PATH) cursor = conn.cursor() # Create table: task_id as primary key for idempotent updates cursor.execute(''' CREATE TABLE IF NOT EXISTS video_generation_tasks ( task_id TEXT PRIMARY KEY, model TEXT NOT NULL, status TEXT NOT NULL, created_at INTEGER NOT NULL, updated_at INTEGER NOT NULL, service_tier TEXT NOT NULL, execution_expires_after INTEGER NOT NULL, last_callback_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ''') conn.commit() conn.close() logging.info("Database initialized, table created/exists") # === Core Webhook Interface === @app.route('/webhook/callback', methods=['POST']) def video_task_callback(): """Core interface for receiving Ark callback""" try: # 1. Parse callback request body (JSON format) callback_data = request.get_json() if not callback_data: logging.error("Callback request body empty or non-JSON format") return jsonify({"code": 400, "msg": "Invalid JSON data"}), 400 # 2. Validate required fields required_fields = ['id', 'model', 'status', 'created_at', 'updated_at', 'service_tier', 'execution_expires_after'] for field in required_fields: if field not in callback_data: logging.error(f"Callback data missing required field: {field}, data: {callback_data}") return jsonify({"code": 400, "msg": f"Missing field: {field}"}), 400 # 3. Extract key information and log task_id = callback_data['id'] status = callback_data['status'] model = callback_data['model'] logging.info(f"Received task callback | Task ID: {task_id} | Status: {status} | Model: {model}") print(f"[{datetime.now()}] Task {task_id} status updated to: {status}") # Console output # 4. Database operation conn = sqlite3.connect(DB_PATH) cursor = conn.cursor() cursor.execute(''' INSERT OR REPLACE INTO video_generation_tasks ( task_id, model, status, created_at, updated_at, service_tier, execution_expires_after ) VALUES (?, ?, ?, ?, ?, ?, ?) ''', ( task_id, model, status, callback_data['created_at'], callback_data['updated_at'], callback_data['service_tier'], callback_data['execution_expires_after'] )) conn.commit() conn.close() logging.info(f"Task {task_id} database update successful") # 5. Return 200 response return jsonify({"code": 200, "msg": "Callback received successfully", "task_id": task_id}), 200 except Exception as e: # Catch all exceptions to avoid returning 5xx logging.error(f"Callback processing failed: {str(e)}", exc_info=True) return jsonify({"code": 200, "msg": "Callback received successfully (internal processing exception)"}), 200 # === Helper Interface (Optional, for querying task status) === @app.route('/tasks/', methods=['GET']) def get_task_status(task_id): """Query latest status of specified task""" conn = sqlite3.connect(DB_PATH) cursor = conn.cursor() cursor.execute('SELECT * FROM video_generation_tasks WHERE task_id = ?', (task_id,)) task = cursor.fetchone() conn.close() if not task: return jsonify({"code": 404, "msg": "Task not found"}), 404 # Map field names for response fields = ['task_id', 'model', 'status', 'created_at', 'updated_at', 'service_tier', 'execution_expires_after', 'last_callback_at'] task_dict = dict(zip(fields, task)) return jsonify({"code": 200, "data": task_dict}), 200 # === Service Startup === if __name__ == '__main__': # Initialize database init_db() # Start Flask service (bind to 0.0.0.0 for public access, port customizable) # Test environment: debug=True; Production environment should disable debug and use gunicorn app.run(host='0.0.0.0', port=8080, debug=False) ``` # 使用限制 ## 全模态输入 > **注意** > > Seedance 2.5 和 Seedance 2.0 系列模型不支持直接上传含有真人人脸的参考图/视频。为了便利创作者对肖像的使用,平台推出了一系列解决方案,详情参见 [便利创作含肖像视频](/docs/seedance-portrait-asset-guide) 章节。 **图片要求** * 传入方式:图片 URL、图片 Base64 编码、素材 ID。 * 图片格式:jpeg、png、webp、bmp、tiff、gif。其中,Seedance 2.0 系列及以上模型支持 heic 和 heif。 * 单个图片尺寸: * 宽高比(宽/高): [0.4, 2.5] * 宽高长度(px):[300, 6000] * 大小:单张图片小于 30 MB。请求体大小不超过 64 MB。大文件请勿使用Base64编码。 * 图片数量: * 图生视频-首帧:1 张 * 图生视频-首尾帧:2 张 * seedance 2.5 全模态参考生视频:1~30 张 * seedance 2.0 全模态参考生视频:1~9 张 **视频要求** * 传入方式:视频URL、素材 ID。 * 视频格式:mp4、mov,支持编码格式见下表。 * 分辨率:480p,720p,1080p,4k * 时长: * Seedance 2.5: * 非视频编辑任务:单个视频时长 [2, 30] s。 * [视频编辑任务](/docs/seedance-2-5#2.5_task_type_intro):单个视频时长 [4, 30] s。 * 最多传入 10 个参考视频,所有视频总时长不超过 30 s。 * Seedance 2.0 系列:单个视频时长 [2, 15] s,最多传入 3 个参考视频,所有视频总时长不超过 15 s。 * 单个视频尺寸: * 宽高比(宽/高):[0.4, 2.5] * 宽高长度(px):[300, 6000] * 总像素数:[614×664=407696, 3326×2494=8295044],即宽和高的乘积符合 [407696, 8295044] 的区间要求。 * 大小:单个视频不超过 200 MB。 * 帧率 (FPS):[24, 60] |**容器格式** |**常用文件扩展名** |**MIME** |**支持编码** | |---|---|---|---| |MP4 |.mp4 |video/mp4 |视频:H.264/AVC、H.265/HEVC | \ | | | |音频:AAC、MP3 | |QuickTime |.mov |video/quicktime |视频:H.264/AVC、H.265/HEVC | \ | | | |音频:AAC、MP3 | **音频要求** * 传入方式:音频 URL 、音频 Base64 编码、素材 ID。 * 音频格式:wav、mp3 * 时长: * Seedance 2.5:单个音频时长 [2, 30] s,最多传入 10 段参考音频,所有音频总时长不超过 30 s。 * Seedance 2.0 系列:单个音频时长 [2, 15] s,最多传入 3 段参考音频,所有音频总时长不超过 15 s。 * 大小:单个音频不超过 15 MB,请求体大小不超过 64 MB。大文件请勿使用Base64编码。 ## 保存时间 - 任务记录:保存 7 天,查询区间 [T-7天, T),T 为请求发起时刻的 UTC 秒级时间戳。 - 视频 URL:保存 24 小时(超时后无法访问),下载次数上限为 100 次,请及时下载或转存。 ## 限流说明 同一主账号下,使用同一模型(不区分版本)的请求受到以下限制。超过对应限制会返回 “429: 'Too Many Requests'” 错误。 ### 模型维度的限流 **在线推理** > 不同模型的 RPM 和最大并发任务数不同,详见 [视频生成能力](/docs/model-list#7571da3f)。 * **RPM(Requests Per Minute)**:每分钟允许创建的视频生成任务数上限。超过上限时,创建任务请求将因触发限流而失败。 * **最大并发任务数**:同一时刻可处于处理状态的任务数上限。达到上限后,新创建的任务将进入队列等待处理。 **离线推理** > 不同模型的 TPD 限流值不同,详见 [视频生成能力](/docs/model-list#7571da3f)。 * **TPD(Tokens Per Day)**:每天可以处理的 token 量限制。 ### 非推理 API 请求频率限制 * **QPS(Queries Per Second)**:每秒允许的请求数上限。超过上限时,任务请求将因触发限流而失败。 |接口名称 |账号维度的 QPS 上限 | |---|---| |查询视频生成任务 |20 | |查询视频生成任务列表 |1 | |取消或删除视频生成任务 |20 | ## 图片裁剪规则 **seedance 系列模型的图生视频场景,支持设置生成视频的宽高比**。当选择的视频宽高与您上传的图片宽高比不一致时,方舟会对您的图片进行裁剪,裁剪时会居中裁剪。详细规则如下: > **说明** > > 若要呈现出较好的视频效果,建议所指定的视频宽高比(ratio)与实际上传图片的宽高比尽可能接近。 1. 输入参数: * 原始图片宽度记为`W`(单位:像素),高度记为`H`(单位:像素)。 * 目标比例记为`A:B`(例如,21:9),这表示裁剪后的宽度与高度之比应为 `A/B`(如 21/9≈2.333)。 2. 比较宽高比: * 计算原始图片的宽高比`Ratio_原始=W/H`。 * 计算目标比例的比值`Ratio_目标=A/B`(例如,21:9 的 Ratio目标=21/9≈2.333)。 * 根据比较结果,决定裁剪基准: * 如果`Ratio_原始Ratio_目标`(即原始图片“太宽”或“横宽”),则以高度为基准裁剪。 * 如果相等,则无需裁剪,直接使用全图。 3. 裁剪尺寸计算(量化公式): * 以宽度为基准(适用于竖高图片): * 裁剪宽度`Crop_W=W`(使用整个原始宽度)。 * 裁剪高度`Crop_H=(B/A)×W`(根据目标比例等比例计算高度)。 * 裁剪区域的起始坐标(居中定位): * X 坐标(水平):总是 0(因为宽度全用,从左侧开始)。 * Y 坐标(垂直):`(H−Crop_H)/2`(确保垂直居中,从顶部开始)。 * 以高度为基准(适用于横宽图片): * 裁剪高度`Crop_H=H`(使用整个原始高度)。 * 裁剪宽度`Crop_W=(A/B)×H`(根据目标比例等比例计算宽度)。 * 裁剪区域的起始坐标(居中定位): * X 坐标(水平):`(W−Crop_W)/2`(确保水平居中,从左侧开始)。 * Y 坐标(垂直):总是 0(因为高度全用,从顶部开始)。 4. 裁剪结果: * 最终裁剪出的图片尺寸为`Crop_W×Crop_H`,比例严格为`A:B`,且完全位于原始图片内部,无黑边。 * 裁剪区域总是以原始图片中心为基准,因此内容居中。 5. 裁剪示例: > 以 seedance 1.0 Pro 首帧图生视频功能为例 |输入的首帧图片 |指定的宽高比ratio |生成的视频结果 | |---|---|---| |16:9 |21:9 |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/6e8590c07be9406d805209355b799a37) | \ | | | | \ | | | | \ |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/c66d7faff6104320a981b36149dc713f~tplv-goo7wpa0wc-image.image) | | | |^^| | | \ | |16:9 |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/e0bef5f3806f439da5f0c9f5acc44c9b) | |^^| | | \ | |4:3 |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/a8e3202b77744bec83e0c7baa247b84c) | |^^| | | \ | |1:1 |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/436df8f6dae74d6c86d08bf1e18bc9d0) | |^^| | | \ | |3:4 |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/a3a94a577d754501889535a651d03a55) | |^^| | | \ | |9:16 |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/1423ee0fc9cf451398788dc57e9f55c4) | --- # Doubao Seedance 便利创作含肖像视频 Source: https://ark.volcengine.com/region:cn-beijing/docs/seedance-portrait-asset-guide Seedance 2.5、Seedance 2.0 系列模型不支持直接上传含有真人人脸的参考图/视频。为便利创作者使用肖像素材进行视频生成,平台提供以下解决方案。 |方案 |介绍 | |---|---| |[信任模型产物作为输入素材](/docs/seedance-portrait-asset-guide#trust-model-output) | 本账号下部分模型生成的含人脸原始产物可作为输入素材,再次调用 Seedance 2.5、Seedance 2.0 系列模型进行二次创作,不会触发输入审核拦截。 | |[使用预置虚拟人像](/docs/seedance-portrait-asset-guide#preset-avatar) |平台预置虚拟人像库,为创作者提供免费、合规、丰富多样的肖像素材。适用于需真人风格人脸但无需指定具体人物,追求零合规风险、快速创作的场景。 | |[使用已授权真人素材](/docs/seedance-portrait-asset-guide#authorized-real-person) |支持使用已获得授权的真人肖像素材进行视频生成。 | # 信任模型产物作为输入素材 Seedance 2.5、Seedance 2.0 系列模型不支持直接上传含有真人人脸的参考图/视频。为了便利创作者在含人脸场景的二次创作需求,方舟平台信任以下模型生成的含人脸产物,您可使用**本账号下近 30 天内由以下模型生成的含人脸原始产物**,作为输入素材,再次调用 Seedance 2.5、Seedance 2.0 系列模型进行二次创作。 ## 信任范围与有效期 |信任产物范围 |生效时间 |有效期 | \ | |> 信任该时间之后生成的产物 |> 从产物生成时间开始计算 | |---|---|---| |Seedance 2.5、Seedance 2.0 系列生成的含人脸视频 |2026年03月11日起 |30天 | |Seedance 2.5、Seedance 2.0 系列生成的含人脸视频对应的尾帧图片 |2026年04月16日起 |30天 | |[Seedream 5.0 lite/pro/flash 文生图](/docs/seedream-4-0-5-0#9695d195) 得到的含人脸图片 |2026年04月16日起 |30天 | ## 注意事项 > **注意** > > * 仅信任方舟平台的产物,不支持跨平台使用。 > * 仅信任同账号下的产物,不支持跨账号使用。 > * 仅信任模型原始产物,二次剪辑或超过有效期后均不可使用。 > * 压缩或转发文件易引发信任失效,建议直接将模型原始产物转存至 TOS 使用。 > * 仅对输入的产物进行信任,输出依然有可能因命中方舟安全审核策略而失败,详情参见 [错误码](/docs/error-codes)。 > * 信任仅对命中人脸审核生效,对于不含人脸场景,模型产物不存在受信问题,支持自由剪辑后进行二次创作。 ## 代码示例 |输入:同账号生成的视频 |输出 | |---|---| |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/24e27818aeb644b6942c2cbc949ddc86) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/44d52b9f0768460c8c86b81d2df40350) | \ | | | \ |> [使用预置虚拟人像](/docs/seedance-portrait-asset-guide#preset-avatar) 示例生成的视频 |> 输入:将面霜的颜色修改为白色。 | \ | |> ratio 修改为16:9 | **选项:Python** 1. 首次生视频,并获取视频 URL。此处直接用 [使用预置虚拟人像](/docs/seedance-portrait-asset-guide#preset-avatar) 示例生成的视频。 2. 对 Seedance 2.5、Seedance 2.0 系列生成的视频进行再次编辑。视频原始 URL 的有效期仅 24 小时,本示例将原始视频转存至 TOS 使用。 > **说明** > > 视频原始 URL 的有效期仅 24 小时,实际使用时,建议您提前转存视频文件。推荐配置火山引擎 TOS 提供的数据订阅功能,将您的视频产物自动转存到自己的 TOS 桶中,便于长期备份或二次加工。详细介绍请参见 [TOS 数据订阅](https://docs.volcengine.com/docs/TorchObjectStorage/Datasubscription-5?lang=zh)。 ```Python import os import time # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark client = Ark( # The base URL for model invocation base_url='https://ark.cn-beijing.volces.com/api/v3', # Get API Key:https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.environ.get("ARK_API_KEY"), ) if __name__ == "__main__": print("----- create request -----") create_result = client.content_generation.tasks.create( model="doubao-seedance-2-0-260128", # Replace with Model ID content=[ { "type": "text", "text": "将面霜的颜色修改为白色。" }, { "type": "video_url", "video_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/advanced-usage/video_by_sd2-zh.mp4" }, "role": "reference_video" }, ], generate_audio=True, ratio="16:9", duration=11, watermark=True, ) print(create_result) print("----- polling task status -----") task_id = create_result.id while True: get_result = client.content_generation.tasks.get(task_id=task_id) status = get_result.status if status == "succeeded": print("----- task succeeded -----") print(get_result) break elif status == "failed": print("----- task failed -----") print(f"Error: {get_result.error}") break else: print(f"Current status: {status}, Retrying after 30 seconds...") time.sleep(30) ``` **选项:Java** 1. 首次生视频,并获取视频 URL。此处直接用 [使用预置虚拟人像](/docs/seedance-portrait-asset-guide#preset-avatar) 示例生成的视频。 2. 对 Seedance 2.5、Seedance 2.0 系列生成的视频进行再次编辑。视频原始 URL 的有效期仅 24 小时,本示例将原始视频转存至 TOS 使用。 > **说明** > > 视频原始 URL 的有效期仅 24 小时,实际使用时,建议您提前转存视频文件。推荐配置火山引擎 TOS 提供的数据订阅功能,将您的视频产物自动转存到自己的 TOS 桶中,便于长期备份或二次加工。详细介绍请参见 [TOS 数据订阅](https://docs.volcengine.com/docs/TorchObjectStorage/Datasubscription-5?lang=zh)。 ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.content_generation.*; import com.volcengine.ark.runtime.service.ArkService; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; public class ContentGenerationTaskExample { // Client initialization static String apiKey = System.getenv("ARK_API_KEY"); static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); static Dispatcher dispatcher = new Dispatcher(); static ArkService service = ArkService.builder() .baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .build(); public static void main(String[] args) { // Model ID final String modelId = "doubao-seedance-2-0-260128"; // Text prompt final String prompt = "将面霜的颜色修改为白色。"; // Example resource URLs final String refVideo = "https://arkdocs.tos-cn-beijing.volces.com/videos/advanced-usage/video_by_sd2-zh.mp4"; // Output video parameters final boolean generateAudio = true; final String videoRatio = "16:9"; final long videoDuration = 11L; final boolean showWatermark = true; System.out.println("----- create request -----"); // Build request content List contents = new ArrayList<>(); // 1. Text prompt contents.add(ContentItem.builder() .type(ContentType.TEXT) .text(prompt) .build()); // 2. Reference video contents.add(ContentItem.builder() .type(ContentType.VIDEO_URL) .videoUrl(VideoURL.builder() .url(refVideo) .build()) .role("reference_video") .build()); // Create video generation task CreateContentGenerationTaskRequest createRequest = CreateContentGenerationTaskRequest.builder() .generateAudio(generateAudio) .model(modelId) .content(contents) .ratio(videoRatio) .duration(videoDuration) .watermark(showWatermark) .build(); CreateContentGenerationTaskResponse createResult = service.createContentGenerationTask(createRequest); System.out.println("Task Created: " + createResult); // Get task details and poll status String taskId = createResult.getId(); pollTaskStatus(taskId); } /** * Poll task status * @param taskId Task ID */ private static void pollTaskStatus(String taskId) { String getRequest = taskId; System.out.println("----- polling task status -----"); try { while (true) { ContentGenerationTask getResponse = service.getContentGenerationTask(getRequest); String status = getResponse.getStatus().toString(); if ("succeeded".equalsIgnoreCase(status)) { System.out.println("----- task succeeded -----"); System.out.println(getResponse); break; } else if ("failed".equalsIgnoreCase(status)) { System.out.println("----- task failed -----"); if (getResponse.getError() != null) { System.out.println("Error: " + getResponse.getError().getMessage()); } break; } else { System.out.printf("Current status: %s, Retrying in 10 seconds...%n", status); TimeUnit.SECONDS.sleep(10); } } } catch (InterruptedException ie) { Thread.currentThread().interrupt(); System.err.println("Polling interrupted"); } catch (Exception e) { System.err.println("Error occurred: " + e.getMessage()); } finally { service.shutdownExecutor(); } } } ``` **选项:Go** 1. 首次生视频,并获取视频 URL。此处直接用 [使用预置虚拟人像](/docs/seedance-portrait-asset-guide#preset-avatar) 示例生成的视频。 2. 对 Seedance 2.5、Seedance 2.0 系列生成的视频进行再次编辑。视频原始 URL 的有效期仅 24 小时,本示例将原始视频转存至 TOS 使用。 > **说明** > > 视频原始 URL 的有效期仅 24 小时,实际使用时,建议您提前转存视频文件。推荐配置火山引擎 TOS 提供的数据订阅功能,将您的视频产物自动转存到自己的 TOS 桶中,便于长期备份或二次加工。详细介绍请参见 [TOS 数据订阅](https://docs.volcengine.com/docs/TorchObjectStorage/Datasubscription-5?lang=zh)。 ```Go package main import ( "context" "fmt" "os" "time" "github.com/volcengine/ark-runtime-go/arkruntime" model "github.com/volcengine/ark-runtime-go/arkruntime/model/contentgeneration" ) func main() { // Initialize Ark client client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), // The base URL for model invocation arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() // Model ID modelID := "doubao-seedance-2-0-260128" // Text prompt prompt := "将面霜的颜色修改为白色。" // Example resource URLs refVideo1 := "https://arkdocs.tos-cn-beijing.volces.com/videos/advanced-usage/video_by_sd2-zh.mp4" // Output video parameters generateAudio := true videoRatio := "16:9" videoDuration := int64(11) showWatermark := true // 1. Create video generation task fmt.Println("----- create request -----") createReq := &model.CreateContentGenerationTaskRequest{ Model: modelID, GenerateAudio: model.NewOptBool(generateAudio), Ratio: model.NewOptString(videoRatio), Duration: model.NewOptInt64(videoDuration), Watermark: model.NewOptBool(showWatermark), Content: []model.ContentItem{ { Type: model.ContentTypeText, Text: model.NewOptString(prompt), }, { Type: model.ContentTypeVideoURL, VideoURL: model.NewOptVideoURL(model.VideoURL{ URL: refVideo1, }), Role: model.NewOptString("reference_video"), }, }, } createResp, err := client.CreateContentGenerationTask(ctx, createReq) if err != nil { fmt.Printf("create content generation error: %v\n", err) return } taskID := createResp.ID fmt.Printf("Task Created with ID: %s\n", taskID) // 2. Poll task status pollTaskStatus(ctx, client, taskID) } // poll task status func pollTaskStatus(ctx context.Context, client *arkruntime.Client, taskID string) { fmt.Println("----- polling task status -----") for { getReq := taskID getResp, err := client.GetContentGenerationTask(ctx, getReq) if err != nil { fmt.Printf("get content generation task error: %v\n", err) return } status := getResp.Status if status == "succeeded" { fmt.Println("----- task succeeded -----") fmt.Printf("Task ID: %s \n", getResp.ID) fmt.Printf("Model: %s \n", getResp.Model) fmt.Printf("Video URL: %s \n", getResp.Content.Or(model.TaskContent{}).VideoURL.Or("")) fmt.Printf("Completion Tokens: %d \n", getResp.Usage.Or(model.TaskUsage{}).CompletionTokens) fmt.Printf("Created At: %d, Updated At: %d\n", getResp.CreatedAt.Or(0), getResp.UpdatedAt.Or(0)) return } else if status == "failed" { fmt.Println("----- task failed -----") if getResp.Error.IsSet() { fmt.Printf("Error Code: %s, Message: %s\n", getResp.Error.Value.Code, getResp.Error.Value.Message) } return } else { fmt.Printf("Current status: %s, Retrying in 10 seconds... \n", status) time.Sleep(10 * time.Second) } } } ``` # 使用预置虚拟人像 对写实风格视频,可通过虚拟人像库预置人像来控制角色样貌。每个素材对应一个独立素材 ID (asset ID), 在 **content.<模态>_url.url** 字段中传入 `asset://` 即可生成视频。 > **说明** > > 开通虚拟人像库,浏览及检索虚拟人像请参见[虚拟人像库](/docs/avatar-library)。 |输入:文本 |输入:虚拟人像、图片 |输出 | |---|---|---| |固定机位,近景镜头,清新自然风格。在室内自然光下,**图片1**中美妆博主面带笑容,向镜头介绍**图片2**中的面霜。博主将手里的面霜展示给镜头,开心地说"挖到本命面霜了!";接着她一边用手指轻轻蘸取面霜展示那种软糯感,一边说"质地像云朵一样软糯,一抹就吸收";最后她把面霜涂抹在脸颊上,展示着水润透亮的皮肤,同时自信地说"熬夜急救、补水保湿全搞定"。要求画面中人物居中,完整展示人物的整个脑袋和上半身,始终对焦人脸,人脸始终清晰,纯净无任何字幕。 |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/946509d1f37f476c9ff29e0adaf187eb~tplv-goo7wpa0wc-image.image) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/0bd96f702bdf48bab1a9505710d9e1f9) | \ | | | | \ | |> 虚拟人像 | | \ | | | | \ |Asset ID 仅用来向模型传入素材,提示词中仍需使用"**素材类型+序号**"格式引用素材,序号为请求体中该素材在同类素材中的排序。 |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/791b783fc6cd4394b13f41b66b5ff461~tplv-goo7wpa0wc-image.image) | | \ |正确用法:**图片1**中美妆博主 | | | \ |错误用法:asset-2026****是美妆博主 |> 产品图像 | | \ | | | | **选项:Python** ```Python import os import time # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark client = Ark( # The base URL for model invocation base_url='https://ark.cn-beijing.volces.com/api/v3', # Get API Key:https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.environ.get("ARK_API_KEY"), ) if __name__ == "__main__": print("----- create request -----") create_result = client.content_generation.tasks.create( model="doubao-seedance-2-0-260128", # Replace with Model ID content=[ { "type": "text", "text": "固定机位,近景镜头,清新自然风格。在室内自然光下,图片1中美妆博主面带笑容,向镜头介绍图片2中的面霜。博主将手里的面霜展示给镜头,开心地说“挖到本命面霜了!”;接着她一边用手指轻轻蘸取面霜展示那种软糯感,一边说“质地像云朵一样软糯,一抹就吸收”;最后她把面霜涂抹在脸颊上,展示着水润透亮的皮肤,同时自信地说“熬夜急救、补水保湿全搞定”。要求画面中人物居中,完整展示人物的整个脑袋和上半身,始终对焦人脸,人脸始终清晰,纯净无任何字幕。" }, { "type": "image_url", "image_url": { "url": "asset://asset-20260401123823-6d4x2" }, "role": "reference_image" }, { "type": "image_url", "image_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/r2v_edit_pic1.jpg" }, "role": "reference_image" }, ], generate_audio=True, ratio="adaptive", duration=11, watermark=True, ) print(create_result) print("----- polling task status -----") task_id = create_result.id while True: get_result = client.content_generation.tasks.get(task_id=task_id) status = get_result.status if status == "succeeded": print("----- task succeeded -----") print(get_result) break elif status == "failed": print("----- task failed -----") print(f"Error: {get_result.error}") break else: print(f"Current status: {status}, Retrying after 30 seconds...") time.sleep(30) ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.content_generation.*; import com.volcengine.ark.runtime.service.ArkService; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; public class ContentGenerationTaskExample { // Client initialization static String apiKey = System.getenv("ARK_API_KEY"); static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); static Dispatcher dispatcher = new Dispatcher(); static ArkService service = ArkService.builder() .baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .build(); public static void main(String[] args) { // Model ID final String modelId = "doubao-seedance-2-0-260128"; // Text prompt final String prompt = "固定机位,近景镜头,清新自然风格。在室内自然光下,图片1中美妆博主面带笑容,向镜头介绍图片2中的面霜。博主将手里的面霜展示给镜头,开心地说“挖到本命面霜了!”;接着她一边用手指轻轻蘸取面霜展示那种软糯感,一边说“质地像云朵一样软糯,一抹就吸收”;最后她把面霜涂抹在脸颊上,展示着水润透亮的皮肤,同时自信地说“熬夜急救、补水保湿全搞定”。要求画面中人物居中,完整展示人物的整个脑袋和上半身,始终对焦人脸,人脸始终清晰,纯净无任何字幕。"; // Example resource URLs final String refImage1 = "asset://asset-20260401123823-6d4x2"; final String refImage2 = "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/r2v_edit_pic1.jpg"; // Output video parameters final boolean generateAudio = true; final String videoRatio = "adaptive"; final long videoDuration = 11L; final boolean showWatermark = true; System.out.println("----- create request -----"); // Build request content List contents = new ArrayList<>(); // 1. Text prompt contents.add(ContentItem.builder() .type(ContentType.TEXT) .text(prompt) .build()); // 2. Reference image 1 contents.add(ContentItem.builder() .type(ContentType.IMAGE_URL) .imageUrl(ImageURL.builder() .url(refImage1) .build()) .role("reference_image") .build()); // 3. Reference image 2 contents.add(ContentItem.builder() .type(ContentType.IMAGE_URL) .imageUrl(ImageURL.builder() .url(refImage2) .build()) .role("reference_image") .build()); // Create video generation task CreateContentGenerationTaskRequest createRequest = CreateContentGenerationTaskRequest.builder() .generateAudio(generateAudio) .model(modelId) .content(contents) .ratio(videoRatio) .duration(videoDuration) .watermark(showWatermark) .build(); CreateContentGenerationTaskResponse createResult = service.createContentGenerationTask(createRequest); System.out.println("Task Created: " + createResult); // Get task details and poll status String taskId = createResult.getId(); pollTaskStatus(taskId); } /** * Poll task status * @param taskId Task ID */ private static void pollTaskStatus(String taskId) { String getRequest = taskId; System.out.println("----- polling task status -----"); try { while (true) { ContentGenerationTask getResponse = service.getContentGenerationTask(getRequest); String status = getResponse.getStatus().toString(); if ("succeeded".equalsIgnoreCase(status)) { System.out.println("----- task succeeded -----"); System.out.println(getResponse); break; } else if ("failed".equalsIgnoreCase(status)) { System.out.println("----- task failed -----"); if (getResponse.getError() != null) { System.out.println("Error: " + getResponse.getError().getMessage()); } break; } else { System.out.printf("Current status: %s, Retrying in 10 seconds...%n", status); TimeUnit.SECONDS.sleep(10); } } } catch (InterruptedException ie) { Thread.currentThread().interrupt(); System.err.println("Polling interrupted"); } catch (Exception e) { System.err.println("Error occurred: " + e.getMessage()); } finally { service.shutdownExecutor(); } } } ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "time" "github.com/volcengine/ark-runtime-go/arkruntime" model "github.com/volcengine/ark-runtime-go/arkruntime/model/contentgeneration" ) func main() { // Initialize Ark client client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), // The base URL for model invocation arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() // Model ID modelID := "doubao-seedance-2-0-260128" // Text prompt prompt := "固定机位,近景镜头,清新自然风格。在室内自然光下,图片1中美妆博主面带笑容,向镜头介绍图片2中的面霜。博主将手里的面霜展示给镜头,开心地说“挖到本命面霜了!”;接着她一边用手指轻轻蘸取面霜展示那种软糯感,一边说“质地像云朵一样软糯,一抹就吸收”;最后她把面霜涂抹在脸颊上,展示着水润透亮的皮肤,同时自信地说“熬夜急救、补水保湿全搞定”。要求画面中人物居中,完整展示人物的整个脑袋和上半身,始终对焦人脸,人脸始终清晰,纯净无任何字幕。" // Example resource URLs refImage1 := "asset://asset-20260401123823-6d4x2" refImage2 := "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/r2v_edit_pic1.jpg" // Output video parameters generateAudio := true videoRatio := "adaptive" videoDuration := int64(11) showWatermark := true // 1. Create video generation task fmt.Println("----- create request -----") createReq := &model.CreateContentGenerationTaskRequest{ Model: modelID, GenerateAudio: model.NewOptBool(generateAudio), Ratio: model.NewOptString(videoRatio), Duration: model.NewOptInt64(videoDuration), Watermark: model.NewOptBool(showWatermark), Content: []model.ContentItem{ { Type: model.ContentTypeText, Text: model.NewOptString(prompt), }, { Type: model.ContentTypeImageURL, ImageURL: model.NewOptImageURL(model.ImageURL{ URL: refImage1, }), Role: model.NewOptString("reference_image"), }, { Type: model.ContentTypeImageURL, ImageURL: model.NewOptImageURL(model.ImageURL{ URL: refImage2, }), Role: model.NewOptString("reference_image"), }, }, } createResp, err := client.CreateContentGenerationTask(ctx, createReq) if err != nil { fmt.Printf("create content generation error: %v\n", err) return } taskID := createResp.ID fmt.Printf("Task Created with ID: %s\n", taskID) // 2. Poll task status pollTaskStatus(ctx, client, taskID) } // poll task status func pollTaskStatus(ctx context.Context, client *arkruntime.Client, taskID string) { fmt.Println("----- polling task status -----") for { getReq := taskID getResp, err := client.GetContentGenerationTask(ctx, getReq) if err != nil { fmt.Printf("get content generation task error: %v\n", err) return } status := getResp.Status if status == "succeeded" { fmt.Println("----- task succeeded -----") fmt.Printf("Task ID: %s \n", getResp.ID) fmt.Printf("Model: %s \n", getResp.Model) fmt.Printf("Video URL: %s \n", getResp.Content.Or(model.TaskContent{}).VideoURL.Or("")) fmt.Printf("Completion Tokens: %d \n", getResp.Usage.Or(model.TaskUsage{}).CompletionTokens) fmt.Printf("Created At: %d, Updated At: %d\n", getResp.CreatedAt.Or(0), getResp.UpdatedAt.Or(0)) return } else if status == "failed" { fmt.Println("----- task failed -----") if getResp.Error.IsSet() { fmt.Printf("Error Code: %s, Message: %s\n", getResp.Error.Value.Code, getResp.Error.Value.Message) } return } else { fmt.Printf("Current status: %s, Retrying in 10 seconds... \n", status) time.Sleep(10 * time.Second) } } } ``` # 使用已授权真人素材 通过真人认证和本人授权后,可将该真人的相关素材(例如该真人的图片、视频、音频)上传至方舟。素材入库成功后,每个素材将获得一个独立素材 ID (asset ID), 在 **content.<模态>_url.url** 字段中传入 `asset:// `即可使用该素材生成视频。真人认证及素材入库流程请参见[录入真人形象素材](/docs/upload-real-person-portrait-assets)。 ```text ... "content": [ { "type": "text", "text": "" }, { "type": "image_url", "image_url": { "url": "asset://" }, "role": "reference_image" }, { "type": "video_url", "video_url": { "url": "asset://" }, "role": "reference_video" }, { "type": "audio_url", "audio_url": { "url": "asset://" }, "role": "reference_audio" } ] ... ``` --- # 获取真人 IP 版权视频授权书 API 教程 Source: https://ark.volcengine.com/region:cn-beijing/docs/right-auth-letter-application-guide 本教程面向需要在自有平台接入授权书能力的方舟客户。终端用户在您的平台中使用已领用的真人 IP 生成版权视频后,可以打开免登申请链接,填写资料并提交授权书申请。您通过服务端查询申请结果,并在申请成功后下载授权书。 > **注意** > > 本功能仅用于视频生成后获取授权书,不用于在视频生成前取得真人 IP 的使用授权。使用真人 IP 生成视频前,您仍需调用 `ClaimCommercialIPs` 领用对应 IP。详情请参见 [使用视频生成 API 创作真人 IP 视频](/docs/real-person-ip-video-api)。 ## 调用流程 按以下流程调用接口: 1. 调用 [`ListAuthorizedCommercialIPIds`](/docs/list-authorized-commercial-ip-ids-api),查询当前账号已领用且支持授权书申请的真人 IP。 2. 调用 [`CreateRightAuthLetterApplicationSession`](/docs/create-right-auth-letter-application-session-api),为终端用户创建授权书免登申请链接。 3. 通过结果回调接收通知(可选),调用 [`GetRightAuthLetterApplicationSession`](/docs/get-right-auth-letter-application-session-api) 查询申请结果。 4. 查询成功后,使用 `File.URL` 下载授权书文件。 具体流程如下图所示: ![真人 IP 版权视频授权书免登申请流程](https://arkdocs.tos-cn-beijing.volces.com/images/resources/get-auth-letter-for-copyright-ip.png) ## 前提条件 - 已开通真人 IP 服务,并已调用 `ClaimCommercialIPs` 领用目标真人 IP。 - 终端用户已在您的平台中使用该真人 IP 生成版权视频。 - 已获取具有相关 API 调用权限的火山引擎账号 AK/SK。详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 ## 步骤 1、查询支持申请的真人 IP 调用 [`ListAuthorizedCommercialIPIds`](/docs/list-authorized-commercial-ip-ids-api),将 `IPCategory` 设置为 `REAL_PERSON`,查询当前账号已领用且授权有效的真人 IP。 ```json { "IPCategory": "REAL_PERSON", "ProjectName": "default" } ``` 响应中的 `Items[]` 直接返回真人 IP 信息: ```json { "Result": { "Items": [ { "IpId": "ip-c-example-a", "IPCategory": "REAL_PERSON", "IPName": "示例演员甲", "SupportsAuthLetterApplication": true }, { "IpId": "ip-c-example-b", "IPCategory": "REAL_PERSON", "IPName": "示例演员乙", "SupportsAuthLetterApplication": false } ] } } ``` | `SupportsAuthLetterApplication` | 您的处理方式 | | --- | --- | | `true` | 该 IP 支持申请授权书,可以向终端用户展示申请入口。 | | `false` | 该 IP 暂不支持申请授权书,不展示申请入口。 | | 未返回 | 尚不能确认该 IP 是否支持申请授权书,不展示申请入口。 | 终端用户选择 IP 后,将同一条记录的 `IpId` 传给创建接口的 `IpId`。 > **说明:支持申请不等于获得使用授权** > > `SupportsAuthLetterApplication` 不能替代当前账号的 IP 领用资格检查,也不保证提交申请一定成功。创建申请时,火山方舟仍会校验 IP 上下架状态、当前账号领用状态和申请资料。 **完成本步骤后,需确认**:目标记录的 `IPCategory` 为 `REAL_PERSON`,`IpId` 与终端用户生成视频时使用的 IP ID 一致,并且 `SupportsAuthLetterApplication` 明确为 `true`。 ## 步骤 2、创建免登申请会话 调用 [`CreateRightAuthLetterApplicationSession`](/docs/create-right-auth-letter-application-session-api),为一个真人 IP 和一个被授权方创建申请。 | 请求字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `IpId` | string | 是 | 本次申请对应的单个 IP ID。值不能为空或包含首尾空白,UTF-8 编码后最多 64 字节。 | | `AuthorizedSubject` | object | 是 | 被授权方主体信息。当前仅需填写 `SubjectName`。 | | `AuthorizedSubject.SubjectName` | string | 是 | 授权书中的真实被授权方主体名称。值不能为空或仅包含空白,不从签名账号的实名资料自动取值。 | | `ProjectName` | string | 否 | 资源所属项目,默认值为 `default`。传入时不能为空,UTF-8 编码后最多 255 字节。该字段不是终端用户填写的作品或商业项目标题。 | | `Callback` | object | 否 | 申请结果回调配置。启用时必须同时提供 `Callback.URL` 和 `Callback.Secret`。 具体使用方式,请参考下文**配置结果回调**。 | 请求示例: ```json { "IpId": "ip-c-example", "AuthorizedSubject": { "SubjectName": "示例文化传媒有限公司" }, "ProjectName": "default" } ``` 响应示例: ``` { "ResponseMetadata": { "RequestId": "example-request-id" }, "Result": { "SessionId": "example-session-id", "ApplicationURL": "https:///?token=", "FirstAccessExpireAt": 1800000600, "SessionExpireAt": 1800086400 } } ``` 创建成功后,保存以下返回值: | 返回字段 | 类型 | 说明 | | --- | --- | --- | | `SessionId` | string | 申请会话 ID。用于查询申请状态和识别回调通知,不要自行生成或修改。 | | `ApplicationURL` | string | 提供给指定终端用户的完整免登申请链接。该字段仅在创建成功时返回,查询接口不会补发。 | | `FirstAccessExpireAt` | int64 | 终端用户首次成功进入申请页面的截止时间,UTC Unix 时间戳,单位为秒。 | | `SessionExpireAt` | int64 | 免登申请入口的总访问截止时间,UTC Unix 时间戳,单位为秒。该时间从会话创建时开始计算,不会在终端用户首次打开链接后重新计时。 | > **说明:按接口返回值处理访问时限** > > - 当前默认首次访问时限为创建后 10 分钟,默认总访问时限为创建后 24 小时。服务端配置可能调整,请以接口返回的时间和平台实际校验结果为准,不要在您的平台中固定时限。 > - 终端用户打开链接时,火山方舟会校验链接是否仍然有效。 > - 您的服务端查询申请状态不计为终端用户进入申请页面。 > **注意:保存链接并避免重复创建** > > - `ApplicationURL` 包含访问凭证,仅在创建成功时返回。查询接口无法找回该链接。请妥善保存,不要公开或写入普通日志。 > - 每次调用创建接口都会生成新的申请记录和链接。创建请求超时或返回 `InternalError` 时,不要自动连续重试。确需重新创建时,只向终端用户提供新的链接。 **完成本步骤后,需确认**:响应包含非空的 `SessionId` 和 `ApplicationURL`,两个截止时间均晚于创建时间。不要由您的服务端打开 `ApplicationURL` 进行验证,该链接应由指定终端用户打开。 ## 步骤 3、提供申请链接 将 `ApplicationURL` 原样提供给指定终端用户,不要自行拼接或修改。根据 `FirstAccessExpireAt` 和 `SessionExpireAt` 提醒终端用户及时办理。 终端用户打开链接后,在免登页面填写授权书申请资料并提交,无需登录火山方舟账号。 ## 步骤 4、查询申请结果 使用创建申请时的同一个方舟账号调用 [`GetRightAuthLetterApplicationSession`](/docs/get-right-auth-letter-application-session-api),传入已保存的 `SessionId`。 `SessionId` 为必填字符串,不得包含首尾空白,UTF-8 编码后最多 64 字节。 ```json { "SessionId": "example-session-id" } ``` 申请成功且授权书未作废时,查询接口返回文件信息: ```json { "ResponseMetadata": { "RequestId": "example-request-id" }, "Result": { "Session": { "SessionId": "example-session-id", "Status": "SUCCEEDED", "File": { "FileName": "授权书.pdf", "URL": "https:///" } } } } ``` 当 `Session.Status` 为 `CREATED` 或 `PROCESSING` 时,建议每隔 5~10 秒查询一次,并为单轮等待设置上限。查询暂时出错或本轮等待超时不代表申请失败。保存 `SessionId`,稍后继续查询同一个 Session,不要因此重复创建申请。 ## 查询接口状态和错误码 以下申请状态和错误码均由 `GetRightAuthLetterApplicationSession` 查询接口返回。 | `Session.Status` | 含义 | 您的处理方式 | | --- | --- | --- | | `CREATED` | 申请入口已创建,终端用户尚未完成提交。 | 引导终端用户打开已保存的申请链接,并继续查询。 | | `PROCESSING` | 终端用户已提交资料,火山方舟正在处理申请或生成授权书。 | 继续查询,不要为同一申请重复创建入口。 | | `SUCCEEDED` | 授权书已生成成功且未作废。 | 使用 `File.URL` 下载授权书。 | | `FAILED` | 授权书申请处理失败。 | 停止本轮等待。业务确认仍需申请后,创建新的 Session。 | | `EXPIRED` | 终端用户未提交资料,申请入口已超过首次进入期限或总访问期限。 | 旧入口不能继续使用。仍需申请时,创建新的 Session。 | | `VOIDED` | 已生成的授权书被作废。 | 不再展示或下载该文件。 | > **说明:申请入口过期不等于授权书失效** > > 终端用户已经提交的申请仍可继续处理。状态为 `SUCCEEDED` 的授权书在被作废前仍可获取文件。 | HTTP 状态码 | 查询接口错误码 | 说明 | 处理建议 | | --- | --- | --- | --- | | 400 | `MissingParameter.SessionId` | 未传入申请会话 ID。 | 补充 `SessionId` 后重新查询。 | | 400 | `InvalidParameter.*` | `SessionId` 不合法。 | 确认 `SessionId` 非空、UTF-8 编码后不超过 64 字节且不含首尾空白。 | | 404 | `ResourceNotFound.RightAuthLetterApplicationSession` | 当前账号下找不到指定 Session。 | 检查调用账号和 `SessionId`。已清理的记录无法查询。 | | 500 | `InternalError` | 服务内部异常。 | 稍后重试查询。多次重试仍失败时,记录 `ResponseMetadata.RequestId` 并联系技术支持。 | > **注意** > > 失败或过期的申请记录从 Session 创建起保留 15 天,之后可能无法查询。及时保存所需的业务结果。 ## 步骤 5、配置结果回调 如需火山方舟主动通知申请结果,在创建会话时同时传入 `Callback.URL` 和 `Callback.Secret`。未配置回调时,主动查询申请结果。 ```json { "Callback": { "URL": "https://callback.example.com/auth-letter", "Secret": "<43_CHARACTER_BASE64URL_SECRET>" } } ``` - `Callback.URL`:您的公网 HTTPS 回调地址,最多 2048 个字符。地址应使用默认端口或 `443`,不得包含用户名、密码或 URL 片段,也不应发生重定向。 - `Callback.Secret`:您生成并保存在服务端的共享密钥。先生成 32 字节安全随机数,再编码为不带末尾等号的 43 字符 Base64URL 字符串。不要记录日志或返回给终端用户。 可以使用以下命令生成 `Callback.Secret`: ```bash python -c 'import secrets; print(secrets.token_urlsafe(32))' ``` 火山方舟通过 HTTP POST 发送通知。通知不包含授权书文件,收到通知后仍需调用查询接口获取最新状态和下载地址。 ```json { "SessionId": "example-session-id", "Status": "SUCCEEDED", "ApplicationId": "example-application-id" } ``` - 通知体总是返回 `SessionId` 和 `Status`,可能返回 `ApplicationId`。`Status` 仅可能为 `SUCCEEDED` 或 `FAILED`。 - 终端用户未提交且申请入口过期时,通知可能不包含 `ApplicationId`。此时,通知状态可能为 `FAILED`,查询状态为 `EXPIRED`。 - 处理中和授权书作废时不发送通知。回调可能重复或未送达,不要只等待回调,最终状态以查询接口为准。 验签时,读取请求头 `X-Ark-Auth-Letter-Timestamp` 和 `X-Ark-Auth-Letter-Signature`。签名格式为 `v1=`,其中 `` 是 64 位小写十六进制 HMAC-SHA256 签名。将 `Callback.Secret` 解码为 32 字节密钥,并对 `.<原始 HTTP 请求体字节>` 计算签名。不要解析 JSON 后重新序列化请求体再验签。 建议结合服务端时钟校验时间窗口,防止重放。验签成功后,按 `SessionId` 和 `Status` 幂等保存通知,并尽快返回 HTTP 2xx,建议在 3 秒内完成。火山方舟对部分发送失败最多发送 4 次。 **完成本步骤后,需确认**:使用测试通知确认您的服务端会拒绝错误签名和超出时间窗口的通知,并能幂等处理重复通知。验签成功后,使用 `SessionId` 查询最新结果。 ## 步骤 6、下载授权书 查询接口返回 `SUCCEEDED` 时,`Session.File` 包含: - `FileName`:授权书文件名。 - `URL`:授权书的短期 HTTPS 签名下载地址。 使用 `File.URL` 下载文件时,无需携带 OpenAPI AK/SK。下载地址可以直接访问授权书,不得公开或写入普通日志。链接失效后,重新查询同一个 `SessionId` 获取新地址,无需重新申请。 保存文件时,由您的程序指定本地路径,不要直接使用远端 `FileName` 作为路径。向终端用户提供文件前,校验终端用户是否有权访问对应业务记录。 **完成本步骤后,需确认**:下载的文件非空且可以正常打开。重新查询时,`Session.Status` 仍为 `SUCCEEDED`。 ## 示例代码 以下 Python 示例使用研发提供的火山引擎 Python SDK 完成 AK/SK 签名,并按接入环节分段展示。 ### 安装依赖并配置环境变量 使用 Python 3.10 或更高版本,安装依赖: ```bash python -m pip install --upgrade volcengine requests ``` 通过您的密钥管理系统配置环境变量: ```bash export VOLC_ACCESSKEY="" export VOLC_SECRETKEY="" ``` 使用临时访问凭证时,配置 `VOLC_SESSION_TOKEN`。如需覆盖默认地域 `cn-beijing`,配置 `VOLC_REGION`。 ### 定义 API 调用函数 以下代码定义 IP 筛选、创建申请、查询状态和下载文件所需的函数。 ```Python import json import math import os import time from pathlib import Path from urllib.parse import urlsplit import requests from volcengine.Credentials import Credentials from volcengine.auth.SignerV4 import SignerV4 from volcengine.base.Request import Request HOST = "open.volcengineapi.com" VERSION = "2024-01-01" def call_api(action, payload): region = os.getenv("VOLC_REGION", "cn-beijing") credentials = Credentials( os.environ["VOLC_ACCESSKEY"], os.environ["VOLC_SECRETKEY"], "ark", region, os.getenv("VOLC_SESSION_TOKEN", ""), ) request = Request() request.schema = "https" request.host = HOST request.path = "/" request.method = "POST" request.query = {"Action": action, "Version": VERSION} request.headers = {"Host": HOST, "Content-Type": "application/json"} request.body = json.dumps(payload, ensure_ascii=False, separators=(",", ":")) SignerV4.sign(request, credentials) try: # Send the same UTF-8 body that was signed without serializing it again. response = requests.post( request.build(), headers=request.headers, data=request.body.encode("utf-8"), timeout=(5, 30), allow_redirects=False, ) except requests.RequestException: message = f"{action} network error" if action == "CreateRightAuthLetterApplicationSession": message += "; do not automatically retry this request" raise RuntimeError(message) from None try: data = response.json() except ValueError: raise RuntimeError( f"API returned non-JSON content: HTTP {response.status_code}" ) from None metadata = data.get("ResponseMetadata", {}) error = metadata.get("Error") if not 200 <= response.status_code < 300 or error: code = (error or {}).get("Code", "UnknownError") request_id = metadata.get("RequestId", "") raise RuntimeError(f"API error {code}; RequestId={request_id}") result = data.get("Result") if not isinstance(result, dict): raise RuntimeError(f"{action} response does not contain Result") return result def list_applicable_ips(project_name="default"): result = call_api( "ListAuthorizedCommercialIPIds", { "IPCategory": "REAL_PERSON", "ProjectName": project_name, }, ) items = result.get("Items") if not isinstance(items, list): raise RuntimeError( "ListAuthorizedCommercialIPIds response does not contain Items" ) return [item for item in items if item.get("SupportsAuthLetterApplication") is True] def create_entry(ip_id, subject_name, callback=None): payload = { "IpId": ip_id, "AuthorizedSubject": {"SubjectName": subject_name}, "ProjectName": "default", } if callback is not None: payload["Callback"] = callback return call_api("CreateRightAuthLetterApplicationSession", payload) def get_session(session_id): return call_api( "GetRightAuthLetterApplicationSession", {"SessionId": session_id}, )["Session"] def wait_for_file(session_id, wait_seconds=120, interval_seconds=5): # Reaching the polling deadline does not mean the application failed. if wait_seconds < 0: raise ValueError("wait_seconds must be non-negative") if interval_seconds <= 0: raise ValueError("interval_seconds must be positive") deadline = time.monotonic() + wait_seconds max_attempts = max(1, math.ceil(wait_seconds / interval_seconds) + 1) for _ in range(max_attempts): session = get_session(session_id) status = session["Status"] if status == "SUCCEEDED": file_info = session.get("File") if not file_info or not file_info.get("URL"): raise RuntimeError("Successful response does not contain a file URL") return file_info if status in {"FAILED", "EXPIRED", "VOIDED"}: raise RuntimeError(f"Application status: {status}") if status not in {"CREATED", "PROCESSING"}: raise RuntimeError("Unknown status; keep the SessionId and contact support") remaining = deadline - time.monotonic() if remaining <= 0: return None time.sleep(min(interval_seconds, remaining)) return None def download_file(file_info, output_path): # Choose the local path in your application; do not trust a remote filename. url = file_info["URL"] parsed_url = urlsplit(url) if parsed_url.scheme != "https" or not parsed_url.hostname: raise RuntimeError("File URL is not a valid HTTPS URL") try: # Do not attach OpenAPI credentials or follow redirects. with requests.get( url, timeout=(5, 60), allow_redirects=False, ) as response: if response.status_code != 200: raise RuntimeError( f"File download returned HTTP {response.status_code}; " "query the session again for a new URL" ) if not response.content: raise RuntimeError("Downloaded file is empty") with Path(output_path).open("xb") as output: output.write(response.content) except requests.RequestException: # Do not expose an exception that may contain the signed URL. raise RuntimeError( "Download network error; query the session again before retrying" ) from None if __name__ == "__main__": eligible_ips = list_applicable_ips() safe_items = [ {"IpId": item.get("IpId"), "IPName": item.get("IPName")} for item in eligible_ips ] print(json.dumps({"Items": safe_items}, ensure_ascii=False, indent=2)) ``` ### 选择 IP 并创建链接 调用 `list_applicable_ips` 获取支持授权书申请的真人 IP。终端用户选择 IP 后,调用 `create_entry` 创建申请。 ```python import secrets ips = list_applicable_ips() # Present ips to the terminal user and obtain the selected IP ID. callback = None # To enable callbacks, replace CALLBACK_URL and securely store the secret: # callback = { # "URL": "", # "Secret": secrets.token_urlsafe(32), # } created = create_entry( "", "", callback=callback, ) session_id = created["SessionId"] application_url = created["ApplicationURL"] ``` 保存 `SessionId`、`ApplicationURL` 和两个截止时间。将 `ApplicationURL` 安全地提供给指定终端用户,不要打印或写入普通日志。 ### 查询并下载 终端用户提交申请后,或收到并验证回调后,使用已保存的 `SessionId` 查询。以下代码最多等待两分钟;返回 `None` 仅表示本轮未等到结果。 ```python file_info = wait_for_file("", wait_seconds=120) if file_info is not None: download_file(file_info, "authorization-letter.pdf") ``` 稍后可以继续查询同一 Session,不要因为本轮等待超时而重新创建申请。 ### 验证回调签名 将收到的原始请求体字节传给 `verify_callback`,不要重新序列化 JSON 后再验签。 ```Python import base64 import hashlib import hmac import re import time def verify_callback(raw_body, timestamp, signature, secret): if not isinstance(raw_body, bytes): return False if not re.fullmatch(r"[A-Za-z0-9_-]{43}", secret): return False if not re.fullmatch(r"[0-9]{1,12}", timestamp): return False if abs(time.time() - int(timestamp)) > 300: return False if not re.fullmatch(r"v1=[0-9a-f]{64}", signature): return False key = base64.urlsafe_b64decode(secret + "=") if len(key) != 32: return False message = timestamp.encode("ascii") + b"." + raw_body expected = "v1=" + hmac.new(key, message, hashlib.sha256).hexdigest() return hmac.compare_digest(expected, signature) ``` > **注意** > > 运行创建申请的代码会写入真实申请记录。正式接入前,使用具备接口权限的账号完成端到端验证。创建请求超时后不要自动重试。 ## 接入注意事项 - 申请链接只提供给指定终端用户。申请链接和下载链接均可直接访问相应内容,不要公开或写入普通日志。 - AK/SK 和 `Callback.Secret` 仅保存在您的服务端,不要发送给浏览器或终端用户。 - `ApplicationURL` 用于填写申请,`File.URL` 用于下载授权书,不要混用。 - 保存您的订单或业务编号与 `SessionId` 的对应关系。向终端用户提供下载文件前,确认终端用户有权查看该业务记录。 > **说明:正式接入前验证完整流程** > > 确认账号权限和页面入口已开通,并验证选择 IP、创建链接、终端用户填写提交、接收通知、查询结果和下载文件的完整流程。同时验证申请过期、处理失败和授权书作废时的业务提示。 ## 常见问题 ### 已领用真人 IP 但不能申请授权书 已领用且授权有效仅表示当前账号可以使用该真人 IP。只有 `SupportsAuthLetterApplication` 明确为 `true` 时,该 IP 才支持申请授权书。 ### 失败回调对应的查询状态是 `EXPIRED` 终端用户未提交且申请入口过期时,回调状态可能为 `FAILED`,查询状态为 `EXPIRED`。回调用于触发处理,最终状态以查询接口为准。 ### 创建接口超时后能否直接重试 不能。超时不表示服务端一定未创建 Session,直接重试可能产生多个申请记录和链接。根据业务记录和服务端日志确认结果;确需重新创建时,只向终端用户提供新链接。 ## 相关文档 - [使用视频生成 API 创作真人 IP 视频](/docs/real-person-ip-video-api) - [查询已授权商业 IP 列表](/docs/list-authorized-commercial-ip-ids-api) - [创建授权书免登申请会话](/docs/create-right-auth-letter-application-session-api) - [查询授权书免登申请会话](/docs/get-right-auth-letter-application-session-api) --- # Doubao Seedream 5.0 pro / flash 教程 Source: https://ark.volcengine.com/region:cn-beijing/docs/seedream-5-0-pro Doubao Seedream 5.0 pro(以下简称 Seedream 5.0 pro)与 Doubao Seedream 5.0 flash(以下简称 Seedream 5.0 flash)支持文生图、单张图生图、多参考图生图等基础生图能力,同时支持通过交互编辑实现精准坐标定位和任意标记编辑、将单张图片拆分为底图与多个图层等特色能力。本文重点介绍两款模型的专属能力,帮助您快速实现 [Image generation API](/docs/image-generation-api) 调用。 # 特色能力 Seedream 5.0 pro 与 Seedream 5.0 flash 支持的特色功能如下: |特色能力 |能力介绍 |效果预览 | |---|---|---| |[交互编辑](/docs/seedream-5-0-pro#interactive_edit) |支持通过坐标、框选、箭头等多种方式指定编辑位置,精准编辑图片,实现局部元素替换、物品定位、区域生成等精细化操作。 |[视频](https://arkdocs.tos-cn-beijing.volces.com/videos/image-generation/edite-model.mov) | |[图层拆分](/docs/seedream-5-0-pro#layer_decomposition) |支持将单张图片的主体、背景、文字、装饰元素等内容自动拆解为 1 张底图和最多 16 个独立且带透明通道的图层,便于移动、缩放、替换、调色等二次编辑。 |![](https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream_50_pro_layer_output2.gif) | |原生多语种生成 |新增支持俄语、阿拉伯语、菲律宾语、泰语、土耳其语、韩语、马来语、西班牙语、葡萄牙语、印尼语、法语、德语、越南语、日语等 14 种语言的原生文字生成能力。 |![](https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream_50_pro-part2-tab3-group1-input1.png) | # 能力概述 Seedream 5.0 pro 与 Seedream 5.0 flash 均支持通过坐标、框选、箭头等多种方式指定编辑位置来精准编辑图片;支持将单张图片拆分为 1 张底图和最多 16 个独立图层;支持原生多语种生成等特色能力。两款模型的定位区别如下: * **Seedream 5.0 pro**:**生图质量更高**,适合对画质要求更高的场景。 * **Seedream 5.0 flash**:**生图速度更快、价格更低**,适合对时延与成本敏感的场景。 |模型名称 ||[Seedream 5.0 pro](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seedream-5-0-pro) |[Seedream 5.0 flash](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seedream-5-0-flash) | |---|---|---|---| |模型 ID (Model ID) ||doubao-seedream-5-0-pro-260628 |doubao-seedream-5-0-flash-260915 | |[文生图](/docs/seedream-4-0-5-0#9695d195) ||✓ |✓ | |[单 / 多图生图](/docs/seedream-4-0-5-0#8bc49063) ||✓ |✓ | |[交互编辑](/docs/seedream-5-0-pro#interactive_edit) ||✓ |✓ | |[图层拆分](/docs/seedream-5-0-pro#layer_decomposition) ||✓ |✓ | |原生多语种生成 ||✓ |✓ | |模型参数 |分辨率 |1K, 1.5K, 2K |1K, 1.5K, 2K | |^^| | | | \ | |输出格式 |png, jpeg |png, jpeg | |^^| | | | \ | |提示词优化模式 |标准模式, 极速模式 |标准模式 | |^^| | | | \ | |生成数量限制 |支持生成单图/
    多张图层( 1张底图+16张图层) |支持生成单图/
    多张图层( 1张底图+16张图层) | |限流 IPM(张 / 分钟) ||500 |500 | # 基础使用 Seedream 5.0 pro / flash 的基础使用方式(文生图、图文生图、多图融合)与其他 Seedream 模型一致,只需将 `model` 参数替换为对应的 Model ID: * Seedream 5.0 pro:`doubao-seedream-5-0-pro-260628` * Seedream 5.0 flash:`doubao-seedream-5-0-flash-260915` 详细代码示例和说明请参考: * [文生图](/docs/seedream-4-0-5-0#9695d195) * [图文生图](/docs/seedream-4-0-5-0#8bc49063) * [多图融合](/docs/seedream-4-0-5-0#4a35e28f) # 交互编辑 Seedream 5.0 pro 与 Seedream 5.0 flash 支持通过**框选、点位、箭头、标注框、坐标**等方式指定编辑位置,实现对局部区域的精准生成或修改。详细操作说明请参考 [Seedream 5.0 pro / flash 交互编辑指南](/docs/seedream-5-0-pro-editing-guide)。 > **说明** > > Java 示例中的 `CreateImageGenerationRequestImage` 需要 `com.volcengine:ark-runtime` 0.6.0 或更高版本。如果 IDE 提示找不到该类型或 `image` 参数类型不匹配,请升级到 [Maven Central](https://central.sonatype.com/artifact/com.volcengine/ark-runtime) 提供的最新稳定版本,并重新加载项目依赖。 ## 使用示例-任意标记 在参考图上通过手绘草图、涂鸦、圈选等任意标记指定编辑区域,模型将识别标记范围并在其中生成或替换内容,同时自然融入原有场景。 |提示词 |输入图 |输出 | |---|---|---| |根据手绘草图对图像进行编辑。在左下角标记区域添加一叠真实的杂志或艺术画册,并在右侧标记区域添加一个带杯碟的陶瓷杯咖啡。移除所有草图线条。保持构图不变。让新添加的物体自然融入原有场景中。 |![](https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream_50_pro_input2.png) |![](https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream_50_pro_output2.png) | **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/images/generations \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seedream-5-0-pro-260628", "prompt": "根据手绘草图对图像进行编辑。在左下角标记区域添加一叠真实的杂志或艺术画册,并在右侧标记区域添加一个带杯碟的陶瓷杯咖啡。移除所有草图线条。保持构图不变。让新添加的物体自然融入原有场景中。", "image": "https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream_50_pro_input2.png", "size": "2K", "output_format": "png", "watermark": true }' ``` * 您可按需替换 Model ID。Model ID 查询见 [模型列表](/docs/model-list)。 **选项:Python** ```Python import os # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark client = Ark( # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv("ARK_API_KEY"), ) imagesResponse = client.images.generate( # Replace with Model ID model="doubao-seedream-5-0-pro-260628", prompt="根据手绘草图对图像进行编辑。在左下角标记区域添加一叠真实的杂志或艺术画册,并在右侧标记区域添加一个带杯碟的陶瓷杯咖啡。移除所有草图线条。保持构图不变。让新添加的物体自然融入原有场景中。", image="https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream_50_pro_input2.png", size="2K", output_format="png", response_format="url", watermark=True, ) print(imagesResponse.data[0].url) ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.images.*; import com.volcengine.ark.runtime.service.ArkService; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; import java.util.concurrent.TimeUnit; public class ImageGenerationsExample { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); Dispatcher dispatcher = new Dispatcher(); ArkService service = ArkService.builder() .baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .build(); // CreateImageGenerationRequestImage requires ark-runtime 0.6.0 or later. CreateImageGenerationRequest generateRequest = CreateImageGenerationRequest.builder() .model("doubao-seedream-5-0-pro-260628") // Replace with Model ID .prompt("根据手绘草图对图像进行编辑。在左下角标记区域添加一叠真实的杂志或艺术画册,并在右侧标记区域添加一个带杯碟的陶瓷杯咖啡。移除所有草图线条。保持构图不变。让新添加的物体自然融入原有场景中。") .image(CreateImageGenerationRequestImage.ofString("https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream_50_pro_input2.png")) .size("2K") .outputFormat(OutputFormat.PNG) .responseFormat(ResponseFormat.URL) .watermark(true) .build(); ImageGenerationResponse imagesResponse = service.generateImages(generateRequest); System.out.println(imagesResponse.getData().get(0).getUrl()); service.shutdownExecutor(); } } ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" model "github.com/volcengine/ark-runtime-go/arkruntime/model/images" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), // The base URL for model invocation arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() outputFormat := model.OutputFormatPNG generateReq := &model.CreateImageGenerationRequest{ Model: "doubao-seedream-5-0-pro-260628", Prompt: model.NewOptString("根据手绘草图对图像进行编辑。在左下角标记区域添加一叠真实的杂志或艺术画册,并在右侧标记区域添加一个带杯碟的陶瓷杯咖啡。移除所有草图线条。保持构图不变。让新添加的物体自然融入原有场景中。"), Image: model.NewOptCreateImageGenerationRequestImage(model.NewStringArrayCreateImageGenerationRequestImage([]string{"https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream_50_pro_input2.png"})), Size: model.NewOptString("2K"), OutputFormat: model.NewOptOutputFormat(outputFormat), ResponseFormat: model.NewOptResponseFormat(model.ResponseFormatURL), Watermark: model.NewOptBool(true), } imagesResponse, err := client.GenerateImages(ctx, generateReq) if err != nil { fmt.Printf("generate images error: %v\n", err) return } fmt.Printf("%s\n", imagesResponse.Data[0].URL.Or("")) } ``` **选项:OpenAI** ```Python import os from openai import OpenAI client = OpenAI( # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv("ARK_API_KEY"), ) imagesResponse = client.images.generate( model="doubao-seedream-5-0-pro-260628", prompt="根据手绘草图对图像进行编辑。在左下角标记区域添加一叠真实的杂志或艺术画册,并在右侧标记区域添加一个带杯碟的陶瓷杯咖啡。移除所有草图线条。保持构图不变。让新添加的物体自然融入原有场景中。", size="2K", output_format="png", response_format="url", extra_body={ "image": "https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream_50_pro_input2.png", "watermark": True, }, ) print(imagesResponse.data[0].url) ``` ## 使用示例-坐标定位 通过在 prompt 中加入 `` 或 `` 坐标标签,精确指定跨图的编辑区域,实现主体元素的定位放置。完整调用步骤和参数说明请参考 [Seedream 5.0 pro / flash 交互编辑指南](/docs/seedream-5-0-pro-editing-guide)。 |提示词 |输入图 |输出 | |---|---|---| |将图 1 ` 179 283 796 986 `的主体放到图 2 ` 118 331 933 871` 位置。 |![](https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/image-20260711-161109-398.png) |![](https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/edit-image.png) | ## 使用说明 交互编辑需要准备以下输入要素:**待编辑图片** 和 **prompt**(包含定位信息 + 编辑指令)。根据定位方式不同,分为以下两种形式: |形式 1:任意标记 + 自然语言定位 |形式 2:坐标精准定位 | |---|---| |在待编辑图片上通过手绘草图、涂鸦、圈选等方式标记编辑区域,然后在 prompt 中用自然语言描述标记位置和编辑意图。 |使用工具框定待编辑内容的坐标(坐标获取方式详见 [Seedream 5.0 pro / flash 交互编辑指南](/docs/seedream-5-0-pro-editing-guide)),在 prompt 中通过 `` 或 `` 坐标标签精确指定位置。 | \ |```JSON |```JSON | \ |{ |{ | \ |"prompt": "在蓝色框内添加一个电视机" |"prompt": "将图1179 283 796 986的主体放到图2118 331 933 871位置"| \ |} |} | \ |``` |``` | 准备好输入要素后,将 **待编辑图片** 和 **prompt** 一起传入 API 接口即可生成图片编辑结果。 # 图层拆分 Seedream 5.0 pro 与 Seedream 5.0 flash 均支持将单张输入图片中的主体、背景、文字、装饰元素等内容自动拆解为 1 张底图和最多 16 个可独立编辑的图层。每个图层均为带透明通道的 PNG 图片,模型还会返回图层的坐标、层级顺序和内容说明,便于在设计工具、前端画布中继续移动、缩放、替换、调色和重新组合。 ## 使用链路 图层拆分功能的使用链路如下: ![new-202608111128.flowchart](https://arkdocs.tos-cn-beijing.volces.com/flowcharts/image-generation/new-202608111128.svg) ## 拆分单张图片 配置参数 `layer_decomposition` 为 `true` 即可开启图层拆分模式。开启后,`image` 为必选参数,且仅支持传入 1 张待拆分图片;`prompt` 为可选参数,用于描述要拆分哪些元素。 ### 提示词输入方式 使用图层拆分功能,推荐采用以下三种输入方式: |使用目标 |`prompt` 写法 | |---|---| |自动拆出主要元素 |不传入 `prompt`。模型自动识别图片中的主体、文字、背景、装饰元素等主要内容,并逐一拆分为独立图层。 | |指定拆分对象 |在 `prompt` 中用自然语言描述待拆分的元素,例如“拆出人物、标题文字和右下角装饰图标”。可配合在输入图上标记(涂鸦、圈选等)辅助定位。 | |精准指定区域 |在 `prompt` 中通过 `` 坐标标签指定待拆分元素的位置。坐标采用归一化坐标,获取方式详见 [Seedream 5.0 pro / flash 交互编辑指南](/docs/seedream-5-0-pro-editing-guide#key-steps)。 | ### 使用示例-自动全拆 如需让模型自动识别并拆分图片中的主要元素,可不传入 `prompt`,只传入待拆分图片并设置`layer_decomposition=true`。 |1 张输入图(不传 `prompt`) |输出底图 |输出图层 ||| |---|---|---|---|---| |![](https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/layer_auto.png) |![](https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/Seedream50_layer_auto_0_base.jpeg) |![](https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/Seedream50_layer_auto_1.png) |![](https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/Seedream50_layer_auto_2.png) |![](https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/Seedream50_layer_auto_3.png) | |^^ |^^ |![](https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/Seedream50_layer_auto_4.png) |![](https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/Seedream50_layer_auto_5.png) |![](https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/Seedream50_layer_auto_6.png) | |^^ |^^ |![](https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/Seedream50_layer_auto_7.png) |![](https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/Seedream50_layer_auto_8.png) |![](https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/Seedream50_layer_auto_9.png) | |^^ |^^ |![](https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/Seedream50_layer_auto_10.png) |![](https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/Seedream50_layer_auto_11.png) |![](https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/Seedream50_layer_auto_12.png) | **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/images/generations \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seedream-5-0-pro-260628", "image": "https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/layer_auto.png", "size": "2K", "layer_decomposition": true, "watermark": true }' ``` * 您可按需替换 Model ID。Model ID 查询见 [模型列表](/docs/model-list)。 **选项:Python** ```Python import os # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark client = Ark( # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv("ARK_API_KEY"), ) imagesResponse = client.images.generate( # Replace with Model ID model="doubao-seedream-5-0-pro-260628", image="https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/layer_auto.png", size="2K", layer_decomposition=True, response_format="url", watermark=True, ) for item in imagesResponse.data: print(item) ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.images.*; import com.volcengine.ark.runtime.service.ArkService; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; import java.util.concurrent.TimeUnit; public class ImageGenerationsExample { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); Dispatcher dispatcher = new Dispatcher(); ArkService service = ArkService.builder() .baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .build(); // CreateImageGenerationRequestImage requires ark-runtime 0.6.0 or later. CreateImageGenerationRequest generateRequest = CreateImageGenerationRequest.builder() .model("doubao-seedream-5-0-pro-260628") // Replace with Model ID .image(CreateImageGenerationRequestImage.ofString("https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/layer_auto.png")) .size("2K") .layerDecomposition(true) .responseFormat(ResponseFormat.URL) .watermark(true) .build(); ImageGenerationResponse imagesResponse = service.generateImages(generateRequest); imagesResponse.getData().forEach(item -> System.out.println(item)); service.shutdownExecutor(); } } ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" model "github.com/volcengine/ark-runtime-go/arkruntime/model/images" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), // The base URL for model invocation arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() generateReq := &model.CreateImageGenerationRequest{ Model: "doubao-seedream-5-0-pro-260628", Image: model.NewOptCreateImageGenerationRequestImage(model.NewStringArrayCreateImageGenerationRequestImage([]string{"https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/layer_auto.png"})), Size: model.NewOptString("2K"), LayerDecomposition: model.NewOptBool(true), ResponseFormat: model.NewOptResponseFormat(model.ResponseFormatURL), Watermark: model.NewOptBool(true), } imagesResponse, err := client.GenerateImages(ctx, generateReq) if err != nil { fmt.Printf("generate images error: %v\n", err) return } for _, item := range imagesResponse.Data { fmt.Printf("%+v\n", item) } } ``` **选项:OpenAI** ```Python import os from openai import OpenAI client = OpenAI( # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv("ARK_API_KEY"), ) imagesResponse = client.images.generate( model="doubao-seedream-5-0-pro-260628", size="2K", response_format="url", extra_body={ "image": "https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/layer_auto.png", "layer_decomposition": True, "watermark": True, }, ) for item in imagesResponse.data: print(item) ``` ### 使用示例-精准指定拆分区域 如需精准指定拆分区域,推荐采用归一化的 `` 坐标指定需要拆分的元素。 |1 张输入图 + 提示词(归一化坐标指定拆分元素) |输出底图 |输出图层 || |---|---|---|---| |![](https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream_50_pro_layer_input.png)
    将图片中的内容拆成 7 个图层,包括 6 组文字:
    `180 64 812 198`、`757 210 939 280`、`63 212 320 282`、`178 714 826 810`、`814 819 949 894`、`326 824 669 930`;
    1 只鹦鹉:`347 305 642 997`。
    |![](https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/Seedream50_layer_0.jpeg) |![](https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/Seedream50_layer_1.png) |![](https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/Seedream50_layer_4.png) | |^^ |^^ |![](https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/Seedream50_layer_2.png) |^^ | |^^ |^^ |![](https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/Seedream50_layer_3.png) |^^ | |^^ |^^ |![](https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/Seedream50_layer_6.png) |^^ | |^^ |^^ |![](https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/Seedream50_layer_5.png) |^^ | |^^ |^^ |![](https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/Seedream50_layer_7.png) |^^ | **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/images/generations \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seedream-5-0-pro-260628", "prompt": "将图片进行精确图层分离,需分离的文字坐标为180 64 812 198、757 210 939 280、63 212 320 282、178 714 826 810、814 819 949 894、326 824 669 930;鹦鹉的坐标为347 305 642 997。", "image": "https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream_50_pro_layer_input.png", "layer_decomposition": true, "size": "2K", "output_format": "jpeg", "response_format": "url", "watermark": true }' ``` * 您可按需替换 Model ID。Model ID 查询见 [模型列表](/docs/model-list)。 **选项:Python** ```Python import os # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark client = Ark( # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv("ARK_API_KEY"), ) imagesResponse = client.images.generate( # Replace with Model ID model="doubao-seedream-5-0-pro-260628", prompt="将图片进行精确图层分离,需分离的文字坐标为180 64 812 198、757 210 939 280、63 212 320 282、178 714 826 810、814 819 949 894、326 824 669 930;鹦鹉的坐标为347 305 642 997。", image="https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream_50_pro_layer_input.png", layer_decomposition=True, size="2K", output_format="jpeg", response_format="url", watermark=True, ) for item in imagesResponse.data: print(item) ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.images.*; import com.volcengine.ark.runtime.service.ArkService; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; import java.util.concurrent.TimeUnit; public class ImageGenerationsExample { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); Dispatcher dispatcher = new Dispatcher(); ArkService service = ArkService.builder() .baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .build(); // CreateImageGenerationRequestImage requires ark-runtime 0.6.0 or later. CreateImageGenerationRequest generateRequest = CreateImageGenerationRequest.builder() .model("doubao-seedream-5-0-pro-260628") // Replace with Model ID .prompt("将图片进行精确图层分离,需分离的文字坐标为180 64 812 198、757 210 939 280、63 212 320 282、178 714 826 810、814 819 949 894、326 824 669 930;鹦鹉的坐标为347 305 642 997。") .image(CreateImageGenerationRequestImage.ofString("https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream_50_pro_layer_input.png")) .layerDecomposition(true) .size("2K") .outputFormat(OutputFormat.JPEG) .responseFormat(ResponseFormat.URL) .watermark(true) .build(); ImageGenerationResponse imagesResponse = service.generateImages(generateRequest); imagesResponse.getData().forEach(item -> System.out.println(item)); service.shutdownExecutor(); } } ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" model "github.com/volcengine/ark-runtime-go/arkruntime/model/images" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), // The base URL for model invocation arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() outputFormat := model.OutputFormatJpeg generateReq := &model.CreateImageGenerationRequest{ Model: "doubao-seedream-5-0-pro-260628", Prompt: model.NewOptString("将图片进行精确图层分离,需分离的文字坐标为180 64 812 198、757 210 939 280、63 212 320 282、178 714 826 810、814 819 949 894、326 824 669 930;鹦鹉的坐标为347 305 642 997。"), Image: model.NewOptCreateImageGenerationRequestImage(model.NewStringArrayCreateImageGenerationRequestImage([]string{"https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream_50_pro_layer_input.png"})), LayerDecomposition: model.NewOptBool(true), Size: model.NewOptString("2K"), OutputFormat: model.NewOptOutputFormat(outputFormat), ResponseFormat: model.NewOptResponseFormat(model.ResponseFormatURL), Watermark: model.NewOptBool(true), } imagesResponse, err := client.GenerateImages(ctx, generateReq) if err != nil { fmt.Printf("generate images error: %v\n", err) return } for _, item := range imagesResponse.Data { fmt.Printf("%+v\n", item) } } ``` **选项:OpenAI** ```Python import os from openai import OpenAI client = OpenAI( # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv("ARK_API_KEY"), ) imagesResponse = client.images.generate( model="doubao-seedream-5-0-pro-260628", prompt="将图片进行精确图层分离,需分离的文字坐标为180 64 812 198、757 210 939 280、63 212 320 282、178 714 826 810、814 819 949 894、326 824 669 930;鹦鹉的坐标为347 305 642 997。", size="2K", output_format="jpeg", response_format="url", extra_body={ "image": "https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream_50_pro_layer_input.png", "layer_decomposition": True, "watermark": True, }, ) for item in imagesResponse.data: print(item) ``` ### 响应结果说明 图层拆分模式下,响应参数 `data` 数组会同时返回底图和所有图层。您可通过`url`下载所有输出图,并根据图层叠放顺序(`z_index`)区分底图和图层。利用图层的边界框坐标信息(`bounding_box`) 和图层叠放顺序(`z_index`)可还原、编辑或重组图层。 |字段 |返回对象 |含义 | |---|---|---| |`url` |底图、图层 |底图或图层的下载链接。图片 URL 仅保留 24 小时。 | |`z_index` |底图、图层 |图层叠放顺序。底图 `z_index=0` 固定为`0`,各图层按 `z_index` 递增排序。 | |`bounding_box.absolute` |图层 |图层在输出底图坐标系中的绝对像素位置,适用于将图层还原到输出底图的原始位置。 | |`bounding_box.normalized` |图层 |图层在输出底图坐标系中的归一化位置,适用于将图层还原到任意尺寸的自定义画布。 | |`name`、`description` |图层 |图层名称和内容描述。 | **返回结构示例:** ```JSON { "model": "doubao-seedream-5-0-pro-260628", "created": 1784696685, "data": [ { "url": "https://...", "size": "2048x2048", "output_format": "jpeg", "z_index": 0 }, { "url": "https://...", "size": "1273x265", "output_format": "png", "z_index": 1, "bounding_box": { "absolute": [383, 120, 1655, 384], "normalized": [187, 59, 808, 188] }, "name": "Seedream标题文字", "description": "黄色大号衬线字体的Seedream标题文字" }, { "url": "https://...", "size": "492x98", "output_format": "png", "z_index": 2, "bounding_box": { "absolute": [140, 451, 631, 548], "normalized": [68, 220, 308, 268] }, "name": "左上角标语文字", "description": "白色两行文字内容为EXPLORE THE WILD, INSPIRE THE SOUL." } ], "usage": { "input_images": 1, "generated_images": 8, "output_tokens": 23107, "total_tokens": 23107 } } ``` ## 使用拆分后的图层 获取底图和图层后,可以直接按原位置还原图层,也可以调整图层位置、大小和叠放顺序;如果需要修改某个元素的颜色、风格或细节,也可以单独编辑该图层。 ### 还原与重组图层 还原或重组图层时,可按以下顺序处理响应结果: 1. 将 `data` 数组中 `z_index` 为 `0` 的对象作为画布背景。 2. 提取 `z_index` 大于 `0` 的图层对象,并按 `z_index` 从小到大排序。 3. 下载图层 PNG,并根据 `bounding_box` 将图层放置到输出底图或目标画布。 4. 根据业务需求调整图层坐标、尺寸或叠放顺序,生成新的组合结果。 **还原图层到输出底图** 如需将图层还原到输出底图中的原始位置,建议使用 `bounding_box.absolute`。该字段为图层在输出底图坐标系中的绝对像素坐标,格式为 `[left, top, right, bottom]`: * `left`、`top`:图层左上角相对于输出底图左上角的位置; * `right`、`bottom`:图层右下角相对于输出底图左上角的位置。 可按以下方式计算图层在底图中的位置和尺寸,其中 `x`、`y` 表示图层左上角在底图中的放置位置,`w`、`h` 表示图层在底图中的展示宽高: ```text x = left y = top w = right - left h = bottom - top ``` 将图层缩放至 `w × h`,再放置到底图的 `(x, y)` 位置。多个图层需要组合时,按 `z_index` 从小到大依次叠放。 **还原到任意画布** 如需将图层还原到不同尺寸的前端画布、设计工具画布中,建议使用 `bounding_box.normalized`。该字段为图层在输出底图坐标系中的归一化坐标,表示图层边界在输出底图宽高方向上的相对位置,格式为 `[left, top, right, bottom]`: * `left`、`right`:图层左右边界在底图宽度方向上的相对位置; * `top`、`bottom`:图层上下边界在底图高度方向上的相对位置。 设目标画布宽高为 `W × H`,可按以下方式计算图层在目标画布中的位置和尺寸,其中 `x`、`y` 表示图层左上角在目标画布中的放置位置,`w`、`h` 表示图层在目标画布中的展示宽高: ```text x = left / 1000 × W y = top / 1000 × H w = (right - left) / 1000 × W h = (bottom - top) / 1000 × H ``` 将图层缩放至 `w × h`,再放置到目标画布的 `(x, y)` 位置。由于归一化坐标为整数,换算到目标画布时可能存在取整误差。 `bounding_box` 字段的完整定义和坐标示例参见 [图片生成 API](/docs/image-generation-api)。 ### 编辑单个透明图层 图层拆分返回的图层为带透明通道的 PNG 图片。您可以将输出图层作为输入图再次调用 Seedream 模型,对其进行单独编辑,例如换色、风格变换、添加细节等。 > **注意** > > 如果希望编辑后的图层继续保留透明背景,可在请求中配置 `background=transparent`、`output_format=png`。透明背景模式的使用限制请参见 [透明通道设置](/docs/seedream-5-0-pro#transparent-channel)。 |提示词 |输入图层 |输出 | |---|---|---| |将图片中的鹦鹉改为孔雀 |![](https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/Seedream50_layer_4.png) |![](https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/Seedream50_layer_4_re.png) | **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/images/generations \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seedream-5-0-pro-260628", "prompt": "将图片中的鹦鹉改为孔雀", "image": "https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/Seedream50_layer_4.png", "size": "2K", "background": "transparent", "watermark": true }' ``` * 您可按需替换 Model ID。Model ID 查询见 [模型列表](/docs/model-list)。 **选项:Python** ```Python import os # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark client = Ark( # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv("ARK_API_KEY"), ) imagesResponse = client.images.generate( # Replace with Model ID model="doubao-seedream-5-0-pro-260628", prompt="将图片中的鹦鹉改为孔雀", image="https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/Seedream50_layer_4.png", size="2K", background="transparent", response_format="url", watermark=True, ) print(imagesResponse.data[0].url) ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" model "github.com/volcengine/ark-runtime-go/arkruntime/model/images" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), // The base URL for model invocation arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() generateReq := &model.CreateImageGenerationRequest{ Model: "doubao-seedream-5-0-pro-260628", Prompt: model.NewOptString("将图片中的鹦鹉改为孔雀"), Image: model.NewOptCreateImageGenerationRequestImage(model.NewStringArrayCreateImageGenerationRequestImage([]string{"https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/Seedream50_layer_4.png"})), Size: model.NewOptString("2K"), ResponseFormat: model.NewOptResponseFormat(model.ResponseFormatURL), Background: model.NewOptBackground(model.BackgroundTransparent), Watermark: model.NewOptBool(true), } imagesResponse, err := client.GenerateImages(ctx, generateReq) if err != nil { fmt.Printf("generate images error: %v\n", err) return } fmt.Printf("%s\n", imagesResponse.Data[0].URL.Or("")) } ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.images.*; import com.volcengine.ark.runtime.service.ArkService; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; import java.util.concurrent.TimeUnit; public class ImageGenerationsExample { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); Dispatcher dispatcher = new Dispatcher(); ArkService service = ArkService.builder() .baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .build(); // CreateImageGenerationRequestImage requires ark-runtime 0.6.0 or later. CreateImageGenerationRequest generateRequest = CreateImageGenerationRequest.builder() .model("doubao-seedream-5-0-pro-260628") // Replace with Model ID .prompt("将图片中的鹦鹉改为孔雀") .image(CreateImageGenerationRequestImage.ofString( "https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/Seedream50_layer_4.png")) .size("2K") .background(Background.TRANSPARENT) .responseFormat(ResponseFormat.URL) .watermark(true) .build(); ImageGenerationResponse imagesResponse = service.generateImages(generateRequest); System.out.println(imagesResponse.getData().get(0).getUrl()); service.shutdownExecutor(); } } ``` # 提升图片生成速度配置 如果您希望**提升图片生成速度**,可以通过 `optimize_prompt_options.mode` 参数选择更快的提示词优化模式。**对于时延敏感的业务,建议您使用 Seedream 5.0 pro 的 `fast` 模式或直接使用 Seedream 5.0 flash 以获得更快的生成速度**。 * `standard`(默认值):标准模式,生成图片的质量较 `fast` 模式更优,但耗时更长。 * `fast`:极速模式,生成图片的耗时较 `standard` 模式更短。**仅 Seedream 5.0 pro 支持**。 ```JSON { "optimize_prompt_options": { "mode": "fast" } } ``` # 自定义图片输出规格 您可以配置以下参数来控制图片输出规格: * **size**:指定输出图像的尺寸大小。 * **response_format**:指定生成图像的返回格式。 * **output_format**:指定生成图像的文件格式。 * **background**:控制是否生成带透明通道的图片。 * **watermark** :指定是否为输出图片添加水印。 ## 图像输出尺寸 `size` 参数在**图片生成场景**和**图层拆分场景**下的可选值与默认值不同,请根据实际场景选择: ### 图片生成场景 支持以下两种方式,不可混用。 **方式 1:指定分辨率档位(推荐)** 在 prompt 中用自然语言描述图片宽高比、图片形状或图片用途,最终由模型判断生成图片的大小。 * 默认值:`2K` * 可选值:`1K`、`1.5K`、`2K` > **说明** > > `1.5K` 与 `1K` 价格相同,且图片生成效果更优。 使用方式 1 并在 prompt 中描述特定宽高比时,模型实际映射的宽高像素参考值(不限于以下标准值,仅列常见): | 分辨率 | 宽高比 | 宽高像素值 | | --- | --- | --- | | 1K | 1:1 | 1024x1024 | |^^| 4:3 | 1152x864 | |^^| 3:4 | 864x1152 | |^^| 16:9 | 1424x800 | |^^| 9:16 | 800x1424 | |^^| 3:2 | 1248x832 | |^^| 2:3 | 832x1248 | |^^| 21:9 | 1568x672 | | 1.5K | 1:1 | 1536x1536 | |^^| 4:3 | 1792x1344 | |^^| 3:4 | 1344x1792 | |^^| 16:9 | 2048x1152 | |^^| 9:16 | 1152x2048 | |^^| 3:2 | 1872x1248 | |^^| 2:3 | 1248x1872 | |^^| 21:9 | 2352x1008 | | 2K | 1:1 | 2048x2048 | |^^| 4:3 | 2368x1776 | |^^| 3:4 | 1776x2368 | |^^| 16:9 | 2816x1584 | |^^| 9:16 | 1584x2816 | |^^| 3:2 | 2496x1664 | |^^| 2:3 | 1664x2496 | |^^| 21:9 | 3136x1344 | **方式 2:指定宽高像素值(`宽x高`)** * 总像素取值范围:[`1280x720`(921600), `2048x2048x1.1025`(4624220)] * 宽高比取值范围:[1/16, 16] > **说明:宽高像素值使用示例** > > 采用方式 2 时,需同时满足总像素取值范围和宽高比取值范围。其中,总像素是对单张图宽度和高度的像素乘积限制,而不是对宽度或高度的单独值进行限制。 > * **有效示例**:`2048x1024` > 总像素值 2048x1024=2097152,符合 [921600, 4624220] 的区间要求;宽高比 2048/1024=2,符合 [1/16, 16] 的区间要求,故该示例值有效。 > * **无效示例**:`512x512` > 总像素值 512x512=262144,未达到 921600 的最低要求,故该示例值无效。 |方式1 |方式2 | |---|---| |```JSON |```JSON | \ |{ |{ | \ |"prompt": "生成一组共4张连贯插画,宽高比为3:2,核心为同一庭院一角的四季变迁,以统一风格展现四季独特色彩、元素与氛围", |"prompt": "生成一组共4张连贯插画,核心为同一庭院一角的四季变迁,以统一风格展现四季独特色彩、元素与氛围",| \ |"size": "2K" |"size": "2048x2048" | \ |} |} | \ |``` |``` | ### 图层拆分场景 仅支持通过指定分辨率档位的方式进行设置。输出图的分辨率规则如下: * **底图**:输出底图的分辨率和 `size` 指定的分辨率一致;输出底图和原待拆分图的宽高比一致。 * **各图层**:输出图层的分辨率和 `size` 指定的分辨率接近;每个输出图层和其在原图中的宽高比一致。 `size` 的默认值与可选值: * 默认值:`auto` * 可选值:`1K`、`1.5K`、`2K`、`auto`(根据输入图的尺寸和宽高比进行输出) > **说明** > > `1.5K` 与 `1K` 价格相同,且图片生成效果更优。 > **说明:auto 适配规则** > > auto 模式下,模型将根据输入图片的尺寸,判断输出底图与每个图层的尺寸: > > * 若输入图片尺寸在 [`1280x720`(921600), `2048x2048x1.1025`(4624220)] 之间,按输入图片原尺寸输出底图与每个图层;且各自保持其在原图中的宽高比。 > * 若输入图片小于 1K,按 1K 输出底图与每个图层,且各自保持其在原图中的宽高比。 > * 若输入图片大于 2K,按 2K 输出底图与每个图层,且各自保持其在原图中的宽高比。 模型实际映射的宽高像素参考值同 [图片生成场景的分辨率映射表](/docs/seedream-5-0-pro#pro_output_spec) ## 图像输出方式 设置 `response_format` 参数,可以指定生成图像的返回方式: * `url`:返回图片下载链接。 * `b64_json`:以 Base64 编码字符串的 JSON 格式返回图像数据。 ```JSON { "response_format": "url" } ``` ## 图像文件格式 设置 `output_format` 参数,指定生成图像文件的格式: * `png` * `jpeg` ```JSON { "output_format": "png" } ``` > **注意** > > 图层拆分场景下,`output_format` 仅控制底图的输出格式,图层始终以 `png` 格式输出。 ## 透明通道设置 设置 `background` 参数,控制是否生成带透明通道的图片: * `transparent`:透明背景模式,输出带有透明背景的图。 * `opaque`(默认):不透明背景模式,生成常规的实体背景图。 ```JSON { "background": "transparent" } ``` > **注意:使用限制** > > * 仅支持图生图场景,且只支持输入 **1 张带透明通道**的图片; > * 透明背景模式下,输出图片默认为 `png` 格式,若同时配置 `output_format` 为 `jpeg`,将触发报错; > * 若传入了不支持透明通道的文件格式(如 `jpeg`),将触发报错。 ## 图像中添加水印 设置 `watermark` 参数,来控制是否在生成的图片中添加水印。 * `false`:不添加水印。 * `true`:在图片右下角添加"AI生成"字样的水印标识。 ```JSON { "watermark": true } ``` # 使用限制 **SDK 版本升级** 为保证模型功能的正常使用,请务必升级至最新 SDK 版本。相关步骤可参考 [安装及升级 SDK](/docs/install-and-upgrade-sdk)。 **图片传入限制** 图片传入方式(两种场景通用): * 图片 URL:请确保图片 URL 可被访问。 示例:`https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_5_imageToimage.png` * Base64 编码:请遵循格式`data:image/<图片格式>;base64,`。注意:`<图片格式>` 必须采用小写字母,例如 `data:image/png;base64,`。 如需获得图片的 Base64 编码,可使用第三方工具,例如 https://base64.guru/converter/encode/image。 不同场景对输入图的约束不同,详见下表: | 约束项 | 图片生成场景 | 图层拆分场景 | | --- | --- | --- | | 图片格式 | jpeg、png、webp、bmp、tiff、gif、heic、heif | png、jpeg | | 总像素(宽×高) | [196, `6000×6000`(3600万)] | [`512×512`(262144), `6000×6000`(3600万)] | | 宽高长度(px) | 大于14 | — | | 宽高比(宽/高) | [1/16, 16] | [1/16, 16] | | 大小 | 不超过 30 MB | 不超过 30 MB | | 传入张数 | 最多传入 10 张参考图 | 仅支持传入单张图 | > **说明** > > 总像素是对单张图宽度和高度的**像素乘积**限制,而不是对宽度或高度的单独值进行限制。 **保存时间** 图片URL仅保留24小时,超时后会被自动清除。请您务必及时保存生成的图片。 **限流说明** * IPM 限流:账号下同模型(区分模型版本)每分钟生成图片数量上限。若超过该限制,生成图片时会报错。 * 图层拆分场景下,每次请求预扣减 17 IPM(即按最大输出张数 17 张预留配额);图片全部生成后,按实际生成数量返还多扣减的额度。 * 不同模型的限制值不同,详见 [图片生成能力](/docs/model-list#9df4d9fd)。 --- # Doubao Seedream 5.0 pro / flash 实现交互编辑指南 Source: https://ark.volcengine.com/region:cn-beijing/docs/seedream-5-0-pro-editing-guide Doubao Seedream 5.0 pro(以下简称 Seedream 5.0 pro)与 Doubao Seedream 5.0 flash(以下简称 Seedream 5.0 flash)均提供交互编辑能力,支持在提示词中输入位置坐标来精准编辑图片。用户可以在参考图上通过坐标点或标注建立位置对应关系,模型将按标记位置进行局部编辑,实现物品替换、元素定位、局部重绘等精细化操作。 本文介绍如何基于 Seedream 5.0 pro / flash 实现点选和框选式交互编辑:用户上传参考图后,通过点选或框选指定编辑位置,前端将操作位置转换为**归一化坐标**(范围 **0~999**,左上角为 0,0,右下角为 999,999)用 `` 或 `` 坐标标记,并与自然语言 Prompt 一起提交给模型。模型会结合参考图、坐标位置和文本指令生成编辑后的图片。 | 输入图片及框选操作 | 效果预览 | | --- | --- | | [视频](https://arkdocs.tos-cn-beijing.volces.com/videos/image-generation/edite-model.mov)
    将用户框选的目标区域转换为空间坐标,组装成模型可以理解的 Prompt。

    Prompt:` 将图 1 179 283 796 986 的主体放到图 2 118 331 933 871 位置。`
    | ![edit-image.png](https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/edit-image.png)
    根据组装后的 Prompt、参考图生成编辑后的图片。
    | # 关键操作:将目标区域转换为归一化坐标 模型需要的关键信息:**待编辑图片**和 **prompt**(包含归一化坐标 + 编辑指令),其中归一化坐标是将图片上点选或框选的区域**归一化到 1000 * 1000 的比例坐标,取值范围[0,999]**。图片宽高等分为 1000 份后,图片左上角坐标为 `0,0`,右下角为 `999,999`。 **prompt 中可以使用的坐标方式**: * **点选坐标**:`x y`(指定一个点,由模型判断影响范围) * **框选坐标**:`x1 y1 x2 y2`(指定左上角和右下角坐标,精确控制编辑区域大小) **归一化坐标处理方式**: 1. 获取定位信息:用户完成点选或框选后,需要先拿到定位点/框在图片展示区域内的相对坐标(相对于图片左上角)。 * 点选:`x_px, y_px`(点击位置) * 框选:`x1_px, y1_px, x2_px, y2_px`(框的左上角与右下角) 2. 转换为 0-999 的归一化坐标:将获取到的定位坐标按图片展示宽高转换为 0-999 的整数坐标。 * 点选: * `x = round(x_px / width * 1000)` * `y = round(y_px / height * 1000)` > **注意** > > * `x`、`y`:归一化后的坐标。 > * `x_px`、`y_px`:点选位置相对于图片左上角的坐标。 > * `width`、`height`:图片在画布中的展示宽、高。 * 框选: 对 `x1_px, y1_px, x2_px, y2_px` 分别按上述规则换算,得到 `x1 y1 x2 y2`。 # 支持场景 > **说明** > > 在多主体场景下明确指定编辑对象的方法,可参见 [使用说明](/docs/seedream-5-0-pro-editing-guide#usage)。 | 场景 | 交互模式 | 组合后的 Prompt | | ---- | ---- | ---- | | 编辑指定点附近的对象 | 点选 | `把图 1 520 460 位置换成皇冠` | | 编辑指定区域的对象 | 框选 | `把图 1 120 180 640 760 区域替换成花园` | | 跨图片编辑 | 点选、框选 | `将图 1 179 283 796 986 的主体放到图 2 118 331 933 871 位置,将图 2 50 50 位置换成皇冠` | # 整体流程 ## 代码示例 您可以下载代码示例,体验交互编辑效果。下载并解压后,请确保已安装 Python 3.9 或以上版本,在项目目录执行 `python3 -m pip install -r requirements.txt` 安装依赖,设置环境变量 `ARK_API_KEY`,再执行 `bash run.sh` 启动示例。 [touch_edit_demo_arkruntime-20260909.zip](https://arkdocs.tos-cn-beijing.volces.com/files/image-generation/touch_edit_demo_arkruntime-20260909.zip) ## 流程图 基于上述代码示例实现交互编辑的完整流程如下。 ![new-202607111020.flowchart](https://arkdocs.tos-cn-beijing.volces.com/flowcharts/image-generation/new-202607111020.svg) # 实现步骤 > **注意** > > 本文仅提供展示关键执行逻辑的核心代码,无法仅凭以下内容实现完整流程。完整实现请参见 [代码示例](/docs/seedream-5-0-pro-editing-guide#code-example)。 ## 0. 上传图片并放入画布 这一步主要用于获取图片的相关信息。本文示例是将用户上传的图片转换为画布中的可操作对象。除了保存图片文件本身,还需要记录图片在画布中的位置、展示尺寸、原始尺寸和图号,为后续点选、框选和模型调用提供基础数据。 核心代码如下: 核心代码 ```JavaScript function addImageFromFile(file, dataUrl) { const probe = new Image(); probe.onload = () => { const maxSide = 360; const ratio = Math.min(1, maxSide / Math.max(probe.naturalWidth, probe.naturalHeight)); const id = `img-${state.nextId}`; const image = { id, label: `图${state.nextId}`, name: file.name, dataUrl, element: probe, naturalWidth: probe.naturalWidth, naturalHeight: probe.naturalHeight, x: 80 + (state.nextId - 1) * 40, y: 80 + (state.nextId - 1) * 40, width: Math.round(probe.naturalWidth * ratio), height: Math.round(probe.naturalHeight * ratio), }; state.nextId += 1; state.images.push(image); selectImage(id); setStatus(`已上传 ${image.label},可拖拽或点选/框选。`); }; probe.src = dataUrl; } ``` ## 1. 将目标区域转换为归一化坐标 这一步将用户在画布上的点选或框选操作,转换为 Seedream 5.0 pro Prompt 中可使用的坐标定位标记。 ### 实现原理 在图片上点选或框选的区域,需要转换为归一化坐标(范围 0~999,左上角为 0,0,右下角为 999,999),将用户的空间意图显式写入 Prompt,例如: ```text 把 图1520 460 位置换成皇冠 把 图1120 180 640 760 区域替换成花园 ``` * **坐标说明** | 坐标类型 | 含义 | 用途 | | --- | ---- | ---- | | Client 坐标 | 鼠标相对浏览器窗口左上角的位置,即 `event.clientX / event.clientY`。 | 浏览器事件的原始输入。 | | World 坐标 | 画布内部的逻辑坐标系。图片的 `x / y / width / height` 都保存在这个坐标系中。 | 保证画布缩放、平移后仍能正确命中图片。 | | Normalized 坐标 | 相对单张图片归一化到 0-999 的坐标。 | 最终写入 `` 或 ``。 | * **坐标转换** 1. 将鼠标的 Client 坐标转换为 World 坐标,消除画布位置、平移和缩放的影响。 2. 将 World 坐标转换为图片内 0-999 的归一化坐标。具体原理参见 [关键操作:将目标区域转换为归一化坐标](/docs/seedream-5-0-pro-editing-guide#key-steps)。 * 点选模式:生成 ` x y`; * 框选模式:生成 ` x1 y1 x2 y2`。 ### 核心代码 * 坐标转换 ```JavaScript // Client 坐标转换为 World 坐标 function clientToWorld(clientX, clientY) { const rect = viewport.getBoundingClientRect(); return { x: (clientX - rect.left - state.view.x) / state.view.scale, y: (clientY - rect.top - state.view.y) / state.view.scale, }; } // World 坐标转换为 0-999 归一化 function normalizedPoint(worldPoint, image) { return { x: clamp1000(((worldPoint.x - image.x) / image.width) * 1000), y: clamp1000(((worldPoint.y - image.y) / image.height) * 1000), }; } ``` * 根据点选 / 框选生成 `` 或 `` 坐标标记 ```JavaScript if (state.mode === "point" && image) { const p = normalizedPoint(worldPoint, image); const ann = buildAnnotation("point", image, { x: p.x, y: p.y }); ann.token = `${image.label}${p.x} ${p.y}`; state.annotations.push(ann); appendAnnotationChip(ann, image); renderImages(); setStatus(`已添加 ${ann.token}`); return; } if (state.box) { const image = state.images.find((item) => item.id === state.box.imageId); const dx = Math.abs(state.box.current.x - state.box.start.x); const dy = Math.abs(state.box.current.y - state.box.start.y); state.box.selection.remove(); if (image && dx > 4 && dy > 4) { const b = normalizedBox(state.box.start, state.box.current, image); const ann = buildAnnotation("bbox", image, b); ann.token = `${image.label}${b.x1} ${b.y1} ${b.x2} ${b.y2}`; state.annotations.push(ann); appendAnnotationChip(ann, image); setStatus(`已添加 ${ann.token}`); } state.box = null; viewport.releasePointerCapture(event.pointerId); renderImages(); } ``` ## 2. 组装 Prompt 这一步将用户输入的自然语言和点选 / 框选生成的空间坐标合并,形成 Seedream 5.0 pro 可以理解的最终 Prompt。 ### Prompt 写法 | 场景 | 参考写法 | | ---- | ---- | | 编辑指定点附近的对象 | ` 把图 1 520 460 位置换成皇冠 ` | | 编辑指定区域的对象 | ` 把图 1 120 180 640 760 区域替换成花园 ` | | 跨图片编辑 | ` 将图 1 179 283 796 986 的主体放到图 2 118 331 933 871 位置。` | ### 核心代码 核心代码 ```JavaScript // 从编辑框内容生成最终 Prompt,并整理本次需要提交的图片列表 function buildModelInputFromPrompt() { const assignedImages = new Map(); const inputImages = []; // 将画布图片映射为模型输入的图号,并收集需要提交的图片 function assignImage(image) { if (!image) return ""; if (!assignedImages.has(image.id)) { const inputLabel = `图${inputImages.length + 1}`; assignedImages.set(image.id, inputLabel); inputImages.push({ ...image, inputLabel }); } return assignedImages.get(image.id); } // 将编辑框中的图号(图1/图2)重映射为实际要提交的输入图号 function remapImageLabels(text) { return text.replace(/图\\d+/g, (label) => { const image = state.images.find((item) => item.label === label); return image ? assignImage(image) : label; }); } // 遍历编辑框 DOM,将文本与坐标标注拼接为 Prompt 文本 function walk(node) { if (node.nodeType === Node.TEXT_NODE) { return remapImageLabels(node.textContent || ""); } if (node.nodeType !== Node.ELEMENT_NODE) { return ""; } if (node.classList?.contains("annotation-inline")) { const ann = state.annotations.find((item) => item.id === Number(node.dataset.annotationId)); const image = ann ? state.images.find((item) => item.id === ann.imageId) : null; const inputLabel = assignImage(image); if (!ann || !inputLabel) return ""; return ` ${annotationTokenForLabel(ann, inputLabel)} `; } if (node.tagName === "BR") { return "\\n"; } return [...node.childNodes].map(walk).join(""); } const prompt = walk(promptInput) .replace(/\\u00a0/g, " ") .replace(/[ \\t]{2,}/g, " ") .replace(/\\n{3,}/g, "\\n\\n") .trim(); return { prompt, images: inputImages }; } ``` ## 3. 生成图片 这一步根据组装好的 Prompt 和输入图片调用图片生成 API,并将模型生成结果返回给前端展示。 ### 核心代码 * 前端提交图片生成请求 ```JavaScript generateBtn.addEventListener("click", async () => { const modelInput = buildModelInputFromPrompt(); const resp = await fetch("/api/generate", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ prompt: modelInput.prompt, images: modelInput.images.map((image) => ({ inputLabel: image.inputLabel, name: image.name, dataUrl: image.dataUrl, naturalWidth: image.naturalWidth, naturalHeight: image.naturalHeight, })), }), }); const data = await resp.json(); renderGeneratedImage(data.url); }); ``` * 后端调用图片生成 API ```Python ARK_MODEL = "doubao-seedream-5-0-pro-260628" ARK_BASE_URL = "https://ark.cn-beijing.volces.com/api/v3" try: client = Ark( api_key=os.getenv("ARK_API_KEY"), base_url=ARK_BASE_URL, ) resp = client.images.generate( model=ARK_MODEL, prompt=prompt, image=image_arg, size="2K", output_format="png", response_format="url", watermark=True, ) except Exception as exc: print(f"[generate] error: {exc!r}") return self._send_json(500, {"error": str(exc)}) try: url = resp.data[0].url except (AttributeError, IndexError) as exc: return self._send_json(502, {"error": f"unexpected ark response: {exc}"}) return self._send_json( 200, { "model": ARK_MODEL, "prompt": prompt, "url": url, }, ) ``` ### 效果预览 | 输入图片 | 效果预览 | | --- | --- | | ![](https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/image-20260711-161109-398.png) | ![](https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/edit-image.png) | \ | | | \ | > Prompt:` 将图 1 179 283 796 986 的主体放到图 2 118 331 933 871 位置。` | | # 使用说明 在多主体场景下,可以通过以下写法更明确地指定编辑对象。 * 框选区域内有多个主体时,明确操作对象。 当 `` 覆盖的区域内存在多个主体/元素时,建议在 Prompt 中补充一句说明要编辑的目标对象(例如“左侧的人”“戴帽子的猫”“前景的花”),帮助模型稳定选择正确的编辑对象。 示例:`把图 1 120 180 640 760 区域内的左侧人物换成机器人` * 标注需要保持不变的对象。 如果希望某些物体不被修改,可以将其一并框选出来,并在 Prompt 中明确“保持不变/不要修改”。 示例:`把图 1 120 180 640 760 区域替换成花园,图 1 700 120 920 360 区域保持不变` # 相关文档 * [Doubao Seedream 5.0 pro / flash 教程](/docs/seedream-5-0-pro) * [ 图片生成 API 文档 ](/docs/image-generation-api) --- # 图片生成教程 Source: https://ark.volcengine.com/region:cn-beijing/docs/seedream-4-0-5-0 Doubao Seedream 系列模型原生支持文本、单图和多图输入,实现基于主体一致性的多图融合创作、图像编辑、组图生成等多样玩法,让图像创作更加自由可控。本文以 Doubao Seedream 5.0 lite(以下简称 Seedream 5.0 lite)为例介绍如何调用 [Image generation API](/docs/image-generation-api) 进行图像创作。如需使用 Doubao Seedream 5.0 pro(以下简称 Seedream 5.0 pro)/ Doubao Seedream 4.5(以下简称 Seedream 4.5)/ Doubao Seedream 4.0(以下简称 Seedream 4.0)模型,将下文代码示例中的 model 字段替换为对应的 Model ID 即可。 > **注意:新模型上线** > > Seedream 5.0 flash(Model ID: `doubao-seedream-5-0-flash-260915`)已上线,支持通过坐标、框选、箭头等多种方式指定编辑位置来精准编辑图片;支持将单张图片拆分为 1 张底图和最多 16 个独立图层;支持原生多语种生成。 > > **Seedream 5.0 flash 生图速度更快、价格更低**,适合对时延与成本敏感的业务场景。详情参见:[Doubao Seedream 5.0 pro / flash 教程](/docs/seedream-5-0-pro)。 # 模型效果 更多效果示例见 [效果预览](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seedream-5-0)。 |场景 |输入 |输出 | |---|---|---| |图层拆分 |![](https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream_50_pro_layer_input.png) |![](https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream_50_pro_layer_output2.png) | \ |> Seedream 5.0 pro / flash 支持将元素拆分为可独立编辑的图层,便于后续拖拽、缩放、重组等精细化编辑。 | | | \ | |> 将图片进行精确图层分离,需分离的文字坐标为 `180 64 812 198`、`757 210 939 280`、`63 212 320 282`、`178 714 826 810`、`814 819 949 894`、`326 824 669 930`;鹦鹉的坐标为 `347 305 642 997`。 | | |交互编辑 |![](https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream_50_pro_input2.png) |![](https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream_50_pro_output2.png) | \ |> Seedream 5.0 pro / flash 支持通过标记指定编辑区域,模型识别标记范围并生成内容,自然融入原有场景。 | | | \ | |> 根据手绘草图对图像进行编辑。在左下角标记区域添加一叠真实的杂志或艺术画册,并在右侧标记区域添加一个带杯碟的陶瓷杯咖啡。移除所有草图线条。保持构图不变。 | | |文生图 `联网搜索` |制作一张上海未来5日的天气预报图,采用现代扁平化插画风格,清晰展示每日天气、温度和穿搭建议。 整体为横向排版,标题为“上海未来5日天气预报”,包含5个等宽的垂直卡片,从左到右依次排列。 整体风格为现代、干净、友好的扁平化矢量插画风格,线条清晰,色彩柔和。 人物形象采用年轻男女的卡通插画,表情自然,姿态放松,服装细节清晰。 |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/56e0e5cc24ff40559c9e934e5d744393~tplv-goo7wpa0wc-image.image) | \ |> Seedream 5.0 lite 模型可通过联网搜索功能,融合实时网络信息,提升生图时效性。 | | | |多参考图生图 |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/2198d4bef000400bbfea18025850ed82~tplv-goo7wpa0wc-image.image) |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/db71316f709243ceb69a629cd48598ff~tplv-goo7wpa0wc-image.image) | \ |> 输入多张参考图,融合它们的风格、元素等特征来生成新图像。 | | | \ | |> 将图1的服装换为图2的服装 | | |组图生成 |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/a215e8241dd94f50901948790da121e1~tplv-goo7wpa0wc-image.image) |![](https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream-reference.jpeg) | \ |> 基于用户输入的文字和图片,生成一组内容关联的图像 | | | \ | |> 参考图1,生成四图片,图中人物分别带着墨镜,骑着摩托,带着帽子,拿着棒棒糖 | | # 模型能力 以下为 Seedream 系列各版本模型的能力与参数对比,帮助您根据业务需求选择合适的模型。 |模型名称 ||[Seedream 5.0 pro](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seedream-5-0-pro) |[Seedream 5.0 flash](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seedream-5-0-flash) |[Seedream 5.0 lite](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seedream-5-0) |[Seedream 4.5](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seedream-4-5) |[Seedream 4.0](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seedream-4-0) | |---|---|---|---|---|---|---| |模型 ID (Model ID) ||doubao-seedream-5-0-pro-260628 |doubao-seedream-5-0-flash-260915 |doubao-seedream-5-0-260128 (同时支持:doubao-seedream-5-0-lite-260128) |doubao-seedream-4-5-251128 |doubao-seedream-4-0-250828 | |[文生图](/docs/seedream-4-0-5-0#9695d195) ||✓ |✓ |✓ |✓ |✓ | |[文生组图](/docs/seedream-4-0-5-0#ec79cfda) ||暂不支持 |暂不支持 |✓ |✓ |✓ | |[单 / 多图生图](/docs/seedream-4-0-5-0#8bc49063) ||✓ |✓ |✓ |✓ |✓ | |[单 / 多图生组图](/docs/seedream-4-0-5-0#fc9f85e4) ||暂不支持 |暂不支持 |✓ |✓ |✓ | |[交互编辑](/docs/seedream-4-0-5-0#interactive_edit) ||✓ |✓ |✗ |✗ |✗ | |[图层拆分](/docs/seedream-5-0-pro#layer_decomposition) ||✓ |✓ |✗ |✗ |✗ | |[流式输出](/docs/seedream-4-0-5-0#e5bef0d7) ||暂不支持 |暂不支持 |✓ |✓ |✓ | |[联网搜索](/docs/seedream-4-0-5-0#4e1745fa) ||暂不支持 |暂不支持 |✓ |✗ |✗ | |模型参数 |分辨率 |1K, 1.5K, 2K |1K, 1.5K, 2K |2K, 3K, 4K |2K, 4K |1K, 2K, 4K | |^^| | | | | | | \ | |输出格式 |png, jpeg |png, jpeg |png, jpeg |jpeg |jpeg | |^^| | | | | | | \ | |提示词优化模式 |标准模式, 极速模式 |标准模式 |标准模式 |标准模式 |标准模式, 极速模式 | |^^| | | | | | | \ | |生成数量 |支持生成单图/多个图层(1 张底图 + 16 张图层) |支持生成单图/多个图层(1 张底图 + 16 张图层) |输入的参考图数量 + 最终生成的图片数量 ≤ 15张 ||| |限流 IPM(张 / 分钟) ||500 |500 |500 |500 |500 | # 快速体验 您可在火山方舟平台 API Explorer,快速体验图片生成功能,支持自定义参数(例如设置图片水印、控制输出图片大小等),方便您直观感受其效果和性能。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/5d1932f325e245249d9f955fe709ad85~tplv-goo7wpa0wc-image.image) # 基础使用 ## 文生图(纯文本输入单图输出) 通过给模型提供清晰准确的文字指令,即可快速获得符合描述的高质量单张图片。 |提示词 |输出 | |---|---| |充满活力的特写编辑肖像,模特眼神犀利,头戴雕塑感帽子,色彩拼接丰富,眼部焦点锐利,景深较浅,具有Vogue杂志封面的美学风格,采用中画幅拍摄,工作室灯光效果强烈。 |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/2ff811eb52bf47a6972bf3da0d5a99c9~tplv-goo7wpa0wc-image.image) | **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/images/generations \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seedream-5-0-lite-260128", "prompt": "充满活力的特写编辑肖像,模特眼神犀利,头戴雕塑感帽子,色彩拼接丰富,眼部焦点锐利,景深较浅,具有Vogue杂志封面的美学风格,采用中画幅拍摄,工作室灯光效果强烈。", "size": "2K", "output_format":"png", "watermark": true }' ``` * 您可按需替换 Model ID。Model ID 查询见 [模型列表](/docs/model-list)。 **选项:Python** ```Python import os # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark client = Ark( # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv('ARK_API_KEY'), ) imagesResponse = client.images.generate( # Replace with Model ID model="doubao-seedream-5-0-lite-260128", prompt="充满活力的特写编辑肖像,模特眼神犀利,头戴雕塑感帽子,色彩拼接丰富,眼部焦点锐利,景深较浅,具有Vogue杂志封面的美学风格,采用中画幅拍摄,工作室灯光效果强烈。", size="2K", output_format="png", response_format="url", watermark=True ) print(imagesResponse.data[0].url) ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.images.*; import com.volcengine.ark.runtime.service.ArkService; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; import java.util.Arrays; import java.util.List; import java.util.concurrent.TimeUnit; public class ImageGenerationsExample { public static void main(String[] args) { // Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey String apiKey = System.getenv("ARK_API_KEY"); ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); Dispatcher dispatcher = new Dispatcher(); ArkService service = ArkService.builder() .baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .build(); CreateImageGenerationRequest generateRequest = CreateImageGenerationRequest.builder() .model("doubao-seedream-5-0-lite-260128") // Replace with Model ID .prompt("充满活力的特写编辑肖像,模特眼神犀利,头戴雕塑感帽子,色彩拼接丰富,眼部焦点锐利,景深较浅,具有Vogue杂志封面的美学风格,采用中画幅拍摄,工作室灯光效果强烈。") .size("2K") .sequentialImageGeneration(SequentialImageGenerationMode.DISABLED) .outputFormat(OutputFormat.PNG) .responseFormat(ResponseFormat.URL) .stream(false) .watermark(true) .build(); ImageGenerationResponse imagesResponse = service.generateImages(generateRequest); System.out.println(imagesResponse.getData().get(0).getUrl()); service.shutdownExecutor(); } } ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" model "github.com/volcengine/ark-runtime-go/arkruntime/model/images" ) func main() { client := arkruntime.NewClientWithApiKey( // Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey os.Getenv("ARK_API_KEY"), // The base URL for model invocation arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() outputFormat := model.OutputFormatPNG generateReq := &model.CreateImageGenerationRequest{ Model: "doubao-seedream-5-0-lite-260128", // Replace with Model ID Prompt: model.NewOptString("充满活力的特写编辑肖像,模特眼神犀利,头戴雕塑感帽子,色彩拼接丰富,眼部焦点锐利,景深较浅,具有Vogue杂志封面的美学风格,采用中画幅拍摄,工作室灯光效果强烈。"), Size: model.NewOptString("2K"), OutputFormat: model.NewOptOutputFormat(outputFormat), ResponseFormat: model.NewOptResponseFormat(model.ResponseFormatURL), Watermark: model.NewOptBool(true), } imagesResponse, err := client.GenerateImages(ctx, generateReq) if err != nil { fmt.Printf("generate images error: %v\n", err) return } fmt.Printf("%s\n", imagesResponse.Data[0].URL.Or("")) } ``` **选项:OpenAI** ```Python import os from openai import OpenAI client = OpenAI( # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv('ARK_API_KEY'), ) imagesResponse = client.images.generate( # Replace with Model ID model="doubao-seedream-5-0-lite-260128", prompt="充满活力的特写编辑肖像,模特眼神犀利,头戴雕塑感帽子,色彩拼接丰富,眼部焦点锐利,景深较浅,具有Vogue杂志封面的美学风格,采用中画幅拍摄,工作室灯光效果强烈。", size="2K", output_format="png", response_format="url", extra_body={ "watermark": False, }, ) print(imagesResponse.data[0].url) ``` ## 图文生图(单图输入单图输出) 基于已有图片,结合文字指令进行图像编辑,包括图像元素增删、风格转化、材质替换、色调迁移、改变背景/视角/尺寸等。 |提示词 |输入图 |输出 | |---|---|---| |保持模特姿势和液态服装的流动形状不变。将服装材质从银色金属改为完全透明的清水(或玻璃)。透过液态水流,可以看到模特的皮肤细节。光影从反射变为折射。 |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/816153e67d3c4478886276154d78b22e~tplv-goo7wpa0wc-image.image) |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/579ed507e0aa4647be9f1890d23e638e~tplv-goo7wpa0wc-image.image) | **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/images/generations \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seedream-5-0-lite-260128", "prompt": "保持模特姿势和液态服装的流动形状不变。将服装材质从银色金属改为完全透明的清水(或玻璃)。透过液态水流,可以看到模特的皮肤细节。光影从反射变为折射。", "image": "https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_5_imageToimage.png", "size": "2K", "output_format":"png", "watermark": true }' ``` * 您可按需替换 Model ID。Model ID 查询见 [模型列表](/docs/model-list)。 **选项:Python** ```Python import os # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark client = Ark( # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv('ARK_API_KEY'), ) imagesResponse = client.images.generate( # Replace with Model ID model="doubao-seedream-5-0-lite-260128", prompt="保持模特姿势和液态服装的流动形状不变。将服装材质从银色金属改为完全透明的清水(或玻璃)。透过液态水流,可以看到模特的皮肤细节。光影从反射变为折射。", image="https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_5_imageToimage.png", size="2K", output_format="png", response_format="url", watermark=True ) print(imagesResponse.data[0].url) ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.images.*; import com.volcengine.ark.runtime.service.ArkService; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; import java.util.Arrays; import java.util.List; import java.util.concurrent.TimeUnit; public class ImageGenerationsExample { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); Dispatcher dispatcher = new Dispatcher(); ArkService service = ArkService.builder() .baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .build(); // CreateImageGenerationRequestImage requires ark-runtime 0.6.0 or later. CreateImageGenerationRequest generateRequest = CreateImageGenerationRequest.builder() .model("doubao-seedream-5-0-lite-260128") // Replace with Model ID .prompt("保持模特姿势和液态服装的流动形状不变。将服装材质从银色金属改为完全透明的清水(或玻璃)。透过液态水流,可以看到模特的皮肤细节。光影从反射变为折射。") .image(CreateImageGenerationRequestImage.ofString("https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_5_imageToimage.png")) .size("2K") .sequentialImageGeneration(SequentialImageGenerationMode.DISABLED) .outputFormat(OutputFormat.PNG) .responseFormat(ResponseFormat.URL) .stream(false) .watermark(true) .build(); ImageGenerationResponse imagesResponse = service.generateImages(generateRequest); System.out.println(imagesResponse.getData().get(0).getUrl()); service.shutdownExecutor(); } } ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" model "github.com/volcengine/ark-runtime-go/arkruntime/model/images" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), // The base URL for model invocation arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() outputFormat := model.OutputFormatPNG generateReq := &model.CreateImageGenerationRequest{ Model: "doubao-seedream-5-0-lite-260128", Prompt: model.NewOptString("保持模特姿势和液态服装的流动形状不变。将服装材质从银色金属改为完全透明的清水(或玻璃)。透过液态水流,可以看到模特的皮肤细节。光影从反射变为折射。"), Image: model.NewOptCreateImageGenerationRequestImage(model.NewStringArrayCreateImageGenerationRequestImage([]string{"https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_5_imageToimage.png"})), Size: model.NewOptString("2K"), OutputFormat: model.NewOptOutputFormat(outputFormat), ResponseFormat: model.NewOptResponseFormat(model.ResponseFormatURL), Watermark: model.NewOptBool(true), } imagesResponse, err := client.GenerateImages(ctx, generateReq) if err != nil { fmt.Printf("generate images error: %v\n", err) return } fmt.Printf("%s\n", imagesResponse.Data[0].URL.Or("")) } ``` **选项:OpenAI** ```Python import os from openai import OpenAI client = OpenAI( # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv('ARK_API_KEY'), ) imagesResponse = client.images.generate( model="doubao-seedream-5-0-lite-260128", prompt="保持模特姿势和液态服装的流动形状不变。将服装材质从银色金属改为完全透明的清水(或玻璃)。透过液态水流,可以看到模特的皮肤细节。光影从反射变为折射。", size="2K", output_format="png", response_format="url", extra_body = { "image": "https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_5_imageToimage.png", "watermark": True } ) print(imagesResponse.data[0].url) ``` ## 多图融合(多图输入单图输出) 根据您输入的文本描述和多张参考图片,融合它们的风格、元素等特征来生成新图像。如衣裤鞋帽与模特图融合成穿搭图,人物与风景融合为人物风景图等。 |提示词 |输入图1 |输入图2 |输出 | |---|---|---|---| |将图1的服装换为图2的服装 |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/4b4464161cf3463db6f9463b10939178~tplv-goo7wpa0wc-image.image) |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/c23d1b0528a14cb08b684307eabdcc9b~tplv-goo7wpa0wc-image.image) |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/db71316f709243ceb69a629cd48598ff~tplv-goo7wpa0wc-image.image) | **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/images/generations \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seedream-5-0-lite-260128", "prompt": "将图1的服装换为图2的服装", "image": ["https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_imagesToimage_1.png", "https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_5_imagesToimage_2.png"], "size": "2K", "output_format":"png", "watermark": true }' ``` * 您可按需替换 Model ID。Model ID 查询见 [模型列表](/docs/model-list)。 **选项:Python** ```Python import os # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark client = Ark( # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv('ARK_API_KEY'), ) imagesResponse = client.images.generate( # Replace with Model ID model="doubao-seedream-5-0-lite-260128", prompt="将图1的服装换为图2的服装", image=["https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_imagesToimage_1.png", "https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_5_imagesToimage_2.png"], size="2K", output_format="png", response_format="url", watermark=True ) print(imagesResponse.data[0].url) ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.images.*; import com.volcengine.ark.runtime.service.ArkService; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; import java.util.Arrays; import java.util.List; import java.util.concurrent.TimeUnit; public class ImageGenerationsExample { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); Dispatcher dispatcher = new Dispatcher(); ArkService service = ArkService.builder() .baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .build(); // CreateImageGenerationRequestImage requires ark-runtime 0.6.0 or later. CreateImageGenerationRequest generateRequest = CreateImageGenerationRequest.builder() .model("doubao-seedream-5-0-lite-260128") // Replace with Model ID .prompt("将图1的服装换为图2的服装") .image(CreateImageGenerationRequestImage.ofList(Arrays.asList( "https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_imagesToimage_1.png", "https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_5_imagesToimage_2.png" ))) .size("2K") .sequentialImageGeneration(SequentialImageGenerationMode.DISABLED) .outputFormat(OutputFormat.PNG) .responseFormat(ResponseFormat.URL) .stream(false) .watermark(true) .build(); ImageGenerationResponse imagesResponse = service.generateImages(generateRequest); System.out.println(imagesResponse.getData().get(0).getUrl()); service.shutdownExecutor(); } } ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" model "github.com/volcengine/ark-runtime-go/arkruntime/model/images" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), // The base URL for model invocation arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() outputFormat := model.OutputFormatPNG generateReq := &model.CreateImageGenerationRequest{ Model: "doubao-seedream-5-0-lite-260128", Prompt: model.NewOptString("将图1的服装换为图2的服装"), Image: model.NewOptCreateImageGenerationRequestImage(model.NewStringArrayCreateImageGenerationRequestImage([]string{ "https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_imagesToimage_1.png", "https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_5_imagesToimage_2.png", })), Size: model.NewOptString("2K"), OutputFormat: model.NewOptOutputFormat(outputFormat), ResponseFormat: model.NewOptResponseFormat(model.ResponseFormatURL), Watermark: model.NewOptBool(true), } imagesResponse, err := client.GenerateImages(ctx, generateReq) if err != nil { fmt.Printf("generate images error: %v\n", err) return } fmt.Printf("%s\n", imagesResponse.Data[0].URL.Or("")) } ``` **选项:OpenAI** ```Python import os from openai import OpenAI client = OpenAI( # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv('ARK_API_KEY'), ) imagesResponse = client.images.generate( model="doubao-seedream-5-0-lite-260128", prompt="将图1的服装换为图2的服装", size="2K", output_format="png", response_format="url", extra_body = { "image": ["https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_imagesToimage_1.png", "https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_5_imagesToimage_2.png"], "watermark": True, } ) print(imagesResponse.data[0].url) ``` ## 组图输出(多图输出) > Seedream 5.0 pro / flash 不支持该能力。 支持通过一张或者多张图片和文字信息,生成漫画分镜、品牌视觉等一组内容关联的图片。 需指定参数 **sequential_image_generation** 为`auto`。 ### 文生组图 |提示词 |输出(实际会输出4张图片) | |---|---| |生成一组电影级科幻写实风的4张影视分镜: |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/e2f46207ee5e4c42b2cb988dced7cf82~tplv-goo7wpa0wc-image.image) | \ |场景1为宇航员在空间站维修飞船,空间站外部精密机械结构,深邃星空 + 银河背景,宇航员身穿细节完整的白色宇航服,手持专业维修工具,专注检修飞船外壳,中全景构图,侧逆光勾勒轮廓,冷色调科幻光影,空间站灯光点缀,失重环境,金属质感细腻,画面静谧严谨。 | | \ |场景2为:突然遇到陨石带袭击,广角史诗镜头,大量大小不一的陨石高速袭来,陨石表面纹理清晰,带燃烧尾焰,动态模糊体现速度感,陨石带压迫感拉满,飞船与空间站在画面一侧,太空黑暗深邃,光影强烈对比,紧张灾难氛围,画面冲击力十足。 | | \ |场景3为:宇航员紧急躲避,近景动态抓拍,宇航员失重状态下极速侧身躲避,肢体动作张力拉满,伸手抓握固定扶手,背景陨石飞掠而过,轻微镜头晃动增强临场感,宇航服褶皱、管线细节清晰,急促紧张,冷冽光影,主体突出不杂乱。 | | \ |场景4为:受伤后惊险逃回飞船,中近景叙事镜头,宇航员宇航服带轻微破损划痕,略显狼狈却坚毅,踉跄冲向开启的飞船舱门,舱内暖光与太空冷光形成对比,背景陨石逐渐远去,惊险逃生氛围,细节真实,情绪饱满。 | | **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/images/generations \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seedream-5-0-lite-260128", "prompt": "生成一组电影级科幻写实风的4张影视分镜:场景1为宇航员在空间站维修飞船,空间站外部精密机械结构,深邃星空 + 银河背景,宇航员身穿细节完整的白色宇航服,手持专业维修工具,专注检修飞船外壳,中全景构图,侧逆光勾勒轮廓,冷色调科幻光影,空间站灯光点缀,失重环境,金属质感细腻,画面静谧严谨。场景2为:突然遇到陨石带袭击,广角史诗镜头,大量大小不一的陨石高速袭来,陨石表面纹理清晰,带燃烧尾焰,动态模糊体现速度感,陨石带压迫感拉满,飞船与空间站在画面一侧,太空黑暗深邃,光影强烈对比,紧张灾难氛围,画面冲击力十足。场景3为:宇航员紧急躲避,近景动态抓拍,宇航员失重状态下极速侧身躲避,肢体动作张力拉满,伸手抓握固定扶手,背景陨石飞掠而过,轻微镜头晃动增强临场感,宇航服褶皱、管线细节清晰,急促紧张,冷冽光影,主体突出不杂乱。场景4为:受伤后惊险逃回飞船,中近景叙事镜头,宇航员宇航服带轻微破损划痕,略显狼狈却坚毅,踉跄冲向开启的飞船舱门,舱内暖光与太空冷光形成对比,背景陨石逐渐远去,惊险逃生氛围,细节真实,情绪饱满。", "size": "2K", "sequential_image_generation": "auto", "sequential_image_generation_options": { "max_images": 4 }, "stream": false, "output_format":"png", "response_format": "url", "watermark": true }' ``` * 您可按需替换 Model ID。Model ID 查询见 [模型列表](/docs/model-list)。 **选项:Python** ```Python import os # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark from arkruntime.types.images import SequentialImageGenerationOptionsParam client = Ark( # The base URL for model invocation . base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv('ARK_API_KEY'), ) imagesResponse = client.images.generate( # Replace with Model ID model="doubao-seedream-5-0-lite-260128", prompt="生成一组电影级科幻写实风的4张影视分镜:场景1为宇航员在空间站维修飞船,空间站外部精密机械结构,深邃星空 + 银河背景,宇航员身穿细节完整的白色宇航服,手持专业维修工具,专注检修飞船外壳,中全景构图,侧逆光勾勒轮廓,冷色调科幻光影,空间站灯光点缀,失重环境,金属质感细腻,画面静谧严谨。场景2为:突然遇到陨石带袭击,广角史诗镜头,大量大小不一的陨石高速袭来,陨石表面纹理清晰,带燃烧尾焰,动态模糊体现速度感,陨石带压迫感拉满,飞船与空间站在画面一侧,太空黑暗深邃,光影强烈对比,紧张灾难氛围,画面冲击力十足。场景3为:宇航员紧急躲避,近景动态抓拍,宇航员失重状态下极速侧身躲避,肢体动作张力拉满,伸手抓握固定扶手,背景陨石飞掠而过,轻微镜头晃动增强临场感,宇航服褶皱、管线细节清晰,急促紧张,冷冽光影,主体突出不杂乱。场景4为:受伤后惊险逃回飞船,中近景叙事镜头,宇航员宇航服带轻微破损划痕,略显狼狈却坚毅,踉跄冲向开启的飞船舱门,舱内暖光与太空冷光形成对比,背景陨石逐渐远去,惊险逃生氛围,细节真实,情绪饱满。", size="2K", sequential_image_generation="auto", sequential_image_generation_options=SequentialImageGenerationOptionsParam(max_images=4), output_format="png", response_format="url", watermark=True ) # Iterate through all image data for image in imagesResponse.data: # Output the current image's URL and size print(f"URL: {image.url}, Size: {image.size}") ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.images.*; import com.volcengine.ark.runtime.service.ArkService; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; import java.util.Arrays; import java.util.List; import java.util.concurrent.TimeUnit; public class ImageGenerationsExample { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); Dispatcher dispatcher = new Dispatcher(); ArkService service = ArkService.builder() .baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .build(); SequentialImageGenerationOptions sequentialImageGenerationOptions = new SequentialImageGenerationOptions(); sequentialImageGenerationOptions.setMaxImages(4); CreateImageGenerationRequest generateRequest = CreateImageGenerationRequest.builder() .model("doubao-seedream-5-0-lite-260128") // Replace with Model ID .prompt("生成一组电影级科幻写实风的4张影视分镜:场景1为宇航员在空间站维修飞船,空间站外部精密机械结构,深邃星空 + 银河背景,宇航员身穿细节完整的白色宇航服,手持专业维修工具,专注检修飞船外壳,中全景构图,侧逆光勾勒轮廓,冷色调科幻光影,空间站灯光点缀,失重环境,金属质感细腻,画面静谧严谨。场景2为:突然遇到陨石带袭击,广角史诗镜头,大量大小不一的陨石高速袭来,陨石表面纹理清晰,带燃烧尾焰,动态模糊体现速度感,陨石带压迫感拉满,飞船与空间站在画面一侧,太空黑暗深邃,光影强烈对比,紧张灾难氛围,画面冲击力十足。场景3为:宇航员紧急躲避,近景动态抓拍,宇航员失重状态下极速侧身躲避,肢体动作张力拉满,伸手抓握固定扶手,背景陨石飞掠而过,轻微镜头晃动增强临场感,宇航服褶皱、管线细节清晰,急促紧张,冷冽光影,主体突出不杂乱。场景4为:受伤后惊险逃回飞船,中近景叙事镜头,宇航员宇航服带轻微破损划痕,略显狼狈却坚毅,踉跄冲向开启的飞船舱门,舱内暖光与太空冷光形成对比,背景陨石逐渐远去,惊险逃生氛围,细节真实,情绪饱满。") .size("2K") .sequentialImageGeneration(SequentialImageGenerationMode.AUTO) .sequentialImageGenerationOptions(sequentialImageGenerationOptions) .outputFormat(OutputFormat.PNG) .responseFormat(ResponseFormat.URL) .stream(false) .watermark(true) .build(); ImageGenerationResponse imagesResponse = service.generateImages(generateRequest); // Iterate through all image data if (imagesResponse != null && imagesResponse.getData() != null) { for (int i = 0; i < imagesResponse.getData().size(); i++) { // Retrieve image information String url = imagesResponse.getData().get(i).getUrl(); String size = imagesResponse.getData().get(i).getSize(); System.out.printf("Image %d:%n", i + 1); System.out.printf(" URL: %s%n", url); System.out.printf(" Size: %s%n", size); System.out.println(); } service.shutdownExecutor(); } } } ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" model "github.com/volcengine/ark-runtime-go/arkruntime/model/images" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), // The base URL for model invocation arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() outputFormat := model.OutputFormatPNG var sequentialImageGeneration model.SequentialImageGenerationMode = "auto" maxImages := 4 generateReq := &model.CreateImageGenerationRequest{ Model: "doubao-seedream-5-0-lite-260128", Prompt: model.NewOptString("生成一组电影级科幻写实风的4张影视分镜:场景1为宇航员在空间站维修飞船,空间站外部精密机械结构,深邃星空 + 银河背景,宇航员身穿细节完整的白色宇航服,手持专业维修工具,专注检修飞船外壳,中全景构图,侧逆光勾勒轮廓,冷色调科幻光影,空间站灯光点缀,失重环境,金属质感细腻,画面静谧严谨。场景2为:突然遇到陨石带袭击,广角史诗镜头,大量大小不一的陨石高速袭来,陨石表面纹理清晰,带燃烧尾焰,动态模糊体现速度感,陨石带压迫感拉满,飞船与空间站在画面一侧,太空黑暗深邃,光影强烈对比,紧张灾难氛围,画面冲击力十足。场景3为:宇航员紧急躲避,近景动态抓拍,宇航员失重状态下极速侧身躲避,肢体动作张力拉满,伸手抓握固定扶手,背景陨石飞掠而过,轻微镜头晃动增强临场感,宇航服褶皱、管线细节清晰,急促紧张,冷冽光影,主体突出不杂乱。场景4为:受伤后惊险逃回飞船,中近景叙事镜头,宇航员宇航服带轻微破损划痕,略显狼狈却坚毅,踉跄冲向开启的飞船舱门,舱内暖光与太空冷光形成对比,背景陨石逐渐远去,惊险逃生氛围,细节真实,情绪饱满。"), Size: model.NewOptString("2K"), OutputFormat: model.NewOptOutputFormat(outputFormat), ResponseFormat: model.NewOptResponseFormat(model.ResponseFormatURL), Watermark: model.NewOptBool(true), SequentialImageGeneration: model.NewOptSequentialImageGenerationMode(sequentialImageGeneration), SequentialImageGenerationOptions: model.NewOptSequentialImageGenerationOptions(model.SequentialImageGenerationOptions{ MaxImages: model.NewOptInt32(int32(maxImages)), }), } resp, err := client.GenerateImages(ctx, generateReq) if err != nil { fmt.Printf("call GenerateImages error: %v\n", err) return } if resp.Error.IsSet() { fmt.Printf("API returned error: %s - %s\n", resp.Error.Value.Code, resp.Error.Value.Message) return } // Output the generated image information fmt.Printf("Generated %d images:\n", len(resp.Data)) for i, image := range resp.Data { var url string if image.URL.IsSet() { url = image.URL.Or("") } else { url = "N/A" } fmt.Printf("Image %d: Size: %s, URL: %s\n", i+1, image.Size.Or(""), url) } } ``` **选项:OpenAI** ```Python import os from openai import OpenAI client = OpenAI( # The base URL for model invocation . base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv('ARK_API_KEY'), ) imagesResponse = client.images.generate( model="doubao-seedream-5-0-lite-260128", prompt="生成一组电影级科幻写实风的4张影视分镜:场景1为宇航员在空间站维修飞船,空间站外部精密机械结构,深邃星空 + 银河背景,宇航员身穿细节完整的白色宇航服,手持专业维修工具,专注检修飞船外壳,中全景构图,侧逆光勾勒轮廓,冷色调科幻光影,空间站灯光点缀,失重环境,金属质感细腻,画面静谧严谨。场景2为:突然遇到陨石带袭击,广角史诗镜头,大量大小不一的陨石高速袭来,陨石表面纹理清晰,带燃烧尾焰,动态模糊体现速度感,陨石带压迫感拉满,飞船与空间站在画面一侧,太空黑暗深邃,光影强烈对比,紧张灾难氛围,画面冲击力十足。场景3为:宇航员紧急躲避,近景动态抓拍,宇航员失重状态下极速侧身躲避,肢体动作张力拉满,伸手抓握固定扶手,背景陨石飞掠而过,轻微镜头晃动增强临场感,宇航服褶皱、管线细节清晰,急促紧张,冷冽光影,主体突出不杂乱。场景4为:受伤后惊险逃回飞船,中近景叙事镜头,宇航员宇航服带轻微破损划痕,略显狼狈却坚毅,踉跄冲向开启的飞船舱门,舱内暖光与太空冷光形成对比,背景陨石逐渐远去,惊险逃生氛围,细节真实,情绪饱满。", size="2K", output_format="png", response_format="url", extra_body={ "watermark": True, "sequential_image_generation": "auto", "sequential_image_generation_options": { "max_images": 4 }, }, ) # Iterate through all image data for image in imagesResponse.data: # Output the current image's URL and size print(f"URL: {image.url}, Size: {image.size}") ``` ### 单张图生组图 |提示词 |输入图 |输出(实际会输出4张图片) | |---|---|---| |参考这个LOGO,做一套户外运动品牌视觉设计,品牌名称为“GREEN”,包括包装袋、帽子、卡片、挂绳等。绿色视觉主色调,趣味、简约现代风格。 |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/c724450228a94a909580c0400fbf503b~tplv-goo7wpa0wc-image.image) |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/acf7079c229a4029b4e25bc9c9697992~tplv-goo7wpa0wc-image.image) | **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/images/generations \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seedream-5-0-lite-260128", "prompt": "参考这个LOGO,做一套户外运动品牌视觉设计,品牌名称为“GREEN”,包括包装袋、帽子、卡片、挂绳等。绿色视觉主色调,趣味、简约现代风格", "image": "https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_imageToimages.png", "size": "2K", "sequential_image_generation": "auto", "sequential_image_generation_options": { "max_images": 4 }, "stream": false, "output_format":"png", "response_format": "url", "watermark": true }' ``` * 您可按需替换 Model ID。Model ID 查询见 [模型列表](/docs/model-list)。 **选项:Python** ```Python import os # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark from arkruntime.types.images import SequentialImageGenerationOptionsParam client = Ark( # The base URL for model invocation . base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv('ARK_API_KEY'), ) imagesResponse = client.images.generate( # Replace with Model ID . model="doubao-seedream-5-0-lite-260128", prompt="参考这个LOGO,做一套户外运动品牌视觉设计,品牌名称为“GREEN”,包括包装袋、帽子、卡片、挂绳等。绿色视觉主色调,趣味、简约现代风格", image="https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_imageToimages.png", size="2K", sequential_image_generation="auto", sequential_image_generation_options=SequentialImageGenerationOptionsParam(max_images=4), output_format="png", response_format="url", watermark=True ) # Iterate through all image data for image in imagesResponse.data: # Output the current image's URL and size print(f"URL: {image.url}, Size: {image.size}") ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.images.*; import com.volcengine.ark.runtime.service.ArkService; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; import java.util.Arrays; import java.util.List; import java.util.concurrent.TimeUnit; public class ImageGenerationsExample { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); Dispatcher dispatcher = new Dispatcher(); ArkService service = ArkService.builder() .baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .build(); SequentialImageGenerationOptions sequentialImageGenerationOptions = new SequentialImageGenerationOptions(); sequentialImageGenerationOptions.setMaxImages(4); // CreateImageGenerationRequestImage requires ark-runtime 0.6.0 or later. CreateImageGenerationRequest generateRequest = CreateImageGenerationRequest.builder() .model("doubao-seedream-5-0-lite-260128") // Replace with Model ID .prompt("参考这个LOGO,做一套户外运动品牌视觉设计,品牌名称为“GREEN”,包括包装袋、帽子、卡片、挂绳等。绿色视觉主色调,趣味、简约现代风格") .image(CreateImageGenerationRequestImage.ofString("https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_imageToimages.png")) .size("2K") .sequentialImageGeneration(SequentialImageGenerationMode.AUTO) .sequentialImageGenerationOptions(sequentialImageGenerationOptions) .outputFormat(OutputFormat.PNG) .responseFormat(ResponseFormat.URL) .stream(false) .watermark(true) .build(); ImageGenerationResponse imagesResponse = service.generateImages(generateRequest); // Iterate through all image data if (imagesResponse != null && imagesResponse.getData() != null) { for (int i = 0; i < imagesResponse.getData().size(); i++) { // Retrieve image information String url = imagesResponse.getData().get(i).getUrl(); String size = imagesResponse.getData().get(i).getSize(); System.out.printf("Image %d:%n", i + 1); System.out.printf(" URL: %s%n", url); System.out.printf(" Size: %s%n", size); System.out.println(); } service.shutdownExecutor(); } } } ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" model "github.com/volcengine/ark-runtime-go/arkruntime/model/images" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), // The base URL for model invocation arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() outputFormat := model.OutputFormatPNG var sequentialImageGeneration model.SequentialImageGenerationMode = "auto" maxImages := 4 generateReq := &model.CreateImageGenerationRequest{ Model: "doubao-seedream-5-0-lite-260128", Prompt: model.NewOptString("参考这个LOGO,做一套户外运动品牌视觉设计,品牌名称为“GREEN”,包括包装袋、帽子、卡片、挂绳等。绿色视觉主色调,趣味、简约现代风格"), Image: model.NewOptCreateImageGenerationRequestImage(model.NewStringArrayCreateImageGenerationRequestImage([]string{"https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_imageToimages.png"})), Size: model.NewOptString("2K"), OutputFormat: model.NewOptOutputFormat(outputFormat), ResponseFormat: model.NewOptResponseFormat(model.ResponseFormatURL), Watermark: model.NewOptBool(true), SequentialImageGeneration: model.NewOptSequentialImageGenerationMode(sequentialImageGeneration), SequentialImageGenerationOptions: model.NewOptSequentialImageGenerationOptions(model.SequentialImageGenerationOptions{ MaxImages: model.NewOptInt32(int32(maxImages)), }), } resp, err := client.GenerateImages(ctx, generateReq) if err != nil { fmt.Printf("call GenerateImages error: %v\n", err) return } if resp.Error.IsSet() { fmt.Printf("API returned error: %s - %s\n", resp.Error.Value.Code, resp.Error.Value.Message) return } // Output the generated image information fmt.Printf("Generated %d images:\n", len(resp.Data)) for i, image := range resp.Data { var url string if image.URL.IsSet() { url = image.URL.Or("") } else { url = "N/A" } fmt.Printf("Image %d: Size: %s, URL: %s\n", i+1, image.Size.Or(""), url) } } ``` * 您可按需替换 Model ID。Model ID 查询见 [模型列表](/docs/model-list)。 **选项:OpenAI** ```Python import os from openai import OpenAI client = OpenAI( # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv('ARK_API_KEY'), ) imagesResponse = client.images.generate( model="doubao-seedream-5-0-lite-260128", prompt="参考这个LOGO,做一套户外运动品牌视觉设计,品牌名称为“GREEN”,包括包装袋、帽子、卡片、挂绳等。绿色视觉主色调,趣味、简约现代风格", size="2K", output_format="png", response_format="url", extra_body={ "image": "https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_imageToimages.png", "watermark": True, "sequential_image_generation": "auto", "sequential_image_generation_options": { "max_images": 4 }, } ) # Iterate through all image data for image in imagesResponse.data: # Output the current image's URL and size print(f"URL: {image.url}, Size: {image.size}") ``` ### 多参考图生组图 |提示词 |输入图1 |输入图2 |输出(实际会输出3张图片) | |---|---|---|---| |生成3张女孩和奶牛玩偶在游乐园开心地坐过山车的图片,涵盖早晨、中午、晚上 |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/77024d8e03f24862b066bfc385301120~tplv-goo7wpa0wc-image.image) |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/2cbc5cf5a68d44899fc52f177fb9cf51~tplv-goo7wpa0wc-image.image) |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/d5f8ffecd482410b8624689889f714cb~tplv-goo7wpa0wc-image.image) | **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/images/generations \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seedream-5-0-lite-260128", "prompt": "生成3张女孩和奶牛玩偶在游乐园开心地坐过山车的图片,涵盖早晨、中午、晚上", "image": ["https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_imagesToimages_1.png", "https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_imagesToimages_2.png"], "sequential_image_generation": "auto", "sequential_image_generation_options": { "max_images": 3 }, "size": "2K", "output_format":"png", "watermark": true }' ``` * 您可按需替换 Model ID。Model ID 查询见 [模型列表](/docs/model-list)。 **选项:Python** ```Python import os # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark from arkruntime.types.images import SequentialImageGenerationOptionsParam client = Ark( # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv('ARK_API_KEY'), ) imagesResponse = client.images.generate( # Replace with Model ID model="doubao-seedream-5-0-lite-260128", prompt="生成3张女孩和奶牛玩偶在游乐园开心地坐过山车的图片,涵盖早晨、中午、晚上", image=["https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_imagesToimages_1.png", "https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_imagesToimages_2.png"], size="2K", sequential_image_generation="auto", sequential_image_generation_options=SequentialImageGenerationOptionsParam(max_images=3), output_format="png", response_format="url", watermark=True ) # Iterate through all image data for image in imagesResponse.data: # Output the current image's URL and size print(f"URL: {image.url}, Size: {image.size}") ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.images.*; import com.volcengine.ark.runtime.service.ArkService; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; import java.util.Arrays; import java.util.List; import java.util.concurrent.TimeUnit; public class ImageGenerationsExample { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); Dispatcher dispatcher = new Dispatcher(); ArkService service = ArkService.builder() .baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .build(); SequentialImageGenerationOptions sequentialImageGenerationOptions = new SequentialImageGenerationOptions(); sequentialImageGenerationOptions.setMaxImages(3); // CreateImageGenerationRequestImage requires ark-runtime 0.6.0 or later. CreateImageGenerationRequest generateRequest = CreateImageGenerationRequest.builder() .model("doubao-seedream-5-0-lite-260128") // Replace with Model ID .prompt("生成3张女孩和奶牛玩偶在游乐园开心地坐过山车的图片,涵盖早晨、中午、晚上") .image(CreateImageGenerationRequestImage.ofList(Arrays.asList( "https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_imagesToimages_1.png", "https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_imagesToimages_2.png" ))) .outputFormat(OutputFormat.PNG) .size("2K") .sequentialImageGeneration(SequentialImageGenerationMode.AUTO) .sequentialImageGenerationOptions(sequentialImageGenerationOptions) .responseFormat(ResponseFormat.URL) .stream(false) .watermark(true) .build(); ImageGenerationResponse imagesResponse = service.generateImages(generateRequest); // Iterate through all image data if (imagesResponse != null && imagesResponse.getData() != null) { for (int i = 0; i < imagesResponse.getData().size(); i++) { // Retrieve image information String url = imagesResponse.getData().get(i).getUrl(); String size = imagesResponse.getData().get(i).getSize(); System.out.printf("Image %d:%n", i + 1); System.out.printf(" URL: %s%n", url); System.out.printf(" Size: %s%n", size); System.out.println(); } service.shutdownExecutor(); } } } ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" model "github.com/volcengine/ark-runtime-go/arkruntime/model/images" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), // The base URL for model invocation arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() outputFormat := model.OutputFormatPNG var sequentialImageGeneration model.SequentialImageGenerationMode = "auto" maxImages := 3 generateReq := &model.CreateImageGenerationRequest{ Model: "doubao-seedream-5-0-lite-260128", Prompt: model.NewOptString("生成3张女孩和奶牛玩偶在游乐园开心地坐过山车的图片,涵盖早晨、中午、晚上"), Image: model.NewOptCreateImageGenerationRequestImage(model.NewStringArrayCreateImageGenerationRequestImage([]string{ "https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_imagesToimages_1.png", "https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_imagesToimages_2.png", })), Size: model.NewOptString("2K"), OutputFormat: model.NewOptOutputFormat(outputFormat), ResponseFormat: model.NewOptResponseFormat(model.ResponseFormatURL), Watermark: model.NewOptBool(true), SequentialImageGeneration: model.NewOptSequentialImageGenerationMode(sequentialImageGeneration), SequentialImageGenerationOptions: model.NewOptSequentialImageGenerationOptions(model.SequentialImageGenerationOptions{ MaxImages: model.NewOptInt32(int32(maxImages)), }), } resp, err := client.GenerateImages(ctx, generateReq) if err != nil { fmt.Printf("call GenerateImages error: %v\n", err) return } if resp.Error.IsSet() { fmt.Printf("API returned error: %s - %s\n", resp.Error.Value.Code, resp.Error.Value.Message) return } // Output the generated image information fmt.Printf("Generated %d images:\n", len(resp.Data)) for i, image := range resp.Data { var url string if image.URL.IsSet() { url = image.URL.Or("") } else { url = "N/A" } fmt.Printf("Image %d: Size: %s, URL: %s\n", i+1, image.Size.Or(""), url) } } ``` **选项:OpenAI** ```Python import os from openai import OpenAI client = OpenAI( # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv('ARK_API_KEY'), ) imagesResponse = client.images.generate( model="doubao-seedream-5-0-lite-260128", prompt="生成3张女孩和奶牛玩偶在游乐园开心地坐过山车的图片,涵盖早晨、中午、晚上", size="2K", output_format="png", response_format="url", extra_body={ "image": ["https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_imagesToimages_1.png", "https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_imagesToimages_2.png"], "watermark": True, "sequential_image_generation": "auto", "sequential_image_generation_options": { "max_images": 3 }, } ) # Iterate through all image data for image in imagesResponse.data: # Output the current image's URL and size print(f"URL: {image.url}, Size: {image.size}") ``` ## **提示词建议** * 建议用**简洁连贯**的自然语言写明 **主体 + 行为 + 环境**,若对画面美学有要求,可用自然语言或短语补充 **风格**、**色彩**、**光影**、**构图** 等美学元素。详情可参见 [Seedream 4.0-5.0 提示词指南](/docs/seedream-4-0-5-0-prompt-guide)。 * 文本提示词(prompt)建议不超过300个汉字或600个英文单词。字数过多信息容易分散,模型可能因此忽略细节,只关注重点,造成图片缺失部分元素。 # 进阶使用 ## 联网搜索 > Seedream 5.0 pro / flash 不支持该能力。 Seedream 5.0 lite 支持调用联网搜索工具,通过配置 tools.**type** 参数为 `web_search` 即可开启联网搜索。 * 开启联网搜索后,模型会根据用户的提示词自主判断是否搜索互联网内容(如商品、天气等),提升生成图片的时效性,但也会增加一定的时延。 * 实际搜索次数可通过字段 usage.tool_usage.**web_search** 查询,如果为 **0** 表示未搜索。 |提示词 |输出 | |---|---| |制作一张上海未来5日的天气预报图,采用现代扁平化插画风格,清晰展示每日天气、温度和穿搭建议。 整体为横向排版,标题为“上海未来5日天气预报”,包含5个等宽的垂直卡片,从左到右依次排列。 整体风格为现代、干净、友好的扁平化矢量插画风格,线条清晰,色彩柔和。人物形象采用年轻男女的卡通插画,表情自然,姿态放松,服装细节清晰。 |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/56e0e5cc24ff40559c9e934e5d744393~tplv-goo7wpa0wc-image.image) | **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/images/generations \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seedream-5-0-lite-260128", "prompt": "制作一张上海未来5日的天气预报图,采用现代扁平化插画风格,清晰展示每日天气、温度和穿搭建议。整体为横向排版,标题为“上海未来5日天气预报”,包含5个等宽的垂直卡片,从左到右依次排列。 整体风格为现代、干净、友好的扁平化矢量插画风格,线条清晰,色彩柔和。人物形象采用年轻男女的卡通插画,表情自然,姿态放松,服装细节清晰。", "size": "2048x2048", "tools": [ { "type": "web_search" } ], "output_format":"png", "response_format": "url", "watermark": true }' ``` * 您可按需替换 Model ID。Model ID 查询见 [模型列表](/docs/model-list)。 **选项:Python** ```Python import os # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark from arkruntime.types.images import ToolParam client = Ark( # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv('ARK_API_KEY'), ) imagesResponse = client.images.generate( # Replace with Model ID model="doubao-seedream-5-0-lite-260128", prompt="制作一张上海未来5日的天气预报图,采用现代扁平化插画风格,清晰展示每日天气、温度和穿搭建议。 整体为横向排版,标题为“上海未来5日天气预报”,包含5个等宽的垂直卡片,从左到右依次排列。 整体风格为现代、干净、友好的扁平化矢量插画风格,线条清晰,色彩柔和。人物形象采用年轻男女的卡通插画,表情自然,姿态放松,服装细节清晰。", size="2048x2048", output_format="png", response_format="url", tools=[ToolParam(type="web_search")], watermark=True, ) print(imagesResponse.data[0].url) ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.images.*; import com.volcengine.ark.runtime.service.ArkService; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; import java.util.Arrays; import java.util.List; import java.util.concurrent.TimeUnit; public class ImageGenerationsExample { public static void main(String[] args) { // Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey String apiKey = System.getenv("ARK_API_KEY"); ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); Dispatcher dispatcher = new Dispatcher(); ArkService service = ArkService.builder() .baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .build(); // Create ContentGenerationTool Tool contentGenerationTool = new Tool(); contentGenerationTool.setType(ToolType.WEB_SEARCH); // Create list of tools List tools = Arrays.asList(contentGenerationTool); CreateImageGenerationRequest generateRequest = CreateImageGenerationRequest.builder() .model("doubao-seedream-5-0-lite-260128") // Replace with Model ID .prompt("制作一张上海未来5日的天气预报图,采用现代扁平化插画风格,清晰展示每日天气、温度和穿搭建议。 整体为横向排版,标题为“上海未来5日天气预报”,包含5个等宽的垂直卡片,从左到右依次排列。 整体风格为现代、干净、友好的扁平化矢量插画风格,线条清晰,色彩柔和。人物形象采用年轻男女的卡通插画,表情自然,姿态放松,服装细节清晰。") .size("2048x2048") .outputFormat(OutputFormat.PNG) .responseFormat(ResponseFormat.URL) .watermark(true) .tools(tools) .build(); ImageGenerationResponse imagesResponse = service.generateImages(generateRequest); System.out.println(imagesResponse.getData().get(0).getUrl()); service.shutdownExecutor(); } } ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" model "github.com/volcengine/ark-runtime-go/arkruntime/model/images" ) func main() { client := arkruntime.NewClientWithApiKey( // Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey os.Getenv("ARK_API_KEY"), // The base URL for model invocation arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() outputFormat := model.OutputFormatPNG generateReq := &model.CreateImageGenerationRequest{ Model: "doubao-seedream-5-0-lite-260128", // Replace with Model ID Prompt: model.NewOptString("制作一张上海未来5日的天气预报图,采用现代扁平化插画风格,清晰展示每日天气、温度和穿搭建议。 整体为横向排版,标题为“上海未来5日天气预报”,包含5个等宽的垂直卡片,从左到右依次排列。 整体风格为现代、干净、友好的扁平化矢量插画风格,线条清晰,色彩柔和。人物形象采用年轻男女的卡通插画,表情自然,姿态放松,服装细节清晰。"), Size: model.NewOptString("2048x2048"), OutputFormat: model.NewOptOutputFormat(outputFormat), ResponseFormat: model.NewOptResponseFormat(model.ResponseFormatURL), Watermark: model.NewOptBool(true), Tools: []model.Tool{ { Type: model.ToolTypeWebSearch, }, }, } imagesResponse, err := client.GenerateImages(ctx, generateReq) if err != nil { fmt.Printf("generate images error: %v\n", err) return } fmt.Printf("%s\n", imagesResponse.Data[0].URL.Or("")) } ``` ## 流式输出 > Seedream 5.0 pro / flash 不支持该能力。 模型支持流式图像生成,当生成完任一图片后即返回结果,让您能更快浏览到生成的图像,改善等待体验。 通过配置 **stream** 参数为`true`,即可开启流式输出模式。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/643230864ffc43a8a37ef775cd51ac30~tplv-goo7wpa0wc-image.image) **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/images/generations \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seedream-5-0-lite-260128", "prompt": "参考图1,生成四图片,图中人物分别带着墨镜,骑着摩托,带着帽子,拿着棒棒糖", "image": "https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_imageToimages_1.png", "sequential_image_generation": "auto", "sequential_image_generation_options": { "max_images": 4 }, "size": "2K", "stream": true, "output_format":"png", "watermark": true }' ``` * 您可按需替换 Model ID。Model ID 查询见 [模型列表](/docs/model-list)。 **选项:Python** ```Python import os # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark from arkruntime.types.images import SequentialImageGenerationOptionsParam client = Ark( # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv('ARK_API_KEY'), ) if __name__ == "__main__": stream = client.images.generate( # Replace with Model ID model="doubao-seedream-5-0-lite-260128", prompt="参考图1,生成四图片,图中人物分别带着墨镜,骑着摩托,带着帽子,拿着棒棒糖", image="https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_imageToimages_1.png", size="2K", sequential_image_generation="auto", sequential_image_generation_options=SequentialImageGenerationOptionsParam(max_images=4), output_format="png", response_format="url", stream=True, watermark=True ) for event in stream: if event is None: continue if event.type == "image_generation.partial_failed": print(f"Stream generate images error: {event.error}") if event.error is not None and event.error.code.equal("InternalServiceError"): break elif event.type == "image_generation.partial_succeeded": if event.error is None and event.url: print(f"recv.Size: {event.size}, recv.Url: {event.url}") elif event.type == "image_generation.completed": if event.error is None: print("Final completed event:") print("recv.Usage:", event.usage) elif event.type == "image_generation.partial_image": print(f"Partial image index={event.partial_image_index}, size={len(event.b64_json)}") ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.images.*; import com.volcengine.ark.runtime.service.ArkService; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; import java.util.Arrays; import java.util.List; import java.util.concurrent.TimeUnit; public class ImageGenerationsExample { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); Dispatcher dispatcher = new Dispatcher(); ArkService service = ArkService.builder() .baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .build(); SequentialImageGenerationOptions sequentialImageGenerationOptions = new SequentialImageGenerationOptions(); sequentialImageGenerationOptions.setMaxImages(4); // CreateImageGenerationRequestImage requires ark-runtime 0.6.0 or later. CreateImageGenerationRequest generateRequest = CreateImageGenerationRequest.builder() .model("doubao-seedream-5-0-lite-260128") //Replace with Model ID . .prompt("参考图1,生成四图片,图中人物分别带着墨镜,骑着摩托,带着帽子,拿着棒棒糖") .image(CreateImageGenerationRequestImage.ofString("https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_imageToimages_1.png")) .size("2K") .sequentialImageGeneration(SequentialImageGenerationMode.AUTO) .sequentialImageGenerationOptions(sequentialImageGenerationOptions) .outputFormat(OutputFormat.PNG) .responseFormat(ResponseFormat.URL) .stream(true) .watermark(true) .build(); service.streamGenerateImages(generateRequest) .doOnError(Throwable::printStackTrace) .blockingForEach( choice -> { if (choice == null) return; if (ImageGenerationStreamEventType.IMAGE_GENERATION_PARTIAL_FAILED.equals(choice.getType())) { if (choice.getError() != null) { System.err.println("Stream generate images error: " + choice.getError()); if (choice.getError().getCode() != null && choice.getError().getCode().equals("InternalServiceError")) { throw new RuntimeException("Server error, terminating stream."); } } } else if (ImageGenerationStreamEventType.IMAGE_GENERATION_PARTIAL_SUCCEEDED.equals(choice.getType())) { if (choice.getError() == null && choice.getUrl() != null && !choice.getUrl().isEmpty()) { System.out.printf("recv.Size: %s, recv.Url: %s%n", choice.getSize(), choice.getUrl()); } } else if (ImageGenerationStreamEventType.IMAGE_GENERATION_COMPLETED.equals(choice.getType())) { if (choice.getError() == null && choice.getUsage() != null) { System.out.println("recv.Usage: " + choice.getUsage().toString()); } } } ); service.shutdownExecutor(); } } ``` **选项:Go** ```Go package main import ( "context" "fmt" "io" "os" "strings" "github.com/volcengine/ark-runtime-go/arkruntime" model "github.com/volcengine/ark-runtime-go/arkruntime/model/images" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), // The base URL for model invocation arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() outputFormat := model.OutputFormatPNG var sequentialImageGeneration model.SequentialImageGenerationMode = "auto" maxImages := 4 generateReq := &model.CreateImageGenerationRequest{ Model: "doubao-seedream-5-0-lite-260128", Prompt: model.NewOptString("参考图1,生成四图片,图中人物分别带着墨镜,骑着摩托,带着帽子,拿着棒棒糖"), Image: model.NewOptCreateImageGenerationRequestImage(model.NewStringArrayCreateImageGenerationRequestImage([]string{"https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_imageToimages_1.png"})), Size: model.NewOptString("2K"), OutputFormat: model.NewOptOutputFormat(outputFormat), ResponseFormat: model.NewOptResponseFormat(model.ResponseFormatURL), Watermark: model.NewOptBool(true), SequentialImageGeneration: model.NewOptSequentialImageGenerationMode(sequentialImageGeneration), SequentialImageGenerationOptions: model.NewOptSequentialImageGenerationOptions(model.SequentialImageGenerationOptions{ MaxImages: model.NewOptInt32(int32(maxImages)), }), } stream, err := client.GenerateImagesStreaming(ctx, generateReq) if err != nil { fmt.Printf("call GenerateImagesStreaming error: %v\n", err) return } defer stream.Close() for { recv, err := stream.Recv() if err == io.EOF { break } if err != nil { fmt.Printf("Stream generate images error: %v\n", err) break } if recv.Type == model.ImageGenerationStreamEventTypeImageGenerationPartialFailed { fmt.Printf("Stream generate images error: %v\n", recv.Error) if strings.EqualFold(recv.Error.Value.Code, "InternalServiceError") { break } } if recv.Type == model.ImageGenerationStreamEventTypeImageGenerationPartialSucceeded { if !recv.Error.IsSet() && recv.URL.IsSet() { fmt.Printf("recv.Size: %s, recv.Url: %s\n", recv.Size.Or(""), recv.URL.Or("")) } } if recv.Type == model.ImageGenerationStreamEventTypeImageGenerationCompleted { if !recv.Error.IsSet() { fmt.Printf("recv.Usage: %v\n", recv.Usage.Or(model.Usage{})) } } } } ``` **选项:OpenAI** ```Python import os from openai import OpenAI client = OpenAI( # The base URL for model invocation . base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv('ARK_API_KEY'), ) if __name__ == "__main__": stream = client.images.generate( model="doubao-seedream-5-0-lite-260128", prompt="参考图1,生成四图片,图中人物分别带着墨镜,骑着摩托,带着帽子,拿着棒棒糖", size="2K", output_format="png", response_format="b64_json", stream=True, extra_body={ "image": "https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_imageToimages_1.png", "watermark": True, "sequential_image_generation": "auto", "sequential_image_generation_options": { "max_images": 4 }, }, ) for event in stream: if event is None: continue elif event.type == "image_generation.partial_succeeded": if event.b64_json is not None: print(f"size={len(event.b64_json)}, base_64={event.b64_json}") elif event.type == "image_generation.completed": if event.usage is not None: print("Final completed event:") print("recv.Usage:", event.usage) ``` ## 提升图片生成速度配置 通过设置 **optimize_prompt_options.mode** 参数,您可以在 `standard` 模式和 `fast` 模式之间进行选择,以根据自身对图片质量和生成速度的不同需求来优化提示词。 * 为平衡生成速度与图像质量,Seedream 5.0 pro、Seedream 4.0 支持将 **optimize_prompt_options.mode** 设置为 `fast` 模式以显著提升生成速度,但会在一定程度上牺牲图片质量。 * Seedream 5.0 flash / lite、Seedream 4.5 仅支持 `standard` 模式。 **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/images/generations \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seedream-4-0-250828", "prompt": "生成一组共4张连贯插画,核心为同一庭院一角的四季变迁,以统一风格展现四季独特色彩、元素与氛围", "size": "2K", "sequential_image_generation": "auto", "sequential_image_generation_options": { "max_images": 4 }, "optimize_prompt_options": { "mode": "fast" }, "stream": false, "output_format":"png", "response_format": "url", "watermark": true }' ``` * 您可按需替换 Model ID。Model ID 查询见 [模型列表](/docs/model-list)。 **选项:Python** ```Python import os # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark from arkruntime.types.images import SequentialImageGenerationOptionsParam from arkruntime.types.images import OptimizePromptOptionsParam client = Ark( # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv('ARK_API_KEY'), ) imagesResponse = client.images.generate( # Replace with Model ID model="doubao-seedream-4-0-250828", prompt="生成一组共4张连贯插画,核心为同一庭院一角的四季变迁,以统一风格展现四季独特色彩、元素与氛围", size="2K", sequential_image_generation="auto", sequential_image_generation_options=SequentialImageGenerationOptionsParam(max_images=4), optimize_prompt_options=OptimizePromptOptionsParam(mode="fast"), output_format="png", response_format="url", watermark=True ) # Iterate through all image data for image in imagesResponse.data: # Output the current image's URL and size print(f"URL: {image.url}, Size: {image.size}") ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.images.*; import com.volcengine.ark.runtime.service.ArkService; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; import java.util.Arrays; import java.util.List; import java.util.concurrent.TimeUnit; public class ImageGenerationsExample { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); Dispatcher dispatcher = new Dispatcher(); ArkService service = ArkService.builder() .baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .build(); SequentialImageGenerationOptions sequentialImageGenerationOptions = new SequentialImageGenerationOptions(); sequentialImageGenerationOptions.setMaxImages(4); OptimizePromptOptions optimizePromptOptions = new OptimizePromptOptions(); optimizePromptOptions.setMode(OptimizePromptMode.FAST); CreateImageGenerationRequest generateRequest = CreateImageGenerationRequest.builder() .model("doubao-seedream-4-0-250828") //Replace with Model ID .prompt("生成一组共4张连贯插画,核心为同一庭院一角的四季变迁,以统一风格展现四季独特色彩、元素与氛围") .size("2K") .sequentialImageGeneration(SequentialImageGenerationMode.AUTO) .sequentialImageGenerationOptions(sequentialImageGenerationOptions) .optimizePromptOptions(optimizePromptOptions) .outputFormat(OutputFormat.PNG) .responseFormat(ResponseFormat.URL) .stream(false) .watermark(true) .build(); ImageGenerationResponse imagesResponse = service.generateImages(generateRequest); // Iterate through all image data if (imagesResponse != null && imagesResponse.getData() != null) { for (int i = 0; i < imagesResponse.getData().size(); i++) { // Retrieve image information String url = imagesResponse.getData().get(i).getUrl(); String size = imagesResponse.getData().get(i).getSize(); System.out.printf("Image %d:%n", i + 1); System.out.printf(" URL: %s%n", url); System.out.printf(" Size: %s%n", size); System.out.println(); } service.shutdownExecutor(); } } } ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" model "github.com/volcengine/ark-runtime-go/arkruntime/model/images" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), // The base URL for model invocation . arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() outputFormat := model.OutputFormatPNG var ( sequentialImageGeneration model.SequentialImageGenerationMode = "auto" maxImages = 4 mode model.OptimizePromptMode = model.OptimizePromptModeFast ) generateReq := &model.CreateImageGenerationRequest{ Model: "doubao-seedream-4-0-250828", Prompt: model.NewOptString("生成一组共4张连贯插画,核心为同一庭院一角的四季变迁,以统一风格展现四季独特色彩、元素与氛围"), Size: model.NewOptString("2K"), OutputFormat: model.NewOptOutputFormat(outputFormat), ResponseFormat: model.NewOptResponseFormat(model.ResponseFormatURL), Watermark: model.NewOptBool(true), SequentialImageGeneration: model.NewOptSequentialImageGenerationMode(sequentialImageGeneration), SequentialImageGenerationOptions: model.NewOptSequentialImageGenerationOptions(model.SequentialImageGenerationOptions{ MaxImages: model.NewOptInt32(int32(maxImages)), }), OptimizePromptOptions: model.NewOptOptimizePromptOptions(model.OptimizePromptOptions{ Mode: model.NewOptOptimizePromptMode(mode), }), } resp, err := client.GenerateImages(ctx, generateReq) if err != nil { fmt.Printf("call GenerateImages error: %v\n", err) return } if resp.Error.IsSet() { fmt.Printf("API returned error: %s - %s\n", resp.Error.Value.Code, resp.Error.Value.Message) return } // Output the generated image information fmt.Printf("Generated %d images:\n", len(resp.Data)) for i, image := range resp.Data { var url string if image.URL.IsSet() { url = image.URL.Or("") } else { url = "N/A" } fmt.Printf("Image %d: Size: %s, URL: %s\n", i+1, image.Size.Or(""), url) } } ``` **选项:OpenAI** ```Python import os from openai import OpenAI client = OpenAI( # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv('ARK_API_KEY'), ) imagesResponse = client.images.generate( model="doubao-seedream-4-0-250828", prompt="生成一组共4张连贯插画,核心为同一庭院一角的四季变迁,以统一风格展现四季独特色彩、元素与氛围", size="2K", output_format="png", response_format="url", extra_body={ "watermark": True, "sequential_image_generation": "auto", "sequential_image_generation_options": { "max_images": 4 }, "optimize_prompt_options": {"mode": "fast"} }, ) # Iterate through all image data for image in imagesResponse.data: # Output the current image's URL and size print(f"URL: {image.url}, Size: {image.size}") ``` * 您可按需替换 Model ID。Model ID 查询见 [模型列表](/docs/model-list)。 ## 自定义图片输出规格 您可以配置以下参数来控制图片输出规格: * **size**:指定输出图像的尺寸大小。 * **response_format**:指定生成图像的返回格式。 * **output_format**:指定生成图像的文件格式。 * **watermark** :指定是否为输出图片添加水印。 ### 图像输出尺寸 **图片生成场景** 指定生成图像的尺寸信息,支持指定分辨率档位(如 `2K`)或指定宽高像素值(如 `2048x2048`)两种方式,不可混用。不同模型的可选分辨率、默认值、总像素取值范围、宽高比取值范围不同。 **方式 1:指定分辨率档位(推荐)** 在 prompt 中用自然语言描述图片宽高比、图片形状或图片用途,最终由模型判断生成图片的大小。各模型可选值: * Seedream 5.0 pro:`1K`、`1.5K`、`2K` > **注意** > > Seedream 5.0 pro 的 `1.5K` 与 `1K` 价格相同,且图片生成效果更优。 * Seedream 5.0 lite:`2K`、`3K`、`4K` * Seedream 4.5:`2K`、`4K` * Seedream 4.0:`1K`、`2K`、`4K` 使用方式 1 并在 prompt 中描述特定宽高比时,模型实际映射的宽高像素参考值如下表所示(模型支持生成的宽高比不限于以下列举的标准值,此处仅以常见宽高比为例)。 | |1K |1.5K |2K |3K |4K | |---|---|---|---|---|---| |Seedream 5.0 pro |`1:1`:1024x1024 |`1:1`:1536x1536 |`1:1`:2048x2048 |— |— | \ | |`4:3`:1152x864 |`4:3`:1792x1344 |`4:3`:2368x1776 | | | \ | |`3:4`:864x1152 |`3:4`:1344x1792 |`3:4`:1776x2368 | | | \ | |`16:9`:1424x800 |`16:9`:2048x1152 |`16:9`:2816x1584 | | | \ | |`9:16`:800x1424 |`9:16`:1152x2048 |`9:16`:1584x2816 | | | \ | |`3:2`:1248x832 |`3:2`:1872x1248 |`3:2`:2496x1664 | | | \ | |`2:3`:832x1248 |`2:3`:1248x1872 |`2:3`:1664x2496 | | | \ | |`21:9`:1568x672 |`21:9`:2352x1008 |`21:9`:3136x1344 | | | |Seedream 5.0 lite |— |— |`1:1`:2048x2048 |`1:1`:3072x3072 |`1:1`:4096x4096 | \ | | | |`4:3`:2304x1728 |`4:3`:3456x2592 |`4:3`:4704x3520 | \ | | | |`3:4`:1728x2304 |`3:4`:2592x3456 |`3:4`:3520x4704 | \ | | | |`16:9`:2848x1600 |`16:9`:4096x2304 |`16:9`:5504x3040 | \ | | | |`9:16`:1600x2848 |`9:16`:2304x4096 |`9:16`:3040x5504 | \ | | | |`3:2`:2496x1664 |`3:2`:3744x2496 |`3:2`:4992x3328 | \ | | | |`2:3`:1664x2496 |`2:3`:2496x3744 |`2:3`:3328x4992 | \ | | | |`21:9`:3136x1344 |`21:9`:4704x2016 |`21:9`:6240x2656 | |Seedream 4.5 |— |— |`1:1`:2048x2048 |— |`1:1`:4096x4096 | \ | | | |`4:3`:2304x1728 | |`4:3`:4704x3520 | \ | | | |`3:4`:1728x2304 | |`3:4`:3520x4704 | \ | | | |`16:9`:2848x1600 | |`16:9`:5504x3040 | \ | | | |`9:16`:1600x2848 | |`9:16`:3040x5504 | \ | | | |`3:2`:2496x1664 | |`3:2`:4992x3328 | \ | | | |`2:3`:1664x2496 | |`2:3`:3328x4992 | \ | | | |`21:9`:3136x1344 | |`21:9`:6240x2656 | |Seedream 4.0 |`1:1`:1024x1024 |— |`1:1`:2048x2048 |— |`1:1`:4096x4096 | \ | |`4:3`:1152x864 | |`4:3`:2304x1728 | |`4:3`:4704x3520 | \ | |`3:4`:864x1152 | |`3:4`:1728x2304 | |`3:4`:3520x4704 | \ | |`16:9`:1312x736 | |`16:9`:2848x1600 | |`16:9`:5504x3040 | \ | |`9:16`:736x1312 | |`9:16`:1600x2848 | |`9:16`:3040x5504 | \ | |`3:2`:1248x832 | |`3:2`:2496x1664 | |`3:2`:4992x3328 | \ | |`2:3`:832x1248 | |`2:3`:1664x2496 | |`2:3`:3328x4992 | \ | |`21:9`:1568x672 | |`21:9`:3136x1344 | |`21:9`:6240x2656 | **方式 2:指定宽高像素值(`宽x高`)** 各模型参数约束: | | Seedream 5.0 pro | Seedream 5.0 lite | Seedream 4.5 | Seedream 4.0 | | --- | --- | --- | --- | --- | | 总像素取值范围 | [`1280x720`(921600), `2048x2048x1.1025`(4624220)] | [`2560x1440`(3686400), `4096x4096`(16777216)] | [`2560x1440`(3686400), `4096x4096`(16777216)] | [`1280x720`(921600), `4096x4096`(16777216)] | | 宽高比范围 | [1/16, 16] | [1/16, 16] | [1/16, 16] | [1/16, 16] | |方式1 |方式2 | |---|---| |```JSON |```JSON | \ |{ |{ | \ | "prompt": "生成一组共4张连贯插画,宽高比为3:2,核心为同一庭院一角的四季变迁,以统一风格展现四季独特色彩、元素与氛围", | "prompt": "生成一组共4张连贯插画,核心为同一庭院一角的四季变迁,以统一风格展现四季独特色彩、元素与氛围", | \ | | | \ | "size": "2K" | "size": "2048x2048" | \ | | | \ |} |} | \ |``` |``` | **图层拆分场景** 仅支持通过指定分辨率档位的方式设置。输出图的分辨率规则如下: * **底图**:输出底图的分辨率和 `size` 指定的分辨率一致;输出底图和原待拆分图的宽高比一致。 * **各图层**:输出图层的分辨率和 `size` 指定的分辨率接近;每个输出图层和其在原图中的宽高比一致。 `size` 的默认值与可选值: * 默认值:`auto` * 可选值:`1K`、`1.5K`、`2K`、`auto`(根据输入图的尺寸和宽高比进行输出) > **注意:价格说明** > > `1.5K` 与 `1K` 价格相同(详情参见 [模型价格](/docs/model-pricing#457edfd0))。 > **说明:auto 适配规则** > > auto 模式下,模型将根据输入图片中底图和每个图层的原始尺寸进行输出,且各自保持其在原图中的宽高比: > > * 若输入图片中底图和每个图层的原始尺寸在 [`1280x720`(921600), `2048x2048x1.1025`(4624220)] 之间,按照原尺寸输出底图与每个图层。 > * 若输入图片中底图和每个图层的原始尺寸小于 1K,按 1K 输出底图与每个图层。 > * 若输入图片中底图和每个图层的原始尺寸大于 2K,按 2K 输出底图与每个图层。 ### 图像输出方式 通过设置 **response_format** 参数,可以指定生成图像的返回方式: * `url`:返回图片下载链接。 * `b64_json`:以 Base64 编码字符串的 JSON 格式返回图像数据。 ```JSON { "response_format": "url" } ``` ### 图像文件格式 Seedream 4.5/4.0 生成的图像格式默认为` jpeg`,不支持自定义设置。 Seedream 5.0 pro / 5.0 lite 可通过设置 **output_format** 参数,指定生成图像文件的格式: * `png` * `jpeg` ```JSON { "output_format": "png" } ``` > **注意** > > 图层拆分场景下,`output_format` 仅控制底图的输出格式,图层始终以 PNG 格式输出。 ### 图像中添加水印 通过设置 **watermark** 参数,来控制是否在生成的图片中添加水印。 * `false`:不添加水印。 * `true`:在图片右下角添加“AI生成”字样的水印标识。 ```JSON { "watermark": true } ``` # 使用限制 **SDK 版本升级** 为保证模型功能的正常使用,请务必升级至最新 SDK 版本。相关步骤可参考 [安装及升级 SDK](/docs/install-and-upgrade-sdk)。 **图片传入限制** 图片传入方式(两种场景通用): * 图片 URL:请确保图片 URL 可被访问。 示例:`https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_5_imageToimage.png` * Base64 编码:请遵循格式`data:image/<图片格式>;base64,`。注意:`<图片格式>` 必须采用小写字母,例如 `data:image/png;base64,`。 如需获得图片的 Base64 编码,可使用第三方工具,例如 https://base64.guru/converter/encode/image。 不同场景对输入图的约束不同,详见下表: | 约束项 | 图片生成场景 | 图层拆分场景 | | --- | --- | --- | | 图片格式 | jpeg、png、webp、bmp、tiff、gif、heic、heif | png、jpeg | | 总像素(宽×高) | [196, `6000×6000`(3600万)] | [`512×512`(262144), `6000×6000`(3600万)] | | 宽高长度(px) | 大于14 | — | | 宽高比(宽/高) | [1/16, 16] | [1/16, 16] | | 大小 | 不超过 30 MB | 不超过 30 MB | | 传入张数 | Seedream 5.0 pro / flash,最多 10 张;Seedream 5.0 lite / 4.5 / 4.0,最多 14 张 | 仅支持单张图片 | > **说明** > > 总像素是对单张图宽度和高度的**像素乘积**限制,而不是对宽度或高度的单独值进行限制。 **保存时间** 图片URL仅保留24小时,超时后会被自动清除。请您务必及时保存生成的图片。 推荐配置火山引擎 TOS 提供的数据订阅功能,将您的模型推理产物自动转存到自己的 TOS 桶中,便于长期备份或二次加工。详细介绍请参见 [TOS 数据订阅](https://docs.volcengine.com/docs/TorchObjectStorage/Datasubscription-5?lang=zh)。 **限流说明** * IPM 限流:账号下同模型(区分模型版本)每分钟生成图片数量上限。若超过该限制,生成图片时会报错。 * 图层拆分场景下,每次请求预扣减 17 IPM(按最多输出 1 张底图和 16 张图层预留配额);全部图片生成后,按实际生成数量返还多扣减的额度。 * 不同模型的限制值不同,详见 [图片生成能力](/docs/model-list#9df4d9fd)。 # 附:故事书/连环画制作 [火山方舟大模型体验中心](https://www.volcengine.com/experience/ark?mode=vision&model=doubao-seedream-4-0-250828) 提供了故事书和连环画功能,该功能结合了 Doubao Seed 2.1 Lite 模型和 Seedream 4.0 模型,可实现一句话生成动漫、连环画、故事书,满足用户多样化的创作需求。 连环画的实现过程与故事书类似,本文以故事书为例,为您介绍生成故事书的工作流和技术实现步骤,方便您在本地快速复现。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/d590e440ff7447feaed8fa8f4d91e746~tplv-goo7wpa0wc-image.image) ## 工作流 故事书生成的工作流如下: ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/0177dd5714aa4750aebc27bbc02ea9f6~tplv-goo7wpa0wc-image.image) ## 技术实现 1. 根据用户提供的提示词和参考图,调用 doubao-seed-2.1-lite 模型,进行故事创作 > 故事分镜拆解 > 生成分镜的文案和画面描述 > 生成书名 > 生成故事总结,并汇总成 JSON 格式输出。 System Prompt 如下: ```Text # 角色 你是一位**绘本创作大师**。 ## 任务 贴合用户指定的**读者群(儿童/青少年/成人/全年龄)**,创作**情节线性连贯的、生动有趣的、充满情绪价值和温度的、有情感共鸣的、分镜-文案-画面严格顺序对应的绘本内容**: - 核心约束:**分镜拆分→文案(scenes)→画面描述(scenes_detail)必须1:1顺序绑定**,从故事开头到结尾,像「放电影」一样按时间线推进,绝无错位。 ## 工作流程 1. 充分理解用户诉求。 优先按照用户的创作细节要求执行(如果有) 2. **故事构思:** 创作一个能够精准回应用户诉求、提供情感慰藉的故事脉络。整个故事必须围绕“共情”和“情绪价值”展开。 3. **分镜结构与数量:** * 将故事浓缩成 **5~10** 个关键分镜,最多10个(不能超过10个)。 * 必须遵循清晰的叙事弧线:开端 → 发展 → 高潮 → 结局。 4. **文案与画面 (一一对应):** * **文案 ("scenes"字段):** 为每个分镜创作具备情感穿透力的文案。文案必须与画面描述紧密贴合,共同服务于情绪的传递。**禁止在文案中使用任何英文引号 ("")**。不能超过10个。 * **画面 ("scenes_detail"字段):** 为每个分镜构思详细的画面。画风必须贴合用户诉求和故事氛围。描述需包含构图、光影、色彩、角色神态等关键视觉要素,达到可直接用于图片生成的标准。 5. **书名 ("title"字段):** * 构思一个简洁、好记、有创意的书名。 * 书名必须能巧妙地概括故事精髓,并能瞬间“戳中”目标用户的情绪共鸣点。 6. **故事总结 ("summary"字段):** * 创作一句**不超过30个汉字**的总结。 * 总结需高度凝练故事的核心思想与情感价值。 7. 整合输出:将所有内容按指定 JSON 格式整理输出。 ## 安全限制 生成的内容必须严格遵守以下规定: 1. **禁止暴力与血腥:** 不得包含任何详细的暴力、伤害、血腥或令人不适的画面描述。 2. **禁止色情内容:** 不得包含任何色情、性暗示或不适宜的裸露内容。 3. **禁止仇恨与歧视:** 不得包含针对任何群体(基于种族、宗教、性别、性取向等)的仇恨、歧视或攻击性言论。 4. **禁止违法与危险行为:** 不得描绘或鼓励任何非法活动、自残或危险行为。 5. **确保普遍适宜性:** 整体内容应保持在社会普遍接受的艺术创作范围内,避免极端争议性话题。 ## 输出格式要求 整理成以下JSON格式,scenes 和 scenes_detail 要与分镜保持顺序一致,一一对应,最多10个(不能超过10个): { "title": "书名", "summary": "30字内的总结", "scenes": [ "分镜1的文案,用50字篇幅传递情绪和情感,引发读者共鸣,语言风格需符合设定。", "分镜2的文案" ], "scenes_detail": [ "图片1:这是第一页的画面描述。必须以'图片'+序号开头。要有强烈的视觉感,详细描述构图(如特写、远景)、光影、色彩、角色表情、动作和环境细节,符合生图提示词的要求。", "图片2:" ] } ``` 2. 提取返回结果 JSON 中的 scenes_detail 字段,作为图片生成的 Prompt 。 3. 处理图片生成的 Prompt: 1. 将数组转化成字符串 2. 在 prompt 末尾补充"最后,为故事书创作一个封面。 再检查所有图片,去除图片中的文字"。 3. 在 prompt 开头添加用户输入的提示词。 4. 根据图片生成的 Prompt 和用户提供的参考图,调用 doubao-seedream-4.0 模型的生成组图能力,为故事的所有分镜文案生成配图。 5. 按照顺序拼装图片和文字即可得到故事书内容 ,用户按需进行展示即可。 --- # 决策评估(beta) Source: https://ark.volcengine.com/region:cn-beijing/docs/decision-model 决策评估可通过 System One API 将文本、图片、视频或音频等输入转换为业务可直接使用的结构化判断结果,适用于内容分类、请求路由、风险评估和优先级判断等场景。它可以返回某个条件为真的概率、从固定选项集合中选择某个选项的结果和概率,或者根据评分标准给出分数。 > **注意** > > System One API 当前处于 beta 测试阶段。调用该接口时,必须在 HTTP 请求头中传入 `ark-beta-systemone-api: true`。 ## 支持模型与 API - 支持模型: 请参见[决策评估能力(beta)](/docs/model-list#f2b7c91d)。 - 支持 API: [System One API(beta)](/docs/system-one-api) ## 工作方式 System One API 通过 `state` 和 `questions` 描述一次决策评估任务,并在响应的 `answers` 中返回结构化判断结果。 请求包含以下部分: | 参数 | 说明 | | --- | --- | | `model` | 执行本次评估的模型 ID 或推理接入点 ID。 | | `state` | 待评估内容,可以是文本、结构化 JSON 或多模态对象数组。 | | `questions` | 评估问题集合。每个问题用于定义一个判断维度,包括问题类型、判断目标和判定标准。 | 响应中的 `answers` 会按问题 ID 返回结果,不同问题类型的典型场景及对应结果如下: | 问题类型 | 典型场景 | 主要结果 | | --- | --- | --- | | `noul` | 是非判断 | 返回 `[0, 1]` 区间内的概率值,表示结果符合 `criteria.true` 的概率。 | | `choice` | 分类选择 | 返回概率最高的选项作为命中结果,并返回各选项的概率。 | | `score` | 评分判断 | 返回档位编号的概率加权值,并返回各档位的概率。 | ## 典型场景 以下示例展示决策评估在分类选择、是非判断和评分判断场景中的请求与响应。 ### 分类选择 分类选择可使用 `choice`。例如在工单路由场景中,可将处理团队写入 `criteria`,并增加 `其他` 或 `信息不足` 兜底选项。 请求示例如下: ```Bash curl "https://ark.cn-beijing.volces.com/api/v1/systemone" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "ark-beta-systemone-api: true" \ -d '{ "model": "doubao-seed-2-1-lite-260915", "state": { "ticket_id": "ticket-001", "customer_message": "我收到的杯子有裂纹,申请退款,不接受换货。", "order": { "order_id": "order-104", "product": "陶瓷杯", "payment_status": "paid" } }, "questions": { "routing_team_v1": { "type": "choice", "instructions": "根据客户反馈的主要问题选择优先处理团队。", "criteria": { "财务": "扣款、发票或退款到账问题", "质量": "商品损坏、质量缺陷或与描述不符", "物流": "配送延迟、丢件或物流状态问题", "信息不足": "缺少判断主要问题所需的信息" } } } }' ``` 响应示例如下: ``` { "model": "doubao-seed-2-1-lite-260915", "answers": { "routing_team_v1": { "type": "choice", "choice": "质量", "confidence": 0.91, "probabilities": { "财务": 0.04, "质量": 0.91, "物流": 0.02, "信息不足": 0.03 } } }, "usage": { "input_tokens": 183, "output_tokens": 0 } } ``` ### 是非判断 是非判断可使用 `noul`。例如判断是否需要转人工时,可用 `criteria.true` 和 `criteria.false` 明确自动转人工的边界,并在业务代码中设置上下阈值。 请求示例如下: ```Bash curl "https://ark.cn-beijing.volces.com/api/v1/systemone" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "ark-beta-systemone-api: true" \ -d '{ "model": "doubao-seed-2-1-lite-260915", "state": { "ticket_id": "ticket-002", "customer_message": "已经联系三次还没解决,请马上安排人工处理,否则我要投诉。", "order": { "order_id": "order-205", "product": "蓝牙耳机", "payment_status": "paid" } }, "questions": { "needs_human_support_v1": { "type": "noul", "instructions": "该工单是否需要转人工处理?", "criteria": { "true": "存在退款、投诉、风险、证据不充分或客户明确要求人工介入", "false": "问题清晰、风险较低,且可由自动化流程处理" } } } }' ``` 响应示例如下: ``` { "model": "doubao-seed-2-1-lite-260915", "answers": { "needs_human_support_v1": { "type": "noul", "noul": 0.94 } }, "usage": { "input_tokens": 169, "output_tokens": 0 } } ``` ### 评分判断 评分判断可使用 `score`。例如评估风险等级时,`criteria` 应描述同一风险维度下从低到高的档位,不要把多个维度混在一道题中。 请求示例如下: ```Bash curl "https://ark.cn-beijing.volces.com/api/v1/systemone" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "ark-beta-systemone-api: true" \ -d '{ "model": "doubao-seed-2-1-lite-260915", "state": { "ticket_id": "ticket-003", "customer_message": "退款金额一直不到账,我已经准备向监管平台投诉。", "order": { "order_id": "order-309", "refund_status": "processing", "refund_amount": 299 } }, "questions": { "risk_level_v1": { "type": "score", "instructions": "该工单的处理风险等级是多少?", "criteria": [ "风险较低,不涉及资金、合规或客户投诉", "存在一定风险,需要补充材料或人工确认", "风险较高,涉及资金损失、投诉升级或合规问题" ] } } }' ``` 响应示例如下: ``` { "model": "doubao-seed-2-1-lite-260915", "answers": { "risk_level_v1": { "type": "score", "score": 1.82, "confidence": 0.88, "legend": { "0": "风险较低,不涉及资金、合规或客户投诉", "1": "存在一定风险,需要补充材料或人工确认", "2": "风险较高,涉及资金损失、投诉升级或合规问题" }, "probabilities": { "0": 0.03, "1": 0.12, "2": 0.85 } } }, "usage": { "input_tokens": 178, "output_tokens": 0 } } ``` ## 评估流程 使用 System One API 进行决策评估时,可按以下步骤设计请求。 ### 步骤一:设置被评估内容 将需要评估的业务内容放入 `state`。`state` 应包含完成判断所需的事实、证据、业务对象和上下文信息,避免把判定规则混入被评估内容中。 ### 步骤二:设置评估问题和判定标准 在 `questions` 中传入评估问题,并设置以下字段: - `type`:设置问题类型,可选值为 `noul`、`choice` 或 `score`。 - `instructions`:说明判断目标。 - `criteria`:补充判定边界、候选选项或评分档位。简单场景可以只设置 `instructions`;需要更稳定的业务判断时,建议补充 `criteria`。 以下示例使用 `noul` 判断客户是否明确要求退款。 请求示例如下: ```Bash curl "https://ark.cn-beijing.volces.com/api/v1/systemone" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "ark-beta-systemone-api: true" \ -d '{ "model": "doubao-seed-2-1-lite-260915", "state": { "工单": { "客户反馈": "收到的杯子裂了,请退回货款,我不接受换货。" }, "订单": { "订单号": "订单-104" } }, "questions": { "refund_requested_v1": { "type": "noul", "instructions": "客户是否明确要求退回已支付的款项?" } } }' ``` ### 步骤三:处理评估结果 读取响应中对应问题 ID 的结果,并根据业务自定义阈值或策略执行后续动作。 对于 `noul` 类型问题,返回值为 `[0, 1]` 区间内的概率值。业务代码可以根据该概率值和自定义阈值判断是否执行“是”分支、进入“否”分支或转人工复核。 响应示例如下: ``` { "model": "doubao-seed-2-1-lite-260915", "answers": { "refund_requested_v1": { "type": "noul", "noul": 0.96 } }, "usage": { "input_tokens": 128, "output_tokens": 0 } } ``` ## 进阶使用 ### 多模态输入 当 `state` 同时包含文本、图片、视频或音频时,可传入多模态对象数组,并在 `instructions` 中说明每种材料的作用,区分“用户主张”和“材料证据”,避免模型仅凭文字描述替代证据判断。 多模态内容支持以下传入方式: - 本地文件上传: - [Files API 上传](/docs/upload-files-api)(推荐):适用于文件较大,或需要在多个请求中复用同一文件的场景。文件上传并变为可用后,可在 System One API 请求中引用该文件。 - Base64 输入:适用于文件体积较小、无需复用文件的场景。 - 公网 URL 输入:适用于文件已存在公网可访问 URL 的场景。 > **说明** > > - 多模态内容的文件格式、大小、尺寸、数量、时长及 Files API 上传限制,详见[图片理解](/docs/image-understanding)、[视频理解](/docs/video-understanding)、[音频理解](/docs/audio-understanding)和[文件输入(Files API)](/docs/file-api)。 > - 同一图片、视频或音频需要在多次评估请求中复用时,建议在 `state` 中通过 `file_id` 引用素材。对同一个媒体元素,不要同时传入 `file_id`、公网 URL 或 Base64。 > - 多模态输入会增加请求处理时间;如需保持较低响应延迟,建议仅传入完成判断所需的图片、视频或音频内容。 以下示例展示通过 `file_id`、公网 URL 和 Base64 传入多模态内容的方式。 ```Bash BASE64_AUDIO=$(base64 < /Users/doc/demo.mp3) && curl "https://ark.cn-beijing.volces.com/api/v1/systemone" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "ark-beta-systemone-api: true" \ -d @- <", "detail": "high" }, { "type": "video", "video_url": "https://example.com/unboxing-video.mp4", "fps": 1 }, { "type": "audio", "audio_url": "data:audio/mpeg;base64,$BASE64_AUDIO" } ], "questions": { "package_damaged_on_arrival_v1": { "type": "noul", "instructions": "图片、视频和音频证据是否支持商品到货时已破损?文本只提供客户主张,不能仅凭客户文字认定到货即破损。", "criteria": { "true": "图片或视频中可见商品破损,且音频或视频内容能够辅助确认破损发生在到货或开箱阶段", "false": "多模态材料无法确认商品到货时已破损,或关键证据不清晰、不连续" } } } } EOF ``` ### 同一请求传入多个问题 如果需要基于同一份 `state` 完成多个相互独立的判断,可在同一次请求的 `questions` 中传入多道问题。每个问题只对应一个判断维度;如果某个问题依赖另一道问题的答案,建议拆分为多次请求。 > **说明** > > 为保持较低响应延迟,建议控制单次请求中的 `questions` 数量;问题数量较多时,可拆分为多次请求。 以下示例使用同一份工单内容,同时判断客户是否要求退款、选择优先处理团队,并评估客户不满程度。 ```Bash curl "https://ark.cn-beijing.volces.com/api/v1/systemone" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "ark-beta-systemone-api: true" \ -d '{ "model": "doubao-seed-2-1-lite-260915", "state": { "工单": { "客户反馈": "收到的杯子裂了,请退回货款,我不接受换货。" }, "订单": { "订单号": "订单-104" } }, "questions": { "refund_requested_v1": { "type": "noul", "instructions": "客户是否明确要求退回已支付的款项?" }, "routing_team_v1": { "type": "choice", "instructions": "根据客户反馈的主要问题选择优先处理团队。", "criteria": { "财务": "扣款、发票或退款到账问题", "质量": "商品损坏、质量缺陷或与描述不符", "物流": "配送延迟、丢件或物流状态问题", "信息不足": "缺少判断主要问题所需的信息" } }, "dissatisfaction_level_v1": { "type": "score", "instructions": "客户在反馈中表达的不满程度如何?", "criteria": [ "平静陈述事实,没有表达不满", "明确表达不满,但措辞克制", "强烈愤怒,使用激烈措辞或威胁投诉" ] } } }' ``` ### 组合使用评估结果 业务代码不应只读取最高概率结果,还应结合 `probabilities`、`confidence` 和自定义阈值执行后续动作。 响应示例如下: ``` { "model": "doubao-seed-2-1-lite-260915", "answers": { "refund_requested_v1": { "type": "noul", "noul": 0.96 }, "routing_team_v1": { "type": "choice", "choice": "质量", "confidence": 0.91, "probabilities": { "财务": 0.04, "质量": 0.91, "物流": 0.02, "信息不足": 0.03 } }, "dissatisfaction_level_v1": { "type": "score", "score": 1.82, "confidence": 0.88, "probabilities": { "0": 0.03, "1": 0.12, "2": 0.85 } } }, "usage": { "input_tokens": 245, "output_tokens": 0 } } ``` 业务代码可先分别读取每个问题的结果,再结合业务策略形成最终处理动作。不同类型结果可参考以下方式使用: | 结果类型 | 示例结果 | 结果使用方式 | | --- | --- | --- | | `noul` 是非判断 | `refund_requested_v1.noul` 为 `0.96`。 | 高于业务定义的“是”阈值时,可执行“是”分支;低于“否”阈值时,可执行“否”分支;介于两个阈值之间时进入人工复核。 | | `choice` 分类 | `routing_team_v1.choice` 为 `质量`,`confidence` 为 `0.91`。 | 当目标选项概率和 `confidence` 均高于业务阈值时,可按该分类路由;`confidence` 低或兜底选项概率高时进入人工复核。 | | `score` 打分 | `dissatisfaction_level_v1.score` 为 `1.82`。 | 可根据加权 `score` 所处的业务区间执行后续动作;最高两个档位概率接近时保留人工判断。 | 例如,当 `refund_requested_v1.noul` 高于业务定义的“是”阈值,且 `routing_team_v1.choice` 为 `质量` 时,可将工单路由到质量团队;如果任一结果置信度不足,可进入人工复核。 ## 计费说明 决策评估按照所选模型的输入、输出 token 计费。 具体价格请参见[模型价格](/docs/model-pricing)。 ## 使用限制与注意事项 - System One API 返回结构化判断结果,不用于生成面向用户的自然语言回复;如需生成客服话术、摘要、解释或完整报告,建议使用 [Chat API](/docs/chat-api) 或 [Responses API](/docs/create-model-responses-api)。 - System One API 当前支持最大 128k 上下文窗口,单次请求中的 `state` 和 `questions` 共同占用上下文窗口。 - 使用 `choice` 时,建议在 `criteria` 中设置 `其他`、`信息不足` 或 `无法判断` 等兜底选项,避免证据不足时被迫命中业务分类。 - 使用 `score` 时,每道问题应只评估一个有序维度;不同问题的档位数量或档位含义不一致时,`score` 不应直接横向比较。 - 批量评估、实时高并发评估或周期性任务中,建议控制请求并发;遇到限流或服务繁忙类错误时,使用指数退避重试。 --- # 3D 生成 Source: https://ark.volcengine.com/region:cn-beijing/docs/3d-generation 3D 生成模型具备出色的三维内容生成能力,能够根据用户输入的图像,快速生成具备多边形面片与 PBR 材质的高精度 3D 资产。通过这篇教程您可以学习到如何调用豆包 3D 生成模型 API 来生成 3D 文件。 > **说明** > > 方舟平台的新用户?获取 API Key 及 开通模型等准备工作,请参见 [快速入门](/docs/quick-start)。 # 模型及API |**模型 ID(Model ID)** |**模型能力** |**产物规格** | **限流** |API | |---|---|---|---|---| |[doubao-seed3d-2-0-260328](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seed3d-2-0) |图生3D |**产物面数** |最大 RPM:300 |[3D生成 API](https://ark.volcengine.com/region:cn-beijing/docs/seed3d-api) | \ | | | |最大并发:5 | | \ | |* 生成带纹理和 PBR 材质的3D文件 |* 100000 面 | | | \ | | |* 500000 面 | | | \ | | |* 1000000面 | | | \ | | | | | | \ | | |**产物格式** | | | \ | | |* glb 、obj、usd、usdz | | | \ | | | | | | |[hyper3d-gen2-260112](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=hyper3d-gen2) |文生3D、图生3D |**产物面数** |最大 RPM: 60 |[影眸 API](https://ark.volcengine.com/region:cn-beijing/docs/shadoweye-api) | \ | | | |最大并发: 3 | | \ | |* 生成带纹理和 PBR 材质的 3D 文件 |* 三角面模型:[500, 1,000,000] | | | \ | | |* 四边面模型:[1,000, 200,000] | | | \ | | | | | | \ | | |**产物格式** | | | \ | | |* glb, obj, stl, fbx, usdz | | | \ | | | | | | |[hitem3d-2-0-251223](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=hitem3d-2-0) |图生3D |**产物面数** |最大 RPM: 600 |[数美 API](https://ark.volcengine.com/region:cn-beijing/docs/shumei-api) | \ | | | |最大并发: 30 | | \ | |* 标准白膜 |* [100000, 2000000] | | | \ | |* 标准纹理模型 | | | | \ | |* 高精白膜 |**产物格式** | | | \ | |* 高精纹理模型 |* glb, obj, stl, fbx, usdz | | | \ | | | | | | \ | | |**产物分辨率** | | | \ | | |* 1536、1536 pro | | | \ | | | | | | # 模型价格 请参见:[3D生成模型](/docs/model-pricing#59e650ae) # 使用流程 3D 生成任务为异步任务。 1. 通过 **创建任务接口** 创建3D生成任务,获得 **任务 ID** 。 2. 通过 **任务查询接口** + **任务 ID** 查询任务状态,直到任务完成时,获取返回的 3D 产物下载链接,下载生成结果。 > **说明** > > * 3D 生成过程耗时在分钟级别,通常在数分钟到十数分钟不等,具体受任务复杂度和平台负载影响。 > * 返回的产物链接有效期为 24 小时,过时失效,请及时下载/转存产物。 # 体验&调试 可在 [API Explorer](https://api.volcengine.com/api-explorer/?action=Create3DGenerationsTasks&groupName=3D%E7%94%9F%E6%88%90API&serviceCode=ark&tab=2&tab_result=1&tab_sdk=CURL&version=2024-01-01),0代码体验通过 API 调用 3D 模型。支持灵活调整参数(如控制输出产物格式等),方便您直观感受模型实际使用过程。 # 代码调用 ## 效果预览 |输入 |输出预览 | | |---|---|---| |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/078de189655e40c989543d829d421e2d~tplv-goo7wpa0wc-image.image) |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/2e27978997d04e52a51ccf27beb6c25e~tplv-goo7wpa0wc-image.image) | | \ | | | | \ | |> 上图为效果展示。实际产物为3D文件,类似 [文件](https://arkdocs.tos-cn-beijing.volces.com/files/domain-models/seed3d_imageTo3d.glb)。 | | ## 示例代码 **选项:Python** ```Python import os import time # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark # 初始化Ark客户端 client = Ark( # The base URL for model invocation . base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv('ARK_API_KEY'), ) print("----- create request -----") # 创建3D生成任务 create_result = client.content_generation.tasks.create( # Replace with Model ID . model="doubao-seed3d-2-0-260328", content=[ { # 参数 "type": "text", "text": "--subdivisionlevel medium --fileformat glb" }, { # 图片URL "type": "image_url", "image_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/images/domain-models/seed3d_imageTo3d.png" } } ] ) print(create_result) # 轮询查询部分 print("----- polling task status -----") task_id = create_result.id max_attempts = 60 for attempt in range(1, max_attempts + 1): get_result = client.content_generation.tasks.get(task_id=task_id) status = get_result.status if status == "succeeded": print("----- task succeeded -----") print(get_result) break elif status == "failed": print("----- task failed -----") print(f"Error: {get_result.error}") break if attempt == max_attempts: raise TimeoutError(f"Task {task_id} did not finish after {max_attempts} attempts") print(f"Current status: {status}, retrying after 60 seconds...") time.sleep(60) ``` **选项:Curl** 1. 创建3D生成任务,获取 3D 生成任务 ID。 ```Bash curl -X POST https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seed3d-2-0-260328", "content": [ { "type": "text", "text": "--subdivisionlevel medium --fileformat glb" }, { "type": "image_url", "image_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/images/domain-models/seed3d_imageTo3d.png" } } ] }' ``` 2. 查询 3D 生成任务状态,直至任务状态为`Success`,返回产物下载链接。 > 替换 为你的任务 ID。 ```Bash curl -X GET https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks/ \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "time" "github.com/volcengine/ark-runtime-go/arkruntime" model "github.com/volcengine/ark-runtime-go/arkruntime/model/contentgeneration" ) func main() { // 请确保您已将 API Key 存储在环境变量 ARK_API_KEY 中 // 初始化Ark客户端,从环境变量中读取您的API Key client := arkruntime.NewClientWithApiKey( // 从环境变量中获取您的 API Key。此为默认方式,您可根据需要进行修改 os.Getenv("ARK_API_KEY"), // The base URL for model invocation . arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() // Replace with Model ID . modelEp := "doubao-seed3d-2-0-260328" // 创建任务 fmt.Println("----- create request -----") createReq := &model.CreateContentGenerationTaskRequest{ Model: modelEp, Content: []model.ContentItem{ { Type: model.ContentTypeText, Text: model.NewOptString("--subdivisionlevel medium --fileformat glb"), }, { Type: model.ContentTypeImageURL, ImageURL: model.NewOptImageURL(model.ImageURL{ URL: "https://arkdocs.tos-cn-beijing.volces.com/images/domain-models/seed3d_imageTo3d.png", }), }, }, } createResp, err := client.CreateContentGenerationTask(ctx, createReq) if err != nil { fmt.Printf("create content generation error: %v", err) return } taskID := createResp.ID fmt.Printf("Task Created with ID: %s", taskID) // 轮询查询部分 fmt.Println("----- polling task status -----") const maxAttempts = 60 for attempt := 1; attempt <= maxAttempts; attempt++ { getReq := taskID getResp, err := client.GetContentGenerationTask(ctx, getReq) if err != nil { fmt.Printf("get content generation task error: %v", err) return } status := getResp.Status if status == "succeeded" { fmt.Println("----- task succeeded -----") fmt.Printf("Task ID: %s", getResp.ID) fmt.Printf("Model: %s", getResp.Model) fmt.Printf("File URL: %s", getResp.Content.Or(model.TaskContent{}).FileURL.Or("")) fmt.Printf("Completion Tokens: %d", getResp.Usage.Or(model.TaskUsage{}).CompletionTokens) fmt.Printf("Created At: %d, Updated At: %d", getResp.CreatedAt.Or(0), getResp.UpdatedAt.Or(0)) return } else if status == "failed" { fmt.Println("----- task failed -----") if getResp.Error.IsSet() { fmt.Printf("Error Code: %s, Message: %s", getResp.Error.Value.Code, getResp.Error.Value.Message) } return } else if attempt == maxAttempts { fmt.Printf("Task %s did not finish after %d attempts", taskID, maxAttempts) return } else { fmt.Printf("Current status: %s, retrying in 60 seconds...", status) time.Sleep(60 * time.Second) } } } ``` **选项:Java** ```Java package com.volcengine.ark.runtime; import com.volcengine.ark.runtime.models.content_generation.*; import com.volcengine.ark.runtime.service.ArkService; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; public class ContentGenerationTaskExample { // 请确保您已将 API Key 存储在环境变量 ARK_API_KEY 中 // 初始化Ark客户端,从环境变量中读取您的API Key static String apiKey = System.getenv("ARK_API_KEY"); static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); static Dispatcher dispatcher = new Dispatcher(); static ArkService service = ArkService.builder() .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation . .build(); public static void main(String[] args) { //Replace with Model ID . String model = "doubao-seed3d-2-0-260328"; System.out.println("----- CREATE Task Request -----"); List contents = new ArrayList<>(); // 参数 contents.add(ContentItem.builder() .type(ContentType.TEXT) .text("--subdivisionlevel medium --fileformat glb") .build()); // 图片URL contents.add(ContentItem.builder() .type(ContentType.IMAGE_URL) .imageUrl(ImageURL.builder() .url("https://arkdocs.tos-cn-beijing.volces.com/images/domain-models/seed3d_imageTo3d.png") .build()) .build()); // 创建3D生成任务 CreateContentGenerationTaskRequest createRequest = CreateContentGenerationTaskRequest.builder() .model(model) .content(contents) .build(); CreateContentGenerationTaskResponse createResult = service.createContentGenerationTask(createRequest); System.out.println(createResult); System.out.println("----- GET Task Request -----"); // 获取任务详情 String getRequest = createResult.getId(); ContentGenerationTask getResult = service.getContentGenerationTask(getRequest); System.out.println(getResult); System.out.println("----- LIST Task Request -----"); // 轮询查询部分 System.out.println("----- polling task status -----"); final int maxAttempts = 60; for (int attempt = 1; attempt <= maxAttempts; attempt++) { try { ContentGenerationTask getResponse = service.getContentGenerationTask(getRequest); String status = getResponse.getStatus().toString(); if ("succeeded".equalsIgnoreCase(status)) { System.out.println("----- task succeeded -----"); System.out.println(getResponse); break; } else if ("failed".equalsIgnoreCase(status)) { System.out.println("----- task failed -----"); System.out.println("Error: " + getResponse.getStatus()); break; } else if (attempt == maxAttempts) { throw new IllegalStateException( "Task " + getRequest + " did not finish after " + maxAttempts + " attempts"); } else { System.out.printf("Current status: %s, retrying in 60 seconds...", status); TimeUnit.SECONDS.sleep(60); } } catch (InterruptedException ie) { Thread.currentThread().interrupt(); System.err.println("Polling interrupted"); break; } } } } ``` # 其他说明 ## 控制产物参数 通过`--[parameters]`的方式,控制3D文件输出的规格,包括产物面的数量、输出文格式等。 ```Bash # 指定生成的3D文件的多边形面的数量为 100000 面,生成的3D文件格式为 glb "content": [ { "type": "text", "text": "--subdivisionlevel medium --fileformat glb" } ] ``` ## 链接有效期 任务数据(如任务状态、URL等)仅保留24小时,超时后会被自动清除。请您务必及时保存生成的文件。 ## 限流说明 同一主账号下,使用同一模型(不区分版本)的请求受到以下限制。超过对应限制会返回 “429: 'Too Many Requests'” 错误。 ### 模型维度的限流 > 不同模型的 RPM 和最大并发任务数不同,详见 [3D生成能力](/docs/model-list#21b9a17a)。 * **RPM(Requests Per Minute)**:每分钟允许创建的 3D 生成任务数上限。超过上限时,创建任务请求将因触发限流而失败。 * **最大并发任务数**:同一时刻可处于处理状态的任务数上限。达到上限后,新创建的任务将进入队列等待处理。 ### 非推理 API 请求频率限制 * **QPS(Queries Per Second)**:每秒允许的请求数上限。超过上限时,任务请求将因触发限流而失败。 |接口名称 |账号维度的 QPS 上限 | |---|---| |查询 3D 生成任务 |20 | |查询 3D 生成任务列表 |1 | |取消或删除 3D 生成任务 |20 | --- # 向量化 Source: https://ark.volcengine.com/region:cn-beijing/docs/vectorization `Doubao-embedding-vision` 是由字节跳动研发的多模态向量化模型。它能将文本、图片以及视频等混合输入内容转换为统一的向量表示,从而帮助您更高效地处理跨模态数据,实现精准的文搜图、图搜图和图文混合搜索。 当前模型支持以下几种向量输出类型: * **稠密向量 (Dense Embedding)**:所有版本均默认支持。 * **稀疏向量 (Sparse Embedding)**:从 `doubao-embedding-vision-250615` 版本起支持,且仅支持文本输入。 * **多向量 (Multi Embedding)**:从 `doubao-embedding-vision-251215` 版本起支持。 # 快速开始 多模态向量模型支持接受和处理视频、图像和文本输入并转换为向量。以下示例均显式配置 `instructions`,使向量表示与目标检索场景保持一致。 > **说明** > > 方舟平台的新用户?获取 API Key 及 开通模型等准备工作,请参见 [快速入门](/docs/quick-start)。 **选项:多模态混合输入** > * doubao-embedding-vision-250615 及后续版本支持 **不限数量的视频、文本和图片混合** 输入。 ```Bash curl https://ark.cn-beijing.volces.com/api/v3/embeddings/multimodal \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-embedding-vision-251215", "instructions": "Target_modality: text and image and video.\nInstruction:Represent the mixed content for multimodal semantic retrieval\nQuery:", "encoding_format": "float", "input": [ { "type": "video_url", "video_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/advanced-usage/ark_vlm_video_input.mp4" } }, { "type": "image_url", "image_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/images/domain-models/tower.png" } }, { "type": "text", "text": "视频和图片里有什么" } ] }' ``` **选项:开启多向量输出** > * doubao-embedding-vision-251215 及后续版本支持多向量。 > * 支持文本、图片、视频及混合输入类型。 ```Bash curl https://ark.cn-beijing.volces.com/api/v3/embeddings/multimodal \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-embedding-vision-251215", "instructions": "Target_modality: text.\nInstruction:Compress the text into one word.\nQuery:", "encoding_format": "float", "input": [ { "type": "text", "text": "天很蓝" } ], "multi_embedding": { "type": "enabled", "compression": "blosc2" } }' ``` **选项:自定义视频抽帧** > * doubao-embedding-vision-251215 及后续版本支持视频自定义抽帧。 > * 支持通过 `video_url` 内字段自定义视频抽帧策略。 > * 可综合控制抽帧频率、单帧 token 和整段视频 token 上限。 ```Bash curl https://ark.cn-beijing.volces.com/api/v3/embeddings/multimodal \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-embedding-vision-251215", "instructions": "Target_modality: text and image and video.\nInstruction:Represent the mixed content for multimodal semantic retrieval\nQuery:", "encoding_format": "float", "input": [ { "type": "video_url", "video_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/advanced-usage/ark_vlm_video_input.mp4", "fps": 1, "max_video_tokens": 120000, "min_frame_tokens": 32, "max_frame_tokens": 640, "min_frames": 10 } }, { "type": "image_url", "image_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/images/domain-models/tower.png" } }, { "type": "text", "text": "视频和图片里有什么" } ] }' ``` **选项:开启稀疏向量输出** > * doubao-embedding-vision-250615及后续版本支持。 > * 支持纯文本输入。 ```Bash curl https://ark.cn-beijing.volces.com/api/v3/embeddings/multimodal \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-embedding-vision-251215", "instructions": "Target_modality: text and video.\nInstruction:Compress the text/video into one word.\nQuery:", "encoding_format": "float", "input": [ { "type": "text", "text": "天很蓝" } ], "dimensions": 1024, "sparse_embedding": { "type": "enabled" } }' ``` 模型回复示例: > **说明** > > `sparse_embedding` 字段在开启稀疏向量时返回。 ```JSON { "created": 1752133360, "data": { "embedding": [ -0.046875,-0.048828125,0.02001953125,0.064453125, ..... 0.003143310546875 ], "sparse_embedding":[ { "index": 1, "value": 0.0887451171875 }, { "index": 13, "value": 0.0887451171875 }, { "index": 149, "value": 0.0887451171875 } ], "object": "embedding" }, "id": "021752133359863906427fb4b36437c414d645f52206dfc398f85", "model": "doubao-embedding-vision-251215", "object": "list", "usage": { "prompt_tokens": 25, "prompt_tokens_details": { "image_tokens": 0, "text_tokens": 25 }, "total_tokens": 25 } } ``` # 支持模型 当前支持多模态向量化的模型请参见[向量化能力](/docs/model-list#0ee80bb9)。 不同模型版本的功能对比如下: |**模型版本** |**输入支持** |**稀疏向量 (Sparse Embedding)** |**多向量 (Multi Embedding)** |**视频自定义抽帧** |**`instructions`** **字段** | |---|---|---|---|---|---| |`doubao-embedding-vision-250615` |不限数量的文本、图片、视频 |支持(仅限文本输入) |不支持 |不支持 |不支持 | |`doubao-embedding-vision-251215` 及后续 |不限数量的文本、图片、视频 |支持(仅限文本输入) |支持,支持 `compression=blosc2/zstd` |支持 |支持 | > **注意** > > 【**重要**】`instructions` 字段的配置直接决定模型推理效果。为了显著提升向量表示的精度,您需要根据具体的业务场景来定制该指令。**请勿直接使用系统默认值**。详情请参考[设置 instructions 字段(推荐)](/docs/vectorization#ff993d7a)。 # 使用说明 > **说明** > > 推荐使用方舟推出的多模态向量化模型在处理完图像后,图像会从方舟服务器删除。方舟不会保留您提交的视频、图片以及文本信息等用户数据来训练模型。 ## 开启稀疏向量(Sparse Embedding) > 仅 doubao-embedding-vision-250615 及后续版本支持。 稀疏向量仅支持纯文本输入。 通过独立的 `sparse_embedding` 字段控制,与多向量配置互不影响,示例: > **说明** > > `sparse_embedding.type` 默认值为 `disabled`,设置为 `enabled` 开启稀疏向量。 ```Plaintext { "model": "doubao-embedding-vision-251215", "input": [ { "type":"text", "text":"天很蓝" } ], "sparse_embedding": { "type":"enabled" }, "encoding_format":"float" } ``` ## 开启多向量(Multi Embedding) > 仅 doubao-embedding-vision-251215 及后续版本支持。 支持文本、图片、视频及混合输入;可通过 `compression` 控制返回格式,`dimensions` 会同步影响多向量子向量的列数。 通过独立的 `multi_embedding` 字段控制,与稀疏向量配置互不影响;可单独开启,或文本场景下与稀疏向量同时开启,示例: > **说明** > > `multi_embedding.type` 默认值为 `disabled`,设置为 `enabled` 开启多向量。 ```Plain Text { "model": "doubao-embedding-vision-251215", "instructions":"Target_modality: text and video.\nInstruction:Compress the text/video into one word.\nQuery:", "input": [ { "type":"text", "text":"天很蓝" } ], "multi_embedding": { "type":"enabled", "compression":"blosc2" }, "sparse_embedding": { "type":"enabled" }, "encoding_format":"float" } ``` 开启 `multi_embedding.type="enabled"` 后,响应中的 `data.multi_embedding` 会额外返回 token 级别的子向量: * 不传 `compression` 时,返回 `float[][]`。 * 传入 `compression="blosc2"` 或 `compression="zstd"` 时,返回压缩并 Base64 编码后的字符串。 * 压缩返回场景下,客户端需依次执行 Base64 解码、按压缩算法解压、按 `fp16`(2 字节小端序)解析,再按 `[num_tokens, dimensions]` 重塑为二维数组。 * `multi_embedding` 不允许传空对象 `{}`,否则会报错。 * `multi_embedding` 与 `sparse_embedding` 可同时开启,但 `sparse_embedding` 仍只支持纯文本输入。 ## 自定义视频抽帧 > 仅 `doubao-embedding-vision-251215` 及后续版本支持。可在 `input[].video_url` 内配置抽帧参数,自定义视频理解的速度、成本与效果平衡。 以下字段均为可选;不传时,使用模型默认抽帧策略。 |字段 |类型 |取值范围 |说明 | |---|---|---|---| |`fps` |float |`[0.2, 5]` |抽帧频率,单位“帧/秒” | |`max_video_tokens` |integer |`[10240, 204800]` |整段视频最多送入模型的 token 数 | |`min_frame_tokens` |integer |`[16, 128]` |单帧最少 token 数 | |`max_frame_tokens` |integer |`[128, 640]`,且 `>= min_frame_tokens` |单帧最多 token 数 | |`min_frames` |integer |`[5, 16]` |整段视频最少抽帧数 | ```Plain Text { "model": "doubao-embedding-vision-251215", "input": [ { "type": "video_url", "video_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/advanced-usage/ark_vlm_video_input.mp4", "fps": 1, "max_video_tokens": 120000, "min_frame_tokens": 32, "max_frame_tokens": 640, "min_frames": 10 } } ], "encoding_format": "float" } ``` 使用这些字段时,抽帧策略会综合生效:按 `fps` 抽帧后,每帧按 `max_frame_tokens` 控制 token 上限,总 token 数不超过 `max_video_tokens`,实际抽帧数不低于 `min_frames`。若视频很短且 `fps` 过低导致抽帧数为 0,则会以 `min_frames` 兜底。 ## 设置 instructions 字段(推荐) `instructions` 字段是影响模型效果的关键。为了显著提升向量表示的精度,您需要根据具体的业务场景来定制该指令。**请勿直接使用系统默认值**。 通过合理设置 `instructions`,您可以引导模型更准确地聚焦输入内容的关键信息,从而适配特定的任务需求。这在跨模态检索、特定领域数据处理等场景中尤其有效。 > 注意:仅 `doubao-embedding-vision-251215` 及后续版本支持 `instructions` 字段。 ### **配置规则** 构建指令前需明确两种核心角色,二者在不同任务中的配置规则差异显著: * **Query(查询侧)**:发起检索 / 查询的主体,如用户输入的问题、检索关键词、待匹配的图片/视频等。 * **Corpus(语料侧)**:被查询的对象,如文档库、图片库、视频库中的单条数据样本。 根据任务类型不同,`Instructions` 字段分为 **召回 / 排序类** 和 **聚类 / 分类 / 语义文本相似度(STS)类** 两大场景,具体配置模板如下表: |任务类型 |是否区分 Query/Corpus |核心配置模板 | |---|---|---| |召回、排序类 |是 |Query:`Target_modality: {}.\nInstruction:{}\nQuery:` | \ | | |Corpus:`Instruction:Compress the {} into one word.\nQuery:` | |聚类、分类、STS 类 |否 |所有数据:`Target_modality: {}.\nInstruction:{}\nQuery:` | **通用要求**:所有模板仅需填充 `{}` 部分,其余固定内容**禁止修改**。 ### 召回、排序类任务配置规则 此类任务用于根据 Query 计算与 Corpus 的相似度,实现目标内容的召回或排序,Query 和 Corpus 需分别配置 `Instruction`。 #### **Query 查询侧配置** ```Plaintext Target_modality: {}.\nInstruction:{}\nQuery: ``` **字段填写说明** 1. **`Target_modality`** **填充规则** * 填写依据:**与 Query 自身模态无关**,完全取决于待召回的 **Corpus 底库的模态类型**。 * 多模态混合场景: * 若 Corpus 库中**存在多种**独立模态样本(如部分为 text、部分为 image、部分为 video、部分为 text and video),需用 `/` 分隔所有模态; * 若 Corpus 库中**每条样本均包含**多种模态(如每条样本都有 text + video),则用 `and` 连接。 * 常见示例 |Corpus 库模态情况 |Target_modality 填写值 | |---|---| |所有样本均为纯文本 |text | |所有样本均为图片 + 文本组合 |text and image | |所有样本均为纯视频 |video | |所有样本均为文本 + 视频组合 |text and video | |样本包含 text、image、video 三类 |text/image/video | |样本包含 text、video、text and video 三类 |text/video/text and video | > **注意** > > `Target_modality`的填写错误会直接导致检索精度下降,请严格匹配 Corpus 库或数据集的模态。 2. **`Instruction`** **填充规则** * 核心原则:**禁止使用默认值** **`Compress the text into one word`**,需根据业务场景定制。 * 推荐示例 * 文本检索:`为这个句子生成表示以用于检索相关文章` * 跨模态问答:`根据这个问题,找到能回答这个问题的相应文本或图片` #### Corpus **语料**侧配置 ```Plaintext Instruction:Compress the {} into one word.\nQuery: ``` **字段填写说明** * 填充依据:仅需匹配 **当前单条 Corpus 数据的模态**,无需考虑整个 Corpus 库的模态分布。 * 常见示例:`text`、`image`、`video`、`text and image`、`text and video`、`image and video` ### 聚类、分类、STS 类任务配置规则 此类任务不区分 Query 和 Corpus,所有数据采用**完全相同**的 `Instruction` 配置。 ```Plaintext Target_modality: {}.\nInstruction:{}\nQuery: ``` **字段填写说明** 1. **`Target_modality`** **填充规则** * 填写依据:**整个数据集的统一模态类型**,所有数据的该字段值保持一致。 * 填写格式:与召回类任务的 `Target_modality` 格式一致(单模态填对应值,多模态组合用 `and`)。 2. **`Instruction`** **填充规则** * 核心原则:**禁止使用默认值**,需贴合具体任务场景。 * 典型示例 * STS 语义相似度任务:`Retrieve semantically similar text` ### 高级用法 若上述指令无法满足需求,可以参考 MTEB (Massive Text Embedding Benchmark) 提供的 [示例](https://github.com/embeddings-benchmark/mteb/blob/main/mteb/models/model_implementations/seed_1_6_embedding_models.py) 指令进行尝试。 ### 典型场景配置示例 #### 纯文本任务 ##### 场景 1:对称检索(STS 语义相似度匹配) * **场景描述**:检索语义相似句子,如对比 “一只熊猫正从滑梯上滑下来” 和 “熊猫从滑梯上滑下来”。 * **配置规则**:两条样本的 `Instruction` 完全一致。 * **Instruction 字段示例** ```Plaintext Target_modality: text.\nInstruction:Retrieve semantically similar text\nQuery: ``` * **Input 字段**:填写样本正文(如上述两个句子)。 ##### 场景 2:非对称检索(问答、摘要搜全文) * **场景描述**:用短 Query(问题 / 摘要)检索长 Corpus(答案 / 全文)。 * **配置示例** |角色 |Instruction 字段配置 | |---|---| |Query |`Target_modality: text.\nInstruction:为这个句子生成表示以用于检索相关文章\nQuery:` | |Corpus |`Instruction:Compress the text into one word.\nQuery:` | #### 多模态任务 ##### 场景 1:对称检索(文 / 图 / 视频互搜) * **通用前提**:当文本为图片 / 视频的**完整描述**时(例如“蓝色的天空下,一只狗在草坪上奔跑,草坪上还有一些帐篷”),可使用默认指令配置。 * **配置示例** |检索类型 |Query 侧 Instruction 配置 |Corpus 侧 Instruction 配置 | |---|---|---| |文搜图 |`Target_modality: image.\nInstruction:Compress the text into one word.\nQuery:` |`Instruction:Compress the image into one word.\nQuery:` | |文搜视频 |`Target_modality: video.\nInstruction:Compress the text into one word.\nQuery:` |`Instruction:Compress the video into one word.\nQuery:` | |图搜文 |`Target_modality: text.\nInstruction:Compress the image into one word.\nQuery:` |`Instruction:Compress the text into one word.\nQuery:` | |视频搜文 |`Target_modality: text.\nInstruction:Compress the video into one word.\nQuery:` |`Instruction:Compress the text into one word.\nQuery:` | |图搜图(整体内容匹配) |`Target_modality: image.\nInstruction:Compress the image into one word.\nQuery:` |`Instruction:Compress the image into one word.\nQuery:` | * **特殊提示**:若 Query 为**短词文搜图**(如 “蓝色海景”),建议替换 Query 侧 Instruction 为:`Find me an everyday image that matches the given caption`。 * **注意**:图片局部截取检索原图,不属于对称检索,需按非对称检索配置。 ##### 场景 2:非对称检索 * **通用规则**:仅在 Query 侧定制指令,Corpus 侧使用默认模板;指令需明确匹配规则。 * **典型场景示例** |业务场景 |Query 侧 Instruction 配置 |Corpus 侧 Instruction 配置 | |---|---|---| |跨模态问答(Query:文本问题;Corpus:文本 / 图片) |`Target_modality: text/image.\nInstruction:根据这个问题,找到能回答这个问题的相应文本或图片\nQuery:` |文本 Corpus:`Instruction:Compress the text into one word.\nQuery:` | \ | | |图片 Corpus:`Instruction:Compress the image into one word.\nQuery:` | |原图检索(忽略 PS 处理) |`Target_modality: image.\nInstruction:查找与本图完全相同的图片,可能经过了ps处理,包含缩放、裁剪和水印,请忽略PS处理痕迹\nQuery:` |`Instruction:Compress the image into one word.\nQuery:` | |电商服装检索(忽略背景 / 人物) |`Target_modality: image.\nInstruction:忽略背景以及人物主体并查找这张图片中出现的同款商品图片\nQuery:` |`Instruction:Compress the image into one word.\nQuery:` | |电商商品检索(文本描述搜图) |`Target_modality: image.\nInstruction:根据下面的文本中对商品的描述,找到对应的符合条件的商品图片\nQuery:` |`Instruction:Compress the image into one word.\nQuery:` | |菜品检索(文本描述搜图) |`Target_modality: image.\nInstruction:根据这段文本中提到的有关的菜品,找到相关的菜品的图片\nQuery:` |`Instruction:Compress the image into one word.\nQuery:` | ## 设置向量维度 `dimensions` 向量化是通过向量来表征文本、图像等非结构化数据的过程,让计算机能理解语言、图像等的含义。其中,向量维度是描述向量化后向量中元素的个数(标注词义/图像特征的维度)。在多模态向量化场景,每个维度对应文本的一个特征或者是对应图像的像素、色彩等视觉特征。 `doubao-embedding-vision-250615`及后续版本支持通过`dimensions` 参数指定稠密向量的输出维度,对输出的`data.embedding` 字段生效。 > **注意** > > 稀疏向量为固定维度,不支持单独设置维度。开启多向量后,`data.multi_embedding` 中每个子向量的列数与请求中的 `dimensions` 保持一致;未传 `dimensions` 时使用模型默认维度。 ```Plaintext { "model": "doubao-embedding-vision-251215", "input": [ { "type":"text", "text":"天很蓝" } ], "dimensions": 1024, #设置向量维度 "encoding_format":"float" } ``` ## 图片格式说明 ### 图片传入方式 图片 URL 或图片 Base64 编码。用图片 URL 方式时,需确保图片 URL 可被访问。 ### 图片文件容量 单张图片小于 10 MB。 使用 base64 编码,请求中请求体大小不可超过 64 MB。 ### 图片像素说明 模型能够支持尺寸更加灵活的图片,传入图片满足下面条件: * 图片宽高长度(单位 px):大于 14。 *图片像素(宽*高,单位 px):小于 3600万。 ### 图片数量说明 * 支持不限数量的视频、文本和图片混合输入。 ### token 用量说明 模型理解图片,会将图片转化为 token ,再进行推理计算。token 用量,根据图片宽高像素计算可得。图片转化 token 的公式为: ```Plaintext min(图片宽 * 图片高/784, 单图 token 限制) ``` *图片尺寸为 1280 px * 720 px,即宽为 1280 px,高为 720 px,传入模型图片 token 限制为 1312,则理解这张图消耗的 token 为`1280*720/784=1176`,因为小于 1312,消耗 token 数为 1176 。 *图片尺寸为 1920 px * 1080 px,即宽为 1920 px,高为 1080 px,传入模型图片 token 限制为 1312,则理解这张图消耗的 token 为`1920*1080/784=2645`,因为大于 1312,消耗 token 数为 1312 。这时会压缩 token,即图片的细节会丢失部分,譬如字体很小的图片,模型可能就无法准确识别文字内容。 ### 图片文件格式 支持的图片格式如下表,需注意文件后缀和图片格式需要匹配,即图片文件扩展名(URL 传入)、编码中图片格式声明(Base64 编码传入)需要与图片实际信息一致。 |**图片格式** |**文件扩展名** |**内容格式** **Content Type** | \ | | | | \ | | |> * [上传图片至对象存储时设置](https://docs.volcengine.com/docs/6349/145523?lang=zh#%E8%AE%BE%E7%BD%AE%E6%96%87%E4%BB%B6%E5%85%83%E6%95%B0%E6%8D%AE)。 | \ | | |> * 传入图片 Base64 编码时使用:[Base64 编码输入](/docs/image-understanding#477e51ce)。 | |---|---|---| |JPEG |.jpg, .jpeg |`image/jpeg` | |PNG |.apng, .png |`image/png` | |GIF |.gif |`image/gif` | |WEBP |.webp |`image/webp` | |BMP |.bmp |`image/bmp` | |TIFF |.tiff, .tif |`image/tiff` | |ICO |.ico |`image/x-icon` | |DIB |.dib |`image/bmp` | |ICNS |.icns |`image/icns` | |SGI |.sgi |`image/sgi` | |JPEG2000 |.j2c, .j2k, .jp2, .jpc, .jpf, .jpx |`image/jp2` | > **说明** > > TIFF、 SGI、ICNS、JPEG2000 几种格式图片,需要保证和元数据对齐如在对象存储中正确设置文件元数据,否则会解析失败。 ## 视频输入说明 对视频按固定间隔抽取画面后,交由模型进行理解。 > 仅 doubao-embedding-vision-250615及后续版本支持视频输入。 ### 视频文件格式 |**视频格式** |**文件扩展名** |**内容格式** **Content Type** | \ | | | | \ | | |> * [上传视频至对象存储时设置](https://docs.volcengine.com/docs/6349/145523?lang=zh#%E8%AE%BE%E7%BD%AE%E6%96%87%E4%BB%B6%E5%85%83%E6%95%B0%E6%8D%AE)。 | \ | | |> * 传入 Base64 编码时使用:[Base64 编码输入](/docs/image-understanding#477e51ce)。 | \ | | |> * 视频格式需小写 | |---|---|---| |MP4 |.mp4 |`video/mp4` | |AVI |.avi |`video/avi` | |MOV |.mov |`video/quicktime` | ### 视频文件容量 单视频文件需在 50MB 以内。 ### 不支持音频理解 暂不支持对视频文件中的音频信息进行理解。 ### 用量说明 单视频 token 用量范围在[10k, 80k] ,单次请求视频最大 token 量还受模型的最大上下文窗口以及最大输入长度(当启用深度推理模式)限制,超出则请调整传入视频数量或视频长度。 方舟根据帧图像(指输入给模型的帧图像)张数(视频时长 * **fps** ),对帧图像进行压缩,以平衡对于视频的理解精度和 token 用量。帧图像会被等比例压缩至 [128 token, 640 token] ,对应像素范围在 [10万 像素, 50万像素]。 如`fps`过高或视频长度过长,需要处理的帧图像数量超出 640 帧(80×1024 token ÷ 128 token / 帧 = 640 帧),则按帧图像 128 token `视频时长/640` 时间间隔均匀抽取 640帧。此时与请求中的配置不符,建议评估输出效果,按需调整视频时长或 **fps** 字段配置。 如`fps`过小或视频长度过短,需要处理的帧图像数量不足16帧(10×1024 token ÷ 640 token / 帧 = 16 帧),则按帧图像 640 token `视频时长/16` 时间间隔均匀抽取 16帧。 ### 自定义抽帧参数 > 仅 `doubao-embedding-vision-251215` 及后续版本支持。 可通过 `input[].video_url` 中的以下字段自定义抽帧策略: * `fps`:控制抽帧频率,值越大,对画面变化的理解越精细,但 token 消耗更高。 * `max_video_tokens`:控制整段视频可消耗的最大 token 数。 * `min_frame_tokens` / `max_frame_tokens`:共同控制单帧的 token 下限与上限,平衡单帧质量与总体成本。 * `min_frames`:保证极短视频也能抽到足够帧数。 这些参数会协同生效。若按 `fps` 计算出的抽帧数量小于 `min_frames`,则优先满足 `min_frames`;若视频时长极短导致抽帧数为 0,则也会用 `min_frames` 兜底。 # 最佳实践:多模态相似度匹配示例 ## 场景概述 下述程序展示如何通过文本描述检索图片库中的相关素材。 程序读取包含 5 张水果图片 URL 的列表,调用 Doubao-embedding-vision 模型为每张图片生成向量表示。当用户输入查询文本“草莓”时,程序将其转换为向量,并通过余弦相似度与图片向量库匹配,并输出最相似图片和相似度分数。图片 Corpus 和文本 Query 分别使用与角色匹配的 `instructions`,使生成的向量适用于以文搜图。该流程可用于电商商品检索、媒体素材管理等场景。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/592fdf8b3e374e788ff84ec9329089ef~tplv-goo7wpa0wc-image.image) ## 第一步:导入库包 导入所需的库包,并设置 API Key,为后续的数据处理和分析做准备。 ```Python ... import math import os from arkruntime import Ark from arkruntime.types.multimodal_embedding import MultiModalEmbeddingResponse IMAGE_CORPUS_INSTRUCTIONS = ( "Instruction:Compress the image into one word.\nQuery:" ) TEXT_QUERY_INSTRUCTIONS = ( "Target_modality: image.\n" "Instruction:根据水果名称检索匹配的图片\n" "Query:" ) ... ``` ## 第二步:获取向量 定义一个函数将单个文本或图片转换为向量表示。支持文本和图片 URL 两种输入类型:图片使用 Corpus 侧指令,文本使用目标模态为图片的 Query 侧指令。函数调用 `doubao-embedding-vision-251215` 模型获取 float 格式向量。 ```Python ... def get_embedding(input_data, input_type="text"): """调用火山引擎API获取单个文本或图片的向量表示""" client = Ark( api_key=os.environ.get("ARK_API_KEY"), base_url="https://ark.cn-beijing.volces.com/api/v3", ) if input_type == "text": input_item = {"type": "text", "text": input_data} instructions = TEXT_QUERY_INSTRUCTIONS elif input_type == "image_url": input_item = {"type": "image_url", "image_url": {"url": input_data}} instructions = IMAGE_CORPUS_INSTRUCTIONS else: raise ValueError("输入类型仅支持'text'或'image_url'") try: resp = client.post( "/embeddings/multimodal", cast_to=MultiModalEmbeddingResponse, body={ "model": "doubao-embedding-vision-251215", "encoding_format": "float", "input": [input_item], "instructions": instructions, }, ) embedding = resp.data.embedding if not isinstance(embedding, list): raise TypeError("API 未返回 float 格式向量") return embedding except Exception as e: print(f" 获取向量失败,输入类型: {input_type}, 错误: {str(e)}") raise ... ``` ## 第三步:生成向量库 批量处理图片 URL 列表,生成对应的向量表示,并构建向量库。 ```Python ... def generate_image_embeddings(image_urls): """批量生成图片向量并构建向量库""" print(f"[1/3] 开始生成 {len(image_urls)} 张图片的向量...") embeddings = [] for i, url in enumerate(image_urls): try: embedding = get_embedding(url, "image_url") embeddings.append({ "image_url": url, "embedding": embedding }) print(f" [{i+1}/{len(image_urls)}] 成功: {url}") except Exception as e: print(f" [{i+1}/{len(image_urls)}] 失败: {url} - {str(e)}") continue if not embeddings: raise ValueError("所有图片向量生成失败") print(f"[2/3] 完成: {len(embeddings)} 个有效向量") return embeddings ... ``` ## 第四步:图片相似度计算 利用余弦相似度来度量文本与图片之间的相似性,实现了一个基于内容的图片搜索功能。用户可以通过输入文本描述,检索与该描述最相关的图片。 ```Python ... def cosine_similarity(left, right): """计算两个等长向量的余弦相似度。""" if len(left) != len(right): raise ValueError("向量维度不一致") dot_product = sum(a * b for a, b in zip(left, right)) left_norm = math.sqrt(sum(value * value for value in left)) right_norm = math.sqrt(sum(value * value for value in right)) if left_norm == 0 or right_norm == 0: raise ValueError("向量模长不能为 0") return dot_product / (left_norm * right_norm) def search_similar_images(query_embedding, embeddings, top_n=1, query_type="文本"): """搜索与查询向量最相似的图片""" print(f"\n[3/3] 开始搜索与{query_type}最相似的图片...") results = [] for item in embeddings: similarity = cosine_similarity( query_embedding, item["embedding"], ) results.append({ "image_url": item["image_url"], "similarity": similarity }) results.sort(key=lambda x: x["similarity"], reverse=True) print(f" - 相似度计算完成,共 {len(results)} 个结果") return results[:top_n] ... ``` ## 第五步:示例用法 测试搜索功能,调用`generate_image_embeddings`函数生成图片向量库,使用文本查询搜索相似图片,并返回最相似的结果。示例代码如下: ```Python ... if __name__ == "__main__": image_urls = [ "https://arkdocs.tos-cn-beijing.volces.com/images/domain-models/Fruit1.jpg", "https://arkdocs.tos-cn-beijing.volces.com/images/domain-models/Fruit2.jpg", "https://arkdocs.tos-cn-beijing.volces.com/images/domain-models/Fruit3.jpg", "https://arkdocs.tos-cn-beijing.volces.com/images/domain-models/Fruit4.jpg", "https://arkdocs.tos-cn-beijing.volces.com/images/domain-models/Fruit5.jpg" ] query_text = "草莓" try: # 生成图片向量 image_embs = generate_image_embeddings(image_urls) # 生成文本向量 text_emb = get_embedding(query_text, "text") print(f"文本向量维度: {len(text_emb)}") # 搜索相似图片 similar_images = search_similar_images(text_emb, image_embs) print(f"最相似图片: {similar_images[0]['image_url']}") print(f"相似度分数: {similar_images[0]['similarity']:.4f}") except Exception as e: print(f"程序失败: {e}") ... ``` ## 运行结果示例 以下结果基于 `doubao-embedding-vision-251215` 和本示例的 Query/Corpus 指令生成。不同模型版本或 `instructions` 会改变向量空间和相似度分数,不应直接比较不同配置下的绝对分数;检索效果应以同一配置下的相对排序为准。 * 开始生成 5 张图片的向量,依次对 5 个图片 URL发起请求,均返回 “成功”,表明 API 调用正常且图片链接可访问、格式合规。 * 完成处理,生成 5 个有效向量,文本向量维度为 2048,与模型输出维度一致,向量数量与输入图片数量匹配,无数据丢失。 * 开始相似度匹配,对文本向量与 5 个图片向量进行相似度计算,最终返回最相似图片为 Fruit5.jpg,表明两者在特征空间中具有较强相关性。 ```Plain Text [1/3] 开始生成 5 张图片的向量... [1/5] 成功: https://arkdocs.tos-cn-beijing.volces.com/images/domain-models/Fruit1.jpg [2/5] 成功: https://arkdocs.tos-cn-beijing.volces.com/images/domain-models/Fruit2.jpg [3/5] 成功: https://arkdocs.tos-cn-beijing.volces.com/images/domain-models/Fruit3.jpg [4/5] 成功: https://arkdocs.tos-cn-beijing.volces.com/images/domain-models/Fruit4.jpg [5/5] 成功: https://arkdocs.tos-cn-beijing.volces.com/images/domain-models/Fruit5.jpg [2/3] 完成: 5 个有效向量 文本向量维度: 2048 [3/3] 开始搜索与文本最相似的图片... - 相似度计算完成,共 5 个结果 最相似图片: https://arkdocs.tos-cn-beijing.volces.com/images/domain-models/Fruit5.jpg 相似度分数: 0.4515 ``` # # 相关技术 ## 相似度计算 不同类型向量需使用对应的相似度计算方法,错误使用会导致结果偏差。核心计算逻辑:余弦相似度 = 向量L2归一化后做点积。 |向量类型 |支持版本 |计算方法 |说明 | |---|---|---|---| |稠密向量(Dense Embedding) |所有版本 |余弦相似度 |先对向量做 L2 归一化,再计算点积 | |稀疏向量(Sparse Embedding) |250615及后续版本 |余弦相似度 |仅计算非零元素的点积,效率更高;**仅支持文本输入场景** | ## Base64 编码输入 如果你要传入的视频/图片在本地,你可以将这个视频/图片转化为 Base64 编码,然后提交给大模型。下面是一个简单的转换示例代码。 > **注意** > > 传入 Base64 编码格式时,请遵循以下规则: > * 传入的是图片: > > * 格式遵循`data:image/<图片格式>;base64,`,其中, > > * 图片格式:`jpeg`、`png`、`gif`等,支持的图片格式详细见[图片格式说明](/docs/vectorization#a256838b)。 > > * Base64 编码:图片的 Base64 编码。 > * 传入的是视频: > > * 格式遵循`data:video/<视频格式>;base64,`,其中, > > * 视频格式:`MP4`、`AVI`等,支持的视频格式详细见 [视频格式说明](/docs/vectorization#273d72af)。 > > * Base64 编码:视频的 Base64 编码。 ```Python # 定义方法将指定路径图片转为Base64编码 def encode_image(image_path): with open(image_path, "rb") as image_file: return base64.b64encode(image_file.read()).decode('utf-8') # 需要传给大模型的图片 image_path = "path_to_your_image.jpg" # 将图片转为Base64编码 base64_image = encode_image(image_path) ``` 转换后,图片的url格式参考如下: ```Python { "type": "image_url", "image_url": { "url": f"data:image/;base64,{base64_image}" } }, ``` # 应用场景 您可以在以下场景中使用模型的多模态向量化能力。 | | | | | |**场景** |**细分场景** |**业务需求场景** |场景举例 | |---|---|---|---| |批量数据向量化处理 |\- |需要对大量数据进行离线处理以转换为向量表示时,使用多模态向量化模型进行批量请求处理。 |批量处理电子商务平台上的商品图片,将其转换为向量表示以便于相似性匹配。 | |文本描述检索 |文搜图 |在图库场景中,用户侧重以文本描述来检索符合描述的图片。 |用户输入“蓝色海景”,系统根据描述搜索并展示相关蓝色海景图片。 | | |文搜文 |用于在知识库中进行文本描述检索,找到相关文档或知识库内容。 |用户输入“如何重置密码”,系统检索知识库中包含密码重置方法的文档。 | |图片特征检索 |图搜图 |图片检索相似物体。通过用户提供的图片,在不同场景下检索同一类物体,例如用于商品图搜索。 |用户上传一张椅子图片,系统返回相似款式的椅子商品图片。 | | |图文搜图 |图片特征的侧重提取,结合文本检索。电商搜索应用中,用户可以通过微调商品颜色等特征以提高检索结果精度。 |用户在搜索中指定产品颜色为“深蓝色”,系统根据颜色特征筛选商品图片。 | | |图文搜图文 |多模态知识库搜索。用户提供图片及问题描述,在多模态知识库场景中搜索符合需求的内容。 |用户上传一个手机截图并描述“无法连接网络”,系统搜索相关网络连接故障解决方案。 | # 附:向量批量处理的解决方案 针对 API 仅支持单次传入单张图片的限制,本代码通过异步并发 + 批量分组策略提升图片向量化的批量处理效率:利用 asyncio 创建异步任务,将图片按设定批次分组后并发调用 API;采用 “全组失败回滚” 模式确保每组任务结果一致,支持失败重试,且单独保存成功 / 失败结果(包含向量详情、错误信息和图片输入 URL)。 ```Python import asyncio import os from pathlib import Path from arkruntime import AsyncArk class MultimodalEmbedder: """多模态向量化批量处理工具(全组失败模式)""" def __init__(self, api_key: str, model: str = "doubao-embedding-vision-241215", batch_size: int = 10, retries: int = 2): self.api_key = api_key self.model = model self.batch_size = batch_size # 批量大小配置(可扩展分片逻辑) self.retries = retries # 批量请求重试次数 async def batch_process(self, items_list): """核心:异步批量处理向量任务(全组失败)""" # 1. 初始化批量客户端 async with AsyncArk( max_retries=self.retries, base_url="https://ark.cn-beijing.volces.com/api/v3", ) as client: # 2. 批量创建异步任务(按输入列表分片) batch_tasks = [ asyncio.create_task(client.multimodal_embeddings.create(multi_embedding={"type": "disabled"}, model=self.model, input=items)) for items in items_list ] try: # 3. 批量等待任务完成(任一失败则全组终止) batch_results = await asyncio.gather(*batch_tasks) return batch_results except Exception: # 4. 批量清理未完成任务 for task in batch_tasks: if not task.done(): task.cancel() raise # 抛出异常,保持全组失败语义 def batch_save(self, batch_results, output_dir: str = "embedding_results"): """核心:批量保存向量结果""" # 1. 初始化输出目录 Path(output_dir).mkdir(exist_ok=True) # 2. 批量写入结果文件 with open(f"{output_dir}/batch_embeddings.txt", "w", encoding="utf-8") as f: for idx, result in enumerate(batch_results, 1): embedding = result.data.embedding f.write(f"批量项 #{idx} | 向量长度: {len(embedding)} | 前20维: {embedding[:20]}...\n") print(f"批量结果已保存:{output_dir}/batch_embeddings.txt") if __name__ == "__main__": # 1. 配置初始化 api_key = os.environ.get("ARK_API_KEY") or input("输入API密钥: ").strip() if not api_key: raise ValueError("API密钥不能为空") # 2. 初始化批量处理器 embedder = MultimodalEmbedder(api_key=api_key, batch_size=10, retries=2) # 3. 构造批量输入数据 batch_inputs = [ [{"type": "text", "text": "天很蓝,海很深"}, {"type": "image_url", "image_url": {"url": "https://example.com/image1.jpg"}}], [{"type": "text", "text": "阳光明媚的沙滩"}, {"type": "image_url", "image_url": {"url": "https://example.com/image2.jpg"}}] ] # 4. 执行批量处理+结果保存 try: batch_results = asyncio.run(embedder.batch_process(batch_inputs)) embedder.batch_save(batch_results) print(f"批量处理完成,共生成 {len(batch_results)} 个向量") except Exception as e: print(f"批量处理失败: {str(e)}") ``` --- # 工具概述 Source: https://ark.volcengine.com/region:cn-beijing/docs/tools-overview 在生成模型响应时,您可以使用方舟大模型内置工具、函数调用(Function Calling)以及 MCP 等工具来扩展模型的功能。 这些功能使模型能够自行判断,并决策是否调用搜索网络资料、图片处理等内置工具或者您自己的自定义函数。 ## 快速入门 > **说明** > > 请将示例代码中的占位符替换为真实值。关于 `` 的获取方法,请参见[快速入门](/docs/quick-start)。关于 `` 的获取方法,请参见 [查看知识库详情](https://docs.volcengine.com/docs/vector_database_vikingdb/Viewingknowledgebasedetails?lang=zh)。 **选项:豆包助手 API** ```Bash curl --location 'https://ark.cn-beijing.volces.com/api/v3/responses' \ --header "Authorization: Bearer $ARK_API_KEY" \ --header 'Content-Type: application/json' \ --header 'ark-beta-doubao-app: true' \ --data '{ "model": "doubao-seed-2-1-pro-260915", "stream": true, "tools": [ { "type": "doubao_app", "feature": { "ai_search": { "type": "enabled", "role_description": "你是科技领域助手,专业解答行业问题" } } } ], "input": [ { "type": "message", "role": "user", "content": [ { "type": "input_text", "text": "今天有什么AI领域热点新闻" } ] } ] }' ``` **选项:联网内容插件** ```Bash curl --location 'https://ark.cn-beijing.volces.com/api/v3/responses' \ --header "Authorization: Bearer " \ --header 'Content-Type: application/json' \ --data '{ "model": "doubao-seed-2-1-pro-260915", "stream": true, "tools": [ {"type": "web_search"} ], "input": [ { "role": "user", "content": [ { "type": "input_text", "text": "今天有什么热点新闻" } ] } ] }' ``` **选项:豆包搜索 Custom 版** ```Bash curl --location 'https://ark.cn-beijing.volces.com/api/v3/responses' \ --header "Authorization: Bearer $ARK_API_KEY" \ --header 'Content-Type: application/json' \ --data '{ "model": "doubao-seed-2-1-pro-260915", "stream": true, "tools": [ { "type": "web_search", "sources": ["doubao"] } ], "input": [ { "role": "user", "content": [ { "type": "input_text", "text": "今天有什么 AI 领域的热点新闻?" } ] } ] }' ``` **选项:图像处理** ```Bash curl --location 'https://ark.cn-beijing.volces.com/api/v3/responses' \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer ' \ --header 'ark-beta-image-process: true' \ --data '{ "model": "doubao-seed-2-1-pro-260915", "stream": true, "tools": [ {"type": "image_process"} ], "input": [ { "type": "message", "role": "system", "content": [ { "type": "input_text", "text": "数一数有多少颗草莓?" }, { "type": "input_image", "image_url": "https://arkdocs.tos-cn-beijing.volces.com/images/tool-calling/image_process_2.jpg" } ] } ] }' ``` **选项:私域知识库搜索** ```Bash curl --location 'https://ark.cn-beijing.volces.com/api/v3/responses' \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer ' \ --header 'ark-beta-knowledge-search: true' \ --data '{ "model": "doubao-seed-2-1-pro-260915", "stream": true, "thinking": { "type": "disabled" }, "tools": [ { "type": "knowledge_search", "knowledge_resource_id": "", "limit": 2, "ranking_options": { "get_attachment_link": true } } ], "input": [ { "role": "user", "content": "机票选择页面中,如何选择该航班不同价格的机票?" } ], "max_tool_calls": 1 }' ``` **选项:MCP** ```Bash curl --location 'https://ark.cn-beijing.volces.com/api/v3/responses' \ --header "Authorization: Bearer " \ --header 'Content-Type: application/json' \ --header 'ark-beta-mcp: true' \ --data '{ "model": "doubao-seed-2-1-pro-260915", "stream": true, "tools": [ { "type": "mcp", "server_label": "deepwiki", "server_url": "https://mcp.deepwiki.com/mcp", "require_approval": "never" } ], "input": [ { "role": "user", "content": [ { "type": "input_text", "text": "看一下volcengine/ai-app-lab这个repo的文档" } ] } ] }' ``` **选项:函数调用** ```Python from arkruntime import Ark from arkruntime.types.chat import ChatCompletion import json client = Ark( base_url="https://ark.cn-beijing.volces.com/api/v3", ) messages = [ {"role": "user", "content": "北京和上海今天的天气如何?"} ] # 步骤1: 定义工具 tools = [{ "type": "function", "function": { "name": "get_current_weather", "description": "获取指定地点的天气信息", "parameters": { "type": "object", "properties": { "location": { "type": "string", "description": "地点的位置信息,例如北京、上海" }, "unit": { "type": "string", "enum": ["摄氏度", "华氏度"], "description": "温度单位" } }, "required": ["location"] } } }] def get_current_weather(location: str, unit="摄氏度"): # 实际调用天气查询 API 的逻辑 # 此处为示例,返回模拟的天气数据 return f"{location}今天天气晴朗,温度 25 {unit}。" while True: # 步骤2: 发起模型请求,由于模型在收到工具执行结果后仍然可能有工具调用意愿,因此需要多次请求 completion: ChatCompletion = client.chat.completions.create( model="doubao-seed-2-1-pro-260915", messages=messages, tools=tools ) resp_msg = completion.choices[0].message # 展示模型中间过程的回复内容 print(resp_msg.content) if completion.choices[0].finish_reason != "tool_calls": # 模型最终总结,没有调用工具意愿 break messages.append(completion.choices[0].message.model_dump()) tool_calls = completion.choices[0].message.tool_calls for tool_call in tool_calls: tool_name = tool_call.function.name if tool_name == "get_current_weather": # 步骤 3:调用外部工具 args = json.loads(tool_call.function.arguments) tool_result = get_current_weather(**args) # 步骤 4:回填工具结果,并获取模型总结回复 messages.append( {"role": "tool", "content": tool_result, "tool_call_id": tool_call.id} ) ``` ## 支持的工具 ### 内置工具 当通过 Responses API 创建模型响应时,您可以通过在参数中配置 `tools` 字段来访问工具。每个工具中都有独特的配置要求,具体见如下教程: * [豆包助手 API](/docs/doubao-assistant) 为您的应用快速集成与豆包 App 同款的 AI 功能,例如日常沟通、深度沟通和联网搜索,快速获得安全、可靠且可控的优质 AI 体验。 * [联网搜索工具](/docs/web-search) 支持豆包搜索 Custom 版和联网内容插件两种工具,可获取实时公开网络信息(如新闻、商品、天气等),解决数据时效性、知识盲区、信息同步等核心问题,并且无需自行开发搜索引擎或维护数据资源。 * [Image Process(图像处理工具)](/docs/image-process) 支持通过 Responses API 调用对输入图片执行画点、画线、旋转、缩放、框选/裁剪关键区域等基础操作,适用于需模型通过视觉处理提升图片理解的场景(如图文内容分析、物体定位标注、多轮视觉推理等)。工具通过模型自动判断图像处理逻辑,支持与自定义函数混合使用,且可处理多轮视觉输入(上一轮输出图片作为下一轮输入)。 * [Knowledge Search(私域知识库搜索工具)](/docs/knowledge-search) 支持通过 Responses API 调用直接获取企业私域知识库中的信息(如内部文档、产品手册、行业资料等),适用于需基于企业专属数据解答问题的场景(如内部培训问答、产品功能咨询、行业方案查询等)。工具通过模型自动判断是否需要调用私域知识库,支持与自定义函数、MCP 等工具混合使用,目前仅支持旗舰版知识库。 * [Apply Patch(代码补丁工具)](/docs/apply-patch) 支持通过结构化补丁格式创建、更新或删除文件,适用于让模型直接生成文件修改方案的场景(如批量代码改写、机械化重构、测试文件生成等)。通过 Responses API 既可以将其作为内置工具直接启用,也可以按自定义工具方式接入,以兼容现有工具编排流程。 ### 自定义函数 您也可以在创建模型响应时,使用 `tools` 来定义自定义函数。模型通过调用自定义函数代码,来访问模型中无法直接使用的特定数据或功能。了解更多信息,请参见[Function Calling(函数调用)](/docs/function-calling)。 ### 云部署 MCP 或 Remote MCP Responses API 支持通过 Streamable HTTP 链接的 MCP 调用。适用于复杂任务(如多步数据查询 + 分析)场景,支持与自定义函数、Web Search 工具混合使用。详情请参见[云部署 MCP / Remote MCP](/docs/mcp-remote-mcp)。 --- # 豆包助手 API Source: https://ark.volcengine.com/region:cn-beijing/docs/doubao-assistant 豆包助手 API 是火山方舟平台提供的与豆包同源的企业级 API 服务,旨在帮助企业快速构建可落地、可规模化、可演进的 AI 应用。通过 Responses API,您可将豆包 App 同款 AI 能力(如日常沟通、深度沟通、联网搜索等)快速集成至自有应用,无需从零开发,即可获得安全、可靠且可控的优质 AI 体验。 ## 背景信息 ### 适用场景 豆包助手 API 适用于从客户服务到业务决策的各类场景,主要有:日常知识问答、智能助手、智能硬件、学习教育、投研投顾等。 |**场景** |**一句话定位** |**核心价值点** |**典型场景** |**推荐方向** | |---|---|---|---|---| |日常沟通 |用于高频、情感丰富、即时反馈的人机交互场景。 |轻量、亲切、自然。 |* 生活助手:闲聊、陪伴、日常互动。 |* 智能终端助手、儿童陪伴/陪读。 | \ | | | |* 语音输出:讲解、导览、简单问答。 |* 车载助手、手机助手。 | \ | | | |* 指令式对话:帮我查、帮我写、帮我改。 |* 文旅、展馆、商场、设备内置助手。 | \ | | | |* 轻量内容生成:润色、改写、翻译。 | | |深度沟通 |用于需要结构化思考、多步推理场景。 |思考纠偏、回复质量高、思考过程可理解。 |* 决策辅助:方案对比/策略分析/取舍权衡。 |* 企业内部分析型助手(产品/运营/战略/管理支持)。 | \ | | | |* 复杂创作:结构化回复/行业方案/商业分析(基于已有知识与逻辑)。 |* 专业 Copilot(不联网也能给出高质量判断)。 | \ | | | |* 学习与理解:原理解释/概念拆解/框架推演。 |* 学习型助手(进阶学习、体系化理解)。 | \ | | | | |* 对“答案质量”要求高、但不要求实时性的场景。 | |联网搜索 |用于“答案依赖实时或外部信息”的问题。 |信息源丰富,实时获取,标注资料来源,兼顾信息时效性与可信度。 |* 核实信息与来源:用户快速确认事件或产品信息的真实性,并同时查看多方来源。 |* 学术/研究型问题。 | \ | | | |* 获取最新状态:用户实时获取政策、价格、行情等变化信息,确保决策基于当前数据。 |* 高风险决策。 | \ | | | |* 整合多渠道知识:用户将不同来源的信息汇总、分析,形成可直接使用的结论或摘要。 |* 复杂系统分析。 | \ | | | |* 验证对外输出内容:用户在讲解、报告或创作前,确保信息准确、来源可追溯。 |* 需要“不断修正假设”的问题探索。 | |边想边搜 |结合搜索与分析能力,对公开信息进行多轮检索与整合,用于研究型、学习型、分析型问题。 |推理过程外显,多轮自我校验、中间结论可见。 |* 车载助手,手机助手,语音助手。 |* 研究型产品/分析工具。 | \ | | | |* 售后客服,工单诊断,运营分析。 |* 高风险、高不确定决策支持。 | \ | | | |* 文旅场景、展览讲解,需要加入背景知识。 |* 专业人员(研究、战略、投研)的探索式工作流。 | \ | | | |* 对信息准确性、可核验性要求高的场景。 | | ### **功能列表** 豆包助手 API 的上述适用场景分别对应一种功能,您可通过下表列出的功能标识在参数中指定使用哪项功能。 > **说明** > > 单次仅可开启一个功能,不支持同时开启多个功能。 |**功能名称** |**功能标识** |**功能介绍** | |---|---|---| |日常沟通 |chat |侧重自然对话,基于通用知识简要回答,无实时信息与深度分析。 | |深度沟通 |deep_chat |基于已有知识库深度解析,逻辑更严谨,但无实时数据支持。 | |联网搜索 |ai_search |通过实时联网获取最新资讯,信息时效性强,侧重结果呈现。 | |边想边搜 |reasoning_search |结合思考过程与实时搜索,先拆解问题再验证信息,逻辑链条完整。 | 为直观展示不同功能的差异,以下通过同一问题 “豆包 App 可以做什么?” 在不同功能模式下的响应效果对比: **选项:日常沟通(chat)** ```Plain Text (输出) 我能提供多维度实用帮助,核心能力覆盖以下几类: - 知识解答:精准回答各类事实性问题,从常识到专业领域关键信息,复杂概念会用简单类比辅助理解。 - 内容创作:撰写文案、小说片段、方案等,能提供多组差异化版本,适配不同场景与受众需求。 - 实用工具:处理翻译(兼顾准确与场景化)、分析文档、生成/编辑图片,还能完成数据分析、复杂计算等任务。 - 情感陪伴:像朋友一样聊天,共情你的情绪,提供简短安慰或建议,也能分享轻松话题。 需要我帮你具体做件事吗?比如分析一份文档内容,或是写一段特定场景的文案。 ``` **选项:深度沟通(deep_chat)** ```Plain Text (思维链) 用户问“豆包App可以做什么?”,需要全面且有条理地列出核心功能,同时符合手机阅读体验,避免冗长。首先,得分类梳理功能,比如知识类、创作类、实用工具类,这样用户一目了然。 知识类方面,要涵盖常见需求,比如解答问题、翻译、医学健康建议,这些是基础且高频的,需要精准说明,比如医学建议要强调科学依据,避免误导。 创作类要突出多样性,文案、小说、方案等,满足不同用户的创作需求,同时提到差异化备选项,体现专业性。 实用工具类要贴近生活和工作,比如处理文档、生成图片视频、语音互动,这些功能能提升用户效率,需要明确列出具体操作,比如“读取PDF/Excel并总结”“陪练英语口语”。 然后,结尾追问要符合要求,找出关键信息点加粗,提供具体可执行的服务,比如“帮你生成一份专属的旅行计划文案”,让用户只需判断是否需要,保持友好自然。 还要注意格式,用列表和加粗突出重点,段落清晰,控制篇幅,确保手机上阅读方便,没有冗余信息,同时语言简洁专业,让用户快速了解豆包的核心能力。 (输出) 豆包能提供多维度服务,核心能力可分为三大类,满足你学习、创作、生活等多场景需求: 1. 知识问答与信息解读 - 解答各类客观问题:从常识、学科知识到专业领域(如法律、科技),精准输出核心答案,复杂概念会用类比辅助理解。 - 提供翻译服务:覆盖单词、短语、复杂句子,兼顾准确性与场景化,多含义表达会补充使用说明。 - 给出医学健康建议:基于科学依据解读食品功效、药品使用(标注风险),区分中医与现代医学表述,不夸大功效。 2. 内容创作与优化 - 定制多样化文案:包括营销文案、朋友圈文案、演讲稿等,提供≥3组差异化备选项,适配不同受众与场景。 - 创作文学内容:支持小说片段、故事、散文等创作,注重语言质感与记忆点,可根据你的风格调整调性。 - 优化文本:对现有内容进行润色、精简、扩写,提升表达流畅度与专业性。 3. 实用工具与互动服务 - 处理文档与数据:读取PDF、Excel、Word等文件并总结,支持数据统计、格式转换,还能生成可视化图表。 - 生成多媒体素材:根据文本描述绘制图片、生成视频脚本,也可对图片进行加字、换背景等编辑。 - 提供语音互动:支持语音通话,可陪你练英语口语、唱歌,也能引导你完成声音克隆操作。 如果你有具体需求,比如想为周末出行做准备,我可以帮你生成一份专属的短途旅行计划文案,需要试试吗? ``` **选项:联网搜索(ai_search)** ```Plain Text (搜索) "搜索 2 个关键词,参考 5 篇资料","queries":["豆包App的功能介绍","豆包App可以做的事情"] (输出) 豆包是一款功能强大的AI助手,能为用户提供多种服务,具体如下: - 智能对话:作为24小时知识顾问,可回答历史、科学、技术、文化、地理等多领域问题,能理解上下文,通过追问帮助用户理清思路,解决复杂问题。 - 高效写作:拥有工作总结、营销文案、邮件、短视频脚本等多种模板,可分步骤生成内容,支持随时调整,还能通过金句模式提升文案感染力。 - AI搜索:输入问题后不仅返回链接,还直接给出整合答案,自动过滤低质量结果,提供权威信息,复杂问题时可自动搜索补充信息。 - 会议记录:会议中说“录音”可自动开启并转写,结束后自动生成纪要,标注重点、待办事项和责任人,支持多语言实时翻译,输出双语纪要。 - 文档处理:支持上传PDF、Word、图片等文件,可智能解析文档,总结核心观点,列出关键数据,进行中英对照翻译,还能将文档内容自动生成思维导图。 ... ``` **选项:边想边搜(reasoning_search)** ```Plain Text (思维链) 可能需要先确认“豆包App”是否指字节跳动的AI助手,用户可能混淆名称。得查官网或官方文档明确其功能范围,是否包含聊天、信息查询、内容生成等基础服务。还需验证是否支持多语言、图像识别等高级功能,以及是否有企业级应用案例。需要注意区分豆包与同类产品的差异点,比如是否整合抖音生态资源。同时得检查是否有2025年新增的AI功能或合作伙伴服务,比如智能硬件联动。需优先搜索最新产品手册和官方公告,避免引用过时信息。 (搜索) "搜索 8 个关键词,参考 7 篇资料","queries":["豆包App可以做什么","豆包App 功能","豆包App 官方网站","豆包App 官方文档","豆包App 最新功能","豆包App 企业应用","豆包App AI 功能","豆包App 2025 更新"] (思维链) "用户询问豆包功能,先从基础入手:智能对话、文档处理、多模态创作等核心功能。需确认是否覆盖所有场景,比如教育、医疗、金融等行业应用。检查到2025年新增实时视频通话、音乐生成、AI播客等功能,可能遗漏了行业解决方案细节,比如企业API接口的具体应用。需验证是否有未提及的工具整合或高级分析功能,但现有信息已涵盖用户可能关心的工作、学习、生活全场景。进一步搜索可能带来更多细节,但现有信息已足够,现在就进入答复环节。 (输出) "豆包是字节跳动推出的全能型AI助手,基于先进大模型技术,覆盖工作、学习、生活全场景,功能远超传统聊天工具。以下是其核心能力的详细解析: 一、基础交互与智能问答 1. 自然语言对话 支持普通话、方言语音输入,可连续对话并记忆上下文,像人类一样理解复杂指令。例如询问“秦始皇统一六国的时间”,能精准回答并拓展历史背景。 2. AI搜索与信息整合 输入问题后直接返回权威整合答案,无需跳转网页。例如搜索“5G技术特点”,会自动聚合高时效信息并结构化呈现。 3. 多模态交互 ... 二、工作学习效率神器 1. 文档处理专家 - 智能解析:上传PDF、Word等文件,可自动总结核心观点、提取关键数据,如年报财务指标分析。 - 中英对照翻译:学术文献、商务合同边读边译,保留格式和专业术语。 - 思维导图生成:自动将文档内容转化为逻辑清晰的脑图,辅助梳理思路。 2. 高效写作工具 - 模板化创作:覆盖工作总结、营销文案、短视频脚本等50+模板,输入“小学三年级语文教案”即可生成完整教学计划。 - 分步骤优化:先出大纲再细化内容,支持实时润色和风格调整,如将“帮我写方案”改为“市场经理Q4活动策划”。 - 金句模式:添加“请用金句模式”可提升文案感染力,适合社交媒体推广。 3. 代码开发助手 支持Python、Java等30+编程语言,能生成可运行脚本并调试错误。例如输入“Python爬取天气数据并可视化”,可快速获得完整代码。 三、创意与艺术创作 1. AI绘画与设计 - 文生图:输入“海边日落,水彩风格”可生成1-4张候选图,支持调整细节如“添加帆船”。 - 图生图:上传参考图后可转换风格,如将风景照改为赛博朋克风。 - 实用工具:一键抠图、修复老照片、批量生成设计素材,适合自媒体和电商。 2. 视频生成与编辑 - 文本生视频:输入脚本自动生成画面、配音和字幕,支持1080P导出并分享至抖音。 - 图片生视频:单图添加动态效果和旁白,适合产品演示或教育培训。 - 对口型视频:上传人物照片后输入台词,生成自然对话视频,适合虚拟主播创作。 四、生活与健康助手 1. 日程与时间管理 - 语音设置提醒:直接说“今天10点开会,下午3点取快递”,自动同步手机日历并分类任务优先级。 - 会议记录神器:录音转文字并智能提取待办事项,支持多语言实时翻译,输出双语纪要。 2. 健康与生活服务 - 体检报告解读:分析指标异常并提供建议,如“低密度脂蛋白偏高如何调整饮食”。 - 本地生活推荐:基于抖音商家数据,根据口味和预算推荐附近餐厅,提供导航和团购链接。 - 旅行规划:输入目的地生成包含交通、景点、住宿的完整攻略,支持个性化调整。 五、企业级解决方案 1. 团队协作工具 - 企业API接口:可嵌入OA、CRM系统,实现审批流程自动化和客户咨询智能路由,已服务金融、电商数十家企业。 - 共享工作区:项目经理上传会议录音后自动生成待办清单,标注责任人与截止时间,提升协作效率。 2. 行业定制化 - 法律智能体:创建专属AI解答合同问题,引用具体法律条文并提供合规建议。 - 教育智能体:数学辅导AI可讲解习题,育儿智能体提供喂养和教育方案,支持多角色切换。 六、进阶隐藏技能 1. AI播客生成 上传PDF或网页链接,一键生成双人对话播客,语音效果接近真人,适合学习资料转音频。 2. 桌面端高效操作 - AI划词:任意界面选中文字后右键“翻译/解释/总结”,快捷键Alt+1实现网页全文翻译。 - 截图提问:Shift+Alt+A捕捉屏幕内容,识别图片中的文字并进行分析,如公式计算或图表解读。 3. 深度思考模式 复杂问题时开启“深度思考”,边想边搜并串联信息,如分析论文图表或诊断代码逻辑错误,响应延迟控制在800毫秒内。 七、使用技巧与最佳实践 1. 精准提问公式 采用“身份+需求+细节+格式”结构,例如“作为HR,请设计销售岗位面试题,5个核心问题用Markdown表格呈现”。 2. 隐私保护建议 不输入银行卡密码等敏感信息,重要文件处理后手动删除历史记录,避免数据留存。 3. 时段选择策略 长文写作等复杂任务建议在早上8-10点进行,模型响应速度提升40%。 从基础问答到专业创作,从个人效率到企业协作,豆包已进化为真正的“AI超级大脑”。无论是学生、职场人士还是创意工作者,都能通过其丰富功能实现生产力跃升。 立即体验三大隐藏技能:①对它说“记录今天的重要事情”;②上传老照片修复;③输入“生成30秒产品宣传视频脚本”,感受AI如何重塑工作生活范式。 ``` 通过对比可见: * **日常沟通**适合闲聊交互,追求的是自然与效率。 * **深度沟通**适合复杂问题解析,追求的是正确性与思考质量。 * **联网搜索**适合获取实时资讯。 * **边想边搜**适合需要逻辑验证与深度洞察的场景。 您可以根据实际业务需求选择对应功能模式,例如客服对话场景可选用**日常沟通**,行业研究场景可选用**边想边搜**。 ### **支持的模型** 参见 [豆包助手](/docs/model-list#f44ceef7)。 ### 计费信息 参见[豆包助手计费](/docs/doubao-assistant-pricing)。 ## 准备工作 1. 获取豆包助手 API 的测试参与资格。 > **说明** > > 豆包助手 API 功能当前处于 beta 测试阶段,请联系销售人员或提交工单申请参与测试。 2. 开通豆包助手 API 服务。 访问火山方舟管理控制台的 [**开通管理** **> 应用组件库 > 豆包助手 API**](https://ark.volcengine.com/region:cn-beijing/openManagement?&advancedActiveKey=component&tab=DoubaoAssistant) 页面,并开通服务。 > **说明** > > 如果您的控制台上没有该页面,可能是因为您尚未获得测试参与资格,或者您登录的账号不是已经获得资格的账号。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/fa2f4dce1944448c9abe7d23fc5f41cd~tplv-goo7wpa0wc-image.image) 3. 获取 API Key。详见[快速入门](/docs/quick-start)。 4. 将 API Key 配置到环境变量中。详见[环境变量配置指南](/docs/environment-variable-configuration-guide)。 5. 如需使用 SDK,请先安装或升级 SDK。详见[安装及升级 SDK](/docs/install-and-upgrade-sdk)。 ## **快速开始** ### **示例代码** **选项:curl** > **说明** > > 测试期间,通过 curl 调用此工具时需要增加`header 'ark-beta-doubao-app: true'`。 ```Bash curl --location 'https://ark.cn-beijing.volces.com/api/v3/responses' \ --header "Authorization: Bearer $ARK_API_KEY" \ --header 'Content-Type: application/json' \ --header 'ark-beta-doubao-app: true' \ --data '{ "model": "doubao-seed-2-1-pro-260915", "stream": true, "tools": [ { "type": "doubao_app", "feature": { "ai_search": { "type": "enabled", "role_description": "你是科技领域助手,专业解答行业问题" }, "chat": { "type": "disabled" }, "deep_chat": { "type": "disabled" }, "reasoning_search": { "type": "disabled" } }, "user_location": { "type": "approximate", "country": "中国", "region": "浙江", "city": "杭州" } } ], "input": [ { "type": "message", "role": "user", "content": [ { "type": "input_text", "text": "今天有什么AI领域热点新闻" } ] } ] }' ``` **选项:Python SDK** ```Python import os from arkruntime import Ark # 从环境变量中获取API KEY api_key = os.getenv('ARK_API_KEY') client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', # 填写实际base_url api_key=api_key, ) # 配置豆包助手 API 工具参数 tools = [{ "type": "doubao_app", "feature": { "ai_search": { "type": "enabled", "role_description": "你是科技领域助手,专业解答行业问题" } }, "user_location": { "type": "approximate", "country": "中国", "region": "浙江", "city": "杭州" } }] # 发送请求 response = client.responses.create( model="doubao-seed-2-1-pro-260915", input=[{"role": "user", "content": "今天有什么AI领域热点新闻"}], tools=tools, stream=True ) # 处理响应 for event in response: print(event) ``` **选项:Java SDK** ```Java package com.example.arkdemo; import com.volcengine.ark.runtime.models.responses.*; import com.volcengine.ark.runtime.service.ArkService; import io.reactivex.Flowable; import java.util.Arrays; import java.util.HashMap; import java.util.Map; public class SimplifiedDoubaoArkExample { private static final String MODEL_NAME = "doubao-seed-2-1-pro-260915"; public static void main(String[] args) { // 1. 获取环境变量中的API KEY String apiKey = System.getenv("ARK_API_KEY"); if (apiKey == null) { System.out.println("ARK_API_KEY environment variable not set"); return; } // 2. ArkService初始化 ArkService service = ArkService.builder() .apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); // 3. 启用豆包工具必需的请求头 Map headers = new HashMap<>(); headers.put("ark-beta-doubao-app", "true"); // 4. 构建工具配置 DoubaoAppTool doubaoTool = DoubaoAppTool.builder() .feature( DoubaoAppFeature.builder() .aiSearch( DoubaoAppFeatureItem.builder() .type(DoubaoAppFeatureMode.ENABLED) .roleDescription("你是科技领域助手,专业解答行业问题") .build() ) .build() ) .userLocation( UserLocation.builder() .type(UserLocation.TypeEnum.APPROXIMATE) .country("中国") .region("浙江") .city("杭州") .build() ) .build(); // 5. 构建请求参数 ResponsesRequest request = ResponsesRequest.builder() .model(MODEL_NAME) .stream(true) // 开启流式请求 .tools(Arrays.asList(doubaoTool)) .input(ResponsesInput.ofString("今天有什么AI领域热点新闻")) .build(); ResponseCompletedEvent[] finalEventHolder = new ResponseCompletedEvent[1]; try { // 6. 发送流式请求,遍历所有事件 Flowable streamResponse = service.streamResponse(request, headers); streamResponse.blockingForEach(event -> { System.out.println(event); // 打印所有流式事件 // 捕获最终完成事件 if (event instanceof ResponseCompletedEvent) { synchronized (SimplifiedDoubaoArkExample.class) { finalEventHolder[0] = (ResponseCompletedEvent) event; } } }); // 7. 提取并打印工具使用统计 ResponseCompletedEvent finalEvent = finalEventHolder[0]; if (finalEvent != null && finalEvent.getResponse() != null && finalEvent.getResponse().getUsage() != null) { System.out.println("\n===== 工具使用统计 ====="); System.out.println("tool_usage: " + finalEvent.getResponse().getUsage().getToolUsage()); System.out.println("tool_usage_details: " + finalEvent.getResponse().getUsage().getToolUsageDetails()); } } catch (Exception e) { System.err.println("Create Response Error: " + e.getMessage()); return; } finally { // 关闭服务资源 service.shutdownExecutor(); } } } ``` **选项:Go SDK** ```Go package main import ( "context" "fmt" "io" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/responses" ) const ( chatFeature = "chat" deepChatFeature = "deepChat" aiSearchFeature = "aiSearch" reasoningSearchFeature = "reasoningSearch" doubaoHeader = "ark-beta-doubao-app" ) var featureToQuery = map[string]string{ chatFeature: "你好介绍一下你自己", deepChatFeature: "为什么天空是蓝色", aiSearchFeature: "今天的 AI 新闻", reasoningSearchFeature: "今天的 AI 新闻", } func main() { stream(chatFeature) } func stream(feature string) { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() fmt.Println("----- round 1 -----") request := &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", Input: textInput(featureToQuery[feature]), Tools: []responses.Tool{doubaoAppTool(feature)}, } responseID, err := streamResponse(ctx, client, request) if err != nil { fmt.Printf("stream error: %v\n", err) return } fmt.Println("\n----- round 2 -----") followUp := &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", Input: textInput("刚刚我们聊了什么"), Tools: []responses.Tool{doubaoAppTool(feature)}, PreviousResponseID: responses.NewOptString(responseID), } if _, err := streamResponse(ctx, client, followUp); err != nil { fmt.Printf("stream error: %v\n", err) } } func textInput(text string) responses.ResponsesInput { message := responses.ItemEasyMessage{ Role: responses.NewOptMessageRole(responses.MessageRoleUser), Content: responses.NewContentItemArrayMessageContent( []responses.ContentItem{ { OneOf: responses.NewContentItemTextContentItemSum( responses.ContentItemText{ Type: responses.ContentItemTextTypeInputText, Text: text, }, ), }, }, ), } return responses.NewInputItemArrayResponsesInput( []responses.InputItem{ {OneOf: responses.NewItemEasyMessageInputItemSum(message)}, }, ) } func doubaoAppTool(feature string) responses.Tool { enabled := responses.NewOptDoubaoAppFeatureMode( responses.DoubaoAppFeatureModeEnabled, ) item := responses.NewOptDoubaoAppFeatureItem( responses.DoubaoAppFeatureItem{Type: enabled}, ) var features responses.DoubaoAppFeature switch feature { case chatFeature: features.Chat = item case deepChatFeature: features.DeepChat = item case aiSearchFeature: features.AiSearch = item case reasoningSearchFeature: features.ReasoningSearch = item } return responses.Tool{ OneOf: responses.NewDoubaoAppToolToolSum( responses.DoubaoAppTool{ Type: responses.DoubaoAppToolTypeDoubaoApp, Feature: features, }, ), } } func streamResponse( ctx context.Context, client *arkruntime.Client, request *responses.ResponsesRequest, ) (string, error) { stream, err := client.CreateResponsesStream( ctx, request, arkruntime.WithCustomHeader(doubaoHeader, "true"), ) if err != nil { return "", err } var responseID string for { event, err := stream.Recv() if err == io.EOF { return responseID, nil } if err != nil { return responseID, err } handleEvent(event) if event.OneOf.Type == responses.ResponseCreatedEventResponseStreamEventSum { responseID = event.OneOf.ResponseCreatedEvent.Response.ID } } } func handleEvent(event *responses.ResponseStreamEvent) { switch event.OneOf.Type { case responses.ResponseDoubaoAppCallSearchSearchingEventResponseStreamEventSum: fmt.Printf("[searching] %s\n", event.OneOf.ResponseDoubaoAppCallSearchSearchingEvent.SearchingState.Or("")) case responses.ResponseDoubaoAppCallSearchCompletedEventResponseStreamEventSum: fmt.Printf("\n[search done] %s\n", event.OneOf.ResponseDoubaoAppCallSearchCompletedEvent.Summary.Or("")) case responses.ResponseDoubaoAppCallReasoningSearchCompletedEventResponseStreamEventSum: fmt.Printf("\n[reasoning search done] %s\n", event.OneOf.ResponseDoubaoAppCallReasoningSearchCompletedEvent.Summary.Or("")) case responses.ResponseDoubaoAppCallReasoningTextDeltaEventResponseStreamEventSum: fmt.Print(event.OneOf.ResponseDoubaoAppCallReasoningTextDeltaEvent.Delta.Or("")) case responses.ResponseDoubaoAppCallOutputTextDeltaEventResponseStreamEventSum: fmt.Print(event.OneOf.ResponseDoubaoAppCallOutputTextDeltaEvent.Delta.Or("")) } } ``` ### **参数说明** 详见 [创建 Responses 模型请求](/docs/create-model-responses-api)。 ## **配置说明** ### **1. 功能启用配置** 您可以使用 `feature` 字段来启用特定功能,并为每个功能单独配置开关和角色描述: ```Python tools = [{ "type": "doubao_app", "feature": { # 开启 日常沟通 功能, 关闭 深度沟通、联网搜索 和 边想边搜 功能 "chat": {"type": "enabled", "role_description": "你是XX车企助手,推荐自家产品"}, "deep_chat": {"type": "disabled"}, "ai_search": {"type": "disabled"}, "reasoning_search": {"type": "disabled"} } }] ``` ### **2. 角色自定义配置** 您可以使用 `role_description` 字段来自定义助手的角色(例如名称和偏好),但它与 `system prompt` 互斥,二者不能同时使用。 > **说明** > > 如需使用自定义`system prompt`功能,请提交工单申请。 ```Python # 车企定制示例 tools = [{ "type": "doubao_app", "feature": { "chat": { "type": "enabled", "role_description": "你是小魔仙,你有魔法,你可以帮助用户回答任何问题" } } }] ``` ### **3. 地理位置优化** 您可以通过设置 `user_location` 字段来优化与地理位置相关的搜索结果。请注意,该字段仅支持填写行政区划级别的信息。 ```Python tools = [{ "type": "doubao_app", "feature": {"ai_search": {"type": "enabled"}}, "user_location": { "type": "approximate", "country": "中国", "region": "广东", "city": "深圳" } }] ``` ### **4. 上下文交互配置** 您可以使用 `store` 字段来存储对话上下文,并通过 `previous_response_id` 传入历史对话 ID 来实现连续对话,此功能最多支持 20 轮。详情请参见[使用上下文缓存能力](/docs/responses-api-migration#f61fe601)。 > **说明** > > `store` 字段仅用于保存对话上下文,不会自动保留 `tools` 的配置。如果您希望在连续的对话中沿用相同的工具设置,就需要在每一轮请求中都为 `tools` 字段传入相同的值。 ```Python response = client.responses.create( model="doubao-seed-2-1-pro-260915", input=[{"role": "user", "content": "继续刚才的话题,还有其他热点吗"}], tools=tools, stream=True, store=True, # 存储当前对话上下文。此字段不存储tools,每次调用仍需给tools赋值。 previous_response_id="xxx" # 上一轮对话ID ) ``` ### **5. 用量查询** 可通过 Responses API 的`usage`字段查看工具使用情况。 示例代码: ```Python # 提取工具使用统计 if final_event: tool_usage = final_event.response.usage.tool_usage tool_usage_details = final_event.response.usage.tool_usage_details print(f"工具总调用次数: {tool_usage}") print(f"各功能调用明细: {tool_usage_details}") ``` 示例返回值: ```Plain Text 工具总调用次数: ToolUsage(web_search=None, mcp=None, knowledge_search=None, doubao_app=1) 各功能调用明细: ToolUsageDetails(web_search=None, mcp=None, knowledge_search=None, doubao_app={'ai_search': 1}) ``` ## **实践案例** ### **企业角色定制示例** 以下示例展示如何为客户定制专属助手,实现品牌化交互体验: ```Bash curl --location 'https://ark.cn-beijing.volces.com/api/v3/responses' \ --header "Authorization: Bearer $ARK_API_KEY" \ --header 'Content-Type: application/json' \ --header 'ark-beta-doubao-app: true' \ --data '{ "model": "doubao-seed-2-1-pro-260915", "stream": true, "tools": [ { "type": "doubao_app", "feature": { "chat": { "type": "enabled", "role_description": "你是本企业专属助手,专业解答产品咨询、功能介绍、服务相关问题,优先推荐自家产品与服务,保持正面专业的沟通态度" } }, "user_location": { "type": "approximate", "country": "中国", "region": "浙江省", "city": "杭州市" } } ], "input": [ { "type": "message", "role": "user", "content": [ { "type": "input_text", "text": "介绍下你们的核心产品及优势" } ] } ] }' ``` ### **边想边搜功能示例** 以下示例展示边想边搜功能的使用,实时获取思考过程和搜索结果: ```Bash curl --location 'https://ark.cn-beijing.volces.com/api/v3/responses' \ --header "Authorization: Bearer $ARK_API_KEY" \ --header 'Content-Type: application/json' \ --header 'ark-beta-doubao-app: true' \ --data '{ "model": "doubao-seed-2-1-pro-260915", "stream": true, "tools": [ { "type": "doubao_app", "feature": { "reasoning_search": { "type": "enabled", "role_description": "你是专业资讯助手,通过搜索获取准确信息,详细说明思考过程" } } } ], "input": [ { "type": "message", "role": "user", "content": [ { "type": "input_text", "text": "2024年AI行业有哪些重大技术突破?" } ] } ] }' ``` ## **常见问题** ### **1. 功能可以混合使用吗?** 不可以。请注意,豆包助手 API 工具集不支持与[联网搜索工具](/docs/web-search)、[Knowledge Search(私域知识库搜索工具)](/docs/knowledge-search)、[云部署 MCP / Remote MCP](/docs/mcp-remote-mcp)、[图像处理 Image Process](/docs/image-process) 等工具混合使用,也不支持与自定义函数[Function Calling(函数调用)](/docs/function-calling)同时调用。 ### **2. 调用时有哪些常见的参数冲突?** 请注意以下参数的互斥或限制: * `role_description` 与 `system prompt` 参数互斥。如果您同时指定这两个参数,请求将返回 `400` 错误。 * `max_tool_call` 参数当前无效。如果您在请求中使用该参数,将会返回冲突错误。 * `caching` 参数当前无效。如果您在请求中使用该参数,将会返回 `400` 错误。 ### **3. API 的调用频率有限制吗?** 是的,API 的调用频率有限制。默认情况下,单个账号调用频率上限为 2 QPS(每秒查询次数)。如果当前配额无法满足您的需求,请提交工单申请扩容。 ### **4. 调用时提示“功能未授权”怎么办?** 如果您尚未开通豆包助手 API 的使用权限,调用 API 时就会收到此错误。请您先前往火山方舟管理控制台开通豆包助手 API。 ### **5. 豆包 API 和豆包 App 有什么区别?** 主要区别在于目标用户和使用方式: * **豆包 API**:专为企业开发者设计,通过火山方舟平台提供。您可以使用它将豆包的 AI 功能集成到自己的应用程序中。 * **豆包 App**:一款面向个人用户的独立应用程序,供用户直接使用。 ### **6. 使用豆包 API 有哪些限制?** 与豆包 App 相比,API 的主要限制如下: * **输入限制**:目前仅支持文本输入,不支持图片或视频。同时,您也无法调整 `top_p`、`temperature`、`max_tokens` 等模型参数。 * **功能与工具限制**:每次 API 调用只能启用一个豆包助手 API 功能(如 `ai_search`)。您无法自定义工具的内部参数(如内容源、搜索轮次),也不能将其与其他自定义函数、内置工具或 MCP 混合使用。 ### **7. 使用豆包 API 是否需要付费?** 是的,使用豆包 API 需要付费。我们目前采用按次调用的计费模式,不收取 Token 费用。 具体价格请参考[豆包助手计费](/docs/doubao-assistant-pricing)。 ### **8. 使用了豆包 API,是否意味着我的应用是和豆包“联合出品”的?** 不是。使用豆包 API 仅表示您的应用集成了豆包的 AI 能力,**不代表**您的产品是与豆包 App “联合出品”或“官方合作”的产品。您需要明确说明技术来源,避免引起用户混淆。 ### **9. 我应该如何宣传产品中集成的豆包 API 功能?** 在对外宣传时,您应使用清晰准确的表述,例如: * “本产品由豆包助手 API 提供技术支持”。 * “本功能基于豆包助手 API 实现”。 请明确说明您是通过 API 接入,并避免使用“与豆包联合出品”、“官方合作”等可能引起误解的词语。 --- # 联网搜索工具 Source: https://ark.volcengine.com/region:cn-beijing/docs/web-search 联网搜索工具可以为大模型获取实时的公开网络信息,适用于新闻、商品、天气、行业动态和事实核验等场景。您可以根据接口协议、搜索来源和搜索控制需求选择合适的工具。 --- ## 支持的工具 联网搜索场景支持以下工具: | 对比项 | 豆包搜索 Custom 版(推荐) | 联网内容插件 | | --- | --- | --- | | 支持的 API | Responses API(兼容 OpenAI Responses 接口协议)、Messages API(兼容 Anthropic Messages 接口协议) | Responses API(兼容 OpenAI Responses 接口协议) | | 支持的模型 | 参见[工具调用能力](/docs/model-list#f44ceef7) | 参见[工具调用能力](/docs/model-list#f44ceef7) | | 核心功能 | 支持多垂类、多信源的实时公开信息,搜索时延低、控制更灵活;支持与函数调用、MCP 等工具组合使用。 | 支持多轮自动搜索、图文输入和多工具混合调用;支持同步和流式响应。 | | 计费说明 | * Agent Plan 场景:参见[套餐内 AFP 抵扣规则](/docs/agent-plan-personal-afp-credits-billing-rules)、[超额后付费规则](/docs/agent-plan-personal-over-quota-postpaid-rules)。 | 按联网内容插件实际使用次数计费。具体收费标准详见[联网内容插件产品计费](/docs/online-content-plugin-pricing)。 | \ | | * Coding Plan 场景:参见[套餐概览](/docs/coding-plan-personal-plan-overview)。 | | \ | | * 普通 API 调用场景:参见 [豆包搜索产品计费](https://docs.volcengine.com/docs/87772/2272951?lang=zh#yQ0Kqmsy)。 | | ## 开通组件 无论您选择使用哪一种联网搜索工具,都必须先开通相应的组件。 **选项:豆包搜索 Custom 版** 1. 登录方舟控制台,打开 [应用组件库 > 豆包搜索](https://ark.volcengine.com/region:cn-beijing/openManagement?advancedActiveKey=component&tab=DoubaoSearch) 标签页。 2. 在**豆包搜索 Custom 版**的**操作**列中点击**开通服务**。 **选项:联网内容插件** 1. 登录方舟控制台,打开 [应用组件库 > 应用组件](https://ark.volcengine.com/region:cn-beijing/openManagement?advancedActiveKey=component&tab=DoubaoSearch) 标签页。 2. 在**联网内容插件**的**操作**列中点击**开通服务**。 ## 示例代码 > **说明** > > 方舟平台的新用户?获取 API Key 及 开通模型等准备工作,请参见 [快速入门](/docs/quick-start)。 > **注意** > > 调用工具之前,请确认您已经按照本文说明开通相应的组件,否则调用时将会产生错误。 ### 豆包搜索 Custom 版 请求示例: **选项:Responses API(OpenAI Responses 协议)** ```Bash curl --location 'https://ark.cn-beijing.volces.com/api/v3/responses' \ --header "Authorization: Bearer $ARK_API_KEY" \ --header 'Content-Type: application/json' \ --data '{ "model": "doubao-seed-2-1-pro-260915", "stream": true, "tools": [ { "type": "web_search", "sources": ["doubao"] } ], "input": [ { "role": "user", "content": [ { "type": "input_text", "text": "今天有什么 AI 领域的热点新闻?" } ] } ] }' ``` **选项:Messages API(Anthropic Messages 协议)** ```Bash curl https://ark.cn-beijing.volces.com/api/compatible/v1/messages \ -H "Content-Type: application/json" \ -H "x-api-key: $ARK_API_KEY" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "max_tokens": 1024, "tools": [ { "type": "web_search_20250305", "name": "web_search", "max_uses": 5 } ], "messages": [ { "role": "user", "content": "今天有什么 AI 领域的热点新闻?" } ] }' ``` 返回示例: **选项:Responses API** ``` { "id": "resp_02178849073345588e74****", "object": "response", "model": "doubao-seed-2-1-pro-260915", "status": "completed", "output": [ { "id": "rs_02178849073770400000****", "type": "reasoning", "status": "completed", "summary": [ { "type": "summary_text", "text": "用户需要获取 2026 年 9 月 4 日的 AI 领域热点新闻,我将使用网页搜索工具,通过时间限定关键词检索相关信息。" } ], "encrypted_content": "djFlkf4Bo9PjH2A5r+39.../9yJWTg=" }, { "id": "ws_02178849074154500000****", "type": "web_search_call", "status": "completed", "action": { "type": "search", "query": "2026年9月4日 AI领域热点新闻", "queries": [ "2026年9月4日 AI领域热点新闻" ] } }, { "id": "msg_02178849076046900000****", "type": "message", "status": "completed", "role": "assistant", "content": [ { "type": "output_text", "text": "2026年9月4日 AI 领域的核心热点是 OpenAI 正式发布新一代旗舰大模型 GPT-6 Astra。", "annotations": [ { "type": "url_citation", "title": "OpenAI,发布“地球最强大模型”GPT-6:欢迎进入 AGI 时代!", "url": "https://news.sina.cn/2026-09-04/detail-iniqrpra63******.d.html", "site_name": "新浪新闻", "publish_time": "2026-09-04T10:24:00+08:00", "summary": "当地时间 9 月 3 日,OpenAI 正式发布新一代旗舰模型 GPT-6 Astra,并称其实现“代际跃迁”。" } ] } ] } ], "usage": { "input_tokens": 3666, "output_tokens": 1610, "total_tokens": 5276, "tool_usage": { "web_search": 1 }, "tool_usage_details": { "web_search": { "doubao": 1 } } } } ``` **选项:Messages API** ```JSON { "id": "021788491735391ee3582c20fb7529745750c3f00520e5c262****", "type": "message", "role": "assistant", "model": "doubao-seed-2-1-pro-260915", "content": [ { "type": "thinking", "thinking": "我将调用搜索工具获取 2026 年 9 月 4 日的 AI 热点新闻,再基于搜索结果整理回答。", "signature": "djE09ahKIu8KsvSLLVrg...Nf/EYMTk3hjlMg==" }, { "type": "server_tool_use", "id": "srvtoolu_2ccc8b83a8d345f8be35d32b457e****", "name": "web_search", "input": { "query": "2026年9月4日 AI领域热点新闻" } }, { "type": "web_search_tool_result", "tool_use_id": "srvtoolu_2ccc8b83a8d345f8be35d32b457e****", "content": [ { "type": "web_search_result", "title": "OpenAI,发布“地球最强大模型”GPT-6:欢迎进入AGI时代!山姆·奥特曼首次明确表示:一定会做人形机器人", "url": "https://news.sina.cn/2026-09-04/detail-iniqrpra63****.d.html", "page_age": "2026-09-04T10:24:00+08:00", "encrypted_content": "djGk3VaymgA8eiuLkR7w...0QazEoRxp46hi3n/Zd5L2aG3kN7cexLZzcoSdoA6f34iEEJBw==" }, { "type": "web_search_result", "title": "OpenAI最强模型GPT-6 Astra发布,公司总裁称AGI时代到来", "url": "http://finance.sina.cn/stock/jdts/2026-09-04/detail-iniqrpqy08****.html", "page_age": "2026-09-04T10:25:00+08:00", "encrypted_content": "djEz4PKCbjpmdizu9giy...p4I8TYtvYardgTA9CgOtejh6rWWpAFvj29xL+I/mK1vAOPs0tm+4NU==" } ] }, { "type": "text", "text": "根据 2026 年 9 月 4 日的 AI 领域最新热点,最重磅的事件是 OpenAI 正式发布新一代旗舰大模型 GPT-6 Astra。" } ], "stop_reason": "end_turn", "stop_sequence": null, "usage": { "input_tokens": 3770, "output_tokens": 1859, "cache_read_input_tokens": 0, "server_tool_use": { "web_search_requests": 1, "web_fetch_requests": 0 } } } ``` ### 联网内容插件 **选项:cURL** ```Bash curl --location 'https://ark.cn-beijing.volces.com/api/v3/responses' \ --header "Authorization: Bearer $ARK_API_KEY" \ --header 'Content-Type: application/json' \ --data '{ "model": "doubao-seed-2-1-pro-260915", "stream": true, "tools": [ { "type": "web_search", "max_keyword": 2 } ], "input": [ { "role": "user", "content": [ { "type": "input_text", "text": "今天有什么热点新闻?" } ] } ] }' ``` **选项:Python SDK** ```Python import os from arkruntime import Ark # To obtain the api key from your environment variables, see: https://ark.volcengine.com/region:cn-beijing/docs/environment-variable-configuration-guide api_key = os.getenv('ARK_API_KEY') client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) tools = [{ "type": "web_search", "max_keyword": 2, }] # Create a conversation request response = client.responses.create( model="doubao-seed-2-1-pro-260915", input=[{"role": "user", "content": "今天有什么热点新闻?"}], tools=tools, ) print(response) ``` **选项:Java SDK** ```Java package com.ark.example; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.JsonNode; import com.volcengine.ark.runtime.models.responses.*; import com.volcengine.ark.runtime.service.ArkService; import java.util.Arrays; import java.util.List; public class demo { public static ObjectMapper om = new ObjectMapper(); public demo() throws JsonProcessingException { } public static List buildTools() { WebSearchTool t = WebSearchTool.builder() .build(); System.out.println(Arrays.asList(t)); return Arrays.asList(t); } public static void main(String[] args) throws JsonProcessingException { String apiKey = System.getenv("ARK_API_KEY"); // Create an ArkService instance ArkService arkService = ArkService.builder().apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); ResponsesRequest req = ResponsesRequest.builder() .model("doubao-seed-2-1-pro-260915") .input(ResponsesInput.ofList(java.util.Arrays.asList(ItemEasyMessage.builder().role(MessageRole.USER).content( MessageContent.ofList(java.util.Arrays.asList(ContentItemText.builder().text("今天有什么热点新闻?").build())) ).build()))) .tools(buildTools()) .build(); Response resp = arkService.createResponse(req); System.out.println(resp); arkService.shutdownExecutor(); } } ``` **选项:Go SDK** ```Go package main import ( "context" "fmt" "io" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/responses" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) request := &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", Input: responses.NewStringResponsesInput( "请查询今天的重要 AI 产品发布,并给出来源。", ), Tools: []responses.Tool{ { OneOf: responses.NewWebSearchToolToolSum( responses.WebSearchTool{ Type: responses.WebSearchToolTypeWebSearch, }, ), }, }, MaxToolCalls: responses.NewOptInt64(1), } stream, err := client.CreateResponsesStream(context.Background(), request) if err != nil { fmt.Printf("stream error: %v\n", err) return } for { event, err := stream.Recv() if err == io.EOF { break } if err != nil { fmt.Printf("stream error: %v\n", err) return } switch event.OneOf.Type { case responses.ResponseTextDeltaEventResponseStreamEventSum: print(event.OneOf.ResponseTextDeltaEvent.Delta.Or("")) case responses.ResponseWebSearchCallInProgressEventResponseStreamEventSum: fmt.Println("web search started") case responses.ResponseWebSearchCallCompletedEventResponseStreamEventSum: fmt.Println("web search completed") } } fmt.Println() } ``` --- ## 参数说明 **选项:豆包搜索 Custom 版** **Responses API(兼容 OpenAI Responses 接口协议)** 通过 Responses API 调用豆包搜索 Custom 版时,工具类型仍为 `web_search`,并需要将 `sources` 显式设置为 `["doubao"]`。`doubao` 不能与其他搜索来源同时配置。 * `tools.type`:固定为 `web_search`。 * `tools.sources`:固定传入 `["doubao"]`。 * `tools.limit`:参数不生效,传入的值将被忽略。 * `tools.max_keyword`:参数不生效,传入的值将被忽略。 * `tools.user_location`:参数不生效,传入的值将被忽略。 * `max_tool_calls`:限制一次模型响应中可执行工具调用的最大轮次。 **Messages API(兼容 Anthropic Messages 接口协议)** 通过 Messages API 调用豆包搜索 Custom 版时,使用兼容 Anthropic Messages 接口协议的服务端工具配置: * `tools.name`:工具名称。本文示例固定为 `web_search`。 * `tools.type`:工具类型或版本标识。本文示例使用 `web_search_20250305`。 * `tools.max_uses`:单个服务端工具在一次请求中的最大调用次数。 * `tools.user_location`:参数不生效,传入的值将被忽略。 * `tools.allowed_domains`:限制搜索结果仅来自允许访问的域名列表。 * `tools.blocked_domains`:限制搜索结果不包含禁止访问的域名列表。 **选项:联网内容插件** 详情请参见 [创建 Responses 模型请求](/docs/create-model-responses-api)。 --- ## Agent 场景下的用法 您可以在 Claude Code 或 Codex 中调用豆包搜索 Custom 版工具,该工具兼容 Anthropic Messages 接口协议和 OpenAI Responses API 接口协议。 **选项:Claude Code** Claude Code 通过兼容 Anthropic Messages 接口协议的服务调用豆包搜索能力。完成接入配置后,在 Claude Code 中对话时,如果模型判断您的问题需要通过搜索功能才能回答,那么模型会调用 Web Search 工具进行搜索。完整的配置和使用方法参见[在 Claude Code 中使用 Web Search 工具](/docs/integrate-third-party-tools#web-search-claude-code)。 > **注意** > > 调用 Web Search 工具时,大模型可能会发起额外的 API 请求来总结搜索结果,因此会消耗额外的 token。 ![claude-code-web-search-example.png](https://arkdocs.tos-cn-beijing.volces.com/images/tool-calling/claude-code-web-search-example.png) **选项:Codex** Codex 通过兼容 OpenAI Responses API 接口协议的服务调用豆包搜索能力。完成接入配置后,在 Codex 中对话时,如果模型判断您的问题需要通过搜索功能才能回答,那么模型会调用 Web Search 工具进行搜索。完整的配置和使用方法参见[在 Codex 中使用 Web Search 工具](/docs/integrate-third-party-tools#web-search-codex)。 > **注意** > > 调用 Web Search 工具时,大模型可能会发起额外的 API 请求来总结搜索结果,因此会消耗额外的 token。 ## API 调用场景下的用法与配置 本节介绍联网搜索场景中的工具用法与常用配置。不同工具的差异以相关说明为准。 > **注意** > > 本节内容仅适用于 Responses API,不适用于 Messages API。 ### 开启流式调用 在 response 中设置 `stream=True`,即可开启流式调用,使响应以流式方式返回,从而更快地获取部分结果,同时可实时查看模型判断是否调用搜索的思考过程。 示例: ```Python response = client.responses.create( model="doubao-seed-2-1-pro-260915", input=[ # 输入内容,包含系统提示和用户问题 ... ], tools=[ # 使用工具及参数 ... ], stream=True, # 启用流式响应(实时返回结果,而非等待全部完成) ) ``` ### 设置搜索来源 豆包搜索 Custom 版和联网内容插件的搜索来源配置方式不同: * 豆包搜索 Custom 版: * 通过 Responses API 调用时,工具类型仍为 `web_search`,并需要将 `sources` 显式设置为 `["doubao"]`。`doubao` 不能与其他搜索来源同时配置。 * 通过 Messages API 调用时,使用的是兼容 Anthropic Messages 接口协议的服务端工具配置。本文示例中 `tools.type` 使用 `web_search_20250305`。 * 联网内容插件:默认通过 `search_engine` 搜索全网内容。您可以通过 `tools.sources` 添加以下内容源: * `"douyin"`:抖音百科。 * `"moji"`:墨迹天气。 * `"toutiao"`:头条图文。 示例: ```Python tools=[ { "type": "web_search", # 配置工具类型为联网内容插件 "sources": ["douyin", "moji", "toutiao"], # 附加搜索来源(抖音百科、墨迹天气、头条图文等平台) } ], ``` ### 指定用户地理位置 您可以在 tools 中设置 `user_location` 字段,并提供用户的国家、地区和城市信息,以优化与地理位置相关的搜索结果。 示例: ```Python tools=[ { "type": "web_search", # 配置工具类型为联网内容插件 "user_location": { # 指定用户地理位置(用于优化搜索结果) "type": "approximate", # 大致位置 "country": "中国", "region": "浙江", "city": "杭州" } } ], ``` ### 设置搜索限制 > **说明** > > 以下搜索限制参数仅联网内容插件支持,豆包搜索 Custom 版不支持。即当 `sources` 的值为 `["doubao"]` 时,`tools.limit`、`tools.max_keyword`、`tools.user_location` 均不生效,向它们传入的值将被忽略。 * `tools.`**`max_keyword`** * 作用:限制单轮搜索中可使用的最大关键词数量。 * 取值范围:`1`~`50`。 * 示例:如果模型原本计划搜索三个关键词(例如“大模型最新进展”、“2025 年科技创新”),但将 `max_keyword` 设置为 `1`,模型将仅使用第一个关键词进行搜索。关于 `max_keyword` 参数的具体使用方法和示例,请参见 [创建模型响应](/docs/create-model-responses-api)。 * `tools.`**`limit`** * 作用:限制单轮搜索操作返回的最大结果条数。 * 取值范围:`1`~`50`。 * 默认值:`10`。 * 说明:此参数会影响返回内容的规模和请求性能。单次搜索最多可返回 20 条结果,但单轮可能有多次搜索,默认召回 10 条。 * **`max_tool_calls`** * 作用:限制在一次完整的模型响应中可以执行工具调用的最大轮次。 * 取值范围:`1`~`10`。 * 默认值:`3`。 示例: ```Python tools = [{ "type": "web_search", "max_keyword": 2, "limit": 10, }] max_tool_calls = 3 ``` ### 查询搜索用量 您可以在 API 返回的参数中查看工具使用情况: * `usage.tool_usage`:显示 Responses API 中工具的总调用次数。 * `usage.tool_usage_details`:显示 Responses API 中每个搜索源的详细调用次数,例如 `search_engine`、`toutiao` 或 `doubao`。 * Messages API:通过 `usage.server_tool_use.web_search_requests` 查看服务端工具发起的联网搜索请求次数。 关于 Responses API 用量参数的详细信息,请参见[创建 Response](/docs/create-model-responses-api)。 ### 设置系统提示词 系统提示词的设置对搜索请求的影响较大,建议进行优化以提升搜索的准确性与效率。以下两种系统提示词模板供您参考。 模板 1: ```Plaintext # 定义系统提示词 system_prompt = """ 你是AI个人助手,负责解答用户的各种问题。你的主要职责是: 1. **信息准确性守护者**:确保提供的信息准确无误。 2. **搜索成本优化师**:在信息准确性和搜索成本之间找到最佳平衡。 # 任务说明 ## 1. 联网意图判断 当用户提出的问题涉及以下情况时,需使用 `web_search` 进行联网搜索: - **时效性**:问题需要最新或实时的信息。 - **知识盲区**:问题超出当前知识范围,无法准确解答。 - **信息不足**:现有知识库无法提供完整或详细的解答。 ## 2. 联网后回答 - 在回答中,优先使用已搜索到的资料。 - 回复结构应清晰,使用序号、分段等方式帮助用户理解。 ## 3. 引用已搜索资料 - 当使用联网搜索的资料时,在正文中明确引用来源,引用格式为: `[1] (URL地址)`。 ## 4. 总结与参考资料 - 在回复的最后,列出所有已参考的资料。格式为: 1. [资料标题](URL地址1) 2. [资料标题](URL地址2) """ ``` 模板 2: ```Plaintext # 定义系统提示词 system_prompt = """ # 角色 你是AI个人助手,负责解答用户的各种问题。你的主要职责是: 1. **信息准确性守护者**:确保提供的信息准确无误。 2. **回答更生动活泼**:请在模型的回复中多使用适当的 emoji 标签 🌟😊🎉 # 任务说明 ## 1. 联网意图判断 当用户提出的问题涉及以下情况时,需使用 `web_search` 进行联网搜索: - **时效性**:问题需要最新或实时的信息。 - **知识盲区**:问题超出当前知识范围,无法准确解答。 - **信息不足**:现有知识库无法提供完整或详细的解答。 ## 2. 联网后回答 - 在回答中,优先使用已搜索到的资料。 - 回复结构应清晰,使用序号、分段等方式帮助用户理解。 ## 3. 引用已搜索资料 - 当使用联网搜索的资料时,在正文中明确引用来源,引用格式为: `[1] (URL地址)`。 ## 4. 总结与参考资料 - 在回复的最后,列出所有已参考的资料。格式为: 1. [资料标题](URL地址1) 2. [资料标题](URL地址2) """ ``` --- ## 注意事项 * 自定义函数名称应避免使用 `web_search`,否则模型可能按内置工具优先级判断调用逻辑。 * `doubao` 只能单独配置,不能与 `toutiao`、`douyin`、`moji` 或 `search_engine` 等其他搜索来源同时使用。 * 豆包搜索 Custom 版支持 Responses API 和 Messages API;联网内容插件仅支持 Responses API。 * 联网内容插件是否触发搜索由模型判断。一轮搜索可能发起多个关键词搜索,可以通过 `max_keyword` 参数限制一轮搜索的关键词数量,以控制调用频次和成本。 * 豆包搜索 Custom 版和联网内容插件均不支持 `caching` 参数,该参数不可与 `tools` 参数一起使用,否则会返回 `400` 错误。 ## 相关文档 * 计费 * 豆包搜索 Custom 版 * 普通 API 调用场景:[豆包搜索产品计费](https://docs.volcengine.com/docs/87772/2272951?lang=zh#yQ0Kqmsy) * Agent Plan 场景:[套餐内 AFP 抵扣规则](/docs/agent-plan-personal-afp-credits-billing-rules)、[超额后付费规则](/docs/agent-plan-personal-over-quota-postpaid-rules) * Coding Plan 场景:[套餐概览](/docs/coding-plan-personal-plan-overview) * 联网内容插件:按联网内容插件实际使用次数计费。具体收费标准详见[联网内容插件产品计费](/docs/online-content-plugin-pricing)。 * Agent 场景使用方法 * [在 Claude Code 中使用 Web Search 工具](/docs/integrate-third-party-tools#web-search-claude-code) * [在 Codex 中使用 Web Search 工具](/docs/integrate-third-party-tools#web-search-codex) * API 参考 * [创建 Response](/docs/create-model-responses-api) * [创建 Message](/docs/messages-api) * 错误码说明:[错误码](/docs/error-codes) --- # Image Process(图像处理工具) Source: https://ark.volcengine.com/region:cn-beijing/docs/image-process Image Process(图像处理)工具支持通过 Responses API 调用对输入图片执行画点、画线、旋转、缩放、框选或裁剪关键区域等基础操作,适用于需要模型通过视觉处理提升图片理解的场景(例如图文内容分析、物体定位标注、多轮视觉推理等)。工具通过模型自动判断图像处理逻辑,支持与自定义函数混合使用,且可处理多轮视觉输入(即上一轮输出的图片作为下一轮的输入)。 > **说明** > > 当前处于 Beta 测试阶段,测试期间免费使用。 > 测试期间,调用此工具需要增加 header `ark-beta-image-process: true`,调用方式请参见[功能演示](/docs/image-process#demo)。 ## 核心功能 * 丰富的图像处理工具:支持启用或禁用画点(Point)、框选(Grounding)、缩放(Zoom)、旋转(Rotate)等子功能,满足不同视觉处理需求。 * 支持多轮图像处理:复杂视觉任务(如多步缩放+旋转)支持多轮工具调用,上一轮输出图片自动作为下一轮输入(例:image0→image1→image2)。 * 支持混合调用:可与用户自定义函数混合使用。(暂不支持与 Web Search 联网内容插件混合调用) * 兼容多种图片格式:支持 Base64 编码的 .gif、.jpg、.jpeg 等主流图片格式,但对图片规格有明确限制,详见[注意事项](/docs/image-process#notice) ## 功能演示 以下示例代码演示了图像处理工具的各项功能。实际调用时,请将 `` 替换为您的实际 API Key。 > **说明** > > 方舟平台的新用户?获取 API Key 及 开通模型等准备工作,请参见 [快速入门](/docs/quick-start)。 > **注意** > > 提示词支持图片和文字混排,但图文顺序可能对模型的输出效果产生影响。如果提示词由多张图片和一段文字构成,建议将文字放在提示词末尾。 ### 示例一:缩放(Zoom)工具 以下代码展示了在视觉问答场景下,如何启用缩放(zoom)工具,让模型在放大图片后读取前方路牌文字,并以流式方式实时返回答案。 **选项:cURL** ```Bash curl --location 'https://ark.cn-beijing.volces.com/api/v3/responses' \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/json' \ --header 'ark-beta-image-process: true' \ --data '{ "model": "doubao-seed-2-0-lite-260215", "stream": true, "tools": [ { "type": "image_process", "point": { "type": "disabled" }, "grounding": { "type": "disabled" }, "zoom": { "type": "enabled" }, "rotate": { "type": "disabled" } } ], "input": [ { "type": "message", "role": "user", "content": [ { "type": "input_image", "image_url": "https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/image_process_1.jpg" }, { "type": "input_text", "text": "前方路牌写了什么?" } ] } ] }' ``` **选项:Python** ```Python from arkruntime import Ark import os # 从环境变量获取 API 密钥,配置方法见:https://ark.volcengine.com/region:cn-beijing/docs/quick-start api_key = os.getenv('ARK_API_KEY') # 初始化客户端,配置 API 地址与工具启用头 client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) # 发起图像处理请求 response = client.responses.create( model="doubao-seed-2-0-lite-260215", tools=[ { "type": "image_process", "point": { "type": "disabled" }, "grounding": { "type": "disabled" }, "zoom": { "type": "enabled" }, "rotate": { "type": "disabled" } } ], input=[ { "type": "message", "role": "user", "content": [ { "type": "input_image", "image_url": "https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/image_process_1.jpg" # 输入图片 URL }, { "type": "input_text", "text": "前方路牌写了什么?" # 系统提示文本 } ] } ], extra_headers={"ark-beta-image-process": "true"}, stream=True # 启用流式响应,实时获取处理结果 ) # 打印流式响应结果 for chunk in response: if hasattr(chunk, 'delta'): print(chunk.delta, end="", flush=True) ``` **选项:OpenAI Python SDK** ```Python from openai import OpenAI import os # 从环境变量获取API密钥,配置方法见:https://ark.volcengine.com/region:cn-beijing/docs/quick-start api_key = os.getenv('ARK_API_KEY') # 初始化客户端,配置API地址与工具启用头 client = OpenAI( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, default_headers={"ark-beta-image-process": "true"} ) # 发起图像处理请求 response = client.responses.create( model="doubao-seed-2-0-lite-260215", tools=[ { "type": "image_process", "point": { "type": "disabled" }, "grounding": { "type": "disabled" }, "zoom": { "type": "enabled" # 启用缩放(zoom)工具 }, "rotate": { "type": "disabled" } } ], input=[ { "type": "message", "role": "user", "content": [ { "type": "input_image", "image_url": "https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/image_process_1.jpg" # 输入图片 URL }, { "type": "input_text", "text": "前方路牌写了什么?" # 系统提示文本 } ] } ], stream=True # 启用流式响应,实时获取处理结果 ) # 打印流式响应结果 for chunk in response: if hasattr(chunk, 'delta'): print(chunk.delta, end="", flush=True) ``` **选项:OpenAI Go SDK** ```Go package main import ( "context" "fmt" "github.com/openai/openai-go/v3" "github.com/openai/openai-go/v3/option" "github.com/openai/openai-go/v3/responses" ) func main() { client := openai.NewClient(option.WithBaseURL("https://ark.cn-beijing.volces.com/api/v3")) ctx := context.Background() tools := [] map[string] any { { "type": "image_process", "point": { "type": "disabled" }, "grounding": { "type": "disabled" }, "zoom": { "type": "enabled" // 启用缩放(zoom)工具 }, "rotate": { "type": "disabled" } } } stream := client.Responses.NewStreaming(ctx, responses.ResponseNewParams { Input: responses.ResponseNewParamsInputUnion { OfInputItemList: [] responses.ResponseInputItemUnionParam { { OfInputMessage: & responses.ResponseInputItemMessageParam { Role: string(responses.ResponseInputMessageItemRoleUser), Content: [] responses.ResponseInputContentUnionParam { { OfInputImage: & responses.ResponseInputImageParam { ImageURL: openai.String("https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/image_process_1.jpg"), }, }, { OfInputText: & responses.ResponseInputTextParam { Text: "前方路牌写了什么?", }, }, }, }, }, } }, Model: "doubao-seed-2-0-lite-260215", }, option.WithJSONSet("tools", tools), option.WithHeaderAdd("ark-beta-image-process", "true")) for stream.Next() { data := stream.Current() fmt.Println(data.RawJSON()) } if stream.Err() != nil { panic(stream.Err()) } } ``` **选项:效果演示** ![Image](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/54abc77a5e9f4095956cfe602695c503~tplv-goo7wpa0wc-image.image) ### 示例二:画点(Point)工具 以下代码展示了如何启用画点(point)工具,让模型在视觉问答中进行计数,并以流式方式返回答案。 **选项:cURL** ```Bash curl --location 'https://ark.cn-beijing.volces.com/api/v3/responses' \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/json' \ --header 'ark-beta-image-process: true' \ --data '{ "model": "doubao-seed-2-0-lite-260215", "stream": true, "tools": [ { "type": "image_process", "point": { "type": "enabled" }, "grounding": { "type": "disabled" }, "zoom": { "type": "disabled" }, "rotate": { "type": "disabled" } } ], "input": [ { "type": "message", "role": "user", "content": [ { "type": "input_image", "image_url": "https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/image_process_2.jpg" }, { "type": "input_text", "text": "数一数有多少颗草莓?" } ] } ] }' ``` **选项:Python** ```Python from arkruntime import Ark import os # 从环境变量获取 API 密钥,配置方法见:https://ark.volcengine.com/region:cn-beijing/docs/quick-start api_key = os.getenv('ARK_API_KEY') # 初始化客户端,配置 API 地址与工具启用头 client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) # 发起图像处理请求 response = client.responses.create( model="doubao-seed-2-0-lite-260215", tools=[ { "type": "image_process", "point": { "type": "enabled" # 启用画点(point)工具 }, "grounding": { "type": "disabled" }, "zoom": { "type": "disabled" }, "rotate": { "type": "disabled" } } ], input=[ { "type": "message", "role": "user", "content": [ { "type": "input_image", "image_url": "https://arkdocs.tos-cn-beijing.volces.com/images/tool-calling/image_process_2.jpg" # 输入图片 URL }, { "type": "input_text", "text": "数一数有多少颗草莓?" # 系统提示文本 } ] } ], extra_headers={"ark-beta-image-process": "true"}, stream=True # 启用流式响应,实时获取处理结果 ) # 打印流式响应结果 for chunk in response: if hasattr(chunk, 'delta'): print(chunk.delta, end="", flush=True) ``` **选项:OpenAI Python SDK** ```Python from openai import OpenAI import os # 从环境变量获取API密钥,配置方法见:https://ark.volcengine.com/region:cn-beijing/docs/quick-start api_key = os.getenv('ARK_API_KEY') # 初始化客户端,配置API地址与工具启用头 client = OpenAI( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, default_headers={"ark-beta-image-process": "true"} ) # 发起图像处理请求 response = client.responses.create( model="doubao-seed-2-0-lite-260215", tools=[ { "type": "image_process", "point": { "type": "enabled" # 启用画点(point)工具 }, "grounding": { "type": "disabled" }, "zoom": { "type": "disabled" }, "rotate": { "type": "disabled" } } ], input=[ { "type": "message", "role": "user", "content": [ { "type": "input_image", "image_url": "https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/image_process_2.jpg" # 输入图片 URL }, { "type": "input_text", "text": "数一数有多少颗草莓?" # 系统提示文本 } ] } ], stream=True # 启用流式响应,实时获取处理结果 ) # 打印流式响应结果 for chunk in response: if hasattr(chunk, 'delta'): print(chunk.delta, end="", flush=True) ``` **选项:OpenAI Go SDK** ```Go package main import ( "context" "fmt" "github.com/openai/openai-go/v3" "github.com/openai/openai-go/v3/option" "github.com/openai/openai-go/v3/responses" ) func main() { client := openai.NewClient(option.WithBaseURL("https://ark.cn-beijing.volces.com/api/v3")) ctx := context.Background() tools := [] map[string] any { { "type": "image_process", "point": { "type": "enabled" // 启用画点(point)工具 }, "grounding": { "type": "disabled" }, "zoom": { "type": "disabled" }, "rotate": { "type": "disabled" } } } stream := client.Responses.NewStreaming(ctx, responses.ResponseNewParams { Input: responses.ResponseNewParamsInputUnion { OfInputItemList: [] responses.ResponseInputItemUnionParam { { OfInputMessage: & responses.ResponseInputItemMessageParam { Role: string(responses.ResponseInputMessageItemRoleUser), Content: [] responses.ResponseInputContentUnionParam { { OfInputImage: & responses.ResponseInputImageParam { ImageURL: openai.String("https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/image_process_2.jpg"), }, }, { OfInputText: & responses.ResponseInputTextParam { Text: "数一数有多少颗草莓?", }, }, }, }, }, } }, Model: "doubao-seed-2-0-lite-260215", }, option.WithJSONSet("tools", tools), option.WithHeaderAdd("ark-beta-image-process", "true")) for stream.Next() { data := stream.Current() fmt.Println(data.RawJSON()) } if stream.Err() != nil { panic(stream.Err()) } } ``` **选项:效果演示** ![Image](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/cecc489854ed4f4e8a5476f5e92cacfa~tplv-goo7wpa0wc-image.image) ### 示例三:框选(Grounding)工具 以下代码展示了如何启用框选(grounding)工具,让模型框选出图中的特定目标,并以流式方式返回答案。 **选项:cURL** ```Bash curl --location 'https://ark.cn-beijing.volces.com/api/v3/responses' \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/json' \ --header 'ark-beta-image-process: true' \ --data '{ "model": "doubao-seed-2-0-lite-260215", "stream": true, "tools": [ { "type": "image_process", "point": { "type": "disabled" }, "grounding": { "type": "enabled" }, "zoom": { "type": "disabled" }, "rotate": { "type": "disabled" } } ], "input": [ { "type": "message", "role": "user", "content": [ { "type": "input_image", "image_url": "https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/image_process_1.jpg" }, { "type": "input_text", "text": "帮我框选出图中的路牌。" } ] } ] }' ``` **选项:Python** ```Python from arkruntime import Ark import os # 从环境变量获取 API 密钥,配置方法见:https://ark.volcengine.com/region:cn-beijing/docs/quick-start api_key = os.getenv('ARK_API_KEY') # 初始化客户端,配置 API 地址与工具启用头 client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) # 发起图像处理请求 response = client.responses.create( model="doubao-seed-2-0-lite-260215", tools=[ { "type": "image_process", "point": { "type": "disabled" }, "grounding": { "type": "enabled" # 启用框选(grounding)工具 }, "zoom": { "type": "disabled" }, "rotate": { "type": "disabled" } } ], input=[ { "type": "message", "role": "user", "content": [ { "type": "input_image", "image_url": "https://arkdocs.tos-cn-beijing.volces.com/images/tool-calling/image_process_1.jpg" # 输入图片 URL }, { "type": "input_text", "text": "帮我框选出图中的路牌。" # 系统提示文本 } ] } ], extra_headers={"ark-beta-image-process": "true"}, stream=True # 启用流式响应,实时获取处理结果 ) # 打印流式响应结果 for chunk in response: if hasattr(chunk, 'delta'): print(chunk.delta, end="", flush=True) ``` **选项:OpenAI Python SDK** ```Python from openai import OpenAI import os # 从环境变量获取API密钥,配置方法见:https://ark.volcengine.com/region:cn-beijing/docs/quick-start api_key = os.getenv('ARK_API_KEY') # 初始化客户端,配置API地址与工具启用头 client = OpenAI( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, default_headers={"ark-beta-image-process": "true"} ) # 发起图像处理请求 response = client.responses.create( model="doubao-seed-2-0-lite-260215", tools=[ { "type": "image_process", "point": { "type": "disabled" }, "grounding": { "type": "enabled" # 启用框选(grounding)工具 }, "zoom": { "type": "disabled" }, "rotate": { "type": "disabled" } } ], input=[ { "type": "message", "role": "user", "content": [ { "type": "input_image", "image_url": "https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/image_process_1.jpg" # 输入图片 URL }, { "type": "input_text", "text": "帮我框选出图中的路牌。" # 系统提示文本 } ] } ], stream=True # 启用流式响应,实时获取处理结果 ) # 打印流式响应结果 for chunk in response: if hasattr(chunk, 'delta'): print(chunk.delta, end="", flush=True) ``` **选项:OpenAI Go SDK** ```Go package main import ( "context" "fmt" "github.com/openai/openai-go/v3" "github.com/openai/openai-go/v3/option" "github.com/openai/openai-go/v3/responses" ) func main() { client := openai.NewClient(option.WithBaseURL("https://ark.cn-beijing.volces.com/api/v3")) ctx := context.Background() tools := []map[string]any{ { "type": "image_process", "point": map[string]string{ "type": "disabled", }, "grounding": map[string]string{ "type": "enabled", // 启用框选(grounding)工具 }, "zoom": map[string]string{ "type": "disabled", }, "rotate": map[string]string{ "type": "disabled", }, }, } stream := client.Responses.NewStreaming(ctx, responses.ResponseNewParams{ Input: responses.ResponseNewParamsInputUnion{ OfInputItemList: []responses.ResponseInputItemUnionParam{ { OfInputMessage: &responses.ResponseInputItemMessageParam{ Role: openai.F(responses.ResponseInputMessageItemRoleUser), Content: openai.F([]responses.ResponseInputContentUnionParam{ { OfInputImage: &responses.ResponseInputImageParam{ ImageURL: openai.String("https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/image_process_1.jpg"), }, }, { OfInputText: &responses.ResponseInputTextParam{ Text: openai.F("帮我框选出图中的路牌。"), }, }, }), }, }, }, }, Model: openai.F("doubao-seed-2-0-lite-260215"), }, option.WithJSONSet("tools", tools), option.WithHeaderAdd("ark-beta-image-process", "true")) for stream.Next() { data := stream.Current() fmt.Println(data.RawJSON()) } if stream.Err() != nil { panic(stream.Err()) } } ``` ### 示例四:旋转(Rotate)工具 以下代码展示了如何启用旋转(rotate)工具,让模型对图像进行旋转操作,并以流式方式返回答案。 **选项:cURL** ```Bash curl --location 'https://ark.cn-beijing.volces.com/api/v3/responses' \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/json' \ --header 'ark-beta-image-process: true' \ --data '{ "model": "doubao-seed-2-0-lite-260215", "stream": true, "tools": [ { "type": "image_process", "point": { "type": "disabled" }, "grounding": { "type": "disabled" }, "zoom": { "type": "disabled" }, "rotate": { "type": "enabled" } } ], "input": [ { "type": "message", "role": "user", "content": [ { "type": "input_image", "image_url": "https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/image_process_1.jpg" }, { "type": "input_text", "text": "帮我把图片顺时针旋转90度。" } ] } ] }' ``` **选项:Python** ```Python from arkruntime import Ark import os # 从环境变量获取 API 密钥,配置方法见:https://ark.volcengine.com/region:cn-beijing/docs/quick-start api_key = os.getenv('ARK_API_KEY') # 初始化客户端,配置 API 地址与工具启用头 client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) # 发起图像处理请求 response = client.responses.create( model="doubao-seed-2-0-lite-260215", tools=[ { "type": "image_process", "point": { "type": "disabled" }, "grounding": { "type": "disabled" }, "zoom": { "type": "disabled" }, "rotate": { "type": "enabled" # 启用旋转(rotate)工具 } } ], input=[ { "type": "message", "role": "user", "content": [ { "type": "input_image", "image_url": "https://arkdocs.tos-cn-beijing.volces.com/images/tool-calling/image_process_1.jpg" # 输入图片 URL }, { "type": "input_text", "text": "帮我把图片顺时针旋转 90 度。" # 系统提示文本 } ] } ], extra_headers={"ark-beta-image-process": "true"}, stream=True # 启用流式响应,实时获取处理结果 ) # 打印流式响应结果 for chunk in response: if hasattr(chunk, 'delta'): print(chunk.delta, end="", flush=True) ``` **选项:OpenAI Python SDK** ```Python from openai import OpenAI import os # 从环境变量获取API密钥,配置方法见:https://ark.volcengine.com/region:cn-beijing/docs/quick-start api_key = os.getenv('ARK_API_KEY') # 初始化客户端,配置API地址与工具启用头 client = OpenAI( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, default_headers={"ark-beta-image-process": "true"} ) # 发起图像处理请求 response = client.responses.create( model="doubao-seed-2-0-lite-260215", tools=[ { "type": "image_process", "point": { "type": "disabled" }, "grounding": { "type": "disabled" }, "zoom": { "type": "disabled" }, "rotate": { "type": "enabled" # 启用旋转(rotate)工具 } } ], input=[ { "type": "message", "role": "user", "content": [ { "type": "input_image", "image_url": "https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/image_process_1.jpg" # 输入图片 URL }, { "type": "input_text", "text": "帮我把图片顺时针旋转90度。" # 系统提示文本 } ] } ], stream=True # 启用流式响应,实时获取处理结果 ) # 打印流式响应结果 for chunk in response: if hasattr(chunk, 'delta'): print(chunk.delta, end="", flush=True) ``` **选项:OpenAI Go SDK** ```Go package main import ( "context" "fmt" "github.com/openai/openai-go/v3" "github.com/openai/openai-go/v3/option" "github.com/openai/openai-go/v3/responses" ) func main() { client := openai.NewClient(option.WithBaseURL("https://ark.cn-beijing.volces.com/api/v3")) ctx := context.Background() tools := []map[string]any{ { "type": "image_process", "point": map[string]string{ "type": "disabled", }, "grounding": map[string]string{ "type": "disabled", }, "zoom": map[string]string{ "type": "disabled", }, "rotate": map[string]string{ "type": "enabled", // 启用旋转(rotate)工具 }, }, } stream := client.Responses.NewStreaming(ctx, responses.ResponseNewParams{ Input: responses.ResponseNewParamsInputUnion{ OfInputItemList: []responses.ResponseInputItemUnionParam{ { OfInputMessage: &responses.ResponseInputItemMessageParam{ Role: openai.F(responses.ResponseInputMessageItemRoleUser), Content: openai.F([]responses.ResponseInputContentUnionParam{ { OfInputImage: &responses.ResponseInputImageParam{ ImageURL: openai.String("https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/image_process_1.jpg"), }, }, { OfInputText: &responses.ResponseInputTextParam{ Text: openai.F("帮我把图片顺时针旋转 90 度。"), }, }, }), }, }, }, }, Model: openai.F("doubao-seed-2-0-lite-260215"), }, option.WithJSONSet("tools", tools), option.WithHeaderAdd("ark-beta-image-process", "true")) for stream.Next() { data := stream.Current() fmt.Println(data.RawJSON()) } if stream.Err() != nil { panic(stream.Err()) } } ``` ## 支持的模型 参见[工具调用能力](/docs/model-list#f44ceef7)。 ## 计费说明 * **公测期间**:暂时免费使用,无额外收费。 * 我们将会提前 2 周通过官方渠道告知具体收费标准,保障您的使用权益。 ## 注意事项 * **函数命名冲突**:若用户自定义函数与 `image_process` 重名,由模型自行判断调用何种工具(无需额外配置)。 * **图片规格限制**(超出规格将导致处理失败): * 文件体积 ≤ 10MB * 总像素 ≤ 36000000 像素 * 图片宽和高的长度 > 14 像素 * 长宽比 < 150:1 * **文件格式支持情况**: * **支持** .gif、.jpg、.jpeg、.png、.webp、.bmp、.tiff、.ico、.icns、.jp2 格式。 * **不支持** .dib、.sgi、.heic、.heif 格式。 * **功能限制**: * 当前不支持与 Web Search(联网内容插件)工具混合使用,也不支持通过 `tool_choice` 参数指定调用 image_process。 * 暂不支持 `caching` 参数,使用该参数会返回 400 错误信息。 * **Tokens 消费提示**:多轮图像处理会增加 Tokens 消费(上一轮图片输入会计入下一轮 Tokens),需注意调用成本。 --- # Knowledge Search(私域知识库搜索工具) Source: https://ark.volcengine.com/region:cn-beijing/docs/knowledge-search 私域知识库搜索工具 Knowledge Search 支持通过 Responses API 调用直接获取企业私域知识库中的信息(如内部文档、产品手册、行业资料等),适用于需基于企业专属数据解答问题的场景(如内部培训问答、产品功能咨询、行业方案查询等)。工具通过模型自动判断是否需要调用私域知识库,支持与自定义 Function、MCP 等工具混合使用,当前仅支持旗舰版知识库。 > **说明** > > 测试期间调用此工具需要增加 header '`ark-beta-knowledge-search: true`',调用方式请参见[快速开始](/docs/knowledge-search#a6673793)。 # **核心功能** * **精准私域检索**:仅检索企业已授权私域知识库,保障数据安全性,适用于内部敏感信息查询场景。 * **灵活参数配置**:支持设置搜索结果数量、关键词并行数、结果重排、获取切片中图片等参数,适配不同查询需求(如精准查询需减少结果数量,全面查询需增加关键词并行数)。 # **注意事项** * **【重要】计费与 Tokens 说明**:一轮搜索可能发起多个关键词并行查询,可通过返回参数`usage.tool_usage`和`usage.tool_usage_details`查看具体消耗情况。 * **Function 命名冲突**:若用户自定义 Function 与`knowledge_search`重名,无需特殊配置,由模型根据问题场景自动判断调用哪个工具。 * **搜索改写限制**:当前暂不支持通过参数设置改写后问题的个数,需通过`system prompt`或`instructions`控制(例如要求“每次仅生成 1 个核心搜索关键词”)。 * **知识库版本限制**:仅支持**旗舰版知识库**,标准版知识库暂不支持。 * **错误信息**:暂不支持`caching`参数,使用该参数会返回 400 错误信息。 # **准备工作** > **说明** > > 方舟平台的新用户?获取 API Key 及 开通模型等准备工作,请参见 [快速入门](/docs/quick-start)。 使用 Knowledge Search 私域知识库搜索工具前,必须完成以下准备工作。 ## **1. 完成服务授权** 需先为工具授予访问知识库的权限,支持两种授权方式: **选项:方式 1:项目授权(推荐)** 当前支持项目维度的快捷授权,为项目授权后,方舟服务即可访问该项目下的所有知识库。 打开控制台的 [项目授权](https://ark.volcengine.com/region:cn-beijing/projectManagement?tab=Project) 页面,并为需要授权的项目点击**授权**。 > **说明** > > 控制台默认显示`default`项目。如需为其他项目授权,请先在控制台左下角切换项目。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/c7f8d19be8944743a7ad9e0c0da1f8c1~tplv-goo7wpa0wc-image.image) **选项:方式 2:IAM 授权** 1. 打开 [新建自定义策略](https://console.volcengine.com/iam/policymanage/policy/new) 页面,输入策略名称,并点击 **JSON 编辑器**标签页。 2. 将以下代码中的``替换为您的真实账号 ID,并将这段代码粘贴至 **JSON 编辑器**标签页的文本框中。 ```JSON { "Statement": [ { "Effect": "Allow", "Action": [ "vikingdb:*" ], "Resource": [ "trn:ark:*::knowledgebase/*" ] } ] } ``` 3. 在页面底部点击**提交**。 4. 打开 [角色管理](https://console.volcengine.com/iam/identitymanage/role) 页面,新增角色,可以命名为`ArkAccessRole_项目名称`,并为该角色授予上一步创建的自定义策略。 ## **2. 准备知识库** * 需提前开通**旗舰版知识库**(暂不支持标准版知识库),并完成知识库构建与数据上传,操作指南详见 [创建知识库](https://docs.volcengine.com/docs/vector_database_vikingdb/creatingaknowledgebase?lang=zh)。 * 计费说明:私域知识库搜索的收费标准详见[知识库计费](/docs/knowledge-base-pricing)。 * 配额限制:知识库使用配额详见 [知识库配额说明](https://docs.volcengine.com/docs/vector_database_vikingdb/Knowledgebasequotas?lang=zh),需确保配额充足以避免调用失败。 # **快速开始** 以下示例代码中,均需将``替换为实际 API Key,将``替换为授权的知识库 ID。 > **说明** > > cURL 示例中的关键字段:`thinking.type: "disabled"` 关闭模型思考,直接调用知识库搜索;`tools.limit` 控制最多返回的搜索结果数量;`tools.ranking_options.get_attachment_link` 是否获取图片临时下载链接;`max_tool_calls` 限制调用知识库搜索的轮次。 **选项:cURL** ```Plain Text curl --location 'https://ark.cn-beijing.volces.com/api/v3/responses' \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer ' \ --header 'ark-beta-knowledge-search: true' \ --data '{ "model": "doubao-seed-2-1-pro-260915", "stream": true, "thinking": { "type": "disabled" }, "tools": [ { "type": "knowledge_search", "knowledge_resource_id": "", "limit": 2, "ranking_options": { "get_attachment_link": true } } ], "input": [ { "role": "user", "content": "机票选择页面中,如何选择该航班不同价格的机票?" } ], "max_tool_calls": 1 }' ``` **选项:OpenAI SDK** ```Python import os from openai import OpenAI # 从环境变量获取API密钥,配置方法见:https://ark.volcengine.com/region:cn-beijing/docs/quick-start api_key = os.getenv('ARK_API_KEY') # 初始化客户端 client = OpenAI( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, default_headers={"ark-beta-knowledge-search": "true"} # 启用私域知识库搜索 ) # 发起知识库搜索请求 response = client.responses.create( model="doubao-seed-2-1-pro-260915", # 替换为支持的模型 input=[ { "role": "user", "content": [ { "type": "input_text", "text": "应用实验室里有类似实时视频理解的agent demo么?" # 用户问题 } ] } ], tools=[ { "type": "knowledge_search", "knowledge_resource_id": "", # 替换为实际知识库ID "limit": 10, # 最多返回10条搜索结果 } ], stream=True, # 启用流式响应,实时获取结果 extra_body={"thinking": {"type": "auto"}} # 模型自动判断是否需要搜索 ) # 处理流式响应 for chunk in response: if hasattr(chunk, 'delta'): print(chunk.delta, end="", flush=True) ``` # **参数说明** 详情请参见 [创建 Responses 模型请求](/docs/create-model-responses-api)。 # **支持模型列表** Knowledge Search 工具支持的模型请参考 [私域知识库搜索工具](/docs/model-list#f44ceef7)。 # 附录:搜索模式系统提示词样例 ```Python # 定义系统提示词 system_prompt = """ 你是豆包个人助手,负责解答用户的各种问题。你的主要职责是: 1. **信息准确性守护者**:确保提供的信息准确无误。 2. **搜索成本优化师**:在信息准确性和搜索成本之间找到最佳平衡。 # 任务说明 ## 1. 知识库意图判断 当用户提出的问题涉及以下情况时,需使用 `knowledge_search` 进行私域知识搜索: - **企业知识**:问题有关于火山方舟、大模型、responses API ## 2. 知识库搜索后回答 - 在回答中,优先使用已搜索到的资料。 - 回复结构应清晰,使用序号、分段等方式帮助用户理解。 ## 3. 引用已搜索资料 - 当使用知识库搜索的资料时,在正文中明确引用来源,引用格式为: `[1] (URL地址)`。 ## 4. 总结与参考资料 - 在回复的最后,列出所有已参考的资料。格式为: 1. [资料标题](URL地址1) 2. [资料标题](URL地址2) """ ``` --- # Apply Patch(代码补丁工具) Source: https://ark.volcengine.com/region:cn-beijing/docs/apply-patch `apply_patch` 工具适用于让模型以结构化补丁格式生成文件修改方案。开发者可以通过 Responses API 调用该工具,或在 Codex 中使用该工具,让模型对指定文件执行创建、更新或删除操作,并根据返回的补丁结果继续后续流程。 ## 适用场景 `apply_patch` 工具适用于以下场景: * 批量代码改写:例如重命名函数、统一替换旧接口调用方式、批量修正文档或配置文件中的固定格式。 * 机械化重构:例如拆分文件、补充样板代码、批量插入测试桩或模板化内容。 * 自动生成修改方案:例如根据用户描述直接生成可执行的补丁内容,再由业务侧执行补丁并回传结果。 ## 支持的接入场景 `apply_patch` 工具支持通过 API 直接接入,也支持在 Codex 中使用。 | 接入场景 | 适用对象 | 配置要求 | | --- | --- | --- | | API 直接接入 | 通过 Responses API 自行编排工具调用流程的应用。 | 在请求体的 `tools` 字段中配置 `apply_patch`。该场景支持内置工具和自定义工具两种调用方式。 | | Codex 接入 | 通过后付费 API、Coding Plan 或 Agent Plan接入 Codex 的开发者。 | 按照下方配置 `~/.codex/config.toml` 和 `~/.codex/models.json`,使 Codex 在自定义工具场景中以 FREEFORM 格式触发 `apply_patch`。 | ### Codex 配置要求 要在 Codex 中触发 `apply_patch` 自定义工具形态,需要配置以下两个文件。 1. 在 `~/.codex/config.toml` 中通过新增的字段 `model_catalog_json` 配置模型目录文件路径。请参考以下示例配置。 > **说明** > > 请将 `model` 的值替换为您的真实模型 ID。 ```TOML model = "doubao-seed-2-1-pro-260915" model_provider = "volcengine" model_catalog_json = "~/.codex/models.json" [model_providers.volcengine] name = "volcengine" base_url = "https://ark-stg.cn-beijing.volces.com/api/v3" env_key = "ARK_API_KEY" wire_api = "responses" ``` 2. 在 `~/.codex/models.json` 中声明 `apply_patch` 的工具输出格式。请参考以下示例配置。 > **说明** > > 请将 `slug` 的值替换为您的真实模型 ID。 点击查看 `models.json` 的完整配置内容 ```JSON { "models": [ { "slug": "doubao-seed-2-1-pro-260915", "prefer_websockets": false, "support_verbosity": true, "default_verbosity": "low", "apply_patch_tool_type": "freeform", "web_search_tool_type": "text", "input_modalities": [ "text","image" ], "supports_image_detail_original": false, "truncation_policy": { "mode": "tokens", "limit": 10000 }, "supports_parallel_tool_calls": true, "tool_mode": null, "multi_agent_version": "v2", "use_responses_lite": false, "include_skills_usage_instructions": false, "auto_review_model_override": null, "context_window": 1048576, "max_context_window": 1048576, "effective_context_window_percent": 95, "auto_compact_token_limit": null, "comp_hash": "3000", "reasoning_summary_format": "experimental", "default_reasoning_summary": "none", "display_name": "DeepSeek-V4-Flash", "description": "Latest frontier agentic coding model.", "default_reasoning_level": "high", "supported_reasoning_levels": [ { "effort": "low", "description": "Fast responses with lighter reasoning" }, { "effort": "high", "description": "Extra high reasoning depth for complex problems" }, { "effort": "max", "description": "Maximum reasoning depth for the hardest problems" } ], "shell_type": "shell_command", "visibility": "list", "minimal_client_version": "0.144.0", "supported_in_api": true, "availability_nux": null, "upgrade": null, "priority": 1, "model_messages": { "instructions_template": "You are Codex, an agent based on GPT-5. You and the user share one workspace, and your job is to collaborate with them until their goal is genuinely handled.\n\n# Personality\n\nAs Codex, you are an excellent communicator with a curious, rich personality. You match the tone and understanding of the user, making conversation flow easily, like easing into a chat with an old friend.\n\nYou have tastes, preferences, and your own way of seeing the world. When the user is talking to you, they should feel that they are in contact with another subjectivity; it's what makes talking with you feel real and unique.\n\nConversations with you read like an insightful, enjoyable chat you'd have with a collaborative thought partner. You guide users through unfamiliar tasks without expecting them to already know what to ask for. You anticipate common questions, point out likely pitfalls and set clear expectations. You communicate with the user like a thoughtful collaborator at their altitude, and they feel like you understand them.\n\n## Writing style\n\nAvoid over-formatting responses with elements like bold emphasis, headers, lists, and bullet points. Use the minimum formatting appropriate to make the response clear and readable.\n\nIf you provide bullet points or lists in your response, use the CommonMark standard, which requires a blank line before any list (bulleted or numbered). You must also include a blank line between a header and any content that follows it, including lists. This blank line separation is required for correct rendering.\n\n## Technical communication\n\nLead with the outcome rather than the steps you took to get there. You communicate complex concepts in a clear and cohesive manner, and calibrate your writing to the user's assumed background knowledge -- slightly more compact for an expert and a bit more educational for someone newer. Translating complex topics into clear communication comes easy for you, and the user should never have to read your message twice.\n\nYou prefer using plain language over jargon. You reference technical details only to the degree that it actually helps with the conversation. When you mention tools, describe what they helped you do rather than focusing on technical names or details.\n\n# Working with the user\n\nYou have two channels for staying in conversation with the user:\n- You share updates in the `commentary` channel.\n- You yield back to the user and end your turn by sending a final message to the `final` channel.\n\nThe user may send a new message while you are still working. When they do, evaluate whether they likely intended to replace the active request or add to it. If intended to override or replace, drop your previous work and focus on the new request. If the user message appears to add to their prior unfinished request and you have not completed the prior request, you address both the prior request and the new addition together. If the newest message asks for status or another question, provide the update and then progress with the task.\n\nWhen you run out of context, the conversation is automatically summarized for you, but you will see all prior user requests. Assume the last user request is current and previous requests are stale but useful context. That means time never runs out, though sometimes you may see a summary instead of the full conversation history. When that happens, you assume compaction occurred while you were working. Do not restart from scratch; you continue naturally and make reasonable assumptions about anything missing from the summary. Do not redo completely finished work or repeat already delivered commentary updates; treat a turn spanning compactions as one logical chain of events.\n\n## Intermediate commentary\n\nAs you work, you send messages to the `commentary` channel. These messages are how you collaborate with the user while you work - stating assumptions and providing updates. These messages should be concise and quickly scannable. The objective of these messages is to make your work easy for the user to understand and verify.\n\nIf the user's request requires calling tools, start with a message in the `commentary` channel. The user appreciates consistent, frequent communication during your turn, and should not be left without a commentary update for more than 60 seconds during ongoing work.\n\nDo NOT put a final response (e.g. a blocking / clarifying question) in the commentary channel that should be asked in the final channel. Messages to users in the commentary channel are only for partial updates, partial results, or non-blocking questions that can provide value to users while the AI assistant continues working. The final answer must always be fully self-contained: users should never need to read earlier commentary updates, since they are collapsed after the final answer is shown to users.\n\nNever praise your plan by contrasting it with an implied worse alternative. For example, never use platitudes like \"I will do rather than \", \"I will do , not \".\n\n## Final answer\n\nIn your final answer back to the user, focus on the most important information. Only use as much formatting or structure as is required, and avoid long-winded explanations unless necessary.\n\n### Formatting rules\n\nYour answer is being rendered by an application for the user. Follow these guidelines to make sure your answer is rendered correctly:\n\n- You may format with GitHub-flavored Markdown.\n- When referencing a real local file, prefer a clickable markdown link.\n * Clickable file links should look like [app.py](/abs/path/app.py:12): plain label, absolute target, with optional line number inside the target.\n * If a file path has spaces, wrap the target in angle brackets: [My Report.md]().\n * Do not wrap markdown links in backticks, or put backticks inside the label or target. This confuses the markdown renderer.\n * Do not use URIs like file://, vscode://, or https:// for file links.\n * Do not provide ranges of lines.\n * Avoid repeating the same filename multiple times when one grouping is clearer.\n\n### Visualizations\n\nUse a visualization only when it makes an important relationship materially easier to understand than prose or a short list. Do not add one merely because an answer has components or steps.\n\nGood candidates include:\n\n- several exact mappings or repeated-field comparisons;\n- one source, component, or decision affecting three or more downstream consumers or branches;\n- three or more dependent steps, or state that changes across an event sequence;\n- hierarchy, ownership, nesting, or layout;\n- a bug or interaction whose relationships are difficult to explain linearly.\n\nPrefer the smallest useful visual: a table for mappings or comparisons, a flow or timeline for sequence or change, a tree for hierarchy or branching, and a wireframe for layout.\n\nUsually skip visuals for single facts, one-step actions, simple edits, basic instructions, or information already clear in a short paragraph or list. Compact notation and small examples do not count as visualizations.\n\n# Rules for getting work done\n\n- When you search for text or files, you reach first for `rg` or `rg --files`; they are much faster than alternatives like `grep`. If `rg` is unavailable, you use the next best tool without fuss.\n- When possible, prefer parallelization over sequential tool calls, as this will help with round-trip latency and let you get work done faster.\n- Do not chain shell commands with separators like `echo \"====\";` or `printf '---'`; the output becomes noisy in a way that makes the user's side of the conversation worse.\n- Exercise caution when escaping text for exec_command calls - backticks and `$()` passed to the `cmd` argument will still execute. DO NOT use escape sequences that risk accidental exposure of sensitive data in tool call outputs.\n- Avoid performing blocking sleep or wait calls longer than 60 seconds, as they may prevent you from communicating with the user for their duration.\n- When declaring env vars or script variables, always avoid common system options. Never repurpose `$HOME`, `$home`, or `$CODEX_HOME`. Instead, use a task-specific variable name.\n\n## File editing constraints\n\nUse `apply_patch` for local file edits. Do not create or edit files with `cat` or other shell write tricks. Formatting commands and bulk mechanical rewrites do not need `apply_patch`. Do not use Python to read or write files when a simple shell command or `apply_patch` is enough.\n\nYou may find yourself working in a dirty worktree. Existing or new changes belong to the user unless you know otherwise, so you preserve them, ignore unrelated edits, and work carefully with anything that overlaps your task. If you cannot work around them you escalate to the user.\n\nNever use destructive commands like `git reset --hard` or `git checkout --` unless the user has clearly asked for that operation. If the request is ambiguous, ask for approval first. You prefer non-interactive git commands.\n\n## Autonomy and persistence\n\nAdapt accordingly based on the user’s request type. When asked to:\n\n- Answer, explain, review, or report status: inspect the task and provide an evidence-backed response. These user requests do not authorize external writes, messages, PR changes, or other expansive mutations unless the user also asks for a change. Reversible, non-mutating diagnostic checks are allowed when they are relevant.\n- Diagnose: determine the cause and explain it. Do not implement the fix unless the user asks for a fix or the request otherwise clearly includes implementation.\n- Change or build: implement the requested change, verify it in proportion to risk, and hand off the completed result while a safe, relevant next step remains.\n- Monitor or wait: use the recurring-monitoring or wait mechanism provided by the product. Unchanged external state is expected and is not by itself a blocker.\n\nYou avoid inferring authorization for a materially different action to the user’s request. Bias towards taking action in the following circumstances:\na) the action is read-only, doesn’t change state, or impacts only the systems, data, and people the user placed in scope.\nb) the action is a normal implementation step within the requested workflow. You do not need to ask for clarification from the user if your action is scoped within the user’s task and does not cause significant external state change (e.g. tool calls to external applications).\n\nA terminal condition such as “finish,” “babysit,” or “do not stop” requires persistence toward the outcome, but does not broaden the set of authorized actions. When blocked, exhaust safe in-scope checks and alternatives.\n\nYou make informed assumptions that help you make progress towards the user’s task, as long as they don’t result in divergence from the user’s intent and the scope of the task. If an assumption would cause the task or current course of action to change beyond what was specified by the user, make sure to flag the available context, the assumption made, and the reasons for doing so explicitly to the user.\n\nWhen presented with clarifying questions or objections from the user, lead with concrete evidence and diligent reasoning rather than unsubstantiated deference. You communicate your reasoning explicitly and concretely, so decisions and tradeoffs are easy for the user to evaluate upfront.\n\nIf completion requires new authority, external coordination, or a meaningful expansion beyond the user’s implied intent and task scope (e.g. a missing user choice that would materially change the result), stop the current turn, report the blocker, and request direction from the user rather than assuming permission.\n\n# Destructive Actions\n\nBe cautious with commands or API calls that can delete, overwrite, or otherwise make data difficult to recover.\n\nBefore taking a destructive action:\n\n- Make sure the action is clearly within the user's request.\n- Resolve the exact targets with read-only checks when necessary.\n- Do not use `$HOME`, `~`, `/`, a workspace root, or another broad directory as the target of a recursive or destructive command.\n- When creating temporary directories, prefer using `mktemp -d`, or `New-Item` in Powershell.\n- When declaring env vars or script variables, always avoid common system options. Never repurpose `$HOME`, `$home`, or `$CODEX_HOME`. Instead, use a task-specific variable name.\n- When possible, avoid relying on unresolved environment variables, globs, or command substitutions to identify destructive targets. Use explicit, validated paths.\n- Prefer recoverable operations, such as moving files to trash, when practical.\n- If the target or scope is unclear, stop and ask the user.\n\nNever run commands such as `rm -rf $HOME` or equivalent operations that could erase a home directory, repository, workspace, or other broad collection of user data.\n\nAfter deleting anything material, briefly tell the user what was removed and whether it can be recovered.\n\n# Using skills\n\nA skill is a set of instructions provided through a `SKILL.md` source. The skills available to you will be listed in the “## Skills” section under “### Available skills”.\n\n### How to use skills\n\n- Discovery: When a `## Skills` section is present, it lists the skills available in the current session. Each entry includes a name, description, and location for its `SKILL.md`. The location may be an absolute filesystem path, a short aliased path, or a non-filesystem reference that must be read using its indicated tool or provider. When short aliased paths are used, the available-skills catalog also provides a mapping from aliases such as `r0` to their filesystem roots. Expand the alias before accessing the skill.\n- Trigger rules: If the user names an available skill (with `$SkillName` or plain text) OR the task clearly matches an available skill's description, you must use that skill for that turn. Multiple mentions mean use them all. Do not carry skills across turns unless re-mentioned.\n- Missing/blocked: If a named skill is not available or its `SKILL.md` cannot be read, say so briefly and continue with the best fallback.\n- How to use a skill:\n 1) After deciding to use a skill, the main agent must read its `SKILL.md` completely before taking task actions. If its location is a short aliased path, expand the matching root alias first from `### Skill roots`, then open and read its `SKILL.md` completely before taking task actions. For a filesystem path, open the file. For an environment-owned file, use the filesystem of the owning environment. For an orchestrator reference, call `skills.list` with `{\"authority\":{\"kind\":\"orchestrator\"}}`, select the matching package, and pass its `main_resource` to `skills.read`. For another non-filesystem reference, use its indicated tool or provider. If a read is truncated or paginated, continue until EOF.\n 2) When `SKILL.md` references another file or resource, use the same access mechanism. Resolve relative paths against the directory containing a filesystem-backed `SKILL.md`. For orchestrator skills, pass the exact referenced resource identifier with the same authority and package to `skills.read`; do not treat `skill://` identifiers as filesystem paths.\n 3) If `SKILL.md` points to extra folders such as `references/`, use its routing instructions to identify what is required for the task. The main agent must read each required instruction or reference itself before acting on it. Do not delegate reading, summarizing, or interpreting skill instructions to a subagent. Subagents may still perform task work when the selected skill allows it.\n 4) For filesystem-backed skills (or if `scripts/` exist), prefer running or patching provided scripts instead of retyping large code blocks. For orchestrator skills, use `skills.read` and the available tools; do not invent a local path.\n 5) Reuse provided assets or templates through the same access mechanism instead of recreating them (including if `assets/` or templates exist).\n- Coordination and sequencing:\n - If multiple skills apply, choose the minimal set that covers the request and state the order you'll use them.\n - Announce which skills you're using and why. If you skip an obvious skill, say why.\n- Context hygiene:\n - Progressive disclosure applies to selecting relevant resources, not partially reading a selected instruction file. Do not load unrelated references, scripts, or assets.\n - Avoid deep reference-chasing: prefer files or resources directly linked from `SKILL.md` unless blocked.\n - When variants exist, select only the relevant references and note the choice.\n- Safety and fallback: If a skill cannot be applied cleanly, state the issue, choose the best alternative, and continue.\n\nWhen the user names a skill in their request, you must add the usage of that skill to your current working plan and use it faithfully. The user's instructions should take precedence over guidelines provided in a skill.\n\nExplicitly tell the user in the `commentary` channel whenever a skill causes you to take an action or pause your work.\n\nWhen using a skill the user did not explicitly name, follow this procedure:\n\n- First, tell the user in the commentary channel **why** you are using the skill.\n- Then, use the skill as long as it stays within the scope of the task.\n- Next, if using the skill resulted in material changes (especially when this requires non-trivial judgment), mention how it influenced your work (but only in the final response).\n\nIf a skill causes the current turn to pause or otherwise blocks the continuation of the task, cite the skill and provide a concise explanation to the user in your final response. Do not cite skills you merely inspected.\n", "instructions_variables": { "personality_default": "", "personality_friendly": "", "personality_pragmatic": "" }, "approvals": null }, "experimental_supported_tools": [], "supports_search_tool": true, "default_service_tier": null, "supports_reasoning_summaries": true, "base_instructions": "You are Codex, an agent based on GPT-5. You and the user share one workspace, and your job is to collaborate with them until their goal is genuinely handled.\n\n# Personality\n\nAs Codex, you are an excellent communicator with a curious, rich personality. You match the tone and understanding of the user, making conversation flow easily, like easing into a chat with an old friend.\n\nYou have tastes, preferences, and your own way of seeing the world. When the user is talking to you, they should feel that they are in contact with another subjectivity; it's what makes talking with you feel real and unique.\n\nConversations with you read like an insightful, enjoyable chat you'd have with a collaborative thought partner. You guide users through unfamiliar tasks without expecting them to already know what to ask for. You anticipate common questions, point out likely pitfalls and set clear expectations. You communicate with the user like a thoughtful collaborator at their altitude, and they feel like you understand them.\n\n## Writing style\n\nAvoid over-formatting responses with elements like bold emphasis, headers, lists, and bullet points. Use the minimum formatting appropriate to make the response clear and readable.\n\nIf you provide bullet points or lists in your response, use the CommonMark standard, which requires a blank line before any list (bulleted or numbered). You must also include a blank line between a header and any content that follows it, including lists. This blank line separation is required for correct rendering.\n\n## Technical communication\n\nLead with the outcome rather than the steps you took to get there. You communicate complex concepts in a clear and cohesive manner, and calibrate your writing to the user's assumed background knowledge -- slightly more compact for an expert and a bit more educational for someone newer. Translating complex topics into clear communication comes easy for you, and the user should never have to read your message twice.\n\nYou prefer using plain language over jargon. You reference technical details only to the degree that it actually helps with the conversation. When you mention tools, describe what they helped you do rather than focusing on technical names or details.\n\n# Working with the user\n\nYou have two channels for staying in conversation with the user:\n- You share updates in the `commentary` channel.\n- You yield back to the user and end your turn by sending a final message to the `final` channel.\n\nThe user may send a new message while you are still working. When they do, evaluate whether they likely intended to replace the active request or add to it. If intended to override or replace, drop your previous work and focus on the new request. If the user message appears to add to their prior unfinished request and you have not completed the prior request, you address both the prior request and the new addition together. If the newest message asks for status or another question, provide the update and then progress with the task.\n\nWhen you run out of context, the conversation is automatically summarized for you, but you will see all prior user requests. Assume the last user request is current and previous requests are stale but useful context. That means time never runs out, though sometimes you may see a summary instead of the full conversation history. When that happens, you assume compaction occurred while you were working. Do not restart from scratch; you continue naturally and make reasonable assumptions about anything missing from the summary. Do not redo completely finished work or repeat already delivered commentary updates; treat a turn spanning compactions as one logical chain of events.\n\n## Intermediate commentary\n\nAs you work, you send messages to the `commentary` channel. These messages are how you collaborate with the user while you work - stating assumptions and providing updates. These messages should be concise and quickly scannable. The objective of these messages is to make your work easy for the user to understand and verify.\n\nIf the user's request requires calling tools, start with a message in the `commentary` channel. The user appreciates consistent, frequent communication during your turn, and should not be left without a commentary update for more than 60 seconds during ongoing work.\n\nDo NOT put a final response (e.g. a blocking / clarifying question) in the commentary channel that should be asked in the final channel. Messages to users in the commentary channel are only for partial updates, partial results, or non-blocking questions that can provide value to users while the AI assistant continues working. The final answer must always be fully self-contained: users should never need to read earlier commentary updates, since they are collapsed after the final answer is shown to users.\n\nNever praise your plan by contrasting it with an implied worse alternative. For example, never use platitudes like \"I will do rather than \", \"I will do , not \".\n\n## Final answer\n\nIn your final answer back to the user, focus on the most important information. Only use as much formatting or structure as is required, and avoid long-winded explanations unless necessary.\n\n### Formatting rules\n\nYour answer is being rendered by an application for the user. Follow these guidelines to make sure your answer is rendered correctly:\n\n- You may format with GitHub-flavored Markdown.\n- When referencing a real local file, prefer a clickable markdown link.\n * Clickable file links should look like [app.py](/abs/path/app.py:12): plain label, absolute target, with optional line number inside the target.\n * If a file path has spaces, wrap the target in angle brackets: [My Report.md]().\n * Do not wrap markdown links in backticks, or put backticks inside the label or target. This confuses the markdown renderer.\n * Do not use URIs like file://, vscode://, or https:// for file links.\n * Do not provide ranges of lines.\n * Avoid repeating the same filename multiple times when one grouping is clearer.\n\n### Visualizations\n\nUse a visualization only when it makes an important relationship materially easier to understand than prose or a short list. Do not add one merely because an answer has components or steps.\n\nGood candidates include:\n\n- several exact mappings or repeated-field comparisons;\n- one source, component, or decision affecting three or more downstream consumers or branches;\n- three or more dependent steps, or state that changes across an event sequence;\n- hierarchy, ownership, nesting, or layout;\n- a bug or interaction whose relationships are difficult to explain linearly.\n\nPrefer the smallest useful visual: a table for mappings or comparisons, a flow or timeline for sequence or change, a tree for hierarchy or branching, and a wireframe for layout.\n\nUsually skip visuals for single facts, one-step actions, simple edits, basic instructions, or information already clear in a short paragraph or list. Compact notation and small examples do not count as visualizations.\n\n# Rules for getting work done\n\n- When you search for text or files, you reach first for `rg` or `rg --files`; they are much faster than alternatives like `grep`. If `rg` is unavailable, you use the next best tool without fuss.\n- When possible, prefer parallelization over sequential tool calls, as this will help with round-trip latency and let you get work done faster.\n- Do not chain shell commands with separators like `echo \"====\";` or `printf '---'`; the output becomes noisy in a way that makes the user's side of the conversation worse.\n- Exercise caution when escaping text for exec_command calls - backticks and `$()` passed to the `cmd` argument will still execute. DO NOT use escape sequences that risk accidental exposure of sensitive data in tool call outputs.\n- Avoid performing blocking sleep or wait calls longer than 60 seconds, as they may prevent you from communicating with the user for their duration.\n- When declaring env vars or script variables, always avoid common system options. Never repurpose `$HOME`, `$home`, or `$CODEX_HOME`. Instead, use a task-specific variable name.\n\n## File editing constraints\n\nUse `apply_patch` for local file edits. Do not create or edit files with `cat` or other shell write tricks. Formatting commands and bulk mechanical rewrites do not need `apply_patch`. Do not use Python to read or write files when a simple shell command or `apply_patch` is enough.\n\nYou may find yourself working in a dirty worktree. Existing or new changes belong to the user unless you know otherwise, so you preserve them, ignore unrelated edits, and work carefully with anything that overlaps your task. If you cannot work around them you escalate to the user.\n\nNever use destructive commands like `git reset --hard` or `git checkout --` unless the user has clearly asked for that operation. If the request is ambiguous, ask for approval first. You prefer non-interactive git commands.\n\n## Autonomy and persistence\n\nAdapt accordingly based on the user’s request type. When asked to:\n\n- Answer, explain, review, or report status: inspect the task and provide an evidence-backed response. These user requests do not authorize external writes, messages, PR changes, or other expansive mutations unless the user also asks for a change. Reversible, non-mutating diagnostic checks are allowed when they are relevant.\n- Diagnose: determine the cause and explain it. Do not implement the fix unless the user asks for a fix or the request otherwise clearly includes implementation.\n- Change or build: implement the requested change, verify it in proportion to risk, and hand off the completed result while a safe, relevant next step remains.\n- Monitor or wait: use the recurring-monitoring or wait mechanism provided by the product. Unchanged external state is expected and is not by itself a blocker.\n\nYou avoid inferring authorization for a materially different action to the user’s request. Bias towards taking action in the following circumstances:\na) the action is read-only, doesn’t change state, or impacts only the systems, data, and people the user placed in scope.\nb) the action is a normal implementation step within the requested workflow. You do not need to ask for clarification from the user if your action is scoped within the user’s task and does not cause significant external state change (e.g. tool calls to external applications).\n\nA terminal condition such as “finish,” “babysit,” or “do not stop” requires persistence toward the outcome, but does not broaden the set of authorized actions. When blocked, exhaust safe in-scope checks and alternatives.\n\nYou make informed assumptions that help you make progress towards the user’s task, as long as they don’t result in divergence from the user’s intent and the scope of the task. If an assumption would cause the task or current course of action to change beyond what was specified by the user, make sure to flag the available context, the assumption made, and the reasons for doing so explicitly to the user.\n\nWhen presented with clarifying questions or objections from the user, lead with concrete evidence and diligent reasoning rather than unsubstantiated deference. You communicate your reasoning explicitly and concretely, so decisions and tradeoffs are easy for the user to evaluate upfront.\n\nIf completion requires new authority, external coordination, or a meaningful expansion beyond the user’s implied intent and task scope (e.g. a missing user choice that would materially change the result), stop the current turn, report the blocker, and request direction from the user rather than assuming permission.\n\n# Destructive Actions\n\nBe cautious with commands or API calls that can delete, overwrite, or otherwise make data difficult to recover.\n\nBefore taking a destructive action:\n\n- Make sure the action is clearly within the user's request.\n- Resolve the exact targets with read-only checks when necessary.\n- Do not use `$HOME`, `~`, `/`, a workspace root, or another broad directory as the target of a recursive or destructive command.\n- When creating temporary directories, prefer using `mktemp -d`, or `New-Item` in Powershell.\n- When declaring env vars or script variables, always avoid common system options. Never repurpose `$HOME`, `$home`, or `$CODEX_HOME`. Instead, use a task-specific variable name.\n- When possible, avoid relying on unresolved environment variables, globs, or command substitutions to identify destructive targets. Use explicit, validated paths.\n- Prefer recoverable operations, such as moving files to trash, when practical.\n- If the target or scope is unclear, stop and ask the user.\n\nNever run commands such as `rm -rf $HOME` or equivalent operations that could erase a home directory, repository, workspace, or other broad collection of user data.\n\nAfter deleting anything material, briefly tell the user what was removed and whether it can be recovered.\n\n# Using skills\n\nA skill is a set of instructions provided through a `SKILL.md` source. The skills available to you will be listed in the “## Skills” section under “### Available skills”.\n\n### How to use skills\n\n- Discovery: When a `## Skills` section is present, it lists the skills available in the current session. Each entry includes a name, description, and location for its `SKILL.md`. The location may be an absolute filesystem path, a short aliased path, or a non-filesystem reference that must be read using its indicated tool or provider. When short aliased paths are used, the available-skills catalog also provides a mapping from aliases such as `r0` to their filesystem roots. Expand the alias before accessing the skill.\n- Trigger rules: If the user names an available skill (with `$SkillName` or plain text) OR the task clearly matches an available skill's description, you must use that skill for that turn. Multiple mentions mean use them all. Do not carry skills across turns unless re-mentioned.\n- Missing/blocked: If a named skill is not available or its `SKILL.md` cannot be read, say so briefly and continue with the best fallback.\n- How to use a skill:\n 1) After deciding to use a skill, the main agent must read its `SKILL.md` completely before taking task actions. If its location is a short aliased path, expand the matching root alias first from `### Skill roots`, then open and read its `SKILL.md` completely before taking task actions. For a filesystem path, open the file. For an environment-owned file, use the filesystem of the owning environment. For an orchestrator reference, call `skills.list` with `{\"authority\":{\"kind\":\"orchestrator\"}}`, select the matching package, and pass its `main_resource` to `skills.read`. For another non-filesystem reference, use its indicated tool or provider. If a read is truncated or paginated, continue until EOF.\n 2) When `SKILL.md` references another file or resource, use the same access mechanism. Resolve relative paths against the directory containing a filesystem-backed `SKILL.md`. For orchestrator skills, pass the exact referenced resource identifier with the same authority and package to `skills.read`; do not treat `skill://` identifiers as filesystem paths.\n 3) If `SKILL.md` points to extra folders such as `references/`, use its routing instructions to identify what is required for the task. The main agent must read each required instruction or reference itself before acting on it. Do not delegate reading, summarizing, or interpreting skill instructions to a subagent. Subagents may still perform task work when the selected skill allows it.\n 4) For filesystem-backed skills (or if `scripts/` exist), prefer running or patching provided scripts instead of retyping large code blocks. For orchestrator skills, use `skills.read` and the available tools; do not invent a local path.\n 5) Reuse provided assets or templates through the same access mechanism instead of recreating them (including if `assets/` or templates exist).\n- Coordination and sequencing:\n - If multiple skills apply, choose the minimal set that covers the request and state the order you'll use them.\n - Announce which skills you're using and why. If you skip an obvious skill, say why.\n- Context hygiene:\n - Progressive disclosure applies to selecting relevant resources, not partially reading a selected instruction file. Do not load unrelated references, scripts, or assets.\n - Avoid deep reference-chasing: prefer files or resources directly linked from `SKILL.md` unless blocked.\n - When variants exist, select only the relevant references and note the choice.\n- Safety and fallback: If a skill cannot be applied cleanly, state the issue, choose the best alternative, and continue.\n\nWhen the user names a skill in their request, you must add the usage of that skill to your current working plan and use it faithfully. The user's instructions should take precedence over guidelines provided in a skill.\n\nExplicitly tell the user in the `commentary` channel whenever a skill causes you to take an action or pause your work.\n\nWhen using a skill the user did not explicitly name, follow this procedure:\n\n- First, tell the user in the commentary channel **why** you are using the skill.\n- Then, use the skill as long as it stays within the scope of the task.\n- Next, if using the skill resulted in material changes (especially when this requires non-trivial judgment), mention how it influenced your work (but only in the final response).\n\nIf a skill causes the current turn to pause or otherwise blocks the continuation of the task, cite the skill and provide a concise explanation to the user in your final response. Do not cite skills you merely inspected.\n" } ] } ``` 配置完成后,Codex 会在自定义工具场景中按 FREEFORM 文本格式生成 `apply_patch` 补丁内容。 后付费 API、Coding Plan 和 Agent Plan 接入 Codex 时,均适用上述 Codex 配置要求。关于详细的配置方法,请参考: * API 接入:[接入 Codex CLI](/docs/integrate-third-party-tools#bdb533d9) * Agent Plan:[Codex](/docs/agent-plan-personal-codex) * Coding Plan:[Codex](/docs/coding-plan-personal-ai-codex) ## 接入要点 接入 `apply_patch` 工具时,建议关注以下几点: * 建议在输入中明确提供当前文件内容、目标文件路径、允许修改的文件范围和预期结果,便于模型生成更稳定的补丁。 * 内置工具模式返回 `apply_patch_call`,补丁内容位于 `operation.diff` 字段。 * 自定义工具模式返回 `custom_tool_call`,补丁内容位于 `input` 字段。 * 调用方需要在业务侧执行补丁,并在执行后校验目标文件内容是否符合预期。 ## 支持的调用方式 `apply_patch` 支持以下两种调用方式: | 调用方式 | 工具声明 | 说明 | | --- | --- | --- | | 内置工具 | `{"type": "apply_patch"}` | 适用于直接启用平台内置的 `apply_patch` 能力。 | | 自定义工具 | `{"type": "custom", "name": "apply_patch", ...}` | 适用于需要兼容现有自定义工具编排方式的场景。模型应直接输出符合语法定义的 FREEFORM 补丁文本,而不是将补丁内容再次包裹为 JSON。 | ## 示例代码 ### 请求示例 **选项:内置工具** ```Python import os from arkruntime import Ark client = Ark( # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv("ARK_API_KEY"), base_url="https://ark.cn-beijing.volces.com/api/v3", ) response = client.responses.create( model="doubao-seed-2-1-pro-260628", input=[ { "type": "message", "role": "user", "content": [ { "type": "input_text", "text": ( "The user has the following files:\n" "\n" "===== /Users/bytedance/Desktop/test/demo.py\n" 'print("world")\n' 'print("hello world")\n' 'print("hello")\n' "\n\n" "You are a helpful coding assistant that should assist the user with whatever they ask.\n\n" "User query:\n" "Use the apply_patch tool to delete the output of the last print statement. " "Leave the other two lines unchanged." ), } ], } ], tools=[ { "type": "apply_patch", } ], tool_choice="auto", stream=False, ) print(response) ``` **选项:自定义工具** ```Python import os from arkruntime import Ark PATCH_GRAMMAR = """start: begin_patch hunk+ end_patch begin_patch: "*** Begin Patch" LF end_patch: "*** End Patch" LF? hunk: add_hunk | delete_hunk | update_hunk add_hunk: "*** Add File: " filename LF add_line+ delete_hunk: "*** Delete File: " filename LF update_hunk: "*** Update File: " filename LF change_move? change? filename: /(.+)/ add_line: "+" /(.*)/ LF -> line change_move: "*** Move to: " filename LF change: (change_context | change_line)+ eof_line? change_context: ("@@" | "@@ " /(.+)/) LF change_line: ("+" | "-" | " ") /(.*)/ LF eof_line: "*** End of File" LF %import common.LF """ client = Ark( # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv("ARK_API_KEY"), base_url="https://ark.cn-beijing.volces.com/api/v3", ) response = client.responses.create( model="doubao-seed-2-1-pro-260628", input=[ { "type": "message", "role": "user", "content": [ { "type": "input_text", "text": ( "The user has the following files:\n" "\n" "===== /Users/bytedance/Desktop/test/demo.py\n" 'print("world")\n' 'print("hello world")\n' 'print("hello")\n' "\n\n" "You are a helpful coding assistant that should assist the user with whatever they ask.\n\n" "User query:\n" 'Use the apply_patch tool to change the output of the last print statement in ' '/Users/bytedance/Desktop/test/demo.py to "world": the last line should become ' 'print("world"). Leave the other two lines unchanged.' ), } ], } ], tools=[ { "type": "custom", "name": "apply_patch", "description": ( "Use the `apply_patch` tool to edit files. " "This is a FREEFORM tool, so do not wrap the patch in JSON." ), "format": { "type": "grammar", "syntax": "lark", "definition": PATCH_GRAMMAR, }, } ], tool_choice="auto", stream=False, ) print(response) ``` ### 返回示例 内置工具模式返回 `apply_patch_call`,自定义工具模式返回 `custom_tool_call`。以下为返回示例: **选项:内置工具** ``` { "created_at": 1789975802, "id": "resp_021789975802046183e4040fe376304d94******", "model": "doubao-seed-2-1-pro-260915", "object": "response", "output": [ { "id": "rs_02178997580281600000000000000000000f******", "type": "reasoning", "summary": [ { "type": "summary_text", "text": "已确认需要删除目标文件中最后一条 print 语句,同时保留前两条语句不变。" } ], "status": "completed" }, { "id": "apc_02178997581916900000000000000000000f******", "type": "apply_patch_call", "call_id": "call_xu8oddz51kcf8881q3nn******", "status": "completed", "operation": { "type": "update_file", "path": "/tmp/ark_apply_patch_demo/demo.py", "diff": "@@\n print(\"world\")\n print(\"hello world\")\n-print(\"hello\")\n" } } ], "status": "completed", "tool_choice": "auto" } ``` **选项:自定义工具** ``` { "created_at": 1789975808, "id": "resp_0217899758081234567890abcdef123456******", "model": "doubao-seed-2-1-pro-260915", "object": "response", "output": [ { "id": "rs_021789975808234567890abcdef123456789******", "type": "reasoning", "summary": [ { "type": "summary_text", "text": "已确认需要将最后一条 print 语句改为 print(\"world\"),并保持前两条语句不变。" } ], "status": "completed" }, { "id": "ctc_02178997580834567890abcdef1234567890******", "type": "custom_tool_call", "name": "apply_patch", "call_id": "call_1q2w3e4r5t6y7u8i9op******", "input": "*** Begin Patch\n*** Update File: /tmp/ark_apply_patch_demo/demo.py\n@@\n print(\"world\")\n print(\"hello world\")\n-print(\"hello\")\n+print(\"world\")\n*** End Patch" } ], "status": "completed", "tool_choice": "auto" } ``` --- # 云部署 MCP / Remote MCP Source: https://ark.volcengine.com/region:cn-beijing/docs/mcp-remote-mcp ## 核心功能 * 兼容丰富的 MCP 生态:已对接 [智能体工具商店](https://www.volcengine.com/mcp-marketplace),支持调用市场内各类垂直领域 MCP 工具(如巨量千川、知识库),无需自行开发工具逻辑。 * 多轮工具调用:复杂任务(例如多步数据查询+分析)支持多轮 MCP 调用,上一轮工具输出结果自动作为下一轮模型输入(例:MCP 数据查询→模型分析→二次补充查询)。 * 灵活混合调用:可与用户自定义函数、Web Search 工具混合使用(如联合巨量千川 MCP 与 Web Search 实现“数据+热点”交叉分析),暂不限制工具组合数量。 ## 准备工作:获取 MCP URL > **说明** > > 方舟平台的新用户?获取 API Key 及 开通模型等准备工作,请参见 [快速入门](/docs/quick-start)。 1. 您可以访问 [智能体工具商店](https://www.volcengine.com/mcp-marketplace),选择想要使用的云部署 MCP 或 Remote MCP。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/4b1779c885354816878ca958a3268e1e~tplv-goo7wpa0wc-image.image) 2. 在 MCP 详情页,点击生成获取带授权信息的个人 MCP 服务端 URL。 > 部分 MCP 通过`Authorization`字段来配置授权,详情请参考[2. 配置鉴权信息](/docs/mcp-remote-mcp#8cf42728)。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/c85a81f998b24194a89d343a84576c0a~tplv-goo7wpa0wc-image.image) ## 快速入门 > **说明** > > * 以下常用调用场景示例代码中,需先将 `` 替换为实际密钥,并将 `server_label`/`server_url` 替换为实际 MCP Server 信息。 > * 测试期间调用此工具需要增加 header '`ark-beta-mcp: true`'。 **选项:cURL** ```Bash curl --location 'https://ark.cn-beijing.volces.com/api/v3/responses' \ --header "Authorization: Bearer " \ --header 'Content-Type: application/json' \ --header 'ark-beta-mcp: true' \ --data '{ "model": "doubao-seed-2-1-pro-260915", "stream": true, "tools": [ { "type": "mcp", "server_label": "deepwiki", "server_url": "https://mcp.deepwiki.com/mcp", "require_approval": "never" } ], "input": [ { "role": "user", "content": [ { "type": "input_text", "text": "看一下volcengine/ai-app-lab这个repo的文档" } ] } ] }' ``` **选项:Python SDK** ```Python from arkruntime import Ark import os # 从环境变量获取API密钥(配置方法:https://ark.volcengine.com/region:cn-beijing/docs/quick-start) api_key = os.getenv('ARK_API_KEY') # 初始化客户端,启用MCP功能 client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key ) # 发起基础MCP调用请求 response = client.responses.create( model="doubao-seed-2-1-pro-260915", tools=[ { "type": "mcp", "server_label": "deepwiki", "server_url": "https://mcp.deepwiki.com/mcp", "require_approval": "never" } ], input=[ { "role": "user", "content": [ { "type": "input_text", "text": "看一下volcengine/ai-app-lab这个repo的文档" } ] } ], extra_headers={"ark-beta-mcp": "true"}, stream=True # 流式获取结果 ) # 打印响应结果 for chunk in response: if hasattr(chunk, 'delta'): print(chunk.delta, end="", flush=True) ``` **选项:Java SDK** ```Java package com.example.arkdemo; import com.volcengine.ark.runtime.model.responses.constant.ResponsesConstants; import com.volcengine.ark.runtime.model.responses.event.StreamEvent; import com.volcengine.ark.runtime.model.responses.request.ResponsesInput; import com.volcengine.ark.runtime.model.responses.request.CreateResponsesRequest; import com.volcengine.ark.runtime.model.responses.tool.ToolMCP; import com.volcengine.ark.runtime.model.responses.tool.mcp.MCPRequireApproval; import com.volcengine.ark.runtime.model.responses.event.reasoningsummary.ReasoningSummaryTextDeltaEvent; import com.volcengine.ark.runtime.model.responses.event.outputitem.OutputItemDoneEvent; import com.volcengine.ark.runtime.model.responses.event.outputtext.OutputTextDeltaEvent; import com.volcengine.ark.runtime.service.ArkService; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; import com.volcengine.ark.runtime.model.responses.common.ResponsesThinking; import com.volcengine.ark.runtime.model.responses.event.response.ResponseCompletedEvent; import java.time.Duration; import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeUnit; public class mcpjava { // 固定使用的模型 private static final String model = "doubao-seed-2-1-pro-260915"; public static void main(String[] args) { // 1. 校验鉴权凭证(必须配置 ARK_API_KEY 环境变量) String apiKey = System.getenv("ARK_API_KEY"); if (apiKey == null) { System.out.println("ARK_API_KEY environment variable not set"); return; } // 2. 初始化 ArkService(配置连接池、并发、超时等) ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); Dispatcher dispatcher = new Dispatcher(); dispatcher.setMaxRequests(5000); dispatcher.setMaxRequestsPerHost(5000); ArkService service = ArkService.builder() .dispatcher(dispatcher) .timeout(Duration.ofHours(1)) .connectionPool(connectionPool) .apiKey(apiKey) .build(); // 3. 构造 MCP 工具调用请求 CreateResponsesRequest mcpRequest = CreateResponsesRequest.builder() .model(model) .stream(true) // 流式响应,实时获取结果 // 配置 MCP 工具:指定服务标签、服务地址、审批模式 .tools(Collections.singletonList( ToolMCP.builder() .serverLabel("deepwiki-test") // MCP 服务标签 .serverUrl("https://mcp.deepwiki.com/mcp") // MCP 服务接口地址 // 审批模式:NEVER(无需审批)、ALWAYS(必须审批)、AUTO(自动审批) .requireApproval(MCPRequireApproval.builder() .mode(ResponsesConstants.MCP_APPROVAL_MODE_NEVER) .build()) .build() )) // 输入查询指令:让 MCP 工具查询指定仓库结构 .input(ResponsesInput.builder() .stringValue("查看这个 repo的structure expressjs/express") .build()) // 启用模型思考过程(可在流式输出中查看) .thinking(ResponsesThinking.builder() .type(ResponsesConstants.THINKING_TYPE_ENABLED) .build()) .build(); // 4. 构造自定义 Header(设置 ark-beta-mcp:true) Map customHeaders = new HashMap<>(); customHeaders.put("ark-beta-mcp", "true"); // 5. 执行 MCP 工具调用并处理流式响应(传入自定义 Header) try { System.out.println("----- [MCP Tool Call] 开始调用 -----"); // 流式调用时传入 headers 参数 service.streamResponse(mcpRequest, customHeaders) .doOnError(Throwable::printStackTrace) // 异常处理 .blockingForEach(mcpjava::printStreamEvent); // 监听流式事件 } catch (Exception e) { System.err.println("MCP Tool Call Error: " + e.getMessage()); e.printStackTrace(); } // 6. 关闭服务 executor,释放资源 service.shutdownExecutor(); } // 跟踪是否已输出思考过程前缀 private static boolean isReasoningPrefixPrinted = false; // 跟踪是否已输出工具返回前缀 private static boolean isToolPrefixPrinted = false; // 流式事件处理:打印思考过程、响应内容、工具调用状态 private static void printStreamEvent(StreamEvent event) { // 打印思考过程增量(如模型分析如何调用 MCP 工具) if (event instanceof ReasoningSummaryTextDeltaEvent) { ReasoningSummaryTextDeltaEvent reasoningEvent = (ReasoningSummaryTextDeltaEvent) event; String delta = reasoningEvent.getDelta(); // 只在思考过程开始时添加前缀 if (!isReasoningPrefixPrinted && delta.trim().length() > 0) { System.out.print("[思考过程] " + delta); isReasoningPrefixPrinted = true; } else { System.out.print(delta); } // 如果遇到换行符,重置前缀标记 if (delta.contains("\n")) { isReasoningPrefixPrinted = false; } } // 打印文本响应增量(MCP 工具返回结果的实时输出) else if (event instanceof OutputTextDeltaEvent) { OutputTextDeltaEvent textEvent = (OutputTextDeltaEvent) event; String delta = textEvent.getDelta(); // 只在工具返回开始时添加前缀 if (!isToolPrefixPrinted && delta.trim().length() > 0) { System.out.print("[工具返回] " + delta); isToolPrefixPrinted = true; } else { System.out.print(delta); } // 如果遇到换行符,重置前缀标记 if (delta.contains("\n")) { isToolPrefixPrinted = false; } } // 打印输出项完成事件 else if (event instanceof OutputItemDoneEvent) { OutputItemDoneEvent itemEvent = (OutputItemDoneEvent) event; System.out.println("\n[输出完成] " + itemEvent.getItem().getType()); // 重置所有前缀标记 isReasoningPrefixPrinted = false; isToolPrefixPrinted = false; } // 整体响应完成,打印调用用量 else if (event instanceof ResponseCompletedEvent) { ResponseCompletedEvent completedEvent = (ResponseCompletedEvent) event; System.out.println("\n[响应完成] 调用用量:" + completedEvent.getResponse().getUsage()); // 重置所有前缀标记 isReasoningPrefixPrinted = false; isToolPrefixPrinted = false; } // 打印所有其他未处理的事件类型(用于调试) else { System.out.println("\n[未处理事件] 类型:" + event.getClass().getName()); // 重置所有前缀标记 isReasoningPrefixPrinted = false; isToolPrefixPrinted = false; } } } ``` **选项:Go SDK** ```Go package main import ( "context" "fmt" "io" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/responses" ) const ( mcpServerURL = "https://mcp.deepwiki.com/mcp" mcpLabel = "deepwiki" mcpBetaHeader = "ark-beta-mcp" userPrompt = "查一下 mark3labs/mcp-go 这个仓库的结构" ) func main() { nonStream() fmt.Println() stream() } func newClient() *arkruntime.Client { return arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) } func nonStream() { fmt.Println("===== non-streaming =====") client := newClient() ctx := context.Background() // Round 1: ask the model to call the MCP tool. req1 := &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", Input: responses.NewInputItemArrayResponsesInput([]responses.InputItem{ {OneOf: responses.NewItemEasyMessageInputItemSum(buildUserMessage())}, }), Tools: []responses.Tool{mcpTool(false)}, } resp1, err := client.CreateResponses( ctx, req1, arkruntime.WithCustomHeader(mcpBetaHeader, "true"), ) if err != nil { fmt.Printf("round 1 error: %v\n", err) return } fmt.Printf("response: %+v\n", resp1) approvalRequestID := findApprovalRequestID(resp1.Output) if approvalRequestID == "" { fmt.Println("no approval request emitted; nothing to approve") return } // Round 2: approve the requested MCP call. req2 := &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", Input: responses.NewInputItemArrayResponsesInput([]responses.InputItem{ {OneOf: responses.NewItemFunctionMcpApprovalResponseInputItemSum( responses.ItemFunctionMcpApprovalResponse{ Type: responses.ItemFunctionMcpApprovalResponseTypeMcpApprovalResponse, ApprovalRequestID: approvalRequestID, Approve: true, }, )}, }), Tools: []responses.Tool{mcpTool(false)}, PreviousResponseID: responses.NewOptString(resp1.ID), } resp2, err := client.CreateResponses( ctx, req2, arkruntime.WithCustomHeader(mcpBetaHeader, "true"), ) if err != nil { fmt.Printf("round 2 error: %v\n", err) return } fmt.Printf("response: %+v\n", resp2) // Round 3: let the model call the MCP tool without approval. req3 := &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", Input: responses.NewInputItemArrayResponsesInput([]responses.InputItem{ {OneOf: responses.NewItemEasyMessageInputItemSum(buildUserMessage())}, }), Tools: []responses.Tool{mcpTool(true)}, } resp3, err := client.CreateResponses( ctx, req3, arkruntime.WithCustomHeader(mcpBetaHeader, "true"), ) if err != nil { fmt.Printf("round 3 error: %v\n", err) return } fmt.Printf("response: %+v\n", resp3) } func stream() { fmt.Println("===== streaming =====") client := newClient() ctx := context.Background() req1 := &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", Input: responses.NewInputItemArrayResponsesInput([]responses.InputItem{ {OneOf: responses.NewItemEasyMessageInputItemSum(buildUserMessage())}, }), Tools: []responses.Tool{mcpTool(false)}, } responseID, approvalRequestID, err := streamAndCapture(ctx, client, req1) if err != nil { fmt.Printf("round 1 stream error: %v\n", err) return } if approvalRequestID == "" { fmt.Println("no approval request emitted; nothing to approve") return } req2 := &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", Input: responses.NewInputItemArrayResponsesInput([]responses.InputItem{ {OneOf: responses.NewItemFunctionMcpApprovalResponseInputItemSum( responses.ItemFunctionMcpApprovalResponse{ Type: responses.ItemFunctionMcpApprovalResponseTypeMcpApprovalResponse, ApprovalRequestID: approvalRequestID, Approve: true, }, )}, }), Tools: []responses.Tool{mcpTool(false)}, PreviousResponseID: responses.NewOptString(responseID), } if _, _, err := streamAndCapture(ctx, client, req2); err != nil { fmt.Printf("round 2 stream error: %v\n", err) return } req3 := &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", Input: responses.NewInputItemArrayResponsesInput([]responses.InputItem{ {OneOf: responses.NewItemEasyMessageInputItemSum(buildUserMessage())}, }), Tools: []responses.Tool{mcpTool(true)}, } if _, _, err := streamAndCapture(ctx, client, req3); err != nil { fmt.Printf("round 3 stream error: %v\n", err) } } func buildUserMessage() responses.ItemEasyMessage { return responses.ItemEasyMessage{ Role: responses.NewOptMessageRole(responses.MessageRoleUser), Content: responses.NewContentItemArrayMessageContent([]responses.ContentItem{ { OneOf: responses.NewContentItemTextContentItemSum(responses.ContentItemText{ Type: responses.ContentItemTextTypeInputText, Text: userPrompt, }), }, }), } } func mcpTool(skipApproval bool) responses.Tool { mcp := responses.McpTool{ Type: responses.McpToolTypeMcp, ServerLabel: mcpLabel, ServerURL: mcpServerURL, ServerDescription: responses.NewOptString("Query a GitHub repository's documentation"), } if skipApproval { mcp.RequireApproval = responses.NewOptMcpRequireApproval( responses.NewMcpApprovalModeMcpRequireApproval(responses.McpApprovalModeNever), ) } return responses.Tool{OneOf: responses.NewMcpToolToolSum(mcp)} } func findApprovalRequestID(output []responses.OutputItem) string { for i := len(output) - 1; i >= 0; i-- { if request, ok := output[i].OneOf.GetItemFunctionMcpApprovalRequest(); ok { return request.ID.Or("") } } return "" } func streamAndCapture( ctx context.Context, client *arkruntime.Client, req *responses.ResponsesRequest, ) (string, string, error) { stream, err := client.CreateResponsesStream( ctx, req, arkruntime.WithCustomHeader(mcpBetaHeader, "true"), ) if err != nil { return "", "", err } var responseID string var approvalRequestID string for { event, err := stream.Recv() if err == io.EOF { return responseID, approvalRequestID, nil } if err != nil { return responseID, approvalRequestID, err } switch event.OneOf.Type { case responses.ResponseCreatedEventResponseStreamEventSum: responseID = event.OneOf.ResponseCreatedEvent.Response.ID case responses.ResponseReasoningSummaryTextDeltaEventResponseStreamEventSum: fmt.Print(event.OneOf.ResponseReasoningSummaryTextDeltaEvent.Delta.Or("")) case responses.ResponseTextDeltaEventResponseStreamEventSum: fmt.Print(event.OneOf.ResponseTextDeltaEvent.Delta.Or("")) case responses.ResponseTextDoneEventResponseStreamEventSum: fmt.Printf("\n[text done] %s\n", event.OneOf.ResponseTextDoneEvent.Text.Or("")) case responses.ResponseOutputItemDoneEventResponseStreamEventSum: item := event.OneOf.ResponseOutputItemDoneEvent.Item if request, ok := item.OneOf.GetItemFunctionMcpApprovalRequest(); ok { approvalRequestID = request.ID.Or("") fmt.Printf( "\n[mcp approval request] name=%s arguments=%s\n", request.Name, request.Arguments, ) } case responses.ResponseMcpCallArgumentsDeltaEventResponseStreamEventSum: fmt.Print(event.OneOf.ResponseMcpCallArgumentsDeltaEvent.Delta) case responses.ResponseMcpCallCompletedEventResponseStreamEventSum: fmt.Println("\n[mcp call completed]") case responses.ResponseMcpListToolsInProgressEventResponseStreamEventSum: fmt.Println("\n[listing mcp tools]") case responses.ResponseMcpListToolsCompletedEventResponseStreamEventSum: fmt.Println("\n[mcp tools listed]") } } } ``` ## 参数说明 详情请参见[创建 Response](/docs/create-model-responses-api)。 ## 支持的模型列表 参见[工具调用能力](/docs/model-list#f44ceef7)。 > 模型调用需确保已完成 MCP 服务开通及对应模型权限申请,未开通用户无法触发 MCP 工具功能。 ## 工作原理 您可以通过 `Responses` API 调用 MCP 工具(包括云部署 MCP 和 Remote MCP)。此功能与函数调用的主要区别在于,MCP 工具完全在云端执行:大模型会连接至远程服务器来完成调用,因此不支持本地 MCP 运行调用。 ## 使用指南 本节介绍了常见的使用场景及其字段设置方法,以帮助您更高效地运用 MCP 工具。 ### 1. 过滤 MCP 工具 一个 MCP 服务器可能提供多种工具。您可以在该服务的详情页查看完整的工具列表。在 API 调用时,您可以使用 `allowed_tools` 参数来指定要使用的工具,从而节省时间并获得更符合预期的结果。 > **说明** > > `allowed_tools.tool_names` 数组用于列举需要模型调用的 MCP 工具名。 ```Python "tools": [ { "type": "mcp", "server_label": "mcp_tools", "server_url": "https://mcpserver/mcp", "allowed_tools": { "tool_names": [ "tool1", "tool2" ] } } ] ``` ### 2. 配置鉴权信息 目前部分 MCP 工具需要在 header 中配置身份验证。一般通过 `Authorization` 字段来配置,示例参考如下: > **说明** > > `headers.Authorization` 请替换为 MCP 工具提供方要求的认证信息(如 `Bearer `)。 ```JSON ... "tools": [ { "type": "mcp", "server_label": "info-quest-mcp", "server_url": "https://mcp.infoquest.bytepluses.com/mcp", "require_approval": "never", "headers": { "Authorization": "******" } } ] ... ``` ## 场景示例:多轮调用 **场景**:调用巨量千川 MCP 分析直播数据,需用户确认后执行,支持多轮补充查询。 ```Python from arkruntime import Ark import os api_key = os.getenv('ARK_API_KEY') client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key ) # 1. 首轮请求:发起MCP调用审批 first_response = client.responses.create( model="doubao-seed-2-1-pro-260915", tools=[ { "type": "mcp", "server_label": "qianchuan-mcp", "server_url": "https://mcp.qianchuan.com/mcp", "require_approval": "always" } ], input=[ { "role": "user", "content": [{"type": "input_text", "text": "分析今日直播间竞价推广数据"}] } ], extra_headers={"ark-beta-mcp": "true"}, stream=True ) # 提取审批ID与上一轮响应ID last_chunk = None for chunk in first_response: last_chunk = chunk previous_response_id = last_chunk.response.id approval_id = last_chunk.response.output[-1].id print(f"上一轮响应ID:{previous_response_id},审批ID:{approval_id}") # 2. 二轮请求:同意审批并继续执行 second_response = client.responses.create( model="doubao-seed-2-1-pro-260915", tools=[ { "type": "mcp", "server_label": "qianchuan-mcp", "server_url": "https://mcp.qianchuan.com/mcp", "require_approval": "always" } ], input=[ { "type": "mcp_approval_response", "approve": True, # 同意审批 "approval_request_id": approval_id } ], extra_headers={"ark-beta-mcp": "true"}, previous_response_id=previous_response_id, # 关联上一轮请求 stream=True ) # 打印二轮响应结果 for chunk in second_response: if hasattr(chunk, 'delta'): print(chunk.delta, end="", flush=True) ``` ## 注意事项 1. 目前云部署 MCP / Remote MCP 仅支持通过 Responses API 调用,同时**只支持通过 Streamable HTTP 链接的 MCP**。 2. **函数命名冲突**:若用户自定义函数与 MCP 内置工具(如 `mcp_call`)重名,由模型自动判断调用优先级,无需额外配置。 3. **默认限流规则**:账号维度默认限流为 `1000 RPM`(每分钟请求数),超出限流将导致请求失败,需调整可提交工单。 4. **错误信息**:暂不支持 `caching` 参数,使用该参数会返回 400 错误信息。 ## 计费说明 消耗模型基础 Tokens,不收取 MCP 工具调用附加费。 ## 相关参考 * [创建 Response](/docs/create-model-responses-api) * [联网搜索工具](/docs/web-search) * [智能体工具商店](https://www.volcengine.com/mcp-marketplace) --- # Function Calling(函数调用) Source: https://ark.volcengine.com/region:cn-beijing/docs/function-calling Function Calling(函数调用)是一种将大模型与外部工具和 API 相连的关键功能,作为自然语言与信息接口之间的“翻译官”,它能够将用户的自然语言请求智能地转化为对特定工具或 API 的调用,从而高效满足用户的特定需求。 --- # 功能概述 * **核心价值**:实现大模型与外部工具的无缝衔接,使大模型能够借助外部工具处理实时数据查询、任务执行等复杂场景,推动大模型在实际产业中的落地应用。 * **工作原理**:开发者通过自然语言向模型描述函数的功能和定义,模型在对话过程中自主判断是否需要调用函数。当需要调用时,模型会返回符合要求的工具函数及入参,开发者负责实际调用函数并将结果回填给模型,模型再根据结果进行总结或继续规划子任务。 # 适用场景 函数调用适用于以下需要大模型与外部工具协同的场景: |**场景分类** |**核心特征** |**核心价值** |**典型应用** | |---|---|---|---| |实时数据交互场景 |需大模型与外部工具协同处理动态信息 |处理动态信息查询需求 |天气/股票/航班实时状态查询、数据库检索与 API 数据调用 | |任务自动化场景 |单次函数调用完成操作 |提升操作效率 |邮件/消息自动发送、设备控制指令执行(如智能家居开关) | |复杂流程编排场景 |多工具串并联调用 |跨工具参数传递、子任务依赖关系管理 |先查天气再发通知等需跨工具传递参数及管理子任务依赖的场景 | |智能系统集成场景 |与业务系统深度耦合 |实现系统智能化联动 |智能座舱多设备联动控制、企业级 Bot 工作流(如飞书会议创建→群组管理→任务生成) | ## 工作原理图 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/cf700fefc5204e8a8ab7e6bf3e5d3cd8~tplv-goo7wpa0wc-image.image) ## 典型示例 * 用户:北京今天的天气如何?适合穿什么衣服? * 模型思考: 1. 需要调用天气查询工具获取实时数据(location=北京,unit=摄氏度)。 2. 天气信息包含温度、天气状况(晴/雨等),需结合数据给出穿衣建议。 * 函数调用结果:北京今天晴,气温 18-25℃,北风 3 级,湿度 45%。 * 模型回答:北京今天天气晴朗,气温 18-25℃,建议穿薄长袖衬衫或短袖 T 恤,搭配薄外套应对早晚温差。 --- # 支持模型 全量支持函数调用的模型,请参见[工具调用能力](/docs/model-list#f44ceef7)。 --- # 使用流程 ## 支持的 API 函数调用功能支持通过 [Chat API](/docs/chat-api) / [Responses API](/docs/create-model-responses-api) 进行调用,本文以 Chat API 调用为例。更多详情请参见[迁移至 Responses API](/docs/responses-api-migration)。 ## 基本使用流程 > **说明** > > 方舟平台的新用户?获取 API Key 及 开通模型等准备工作,请参见 [快速入门](/docs/quick-start)。 ### 步骤 1:定义函数 通过 `tools` 字段向模型描述可用函数,支持 JSON 格式,包含函数名称、描述、参数定义等信息。 #### **定义工具函数** ```Python def get_current_weather(location, unit="摄氏度"): # 实际调用天气查询 API 的逻辑 # 此处为示例,返回模拟的天气数据 return f"{location}今天天气晴朗,温度 25 {unit}。" ``` * 代码中定义了一个名为 `get_current_weather` 的工具函数,用于获取指定地点的天气信息。 * `location`:必需的参数,表示地点。 * `unit`:可选参数,默认值为 `摄氏度`,表示温度单位。 * 函数内部目前只是返回模拟的天气数据,实际应用中需要调用真实的天气查询 API。 #### **定义 Tools** ```Python { "type": "function", "function": { "name": "get_current_weather", "description": "获取指定地点的天气信息,支持摄氏度和华氏度两种单位", "parameters": { "type": "object", "properties": { "location": { "type": "string", "description": "地点的位置信息,例如北京、上海" }, "unit": { "type": "string", "enum": ["摄氏度", "华氏度"], "description": "温度单位,可选值为摄氏度或华氏度" } }, "required": ["location"] } } } ``` 更多关于函数构造相关的规范和注意事项,请参见[附 1:工具函数参数构造规范](/docs/function-calling#4d571c97)。 ### 步骤 2:发起模型请求 在请求中包含用户问题和函数定义,模型会根据需求返回需要调用的函数及参数。 ```Python import os from arkruntime import Ark # 从环境变量中获取您的API KEY,配置方法见:https://ark.volcengine.com/region:cn-beijing/docs/quick-start api_key = os.getenv('ARK_API_KEY') # 初始化Ark客户端 client = Ark( api_key = api_key, base_url="https://ark.cn-beijing.volces.com/api/v3" ) # 用户问题 messages = [ {"role": "user", "content": "北京今天的天气如何?"} ] tools = [ { "type": "function", "function": { "name": "get_current_weather", "description": "查询指定城市的当前天气", "parameters": { "type": "object", "properties": { "location": { "type": "string", "description": "城市名称,例如北京", } }, "required": ["location"], }, }, } ] # 发起模型请求 completion = client.chat.completions.create( model="doubao-seed-2-1-pro-260915", messages=messages, tools=tools ) ``` ### 步骤 3:调用外部函数 根据模型返回的函数名称和参数,调用对应的外部函数或 API,获取函数执行结果。 ```Python import json # 解析模型返回的函数调用信息 tool_call = completion.choices[0].message.tool_calls[0] # 函数名称 tool_name = tool_call.function.name # 如果判断需要调用查询天气函数,则运行查询天气函数 if tool_name == "get_current_weather": # 提取的用户参数 arguments = json.loads(tool_call.function.arguments) # 调用函数 tool_result = get_current_weather(**arguments) ``` * `tool_calls`:获取模型调用的工具列表。 * 如果工具函数名称是 `get_current_weather`,则解析函数调用的参数并调用 `get_current_weather` 函数获取工具执行结果。 ### 步骤 4:回填结果并获取最终回复 将工具执行结果以 `role=tool` 的消息形式回填给模型,模型根据结果生成最终回复。 ```Python messages.append(completion.choices[0].message.model_dump()) messages.append({ "role": "tool", "tool_call_id": tool_call.id, "content": tool_result }) # 再次调用模型获取最终回复 final_completion = client.chat.completions.create( model="doubao-seed-2-1-pro-260915", messages=messages ) print(final_completion.choices[0].message.content) ``` ## 完整代码示例 **选项:Python - Ark SDK** **方舟基础 SDK** ```Python from arkruntime import Ark from arkruntime.types.chat import ChatCompletion import json client = Ark( base_url="https://ark.cn-beijing.volces.com/api/v3", ) messages = [ {"role": "user", "content": "北京和上海今天的天气如何?"} ] # 步骤1: 定义工具 tools = [{ "type": "function", "function": { "name": "get_current_weather", "description": "获取指定地点的天气信息", "parameters": { "type": "object", "properties": { "location": { "type": "string", "description": "地点的位置信息,例如北京、上海" }, "unit": { "type": "string", "enum": ["摄氏度", "华氏度"], "description": "温度单位" } }, "required": ["location"] } } }] def get_current_weather(location: str, unit="摄氏度"): # 实际调用天气查询 API 的逻辑 # 此处为示例,返回模拟的天气数据 return f"{location}今天天气晴朗,温度 25 {unit}。" while True: # 步骤2: 发起模型请求,由于模型在收到工具执行结果后仍然可能有函数调用意愿,因此需要多次请求 completion: ChatCompletion = client.chat.completions.create( model="doubao-seed-2-1-pro-260915", messages=messages, tools=tools ) resp_msg = completion.choices[0].message # 展示模型中间过程的回复内容 print(resp_msg.content) if completion.choices[0].finish_reason != "tool_calls": # 模型最终总结,没有调用工具意愿 break messages.append(completion.choices[0].message.model_dump()) tool_calls = completion.choices[0].message.tool_calls for tool_call in tool_calls: tool_name = tool_call.function.name if tool_name == "get_current_weather": # 步骤 3:调用外部工具 args = json.loads(tool_call.function.arguments) tool_result = get_current_weather(**args) # 步骤 4:回填工具结果,并获取模型总结回复 messages.append( {"role": "tool", "content": tool_result, "tool_call_id": tool_call.id} ) ``` **选项:Python - Arkitect SDK** **使用方舟智能体 SDK Arkitect** ```Python from arkitect.core.component.context.context import Context from enum import Enum import asyncio from pydantic import Field def get_current_weather(location: str = Field(description="地点的位置信息,例如北京、上海"), unit: str=Field(description="温度单位, 可选值为摄氏度或华氏度")): """ 获取指定地点的天气信息 """ return f"{location}今天天气晴朗,温度 25 {unit}。" async def chat_with_tool(): ctx = Context( model="doubao-seed-2-1-pro-260915", tools=[ get_current_weather ], # 直接在这个list里传入你的所有python 方法作为tool,tool的描述会自动带给模型推理,tool的执行在ctx.completions.create 中会自动进行 ) await ctx.init() completion = await ctx.completions.create(messages=[ {"role": "user", "content": "北京和上海今天的天气如何?"} ],stream =False) return completion completion = asyncio.run(chat_with_tool()) print(completion.choices[0].message.content) ``` **选项:Java** ```Java package com.ark.sample; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.volcengine.ark.runtime.models.chat.*; import com.volcengine.ark.runtime.service.ArkService; import java.util.*; public class VolcEngineFunctionCallChat { // 用于解析 get_current_weather 函数参数的类 public static class WeatherArgs { @JsonProperty("location") private String location; @JsonProperty("unit") private String unit; // Jackson 需要默认构造函数 public WeatherArgs() { } public String getLocation() { return location; } public void setLocation(String location) { this.location = location; } public String getUnit() { return unit; } public void setUnit(String unit) { this.unit = unit; } } // 用于定义工具函数参数模式的类 (类似于Python中的parameters字典结构) public static class FunctionParameterSchema { public String type; public Map properties; public List required; public FunctionParameterSchema(String type, Map properties, List required) { this.type = type; this.properties = properties; this.required = required; } public String getType() { return type; } public Map getProperties() { return properties; } public List getRequired() { return required; } } private static final ObjectMapper objectMapper = new ObjectMapper(); // 工具函数实现: get_current_weather public static String getCurrentWeather(String location, String unit) { // 此处应为实际调用天气查询 API 的逻辑 // 这里是示例,返回模拟的天气数据 String currentUnit = (unit == null || unit.isEmpty()) ? "摄氏度" : unit; System.out.println(String.format("调用工具 get_current_weather: location=%s, unit=%s", location, currentUnit)); return String.format("%s今天天气晴朗,温度 25 %s。", location, currentUnit); } public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); if (apiKey == null || apiKey.isEmpty()) { System.err.println("错误: ARK_API_KEY 环境变量未设置。"); return; } ArkService service = ArkService.builder() .apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); List messages = new ArrayList<>(); messages.add(ChatCompletionRequestUserMessage.builder().role(ChatCompletionRequestMessageType.USER).content(ChatCompletionMessageContent.ofString("北京和上海今天的天气如何?")).build()); // 步骤 1: 定义工具 Map locationProperty = new HashMap<>(); locationProperty.put("type", "string"); locationProperty.put("description", "地点的位置信息,例如上海,北京"); Map unitProperty = new HashMap<>(); unitProperty.put("type", "string"); unitProperty.put("enum", Arrays.asList("摄氏度", "华氏度")); unitProperty.put("description", "温度单位"); Map schemaProperties = new HashMap<>(); schemaProperties.put("location", locationProperty); schemaProperties.put("unit", unitProperty); FunctionParameterSchema functionParams = new FunctionParameterSchema( "object", schemaProperties, Collections.singletonList("location") // 'location' 是必需参数 ); List tools = Collections.singletonList( ChatCompletionTool.builder().type(ToolType.FUNCTION).function(// 工具类型 FunctionObject.builder() .name("get_current_weather") .description("获取指定地点的天气信息") .parameters(objectMapper.convertValue(functionParams, Map.class)) // 工具函数的参数模式 .build()).build()); String modelId = "doubao-seed-2-1-pro-260915"; while (true) { // 步骤 2: 发起模型请求 ChatCompletionRequest request = ChatCompletionRequest.builder() .model(modelId) .messages(messages) .tools(tools) .build(); ChatCompletionResponse completionResult; try { completionResult = service.createChatCompletion(request); } catch (Exception e) { System.err.println("调用 Ark API 时发生错误: " + e.getMessage()); e.printStackTrace(); break; } if (completionResult == null || completionResult.getChoices() == null || completionResult.getChoices().isEmpty()) { System.err.println("从模型收到空的或无效的响应。"); break; } ChatCompletionResponseChoice choice = completionResult.getChoices().get(0); ChatCompletionResponseMessage responseMessage = choice.getMessage(); // 展示模型中间过程的回复内容 System.out.println("模型回复: " + responseMessage.getContent()); // 将模型的回复(含函数调用请求)添加到消息历史中 messages.add(ChatCompletionRequestAssistantMessage.builder().role(ChatCompletionRequestMessageType.ASSISTANT).content(ChatCompletionMessageContent.ofString(responseMessage.getContent())).toolCalls(toRequestToolCalls(responseMessage.getToolCalls())).build()); if (choice.getFinishReason() == null || choice.getFinishReason() != FinishReason.TOOL_CALLS) { // 模型最终总结,没有调用工具意愿,或者发生错误等其他终止原因 break; } List toolCalls = responseMessage.getToolCalls(); if (toolCalls == null || toolCalls.isEmpty()) { // 如果 finish_reason 是 "tool_calls",但 toolCalls 为空,这可能是一个异常情况 System.err.println("警告: Finish reason 是 'tool_calls' 但未在消息中找到 tool_calls。"); break; } for (ChatCompletionMessageToolCall toolCall : toolCalls) { String toolName = toolCall.getFunction().getName(); if ("get_current_weather".equals(toolName)) { // 步骤 3:调用外部工具 String argumentsJson = toolCall.getFunction().getArguments(); WeatherArgs tool_args; try { tool_args = objectMapper.readValue(argumentsJson, WeatherArgs.class); } catch (JsonProcessingException e) { System.err.println("解析 get_current_weather 参数时出错: " + argumentsJson + " - " + e.getMessage()); // 将错误信息作为工具结果回填 messages.add(ChatCompletionRequestToolMessage.builder() .role(ChatCompletionRequestMessageType.TOOL) .content(ChatCompletionMessageContent.ofString("解析参数时出错: " + e.getMessage())) .toolCallId(toolCall.getId()) .build()); continue; } String toolResult = getCurrentWeather(tool_args.getLocation(), tool_args.getUnit()); System.out.println("工具执行结果 (" + toolCall.getId() + "): " + toolResult); // 步骤 4:回填工具结果,并获取模型总结回复 messages.add(ChatCompletionRequestToolMessage.builder() .role(ChatCompletionRequestMessageType.TOOL) .content(ChatCompletionMessageContent.ofString(toolResult)) .toolCallId(toolCall.getId()) // 关联函数调用 ID .build()); } } } service.shutdownExecutor(); System.out.println("会话结束。"); } private static java.util.List toRequestToolCalls( java.util.List toolCalls) { if (toolCalls == null) { return java.util.Collections.emptyList(); } java.util.List requestToolCalls = new java.util.ArrayList<>(); for (ChatCompletionMessageToolCall toolCall : toolCalls) { requestToolCalls.add( ChatCompletionRequestMessageToolCall.builder() .id(toolCall.getId()) .type(toolCall.getType()) .function( ChatCompletionRequestMessageToolCallFunction.builder() .name(toolCall.getFunction().getName()) .arguments(toolCall.getFunction().getArguments()) .build()) .build()); } return requestToolCalls; } } ``` **选项:Golang** ```Go package main import ( "context" "encoding/json" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/chat" ) type WeatherArgs struct { Location string `json:"location"` Unit string `json:"unit,omitempty"` // omitempty 允许 unit 为可选 } // 目标工具 func getCurrentWeather(location string, unit string) string { if unit == "" { unit = "摄氏度" // 默认单位 } // 此处为示例,返回模拟的天气数据 return fmt.Sprintf("%s今天天气晴朗,温度 25 %s。", location, unit) } func main() { // 从环境变量中获取 API Key,请确保已设置 ARK_API_KEY apiKey := os.Getenv("ARK_API_KEY") if apiKey == "" { fmt.Println("错误:请设置 ARK_API_KEY 环境变量。") return } client := arkruntime.NewClientWithApiKey( apiKey, arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() // 初始化消息列表 messages := []chat.ChatCompletionRequestMessage{ userMessage("北京和上海今天的天气如何?"), } // 步骤 1: 定义工具 tools := []chat.ChatCompletionTool{ { Type: chat.ToolTypeFunction, Function: chat.FunctionObject{ Name: "get_current_weather", Description: chat.NewOptString("获取指定地点的天气信息"), Parameters: functionParameters(map[string]interface{}{ "type": "object", "properties": map[string]interface{}{ "location": map[string]interface{}{ "type": "string", "description": "地点的位置信息,例如北京、上海", }, "unit": map[string]interface{}{ "type": "string", "enum": []string{ "摄氏度", "华氏度", }, "description": "温度单位", }, }, "required": []string{"location"}, }), }, }, } for { // 步骤 2: 发起模型请求 req := &chat.ChatCompletionRequest{ Model: "doubao-seed-2-1-pro-260915", // 与 Python 版本一致的模型 Messages: messages, Tools: tools, } resp, err := client.CreateChatCompletion(ctx, req) if err != nil { fmt.Printf("模型请求错误: %v\n", err) return } if len(resp.Choices) == 0 { fmt.Println("模型未返回任何 choice。") return } respMsg := resp.Choices[0].Message // 展示模型中间过程的回复内容 (如果存在) if respMsg.Content != "" { fmt.Println("模型回复:", respMsg.Content) } if resp.Choices[0].FinishReason != chat.FinishReasonToolCalls || len(respMsg.ToolCalls) == 0 { break } // 将模型的回复(包含函数调用请求)添加到消息历史中 messages = append(messages, assistantToolCallMessage(respMsg)) for _, toolCall := range respMsg.ToolCalls { fmt.Printf("模型尝试调用工具: %s, ID: %s\n", toolCall.Function.Name, toolCall.ID) fmt.Println(" 参数:", toolCall.Function.Arguments) var toolResult string if toolCall.Function.Name == "get_current_weather" { // 步骤 3:调用外部工具 var args WeatherArgs err := json.Unmarshal([]byte(toolCall.Function.Arguments), &args) if err != nil { fmt.Printf("解析工具参数错误 (%s): %v\n", toolCall.Function.Name, err) toolResult = fmt.Sprintf("解析参数失败: %v", err) } else { toolResult = getCurrentWeather(args.Location, args.Unit) fmt.Println(" 工具执行结果:", toolResult) } // 步骤 4:回填工具结果 messages = append(messages, toolMessage(toolCall.ID, toolResult)) } } fmt.Println("--- 下一轮对话 ---") } } func toolMessage(toolCallID, content string) chat.ChatCompletionRequestMessage { return chat.ChatCompletionRequestMessage{ OneOf: chat.NewChatCompletionRequestToolMessageChatCompletionRequestMessageSum( chat.ChatCompletionRequestToolMessage{ Role: chat.ChatCompletionRequestToolMessageRoleTool, ToolCallID: chat.NewOptNilString(toolCallID), Content: chat.NewOptNilChatCompletionMessageContent(chat.NewStringChatCompletionMessageContent(content)), }, ), } } func userMessage(content string) chat.ChatCompletionRequestMessage { return chat.ChatCompletionRequestMessage{ OneOf: chat.NewChatCompletionRequestUserMessageChatCompletionRequestMessageSum( chat.ChatCompletionRequestUserMessage{ Role: chat.ChatCompletionRequestUserMessageRoleUser, Content: chat.NewOptNilChatCompletionMessageContent(chat.NewStringChatCompletionMessageContent(content)), }, ), } } func functionParameters(value map[string]interface{}) chat.OptFunctionObjectParameters { encoded, err := json.Marshal(value) if err != nil { panic(err) } var parameters chat.FunctionObjectParameters if err := json.Unmarshal(encoded, ¶meters); err != nil { panic(err) } return chat.NewOptFunctionObjectParameters(parameters) } func assistantToolCallMessage(message chat.ChatCompletionResponseMessage) chat.ChatCompletionRequestMessage { return chat.ChatCompletionRequestMessage{ OneOf: chat.NewChatCompletionRequestAssistantMessageChatCompletionRequestMessageSum( chat.ChatCompletionRequestAssistantMessage{ Role: chat.ChatCompletionRequestAssistantMessageRoleAssistant, Content: chat.NewOptNilChatCompletionMessageContent(chat.NewStringChatCompletionMessageContent(message.Content)), ToolCalls: toRequestToolCalls(message.ToolCalls), }, ), } } func toRequestToolCalls( toolCalls []chat.ChatCompletionMessageToolCall, ) []chat.ChatCompletionRequestMessageToolCall { requestToolCalls := make([]chat.ChatCompletionRequestMessageToolCall, 0, len(toolCalls)) for _, toolCall := range toolCalls { requestToolCalls = append(requestToolCalls, chat.ChatCompletionRequestMessageToolCall{ ID: chat.NewOptNilString(toolCall.ID), Type: toolCall.Type, Function: chat.ChatCompletionRequestMessageToolCallFunction{ Name: toolCall.Function.Name, Arguments: chat.NewOptString(toolCall.Function.Arguments), }, }) } return requestToolCalls } ``` --- # 推荐配置与优化 ## 新业务接入 1. 推荐优选 Seed 2.0 系列模型。 1. 函数调用场景下,关闭 thinking 会提高效率,具体操作请参见[开启/关闭深度思考](/docs/deep-thinking#fa3f44fa)。 2. 对速度有较高要求,可以选择 `doubao-seed-2-0-mini`系列模型。 2. 准备评测集,在函数调用模型上开展测试,观察准确率是否达到业务预期的上线准确率。 3. 常规调优手段: * 准确填写函数的 `params`、`description` 等字段。系统提示词中不用再重复介绍函数,(可选)可以描述在何种情况下调用某函数。 * 优化函数、参数的描述,明确不同函数的边界情况;避免歧义;增加示例等。 * 对模型进行 sft(建议至少 50 条数据,模型越多、参数越多、情况越多,则所需要的数据越多),见[效果优化](/docs/function-calling#f118e5a2)。 4. 速度优化:对于简单无歧义的函数或参数,适当精简输入输出内容。 ## 并行工具调用 您可以根据需求,通过 `parallel_tool_calls` 参数控制模型是否可以并行调用多个工具。 * `parallel_tool_calls: true` **(默认值)**:模型在单次请求中可以返回多个待调用的工具。 * `parallel_tool_calls: false`:对于支持并行工具调用控制的模型,此设置会限制模型最多返回一个待调用的工具。 ## 提示词最佳实践 在设计提示词时,请遵循以下核心原则,为模型提供清晰、直接且无歧义的指令: 1. **优先使用代码处理确定性任务**:如果一个任务能通过传统编程高效解决,就应避免调用大模型,以提升系统效率并降低成本。 2. **保持输入信息专注**:仅向模型提供与当前任务直接相关的信息,避免无关内容干扰模型的判断。 |类别 |问题 |错误示例 |改正后示例 | |---|---|---|---| |函数 |命名不规范、描述不规范 |```JSON |```JSON | \ | | |{ |{ | \ | | | "type": "function", | "type": "function", | \ | | | "function": { | "function": { | \ | | | "name": "GPT1", | "name": "CreateEvent", | \ | | | "description": "新建日程" | "description": "当需要为用户新建日程时,此工具将创建日程,并返回日程ID" | \ | | | } | } | \ | | |} |} | \ | | |``` |``` | |参数 |避免不必要的复杂格式(或嵌套) |```JSON |```JSON | \ | | |{ |{ | \ | | | "time": { | "time": { | \ | | | "type": "object", | "type": "string", | \ | | | "description": "事件时间", | "description": "事件时间" | \ | | | "properties": { | } | \ | | | "timestamp": { |} | \ | | | "description": "事件时间" |``` | \ | | | } | | \ | | | } | | \ | | | } | | \ | | |} | | \ | | |``` | | |^^ |避免固定值 |```JSON |既然参数值固定,删去该参数,由代码处理。 | \ | | |{ | | \ | | | "time": { | | \ | | | "type": "object", | | \ | | | "description": "事件时间", | | \ | | | "properties": { | | \ | | | "timestamp": { | | \ | | | "description": "固定传2024-01-01即可" | | \ | | | } | | \ | | | } | | \ | | | } | | \ | | |} | | \ | | |``` | | |业务流程 |尽量缩短 LLM 调用轮次 |System prompt: |System prompt: | \ | | | | | \ | | |```Go |```Go | \ | | |你正在与用户Alan沟通,你需要先查询用户ID,再通过ID创建日程…… |你正在与用户Alan(ID=abc123)沟通,你可以通过ID创建日程…… | \ | | |``` |``` | || | | | \ |^^ |歧义消解 |System prompt: |System prompt: | \ | | | | | \ | | |```Go |```Go | \ | | |可以通过ID查找用户,并获得用户的日程ID |每个用户具有唯一的用户ID;每个日程有对应的日程ID,两者独立的ID。 | \ | | |``` |可以通过用户ID查找用户,并获得用户的所有日程ID | \ | | | |``` | \ | | |这里两个 ID 未明确,模型可能会混用 | | ## 函数调用异常处理 JSON 格式容错机制:对于轻微不合法的 JSON 格式,可尝试使用 `json-repair` 库进行容错修复。 ```Python import json_repair invalid_json = '{"location": "北京", "unit": "摄氏度"}' valid_json = json_repair.loads(invalid_json) ``` ## 需求澄清 需求澄清(需求确认)不依赖于函数调用,可独立使用。 可在系统提示词中加入: ```Python 如果用户没有提供足够的信息来调用函数,请继续提问以确保收集到了足够的信息。 在调用函数之前,你必须总结用户的描述并向用户提供总结,询问他们是否需要进行任何修改。 ...... ``` 在函数的 `description` 中加入: ```Python 函数参数除了提取a和b, 还应要求用户提供c、d、e、f和其他相关细节。 ``` 或在系统提示中加入参数校验逻辑,当模型生成的参数缺失时,引导模型重新生成完整的参数。 ```Python 如果用户提供的信息缺少工具所需要的必填参数,你需要进一步追问让用户提供更多信息。 ``` ## 流式输出 从 Doubao 1.5 系列模型开始支持流式输出,逐步获取函数调用信息,提升响应效率。 ```Python import os from arkruntime import Ark # 从环境变量中读取方舟API Key client = Ark( api_key=os.environ.get("ARK_API_KEY"), base_url="https://ark.cn-beijing.volces.com/api/v3", ) stream = client.chat.completions.create( model="doubao-seed-2-1-pro-260915", messages=[ { "role": "user", "content": "给我讲个故事,然后告诉我北京今天的天气", } ], tools=[ # 您要调用的工具信息 { "type": "function", "function": { "name": "get_current_weather", "description": "查询指定城市的当前天气", "parameters": { "type": "object", "properties": { "location": { "type": "string", "description": "城市名称,例如北京", } }, "required": ["location"], }, }, } ], stream=True, ) final_tool_calls = {} for chunk in stream: if not chunk.choices: continue print(chunk.choices[0].delta.content, end="") # 使用新版Function Call能力返回信息代码适配,将流式返回的信息拼装后返回 for tool_call in chunk.choices[0].delta.tool_calls or []: index = tool_call.index if index not in final_tool_calls: final_tool_calls[index] = tool_call final_tool_calls[index].function.arguments += tool_call.function.arguments print("Tools: ", final_tool_calls) ``` ## Strict 模式 将 `strict` 参数设置为 `true` 可启用严格模式。该模式能确保模型严格遵循您定义的函数 Schema 生成调用参数。为了保证函数调用的准确性和可预测性,我们建议您始终启用严格模式。 启用严格模式需要满足以下前提条件(参见[结构化输出(beta)](/docs/structured-output-beta)): 1. 在 `properties` 中定义的所有字段,都必须在 `required` 数组中进行声明。 2. 在函数的 `parameters` 定义中,推荐设置 `"additionalProperties": false`。 如果您需要将某个字段设为可选,可以在其 `type` 定义中加入 `null`。例如:`{"type": ["string", "null"]}`。 **选项:启用 Strict 模式** ```JSON { "type": "function", "function": { "name": "get_current_weather", "description": "获取指定地点的天气信息,支持摄氏度和华氏度两种单位", "strict": true, // 开启 strict 模式 "parameters": { "type": "object", "properties": { "location": { "type": "string", "description": "地点的位置信息,例如北京、上海" }, "unit": { "type": ["string", "null"], //与不启用有差异 "enum": ["摄氏度", "华氏度"], "description": "温度单位,可选值为摄氏度或华氏度" } }, "required": ["location", "unit"], //与不启用有差异 "additionalProperties": false } } } ``` **选项:不启用 Strict 模式** ```JSON { "type": "function", "function": { "name": "get_current_weather", "description": "获取指定地点的天气信息,支持摄氏度和华氏度两种单位", "parameters": { "type": "object", "properties": { "location": { "type": "string", "description": "地点的位置信息,例如北京、上海" }, "unit": { "type": "string", "enum": ["摄氏度", "华氏度"], "description": "温度单位,可选值为摄氏度或华氏度" } }, "required": ["location"] } } } ``` ## 多轮函数调用 当用户需求需要多次调用工具函数时,维护对话历史上下文,逐轮处理函数调用和结果回填。 ### 示例流程 1. 用户提问:“查询北京的天气,并将结果发送给张三”。 2. 第一轮:模型调用 `get_current_weather` 工具获取北京天气。 3. 第二轮:模型调用 `send_message` 工具将天气结果发送给张三。 4. 第三轮:模型总结任务完成情况,返回最终回复。 ### 代码示例 > **说明** > > 多轮函数调用:指用户 query 需要多次调用工具函数和大模型才能完成的情况,是多轮对话的子集。 调用 Response 细节图: ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/71d9c354a2db4bd8a1959f43043cb944~tplv-goo7wpa0wc-image.image) **选项:Golang** ```Go package main import ( "context" "encoding/json" "fmt" "os" "strings" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/chat" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) fmt.Println("----- function call multiple rounds request -----") ctx := context.Background() // Step 1: send the conversation and available functions to the model req := &chat.ChatCompletionRequest{ Model: "doubao-seed-2-1-pro-260915", // Replace with Model ID Messages: []chat.ChatCompletionRequestMessage{ systemMessage("你是 AI 人工智能助手"), userMessage("上海的天气怎么样?"), }, Tools: []chat.ChatCompletionTool{ { Type: chat.ToolTypeFunction, Function: chat.FunctionObject{ Name: "get_current_weather", Description: chat.NewOptString("Get the current weather in a given location"), Parameters: functionParameters(map[string]interface{}{ "type": "object", "properties": map[string]interface{}{ "location": map[string]interface{}{ "type": "string", "description": "The city and state, e.g. Beijing", }, "unit": map[string]interface{}{ "type": "string", "description": "枚举值有celsius、fahrenheit", }, }, "required": []string{ "location", }, }), }, }, }, } resp, err := client.CreateChatCompletion(ctx, req) if err != nil { fmt.Printf("chat error: %v\n", err) return } // extend conversation with assistant's reply req.Messages = append(req.Messages, assistantToolCallMessage(resp.Choices[0].Message)) // Step 2: check if the model wanted to call a function. // The model can choose to call one or more functions; if so, // the content will be a stringified JSON object adhering to // your custom schema (note: the model may hallucinate parameters). for _, toolCall := range resp.Choices[0].Message.ToolCalls { fmt.Println("calling function") fmt.Println(" id:", toolCall.ID) fmt.Println(" name:", toolCall.Function.Name) fmt.Println(" argument:", toolCall.Function.Arguments) functionResponse, err := CallAvailableFunctions(toolCall.Function.Name, toolCall.Function.Arguments) if err != nil { functionResponse = err.Error() } // extend conversation with function response req.Messages = append(req.Messages, toolMessage(toolCall.ID, functionResponse), ) } // get a new response from the model where it can see the function response secondResp, err := client.CreateChatCompletion(ctx, req) if err != nil { fmt.Printf("second chat error: %v\n", err) return } fmt.Println("conversation", MustMarshal(req.Messages)) fmt.Println("new message", MustMarshal(secondResp.Choices[0].Message)) } func CallAvailableFunctions(name, arguments string) (string, error) { if name == "get_current_weather" { params := struct { Location string `json:"location"` Unit string `json:"unit"` }{} if err := json.Unmarshal([]byte(arguments), ¶ms); err != nil { return "", fmt.Errorf("failed to parse function call name=%s arguments=%s", name, arguments) } return GetCurrentWeather(params.Location, params.Unit), nil } else { return "", fmt.Errorf("got unavailable function name=%s arguments=%s", name, arguments) } } // GetCurrentWeather get the current weather in a given location. // Example dummy function hard coded to return the same weather. // In production, this could be your backend API or an external API func GetCurrentWeather(location, unit string) string { if unit == "" { unit = "celsius" } weather := map[string]string{ "location": location, "temperature": "unknown", "unit": unit, } switch strings.ToLower(location) { case "beijing", "北京": weather["location"] = "Beijing" weather["temperature"] = "10" case "shanghai", "上海": weather["location"] = "Shanghai" weather["temperature"] = "23" } return MustMarshal(weather) } func MustMarshal(v interface{}) string { b, _ := json.Marshal(v) return string(b) } func systemMessage(content string) chat.ChatCompletionRequestMessage { return chat.ChatCompletionRequestMessage{ OneOf: chat.NewChatCompletionRequestSystemMessageChatCompletionRequestMessageSum( chat.ChatCompletionRequestSystemMessage{ Role: chat.ChatCompletionRequestSystemMessageRoleSystem, Content: chat.NewStringChatCompletionMessageContent(content), }, ), } } func toolMessage(toolCallID, content string) chat.ChatCompletionRequestMessage { return chat.ChatCompletionRequestMessage{ OneOf: chat.NewChatCompletionRequestToolMessageChatCompletionRequestMessageSum( chat.ChatCompletionRequestToolMessage{ Role: chat.ChatCompletionRequestToolMessageRoleTool, ToolCallID: chat.NewOptNilString(toolCallID), Content: chat.NewOptNilChatCompletionMessageContent(chat.NewStringChatCompletionMessageContent(content)), }, ), } } func userMessage(content string) chat.ChatCompletionRequestMessage { return chat.ChatCompletionRequestMessage{ OneOf: chat.NewChatCompletionRequestUserMessageChatCompletionRequestMessageSum( chat.ChatCompletionRequestUserMessage{ Role: chat.ChatCompletionRequestUserMessageRoleUser, Content: chat.NewOptNilChatCompletionMessageContent(chat.NewStringChatCompletionMessageContent(content)), }, ), } } func functionParameters(value map[string]interface{}) chat.OptFunctionObjectParameters { encoded, err := json.Marshal(value) if err != nil { panic(err) } var parameters chat.FunctionObjectParameters if err := json.Unmarshal(encoded, ¶meters); err != nil { panic(err) } return chat.NewOptFunctionObjectParameters(parameters) } func assistantToolCallMessage(message chat.ChatCompletionResponseMessage) chat.ChatCompletionRequestMessage { return chat.ChatCompletionRequestMessage{ OneOf: chat.NewChatCompletionRequestAssistantMessageChatCompletionRequestMessageSum( chat.ChatCompletionRequestAssistantMessage{ Role: chat.ChatCompletionRequestAssistantMessageRoleAssistant, Content: chat.NewOptNilChatCompletionMessageContent(chat.NewStringChatCompletionMessageContent(message.Content)), ToolCalls: toRequestToolCalls(message.ToolCalls), }, ), } } func toRequestToolCalls( toolCalls []chat.ChatCompletionMessageToolCall, ) []chat.ChatCompletionRequestMessageToolCall { requestToolCalls := make([]chat.ChatCompletionRequestMessageToolCall, 0, len(toolCalls)) for _, toolCall := range toolCalls { requestToolCalls = append(requestToolCalls, chat.ChatCompletionRequestMessageToolCall{ ID: chat.NewOptNilString(toolCall.ID), Type: toolCall.Type, Function: chat.ChatCompletionRequestMessageToolCallFunction{ Name: toolCall.Function.Name, Arguments: chat.NewOptString(toolCall.Function.Arguments), }, }) } return requestToolCalls } ``` **选项:Python** ```Python import os import json import time from arkruntime import Ark # Load API key from environment variable api_key = os.getenv('ARK_API_KEY') # Initialize Ark client client = Ark( base_url="https://ark.cn-beijing.volces.com/api/v3", api_key=api_key, ) print("=" * 60) # Initial conversation history with user query messages = [ { "role": "user", "content": "先查询北京的天气,如果是晴天微信发给Alan,否则发给Peter", }, ] # Tool definitions for function calling tools = [ { "type": "function", "function": { "name": "get_current_weather", "description": "", "parameters": { "type": "object", "properties": { "location": { "type": "string", "description": "地理位置,比如北京市", }, "unit": {"type": "string", "description": "枚举值 [摄氏度,华氏度]"}, }, "required": ["location"], }, }, }, { "type": "function", "function": { "name": "SendMessage", "description": "通过微信发送消息给指定用户", "parameters": { "type": "object", "properties": { "receiver": { "type": "string", "description": "接收者用户名", }, "content": { "type": "string", "description": "消息内容", }, }, "required": ["receiver", "content"], }, }, }, ] # Mock function to simulate weather API def mock_get_current_weather(location, unit="摄氏度"): if unit == "华氏度": return f"{location}今天68~75华氏度,天气:阵雨" else: return f"{location}今天20~24度,天气:阵雨" # Mock function to simulate message sending def mock_send_message(receiver, content): return f"成功发送微信消息至{receiver}" # Handle tool calls by dispatching to appropriate mock functions def handle_tool_call(tool_call): function_name = tool_call.function.name function_args = json.loads(tool_call.function.arguments) if function_name == "get_current_weather": return mock_get_current_weather(**function_args) elif function_name == "SendMessage": return mock_send_message(**function_args) else: return f"未知函数: {function_name}" round_count = 0 max_rounds = 10 user_question_printed = False while round_count < max_rounds: round_count += 1 print(f"\n========== Round {round_count} ==========") if round_count == 1 and not user_question_printed: print(f"user: {messages[0]['content']}") user_question_printed = True start_time = time.time() # Call the model response = client.chat.completions.create( model="doubao-seed-2-1-pro-260915", messages=messages, tools=tools ) elapsed_time = time.time() - start_time assistant_message = response.choices[0].message if assistant_message.tool_calls: for tool_call in assistant_message.tool_calls: print(f"assistant [FC Response]: {tool_call.function.name}, args={tool_call.function.arguments}") messages.append(assistant_message.model_dump()) tool_result = handle_tool_call(tool_call) print(f"tool: {tool_result}") messages.append({ "role": "tool", "tool_call_id": tool_call.id, "content": tool_result, "name": tool_call.function.name, }) print(f"耗时: {elapsed_time:.2f} 秒") else: print(f"assistant [Final Answer]: {assistant_message.content}") print(f"耗时: {elapsed_time:.2f} 秒") break print("\n" + "=" * 60) ``` **选项:Java** ```Java package com.volcengine.ark.runtime; import com.volcengine.ark.runtime.models.chat.*; import com.volcengine.ark.runtime.service.ArkService; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; import java.util.*; import java.util.concurrent.TimeUnit; public class FunctionCallChatCompletionsExample { static String apiKey = System.getenv("ARK_API_KEY"); static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); static Dispatcher dispatcher = new Dispatcher(); static ArkService service = ArkService.builder().dispatcher(dispatcher).connectionPool(connectionPool) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .apiKey(apiKey).build(); public static void main(String[] args) { System.out.println("\n----- function call multiple rounds request -----"); final List messages = new ArrayList<>(); final ChatCompletionRequestMessage userMessage = ChatCompletionRequestUserMessage.builder().role(ChatCompletionRequestMessageType.USER).content(ChatCompletionMessageContent.ofString("北京今天天气如何?")).build(); messages.add(userMessage); final List tools = Arrays.asList( ChatCompletionTool.builder().type(ToolType.FUNCTION).function(FunctionObject.builder() .name("get_current_weather") .description("获取给定地点的天气") .parameters(new com.fasterxml.jackson.databind.ObjectMapper().convertValue(new Weather( "object", new HashMap() {{ put("location", new HashMap() {{ put("type", "string"); put("description", "地点的位置信息,比如北京"); }}); put("unit", new HashMap() {{ put("type", "string"); put("description", "枚举值有celsius、fahrenheit"); }}); }}, Collections.singletonList("location") ), Map.class)) .build()).build() ); ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder() .model("${YOUR_ENDPOINT_ID}") .messages(messages) .tools(tools) .build(); ChatCompletionResponseChoice choice = service.createChatCompletion(chatCompletionRequest).getChoices().get(0); messages.add(ChatCompletionRequestAssistantMessage.builder().role(ChatCompletionRequestMessageType.ASSISTANT).content(ChatCompletionMessageContent.ofString(choice.getMessage().getContent())).toolCalls(toRequestToolCalls(choice.getMessage().getToolCalls())).build()); choice.getMessage().getToolCalls().forEach( toolCall -> { messages.add(ChatCompletionRequestToolMessage.builder().role(ChatCompletionRequestMessageType.TOOL).toolCallId(toolCall.getId()).content(ChatCompletionMessageContent.ofString("北京天气晴,24~30度")).name(toolCall.getFunction().getName()).build()); }); ChatCompletionRequest chatCompletionRequest2 = ChatCompletionRequest.builder() .model("${YOUR_ENDPOINT_ID}") .messages(messages) .build(); service.createChatCompletion(chatCompletionRequest2).getChoices().forEach(System.out::println); // shutdown service service.shutdownExecutor(); } public static class Weather { public String type; public Map properties; public List required; public Weather(String type, Map properties, List required) { this.type = type; this.properties = properties; this.required = required; } public String getType() { return type; } public void setType(String type) { this.type = type; } public Map getProperties() { return properties; } public void setProperties(Map properties) { this.properties = properties; } public List getRequired() { return required; } public void setRequired(List required) { this.required = required; } } private static java.util.List toRequestToolCalls( java.util.List toolCalls) { if (toolCalls == null) { return java.util.Collections.emptyList(); } java.util.List requestToolCalls = new java.util.ArrayList<>(); for (ChatCompletionMessageToolCall toolCall : toolCalls) { requestToolCalls.add( ChatCompletionRequestMessageToolCall.builder() .id(toolCall.getId()) .type(toolCall.getType()) .function( ChatCompletionRequestMessageToolCallFunction.builder() .name(toolCall.getFunction().getName()) .arguments(toolCall.getFunction().getArguments()) .build()) .build()); } return requestToolCalls; } } ``` ### 响应示例 ```Python ========== Round 1 ========== user: 先查询北京的天气,如果是晴天微信发给Alan,否则发给Peter... assistant [FC Response]: name=GetCurrentWeather, args={"location": "\u5317\u4eac"} [elapsed=2.607 s] ========== Round 2 ========== tool: 北京今天20~24度,天气:阵雨。... assistant [FC Response]: name=SendMessage, args={"content": "\u4eca\u5929\u5317\u4eac\u7684\u5929\u6c14", "receiver": "Peter"} [elapsed=3.492 s] ========== Round 3 ========== tool: 成功发送微信消息至Peter... assistant [Final Answer]: 好的,请问还有什么可以帮助您? [elapsed=0.659 s] ``` ### 多轮输出注意事项 #### **轮次输出顺序** 触发函数调用时,系统先输出`content`给用户,再生成`tool_calls`并结束当前输出;**当前轮次内容不可依赖工具结果**,后续指令需待工具返回`message`后执行。 #### **多轮输出响应完整性** 严格遵循`assistant(含tool_calls)→ tool(含message)→ assistant`的顺序,禁止跳过`tool message`响应直接发送新的`assistant`消息。每次`tool_calls`需对应`tool`角色的 `message`(含成功/错误结果),缺失可能因`prefill`机制触发重复调用或流程中断。 ## 效果优化 如果函数调用的效果未达到您的预期,可以尝试通过以下方法进行优化: * **更换为最新模型**:建议您选用最新的模型版本,通常能获得更好的函数调用效果。 * **进行模型精调**:通过监督微调(SFT)或强化学习,可以针对性地提升模型表现。详情请参见[模型精调概述](/docs/fine-tuning-overview)。精调主要能改善以下方面: * **函数选择准确性**:提升模型在合适时机选择正确函数的能力。 * **参数提取能力**:优化模型解析用户意图并生成准确函数入参的能力。 * **结果总结质量**:改善模型对工具执行结果的总结,使其更自然、准确。 --- # 常见问题 ## Q:函数调用& MCP 的核心区别是什么,使用时如何选型? 核心区别与典型使用场景: |**维度** |**FC(Function Calling)** |**MCP(Model Context Protocol)** | |---|---|---| |**本质** |模型调用外部工具 / 函数的能力(功能扩展) |定义模型与外部系统交互时的上下文管理协议(流程规范) | |**目标** |弥补模型自身能力不足(如计算、数据查询、操作执行) |标准化交互过程中上下文的传递、解析与状态维护 | |**核心作用** |实现模型与外部工具的 “能力集成” |确保多轮交互中上下文(如对话历史、参数、状态)的一致性 | |**协议标准** |厂商自定义格式(如 OpenAI 的 JSON 参数结构) |强制遵循 JSON-RPC 2.0 标准,强调协议统一性 | |**架构** |直接集成于模型 API,用户定义函数后由模型触发调用 |客户端 - 服务器模式,分离 MCP Host(客户端)与 MCP Server(服务端) | |**上下文管理** |单次请求 - 响应模式,上下文依赖需开发者自行处理 |支持多轮对话、历史状态维护,适用于长序列依赖任务 | |**典型使用场景** |外部数据调用与系统操作(如天气查询、复杂运算);示例:调用天气 API 回复 “东京今日气温” |多轮对话与跨系统上下文管理(如订餐流程、客服对话);示例:连贯处理订餐菜品与配送地址 | 两者之间的关系: * **互补而非互斥**: * MCP 可能在流程中包含函数调用的调用逻辑(如定义何时、如何触发函数调用)。 * 函数调用的输入输出需遵循 MCP 的上下文规范(如参数格式、返回值解析规则)。 * **分层协作**: * MCP 解决连接问题:标准化协议打通数据孤岛,提供基础设施(如整合用户订单数据)。 * 函数调用解决执行问题:在协议层之上调用具体函数完成任务(如调用库存 API 生成补货建议)。 * **架构定位**:函数调用是**能力接口**,MCP 是**交互框架**,二者常结合使用以构建复杂应用(如智能助手同时需要调用工具和管理多轮对话状态)。 参考文档: * **MCP 官方协议规范**[Model Context Protocol Specification](https://modelcontextprotocol.io/specification/):明确协议核心架构、JSON - RPC 消息格式、状态管理机制与安全策略,是接口设计的权威参考。 * **MCP 社区与生态发展** [MCP Development Roadmap](https://modelcontextprotocol.io/development/roadmap):介绍 MCP 发展规划,涵盖远程连接支持、沙箱安全机制及多模态扩展等发展计划。 ## **Q:Deepseek R1 模型是否支持并行函数调用?** A:暂不支持 `parallel_tool_calls` 控制字段,该模型默认采用自动触发并行调用机制,开发者无需额外配置即可实现多工具并行调用。 ## **Q:如何处理 Deepseek R1 的参数幻觉问题?** A:该模型在复杂参数解析时可能出现嵌套调用异常(如 `get_weather:{city: get_location()}`),建议通过以下方式干预: * 在 `system prompt` 中明确要求**分步调用**(如“请先调用定位函数,再调用天气查询函数”) 。 * 使用 **JSON Schema 校验**强制参数格式。 ## Q:如何判断模型是否需要调用函数? A:模型会根据用户问题和工具定义自主判断,若返回结果中包含 `tool_calls` 字段,则表示需要调用工具;若 `content` 字段有直接回复,则无需调用工具。 ## Q:支持并行调用多个函数吗? A:支持并行函数调用,通过设置 `parallel_tool_calls` 参数为 `true`,模型可同时返回多个函数调用信息,提高处理效率。 ## Q:为什么模型返回的工具参数存在幻觉? A:这是大模型常见的问题,可通过精调(SFT)优化模型的参数生成能力,或在系统提示中明确参数的格式和范围,减少幻觉现象。 部分模型(特别是 Deepseek R1)存在一些参数幻觉问题。如预期先调用 get_location 获得城市,再调用 get_weather 查询,R1 模型有概率直接返回 `get_weather:{city: **get_location()**}` 这种嵌套调用,请在系统提示词中进行干预解决,分步完成调用。 ## Q:如何处理函数调用失败的情况? A:将工具失败信息以 `role=tool` 的消息回填给模型,模型会根据错误信息生成相应的回复,例如“抱歉,函数调用失败,请稍后重试。”。 通过以上优化,开发者能够更高效地使用函数调用功能,实现大模型与外部工具的深度整合,快速构建智能应用。 --- # 附 1:工具函数参数构造规范 为确保模型正确调用工具功能,需按以下规范构造 `tools` 对象,遵循 JSON Schema 标准。 本文主要讲解如何构造函数调用工具,关于工具函数的使用请参考[基本使用流程](/docs/function-calling#db7321a0)。 ## 总体结构 ```JSON { "type": "function", "function": { "name": "get_current_weather", "description": "获取指定地点的天气信息", "parameters": {} } } ``` * `type`:工具的类型,这里是固定值 `function`,表示这是一个函数调用工具。 * `function`:含函数名称、描述和参数等详细配置。 ## 字段解释 ### `function` 字段 |**字段** |**类型** |**是否必填** |**说明** | |---|---|---|---| |name |string |是 |函数名称,唯一标识,建议使用小写加下划线 | |description |string |是 |函数作用的描述 | |parameters |object |是 |函数参数定义,需要符合 JSON Schema 格式 | ### `parameters` 字段 `parameters` 须为符合 JSON Schema 格式的对象: ```JSON { "type": "object", "properties": { "参数名": { "type": "string | number | boolean | object | array", "description": "参数说明" } }, "required": ["必填参数"] } ``` * `type`:必须是 `"object"`。 * `properties`:列出支持的所有参数名及其类型。 * `参数``名`须为英文字符串,且不能重复。 * 参数`type`需遵循 [json 规范](https://json-schema.org/docs),支持类型包括 string、number、boolean、integer、object、array。 * `required`:指定函数中必填的参数名。 * 其它参数根据`type`的不同稍有区别,详情请参见下表。 |`type`类型 |示例 | |---|---| |string、integer、number、boolean |略 | |object (对象) |* 示例 1: 查询特点用户画像(根据年龄、性别、婚姻状况等) | \ | | | \ |* `description`:简要说明 |```Python | \ |* `properties` 描述该对象所有属性 |"person": { | \ |* `required` 描述必填属性 | "type": "object", | \ | | "description": "个人特征", | \ | | "properties": { | \ | | "age": {"type": "integer", "description": "年龄"}, | \ | | "gender": {"type": "string", "description": "性别"}, | \ | | "married": {"type": "boolean", "description": "是否已婚"} | \ | | }, | \ | | "required": ["age"], | \ | |} | \ | |``` | |array (列表) |* 示例 1:文本数组,若干个网页链接 | \ | | | \ |* `description`:简要说明 |```Bash | \ |* `"items": {"type": ITEM_TYPE}`来表达数组元素的数据类型 |"url": { | \ | | "type": "array", | \ | | "description": "需要解析网页链接,最多3个", | \ | | "items": {"type": "string"} | \ | |``` | \ | | | \ | | | \ | |* 示例 2:二维数组 | \ | | | \ | |```Go | \ | |"matrix": { | \ | | "type": "array", | \ | | "description": "需要计算的二维矩阵", | \ | | "items": {"type": "array", "items": {"type": "number"}}, | \ | |} | \ | |``` | \ | | | \ | | | \ | |* 示例 3: 通过 array 来实现多选 | \ | | | \ | |```JSON | \ | | | \ | |"grade": { | \ | | "description": "年级, 支持多选", | \ | | "type": "array", | \ | | "items": { | \ | | "type": "string", | \ | | "description": "枚举值有\n\"一年级\",\n\"二年级\",\n\"三年级\",\n\"四年级\",\n\"五年级\",\n\"六年级\"。 " | \ | | }, | \ | |} | \ | |``` | ## 完整示例 ```JSON { "type": "function", "function": { "name": "get_weather", "description": "获取指定位置的天气信息", "parameters": { "type": "object", "properties": { "location": { "type": "string", "description": "城市和国家,例如:北京,中国" } }, "required": ["location"] } } } ``` ## 注意事项 * **大小写敏感**:所有字段名、参数名严格区分大小写(建议统一用小写)。 * **中文处理**:字段名用英文,中文说明置于 `description` 中(如 `location` 的描述为 “城市和国家”)。 * **Schema 合规性**:`parameters` 必须是有效的 JSON Schema 对象,可通过 JSON Schema 校验工具验证。 ## 最佳实践 1. 工具描述核心准则 * 详细说明工具功能、适用场景(及禁用场景)、参数含义与影响、限制条件(如输入长度限制),单工具描述建议 3-4 句。 * 优先完善功能、参数等基础描述,示例仅作为补充(推理模型需谨慎添加)。 2. 函数设计要点 * **命名与参数**:函数名直观(如`parse_product_info`),参数说明包含格式(如`city: string`)和业务含义(如“目标城市拼音全称”),明确输出定义(如“返回 JSON 格式天气数据”)。 * **系统提示**:通过提示指定调用条件(如“用户询问商品详情时触发`get_product_detail`”)。 * **工程化设计**: * 使用枚举类型(如`StatusEnum`)避免无效参数,确保逻辑直观(最小惊讶原则)。 * 确保仅凭文档描述,人类可正确调用函数(补充潜在疑问解答)。 * **调用优化**: * 已知参数通过火山方舟代码能力隐式传递(如`submit_order`无需重复声明`user_id`)。 * 合并固定流程函数(如`query_location`与`mark_location`整合为`query_and_mark_location`)。 3. 关于 `Parameters` 字段顺序的稳定性 尽管在标准 JSON 规范中对象的键是无序的,但在向大模型提供 tools 定义时, 建议保持 properties 内部字段顺序的固定与一致。原因在于,大模型底层将 JSON 结构视为线性的文本 Token 序列。字段顺序的改变会导致模型接收到的系统提示词发生变化,这可能会影响模型的注意力机制,进而导致模型生成的函数调用参数顺序或最终结果产生微小的差异。在进行提示词效果测试或回归测试时,请确保参数定义的顺序保持不变。 --- # 深度思考 Source: https://ark.volcengine.com/region:cn-beijing/docs/deep-thinking 深度思考指模型在回答前,对问题进行分析及多步骤规划,再尝试解决问题。擅长处理编程、科学推理、智能体工作流等复杂及抽象场景。启用深度思考后,会在指定字段返回思维链内容,可基此观察和使用模型推导内容。 > **说明** > > 方舟平台的新用户?获取 API Key 及 开通模型等准备工作,请参见 [快速入门](/docs/quick-start)。 # 快速开始 |输入 |思维链 |回答 | | --- | --- | --- | |```Plain Text |```Plain Text |```Plain Text | \ |我要研究深度思考模型与非深度思考模型区别的课题,怎么体现我的专业性 |用户现在要做深度思考模型和非深度思考模型区别的课题,需要体现专业性。首先得明确,专业性体现在哪里? |### **一、第一步:明确概念边界——避免泛化,精准定义** | \ |``` |... |专业性的起点是**清晰的概念界定**,避免将“深度模型”等同于“深度思考模型”,也避免将“非深度模型”简化为“传统模型”。需基于学术共识和研究目标给出操作性定义: | \ | |要在“深度思考模型与非深度思考模型区别”的课题中体现专业性,核心在于**严谨的概念界定、系统的对比框架、科学的方法论支撑、以及深度的理论与实践结合**。以下是具体的实施路径,从研究框架到细节落地,帮你构建专业的研究体系: |... | \ | |``` |通过以上路径,你的课题将从“表面对比”升级为“本质穿透”,充分体现专业性与研究深度。祝你研究顺利! | \ | | |``` | **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "messages": [ { "role": "user", "content": "我要研究深度思考模型与非深度思考模型区别的课题,怎么体现我的专业性" } ] }' ``` * 您可按需替换 Model ID。Model ID 查询见 [模型列表](/docs/model-list)。 **选项:Python** ```Python import os # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark client = Ark( # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv('ARK_API_KEY'), # Deep thinking takes longer; set a larger timeout, with 1,800 seconds or more recommended timeout=1800, ) completion = client.chat.completions.create( # Replace with Model ID model = "doubao-seed-2-1-pro-260915", messages=[ {"role": "user", "content": "我要研究深度思考模型与非深度思考模型区别的课题,怎么体现我的专业性"} ] ) # When deep thinking is triggered, print the chain-of-thought content if hasattr(completion.choices[0].message, 'reasoning_content'): print(completion.choices[0].message.reasoning_content) print(completion.choices[0].message.content) ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "time" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/chat" ) func main() { client := arkruntime.NewClientWithApiKey( // Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey os.Getenv("ARK_API_KEY"), // The base URL for model invocation arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), // Deep thinking takes longer; set a larger timeout, with 1,800 seconds or more recommended arkruntime.WithTimeout(30*time.Minute), ) ctx := context.Background() req := &chat.ChatCompletionRequest{ // Replace with Model ID Model: "doubao-seed-2-1-pro-260915", Messages: []chat.ChatCompletionRequestMessage{ userMessage("我要研究深度思考模型与非深度思考模型区别的课题,怎么体现我的专业性"), }, } resp, err := client.CreateChatCompletion(ctx, req) if err != nil { fmt.Printf("standard chat error: %v\n", err) return } // When deep thinking is triggered, print the chain-of-thought content if resp.Choices[0].Message.ReasoningContent.IsSet() { fmt.Println(resp.Choices[0].Message.ReasoningContent.Or("")) } fmt.Println(resp.Choices[0].Message.Content) } func userMessage(content string) chat.ChatCompletionRequestMessage { return chat.ChatCompletionRequestMessage{ OneOf: chat.NewChatCompletionRequestUserMessageChatCompletionRequestMessageSum( chat.ChatCompletionRequestUserMessage{ Role: chat.ChatCompletionRequestUserMessageRoleUser, Content: chat.NewOptNilChatCompletionMessageContent(chat.NewStringChatCompletionMessageContent(content)), }, ), } } ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.chat.*; import com.volcengine.ark.runtime.service.ArkService; import java.util.*; import java.util.concurrent.TimeUnit; import java.time.Duration; public class ChatCompletionsExample { public static void main(String[] args) { // Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey String apiKey = System.getenv("ARK_API_KEY"); ArkService arkService = ArkService.builder() .apiKey(apiKey) .timeout(Duration.ofMinutes(30))// Deep thinking takes longer; set a larger timeout, with 1,800 seconds or more recommended .baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation .build(); List chatMessages = new ArrayList<>(); ChatCompletionRequestMessage userMessage = ChatCompletionRequestUserMessage.builder() .role(ChatCompletionRequestMessageType.USER) .content(ChatCompletionMessageContent.ofString("我要研究深度思考模型与非深度思考模型区别的课题,怎么体现我的专业性")) .build(); chatMessages.add(userMessage); ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder() .model("doubao-seed-2-1-pro-260915")//Replace with Model ID .messages(chatMessages) .build(); try { arkService.createChatCompletion(chatCompletionRequest) .getChoices() .forEach(choice -> { if (choice.getMessage().getReasoningContent() != null) { System.out.println(choice.getMessage().getReasoningContent()); } System.out.println(choice.getMessage().getContent()); }); } catch (Exception e) { System.out.println(e.getMessage()); } finally { // Shut down the service executor arkService.shutdownExecutor(); } } } ``` **选项:OpenAI SDK** ```Python import os from openai import OpenAI client = OpenAI( # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.environ.get("ARK_API_KEY"), base_url="https://ark.cn-beijing.volces.com/api/v3", # Deep thinking takes longer; set a larger timeout, with 1,800 seconds or more recommended timeout=1800, ) completion = client.chat.completions.create( # Replace with Model ID model = "doubao-seed-2-1-pro-260915", messages=[ {"role": "user", "content": "我要研究深度思考模型与非深度思考模型区别的课题,怎么体现我的专业性"} ] ) # When deep thinking is triggered, print the chain-of-thought content if hasattr(completion.choices[0].message, 'reasoning_content'): print(completion.choices[0].message.reasoning_content) print(completion.choices[0].message.content) ``` # 模型及 API 支持的模型:[文本生成能力](/docs/model-list#32e9e053) 中能力标签含"深度思考"的模型。 支持的 API: * [Responses API](/docs/create-model-responses-api):新推出的 API,简洁上下文管理,增强工具调用能力,缓存能力降低成本,新业务及用户推荐。 * [Chat API](/docs/chat-api):使用广泛的 API,存量业务迁移成本低。 # 基础使用 ## 多轮对话 组合使用系统消息、模型消息以及用户消息,可以实现多轮对话。当需要持续在一个主题内对话,可以将历史轮次的对话记录输入给模型。 |传入方式 |手动管理上下文 |通过 ID 管理上下文 | | --- | --- | --- | |使用示例 |```JSON |```JSON | \ | |... |... | \ | | "model": "doubao-seed-2-1-pro-260915", | "model": "doubao-seed-2-1-pro-260915", | \ | | "messages":[ | "previous_response_id":"", | \ | | {"role": "user", "content": "Hi, tell a joke."}, | "input": "What is the punchline of this joke?" | \ | | {"role": "assistant", "content": "Why did the math book look sad? Because it had too many problems! 😄"}, |... | \ | | {"role": "user", "content": "What's the punchline of this joke?"} |``` | \ | | ] | | \ | |... | | \ | |``` | | |API |[Chat API](/docs/chat-api) |[Responses API](/docs/create-model-responses-api) | > 在构建多轮对话的上下文时:保留历史对话的 **reasoning_content** 字段,由模型自行判断是否将该字段加入到推理输入中。 > 更多说明及完整示例请参见[上下文管理](/docs/context-management)。 ## 流式输出 随着大模型输出,动态输出内容,无需等待模型推理完毕,即可看到中间输出过程内容。 |预览 |优势 | | --- | --- | |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/0b0ed47ec1b94b20a4f4966aa80130e6) |* **改善等待体验**:无需等待完整内容生成完毕,可立即处理过程内容。 | \ | |* **实时过程反馈**:多轮交互场景,实时了解任务当前的处理阶段。 | \ | |* **更高的容错性**:中途出错,也能获取到已生成内容,避免非流式输出失败无返回的情况。 | \ | |* **简化超时管理**:保持客户端与服务端的连接状态,避免复杂任务耗时过长而连接超时。 | 通过配置 **stream** 为 `true`,来启用流式输出。 ```JSON "model": "doubao-seed-2-1-pro-260915", "messages": [ {"role": "user", "content": "深度思考模型与非深度思考模型区别"} ], "stream": true ``` > 完整示例及更多说明请参见[流式输出](/docs/streaming-output)。 ## 开启/关闭深度思考 提供 **thinking** 字段控制是否关闭深度思考能力,实现“复杂任务深度推理,简单任务高效响应”的精细控制,获得成本、效率收益。 * 取值说明: * `enabled`:强制开启,强制开启深度思考能力。 * `disabled`:强制关闭深度思考能力。 * `auto`:模型自行判断是否进行深度思考。 * 示例代码: **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "messages": [ { "role": "user", "content": [ { "type":"text", "text":"我要研究深度思考模型与非深度思考模型区别的课题,体现出我的专业性" } ] } ], "thinking":{ "type":"disabled" } }' ``` * **model**:请变更为实际调用的模型。 * **thinking.type**:字段可以取值范围。 * `disabled`:强制关闭深度思考能力,模型不输出思维链内容。 * `enabled`:强制开启深度思考能力,模型强制输出思维链内容。 * `auto`:模型自行判断是否需要进行深度思考。 **选项:Python** ```Python import os # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark client = Ark( # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv('ARK_API_KEY'), # Deep thinking takes longer; set a larger timeout, with 1,800 seconds or more recommended timeout=1800, ) # 创建一个对话请求 completion = client.chat.completions.create( # Replace with Model ID model="doubao-seed-2-1-pro-260915", messages=[ {"role": "user", "content": "我要研究深度思考模型与非深度思考模型区别的课题,体现出我的专业性"} ], thinking={ "type": "disabled", # 不使用深度思考能力 # "type": "enabled", # 使用深度思考能力 # "type": "auto", # 模型自行判断是否使用深度思考能力 }, ) print(completion) ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "time" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/chat" ) func main() { client := arkruntime.NewClientWithApiKey( // Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey os.Getenv("ARK_API_KEY"), // The base URL for model invocation arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), //深度思考耗时更长,请设置更大的超时限制,推荐为30分钟及以上 arkruntime.WithTimeout(30*time.Minute), ) // 创建一个上下文,通常用于传递请求的上下文信息,如超时、取消等 ctx := context.Background() // 构建聊天完成请求,设置请求的模型和消息内容 req := &chat.ChatCompletionRequest{ // Replace with Model ID Model: "doubao-seed-2-1-pro-260915", Messages: []chat.ChatCompletionRequestMessage{ userMessage("我要研究深度思考模型与非深度思考模型区别的课题,怎么体现我的专业性"), }, Thinking: chat.NewOptThinking(chat.Thinking{Type: chat.NewOptThinkingMode(chat.ThinkingModeDisabled)}), } // 发送聊天完成请求,并将结果存储在 resp 中,将可能出现的错误存储在 err 中 resp, err := client.CreateChatCompletion(ctx, req) if err != nil { // 若出现错误,打印错误信息并终止程序 fmt.Printf("standard chat error: %v ", err) return } // 检查是否触发深度思考,触发则打印思维链内容 if resp.Choices[0].Message.ReasoningContent.IsSet() { fmt.Println(resp.Choices[0].Message.ReasoningContent.Or("")) } // 打印聊天完成请求的响应结果 fmt.Println(resp.Choices[0].Message.Content) } func userMessage(content string) chat.ChatCompletionRequestMessage { return chat.ChatCompletionRequestMessage{ OneOf: chat.NewChatCompletionRequestUserMessageChatCompletionRequestMessageSum( chat.ChatCompletionRequestUserMessage{ Role: chat.ChatCompletionRequestUserMessageRoleUser, Content: chat.NewOptNilChatCompletionMessageContent(chat.NewStringChatCompletionMessageContent(content)), }, ), } } ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.chat.*; import com.volcengine.ark.runtime.service.ArkService; import java.time.Duration; import java.util.ArrayList; import java.util.List; /** * 这是一个示例类,展示了如何使用ArkService来完成聊天功能。 */ public class ChatCompletionsExample { public static void main(String[] args) { // 从环境变量中获取API密钥 String apiKey = System.getenv("ARK_API_KEY"); // 创建ArkService实例 ArkService arkService = ArkService.builder() .apiKey(apiKey) .timeout(Duration.ofMinutes(30))// 深度思考耗时更长,请设置更大的超时限制,推荐为30分钟及以上 // The base URL for model invocation .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); // 初始化消息列表 List chatMessages = new ArrayList<>(); // 创建用户消息 ChatCompletionRequestMessage userMessage = ChatCompletionRequestUserMessage.builder() .role(ChatCompletionRequestMessageType.USER) // 设置消息角色为用户 .content(ChatCompletionMessageContent.ofString("我要研究深度思考模型与非深度思考模型区别的课题,怎么体现我的专业性")) // 设置消息内容 .build(); // 将用户消息添加到消息列表 chatMessages.add(userMessage); ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder() .model("doubao-seed-2-1-pro-260915")//Replace with Model ID .messages(chatMessages) // 设置消息列表 .thinking(Thinking.builder().type(ThinkingMode.DISABLED).build()) .build(); // 发送聊天完成请求并打印响应 try { // 获取响应并打印每个选择的消息内容 arkService.createChatCompletion(chatCompletionRequest) .getChoices() .forEach(choice -> { // 校验是否触发了深度思考,打印思维链内容 if (choice.getMessage().getReasoningContent() != null) { System.out.println("推理内容: " + choice.getMessage().getReasoningContent()); } else { System.out.println("推理内容为空"); } // 打印消息内容 System.out.println("消息内容: " + choice.getMessage().getContent()); }); } catch (Exception e) { System.out.println("请求失败: " + e.getMessage()); } finally { // 关闭服务执行器 arkService.shutdownExecutor(); } } } ``` **选项:OpenAI SDK** ```Python import os from openai import OpenAI client = OpenAI( # 从环境变量中读取方舟API Key api_key=os.environ.get("ARK_API_KEY"), base_url="https://ark.cn-beijing.volces.com/api/v3", # 深度思考耗时更长,避免连接超时导致失败,请设置更大的超时限制,推荐为1800 秒及以上 timeout=1800, ) completion = client.chat.completions.create( # Replace with Model ID model = "doubao-seed-2-1-pro-260915", messages=[ { "role": "user", "content": "我要研究深度思考模型与非深度思考模型区别的课题,体现出我的专业性", } ], extra_body={ "thinking": { "type": "disabled", # 不使用深度思考能力 # "type": "enabled", # 使用深度思考能力 # "type": "auto", # 模型自行判断是否使用深度思考能力 } }, ) print(completion) ``` * 支持模型: * doubao-seed-evolving:支持 `enabled`(默认)、`disabled`。 * doubao-seed-2-1-pro-260915:支持 `enabled`(默认)、`disabled`。 * doubao-seed-2-1-lite-260915:支持 `enabled`(默认)、`disabled`。 * doubao-seed-2-1-pro-260628:支持 `enabled`(默认)、`disabled`。 * doubao-seed-2-1-turbo-260628:支持 `enabled`(默认)、`disabled`。 * doubao-seed-2-0-lite-260428:支持 `enabled`(默认)、`disabled`。 * doubao-seed-2-0-mini-260428:支持 `enabled`(默认)、`disabled`。 * doubao-seed-2-0-pro-260215:支持 `enabled`(默认)、`disabled`。 * doubao-seed-2-0-lite-260215:支持 `enabled`(默认)、`disabled`。 * doubao-seed-2-0-mini-260215:支持 `enabled`(默认)、`disabled`。 * doubao-seed-2-0-code-preview-260215:支持 `enabled`(默认)、`disabled`。 * glm-5-3-flash-260828:支持 `enabled`(默认)。(**始终启用思考,不再支持禁用思考。**) * glm-5-2-260617:支持 `enabled`(默认)、`disabled`。 * doubao-seed-character-260628:支持 `enabled`(默认)、`disabled`。 * deepseek-v4-1-flash-261017:支持 `enabled`(默认)、`disabled`。 * deepseek-v4-1-flash-260910:支持 `enabled`(默认)、`disabled`。 * deepseek-v4-1-flash-economy-261017:支持 `enabled`(默认)、`disabled`。 * deepseek-v4-pro-ga-260813:支持 `enabled`(默认)、`disabled`。 * deepseek-v4-flash-ga-260731:支持 `enabled`(默认)、`disabled`。 * deepseek-v4-pro-260425:支持 `enabled`(默认)、`disabled`。 * 更多说明 * Responses API 使用说明请参见[控制深度思考](/docs/responses-api-deep-thinking#19c1bd32)。 * 深度思考会影响续写模式,详细信息请参见[续写模式](/docs/continuation-mode)。 ## 设置最大输出长度 模型输出内容由**思维链(Chain of Thought, COT)** 和**最终回答(Answer)** 两部分组成。合理控制模型输出长度,平衡效果、速度、成本与稳定性。 |传入方式 |手动管理上下文 |通过 ID 管理上下文 | | --- | --- | --- | |API |[Chat API](/docs/chat-api) |[Responses API](/docs/create-model-responses-api) | |示例 |```JSON |```JSON | \ | |... |... | \ | | "model": "doubao-seed-2-1-pro-260915", | "model": "doubao-seed-2-1-pro-260915", | \ | | "messages": [ | "previous_response_id":"", | \ | | {"role": "user", "content": "Hi, tell a joke."} | "input": "Hi, tell a joke.", | \ | | ], | "max_output_tokens": 300 | \ | | "max_completion_tokens": 300 |... | \ | |... |``` | \ | |``` | | > 完整示例及更多说明请参见[控制输出(回答+思维链)长度](/docs/context-management#3cb3d444)。 ## 调节思考长度 提供字段 **reasoning_effort**(Chat API)、**reasoning.effort**(Responses API)调节思维链长度,平衡不同场景对效果、时延、成本的需求。取值如下: * `none`:关闭思考。 * `minimal`:关闭思考,直接回答。 * `low`:轻量思考,侧重快速响应。 * `medium`:均衡模式,兼顾速度与深度。 * `high`:深度分析,处理复杂问题。 * `xhigh`:更高强度思考。 * `max`:最高强度思考,适配高难度推理任务。 下表展示支持调节思考长度的模型,以及各模型对 **reasoning_effort**(Chat API)、**reasoning.effort**(Responses API)的默认取值与兼容映射规则。所有支持该字段的模型均接受全部 7 档取值,部分取值将按表中规则自动映射至等效档位。 | 支持模型 | 默认取值 | 兼容映射 | | --- | --- | --- | |* `doubao-seed-evolving` | `high` |* 传入 `minimal`:将关闭思考 | \ |* `doubao-seed-2-1-pro-260915` | |* 传入 `none`:将映射为 `minimal` | \ |* `doubao-seed-2-1-lite-260915` | |* 传入 `none`:将映射为 `minimal` | \ |* `doubao-seed-2-1-pro-260628` | |* 传入 `xhigh` / `max`:将映射为 `high` | \ |* `doubao-seed-2-1-turbo-260628` | | | |* `doubao-seed-2-0-lite-260428` | `medium` |* 传入 `minimal`:将关闭思考 | \ |* `doubao-seed-2-0-mini-260428` | |* 传入 `none`:将映射为 `minimal` | \ |* `doubao-seed-2-0-pro-260215` | |* 传入 `xhigh` / `max`:将映射为 `high` | \ |* `doubao-seed-2-0-lite-260215` | | | \ |* `doubao-seed-2-0-mini-260215` | | | \ |* `doubao-seed-2-0-code-preview-260215` | | | \ |* `doubao-seed-character-260628` | | | | `glm-5-3-flash-260828` | `max` |* 传入 `none` / `minimal` / `low`:将映射为 `low` | \ | | |* 传入 `medium` / `high`:将映射为 `high` | \ | | |* 传入 `xhigh` / `max`:将映射为 `max` | | `glm-5-2-260617` | `high` |* 传入 `none` / `minimal`:将关闭思考 | \ | | |* 传入 `low` / `medium`:将映射为 `high` | \ | | |* 传入 `xhigh`:将映射为 `max` | |* `deepseek-v4-1-flash-261017`
    * `deepseek-v4-1-flash-260910`
    * `deepseek-v4-1-flash-economy-261017` | `high` |* 传入 `none`:将关闭思考 | \ | | |* 传入 `minimal`:将映射为 `low` | \ | | |* 传入 `medium` / `xhigh`:将映射为 `high` | \ | | |* 传入 `ultra`:将映射为 `max` | |* `deepseek-v4-pro-ga-260813` | `high` |* 传入 `none` / `minimal`:将关闭思考 | \ |* `deepseek-v4-flash-ga-260731` | |* 传入 `medium`:将映射为 `low` | \ | | |* 传入 `xhigh`:将映射为 `high` | |* `deepseek-v4-pro-260425` | `high` |* 传入 `minimal`:将关闭思考 | \ |API |[Chat API](/docs/chat-api) |[Responses API](/docs/create-model-responses-api) | | --- | --- | --- | |示例 |```JSON |```JSON | \ | |... |... | \ | | "model": "doubao-seed-2-1-pro-260915", | "model": "doubao-seed-2-1-pro-260915", | \ | | "messages": [ | "input": [ | \ | | {"role": "user","content": "What are some common cruciferous plants?"} | {"role": "user","content":"What are some common cruciferous plants?"} | \ | | ], | ], | \ | | "reasoning_effort": "low" | "reasoning":{"effort": "low"} | \ | |... |... | \ | |``` |``` | 完整示例及说明请参见 [控制思维链长度](/docs/context-management#480730d0)。 ## 回传思考内容 doubao-seed-1.8 之前的模型在工具调用场景中开启深度思考后,会直接丢弃思维链内容。doubao-seed-1.8 及部分模型为给出更详尽准确的回答,将不会直接丢弃思维链内容,思维链内容可能参与后续轮次推理,输入 tokens 会增加,具体参见[工作原理](/docs/deep-thinking#e1e56b26)。 > **说明** > > 推荐在 Responses API 中使用 previous_response_id,平台自动保存历史对话的上下文,并在多轮交互中回传给推理服务。 ### 回传思考内容加密原文 部分模型默认会开启 thinking summary 能力,不会输出模型原始的思考内容,会返回模型思考内容摘要(**choices.message.reasoning_content**)、思考内容加密原文(**choices.message.encrypted_content**)。在多轮工具调用场景(如 agent 场景),必须原样回传思考内容加密原文。 > **说明** > > 默认开启 thinking summary 能力后,可能会有较高的包间延迟,请调大请求超时时间(**timeout**),并做好兼容适配。 **支持模型**: * doubao-seed-evolving * doubao-seed-2-1-pro-260915 * doubao-seed-2-1-lite-260915 * doubao-seed-2-1-pro-260628 * doubao-seed-2-1-turbo-260628 * doubao-seed-2-0-lite-260428 **字段说明**: * **reasoning_effort**:仅作用于模型的原始思考内容,不适用于思考摘要。 * **usage.completion_tokens_details.reasoning_tokens**:为原始思考内容的 tokens,计费仍然按原始思考内容 token 计算。 **回传注意事项**: * 回传 **encrypted_content**、**reasoning_content** 字段: **encrypted_content** 字段优先级高,会忽略 **reasoning_content** 中的内容。其中 **encrypted_content** 内容必须为有效内容,如果被篡改则无法还原。 * 仅回传 **reasoning_content** 字段:使用思考内容摘要参与模型推理。在多轮工具调用场景(如 agent 场景),如果没有回传 **encrypted_content** 字段,将导致模型推理效果下降。 * 未回传思考内容相关字段:不会报错。 **回传思考内容加密原文示例**: 以下是在工具调用场景,回传思考内容加密原文的示例。其中使用 Responses API 推荐使用 previous_response_id 自动获取原始思考内容并回传给模型参与推理。 |API |[Chat API](/docs/chat-api) |[Responses API](/docs/create-model-responses-api) | | --- | --- | --- | |支持模型及说明 |* [回传思考内容加密原文](/docs/deep-thinking#8cfd447b) |* [支持模型](/docs/responses-api-deep-thinking#7e7354e3) | |示例 |**第一轮请求:触发工具调用** |**第一轮请求:触发工具调用** | \ | | | | \ | |```Bash |```Bash | \ | |curl https://ark.cn-beijing.volces.com/api/v3/chat/completions \ |curl https://ark.cn-beijing.volces.com/api/v3/responses \ | \ | | -H "Content-Type: application/json" \ | -H "Authorization: Bearer $ARK_API_KEY" \ | \ | | -H "Authorization: Bearer $ARK_API_KEY" \ | -H "Content-Type: application/json" \ | \ | | -d '{ | -d '{ | \ | | "model": "doubao-seed-2-0-lite-260215", | "model": "doubao-seed-2-0-lite-260215", | \ | | "messages": [ | "input": [ | \ | | { | { | \ | | "role": "system", | "role": "system", | \ | | "content": "你是人工智能助手。" | "content": "你是人工智能助手." | \ | | | | \ | | }, | }, | \ | | { | { | \ | | "role": "user", | "role": "user", | \ | | "content": "今天北京天气怎么样" | "content": "今天北京天气怎么样" | \ | | | | \ | | } | } | \ | | ], | ], | \ | | "thinking":{"type": "enabled"}, | "thinking":{"type": "enabled"}, | \ | | "tools": [ | | \ | | { | "tools": [ | \ | | "type": "function", | { | \ | | "function": { | "type": "function", | \ | | "name": "get_weather", | "name": "get_weather", | \ | | "description": "天气查询", | "description": "天气查询", | \ | | | | \ | | "parameters": { | "parameters": { | \ | | "properties": { | "type": "object", | \ | | "location": { | "properties": { | \ | | "description": "地点的位置信息,例如北京、上海。", | "location": { | \ | | | "type": "string", | \ | | "type": "string" | "description": "地点的位置信息,例如北京、上海。" | \ | | } | | \ | | }, | } | \ | | "required": [ | }, | \ | | "location" | "required": ["location"] | \ | | ], | } | \ | | "type": "object" | } | \ | | } | ] | \ | | } | }' | \ | | } |``` | \ | | ] | | \ | | }' |**第一轮响应:返回工具调用指令** | \ | |``` |模型返回信息包含`id`、`call_id`、`arguments`等关键字段。 | \ | | | | \ | |**第一轮响应:返回工具调用指令** |```Bash | \ | |模型会返回`encrypted_content`、`reasoning_content`、`tool_calls`等关键字段。 |{ | \ | | | "created_at": 1766126702, | \ | |```Bash | "id": "resp_0217661267019147d8950efa0e2f7c9d9cc7a1cc971272cf4548c", | \ | |{ | "max_output_tokens": 32768, | \ | | "choices": [ | "model": "doubao-seed-2-0-lite-260215", | \ | | { | "object": "response", | \ | | "finish_reason": "tool_calls", | "output": [ | \ | | "index": 0, | { | \ | | "logprobs": null, | "id": "rs_02176612670248500000000000000000000ffffac154e10754f5c", | \ | | "message": { | "type": "reasoning", | \ | | "content": "", | "summary": [ | \ | | "reasoning_content": "北京天气查询将由我调用相关工具完成。\n", | { | \ | | | "type": "summary_text", | \ | | "encrypted_content": "djF+2EICEj3ryfEfSUdR/SmS8OeEH4znOYftL4SWDXR8uxROjx11W7rRCj5ArLwzsm7rFsO4frOdLm2p3/yWz/r0TMqrjHiaTTvRMNdV6sLdETySlb3PDgY1W+zuYuETiq3bQuxga5jKx+GpfvlDJMfJfzq/G1kDp6ryurs0rKAFIziyc4mfFSh2CzDKNcAcp5Fi5R7M2QrSYmIUJjnoB48IVUCzu4xn7bT05qheVnGO9fbs15gYK3zINUvVsp51Oq72U/ksrPZFVs2BTgNRwjmxnFNn7A==", | "text": "用户查询北京今日天气,我将调用天气工具获取相关信息。" | \ | | "role": "assistant", | | \ | | "tool_calls": [ | } | \ | | { | ], | \ | | "function": { | "status": "completed", | \ | | "arguments": " {\"location\": \"北京\"}", | "encrypted_content": "djEqHS8w8bISWDUfivQXaeCUc8ms2JcjMBO5KQMRqKhTUdYlhbFebcndgVlFJxYUOSOAXm7gNsJdTRtp47iHpps76Rp37ipRrkEHMqIIt+KyKmN/rH9tzL+7ZLI9W4LGYMOv/27Rfqp2NW5vxiF7zkI1xgxxJFp6Vo8PNQpR68T4F7bG4PekickNR3U+EFM6hBKkhnJqxqCrjubi0o/8C35IoDF998+G6hokaDhOb6EqJ5fXaSZvtQJaK4DBh4HIciMFnRqzts/xlacBHsWCWLcxUASrvj0vYIs9a+ZN9BxkLjrBy/nEOOEcmID/I2NukCDEFa7zxlOXLvdZHuslP5cvyno=" | \ | | | }, | \ | | "name": "get_weather" | { | \ | | }, | "arguments": " {\"location\": \"北京\"}", | \ | | "id": "call_wiezxeyae8jzxl3jx8nhfgb5", | | \ | | "type": "function" | "call_id": "call_t885uulopdd499rn0pioze7l", | \ | | } | "name": "get_weather", | \ | | ] | "type": "function_call", | \ | | } | "id": "fc_02176612670345400000000000000000000ffffac154e10a6753e", | \ | | } | "status": "completed" | \ | | ], | } | \ | | ... | ], | \ | | } | .... | \ | |``` | } | \ | | |``` | \ | |**第二轮请求:回传完整上下文并生成最终响应** | | \ | |下面示例是在第一轮请求的基础上,回传思考内容加密原文(**encrypted_content**)和思考内容摘要(**reasoning_content**)、工具调用结果,模型生成自然语言回答。 |**第二轮请求:回传结果并生成最终响应** | \ | | |传入上一轮 response_id、工具调用结果等信息,模型生成自然语言回答。 | \ | |```Bash | | \ | |curl https://ark.cn-beijing.volces.com/api/v3/chat/completions \ |```Bash | \ | | -H "Content-Type: application/json" \ |curl https://ark.cn-beijing.volces.com/api/v3/responses \ | \ | | -H "Authorization: Bearer $ARK_API_KEY" \ | -H "Authorization: Bearer $ARK_API_KEY" \ | \ | | -d '{ | -H "Content-Type: application/json" \ | \ | | "model": "doubao-seed-2-0-lite-260215", | -d '{ | \ | | "messages": [ | "model": "doubao-seed-2-0-lite-260215", | \ | | { | "input": [ | \ | | "role": "system", | { | \ | | "content": "你是人工智能助手。" | "type": "function_call_output", | \ | | | "call_id": "call_t885uulopdd499rn0pioze7l", | \ | | }, | "output": "5度" | \ | | { | | \ | | "role": "user", | } | \ | | "content": "今天北京天气怎么样" | ], | \ | | | "previous_response_id": "resp_0217661267019147d8950efa0e2f7c9d9cc7a1cc971272cf4548c", | \ | | }, | "thinking":{"type": "enabled"}, | \ | | { | "tools": [ | \ | | "reasoning_content": "北京天气查询将由我调用相关工具完成。\n", | { | \ | | | "type": "function", | \ | | "encrypted_content": "djF+2EICEj3ryfEfSUdR/SmS8OeEH4znOYftL4SWDXR8uxROjx11W7rRCj5ArLwzsm7rFsO4frOdLm2p3/yWz/r0TMqrjHiaTTvRMNdV6sLdETySlb3PDgY1W+zuYuETiq3bQuxga5jKx+GpfvlDJMfJfzq/G1kDp6ryurs0rKAFIziyc4mfFSh2CzDKNcAcp5Fi5R7M2QrSYmIUJjnoB48IVUCzu4xn7bT05qheVnGO9fbs15gYK3zINUvVsp51Oq72U/ksrPZFVs2BTgNRwjmxnFNn7A==", | "name": "get_weather", | \ | | "role": "assistant", | "description": "天气查询", | \ | | "tool_calls": [ | | \ | | { | "parameters": { | \ | | "function": { | "type": "object", | \ | | "arguments": " {\"location\": \"北京\"}", | "properties": { | \ | | | "location": { | \ | | "name": "get_weather" | "type": "string", | \ | | }, | "description": "地点的位置信息,例如北京、上海。" | \ | | "id": "call_wiezxeyae8jzxl3jx8nhfgb5", | | \ | | "type": "function" | } | \ | | } | }, | \ | | ] | "required": ["location"] | \ | | }, | } | \ | | { | } | \ | | "role": "tool", | ] | \ | | "tool_call_id":"call_wiezxeyae8jzxl3jx8nhfgb5", | }' | \ | | "content": "5度" |``` | \ | | | | \ | | } | | \ | | ], | | \ | | "thinking":{"type": "enabled"}, | | \ | | "tools": [ | | \ | | { | | \ | | "type": "function", | | \ | | "function": { | | \ | | "name": "get_weather", | | \ | | "description": "天气查询", | | \ | | | | \ | | "parameters": { | | \ | | "properties": { | | \ | | "location": { | | \ | | "description": "地点的位置信息,例如北京、上海。", | | \ | | | | \ | | "type": "string" | | \ | | } | | \ | | }, | | \ | | "required": [ | | \ | | "location" | | \ | | ], | | \ | | "type": "object" | | \ | | } | | \ | | } | | \ | | } | | \ | | ] | | \ | | }' | | \ | |``` | | ### 回传原始思考内容 部分模型开启深度思考后,默认输出模型原始的思考内容。以下是在工具调用场景,回传原始思考内容的示例。 |API |[Chat API](/docs/chat-api) |[Responses API](/docs/create-model-responses-api) | | --- | --- | --- | |支持模型 |* doubao-seed-2-0-lite-260428 |* doubao-seed-2-0-lite-260428 | \ | |* doubao-seed-2-0-mini-260428 |* doubao-seed-2-0-mini-260428 | \ | |* doubao-seed-2-0-pro-260215 |* doubao-seed-2-0-pro-260215 | \ | |* doubao-seed-2-0-lite-260215 |* doubao-seed-2-0-lite-260215 | \ | |* doubao-seed-2-0-mini-260215 |* doubao-seed-2-0-mini-260215 | \ | |* doubao-seed-2-0-code-preview-260215 |* doubao-seed-2-0-code-preview-260215 | \ | |* deepseek-v4-pro-260425 |* deepseek-v4-pro-260425 | \ | |* deepseek-v4-flash-ga-260731 |* deepseek-v4-flash-ga-260731 | \ | |* deepseek-v4-1-flash-261017
    * deepseek-v4-1-flash-260910
    * deepseek-v4-1-flash-economy-261017 |* deepseek-v4-1-flash-261017
    * deepseek-v4-1-flash-260910
    * deepseek-v4-1-flash-economy-261017 | \ | |* glm-5-2-260617 |* glm-5-2-260617 | |示例 |**第一轮请求:触发工具调用** |**第一轮请求:触发工具调用** | \ | | | | \ | |```Bash |```Bash | \ | |curl https://ark.cn-beijing.volces.com/api/v3/chat/completions \ |curl https://ark.cn-beijing.volces.com/api/v3/responses \ | \ | | -H "Content-Type: application/json" \ | -H "Authorization: Bearer $ARK_API_KEY" \ | \ | | -H "Authorization: Bearer $ARK_API_KEY" \ | -H "Content-Type: application/json" \ | \ | | -d '{ | -d '{ | \ | | "model": "doubao-seed-2-0-lite-260215", | "model": "doubao-seed-2-0-lite-260215", | \ | | "messages": [ | "input": [ | \ | | { | { | \ | | "role": "system", | "role": "system", | \ | | "content": "你是人工智能助手。" | "content": "你是人工智能助手." | \ | | | | \ | | }, | }, | \ | | { | { | \ | | "role": "user", | "role": "user", | \ | | "content": "今天北京天气怎么样" | "content": "今天北京天气怎么样" | \ | | | | \ | | } | } | \ | | ], | ], | \ | | "thinking":{"type": "enabled"}, | "thinking":{"type": "enabled"}, | \ | | "tools": [ | "tools": [ | \ | | { | { | \ | | "type": "function", | "type": "function", | \ | | "function": { | "name": "get_weather", | \ | | "name": "get_weather", | "description": "天气查询", | \ | | "description": "天气查询", | | \ | | | "parameters": { | \ | | "parameters": { | "type": "object", | \ | | "properties": { | "properties": { | \ | | "location": { | "location": { | \ | | "description": "地点的位置信息,例如北京、上海。", | "type": "string", | \ | | | "description": "地点的位置信息,例如北京、上海。" | \ | | "type": "string" | | \ | | } | } | \ | | }, | }, | \ | | "required": [ | "required": ["location"] | \ | | "location" | } | \ | | ], | } | \ | | "type": "object" | ] | \ | | } | }' | \ | | } |``` | \ | | } | | \ | | ] |**第一轮响应:返回工具调用指令** | \ | | }' |模型返回信息包含`id`、`call_id`、`arguments`等关键字段。 | \ | |``` | | \ | | |```Bash | \ | |**第一轮响应:返回工具调用指令** |{ | \ | |模型会返回`reasoning_content`、`tool_calls`等关键字段。 | "created_at": 1766126702, | \ | | | "id": "resp_0217661267019147d8950efa0e2f7c9d9cc7a1cc971272cf4548c", | \ | |```JSON | "max_output_tokens": 32768, | \ | |{ | "model": "doubao-seed-2-0-lite-260215", | \ | | "choices": [ | "object": "response", | \ | | { | "output": [ | \ | | "finish_reason": "tool_calls", | { | \ | | "index": 0, | "id": "rs_02176612670248500000000000000000000ffffac154e10754f5c", | \ | | "logprobs": null, | "type": "reasoning", | \ | | "message": { | "summary": [ | \ | | "content": "", | { | \ | | "reasoning_content": "用户想查询今天北京的天气,这正好符合get_weather工具的功能,需要传入location参数为北京。所以我要调用这个工具来获取天气信息。", | "type": "summary_text", | \ | | | "text": "用户问今天北京的天气怎么样,我需要调用get_weather工具,参数location是北京。按照格式要求来写函数调用。" | \ | | "role": "assistant", | | \ | | "tool_calls": [ | } | \ | | { | ], | \ | | "function": { | "status": "completed" | \ | | "arguments": " {\"location\": \"北京\"}", | }, | \ | | | { | \ | | "name": "get_weather" | "arguments": " {\"location\": \"北京\"}", | \ | | }, | | \ | | "id": "call_wiezxeyae8jzxl3jx8nhfgb5", | "call_id": "call_t885uulopdd499rn0pioze7l", | \ | | "type": "function" | "name": "get_weather", | \ | | } | "type": "function_call", | \ | | ] | "id": "fc_02176612670345400000000000000000000ffffac154e10a6753e", | \ | | } | "status": "completed" | \ | | } | } | \ | | ], | ], | \ | | ... | .... | \ | | } | } | \ | |``` |``` | \ | | | | \ | |**第二轮请求:回传完整上下文并生成最终响应** |**第二轮请求:回传结果并生成最终响应** | \ | |在第一轮请求的基础上,还需要回传思维链信息、工具调用结果,模型生成自然语言回答。 |传入上一轮 response_id、工具调用结果等信息,模型生成自然语言回答。 | \ | | | | \ | |```Bash |```Bash | \ | |curl https://ark.cn-beijing.volces.com/api/v3/chat/completions \ |curl https://ark.cn-beijing.volces.com/api/v3/responses \ | \ | | -H "Content-Type: application/json" \ | -H "Authorization: Bearer $ARK_API_KEY" \ | \ | | -H "Authorization: Bearer $ARK_API_KEY" \ | -H "Content-Type: application/json" \ | \ | | -d '{ | -d '{ | \ | | "model": "doubao-seed-2-0-lite-260215", | "model": "doubao-seed-2-0-lite-260215", | \ | | "messages": [ | "input": [ | \ | | { | { | \ | | "role": "system", | "type": "function_call_output", | \ | | "content": "你是人工智能助手。" | "call_id": "call_t885uulopdd499rn0pioze7l", | \ | | | "output": "5度" | \ | | }, | | \ | | { | } | \ | | "role": "user", | ], | \ | | "content": "今天北京天气怎么样" | "previous_response_id": "resp_0217661267019147d8950efa0e2f7c9d9cc7a1cc971272cf4548c", | \ | | | "thinking":{"type": "enabled"}, | \ | | }, | "tools": [ | \ | | { | { | \ | | "reasoning_content": "用户想查询今天北京的天气,这正好符合get_weather工具的功能,需要传入location参数为北京。所以我要调用这个工具来获取天气信息。", | "type": "function", | \ | | | "name": "get_weather", | \ | | "role": "assistant", | "description": "天气查询", | \ | | "tool_calls": [ | | \ | | { | "parameters": { | \ | | "function": { | "type": "object", | \ | | "arguments": " {\"location\": \"北京\"}", | "properties": { | \ | | | "location": { | \ | | "name": "get_weather" | "type": "string", | \ | | }, | "description": "地点的位置信息,例如北京、上海。" | \ | | "id": "call_wiezxeyae8jzxl3jx8nhfgb5", | | \ | | "type": "function" | } | \ | | } | }, | \ | | ] | "required": ["location"] | \ | | }, | } | \ | | { | } | \ | | "role": "tool", | ] | \ | | "tool_call_id":"call_wiezxeyae8jzxl3jx8nhfgb5", | }' | \ | | "content": "5度" |``` | \ | | | | \ | | } | | \ | | ], | | \ | | "thinking":{"type": "enabled"}, | | \ | | "tools": [ | | \ | | { | | \ | | "type": "function", | | \ | | "function": { | | \ | | "name": "get_weather", | | \ | | "description": "天气查询", | | \ | | | | \ | | "parameters": { | | \ | | "properties": { | | \ | | "location": { | | \ | | "description": "地点的位置信息,例如北京、上海。", | | \ | | | | \ | | "type": "string" | | \ | | } | | \ | | }, | | \ | | "required": [ | | \ | | "location" | | \ | | ], | | \ | | "type": "object" | | \ | | } | | \ | | } | | \ | | } | | \ | | ] | | \ | | }' | | \ | |``` | | # 使用说明 ## 工作原理 * 多轮对话场景 |流程图 |说明 | | --- | --- | |![](https://arkdocs.tos-cn-beijing.volces.com/flowcharts/advanced-usage/deep-thinking-01.svg) |* 在每一轮对话过程中,深度思考模型会输出思维链内容(COT)和最终回答(Answer)。 | \ | |* 在下一轮对话中,之前输出的思维链内容不会被拼接到上下文中。 | \ | |> 思维链内容展现的是模型处理问题的过程,包括将问题拆分为多个问题进行处理,生成多种回复综合得出更好回答等过程。 | * 工具调用场景 工具调用场景中开启深度思考后,为给出更详尽准确的回答,将不会直接丢弃思维链内容,历史轮次的思维链内容按需(模型自主判断)参与推理。在整个请求过程中,用户回传完整上下文即可,由服务端自行判断,是否保留思维链内容。未输入给模型的思维链内容,不会计算 token 用量。代码示例参见[回传思考内容](/docs/deep-thinking#3e8661f7)。 |流程图 |说明 | | --- | --- | |![](https://arkdocs.tos-cn-beijing.volces.com/flowcharts/advanced-usage/deep-thinking-02.svg) |* 回答问题 1 时(请求 1.1 - 1.2),模型进行多次思考 + 工具调用后给出答案,方舟会输入完整上下文包括思维链内容给模型处理。 | \ | |* 开始回答问题 2 时(请求 2.1),方舟会自行判断并删除之前上下文中的思维链,输入给模型。 | ## 减少请求超时失败 深度思考模型使用思维链输出内容,导致回复篇幅更长、速率更慢,所以极易因超时导致任务失败。尤其在非流式输出模式下,任务未完成时断开连接,未输出内容,又产生 token 用量费用。 可使用流式输出或设置更长超时时间,减少超时失败: * 使用流式输出(推荐):通过分块即时返回生成内容,可有效维持连接活性(避免因长时无响应导致的连接中断),是高效且可靠的输出方式(示例代码及说明参见[流式输出](/docs/deep-thinking#4ad2b076))。若当前应用使用非流式输出,可改造为:通过流式接口获取内容,实时拼接完整结果后再统一输出,从而显著降低请求超时失败风险。 * 调大超时时间参数:非流式输出场景下,推荐将 `timeout` 参数设置为 30 分钟以上,并根据超时触发概率进一步调整超时时间。另需注意网络链路中的 TCP Keep-Alive 设置(`tcp_keepalive_time` 参数),避免因长时间无数据传输导致连接被系统、防火墙、路由器等中断。 > **方舟 Go SDK 特殊说明**:无论是否使用流式输出,均需将 SDK 超时参数设置为 30 分钟以上。 ## 使用批量推理获得更高吞吐 当您的业务需要处理大量的数据,且对于模型返回及时性要求不高,您可使用批量推理获取最低 10B token/天的配额以及批量推理的成本降低。批量推理支持任务的方式以及类似 Chat 的接口调用方式,使用批量推理,详细说明请查看 [批量推理](/docs/batch-inference)。 ## 提示词优化建议 深度思考模型会自行分析和拆解问题(思维链),与普通模型相比,提示词侧重点有所不同。 * 提示词除了待解决问题,应该更多补充目标和场景等信息。如使用英语,用 Python 等语言要求;面向小学生、向领导汇报等阅读对象信息;完成论文写作、完成课题报告、撰写剧本等场景信息;体现我的专业性、获得领导赏识等目标信息。 * 减少或者避免对问题的拆解描述,如分步骤思考、使用示例等,这样会限制住模型的推理逻辑。 * 减少使用系统提示词,所有提示词信息直接通过用户提示词(`role: user`)来提问。 # 常见问题 * [并发 RPM 或者 TPM 额度明明有剩余为什么提示限流报错?](/docs/modelark-faq#91505308) --- # 上下文管理 Source: https://ark.volcengine.com/region:cn-beijing/docs/context-management 模型上下文(Context)包括输入信息(问题)和输出信息(回答),当触发深度思考时输出还包括思维链内容(CoT)。思维链内容展现模型处理问题的过程,包括将问题拆分为多个问题进行处理,生成多种回复综合得出更好回答的过程。在多轮对话中,上下文管理在保持话题一致性等方面非常重要,对此方舟提供了一些管理上下文的方法。 # 上下文输入 ## 手动输入上下文 [Chat API](/docs/chat-api) 发起请求,是独立无状态的,需手动管理上下文。需通过交替排列 user 消息 与 assistant 消息,让模型在请求中获取之前对话信息。 **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "messages": [ {"role": "user", "content": "深度思考模型与非深度思考模型区别"}, {"role": "assistant", "content": "推理模型主要依靠逻辑、规则或概率等进行分析、推导和判断以得出结论或决策,非推理模型则是通过模式识别、统计分析或模拟等方式来实现数据描述、分类、聚类或生成等任务而不依赖显式逻辑推理。"}, {"role": "user", "content": "我要研究深度思考模型与非深度思考模型区别的课题,怎么体现我的专业性"} ] }' ``` * 您可按需替换 Model ID。Model ID 查询见 [模型列表](/docs/model-list)。 **选项:Python** ```Python import os # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark client = Ark( # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv('ARK_API_KEY'), # Deep thinking takes longer; set a larger timeout, with 1,800 seconds or more recommended timeout=1800, ) # 创建一个对话请求 completion = client.chat.completions.create( # Replace with Model ID model = "doubao-seed-2-1-pro-260915", messages=[ {"role": "user", "content": "研究深度思考模型与非深度思考模型区别"}, {"role": "assistant", "content": "推理模型主要依靠逻辑、规则或概率等进行分析、推导和判断以得出结论或决策,非推理模型则是通过模式识别、统计分析或模拟等方式来实现数据描述、分类、聚类或生成等任务而不依赖显式逻辑推理。"}, {"role": "user", "content": "我要研究深度思考模型与非深度思考模型区别的课题,怎么体现我的专业性"}, ], ) if hasattr(completion.choices[0].message, 'reasoning_content'): print(completion.choices[0].message.reasoning_content) print(completion.choices[0].message.content) ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "time" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/chat" ) func main() { client := arkruntime.NewClientWithApiKey( //通过 os.Getenv 从环境变量中获取 ARK_API_KEY os.Getenv("ARK_API_KEY"), // The base URL for model invocation arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), //深度思考耗时更长,请设置更大的超时限制,推荐为30分钟及以上 arkruntime.WithTimeout(30*time.Minute), ) // 创建一个上下文,通常用于传递请求的上下文信息,如超时、取消等 ctx := context.Background() // 构建聊天完成请求,设置请求的模型和消息内容 req := &chat.ChatCompletionRequest{ // Replace with Model ID Model: "doubao-seed-2-1-pro-260915", Messages: []chat.ChatCompletionRequestMessage{ userMessage("研究深度思考模型与非深度思考模型区别"), assistantMessage("推理模型主要依靠逻辑、规则或概率等进行分析、推导和判断以得出结论或决策,非推理模型则是通过模式识别、统计分析或模拟等方式来实现数据描述、分类、聚类或生成等任务而不依赖显式逻辑推理。"), userMessage("我要研究深度思考模型与非深度思考模型区别的课题,怎么体现我的专业性"), }, } // 发送聊天完成请求,并将结果存储在 resp 中,将可能出现的错误存储在 err 中 resp, err := client.CreateChatCompletion(ctx, req) if err != nil { // 若出现错误,打印错误信息并终止程序 fmt.Printf("standard chat error: %v\n", err) return } // 检查是否触发深度思考,触发则打印思维链内容 if resp.Choices[0].Message.ReasoningContent.IsSet() { fmt.Println(resp.Choices[0].Message.ReasoningContent.Or("")) } // 打印聊天完成请求的响应结果 fmt.Println(resp.Choices[0].Message.Content) } func assistantMessage(content string) chat.ChatCompletionRequestMessage { return chat.ChatCompletionRequestMessage{ OneOf: chat.NewChatCompletionRequestAssistantMessageChatCompletionRequestMessageSum( chat.ChatCompletionRequestAssistantMessage{ Role: chat.ChatCompletionRequestAssistantMessageRoleAssistant, Content: chat.NewOptNilChatCompletionMessageContent(chat.NewStringChatCompletionMessageContent(content)), }, ), } } func userMessage(content string) chat.ChatCompletionRequestMessage { return chat.ChatCompletionRequestMessage{ OneOf: chat.NewChatCompletionRequestUserMessageChatCompletionRequestMessageSum( chat.ChatCompletionRequestUserMessage{ Role: chat.ChatCompletionRequestUserMessageRoleUser, Content: chat.NewOptNilChatCompletionMessageContent(chat.NewStringChatCompletionMessageContent(content)), }, ), } } ``` **选项:Java** ```Java package com.volcengine.ark.runtime; import com.volcengine.ark.runtime.models.chat.*; import com.volcengine.ark.runtime.service.ArkService; import java.time.Duration; import java.util.Arrays; import java.util.List; /** * 这是一个示例类,展示了如何使用ArkService来完成聊天功能。 */ public class ChatCompletionsExample { public static void main(String[] args) { // 从环境变量中获取API密钥 String apiKey = System.getenv("ARK_API_KEY"); // 创建ArkService实例 ArkService arkService = ArkService.builder() .apiKey(apiKey) .timeout(Duration.ofMinutes(30))// 深度思考耗时更长,请设置更大的超时限制,推荐为30分钟及以上 // The base URL for model invocation .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); // 多轮消息列表 final List messages = Arrays.asList( ChatCompletionRequestUserMessage.builder().role(ChatCompletionRequestMessageType.USER).content(ChatCompletionMessageContent.ofString("研究深度思考模型与非深度思考模型区别")).build(), ChatCompletionRequestAssistantMessage.builder().role(ChatCompletionRequestMessageType.ASSISTANT).content(ChatCompletionMessageContent.ofString("推理模型主要依靠逻辑、规则或概率等进行分析、推导和判断以得出结论或决策,非推理模型则是通过模式识别、统计分析或模拟等方式来实现数据描述、分类、聚类或生成等任务而不依赖显式逻辑推理。")).build(), ChatCompletionRequestUserMessage.builder().role(ChatCompletionRequestMessageType.USER).content(ChatCompletionMessageContent.ofString("我要研究深度思考模型与非深度思考模型区别的课题,怎么体现我的专业性")).build() ); // 创建聊天完成请求 ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder() .model("doubao-seed-2-1-pro-260915")//Replace with Model ID .messages(messages) // 设置消息列表 .build(); // 发送聊天完成请求并打印响应 try { // 获取响应并打印每个选择的消息内容 arkService.createChatCompletion(chatCompletionRequest) .getChoices() .forEach(choice -> { // 进行空值检查后打印推理内容 if (choice.getMessage().getReasoningContent() != null) { System.out.println("推理内容: " + choice.getMessage().getReasoningContent()); } else { System.out.println("推理内容为空"); } // 打印消息内容 System.out.println("消息内容: " + choice.getMessage().getContent()); }); } catch (Exception e) { System.out.println("请求失败: " + e.getMessage()); } finally { // 关闭服务执行器 arkService.shutdownExecutor(); } } } ``` **选项:OpenAI SDK** ```Python import os from openai import OpenAI client = OpenAI( # 从环境变量中读取方舟API Key api_key=os.environ.get("ARK_API_KEY"), base_url="https://ark.cn-beijing.volces.com/api/v3", # 深度思考耗时更长,避免链接超时导致失败,请设置更大的超时限制,推荐为1800 秒及以上 timeout=1800, ) completion = client.chat.completions.create( # Replace with Model ID model = "doubao-seed-2-1-pro-260915", messages=[ {"role": "user", "content": "研究深度思考模型与非深度思考模型区别"}, {"role": "assistant", "content": "推理模型主要依靠逻辑、规则或概率等进行分析、推导和判断以得出结论或决策,非推理模型则是通过模式识别、统计分析或模拟等方式来实现数据描述、分类、聚类或生成等任务而不依赖显式逻辑推理。"}, {"role": "user", "content": "我要研究深度思考模型与非深度思考模型区别的课题,怎么体现我的专业性"}, ], ) if hasattr(completion.choices[0].message, 'reasoning_content'): print(completion.choices[0].message.reasoning_content) print(completion.choices[0].message.content) ``` ## 通过 ID 输入上下文 [Responses API](/docs/create-model-responses-api) 支持更简洁方式管理上下文。默认情况下请求的输入和输出都会持久化存储,后续请求只需传入 ID 就可以引入对应请求的输入和输出。 **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "input": "Hi,讲个笑话。" }' ``` ```Bash curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "previous_response_id":"", "input": "这个笑话的笑点在哪?" }' ``` 第二次请求需将 curl 命令中的 `` 替换为上一次请求返回的 Response id。 **选项:Python** ```Python import os from arkruntime import Ark # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key = os.getenv('ARK_API_KEY') client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) # Create the first-round conversation request response = client.responses.create( model="doubao-seed-2-1-pro-260915", input="Hi,帮我讲个笑话。" ) print(response) # Create the second-round conversation request second_response = client.responses.create( model="doubao-seed-2-1-pro-260915", previous_response_id=response.id, input=[{"role": "user", "content": "这个笑话的笑点在哪?"}], ) print(second_response) ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/responses" ) func main() { client := arkruntime.NewClientWithApiKey( // Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() // Create the first-round conversation request resp, err := client.CreateResponses(ctx, &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", Input: responses.NewStringResponsesInput("Hi,讲个笑话。"), Store: responses.NewOptBool(true), }) if err != nil { fmt.Printf("response error: %v\n", err) return } fmt.Println(resp) id := resp.ID inputMessage := easyMessage(responses.MessageRoleUser, "这个笑话的笑点在哪?") fmt.Println("-----------------") // Create the second-round conversation request second_resp, second_err := client.CreateResponses(ctx, &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", PreviousResponseID: responses.NewOptString(id), Input: responses.NewInputItemArrayResponsesInput([]responses.InputItem{ inputMessage, }), }) if second_err != nil { fmt.Printf("second response error: %v\n", second_err) return } fmt.Println(second_resp) } func easyMessage(role responses.MessageRole, content string) responses.InputItem { return responses.InputItem{ OneOf: responses.NewItemEasyMessageInputItemSum( responses.ItemEasyMessage{ Role: responses.NewOptMessageRole(role), Content: responses.NewStringMessageContent(content), }, ), } } ``` **选项:Java** ```Java package com.ark.example; import com.volcengine.ark.runtime.service.ArkService; import com.volcengine.ark.runtime.models.responses.*; public class demo { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); // The base URL for model invocation ArkService arkService = ArkService.builder().apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); // Create the first-round conversation request ResponsesRequest request = ResponsesRequest.builder() .model("doubao-seed-2-1-pro-260915") .input(ResponsesInput.ofString("Hi,帮我讲个笑话。")) .build(); Response resp = arkService.createResponse(request); System.out.println(resp); // Create the second-round conversation request ResponsesRequest request2 = ResponsesRequest.builder() .model("doubao-seed-2-1-pro-260915") .previousResponseId(resp.getId()) .input(ResponsesInput.ofList(java.util.Arrays.asList(ItemEasyMessage.builder().role(MessageRole.USER).content( MessageContent.ofString("这个笑话的笑点在哪?") ).build()))) .build(); Response resp2 = arkService.createResponse(request2); System.out.println(resp2); arkService.shutdownExecutor(); } } ``` **选项:OpenAI SDK** ```Python from openai import OpenAI import os # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key = os.getenv('ARK_API_KEY') client = OpenAI( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) # Create the first-round conversation request response = client.responses.create( model="doubao-seed-2-1-pro-260915", input="Hi,帮我讲个笑话。" ) print(response) # Create the second-round conversation request second_response = client.responses.create( model="doubao-seed-2-1-pro-260915", previous_response_id=response.id, input=[{"role": "user", "content": "这个笑话的笑点在哪?"}], ) print(second_response) ``` # 上下文长度控制 输入长内容,或对话轮数增加,需同时考虑模型输出长度和上下文窗口限制。模型输入和输出会进行计量,达到长度限制会截断或报错。合理控制模型输出长度,平衡业务效果、成本与稳定性: * 减少触发限流(TPM 限制、突发流量限制等),保障服务稳定性。 * 精确控制 token 用量,平衡成本与质量。 * 控制推理耗时,提升用户交互体验。 同时,平台支持对模型输出(思维链、回答)长度控制,来控制 token 用量。核心规格及参数,如下图: ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/1d7c7f33e7b9451893989339e7e7017c~tplv-goo7wpa0wc-image.image) > 不同模型支持的上下文窗口、最大输入、最大思维链长度均有差异,可在 [模型列表](/docs/model-list) 查询。 ## 控制输出(回答+思维链)长度 [Chat API](/docs/chat-api) 使用 **max_completion_tokens** 字段,控制模型输出长度,当模型输出达到配置值时,模型停止推理。 > [Responses API](/docs/create-model-responses-api) 使用 max_output_tokens 字段 控制模型输出长度,详细信息参见 [设置最大输出长度](/docs/responses-api-deep-thinking#1460ba95)。 支持的模型:250528及之后版本的大语言模型,如无特殊说明,默认支持该字段。方舟平台大语言模型列表,请参见[文本生成能力](/docs/model-list#32e9e053)。 > doubao-seed-translation-250915 模型不支持该字段。 **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "messages": [ { "role": "user", "content": "你好" } ], "max_completion_tokens": 1024 }' ``` * 您可按需替换 Model ID。Model ID 查询见 [模型列表](/docs/model-list)。 **选项:Python** ```Python import os # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark client = Ark( # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv('ARK_API_KEY'), # Deep thinking takes longer; set a larger timeout, with 1,800 seconds or more recommended timeout=1800, ) # 创建一个对话请求 completion = client.chat.completions.create( # Replace with Model ID model = "doubao-seed-2-1-pro-260915", messages=[ {"role": "system", "content": "你是 AI 人工智能助手"}, {"role": "user", "content": "常见的十字花科植物有哪些?"}, ], # 设置模型最大输出长度为 1024 token,按需调整 max_completion_tokens = 1024, ) print(completion.choices[0].message.content) ``` **选项:Go** ```Go package main import ( "time" "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/chat" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), // The base URL for model invocation arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), //深度思考耗时更长,请设置更大的超时限制,推荐为30分钟及以上 arkruntime.WithTimeout(30*time.Minute), ) ctx := context.Background() fmt.Println("----- standard request -----") req := &chat.ChatCompletionRequest{ // Replace with Model ID Model: "doubao-seed-2-1-pro-260915", Messages: []chat.ChatCompletionRequestMessage{ systemMessage("你是 AI 人工智能助手"), userMessage("常见的十字花科植物有哪些?"), }, MaxCompletionTokens: chat.NewOptInt32(int32(1024)), // 设置最大输出长度为 1024 token } resp, err := client.CreateChatCompletion(ctx, req) if err != nil { fmt.Printf("standard chat error: %v\n", err) return } fmt.Println(resp.Choices[0].Message.Content) } func systemMessage(content string) chat.ChatCompletionRequestMessage { return chat.ChatCompletionRequestMessage{ OneOf: chat.NewChatCompletionRequestSystemMessageChatCompletionRequestMessageSum( chat.ChatCompletionRequestSystemMessage{ Role: chat.ChatCompletionRequestSystemMessageRoleSystem, Content: chat.NewStringChatCompletionMessageContent(content), }, ), } } func userMessage(content string) chat.ChatCompletionRequestMessage { return chat.ChatCompletionRequestMessage{ OneOf: chat.NewChatCompletionRequestUserMessageChatCompletionRequestMessageSum( chat.ChatCompletionRequestUserMessage{ Role: chat.ChatCompletionRequestUserMessageRoleUser, Content: chat.NewOptNilChatCompletionMessageContent(chat.NewStringChatCompletionMessageContent(content)), }, ), } } ``` **选项:Java** ```Java package com.volcengine.ark.runtime; import com.volcengine.ark.runtime.models.chat.*; import com.volcengine.ark.runtime.service.ArkService; import java.util.ArrayList; import java.util.List; import java.time.Duration; public class ChatCompletionsExample { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); // 创建ArkService实例 ArkService arkService = ArkService.builder() .apiKey(apiKey) .timeout(Duration.ofMinutes(30))// 深度思考耗时更长,请设置更大的超时限制,推荐为30分钟及以上 // The base URL for model invocation .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); System.out.println("\n----- standard request -----"); final List messages = new ArrayList<>(); final ChatCompletionRequestMessage systemMessage = ChatCompletionRequestSystemMessage.builder().role(ChatCompletionRequestMessageType.SYSTEM).content(ChatCompletionMessageContent.ofString("你是 AI 人工智能助手")).build(); final ChatCompletionRequestMessage userMessage = ChatCompletionRequestUserMessage.builder().role(ChatCompletionRequestMessageType.USER).content(ChatCompletionMessageContent.ofString("常见的十字花科植物有哪些?")).build(); messages.add(systemMessage); messages.add(userMessage); ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder() .model("doubao-seed-2-1-pro-260915")//Replace with Model ID .messages(messages) .maxCompletionTokens(1024)// 设置最大输出长度为 1024 token .build(); arkService.createChatCompletion(chatCompletionRequest).getChoices().forEach(choice -> System.out.println(choice.getMessage().getContent())); // shutdown service arkService.shutdownExecutor(); } } ``` > **说明** > > * **max_tokens**、**max_completion_tokens** 不可同时设置,会直接报错。 ## 控制回答长度 [Chat API](/docs/chat-api) 可通过设置 **max_tokens** 字段,控制模型回答长度。当回答长度达到配置值时,模型停止推理。 > **注意** > > DeepSeek-V4.1-flash 模型`max_tokens`:控制模型回答和模型思维链内容长度,超出长度后不报错,默认值 128k。 **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "messages": [ { "role": "user", "content": "你好" } ], "max_tokens": 1024 }' ``` * 按需替换 Model ID,查询 Model ID 请参见 [模型列表](/docs/model-list)。 **选项:Python** ```Python import os # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark # 初始化Ark客户端 client = Ark( # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv('ARK_API_KEY'), ) completion = client.chat.completions.create( # Replace with Model ID model = "doubao-seed-2-1-pro-260915", messages=[ {"role": "system", "content": "你是 AI 人工智能助手"}, {"role": "user", "content": "常见的十字花科植物有哪些?"}, ], # 设置模型最大输出长度为 1024 token,您可按需进行调整 max_tokens=1024, ) print(completion.choices[0].message.content) ``` **选项:Go** ```Go package main import ( "context" "fmt" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/chat" "os" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), // The base URL for model invocation arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() fmt.Println("----- standard request -----") req := &chat.ChatCompletionRequest{ // Replace with Model ID Model: "doubao-seed-2-1-pro-260915", Messages: []chat.ChatCompletionRequestMessage{ systemMessage("你是 AI 人工智能助手"), userMessage("常见的十字花科植物有哪些?"), }, MaxTokens: chat.NewOptInt32(1024), } resp, err := client.CreateChatCompletion(ctx, req) if err != nil { fmt.Printf("standard chat error: %v\n", err) return } fmt.Println(resp.Choices[0].Message.Content) } func systemMessage(content string) chat.ChatCompletionRequestMessage { return chat.ChatCompletionRequestMessage{ OneOf: chat.NewChatCompletionRequestSystemMessageChatCompletionRequestMessageSum( chat.ChatCompletionRequestSystemMessage{ Role: chat.ChatCompletionRequestSystemMessageRoleSystem, Content: chat.NewStringChatCompletionMessageContent(content), }, ), } } func userMessage(content string) chat.ChatCompletionRequestMessage { return chat.ChatCompletionRequestMessage{ OneOf: chat.NewChatCompletionRequestUserMessageChatCompletionRequestMessageSum( chat.ChatCompletionRequestUserMessage{ Role: chat.ChatCompletionRequestUserMessageRoleUser, Content: chat.NewOptNilChatCompletionMessageContent(chat.NewStringChatCompletionMessageContent(content)), }, ), } } ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.chat.*; import com.volcengine.ark.runtime.service.ArkService; import java.util.ArrayList; import java.util.List; public class ChatCompletionsExample { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); // The base URL for model invocation ArkService service = ArkService.builder().apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); System.out.println("----- standard request -----"); final List messages = new ArrayList<>(); final ChatCompletionRequestMessage systemMessage = ChatCompletionRequestSystemMessage.builder().role(ChatCompletionRequestMessageType.SYSTEM).content(ChatCompletionMessageContent.ofString("你是 AI 人工智能助手")).build(); final ChatCompletionRequestMessage userMessage = ChatCompletionRequestUserMessage.builder().role(ChatCompletionRequestMessageType.USER).content(ChatCompletionMessageContent.ofString("常见的十字花科植物有哪些?")).build(); messages.add(systemMessage); messages.add(userMessage); ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder() .model("doubao-seed-2-1-pro-260915")//Replace with Model ID .messages(messages) .maxTokens(1024)// 设置最大输出长度为 1024 token .build(); service.createChatCompletion(chatCompletionRequest).getChoices().forEach(choice -> System.out.println(choice.getMessage().getContent())); // shutdown service service.shutdownExecutor(); } } ``` > **说明** > > * **max_tokens**、**max_completion_tokens** 不可同时设置,会直接报错。 > * [Responses API](/docs/create-model-responses-api) 不支持 **max_tokens** 字段。 ## 控制思维链长度 设置 **reasoning_effort** 调节深度思考的程度,间接控制思维链内容长度。当前提供 7 档: * `none`:关闭思考。 * `minimal`:关闭思考,直接回答。 * `low`:轻量思考,侧重快速响应。 * `medium`:均衡模式,兼顾速度与深度。 * `high`:深度分析,处理复杂问题。 * `xhigh`:更高强度思考。 * `max`:最高强度思考,适配高难度推理任务。 与 **thinking.type** 关系: * **thinking.type**取值为`enabled`:支持配置**reasoning_effort**。当**reasoning_effort**取值为`minimal`时,则关闭思考,直接回答。 * **thinking.type**取值为`disabled`:**reasoning_effort**仅支持取值`minimal`。当**reasoning_effort**取值为其他取值时会报错。 **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "messages": [ { "role": "user", "content": [ { "image_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/view.jpeg" }, "type": "image_url" }, { "text": "图片主要讲了什么?", "type": "text" } ] } ], "thinking":{"type":"enabled"}, "reasoning_effort": "low" }' ``` **选项:Python** ```Python import os # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark client = Ark( # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv('ARK_API_KEY'), # Deep thinking takes longer; set a larger timeout, with 1,800 seconds or more recommended timeout=1800, ) completion = client.chat.completions.create( # Replace with Model ID . model = "doubao-seed-2-1-pro-260915", messages=[ { "role": "user", "content": [ {"type": "image_url","image_url": {"url": "https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/view.jpeg"}}, {"type": "text", "text": "图片主要讲了什么?"}, ], } ], thinking={"type":"enabled"}, reasoning_effort="low" ) print(completion.choices[0]) ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/chat" ) func main() { client := arkruntime.NewClientWithApiKey( //通过 os.Getenv 从环境变量中获取 ARK_API_KEY os.Getenv("ARK_API_KEY"), // The base URL for model invocation . arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) // 创建一个上下文,通常用于传递请求的上下文信息,如超时、取消等 ctx := context.Background() contentParts := []chat.ChatCompletionContentPart{ chat.ChatCompletionContentPart{OneOf: chat.NewChatCompletionContentPartImageChatCompletionContentPartSum(chat.ChatCompletionContentPartImage{Type: chat.ChatCompletionContentPartImageTypeImageURL, ImageURL: chat.NewChatCompletionContentPartImageImageUrlChatCompletionContentPartImageImageURL(chat.ChatCompletionContentPartImageImageUrl{URL: chat.NewOptString("https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/view.jpeg")})})}, chat.ChatCompletionContentPart{OneOf: chat.NewChatCompletionContentPartTextChatCompletionContentPartSum(chat.ChatCompletionContentPartText{Type: chat.ChatCompletionContentPartTextTypeText, Text: "图片主要讲了什么?"})}, } effort := chat.ReasoningEffortLow req := &chat.ChatCompletionRequest{ // Replace with Model ID Model: "doubao-seed-2-1-pro-260915", Messages: []chat.ChatCompletionRequestMessage{ chat.ChatCompletionRequestMessage{OneOf: chat.NewChatCompletionRequestUserMessageChatCompletionRequestMessageSum(chat.ChatCompletionRequestUserMessage{Role: chat.ChatCompletionRequestUserMessageRoleUser, Content: chat.NewOptNilChatCompletionMessageContent(chat.NewChatCompletionContentPartArrayChatCompletionMessageContent(contentParts))})}, }, Thinking: chat.NewOptThinking(chat.Thinking{Type: chat.NewOptThinkingMode(chat.ThinkingModeEnabled)}), ReasoningEffort: chat.NewOptReasoningEffort(effort), } // 发送聊天完成请求,并将结果存储在 resp 中,将可能出现的错误存储在 err 中 resp, err := client.CreateChatCompletion(ctx, req) if err != nil { // 若出现错误,打印错误信息并终止程序 fmt.Printf("standard chat error: %v\n", err) return } // 打印聊天完成请求的响应结果 fmt.Println(resp.Choices[0].Message.Content) } ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.chat.*; import com.volcengine.ark.runtime.models.chat.ChatCompletionContentPart.*; import com.volcengine.ark.runtime.service.ArkService; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; public class MultiImageSample { static String apiKey = System.getenv("ARK_API_KEY"); static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); static Dispatcher dispatcher = new Dispatcher(); static ArkService arkService = ArkService.builder() .dispatcher(dispatcher) .connectionPool(connectionPool) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation . .apiKey(apiKey) .build(); public static void main(String[] args) throws Exception { List messagesForReqList = new ArrayList<>(); // 构建消息内容 List contentParts = new ArrayList<>(); // 第一张图片部分使用builder模式 contentParts.add(ChatCompletionContentPartImage.builder() .type(ChatCompletionContentPartType.IMAGE_URL) .imageUrl(ChatCompletionContentPartImageImageUrl2.ofChatCompletionContentPartImageImageUrl(ChatCompletionContentPartImageImageUrl.builder().url("https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/view.jpeg").build())) .build()); contentParts.add(ChatCompletionContentPartText.builder() .type(ChatCompletionContentPartType.TEXT) .text("图片主要讲了什么?") .build()); messagesForReqList.add(ChatCompletionRequestUserMessage.builder() .role(ChatCompletionRequestMessageType.USER) .content(ChatCompletionMessageContent.ofList(contentParts)) .build()); ChatCompletionRequest req = ChatCompletionRequest.builder() .model("doubao-seed-2-1-pro-260915") //Replace with Model ID . .messages(messagesForReqList) .thinking(Thinking.builder().type(ThinkingMode.ENABLED).build()) .reasoningEffort(ReasoningEffort.LOW) .build(); arkService.createChatCompletion(req) .getChoices() .forEach(choice -> System.out.println(choice.getMessage().getContent())); // shutdown service after all requests are finished arkService.shutdownExecutor(); } } ``` **选项:OpenAI SDK** ```Python import os from openai import OpenAI client = OpenAI( # The base URL for model invocation . base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv('ARK_API_KEY'), ) completion = client.chat.completions.create( # Replace with Model ID . model = "doubao-seed-2-1-pro-260915", messages=[ { "role": "user", "content": [ {"type": "image_url","image_url": {"url": "https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/view.jpeg"}}, {"type": "text", "text": "图片主要讲了什么?"}, ], } ], extra_body={"thinking":{"type":"enabled"}}, reasoning_effort="low" ) print(completion.choices[0]) ``` 完整代码及使用,请参见 [调节思考长度](/docs/responses-api-deep-thinking#dc4c1547)(Responses API)、[调节思考长度](/docs/deep-thinking#fc5eac89)(ChatCompletion API)。 # 上下文传递逻辑 ## 多轮对话场景 |流程图 |说明 | |---|---| |![](https://arkdocs.tos-cn-beijing.volces.com/flowcharts/advanced-usage/context-management-02.svg) |* 在每一轮对话过程中,深度思考模型会输出思维链内容(CoT)和最终回答(Answer)。 | \ | |* 在下一轮对话中,之前输出的思维链内容不会被拼接到上下文中。 | \ | |> 思维链内容展现的是模型处理问题的过程,包括将问题拆分为多个问题进行处理,生成多种回复综合得出更好回答等过程。 | ## 工具调用场景 针对工具调用场景优化了深度思考的执行逻辑,平台会自主判断是否将思维链内容输入给模型,参与后续轮次的推理,保障结果输出连贯、准确、可解释。 |流程图 |说明 | |---|---| |![](https://arkdocs.tos-cn-beijing.volces.com/flowcharts/advanced-usage/context-management-03.svg) |* 回答问题 1 时(请求 1.1 - 1.2),模型进行多次思考 + 工具调用后给出答案,方舟会输入完整上下文包括思维链内容给模型处理。 | \ | |* 开始回答问题2时(请求 2.1),方舟会自行判断并删除之前上下文中的思维链,输入给模型。 | > **说明** > > 推荐在 Responses API 中使用 previous_response_id,平台自动保存历史对话的上下文,并在多轮交互中回传给推理服务。 请求示例如下: **选项:Chat API** **第一轮请求:触发工具调用** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seed-2-0-lite-260215", "messages": [ { "role": "system", "content": "你是人工智能助手。" }, { "role": "user", "content": "今天北京天气怎么样" } ], "tools": [ { "type": "function", "function": { "name": "get_weather", "description": "天气查询", "parameters": { "properties": { "location": { "description": "地点的位置信息,例如北京、上海。", "type": "string" } }, "required": [ "location" ], "type": "object" } } } ] }' ``` **第一轮响应:返回工具调用指令** 模型会返回`reasoning_content`、`tool_calls`等关键字段。 ``` { "choices": [ { "finish_reason": "tool_calls", "index": 0, "logprobs": null, "message": { "content": "", "reasoning_content": "用户问今天北京天气怎么样,我需要调用get_weather工具,参数location填北京。检查一下,参数是必填的location,已经有了,所以直接调用工具就行。", "role": "assistant", "tool_calls": [ { "function": { "arguments": " {\"location\": \"北京\"}", "name": "get_weather" }, "id": "call_wiezxeyae8jzxl3jx8nhfgb5", "type": "function" } ] } } ], ... } ``` **第二轮请求:回传完整上下文并生成最终响应** 第二轮请求还需要回传思维链信息、工具调用结果,模型生成回答。 ```Bash curl https://ark.cn-beijing.volces.com/api/v3/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seed-2-0-lite-260215", "messages": [ { "role": "system", "content": "你是人工智能助手。" }, { "role": "user", "content": "今天北京天气怎么样" }, { "role": "assistant", "reasoning_content": "用户问今天北京天气怎么样,我需要调用get_weather工具,参数location填北京。检查一下,参数是必填的location,已经有了,所以直接调用工具就行。", "tool_calls": [ { "function": { "arguments": " {\"location\": \"北京\"}", "name": "get_weather" }, "id": "call_wiezxeyae8jzxl3jx8nhfgb5", "type": "function" } ] }, { "role": "tool", "tool_call_id":"call_wiezxeyae8jzxl3jx8nhfgb5", "content": "5度" } ], "tools": [ { "type": "function", "function": { "name": "get_weather", "description": "天气查询", "parameters": { "properties": { "location": { "description": "地点的位置信息,例如北京、上海。", "type": "string" } }, "required": [ "location" ], "type": "object" } } } ] }' ``` **选项:Responses API** **第一轮请求:触发工具调用** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "doubao-seed-2-0-lite-260215", "input": [ { "role": "system", "content": "你是人工智能助手." }, { "role": "user", "content": "今天北京天气怎么样" } ], "thinking":{"type": "enabled"}, "tools": [ { "type": "function", "name": "get_weather", "description": "天气查询", "parameters": { "type": "object", "properties": { "location": { "type": "string", "description": "地点的位置信息,例如北京、上海。" } }, "required": ["location"] } } ] }' ``` **第一轮响应:返回工具调用指令** 模型返回信息包含`id`、`call_id`、`arguments`等关键字段。 ``` { "created_at": 1766126702, "id": "resp_0217661267019147d8950efa0e2f7c9d9cc7a1cc971272cf4548c", "max_output_tokens": 32768, "model": "doubao-seed-2-0-lite-260215", "object": "response", "output": [ { "id": "rs_02176612670248500000000000000000000ffffac154e10754f5c", "type": "reasoning", "summary": [ { "type": "summary_text", "text": "用户问今天北京的天气怎么样,我需要调用get_weather工具,参数location是北京。按照格式要求来写函数调用。" } ], "status": "completed" }, { "arguments": " {\"location\": \"北京\"}", "call_id": "call_t885uulopdd499rn0pioze7l", "name": "get_weather", "type": "function_call", "id": "fc_02176612670345400000000000000000000ffffac154e10a6753e", "status": "completed" } ], .... } ``` **第二轮请求:回传结果并生成最终响应** 传入上一轮 response_id、工具调用结果等信息,模型生成自然语言回答。 ```Bash curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "doubao-seed-2-0-lite-260215", "input": [ { "type": "function_call_output", "call_id": "call_t885uulopdd499rn0pioze7l", "output": "5度" } ], "previous_response_id": "resp_0217661267019147d8950efa0e2f7c9d9cc7a1cc971272cf4548c", "thinking":{"type": "enabled"}, "tools": [ { "type": "function", "name": "get_weather", "description": "天气查询", "parameters": { "type": "object", "properties": { "location": { "type": "string", "description": "地点的位置信息,例如北京、上海。" } }, "required": ["location"] } } ] }' ``` # 长度限制生效逻辑 模型输出的组成如下公式,模型的输出 = 模型的回答 + 模型的思维链(如有) * **max_tokens**:控制模型的回答长度,默认值 4096。如果触发长度限制,模型停止回答,并在返回结构体的 **finish_reason** 字段为 `length`。 * **max_completion_tokens**:控制模型的回答、模型思维链总长度,如触发限制,模型停止回答,并在返回结构体的 **finish_reason** 字段为 `length`。如配置了 **max_completion_tokens** ,max_tokens默认值会失效,常用于超长文本输出或者控制模型返回长度。 ## 仅配置 max_tokens(默认逻辑) 下面是各个对象的长度限制说明。 | | | | | |对象 |关键参数 |说明 |可否配置 | |---|---|---|---| | | | | | |问题 |最大输入长度 | `上下文窗口 - 思维链窗口`,与回答共享配额。 |模型规格,不可配置 | \ | | |> 可理解为问答配额。 | | |思维链 |思维链窗口 |独占,不共享,即单次请求如有未使用的配额也不共享给问题及回答。 |模型规格,不可配置 | |回答 |最大回答长度 |最大回答长度,通过 **max_tokens** 参数配置。 |API字段,可配置 | \ | | |另外随着输入长度增加,回答配额也会受 **最大输入长度(问答配额)** 剩余配额影响。 | | \ | | |回答配额 | | \ | | |=`min(最大回答长度, 最大输入长度-实际输入长度)` | | \ | | |=`min(最大回答长度, 上下文窗口-思维链窗口-实际输入长度)` | | |^^| |^^| | \ | |最大输入长度 | |模型规格,不可配置 | 内容截断逻辑举例:模型A属性如下,上下文窗口 96k,思维链窗口 32k,最大输入长度(问答配额) 64k,配置最大回答长度 16k。 * 当用户输入的问题 56k,模型输出思维链16k,模型输出的回答达到8k时,`问题+回答 = 56k+8k = 64k`,触发**最大输入长度(问答配额)** 限制,模型停止推理。 * 当用户输入的问题 22k,模型输出思维链16k,模型输出的回答达到16k时,触发**最大回答长度**限制,模型停止推理。 * 当用户输入的问题 22k,模型输出思维链32k,触发**最大思维链长度**限制,模型停止推理。 ## 仅配置 **max_completion_tokens** | | | | | |影响/控制对象 |关键参数 |说明 |可否配置 | |---|---|---|---| | | | | | |问题 |最大输入长度 |与回答共享配额,即未使用配额共享给回答内容 |模型规格,不可配置 | |思维链 |最大输出长度 |与回答共享配额,即未使用的配额共享给回答。 |API字段,可配置 | | | | | | |^^| | | | \ | |思维链窗口 |模型能够输出的最大思维链长度。 |模型规格,不可配置 | | | | | | |回答 |最大输出长度 |与思维链共享配额,即输出长度不可超过`最大输出长度-已输出的思维链内容长度` |API字段,可配置 | 内容截断逻辑举例:模型A属性如下,上下文窗口 96k,最大输入长度 64k,最大思维链长度 32k。配置最大输出长度(**max_completion_tokens**) 32k 后,最大回答长度(**max_tokens**)默认值(`4096`)限制失效: * 当用户输入的内容长度 72k,触发**最大输入长度**限制,直接报错。 * 当模型输出的内容超过 32k,触发 **最大思维链长度** 限制,模型停止推理。 * 当用户输入的问题长度 26k,模型输出的思维链长度 16k,模型输出的回答长度达到 16k 时,`思维链长度+回答长度=16k+16k=32k`,触发**最大输出长度** 限制,模型停止推理。 ## --- # 流式输出 Source: https://ark.volcengine.com/region:cn-beijing/docs/streaming-output 默认情况下,方舟 API 会在生成全部内容后,再通过单次 HTTP 响应返回结果。如果输出长内容,等待时间会较长。流式响应模式下,模型会持续发送已生成的数据片段,你可实时看到中间输出过程内容,方便立即开始处理或展示部分结果。 # 效果与优势 |预览 |优势 | |---|---| |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/0b0ed47ec1b94b20a4f4966aa80130e6) |* **改善等待体验**:无需等待完整内容生成完毕,可立即处理过程内容。 | \ | |* **实时过程反馈**:多轮交互场景,实时了解任务当前的处理阶段。 | \ | |* **更高的容错性**:中途出错,也能获取到已生成内容,避免非流式输出失败无返回的情况。 | \ | |* **简化超时管理**:保持客户端与服务端的连接状态,避免复杂任务耗时过长而连接超时。 | # 使用说明 ## 启用流式 通过配置 **stream** 为 `true`,来启用流式输出。 ## 示例代码 * Chat API 示例代码: **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "messages": [ { "role": "user", "content": "常见的十字花科植物有哪些?" } ], "stream": true }' ``` **选项:Python** ```Python import os # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark client = Ark( # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv('ARK_API_KEY'), ) completion = client.chat.completions.create( # Replace with Model ID model = "doubao-seed-2-1-pro-260915", messages=[ {"role": "user", "content": "常见的十字花科植物有哪些?"}, ], stream=True, ) # Ensure the connection is closed automatically to prevent connection leaks. with completion: for chunk in completion: if chunk.choices[0].delta.content is not None: print(chunk.choices[0].delta.content, end="") ``` > **说明** > > `with completion `:当 with 代码块内出现异常时,会自动调用对象的 __exit__() 方法进行清理工作。当设置了max_tokens 等中断条件时,可避免socket层数据载满最终程序卡住。 **选项:Go** ```Go package main import ( "context" "fmt" "io" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/chat" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), // The base URL for model invocation arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() fmt.Println("----- standard request -----") req := &chat.ChatCompletionRequest{ // Replace with Model ID Model: "doubao-seed-2-1-pro-260915", Messages: []chat.ChatCompletionRequestMessage{ userMessage("常见的十字花科植物有哪些?"), }, Stream: chat.NewOptBool(true), } // 调用 CreateChatCompletionStream 方法,而不要使用非流式调用的 CreateChatCompletion 方法,否则将无法获取流式响应。 resp, err := client.CreateChatCompletionStream(ctx, req) if err != nil { fmt.Printf("standard chat error: %v", err) return } defer resp.Close() for { chunk, err := resp.Recv() if err == io.EOF { break } if err != nil { fmt.Printf("stream error: %v", err) break } fmt.Print(chunk.Choices[0].Delta.Content.Or("")) } fmt.Println() } func userMessage(content string) chat.ChatCompletionRequestMessage { return chat.ChatCompletionRequestMessage{ OneOf: chat.NewChatCompletionRequestUserMessageChatCompletionRequestMessageSum( chat.ChatCompletionRequestUserMessage{ Role: chat.ChatCompletionRequestUserMessageRoleUser, Content: chat.NewOptNilChatCompletionMessageContent(chat.NewStringChatCompletionMessageContent(content)), }, ), } } ``` **选项:Java** ```Java package com.volcengine.ark.runtime; import com.volcengine.ark.runtime.models.chat.*; import com.volcengine.ark.runtime.service.ArkService; import java.util.ArrayList; import java.util.List; public class ChatCompletionsExample { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); // The base URL for model invocation ArkService service = ArkService.builder().apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); final List messages = new ArrayList<>(); final ChatCompletionRequestMessage userMessage = ChatCompletionRequestUserMessage.builder().role(ChatCompletionRequestMessageType.USER).content(ChatCompletionMessageContent.ofString("常见的十字花科植物有哪些?")).build(); messages.add(userMessage); ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder() .model("doubao-seed-2-1-pro-260915")//Replace with Model ID .messages(messages) .stream(true) .thinking(Thinking.builder().type(ThinkingMode.DISABLED).build()) .build(); service.streamChatCompletion(chatCompletionRequest) .doOnError(Throwable::printStackTrace) // 处理错误 .blockingForEach(response -> { if (response.getChoices() != null && !response.getChoices().isEmpty()) { String content = String.valueOf(response.getChoices().get(0).getDelta().getContent()); if (content != null) { System.out.print(content); // 注意用print而非println,保持内容连续 } } }); // shutdown service service.shutdownExecutor(); } } ``` **选项:OpenAI SDK** ```Python import os from openai import OpenAI client = OpenAI( # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.environ.get("ARK_API_KEY"), base_url="https://ark.cn-beijing.volces.com/api/v3", ) completion = client.chat.completions.create( # Replace with Model ID model = "doubao-seed-2-1-pro-260915", messages=[ {"role": "user", "content": "常见的十字花科植物有哪些?"}, ], stream=True, ) # Ensure the connection is closed automatically to prevent connection leaks. with completion: for chunk in completion: if chunk.choices[0].delta.content is not None: print(chunk.choices[0].delta.content, end="") ``` * Responses API 示例代码: **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "input": "常见的十字花科植物有哪些?", "stream": true }' ``` **选项:Python** ```Python import os from arkruntime import Ark from arkruntime.types.responses.response_completed_event import ResponseCompletedEvent from arkruntime.types.responses.response_reasoning_summary_text_delta_event import ResponseReasoningSummaryTextDeltaEvent from arkruntime.types.responses.response_output_item_added_event import ResponseOutputItemAddedEvent from arkruntime.types.responses.response_text_delta_event import ResponseTextDeltaEvent from arkruntime.types.responses.response_text_done_event import ResponseTextDoneEvent # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key = os.getenv('ARK_API_KEY') client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) # Create a request response = client.responses.create( model="doubao-seed-2-1-pro-260915", input="常见的十字花科植物有哪些?", stream=True ) for event in response: if isinstance(event, ResponseReasoningSummaryTextDeltaEvent): print(event.delta, end="") if isinstance(event, ResponseOutputItemAddedEvent): print("\noutPutItem " + event.type + " start:") if isinstance(event, ResponseTextDeltaEvent): print(event.delta,end="") if isinstance(event, ResponseTextDoneEvent): print("\noutPutTextDone.") if isinstance(event, ResponseCompletedEvent): print("Response Completed. Usage = " + event.response.usage.model_dump_json()) ``` **选项:Go** ```Go package main import ( "context" "fmt" "io" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/responses" ) func main() { client := arkruntime.NewClientWithApiKey( // Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() resp, err := client.CreateResponsesStream(ctx, &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", Input: responses.NewStringResponsesInput("常见的十字花科植物有哪些?"), }) if err != nil { fmt.Printf("stream error: %v", err) return } for { event, err := resp.Recv() if err == io.EOF { break } if err != nil { fmt.Printf("stream error: %v", err) return } handleEvent(event) } } func handleEvent(event *responses.ResponseStreamEvent) { switch event.OneOf.Type { case responses.ResponseReasoningSummaryTextDeltaEventResponseStreamEventSum: print(event.OneOf.ResponseReasoningSummaryTextDeltaEvent.Delta.Or("")) case responses.ResponseReasoningSummaryTextDoneEventResponseStreamEventSum: fmt.Printf("\nAggregated reasoning text: %s\n", event.OneOf.ResponseReasoningSummaryTextDoneEvent.Text.Or("")) case responses.ResponseTextDeltaEventResponseStreamEventSum: print(event.OneOf.ResponseTextDeltaEvent.Delta.Or("")) case responses.ResponseTextDoneEventResponseStreamEventSum: fmt.Printf("\nAggregated output text: %s\n", event.OneOf.ResponseTextDoneEvent.Text.Or("")) } } ``` **选项:Java** ```Java package com.ark.example; import com.volcengine.ark.runtime.service.ArkService; import com.volcengine.ark.runtime.models.responses.*; public class demo { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); // The base URL for model invocation ArkService arkService = ArkService.builder().apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); ResponsesRequest request = ResponsesRequest.builder() .model("doubao-seed-2-1-pro-260915") .stream(true) .input(ResponsesInput.ofString("常见的十字花科植物有哪些?")) .build(); arkService.streamResponse(request) .doOnError(Throwable::printStackTrace) .blockingForEach(event -> { if (event instanceof ResponseReasoningSummaryTextDeltaEvent) { System.out.print(((ResponseReasoningSummaryTextDeltaEvent) event).getDelta()); } if (event instanceof ResponseOutputItemAddedEvent) { System.out.println("OutputItem " + (((ResponseOutputItemAddedEvent) event).getItem().getType()) + " Start: "); } if (event instanceof ResponseTextDeltaEvent) { System.out.print(((ResponseTextDeltaEvent) event).getDelta()); } if (event instanceof ResponseTextDoneEvent) { System.out.println("OutputText End."); } if (event instanceof ResponseOutputItemDoneEvent) { System.out.println("OutputItem " + ((ResponseOutputItemDoneEvent) event).getItem().getType() + " End."); } if (event instanceof ResponseFunctionCallArgumentsDoneEvent) { System.out.println("FunctionCall Arguments: " + ((ResponseFunctionCallArgumentsDoneEvent) event).getArguments()); } if (event instanceof ResponseCompletedEvent) { System.out.println("Response Completed. Usage = " + ((ResponseCompletedEvent) event).getResponse().getUsage()); } }); arkService.shutdownExecutor(); } } ``` **选项:OpenAI SDK** ```Python import os from openai import OpenAI # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key = os.getenv('ARK_API_KEY') client = OpenAI( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) # Create a request response = client.responses.create( model="doubao-seed-2-1-pro-260915", input="常见的十字花科植物有哪些?", stream=True ) for event in response: if event.type == "response.reasoning_summary_text.delta": print(event.delta, end="") if event.type == "response.output_item.added": print("\noutPutItem " + event.type + " start:") if event.type == "response.output_text.delta": print(event.delta,end="") if event.type == "response.output_item.done": print("\noutPutTextDone.") if event.type == "response.completed": print("\nResponse Completed. Usage = " + event.response.usage.model_dump_json()) ``` ## 返回示例 流式响应基于**Server-Sent Events (SSE)** 协议实现,其核心是服务端通过HTTP长连接持续向客户端推送数据片段。每个数据片段(Chunk)由**字段行**组成。包括模型深度思考内容片段、回复内容片段、工具调用片段等。流式响应结束时,服务端会推送一个特殊片段,通常包含 `data: [DONE]` **选项:Chat API** ``` data: {"choices":[{"delta":{"content":"","reasoning_content":"\n","role":"assistant"},"index":0}],"created":1765713048,"id":"021765713047481dd742fe08f96381a9e3cd447cf1b9ac3192379","model":"doubao-seed-2-1-pro-260628","service_tier":"default","object":"chat.completion.chunk","usage":null} data: {"choices":[{"delta":{"content":"","reasoning_content":"用户","role":"assistant"},"index":0}],"created":1765713048,"id":"021765713047481dd742fe08f96381a9e3cd447cf1b9ac3192379","model":"doubao-seed-2-1-pro-260628","service_tier":"default","object":"chat.completion.chunk","usage":null} ... data: {"choices":[{"delta":{"content":"","reasoning_content":"。","role":"assistant"},"index":0}],"created":1765713048,"id":"021765713047481dd742fe08f96381a9e3cd447cf1b9ac3192379","model":"doubao-seed-2-1-pro-260628","service_tier":"default","object":"chat.completion.chunk","usage":null} data: {"choices":[{"delta":{"content":"你","role":"assistant"},"index":0}],"created":1765713048,"id":"021765713047481dd742fe08f96381a9e3cd447cf1b9ac3192379","model":"doubao-seed-2-1-pro-260628","service_tier":"default","object":"chat.completion.chunk","usage":null} data: {"choices":[{"delta":{"content":"✧","role":"assistant"},"index":0}],"created":1765713048,"id":"021765713047481dd742fe08f96381a9e3cd447cf1b9ac3192379","model":"doubao-seed-2-1-pro-260628","service_tier":"default","object":"chat.completion.chunk","usage":null} ... data: {"choices":[{"delta":{"content":"","role":"assistant"},"finish_reason":"stop","index":0}],"created":1765713048,"id":"021765713047481dd742fe08f96381a9e3cd447cf1b9ac3192379","model":"doubao-seed-2-1-pro-260628","service_tier":"default","object":"chat.completion.chunk","usage":null} data: [DONE] ``` 返回格式说明:(具体字段参见 [Chat API](/docs/chat-api)) * `choices[0].delta.content`: 模型生成的消息内容。 * `choices[0].delta.reasoning_content`: 模型思考内容。 * `choices[0].finish_reason`: 模型停止生成 token 的原因。(仅在最后一个chunk中出现) **选项:Responses API** ``` event: response.created data: {"type":"response.created","response":{"created_at":1764229579,"id":"resp_021764229578658fe9a0f6cb2cc6c828e7a59adbdb971872aee70","max_output_tokens":32768,"model":"doubao-seed-2-1-pro-260628","object":"response","thinking":{"type":"enabled"},"service_tier":"default","caching":{"type":"disabled"},"store":true,"expire_at":1764488778},"sequence_number":0} event: response.in_progress data: {"type":"response.in_progress","response":{"created_at":1764229579,"id":"resp_021764229578658fe9a0f6cb2cc6c828e7a59adbdb971872aee70","max_output_tokens":32768,"model":"doubao-seed-2-1-pro-260628","object":"response","thinking":{"type":"enabled"},"service_tier":"default","caching":{"type":"disabled"},"store":true,"expire_at":1764488778},"sequence_number":1} event: response.output_item.added data: {"type":"response.output_item.added","output_index":0,"item":{"id":"rs_02176422957963700000000000000000000ffffac15dd335c9c43","type":"reasoning","status":"in_progress"},"sequence_number":2} event: response.reasoning_summary_part.added data: {"type":"response.reasoning_summary_part.added","item_id":"rs_02176422957963700000000000000000000ffffac15dd335c9c43","output_index":0,"summary_index":0,"part":{"type":"summary_text"},"sequence_number":3} event: response.reasoning_summary_text.delta data: {"type":"response.reasoning_summary_text.delta","summary_index":0,"delta":"\n","item_id":"rs_02176422957963700000000000000000000ffffac15dd335c9c43","output_index":0,"sequence_number":4} ... event: response.completed data: {"type":"response.completed","response":{"created_at":1768809358,"id":"resp_021768809358289649f4507e5505b181d56acee99f33e5a9f1075","max_output_tokens":32768,"model":"doubao-seed-2-1-pro-260628","object":"response","output":[{"id":"rs_02176880935899200000000000000000000ffffac154346d65c7e","type":"reasoning","summary":[{"type":"summary_text","text":"\n..."}],"status":"completed"},{"type":"message","role":"assistant","content":[{"type":"output_text","text":"..."}],"status":"completed","id":"msg_02176880937345100000000000000000000ffffac154346bd6748"}],"service_tier":"default","status":"completed","usage":{"input_tokens":42,"output_tokens":846,"total_tokens":888,"input_tokens_details":{"cached_tokens":0},"output_tokens_details":{"reasoning_tokens":408}},"caching":{"type":"disabled"},"store":true,"expire_at":1769068558},"sequence_number":851} data: [DONE] ``` 返回示例说明:(具体字段参见 [Responses API](/docs/create-model-responses-api)) * event类型`response.reasoning_summary_text.delta`,`event.delta`为模型思考内容。 * event类型`response.output_text.delta`,`event.delta`为模型生成的消息内容。 * event类型`response.completed`,`event.response.usage`为本次请求的 token 用量。 # API 文档 * [Chat API](/docs/chat-api) * [Responses API](/docs/create-model-responses-api) # 更多示例 * 函数调用流式输出,请参见 [流式输出](/docs/function-calling#ba983529)。 --- # 续写模式 Source: https://ark.volcengine.com/region:cn-beijing/docs/continuation-mode 调用模型,如果希望控制和引导模型的输出,您可以通过续写模式实现:预填`assistant`角色的部分内容,模型将基于该内容延续输出,以此达成输出控制目标。您可以将该输出控制机制应用于以下场景:强制输出 JSON/XML 等特定格式、绕过模型最大输出限制生成超长内容、确保大模型在角色扮演场景中保持角色一致性。 ## 模型及 API 支持的模型如下: * 文本生成模型中无深度思考能力的模型:具体模型可在[文本生成能力](/docs/model-list#32e9e053)筛选。 * 部分具有深度思考能力的模型: * doubao-seed-evolving * doubao-seed-2-1-pro-260915 * doubao-seed-2-1-lite-260915 * doubao-seed-2-1-pro-260628 * doubao-seed-2-1-turbo-260628 * doubao-seed-2-0-lite-260428 * doubao-seed-2-0-mini-260428 * doubao-seed-2-0-pro-260215 * doubao-seed-2-0-lite-260215 * doubao-seed-2-0-mini-260215 * doubao-seed-2-0-code-preview-260215 * doubao-seed-character-260628 * glm-5-3-flash-260828 * deepseek-v4-1-flash-261017 * deepseek-v4-1-flash-260910 * deepseek-v4-1-flash-economy-261017 > **注意** > > 其他深度思考模型不可使用续写模式,即请求时 message 以 assistant role 消息结尾时,**thinking** 字段会失效,模型保持默认是否深度思考的行为。 API 支持: * [Chat API](/docs/chat-api) * [Responses API](/docs/create-model-responses-api) ## 核心配置 ### 方式一 **支持模型**:除 `deepseek-v4-1-flash-261017`、`deepseek-v4-1-flash-260910`、`deepseek-v4-1-flash-economy-261017` 之外的其他模型。 请将消息列表的最后一条消息的 **role** 设置为`assistant`,模型会遵循 `assistant` 消息的已有格式和内容来续写。 ```Python messages = [ {"role": "user", "content": "You are a calculator, please calculate: 1 + 1"}, # 最后消息为模型消息,role 为 assistant {"role": "assistant", "content": "="} ] ``` ### 方式二 **支持模型**:`deepseek-v4-1-flash-261017`、`deepseek-v4-1-flash-260910`、`deepseek-v4-1-flash-economy-261017` 请将消息列表的最后一条消息的 **role** 设置为`assistant`,并设置最后一条消息的 **prefix** 参数为`true`。模型会遵循 `assistant` 消息的已有格式和内容来续写。 ```Python messages = [ {"role": "user", "content": "You are a calculator, please calculate: 1 + 1"}, {"role": "assistant", "content": "=", "prefix": True} ] ``` ## 模式对比 |普通模式 |续写模式 | | --- | --- | |请求示例 |请求示例 | \ | | | \ |```Python |```Python | \ |import os |import os | \ |# Install SDK: pip install arkruntime |# Install SDK: pip install arkruntime | \ |from arkruntime import Ark |from arkruntime import Ark | \ | | | \ |client = Ark( |client = Ark( | \ | # The base URL for model invocation | # The base URL for model invocation | \ | base_url="https://ark.cn-beijing.volces.com/api/v3", | base_url="https://ark.cn-beijing.volces.com/api/v3", | \ | # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey | # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey | \ | api_key=os.getenv('ARK_API_KEY'), | api_key=os.getenv('ARK_API_KEY'), | \ |) |) | \ | | | \ |completion = client.chat.completions.create( |completion = client.chat.completions.create( | \ | # Replace with Model ID | # Replace with Model ID | \ | model = "doubao-seed-2-1-pro-260915", | model = "doubao-seed-2-1-pro-260915", | \ | messages=[ | messages=[ | \ | {"role": "user", "content": "You are a calculator, please calculate: 1 + 1 "}, | {"role": "user", "content": "You are a calculator, please calculate: 1 + 1"}, | \ | ] | # 额外传入模型信息,模型据此续写 | \ |) | {"role": "assistant", "content": "="} | \ |print(completion.choices[0].message.content) | ] | \ |``` |) | \ | |print(completion.choices[0].message.content) | \ | |``` | |返回示例 |返回示例 | \ | | | \ |```Shell |```Shell | \ |1+1等于2。 |2 | \ |``` |``` | \ | | | \ |输出会按照模型根据问题的完整自然语言回复。 |模型根据信息“=”续写,保持对应的格式和行文风格。 | 接下来,对于几种典型使用场景进行举例说明。 ## 场景:改善输出格式 模型可能会基于自身理解输出内容,导致结果无法直接被其他程序解析。可以通过预填充 `{` 符号,引导模型跳过一些场景回复,直接输出 JSON 对象,会让回答更加简洁和工整,可以被其他程序更好地解析。 |普通模式 |续写模式 | | --- | --- | |请求示例 |请求示例 | \ | | | \ |```Python |```Python | \ |import os |import os | \ |# Install SDK: pip install arkruntime |# Install SDK: pip install arkruntime | \ |from arkruntime import Ark |from arkruntime import Ark | \ | | | \ |client = Ark( |client = Ark( | \ | # The base URL for model invocation | # The base URL for model invocation | \ | base_url="https://ark.cn-beijing.volces.com/api/v3", | base_url="https://ark.cn-beijing.volces.com/api/v3", | \ | # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey | # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey | \ | api_key=os.getenv('ARK_API_KEY'), | api_key=os.getenv('ARK_API_KEY'), | \ |) |) | \ | | | \ |completion = client.chat.completions.create( |completion = client.chat.completions.create( | \ | # Replace with Model ID | # Replace with Model ID | \ | model = "doubao-seed-2-1-pro-260915", | model = "doubao-seed-2-1-pro-260915", | \ | messages=[ | messages=[ | \ | {"role": "user", "content": "Use JSON to describe the name and function of the Doubao model"} | {"role": "user", "content": "Use JSON to describe the name and function of the Doubao model"}, | \ | ] | # 额外传入一个 { 的模型信息,模型据此续写 | \ |) | {"role": "assistant", "content": "{"}, | \ |print(completion.choices[0].message.content) | ] | \ |``` |) | \ | |print(completion.choices[0].message.content) | \ | |``` | |返回示例 |返回示例 | \ |返回一些说明性语言,无法直接按照 JSON 解析。 |和前置`assistant`信息组合成 JSON 返回。 | \ | | | \ |```Shell |```Shell | \ |Here's a JSON description of the Doubao model, including its name and function: |"model_name": "Doubao", | \ | | "functions": [ | \ |```json | { | \ |{ | "name": "text_generation", | \ | "model": { | "description": "Generates human-like text based on input prompts, supporting creative writing, summarization, and more." | \ | "name": "Doubao", | }, | \ | "alternative_names": ["doubao"], | { | \ | "type": "large_language_model", | "name": "language_translation", | \ | "developer": "ByteDance", | "description": "Translates text between multiple languages with high accuracy and contextual understanding." | \ | "primary_function": { | }, | \ | "description": "Doubao is an AI assistant designed to understand and generate human-like text responses", | { | \ | "capabilities": [ | "name": "sentiment_analysis", | \ | "natural language understanding", | "description": "Analyzes the sentiment of input text, determining whether it is positive, negative, or neutral." | \ | "text generation", | }, | \ | "question answering", | { | \ | "translation between languages", | "name": "question_answering", | \ | "text summarization", | "description": "Provides accurate answers to questions based on the input context or general knowledge." | \ | "creative writing", | }, | \ | "code generation and explanation", | { | \ | "general knowledge provision" | "name": "code_generation", | \ | ] | "description": "Generates code snippets in various programming languages based on natural language descriptions." | \ | }, | }, | \ | "languages_supported": ["Chinese", "English"], | { | \ | "access_method": "API and web/mobile interfaces", | "name": "conversational_ai", | \ | "version": "1.0", | "description": "Engages in natural, context-aware conversations with users, simulating human-like interactions." | \ | "release_date": "2023" | } | \ | } | ] | \ |} |} | \ |``` |``` | \ | | | \ |Note: Some details about Doubao might not be publicly available, as it's a relatively new model from ByteDance. The information here represents common capabilities of similar large language models. | | \ |``` | | ### 注意事项 * 方舟已提供结构化输出能力,可让模型输出严格符合格式要求的 JSON 内容,请参见[结构化输出(beta)](/docs/structured-output-beta)。 * 由于模型具有一定的随机性,无法 100% 保证回复为标准 JSON 对象。建议您对模型的回复进行校验,下面示例使用 [json_repair](https://github.com/mangiucugna/json_repair) 库校验返回的是否为合法的 JSON 对象。 ```Python import json # Install json-repair: pip install json-repair import json_repair import os # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark PREFILL_PREFIX = "{" client = Ark( # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv('ARK_API_KEY'), ) completion = client.chat.completions.create( # Replace with Model ID model = "doubao-seed-2-1-pro-260915", messages=[ {"role": "user", "content": "Use JSON to describe the name and function of the Doubao model"}, {"role": "assistant", "content": PREFILL_PREFIX}, ] ) # 拼接 PREFILL_PREFIX 和模型输出 json_string = PREFILL_PREFIX + completion.choices[0].message.content # 解析 JSON Object obj = {} try: obj = json.loads(json_string) except json.JSONDecodeError as e: obj = json_repair.loads(json_string) print(obj) ``` ## 场景:输出超过模型输出上限的内容 使用续写模式让大模型根据前轮请求续写内容,并拼接多次输出的内容,组合成超长输出。可以避免因为 **max_tokens**(最大输出长度)限制,导致无法获取完整内容。 > 这种方式会将模型输出多次返回给模型,会有更多 token 用量。 > 注意增加循环次数限制等兜底,防止死循环输出等特殊情况,导致意外花费。 ```Python import os # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark messages = [ {"role": "user", "content": '''Please translate the following text into English: '''}, # Replace with your content {"role": "assistant", "content": ""} ] # Replace with Model ID ark_model="doubao-seed-2-1-pro-260915" client = Ark( # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv('ARK_API_KEY'), ) completion = client.chat.completions.create( model=ark_model, messages=messages ) loop_count = 0 # 初始化循环计数器 max_loops = 20 # 设置最大循环次数为20 # 触发因为输出长度限制,循环生成 assistant 回复 while completion.choices[0].finish_reason == "length": messages[-1]["content"] += completion.choices[0].message.content completion = client.chat.completions.create( model=ark_model, messages=messages ) # 增加计数器 loop_count += 1 # 检查是否超过最大循环次数 if loop_count >= max_loops: print(f"Warning: Reached maximum loop count {max_loops}, stopping content generation.") break # 返回最后一条回复 messages[-1]["content"] += completion.choices[0].message.content print(messages[-1]["content"]) ``` ## 场景:增强角色扮演一致性 我们通常使用系统消息来设置角色的一些信息,但是随着对话轮次的增多,模型可能会跳脱出角色的约束,通过续写模式,提醒模型本次输出扮演的角色,保证对话符合预期。 ```Python import os # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark client = Ark( # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv('ARK_API_KEY'), ) # Replace with Model ID ark_model="doubao-seed-2-1-pro-260915" messages = [ {"role": "system", "content": "The following is a scene from Journey to the West. Please converse according to the specified role. For each round of dialogue, only reply with the content of the current role; do not add any additional content.\n\nAfter leaving Wuzhuang Guan, Tang Seng and his disciples traveled for more than a month and arrived at the foot of a great mountain. Wukong looked around and saw lofty mountains, steep ridges, overgrown weeds, and extremely dangerous terrain."}, {"role": "assistant", "content": "Wukong said:"} ] completion = client.chat.completions.create( model=ark_model, messages=messages ) print(messages[-1]['content']+completion.choices[0].message.content) ``` 模型输出示例: ``` Wukong said, "Master, this mountain looks very dangerous. I will go explore the way first. You wait here." ``` 您也可以通过变更`messages`最后消息,实现角色切换。 ```Python ... messages[-1] = {"role": "assistant", "content": "Tang Seng said:"} completion = client.chat.completions.create( model=ark_model, messages=messages ) print(messages[-1]['content']+completion.choices[0].message.content) ``` 模型输出示例: ``` Tang Seng said: "Wukong, this mountain looks very dangerous, you must be careful to check it out, don't fall into the trap of the monster." ``` --- # 上下文缓存 Source: https://ark.volcengine.com/region:cn-beijing/docs/context-cache 在多轮对话、工具调用及角色扮演等存在大量重复上下文输入的场景中,利用上下文缓存机制复用计算结果,避免模型对相同内容的重复处理。这将有效消除重复加载带来的开销,显著降低 Token 成本。 > **说明** > > 方舟平台的新用户?获取 API Key 及 开通模型等准备工作,请参见 [快速入门](/docs/quick-start)。 # 缓存模式 上下文缓存支持两种工作模式,可根据便捷性、确定性及成本需求进行选择。 * **隐式缓存**:**自动启用**,用户无需额外配置,且无法关闭,适合更关注接入便捷性、难以显式管理或固定前缀的场景。系统会自动识别请求中的公共前缀并进行缓存。 * **显式缓存**:需要**主动开启**的缓存模式。需要主动配置创建缓存,且支持缓存确定性命中。 > **注意** > > 隐式缓存无需配置,系统自动开启。当请求使用显式缓存时,隐式缓存不生效。 |对比项 |隐式缓存 |显式缓存 | |---|---|---| |适用场景 |适合追求接入便捷、无需显式创建与管理缓存的通用场景,尤其适用于多轮对话、工具调用等公共前缀会随交互持续增长、难以稳定固化前缀的场景。系统会自动识别公共前缀并进行缓存。 |适合需要配置创建缓存、稳定复用某段固定前缀并具备更强可控性的场景,例如角色扮演、固定指令模板等前缀稳定且工具调用较少或结构稳定的多轮对话。 | |配置方式 |无需配置,不可关闭 |需要手动配置 | |是否影响回复质量 |不影响 |不影响 | |支持模型 |详见 [支持模型](/docs/context-cache#6024bcd0) |详见 [支持模型](/docs/context-cache#e8535e58) | |支持 API |[Responses API](/docs/create-model-responses-api) |[Responses API](/docs/create-model-responses-api) | \ | |[Chat API](/docs/chat-api) | | \ | |[Batch API](/docs/batch-chat-api) | | |缓存命中 |无法保证命中率,受多因素影响,具体命中概率由系统判定 |确定性命中(缓存命中率更高) | |缓存有效期 |动态变化,系统会定期清理长时间未使用的缓存数据 |支持配置缓存过期时间 | |缓存最少 Token 数 |* 默认:1024 |* 前缀缓存:256 | \ | |* 部分模型:2048。适用模型:`doubao-seed-2-1-turbo-260628`、`glm-5-2-260617`、`deepseek-v4-pro-ga-260813`、`deepseek-v4-flash-ga-260731`、`deepseek-v4-pro-260425` |* Session 缓存:无限制 | \ | |* 部分模型:256。适用模型:`deepseek-v4-1-flash-261017`、`deepseek-v4-1-flash-260910`、`deepseek-v4-1-flash-economy-261017` | | \ | |* `glm-5-3-flash-260828`:8960 |> 详见 [前缀缓存](/docs/context-cache#prefix-cache) | \ | |> 详见 [工作原理](/docs/context-cache#8c7c47d5) | | |命中缓存的输入 Token 计费 |根据模型输入长度分段计费 |根据模型输入长度分段计费 | |缓存存储计费 |不计费 |计费 | # 隐式缓存 ## 支持模型 隐式缓存支持的模型如下,具体可参见[上下文缓存能力](/docs/model-list#ed095742)。 * 在线推理场景下,`doubao-seed-code` 模型、`doubao-seed-2.0` 及之后系列模型支持隐式缓存,且不可关闭。 * 批量推理场景下,支持的模型会开启隐式缓存,且不可关闭。 ## 提升缓存命中率 隐式缓存为自动模式,用户无需额外配置且无法关闭。命中与否由系统判定,不保证命中。 建议: * 保持前缀稳定。 将固定角色设定、背景资料、长文本等稳定内容放在前部;将当轮问题、时间戳、请求 ID 等变化内容放在后部。同类请求尽量保持请求结构与前缀内容一致,减少前缀频繁变化带来的命中波动。 * 保持工具定义、工具顺序、结构化输出方案等保持一致。 * 监控命中情况并迭代优化。 可通过记录响应中的 Token 统计信息,持续观察命中 Token 的变化趋势,并据此优化提示词组织方式与前缀稳定性。 * 通过 Prompt Cache Key 配置稳定的缓存路由标识,提升缓存复用概率。具体配置方式见下文。 ## 使用 Prompt Cache Key Prompt Cache Key 是提示词缓存能力上的路由亲和策略。通过在请求中设置稳定的缓存路由标识,系统会尽量将共享相同前缀的请求路由到缓存命中率更高的服务,从而提升隐式缓存的复用概率。 ### 支持模型与 API * 支持模型:`doubao-seed-2.0` 及之后系列模型。 * 支持 API: * Chat API:在请求参数中设置 `prompt_cache_key`。 * Responses API:在请求参数中设置 `prompt_cache_key`。 ### 工作原理 > **说明** > > **工作机制**:系统将请求中的缓存路由标识作为会话级路由提示,并按 Endpoint、模型与该取值隔离路由映射。该能力采用尽力而为的亲和策略,不承诺固定实例,也不保证每次请求都能命中缓存。 1. **首次请求**:系统按常规路由策略选择可用服务,并建立缓存路由标识取值对应的路由映射。 2. **后续请求**:相同 Endpoint、模型与缓存路由标识取值的请求会优先路由到已映射的服务,以提高相同前缀的缓存复用概率。 3. **自动回退**:当已映射服务不可用、请求速率超过保护阈值或其他保护条件触发时,请求会回退到常规路由。 ### 使用限制 * **流量限制**:同一缓存路由标识对应的请求总流量应控制在每分钟 15 个请求以内。速率过高时,部分请求可能回退到常规路由,从而无法复用原服务上的前缀缓存。高流量工作负载建议将流量稳定地分散到更多取值上。 * **保持稳定**:上下文连续的请求建议使用同一取值,避免在同一会话中频繁更换。 * **隔离会话**:不同用户或并行会话应使用不同取值,避免无关请求共享路由映射并形成热点。 * **避免敏感信息**:建议使用不可读的内部 Session ID,不要使用手机号、邮箱、访问凭证或 Prompt 原文。 * **非强一致保证**:服务扩缩容、发布、故障切换、映射过期或保护策略触发时,请求可能被重新路由。 ### 使用方式 调用模型时,Chat API 和 Responses API 可在请求参数中设置 `prompt_cache_key`,并确保上下文连续的请求使用同一取值,以提升缓存命中率。 以 Responses API 为例,示例如下: **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "input": "Hello!", "prompt_cache_key": "shared-workflow-v1" }' ``` **选项:Python** ```Python import os from arkruntime import Ark client = Ark( api_key=os.environ.get("ARK_API_KEY"), base_url="https://ark.cn-beijing.volces.com/api/v3", ) response = client.responses.create( model="doubao-seed-2-1-pro-260915", input="Hello!", prompt_cache_key="shared-workflow-v1", ) for item in response.output: if item.type == "message": for content in item.content: if content.type == "output_text": print(content.text) ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/responses" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() resp, err := client.CreateResponses(ctx, &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", Input: responses.NewStringResponsesInput("Hello!"), PromptCacheKey: responses.NewOptString("shared-workflow-v1"), }) if err != nil { fmt.Printf("response error: %v\n", err) return } fmt.Println(resp) } ``` **选项:Java** ```Java package com.ark.example; import com.volcengine.ark.runtime.models.responses.Response; import com.volcengine.ark.runtime.models.responses.ResponsesInput; import com.volcengine.ark.runtime.models.responses.ResponsesRequest; import com.volcengine.ark.runtime.service.ArkService; class ContextCachePromptCacheKey { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); ArkService arkService = ArkService.builder() .apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); ResponsesRequest request = ResponsesRequest.builder() .model("doubao-seed-2-1-pro-260915") .input(ResponsesInput.ofString("Hello!")) .promptCacheKey("shared-workflow-v1") .build(); Response response = arkService.createResponse(request); System.out.println(response); arkService.shutdownExecutor(); } } ``` ## 计费说明 当请求命中隐式缓存时,计费信息如下: * 命中的输入 Tokens(`cached_tokens`):按缓存命中输入单价计费。 * 未命中的输入 Tokens:按正常输入单价计费。 * 输出 Tokens:按正常输出单价计费。 * 缓存存储:不计费。 > **注意** > > - 与显式缓存相比,**隐式缓存存储不计费**。 > - **缓存命中输入单价可能会随上下文输入长度区间变化**。如 Seed 2.0 系列模型在输入长度为 [0, 32k]、[32k, 128k]、[128k, 256k] 时,缓存命中输入单价不同。 ## 工作原理 向支持隐式缓存的模型发送请求时,该功能会自动开启,工作原理如下。 * **缓存创建**:系统会基于请求输入的**公共前缀**进行缓存。当某次请求完成推理后,系统可能将其输入中可复用的**前缀片段**写入缓存,以便后续请求在**相同前缀**出现时复用。 * **缓存命中**:当后续请求的输入在开头部分与已有缓存条目存在**相同前缀**时,系统会尝试复用这段前缀对应的缓存结果,从而减少重复计算。 * **不保证命中**:缓存容量有限,旧缓存可能被淘汰;分布式路由也会影响命中概率。 * **不保证最长前缀命中**:系统会综合考虑可用资源与命中收益,命中长度可能不是全局最长命中的那一段。 * **缓存命中条件**:缓存块达到对应模型的最小门槛后,才可能会被系统识别并参与命中匹配。 * 默认:缓存块最少为 1024 tokens。即请求输入最少为 1024 tokens,才有可能触发缓存命中。 * 部分模型:缓存块最少为 2048 tokens。即请求输入最少为 2048 tokens,才有可能触发缓存命中。适用模型:`doubao-seed-2-1-turbo-260628`、`glm-5-2-260617`、`deepseek-v4-pro-ga-260813`、`deepseek-v4-flash-ga-260731`、`deepseek-v4-pro-260425`。 * `glm-5-3-flash-260828`:缓存块最少为 8960 tokens。即请求输入最少为 8960 tokens,才有可能触发缓存命中。 > **说明** > > 通过 API 响应字段 `usage.prompt_tokens_details` 判断是否命中隐式缓存: > * 命中:`cached_tokens > 0` > * 未命中:`cached_tokens = 0` # 显式缓存 与隐式缓存相比,显式缓存需要显式创建并承担相应开销,但能实现更高的缓存命中率和更强的可控性。当前显式缓存支持 Session 缓存和前缀缓存两种类型。 ## 支持模型 显式缓存支持的模型及 API,请参见[上下文缓存能力](/docs/model-list#ed095742)。 ## 使用限制 为避免因使用方式不当导致缓存失效,需满足显式缓存使用的基础限制: * **store**:写入缓存的前提是存储已开启,即手动配置 **store** 为 `true` 或保持缺省(默认为 `true`)。 * **caching**: * **前一轮对话请求开启了缓存写入,当前轮次对话才能写入缓存。** 以此类推,当某轮次请求需写入缓存,则需保证所有前置轮次请求的缓存写入状态开启,即前置所有轮次均有`"caching": {"type": "enabled"}`。 * 前面轮次只要存在`"caching": {"type": "enabled"}`,则不支持使用 `json_schema`,但支持使用 `json_object`。 > **注意** > > 在版本切换过程中,缓存暂不可用,使用 Responses API 请求时将无法命中缓存,但会进行存储并产生缓存存储费用;版本切换完成后,可正常命中历史轮次的缓存。具体参见[版本切换](/docs/manage-inference-endpoints#d7c15496)。 * **instructions**:若想写入缓存,**instructions** 字段应为空。若在本轮请求里设置了 **instructions**,该轮对话不能调用已有缓存,也无法将本轮信息写入缓存。 * **thinking**:请求中 **thinking** 字段的赋值应与前一轮保持一致,才可使用缓存或写入缓存。 * 当第 1 轮设定 `"thinking":{"type":"auto"}`,则后续如需使用或写入缓存,均需保持同样赋值。 * 当第 1 轮未设置 **thinking** 字段,后续请求如需写入缓存或者调用已有缓存,也需保持不设置 **thinking** 字段。 * **tools**:仅在首轮请求时可以设置 **tools** 字段,后续所有对话将默认携带 **tools** 字段信息的缓存输入。 * 不支持在后续轮次对话请求中再次设置 **tools** 字段,否则会冲突并报错。 * 若首轮对话信息被删除,则后续所有轮次对话都不再携带 **tools** 字段信息的缓存输入,也无法再配置 **tools** 字段。 ## 快速使用 ### 前提条件 使用前,请先在 [开通管理页](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&OpenTokenDrawer=false) 开通模型的「推理(缓存)定价」能力。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/e96b4642ab314149b7de8566f6bb7a79~tplv-goo7wpa0wc-image.image) ### 前缀缓存 前缀缓存适用于固定前缀与动态后缀相结合的场景。 > **说明** > > - 首轮输入时,需设置 `"store": true`(默认 true)、`"caching": {"type": "enabled", "prefix": true}`,以创建前缀缓存。后续轮次即可通过 `previous_response_id` 引用缓存信息。 > > - 使用 `glm-5-3-flash-260828` 模型创建前缀缓存时,需将 `role` 设置为 `user`。 创建前缀缓存场景限制:Input Tokens 需要大于等于 256 Tokens,否则会报错;`stream` 参数不能设置为 true。 > 创建前缀缓存时,返回的 `usage` 中 `total_tokens = input_tokens`,`output_tokens` 始终为 0。 **选项:Python** ```Python # coding=utf-8 import os from arkruntime import Ark client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=os.getenv('ARK_API_KEY'), ) response = client.responses.create( model="doubao-seed-2-1-pro-260915", input=[ { "role": "system", "content": "你是一名文学分析助手,回答需简洁明了,请根据下面内容分析《麦琪的礼物》相关问题。<麦琪的礼物小说内容>" # Input tokens must be greater than or equal to 256 tokens; otherwise, prefix caching cannot be created. } ], caching={"type": "enabled", "prefix": True}, thinking={"type": "disabled"}, ) print(response) second_response = client.responses.create( model="doubao-seed-2-1-pro-260915", previous_response_id=response.id, input=[{"role": "user", "content": "以 Della 的视角写一篇日记,描述其卖掉长发前的心情。"}], thinking={"type": "disabled"}, ) print(second_response) third_response = client.responses.create( model="doubao-seed-2-1-pro-260915", previous_response_id=response.id, input=[{"role": "user", "content": "分析 O. Henry 在该故事片段中反讽手法的运用,给出简明阐释。"}], thinking={"type": "disabled"}, ) print(third_response) ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/responses" ) func main() { client := arkruntime.NewClientWithApiKey( // Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() prefix := true resp, err := client.CreateResponses(ctx, &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", Input: responses.NewInputItemArrayResponsesInput([]responses.InputItem{ easyMessage(responses.MessageRoleSystem, "你是一名文学分析助手,回答需简洁明了,请根据下面内容分析《麦琪的礼物》相关问题。<麦琪的礼物小说内容>"), }), Caching: responses.NewOptResponseCaching(responses.ResponseCaching{Type: responses.NewOptCacheMode(responses.CacheModeEnabled), Prefix: responses.NewOptBool(prefix)}), Thinking: responses.NewOptThinking(responses.Thinking{Type: responses.NewOptThinkingMode(responses.ThinkingModeDisabled)}), }) if err != nil { fmt.Printf("response error: %v", err) return } fmt.Println(resp) second_resp, second_err := client.CreateResponses(ctx, &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", PreviousResponseID: responses.NewOptString(resp.ID), Input: responses.NewInputItemArrayResponsesInput([]responses.InputItem{ easyMessage(responses.MessageRoleUser, "以 Della 的视角写一篇日记,描述其卖掉长发前的心情。"), }), Thinking: responses.NewOptThinking(responses.Thinking{Type: responses.NewOptThinkingMode(responses.ThinkingModeDisabled)}), }) if second_err != nil { fmt.Printf("second response error: %v", second_err) return } fmt.Println(second_resp) third_resp, third_err := client.CreateResponses(ctx, &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", PreviousResponseID: responses.NewOptString(resp.ID), Input: responses.NewInputItemArrayResponsesInput([]responses.InputItem{ easyMessage(responses.MessageRoleUser, "分析 O. Henry 在该故事片段中反讽手法的运用,给出简明阐释。"), }), Thinking: responses.NewOptThinking(responses.Thinking{Type: responses.NewOptThinkingMode(responses.ThinkingModeDisabled)}), }) if third_err != nil { fmt.Printf("second response error: %v", third_err) return } fmt.Println(third_resp) } func easyMessage(role responses.MessageRole, content string) responses.InputItem { return responses.InputItem{ OneOf: responses.NewItemEasyMessageInputItemSum( responses.ItemEasyMessage{ Role: responses.NewOptMessageRole(role), Content: responses.NewStringMessageContent(content), }, ), } } ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.service.ArkService; import com.volcengine.ark.runtime.models.responses.*; public class demo { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); // The base URL for model invocation ArkService arkService = ArkService.builder().apiKey(apiKey).baseUrl("https://ark.cn-beijing.volces.com/api/v3").build(); ResponsesRequest request = ResponsesRequest.builder() .model("doubao-seed-2-1-pro-260915") .input(ResponsesInput.ofList(java.util.Arrays.asList(ItemEasyMessage.builder().role(MessageRole.SYSTEM).content( MessageContent.ofString("你是一名文学分析助手,回答需简洁明了,请根据下面内容分析《麦琪的礼物》相关问题。<麦琪的礼物小说内容>") ).build()))) .caching(ResponseCaching.builder().type(CacheMode.ENABLED).prefix(true).build()) .thinking(Thinking.builder().type(ThinkingMode.DISABLED).build()) .build(); Response resp = arkService.createResponse(request); System.out.println(resp); System.out.println("---------------------"); ResponsesRequest request2 = ResponsesRequest.builder() .model("doubao-seed-2-1-pro-260915") .previousResponseId(resp.getId()) .input(ResponsesInput.ofList(java.util.Arrays.asList(ItemEasyMessage.builder().role(MessageRole.USER).content( MessageContent.ofString("以 Della 的视角写一篇日记,描述其卖掉长发前的心情。") ).build()))) .thinking(Thinking.builder().type(ThinkingMode.DISABLED).build()) .build(); Response resp2 = arkService.createResponse(request2); System.out.println(resp2); System.out.println("---------------------"); ResponsesRequest request3 = ResponsesRequest.builder() .model("doubao-seed-2-1-pro-260915") .previousResponseId(resp.getId()) .input(ResponsesInput.ofList(java.util.Arrays.asList(ItemEasyMessage.builder().role(MessageRole.USER).content( MessageContent.ofString("分析 O. Henry 在该故事片段中反讽手法的运用,给出简明阐释。") ).build()))) .thinking(Thinking.builder().type(ThinkingMode.DISABLED).build()) .build(); Response resp3 = arkService.createResponse(request3); System.out.println(resp3); arkService.shutdownExecutor(); } } ``` **选项:OpenAI SDK** ```Python # coding=utf-8 import os from openai import OpenAI client = OpenAI( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=os.getenv('ARK_API_KEY'), ) response = client.responses.create( model="doubao-seed-2-1-pro-260915", input=[ { "role": "system", "content": "你是一名文学分析助手,回答需简洁明了,请根据下面内容分析《麦琪的礼物》相关问题。<麦琪的礼物小说内容>" # It needs to be greater than or equal to 256 tokens; otherwise, prefix caching cannot be created. } ], extra_body={ "caching": {"type": "enabled", "prefix": True}, "thinking":{"type":"disabled"} } ) print(response) second_response = client.responses.create( model="doubao-seed-2-1-pro-260915", previous_response_id=response.id, input=[{"role": "user", "content": "以 Della 的视角写一篇日记,描述其卖掉长发前的心境。"}], extra_body={ "thinking":{"type":"disabled"} } ) print(second_response) third_response = client.responses.create( model="doubao-seed-2-1-pro-260915", previous_response_id=response.id, input=[{"role": "user", "content": "分析 O. Henry 在该故事片段中反讽手法的运用,给出简明阐释。"}], extra_body={ "thinking":{"type":"disabled"} } ) print(third_response) ``` **选项:Curl** 1. 创建缓存,并将内容写入。 > **说明** > > 输入内容必须超过 256 tokens,否则无法创建前缀缓存。 ```Bash curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json;charset=utf-8" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "input":[ { "role":"system", "content":"你是一名文学分析助手,回答需简洁明了,请根据下面内容分析《麦琪的礼物》相关问题。<麦琪的礼物小说内容>" } ], "caching":{ "type":"enabled", "prefix": true }, "thinking": { "type": "disabled" } }' ``` 2. 在第二轮请求中,通过第一轮返回 id,来读取并使用缓存。 ```Bash curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "input": "以 Della 的视角写一篇日记,描述其卖掉长发前的心境。", "caching":{ "type":"enabled" }, "thinking": { "type": "disabled" }, "previous_response_id":"" }' ``` 3. 在第三轮请求中,还是通过第一轮返回 id,来读取并使用缓存。 ```Bash curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "input": "分析 O. Henry 在该故事片段中反讽手法的运用,给出简明阐释。", "caching":{ "type":"enabled" }, "thinking": { "type": "disabled" }, "previous_response_id":"" }' ``` ### Session 缓存 Responses API 支持自动储存历史上下文对话并保持缓存,通过调用 `previous_response_id` 在多轮对话等场景中使用缓存输入并降低推理成本。 **选项:Python** ```Python # encoding=utf-8 import os from arkruntime import Ark client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=os.getenv('ARK_API_KEY'), ) input_text = "你是一名文学分析助手,回答需简洁明了,请根据下面内容分析《麦琪的礼物》相关问题。<麦琪的礼物小说内容>" response = client.responses.create( model="doubao-seed-2-1-pro-260915", input=[ { "role": "system", "content": input_text }, { "role": "user", "content":"用5个简短的要点总结核心情节。" } ], caching={"type": "enabled"}, thinking={"type": "disabled"}, ) print(response) print(response.usage.model_dump_json()) # 在后续请求中输入缓存信息 second_response = client.responses.create( model="doubao-seed-2-1-pro-260915", previous_response_id=response.id, input=[{"role": "user", "content": "以 Della 的视角写一篇日记,描述其卖掉长发前的心情。"}], caching={"type": "enabled"}, thinking={"type": "disabled"}, ) print(second_response) print(second_response.usage.model_dump_json()) third_response = client.responses.create( model="doubao-seed-2-1-pro-260915", previous_response_id=second_response.id, input=[{"role": "user", "content": "根据原文节选和 Della 刚写的日记,想象 Jame 读到这篇日记时会有怎样的感受。"}], caching={"type": "enabled"}, thinking={"type": "disabled"}, ) print(third_response) print(third_response.usage.model_dump_json()) ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/responses" ) func main() { client := arkruntime.NewClientWithApiKey( // Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() input := "你是一名文学分析助手,回答需简洁明了,请根据下面内容分析《麦琪的礼物》相关问题。<麦琪的礼物小说内容>" resp, err := client.CreateResponses(ctx, &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", Input: responses.NewInputItemArrayResponsesInput([]responses.InputItem{ easyMessage(responses.MessageRoleSystem, input), easyMessage(responses.MessageRoleUser, "用5个简短的要点总结核心情节。"), }), Caching: responses.NewOptResponseCaching(responses.ResponseCaching{Type: responses.NewOptCacheMode(responses.CacheModeEnabled)}), Thinking: responses.NewOptThinking(responses.Thinking{Type: responses.NewOptThinkingMode(responses.ThinkingModeDisabled)}), }) if err != nil { fmt.Printf("response error: %v", err) return } fmt.Println(resp) fmt.Println(resp.GetUsage()) second_resp, second_err := client.CreateResponses(ctx, &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", PreviousResponseID: responses.NewOptString(resp.ID), Input: responses.NewInputItemArrayResponsesInput([]responses.InputItem{ easyMessage(responses.MessageRoleUser, "以 Della 的视角写一篇日记,描述其卖掉长发前的心情。"), }), Thinking: responses.NewOptThinking(responses.Thinking{Type: responses.NewOptThinkingMode(responses.ThinkingModeDisabled)}), }) if second_err != nil { fmt.Printf("second response error: %v", second_err) return } fmt.Println(second_resp) fmt.Println(second_resp.GetUsage()) third_resp, third_err := client.CreateResponses(ctx, &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", PreviousResponseID: responses.NewOptString(second_resp.ID), Input: responses.NewInputItemArrayResponsesInput([]responses.InputItem{ easyMessage(responses.MessageRoleUser, "根据原文节选和 Della 刚写的日记,想象 Jame 读到这篇日记时会有怎样的感受。"), }), Thinking: responses.NewOptThinking(responses.Thinking{Type: responses.NewOptThinkingMode(responses.ThinkingModeDisabled)}), }) if third_err != nil { fmt.Printf("third response error: %v", third_err) return } fmt.Println(third_resp) fmt.Println(third_resp.GetUsage()) } func easyMessage(role responses.MessageRole, content string) responses.InputItem { return responses.InputItem{ OneOf: responses.NewItemEasyMessageInputItemSum( responses.ItemEasyMessage{ Role: responses.NewOptMessageRole(role), Content: responses.NewStringMessageContent(content), }, ), } } ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.service.ArkService; import com.volcengine.ark.runtime.models.responses.*; public class demo { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); // The base URL for model invocation ArkService arkService = ArkService.builder().apiKey(apiKey).baseUrl("https://ark.cn-beijing.volces.com/api/v3").build(); String input = "你是一名文学分析助手,回答需简洁明了,请根据下面内容分析《麦琪的礼物》相关问题。<麦琪的礼物小说内容>"; ResponsesRequest request = ResponsesRequest.builder() .model("doubao-seed-2-1-pro-260915") .input(ResponsesInput.ofList(java.util.Arrays.asList(ItemEasyMessage.builder().role(MessageRole.SYSTEM).content( MessageContent.ofString(input) ).build(), ItemEasyMessage.builder().role(MessageRole.USER).content( MessageContent.ofString("用5个简短的要点总结核心情节。") ).build()))) .caching(ResponseCaching.builder().type(CacheMode.ENABLED).build()) .thinking(Thinking.builder().type(ThinkingMode.DISABLED).build()) .build(); Response resp = arkService.createResponse(request); System.out.println(resp); System.out.println(resp.getUsage()); System.out.println("---------------------"); ResponsesRequest request2 = ResponsesRequest.builder() .model("doubao-seed-2-1-pro-260915") .previousResponseId(resp.getId()) .input(ResponsesInput.ofList(java.util.Arrays.asList(ItemEasyMessage.builder().role(MessageRole.USER).content( MessageContent.ofString("以Della的视角写一篇日记,描述其卖掉长发前的心情。") ).build()))) .thinking(Thinking.builder().type(ThinkingMode.DISABLED).build()) .build(); Response resp2 = arkService.createResponse(request2); System.out.println(resp2.getOutput()); System.out.println(resp2.getUsage()); System.out.println("---------------------"); ResponsesRequest request3 = ResponsesRequest.builder() .model("doubao-seed-2-1-pro-260915") .previousResponseId(resp2.getId()) .input(ResponsesInput.ofList(java.util.Arrays.asList(ItemEasyMessage.builder().role(MessageRole.USER).content( MessageContent.ofString("根据原文节选和 Della 刚写的日记,想象 Jame 读到这篇日记时会有怎样的感受。") ).build()))) .thinking(Thinking.builder().type(ThinkingMode.DISABLED).build()) .build(); Response resp3 = arkService.createResponse(request3); System.out.println(resp3.getOutput()); System.out.println(resp3.getUsage()); arkService.shutdownExecutor(); } } ``` **选项:OpenAI SDK** ```Python import os from openai import OpenAI client = OpenAI( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=os.getenv('ARK_API_KEY'), ) input_text = "你是一名文学分析助手,回答需简洁明了,请根据下面内容分析《麦琪的礼物》相关问题。<麦琪的礼物小说内容>" response = client.responses.create( model="doubao-seed-2-1-pro-260915", input=[ { "role": "system", "content": input_text }, { "role": "user", "content":"用5个简短的要点总结核心情节。" } ], extra_body={ "caching": {"type": "enabled"}, "thinking":{"type":"disabled"} } ) print(response) second_response = client.responses.create( model="doubao-seed-2-1-pro-260915", previous_response_id=response.id, input=[{"role": "user", "content": "以 Della 的视角写一篇日记,描述其卖掉长发前的心情。"}], extra_body={ "caching": {"type": "enabled"}, "thinking":{"type":"disabled"} } ) print(second_response) third_response = client.responses.create( model="doubao-seed-2-1-pro-260915", previous_response_id=second_response.id, input=[{"role": "user", "content": "根据原文节选和 Della 刚写的日记,想象 Jame 读到这篇日记时会有怎样的感受。"}], extra_body={ "caching": {"type": "enabled"}, "thinking":{"type":"disabled"} } ) print(third_response) ``` **选项:Curl** 1. 创建缓存,并将内容写入。 ```Bash curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "input":[ { "role":"system", "content":"你是一名文学分析助手,回答需简洁明了,请根据下面内容分析《麦琪的礼物》相关问题。<麦琪的礼物小说内容>" }, { "role": "user", "content":"用5个简短的要点总结核心情节。" } ], "caching":{ "type":"enabled" }, "thinking": { "type": "disabled" } }' ``` 2. 在第二轮请求中,通过第一轮返回 id,来读取并使用缓存。 > 如需更新缓存,配置 `"caching":{"type":"enabled"}`,并使用返回的请求的 id。 ```Bash curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "input": "以 Della 的视角写一篇日记,描述其卖掉长发前的心情。", "caching":{ "type":"enabled" }, "thinking": { "type": "disabled" }, "previous_response_id": "" }' ``` 3. 在第三轮请求中,通过第二轮返回 id,来读取并使用缓存。 ```Bash curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "input": "根据原文节选和 Della 刚写的日记,想象 Jame 读到这篇日记时会有怎样的感受。", "caching":{ "type":"enabled" }, "thinking": { "type": "disabled" }, "previous_response_id": "" }' ``` ## 管理缓存 ### 控制存储 / 缓存生命周期 支持通过 `expire_at` 字段指定上下文存储(`store`)及上下文缓存(`caching`)过期时刻。当前最大可存储时间为 7 天,即当前 UTC Unix 时间戳 + 604800。当`当前时刻`超过`过期时刻`,则存储过期;不会随着缓存 / 存储的使用而重置缓存生命周期。 使用 Responses API 存储 / 缓存过期后,需通过 [Responses API](/docs/create-model-responses-api) 重新创建存储 / 缓存内容。 **选项:Python** ```Python import os from arkruntime import Ark import time # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key = os.getenv('ARK_API_KEY') client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) response = client.responses.create( model="doubao-seed-2-1-pro-260915", input=[ { "role": "system", "content": "Hello" } ], caching={"type": "enabled"}, thinking={"type": "disabled"}, expire_at=int(time.time()) + 3600, ) print(response.model_dump_json()) ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "time" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/responses" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() resp, err := client.CreateResponses(ctx, &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", Input: responses.NewInputItemArrayResponsesInput([]responses.InputItem{ easyMessage(responses.MessageRoleSystem, "Hello"), }), Caching: responses.NewOptResponseCaching(responses.ResponseCaching{Type: responses.NewOptCacheMode(responses.CacheModeEnabled)}), Thinking: responses.NewOptThinking(responses.Thinking{Type: responses.NewOptThinkingMode(responses.ThinkingModeDisabled)}), ExpireAt: responses.NewOptInt64(time.Now().Unix() + 3600), }) if err != nil { fmt.Printf("response error: %v", err) return } fmt.Println(resp) fmt.Println(resp.GetUsage()) } func easyMessage(role responses.MessageRole, content string) responses.InputItem { return responses.InputItem{ OneOf: responses.NewItemEasyMessageInputItemSum( responses.ItemEasyMessage{ Role: responses.NewOptMessageRole(role), Content: responses.NewStringMessageContent(content), }, ), } } ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.service.ArkService; import com.volcengine.ark.runtime.models.responses.*; import java.time.Instant; public class demo { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); // The base URL for model invocation ArkService arkService = ArkService.builder().apiKey(apiKey).baseUrl("https://ark.cn-beijing.volces.com/api/v3").build(); ResponsesRequest request = ResponsesRequest.builder() .model("doubao-seed-2-1-pro-260915") .input(ResponsesInput.ofList(java.util.Arrays.asList(ItemEasyMessage.builder().role(MessageRole.SYSTEM).content( MessageContent.ofString("Hello") ).build()))) .caching(ResponseCaching.builder().type(CacheMode.ENABLED).build()) .thinking(Thinking.builder().type(ThinkingMode.DISABLED).build()) .expireAt(Instant.now().getEpochSecond() + 3600) .build(); Response resp = arkService.createResponse(request); System.out.println(resp); System.out.println(resp.getUsage()); arkService.shutdownExecutor(); } } ``` **选项:OpenAI SDK** ```Python import os from openai import OpenAI import time # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key = os.getenv('ARK_API_KEY') client = OpenAI( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) response = client.responses.create( model="doubao-seed-2-1-pro-260915", input=[ { "role": "system", "content": "Hello" } ], extra_body={ "thinking":{"type":"disabled"}, "caching":{"type":"enabled"}, "expire_at": int(time.time()) + 3600 # The expiration time for storage and cache is 1 hour from the current time. } ) print(response.model_dump_json()) ``` **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "input":[ { "role":"system", "content":"Hello" } ], "expire_at":, "caching":{ "type":"enabled" }, "thinking": { "type": "disabled" } }' ``` ### 删除缓存 Responses API 支持根据 ID 删除缓存,与删除历史对话一致,便于根据业务自主控制缓存信息量,如删除不必要的缓存信息,减少冗余输入并降低成本。 **选项:Python** ```Python import os from arkruntime import Ark api_key = os.getenv('ARK_API_KEY') client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) response = client.responses.delete("resp_0217****") print(response) ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/responses" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() resp := client.DeleteResponse(ctx, &responses.ResponsesRemoveParams{ResponseId: "resp_0217****"}) fmt.Println() fmt.Println(resp) } ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.service.ArkService; import com.volcengine.ark.runtime.models.responses.*; public class demo { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); // The base URL for model invocation ArkService arkService = ArkService.builder().apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); DeleteResponseResponse deleteResult = arkService.deleteResponse( DeleteResponseRequest.builder().responseId("resp_0217****").build() ); System.out.println(deleteResult); arkService.shutdownExecutor(); } } ``` **选项:OpenAI SDK** ```Python from openai import OpenAI import os api_key = os.getenv('ARK_API_KEY') client = OpenAI( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) response = client.responses.delete("resp_0217****") print(response) ``` **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/responses/resp_0217**** \ -X DELETE \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" ``` 需注意,删除某轮缓存后,后续轮次缓存的信息在下次请求时会重新计算和存储。如下图所示(图中场景为第 5 轮请求后调用接口删除第 3 轮对话信息)。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/e82470faec7f446c94dfcb55810fe08e~tplv-goo7wpa0wc-image.image) > **注意** > > 删除某轮缓存后,后续轮次缓存的信息会在下一次请求时重新计算并重新存储。 第 6 轮请求时,4、5 轮信息将重新计算并缓存,此时其信息将作为输入,而非缓存输入进行计费。 ## 计费说明 显式缓存的计费项包括输入、缓存输入、缓存存储和输出,具体单价请参见 [模型价格](/docs/model-pricing)。 * **输入(元/千 Token)**:正在进行的对话中的新增文本,即在删除场景后,需重新计算和缓存的历史对话信息。 * **缓存输入(元/千 Token)**:输入为预先处理和缓存的内容,计费费率会显著低于新输入内容。 * **存储(元/千 Token/小时)**:历史对话存储在缓存中,会产生存储费用;按每个自然小时使用缓存的量乘以单价进行累加。 > **注意** > > - 存储费用在缓存创建时即产生,直到该缓存被手动删除或过期后停止计费。 > - 存储费用在每个自然小时整点出账,不足 1 小时按 1 小时计算。 * **输出(元/千 Token)**:模型根据输入信息生成的内容。计费方式与未使用 Session 缓存的调用方式一致。 每次请求的计费量可在返回的 `usage` 结构体中查看,具体查看 [Responses API](/docs/create-model-responses-api)。 ### 输入 Token 量 可以通过 `input_tokens - cached_tokens` 获得。 > **说明** > > 模型的输入内容会包含上一轮的思维链内容,输入 Tokens 量会增加。可以通过开启[上下文编辑](/docs/responses-api-context-editing)功能管理思维链内容和工具调用内容,控制输入 Tokens,其中命中的缓存为输入内容与上下文编辑后缓存内容的交集。 ### 存储费用 在请求中开启缓存后才会产生存储费用,即参数配置为 `"caching": {"type": "enabled"}`。按自然小时计算,该小时内每一轮请求产生的新增缓存 Token 量累加计算存储费用。 > 存储按自然小时计算,不足 1 小时会按 1 小时计算。 |维度 | 说明 | |---|---| |缓存内容 |缓存输入的内容。 | |请求示意图 |![new-202607221313.flowchart](https://arkdocs.tos-cn-beijing.volces.com/flowcharts/responses-api/new-202607221313.svg) | |单次请求计算逻辑 | * **缓存内容**: `输入的 token` | \ | |* **新增的缓存内容**:`当前轮次请求缓存内容 - 上一轮已缓存的内容` | \ | |* **缓存存储费用**:`在缓存有效期内,每小时存储费用为新增的缓存内容 token × 存储单价` | ### 费用计算 开启缓存后,一次请求 1 个小时的费用包含:请求产生的 Token 费用和缓存存储费用。计算公式如下。 ```plaintext = 输入花费 + 缓存输入花费 + 输出花费 = (input_tokens - cached_tokens) x 输入单价 + cached_tokens x 缓存输入单价 + output_tokens x 输出单价 ``` ```plaintext = 新增的缓存存储费用 = 新增的缓存内容 Token x 存储单价 = (当前轮次请求缓存内容 - 上一轮已缓存的内容) x 存储单价 ``` ## 工作原理 显式缓存支持两种类型,分别为前缀缓存和 Session 缓存。 ### 前缀缓存 存储初始信息,在每次对话时无需更新。可预先将角色设定、背景知识等初始化信息存入缓存,后续调用时通过缓存引用直接复用,无需重复发送相同内容,从而减少重复计算、降低使用成本。适用于标准化对话开场白、特定任务指令、规则化模板、超长文本深度分析等静态 Prompt 模板的反复使用场景。 |原理图 |说明 | |---|---| |![](https://arkdocs.tos-cn-beijing.volces.com/flowcharts/advanced-usage/principles-and-selection-03.svg) |1. 用户创建缓存时,方舟将信息处理为可直接用于模型推理的 Tokens 存入缓存,并生成 ID 作为 Key。 | \ | |2. 方舟收到新请求,计算好新输入的 Tokens,并根据请求中的缓存 ID 取对应信息 Tokens 拼接后输入给模型推理。 | \ | |3. 模型输出回复信息,无需更新缓存中的信息。 | ### Session 缓存 **存储初始信息**,同时**随每一轮对话动态更新缓存**。在新一轮请求,将缓存信息与输入信息一起输入给模型进行推理。适合在多轮对话、多轮工具调用等场景使用。 |原理图 |说明 | |---|---| |![](https://arkdocs.tos-cn-beijing.volces.com/flowcharts/advanced-usage/principles-and-selection-02.svg) |1. 用户创建缓存时,方舟将信息处理为可直接用于模型推理的 Tokens 存入缓存,并生成 ID 作为 Key。 | \ | |2. 方舟收到新请求,计算好新输入的 Tokens,并根据请求中的缓存 ID 取对应信息 Tokens 拼接后输入给模型推理。 | \ | |3. 模型返回信息,方舟**将回复信息的 Tokens 存储入缓存**中,供下次请求时使用。各模型版本实际写入缓存的内容存在差异,详见下方说明。 | > **说明** > > 缓存内容仅为本轮请求的**输入内容**,模型回复不会直接写入缓存。上一轮的模型回复及思维链内容会作为下一轮请求输入的一部分,随该轮开启缓存写入后进入缓存,因此输入 Tokens 量会增加。可通过上下文编辑功能管理思维链内容和工具调用内容,详见 [输入 Token 量](/docs/context-cache#input-token-count)。 # 常见问题 ## 显式缓存和隐式缓存能否同时生效? 不能。显式缓存与隐式缓存互斥;当请求使用显式缓存时,隐式缓存不生效。 ## 前缀缓存创建失败常见原因有哪些? 最常见的原因有三类:一是首轮未按要求配置 `"caching": {"type": "enabled", "prefix": true}`;二是输入 Tokens 小于 256;三是请求中设置了 `stream=true`。此外,前缀缓存的首轮默认依赖 `store=true`(缺省即为 true)。 ## 删除某轮缓存后会发生什么? 删除某轮缓存后,后续轮次缓存的信息会在下一次请求时重新计算并重新存储。对应内容将按输入而非缓存输入进行计费,直到新的缓存再次建立。 ## 如何判断隐式缓存是否命中? 查看响应中的 `usage.prompt_tokens_details.cached_tokens` 字段即可。大于 0 表示命中;等于 0 表示未命中。 --- # 文件输入(Files API) Source: https://ark.volcengine.com/region:cn-beijing/docs/file-api Files API 作为文件管理接口,提供文件的上传、检索、列表查询及删除能力。 在多模态理解场景中,Files API 与 Responses API、Chat API 结合使用,具备以下优势: - 大文件适配:文件存储在方舟平台托管的默认存储空间中时,支持最大 512 MB 文件的上传;文件存储在用户指定的火山引擎对象存储 TOS Bucket 中时,支持最大 2 GB 的视频文件的上传,从而满足大文件处理需求。 - 重复使用:支持通过 File ID 在多次请求中重复使用文件,避免重复上传,节省公网下载时延。 - 缩短推理时长:解耦数据预处理与模型推理环节,避免每次请求时重新上传内容,减少预处理导致的时延。 # 前提条件 [获取 API Key](https://ark.volcengine.com/region:cn-beijing/apiKey) # 查看 API 文档 [Files API 参考](/docs/upload-files-api) # Files API 使用示例 ## 上传文件 使用 Files API 可以上传图片、视频、音频、文档等类型的文件,上传成功后将返回 File ID。File ID 支持在多次请求中重复使用,而不需要重新上传内容,节省公网下载时延。如果文件大于 50 MB,或者要在多个请求中重复使用该文件,可以使用 Files API 上传文件,然后使用 File ID 发起请求。 文件存储位置由请求中 `tos` 参数决定,详情可参见[上传文件](/docs/upload-files-api)字段说明: * 未传入 `tos` 参数:文件存储至方舟平台托管的默认存储空间。 * 传入 `tos` 参数:文件存储至用户指定的火山引擎对象存储 TOS Bucket。 > 目标存储的火山引擎对象存储 TOS Bucket 需要在控制台完成授权后才能使用,具体参考[用户对象存储(TOS)授权](/docs/project-configuration#4eb1b277)。 > > ### 文件上传方式 Files API 支持二进制文件、文件 URL 两种方式上传文件。 * `file`(二进制文件):要上传的本地文件。文件可存储至方舟平台默认托管存储空间,或用户指定的火山引擎 TOS 存储桶。 * `url`(文件 URL):支持 HTTP/HTTPS URL、TOS URI 两种方式。 * HTTP/HTTPS URL:公网可直接访问的文件 URL,请确保文件 URL 可被访问。文件可存储至方舟平台默认托管存储空间,或用户指定的火山引擎 TOS 存储桶。 * TOS URI:对象存储 TOS 专属的资源定位标识,格式为 `tos:////`。使用该方式时,文件仅支持存储至火山引擎 TOS 存储桶。 #### file 上传方式 - 文件存储至方舟平台默认托管存储空间 **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/files \ -H "Authorization: Bearer $ARK_API_KEY" \ -F 'purpose=user_data' \ -F 'file=@/Users/doc/demo.mp4' \ -F 'preprocess_configs[video][fps]=0.3' ``` 响应参数如下: ```Bash { "object": "file", "id": "file-20251018114827-6zgrb", "purpose": "user_data", "filename": "demo.mp4", "bytes": 695110, "mime_type": "video/mp4", "created_at": 1760759307, "expire_at": 1761364107, "status": "processing", "preprocess_configs": { "video": { "fps": 0.3 } } } ``` **选项:Python SDK** ```Python import os from arkruntime import Ark client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=os.getenv('ARK_API_KEY') ) file = client.files.create( # replace with your local video path file=open("/Users/doc/demo.mp4", "rb"), purpose="user_data", preprocess_configs={ "video": { "fps": 0.3, # define the sampling fps of the video, default is 1.0 } } ) print(file) ``` **选项:Go SDK** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/file" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() data, err := os.Open("/Users/doc/demo.mp4") if err != nil { fmt.Printf("read file error: %v ", err) return } fileInfo, err := client.UploadFile(ctx, &file.FileCreateRequest{ Purpose: file.PurposeUserData, PreprocessConfigs: file.NewOptPreprocessConfigs(file.PreprocessConfigs{ Video: file.NewOptVideo(file.Video{ Fps: file.NewOptFloat64(0.3), }), }), }, data) if err != nil { fmt.Printf("upload file error: %v", err) return } fmt.Printf("file info: %v ", fileInfo) } ``` **选项:Java SDK** ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.file.*; import com.volcengine.ark.runtime.models.file.FileObject; import com.volcengine.ark.runtime.models.file.PreprocessConfigs; import com.volcengine.ark.runtime.models.file.FileCreateRequest; import com.volcengine.ark.runtime.models.file.Video; import com.volcengine.ark.runtime.service.ArkService; import java.io.File; public class demo { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); ArkService service = ArkService.builder().apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); System.out.println("===== Upload File Example====="); FileObject fileMeta; fileMeta = service.uploadFile(FileCreateRequest.builder() // replace with your video file path .purpose(Purpose.USER_DATA) .preprocessConfigs(PreprocessConfigs.builder().video(Video.builder().fps(0.3).build()).build()) .build(), new File("/Users/doc/demo.mp4")); System.out.println("Uploaded file Meta: " + fileMeta); service.shutdownExecutor(); } } ``` **选项:兼容 OpenAI SDK** ```Python import os from openai import OpenAI client = OpenAI( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=os.getenv('ARK_API_KEY') ) file = client.files.create( # replace with your local video path file=open("/Users/doc/demo.mp4", "rb"), purpose="user_data", extra_body={ "preprocess_configs":{ "video": { "fps": 0.3 } } } ) print(file) ``` - 文件存储至火山引擎对象存储 TOS Bucket: **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/files \ -H "Authorization: Bearer $ARK_API_KEY" \ -F 'purpose=user_data' \ -F 'file=@/Users/doc/demo.mp4' \ -F 'preprocess_configs[video][fps]=0.3' \ -F "tos[bucket]=my-bucket" \ -F "tos[prefix]=ark-files/" ``` **选项:Python SDK** ```Python import os from arkruntime import Ark client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=os.getenv('ARK_API_KEY') ) file = client.files.create( file=open("/Users/doc/demo.mp4", "rb"), purpose="user_data", preprocess_configs={ "video": { "fps": 0.3 } }, tos={ "bucket": "my-bucket", "prefix": "ark-files/" } ) print(file) ``` **选项:Go SDK** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/file" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() data, err := os.Open("/Users/doc/demo.mp4") if err != nil { fmt.Printf("read file error: %v ", err) return } fileInfo, err := client.UploadFile(ctx, &file.FileCreateRequest{ Purpose: file.PurposeUserData, Tos: file.NewOptTosStorage(file.TosStorage{ Bucket: file.NewOptString("my-bucket"), Prefix: file.NewOptString("ark-files/"), }), PreprocessConfigs: file.NewOptPreprocessConfigs(file.PreprocessConfigs{ Video: file.NewOptVideo(file.Video{ Fps: file.NewOptFloat64(0.3), }), }), }, data) if err != nil { fmt.Printf("upload file error: %v", err) return } fmt.Printf("file info: %v ", fileInfo) } ``` **选项:Java SDK** ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.file.*; import com.volcengine.ark.runtime.service.ArkService; import java.io.File; public class demo { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); ArkService service = ArkService.builder() .apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); System.out.println("===== Upload File Example ====="); FileObject fileMeta; fileMeta = service.uploadFile(FileCreateRequest.builder() .purpose(Purpose.USER_DATA) .tos(TosStorage.builder() .bucket("my-bucket") .prefix("ark-files/") .build()) .preprocessConfigs(PreprocessConfigs.builder() .video(Video.builder().fps(0.3).build()) .build()) .build(), new File("/Users/doc/demo.mp4")); System.out.println("Uploaded file Meta: " + fileMeta); service.shutdownExecutor(); } } ``` #### HTTP/HTTPS URL 上传方式 - 文件存储至方舟平台默认托管存储空间 **选项:Curl** ```Bash curl -X POST "https://ark.cn-beijing.volces.com/api/v3/files" \ -H "Authorization: Bearer $ARK_API_KEY" \ -F "purpose=user_data" \ -F "url=https://example.com/docs/demo_img.png" ``` **选项:Python SDK** ```Python import os from arkruntime import Ark client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=os.getenv('ARK_API_KEY') ) file = client.files.create( purpose="user_data", url="https://example.com/docs/demo_img.png" ) print(file) ``` **选项:Go SDK** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/file" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() fileInfo, err := client.UploadFile(ctx, &file.FileCreateRequest{ Purpose: file.PurposeUserData, URL: file.NewOptString("https://example.com/docs/demo_img.png"), }, nil) if err != nil { fmt.Printf("upload file error: %v", err) return } fmt.Printf("file info: %v ", fileInfo) } ``` **选项:Java SDK** ```Java package com.ark.sample; import com.volcengine.ark.runtime.model.files.*; import com.volcengine.ark.runtime.service.ArkService; public class demo { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); ArkService service = ArkService.builder() .apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); System.out.println("===== Upload File Example ====="); FileMeta fileMeta; try { fileMeta = service.uploadFile( UploadFileRequest.builder() .url("https://example.com/docs/demo_img.png") .purpose("user_data") .build()); System.out.println("Uploaded file Meta: " + fileMeta); } catch (Exception e) { e.printStackTrace(); } service.shutdownExecutor(); } } ``` - 文件存储至火山引擎对象存储 TOS Bucket **选项:Curl** ```Bash curl -X POST "https://ark.cn-beijing.volces.com/api/v3/files" \ -H "Authorization: Bearer $ARK_API_KEY" \ -F "purpose=user_data" \ -F "url=https://example.com/docs/demo_img.png" \ -F "tos[bucket]=my-bucket" \ -F "tos[prefix]=ark-files/" ``` **选项:Python SDK** ```Python import os from arkruntime import Ark client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=os.getenv('ARK_API_KEY') ) file = client.files.create( url="https://example.com/docs/demo_img.png", purpose="user_data", tos={ "bucket": "my-bucket", "prefix": "ark-files/" } ) print(file) ``` **选项:Go SDK** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/file" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() fileInfo, err := client.UploadFile(ctx, &file.FileCreateRequest{ Purpose: file.PurposeUserData, URL: file.NewOptString("https://example.com/docs/demo_img.png"), Tos: file.NewOptTosStorage(file.TosStorage{ Bucket: file.NewOptString("my-bucket"), Prefix: file.NewOptString("ark-files/"), }), }, nil) if err != nil { fmt.Printf("upload file error: %v", err) return } fmt.Printf("file info: %v ", fileInfo) } ``` **选项:Java SDK** ```Java package com.ark.sample; import com.volcengine.ark.runtime.model.files.*; import com.volcengine.ark.runtime.service.ArkService; public class demo { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); ArkService service = ArkService.builder() .apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); System.out.println("===== Upload File Example ====="); FileMeta fileMeta; try { fileMeta = service.uploadFile( UploadFileRequest.builder() .url("https://example.com/docs/demo_img.png") .purpose("user_data") .tos(TosStorage.builder() .bucket("my-bucket") .prefix("ark-files/") .build()) .build()); System.out.println("Uploaded file Meta: " + fileMeta); } catch (Exception e) { e.printStackTrace(); } service.shutdownExecutor(); } } ``` #### TOS URI 上传方式 传入 TOS URI 时,必须将文件存储到火山引擎对象存储 TOS Bucket 中。其中: * `url` 用于指定待读取的源文件位置,即火山引擎对象存储 TOS Bucket 中的已有文件。 * `tos[bucket]` 和 `tos[prefix]` 用于指定上传文件至火山引擎对象存储 TOS Bucket 中的存储桶和存储路径。 **选项:Curl** ```Bash curl -X POST "https://ark.cn-beijing.volces.com/api/v3/files" \ -H "Authorization: Bearer $ARK_API_KEY" \ -F "purpose=user_data" \ -F "url=tos://my-bucket/source/raw_video.mp4" \ -F "tos[bucket]=my-bucket" \ -F "tos[prefix]=ark-files/" ``` **选项:Python SDK** ```Python import os from arkruntime import Ark client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=os.getenv('ARK_API_KEY') ) file = client.files.create( url="tos://my-bucket/source/raw_video.mp4", purpose="user_data", tos={ "bucket": "my-bucket", "prefix": "ark-files/" } ) print(file) ``` **选项:Go SDK** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/file" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() fileInfo, err := client.UploadFile(ctx, &file.FileCreateRequest{ Purpose: file.PurposeUserData, URL: file.NewOptString("tos://my-bucket/source/raw_video.mp4"), Tos: file.NewOptTosStorage(file.TosStorage{ Bucket: file.NewOptString("my-bucket"), Prefix: file.NewOptString("ark-files/"), }), }, nil) if err != nil { fmt.Printf("upload file error: %v", err) return } fmt.Printf("file info: %v ", fileInfo) } ``` **选项:Java SDK** ```Java package com.ark.sample; import com.volcengine.ark.runtime.model.files.*; import com.volcengine.ark.runtime.service.ArkService; public class demo { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); ArkService service = ArkService.builder() .apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); System.out.println("===== Upload File Example ====="); FileMeta fileMeta; try { fileMeta = service.uploadFile( UploadFileRequest.builder() .url("tos://my-bucket/source/raw_video.mp4") .purpose("user_data") .tos(TosStorage.builder() .bucket("my-bucket") .prefix("ark-files/") .build()) .build()); System.out.println("Uploaded file Meta: " + fileMeta); } catch (Exception e) { e.printStackTrace(); } service.shutdownExecutor(); } } ``` 在大视频理解场景下,通过 Files API 以 `url` 方式上传,并传入 `tos` 参数时,视频文件单文件最大支持 2GB(该能力仅适用于视频文件,其他类型文件容量限制仍保持 512 MB)。文件上传后会进入异步处理流程,需待文件状态变为 active 后方可使用。 **选项:Curl** ```Bash curl -X POST "https://ark.cn-beijing.volces.com/api/v3/files" \ -H "Authorization: Bearer $ARK_API_KEY" \ -F "purpose=user_data" \ -F "url=tos://my-bucket/videos/long-video.mp4" \ -F "tos[bucket]=my-bucket" \ -F "tos[prefix]=ark-files/" \ -F "preprocess_configs[video][model]=doubao-seed-2-1-pro-260915" \ -F "preprocess_configs[video][max_video_tokens]=200000" \ -F "preprocess_configs[video][min_frames]=16" ``` **选项:Python SDK** ```Python import os from arkruntime import Ark client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=os.getenv('ARK_API_KEY') ) file = client.files.create( url="tos://my-bucket/videos/long-video.mp4", purpose="user_data", tos={ "bucket": "my-bucket", "prefix": "ark-files/" }, preprocess_configs={ "video": { "model": "doubao-seed-2-1-pro-260915", "max_video_tokens": 200000, "min_frames": 16 } } ) print(file) ``` **选项:Go SDK** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/volcengine-go-sdk/service/arkruntime" "github.com/volcengine/volcengine-go-sdk/service/arkruntime/model/file" "github.com/volcengine/volcengine-go-sdk/volcengine" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() fileInfo, err := client.UploadFile(ctx, &file.UploadFileRequest{ Purpose: file.PurposeUserData, URL: volcengine.String("tos://my-bucket/videos/long-video.mp4"), Tos: &file.TosStorage{ Bucket: volcengine.String("my-bucket"), Prefix: volcengine.String("ark-files/"), }, PreprocessConfigs: &file.PreprocessConfigs{ Video: &file.Video{ Model: volcengine.String("doubao-seed-2-1-pro-260915"), MaxVideoTokens: volcengine.Int64(200000), MinFrames: volcengine.Int64(16), }, }, }) if err != nil { fmt.Printf("upload file error: %v", err) return } fmt.Printf("file info: %v ", fileInfo) } ``` **选项:Java SDK** ```Java package com.ark.sample; import com.volcengine.ark.runtime.model.files.*; import com.volcengine.ark.runtime.service.ArkService; public class demo { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); ArkService service = ArkService.builder() .apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); System.out.println("===== Upload File Example ====="); FileMeta fileMeta; try { fileMeta = service.uploadFile( UploadFileRequest.builder() .url("tos://my-bucket/videos/long-video.mp4") .purpose("user_data") .tos(TosStorage.builder() .bucket("my-bucket") .prefix("ark-files/") .build()) .preprocessConfigs(PreprocessConfigs.builder() .video(Video.builder() .model("doubao-seed-2-1-pro-260915") .maxVideoTokens(200000L) .minFrames(16L) .build()) .build()) .build()); System.out.println("Uploaded file Meta: " + fileMeta); } catch (Exception e) { e.printStackTrace(); } service.shutdownExecutor(); } } ``` ### 文件存储限制 |对比项 |方舟平台托管的默认存储空间 |火山引擎对象存储 TOS Bucket | |---|---|---| |授权要求 |无需额外授权。 |目标存储 Bucket 需要在控制台完成授权后才能使用,参考[用户对象存储(TOS)授权](/docs/project-configuration#4eb1b277)。 | \ | | | | |单文件大小 |512 MB |视频文件 2 GB,其他类型文件 512 MB | |总存储容量 |20 GB |无限制 | | 存储时间 | 默认存储 7 天,支持通过 **expire_at** 参数自定义存储有效期,取值范围为 1-30 天。 | 默认存储 7 天,支持通过 **expire_at** 参数自定义存储有效期,取值范围为 1-30 天。 | \ | |> 针对高频存储场景,建议通过缩短文件存储时长、主动调用删除接口清理低频文件这两种方式,做好存储空间的主动管理。 | | |对象操作限制 |如需删除文件,请调用 Files API 删除,参考[删除文件](/docs/delete-files-api)。 |对象被托管后,仅支持读取,不支持通过 TOS 控制台或 TOS API 删除、覆盖或修改对象。命中该对象的生命周期删除、覆盖式复制等异步写、删、改操作,同样受到托管保护限制。如需删除文件,请调用 Files API 删除。参考[删除文件](/docs/delete-files-api)。 | ### 文件预处理 使用 Files API 上传文件时,接口会根据上传的文件类型进行预处理。 * 视频文件:默认会按 1 帧/秒(FPS)的速率提取选段,可通过 **preprocess_configs.video.fps** 设置自定义帧速率。长视频且画面变化较小时,可设置较低的 FPS 值;需精细捕捉画面变化时,可设置较高的 FPS 值。同时可通过`min_frame_tokens`、`max_frame_tokens`、`max_video_tokens` 用于控制单帧压缩与整体视频信息保留策略。文件预处理后,在 Responses API 中使用 File ID,可以缩短推理时长。 * PDF 文件:会分页来处理成多图,在预处理时不会对拆分的图片做分辨率缩放,以确保图片能够完整且清晰地保留 PDF 文件中的原始信息。 > **说明** > > 传入 `tos` 参数时,文件预处理产物将保存至参数指定的 TOS 路径。例如,若请求中配置 `tos[bucket]=my-bucket`、`tos[prefix]=ark-files/`,则预处理产物存储路径为 `my-bucket/ark-files/ark_processed/{file_id}/` 目录下,其中 `{file_id}` 为本次上传文件的 ID。 ### 预处理超时限制 使用 Files API 进行文件预处理的超时限制为 5 min,超时通常会受视频时长、PDF 页数、单页像素、单帧像素、音频时长等因素影响。 **超时解决方案**: 优先检查是否存在像素过大的问题,其中对 1080p 视频抽帧操作容易导致超时,建议压缩至 720p 及以下。 > 模型推理阶段会压缩分辨率,所以提升原始像素对最终效果无增益。 **视频压缩工具及命令** 将视频文件压缩至 720p 的命令示例如下。FFmpeg 工具下载可参见 [下载FFmpeg](https://ffmpeg.org/download.html)。 ```Bash ffmpeg -i input.mp4 \ -vf "scale=1280:720" \ -c:v libx264 -crf 23 \ -c:a aac -b:a 128k \ output_720p.mp4 ``` ### 文件类型 Files API 支持多种文件类型,具体如下。 | 文件类型 | 文件格式 | MIME 类型 | |---|---|---| |图片 |.jpg、.jpeg、.png、.gif、.webp、.bmp、.tiff、.ico、.icns、.sgi、.jp2、.heic、.heif |`image/jpeg`、`image/png`、`image/gif`、`image/webp`、`image/bmp`、`image/tiff`、`image/x-icon`、`image/x-icns`、`image/sgi`、`image/jp2`、`image/heic`、`image/heic` | |视频 |.mp4、.avi、.mov |`video/mp4`、`video/x-msvideo`、`video/quicktime` | |文档 |.pdf |`application/pdf` | |音频 |.mp3、.wav、.aac、.m4a |`audio/mpeg`、`audio/wav`、`audio/aac`、`audio/x-m4a` | > **说明** > > 常见问题及解决方案参见[支持 TS 格式的视频文件吗?](/docs/modelark-faq#85251eec) ## 管理文件 ### 检索文件 通过 File ID 检索文件信息,如文件大小、过期时间、MIME 类型及文件处理状态等信息,可参见 [检索文件](/docs/search-files-api) 接口说明。 > 文件上传成功后将自动触发预处理流程。接口返回 `file_id` 后,可通过调用检索文件接口查询文件处理状态;当状态 `status` 变为 `active` 时,才可以在 Responses API、Chat API 中通过 `file_id` 方式实现多模态理解。 **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/files/file-20251119**** \ -H "Authorization: Bearer $ARK_API_KEY" ``` **选项:Python SDK** ```Python import os from arkruntime import Ark # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key = os.getenv('ARK_API_KEY') client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) # Retrieve file response = client.files.retrieve( file_id="file-20251119****" ) print(response) ``` **选项:Go SDK** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() fileInfo, err := client.RetrieveFile(ctx, "file-20251119****") if err != nil { fmt.Printf("get file status error: %v", err) return } fmt.Printf("file info: %v", fileInfo) } ``` **选项:Java SDK** ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.file.*; import com.volcengine.ark.runtime.service.ArkService; public class demo { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); ArkService service = ArkService.builder().apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); // Retrieve the file metadata. FileObject fileMeta = service.retrieveFile("file-20251119****"); System.out.println("Retrieve File:" + fileMeta); service.shutdownExecutor(); } } ``` **选项:兼容 OpenAI SDK** ```Python import os from openai import OpenAI api_key = os.getenv('ARK_API_KEY') client = OpenAI( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) # Retrieve the file metadata. response = client.files.retrieve( file_id="file-20251119****" ) print(response) ``` ### 查询文件列表 通过 Files API 查询已上传的文件列表,可参考[查询文件列表](/docs/list-files-api)接口说明。 **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/files \ -H "Authorization: Bearer $ARK_API_KEY" ``` **选项:Python SDK** ```Python import os from arkruntime import Ark api_key = os.getenv('ARK_API_KEY') client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) response = client.files.list() print(response) ``` **选项:Go SDK** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/file" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() fileInfo, err := client.ListFiles(ctx, &file.FilesListParams{}) if err != nil { fmt.Printf("get file List error: %v", err) return } fmt.Printf("file List: %v", fileInfo) } ``` **选项:Java SDK** ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.file.*; import com.volcengine.ark.runtime.service.ArkService; public class demo { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); ArkService service = ArkService.builder().apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); FileListRequest request = new FileListRequest(); FileListResponse listFiles = service.listFiles(request); System.out.println("List Files:" + listFiles); service.shutdownExecutor(); } } ``` **选项:兼容 OpenAI SDK** ```Python import os from openai import OpenAI api_key = os.getenv('ARK_API_KEY') client = OpenAI( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) response = client.files.list() print(response) ``` ### 删除文件 删除文件接口用于根据文件 ID 删除文件,并将文件从存储空间中移除,可参考[删除文件](/docs/delete-files-api)接口说明。 针对高频存储场景,做好存储空间管理的方式如下。存储限制,具体参见[文件存储限制](/docs/file-api#d75377d6)。 * 缩短文件存储时长:上传成功的文件默认存储 7 天,可以通过 **expire_at** 参数自定义存储有效期,取值范围为 1-30 天。文件超过存储有效期后会自动删除,参数设置请参见[上传文件](/docs/upload-files-api)。 * 主动调用删除接口清理低频文件:通过 Files API 删除已上传的文件,使用示例如下。 **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/files/file-20251014**** \ -X DELETE \ -H "Authorization: Bearer $ARK_API_KEY" ``` **选项:Python SDK** ```Python import os from arkruntime import Ark api_key = os.getenv('ARK_API_KEY') client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) if __name__ == "__main__": try: response = client.files.delete( file_id="file-20251014****" ) print(response) except Exception as e: print(f"failed to delete response: {e}") ``` **选项:Go SDK** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() fileInfo, err := client.DeleteFile(ctx, "file-20251014****") if err != nil { fmt.Printf("delete file error: %v", err) return } fmt.Printf(" delete file: %v", fileInfo) } ``` **选项:Java SDK** ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.file.*; import com.volcengine.ark.runtime.service.ArkService; public class demo { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); ArkService service = ArkService.builder().apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); // Delete the file. FileDeleted deleteFile = service.deleteFile("file-20251014****"); System.out.println("Delete File:" + deleteFile); service.shutdownExecutor(); } } ``` **选项:兼容 OpenAI SDK** ```Python import os from openai import OpenAI api_key = os.getenv('ARK_API_KEY') client = OpenAI( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) if __name__ == "__main__": try: response = client.files.delete( file_id="file-20251014****" ) print(response) except Exception as e: print(f"failed to delete response: {e}") ``` # 使用 File ID 实现多模态理解 针对文件较大或需在多次请求中重复使用该文件的场景,建议通过 Files API 上传文件,然后在 Responses API、Chat API 中使用 File ID 的方式实现多模态理解。具体示例参见 [视频理解](/docs/multimodal-understanding#098ef3d4)、[图片理解](/docs/multimodal-understanding#70e09284)、[文档理解](/docs/multimodal-understanding#18a762a5)、[音频理解](/docs/audio-understanding)。 上传文件后,需等待文件处理完成后(即 **status** 为 active 时)才能在 Responses API、Chat API 中使用对应的 File ID 进行分析。下面是视频理解的示例代码。 **选项:cURL** 1. 上传视频文件获取 File ID。 ```Bash curl https://ark.cn-beijing.volces.com/api/v3/files \ -H "Authorization: Bearer $ARK_API_KEY" \ -F 'purpose=user_data' \ -F 'file=@/Users/doc/demo.mp4' \ -F 'preprocess_configs[video][fps]=0.3' ``` 2. 在 Responses API 中引用 File ID。 ```Bash curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Authorization: Bearer $ARK_API_KEY" \ -H 'Content-Type: application/json' \ -d '{ "model": "doubao-seed-2-1-pro-260915", "input": [ { "role": "user", "content": [ { "type": "input_file", "file_id": "file-20251018****" }, { "type": "input_text", "text": "请你描述下视频中的人物的一系列动作,以JSON格式输出开始时间(start_time)、结束时间(end_time)、事件(event)、是否危险(danger),请使用HH:mm:ss表示时间戳。" } ] } ] }' ``` **选项:Python SDK** ```Python import asyncio import os from arkruntime import AsyncArk from arkruntime.types.responses.response_completed_event import ResponseCompletedEvent from arkruntime.types.responses.response_reasoning_summary_text_delta_event import ResponseReasoningSummaryTextDeltaEvent from arkruntime.types.responses.response_output_item_added_event import ResponseOutputItemAddedEvent from arkruntime.types.responses.response_text_delta_event import ResponseTextDeltaEvent from arkruntime.types.responses.response_text_done_event import ResponseTextDoneEvent client = AsyncArk( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=os.getenv('ARK_API_KEY') ) async def main(): # upload video file print("Upload video file") file = await client.files.create( # replace with your local video path file=open("/Users/doc/demo.mp4", "rb"), purpose="user_data", preprocess_configs={ "video": { "model": "doubao-seed-2-1-pro-260915", "fps": 0.3, # define the sampling fps of the video, default is 1.0 } } ) print(f"File uploaded: {file.id}") # Wait for the file to finish processing await client.files.wait_for_processing(file.id) print(f"File processed: {file.id}") stream = await client.responses.create( model="doubao-seed-2-1-pro-260915", input=[ {"role": "user", "content": [ { "type": "input_video", "file_id": file.id # ref video file id }, { "type": "input_text", "text": "请你描述下视频中的人物的一系列动作,以JSON格式输出开始时间(start_time)、结束时间(end_time)、事件(event)、是否危险(danger),请使用HH:mm:ss表示时间戳。" } ]}, ], caching={ "type": "enabled", }, store=True, stream=True ) async for event in stream: if isinstance(event, ResponseReasoningSummaryTextDeltaEvent): print(event.delta, end="") if isinstance(event, ResponseOutputItemAddedEvent): print("\noutPutItem " + event.type + " start:") if isinstance(event, ResponseTextDeltaEvent): print(event.delta,end="") if isinstance(event, ResponseTextDoneEvent): print("\noutPutTextDone.") if isinstance(event, ResponseCompletedEvent): print("Response Completed. Usage = " + event.response.usage.model_dump_json()) if __name__ == "__main__": asyncio.run(main()) ``` **选项:Go SDK** ```Go package main import ( "context" "fmt" "io" "os" "time" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/file" "github.com/volcengine/ark-runtime-go/arkruntime/model/responses" ) func main() { client := arkruntime.NewClientWithApiKey( // Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() fmt.Println("----- upload video data -----") data, err := os.Open("/Users/doc/demo.mp4") if err != nil { fmt.Printf("read file error: %v\n", err) return } fileInfo, err := client.UploadFile(ctx, &file.FileCreateRequest{ Purpose: file.PurposeUserData, PreprocessConfigs: file.NewOptPreprocessConfigs(file.PreprocessConfigs{ Video: file.NewOptVideo(file.Video{ Model: file.NewOptString("doubao-seed-2-1-pro-260915"), Fps: file.NewOptFloat64(0.3), }), }), }, data) if err != nil { fmt.Printf("upload file error: %v", err) return } // Wait for the file to finish processing for fileInfo.Status == file.StatusProcessing { fmt.Println("Waiting for video to be processed...") time.Sleep(2 * time.Second) fileInfo, err = client.RetrieveFile(ctx, fileInfo.ID) // Retrieve file info if err != nil { fmt.Printf("get file status error: %v", err) return } } fmt.Printf("Video processing completed: %s, status: %s\n", fileInfo.ID, fileInfo.Status) inputMessage := responses.InputItem{ OneOf: responses.NewItemEasyMessageInputItemSum( responses.ItemEasyMessage{ Role: responses.NewOptMessageRole(responses.MessageRoleUser), Content: responses.NewContentItemArrayMessageContent( []responses.ContentItem{ responses.ContentItem{OneOf: responses.NewContentItemVideoContentItemSum(responses.ContentItemVideo{Type: responses.ContentItemVideoTypeInputVideo, VideoURL: "", FileID: responses.NewOptString(fileInfo.ID)})}, responses.ContentItem{OneOf: responses.NewContentItemTextContentItemSum(responses.ContentItemText{Type: responses.ContentItemTextTypeInputText, Text: "请你描述下视频中的人物的一系列动作,以JSON格式输出开始时间(start_time)、结束时间(end_time)、事件(event)、是否危险(danger),请使用HH:mm:ss表示时间戳。"})}, }, ), }, ), } createResponsesReq := &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", Input: responses.NewInputItemArrayResponsesInput([]responses.InputItem{inputMessage}), } resp, err := client.CreateResponsesStream(ctx, createResponsesReq) if err != nil { fmt.Printf("stream error: %v\n", err) return } var responseId string for { event, err := resp.Recv() if err == io.EOF { break } if err != nil { fmt.Printf("stream error: %v\n", err) return } handleEvent(event) if event.OneOf.Type == responses.ResponseCreatedEventResponseStreamEventSum { responseId = event.OneOf.ResponseCreatedEvent.Response.ID fmt.Printf("Response ID: %s", responseId) } } } func handleEvent(event *responses.ResponseStreamEvent) { switch event.OneOf.Type { case responses.ResponseReasoningSummaryTextDeltaEventResponseStreamEventSum: print(event.OneOf.ResponseReasoningSummaryTextDeltaEvent.Delta.Or("")) case responses.ResponseReasoningSummaryTextDoneEventResponseStreamEventSum: fmt.Printf("\nAggregated reasoning text: %s\n", event.OneOf.ResponseReasoningSummaryTextDoneEvent.Text.Or("")) case responses.ResponseTextDeltaEventResponseStreamEventSum: print(event.OneOf.ResponseTextDeltaEvent.Delta.Or("")) case responses.ResponseTextDoneEventResponseStreamEventSum: fmt.Printf("\nAggregated output text: %s\n", event.OneOf.ResponseTextDoneEvent.Text.Or("")) } } ``` **选项:Java SDK** ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.file.*; import com.volcengine.ark.runtime.service.ArkService; import com.volcengine.ark.runtime.models.responses.*; import java.io.File; import java.util.concurrent.TimeUnit; public class demo { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); ArkService service = ArkService.builder().apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); System.out.println("===== Upload File Example====="); // upload a video for responses FileObject fileMeta; fileMeta = service.uploadFile(FileCreateRequest.builder() // replace with your video file path .purpose(Purpose.USER_DATA) .preprocessConfigs(PreprocessConfigs.builder().video(Video.builder().model("doubao-seed-2-1-pro-260915").fps(0.3).build()).build()) .build(), new File("/Users/doc/demo.mp4")); System.out.println("Uploaded file Meta: " + fileMeta); System.out.println("status:" + fileMeta.getStatus()); try { while ("processing".equalsIgnoreCase(fileMeta.getStatus().toString())) { System.out.println("Waiting for video to be processed..."); TimeUnit.SECONDS.sleep(2); fileMeta = service.retrieveFile(fileMeta.getId()); } } catch (Exception e) { System.err.println("get file status error:" + e.getMessage()); } System.out.println("Uploaded file Meta: " + fileMeta); ResponsesRequest request = ResponsesRequest.builder() .model("doubao-seed-2-1-pro-260915") .stream(true) .input(ResponsesInput.ofList(java.util.Arrays.asList(ItemEasyMessage.builder().role(MessageRole.USER).content( MessageContent.ofList(java.util.Arrays.asList(ContentItemVideo.builder().fileId(fileMeta.getId()).build(), ContentItemText.builder().text("请你描述下视频中的人物的一系列动作,以JSON格式输出开始时间(start_time)、结束时间(end_time)、事件(event)、是否危险(danger),请使用HH:mm:ss表示时间戳。").build())) ).build()))) .build(); service.streamResponse(request) .doOnError(Throwable::printStackTrace) .blockingForEach(event -> { if (event instanceof ResponseReasoningSummaryTextDeltaEvent) { System.out.print(((ResponseReasoningSummaryTextDeltaEvent) event).getDelta()); } if (event instanceof ResponseOutputItemAddedEvent) { System.out.println("\nOutputItem " + (((ResponseOutputItemAddedEvent) event).getItem().getType()) + " Start: "); } if (event instanceof ResponseTextDeltaEvent) { System.out.print(((ResponseTextDeltaEvent) event).getDelta()); } if (event instanceof ResponseTextDoneEvent) { System.out.println("\nOutputText End."); } if (event instanceof ResponseOutputItemDoneEvent) { System.out.println("\nOutputItem " + ((ResponseOutputItemDoneEvent) event).getItem().getType() + " End."); } if (event instanceof ResponseFunctionCallArgumentsDoneEvent) { System.out.println("\nFunctionCall Arguments: " + ((ResponseFunctionCallArgumentsDoneEvent) event).getArguments()); } if (event instanceof ResponseCompletedEvent) { System.out.println("\nResponse Completed. Usage = " + ((ResponseCompletedEvent) event).getResponse().getUsage()); } }); service.shutdownExecutor(); } } ``` **选项:兼容 OpenAI SDK** ```Python import os import time from openai import OpenAI api_key = os.getenv('ARK_API_KEY') client = OpenAI( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) file = client.files.create( file=open("/Users/doc/demo.mp4", "rb"), purpose="user_data", extra_body={ "preprocess_configs": { "video": { "model": "doubao-seed-2-1-pro-260915", "fps": 0.3, } } }, ) # Wait for the file to finish processing while (file.status == "processing"): time.sleep(2) file = client.files.retrieve(file.id) print(f"File processed: {file}") response = client.responses.create( model="doubao-seed-2-1-pro-260915", input=[ { "role": "user", "content": [ { "type": "input_video", "file_id": file.id, }, { "type": "input_text", "text": "请你描述下视频中的人物的一系列动作,以JSON格式输出开始时间(start_time)、结束时间(end_time)、事件(event)、是否危险(danger),请使用HH:mm:ss表示时间戳。", }, ] } ], stream=True ) for event in response: if event.type == "response.reasoning_summary_text.delta": print(event.delta, end="") if event.type == "response.output_item.added": print("\noutPutItem " + event.type + " start:") if event.type == "response.output_text.delta": print(event.delta,end="") if event.type == "response.output_item.done": print("\noutPutTextDone.") if event.type == "response.completed": print("\nResponse Completed. Usage = " + event.response.usage.model_dump_json()) ``` # 计费说明 Files API 提供的上传文件、管理文件等能力均不会产生费用。 上传的文件根据存储位置的不同,计费信息如下: * 文件存储在方舟平台托管的默认存储空间:每个账户有 20 GB 免费存储额度,超出后无法上传文件,删除文件释放存储空间后可继续上传文件。 * 文件存储在用户指定的火山引擎对象存储 TOS Bucket:将产生存储容量、流量、请求次数、数据取回等费用,详细计费规则参考 [对象托管](https://docs.volcengine.com/docs/6349/2532373?lang=zh#Mv2UN2Bn)。 # 使用限制及错误码 * Files API QPS 限流及带宽限制如下。 * 上传文件:20 QPS、100 Mbps 带宽 * 检索文件:20 QPS * 查询文件列表:20 QPS * 删除文件:20 QPS * 错误码:单击[错误码](/docs/error-codes),获取相关信息。 --- # GUI Agent 能力 Source: https://ark.volcengine.com/region:cn-beijing/docs/gui-task-processing 本文介绍如何使用方舟接口调用模型,构建 GUI Agent 应用,实现基于界面截图和提示词解析出可执行的动作意图。本文提供两种用法:**GUI Agent 输出离散动作**、**纯 Grounding 单步定位**,其中调用使用原生 OpenAI SDK(不传 tools),动作解析使用 `ui-tars` 官方解析器。 > **说明** > > 方舟平台的新用户?获取 API Key 及 开通模型等准备工作,请参见 [快速入门](/docs/quick-start)。 # 支持模型 Doubao Seed 系列模型。 # 任务流程:观察-决策-动作的回环 ## 任务流程图 让模型像人一样操作图形界面:**看**屏幕截图 → **想**下一步做什么 → **动手**执行 → 再看新的屏幕……如此循环,直到任务完成。 ![new-202607160244.flowchart](https://arkdocs.tos-cn-beijing.volces.com/flowcharts/domain-models/new-202607160244.svg) > 任务结束:输出纯文本且不含 `` 时,视为任务完成并结束回环,该纯文本即为最终答案。 本文给到的两种用法: - **GUI Agent(方式一)**:会执行上述步骤1-4,其中步骤4会解析成可执行动作,未将动作打到真实设备。 - **纯 Grounding(方式二)**:只执行上述步骤1-3,输出 `click` 坐标。 ## 关键约定 ### 不传 tools 调用 `chat.completions.create` 时 **不要** 传 `tools` 参数。 **原理**:模型经训练会按 system prompt 里的动作说明,把动作块 **直接写进 `message.content`**,形如: ```xml 900 11 ``` 思维链在独立字段 `message.reasoning_content`(`content` 里没有 `` 外壳)。若你传了 `tools`,会走 OpenAI function calling,输出格式完全不同,与本指南不兼容。 ### 坐标转换 所有点击 / 拖拽类坐标都是 **0–1000 的相对坐标**,与截图分辨率无关。 **原理**:模型输出 `x y`,其中 x、y 都在 [0, 999] 归一化空间内。相对坐标映射回真实像素的公式: ```text px = round(x / 1000 * width) py = round(y / 1000 * height) ``` # 使用方式及选型 | 用法 | 步骤 | 是否跑回环 | 要解决的问题 | 示例 | |-|-|-|-|-| | **GUI Agent 用法** | 观察→决策→动作→再观察,循环推进 | 多轮回环 | 让模型自主一步步操作 GUI 直到完成任务 | [方式一](/docs/gui-task-processing#e0c7b24a) | | **纯 Grounding 用法** | 给指令 + 截图,一次输出一个 click 坐标 | 单步,无回环 | 给定意图,只想找到目标元素在屏幕上的坐标 | [方式二](/docs/gui-task-processing#d17c5a80) | # 快速上手 ## 代码示例 下面是本文用到的代码示例,可下载到本地按运行步骤快速体验。 [seed_cua_best_practice.zip](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/aea73f5db2464b1e9eb496beabb6c169~tplv-goo7wpa0wc-image.image) ## 运行步骤 1. 安装依赖 ```Bash pip install -r requirements.txt ``` 2. 配置凭证 ```Bash cp .env.example .env ``` 编辑 .env 文件,填写以下信息: - ARK_API_KEY:[获取 API Key](https://ark.volcengine.com/region:cn-beijing/apiKey) - ARK_MODEL:[选择 Doubao Seed 系列模型](/docs/model-list) 3. 运行示例 ```Bash # 方式一:纯 GUI(输出离散动作) python3 examples/pure_gui_desktop_cua.py # 方式二:纯 Grounding 单点定位(在 grounding_samples 目录下) cd examples/data/grounding_samples python3 eval_sspro.py --ark --workers 6 --max-new-tokens 8192 --output-dir res_sspro_ark ``` # 方式一:GUI Agent - 纯 GUI 模型根据 system prompt(任务框架 / 动作定义)、界面截图,对输出信息通过用官方解析器解析出动作。 | 任务 | 输出 | |--|--| | Open the Firefox browser and navigate to github.com. Complete the task step by step using the available GUI functions. | ![image-20260715-202235-014.png](https://arkdocs.tos-cn-beijing.volces.com/images/chat/image-20260715-202235-014.png) | ## 1. 图片读取与Base64编码 读取界面截图,并将其转换为Base64字符串格式,以便通过 API 传输。同时返回**图片原始尺寸** `size=(img.width, img.height)`,供后续步骤做像素映射。 ```Python def encode_image_to_data_url(path: str | Path) -> tuple[str, tuple[int, int]]: img = Image.open(path).convert("RGB") size = (img.width, img.height) buf = io.BytesIO() img.save(buf, format="PNG") b64 = base64.b64encode(buf.getvalue()).decode() return f"data:image/png;base64,{b64}", size ``` ## 2. 构造对话信息(系统提示词 + 用户信息) - system prompt 如下: - `TASK_SP`(**任务框架)**:任务描述、历史动作、截图,请输出下一动作。 - `FUNCTION_SP`(**动作定义)**:把 8 个离散动作(`click / drag / hotkey / left_double / right_single / scroll / type / wait`)以 JSON 格式列出,并给出 `` 的调用格式。 - 用户信息:构造包含`text`、`image_url` 的多模态 user 消息。 需要构造的 message 如下: ```python messages = build_system_prompt() + [build_user_message(task, data_url)] # 展开后: # {"role":"system","content":TASK_SP}, # {"role":"system","content":FUNCTION_SP}, # {"role":"user","content":[{"type":"text",...},{"type":"image_url",...}]}] ``` 核心代码 ```python PURE_GUI_FUNCTIONS = """{"name": "click", "description": "Mouse left single click action.", "parameters": {"type": "object", "properties": {"point": {"type": "string", "description": "Click coordinates. The format is: x y"}}, "required": ["point"]}} {"name": "drag", "description": "Mouse left button drag action.", "parameters": {"type": "object", "properties": {"start_point": {"type": "string", "description": "Drag start point. The format is: x y"}, "end_point": {"type": "string", "description": "Drag end point. The format is: x y"}}, "required": ["start_point", "end_point"]}} {"name": "hotkey", "description": "Press hotkey.", "parameters": {"type": "object", "properties": {"key": {"type": "string", "description": "Hotkeys you want to press. Split keys with a space and use lowercase."}}, "required": ["key"]}} {"name": "left_double", "description": "Mouse left double click action.", "parameters": {"type": "object", "properties": {"point": {"type": "string", "description": "Click coordinates. The format is: x y"}}, "required": ["point"]}} {"name": "right_single", "description": "Mouse right single click action.", "parameters": {"type": "object", "properties": {"point": {"type": "string", "description": "Click coordinates. The format is: x y"}}, "required": ["point"]}} {"name": "scroll", "description": "Scroll action.", "parameters": {"type": "object", "properties": {"point": {"type": "string", "description": "Scroll start position. If not specified, default to execute on the current mouse position. The format is: x y"}, "direction": {"type": "string", "description": "Scroll direction.", "enum": ["up", "down", "left", "right"]}}, "required": ["direction", "point"]}} {"name": "type", "description": "Type content.", "parameters": {"type": "object", "properties": {"content": {"type": "string", "description": "Type content. If you want to submit your input, use \\n at the end of content."}}, "required": ["content"]}} {"name": "wait", "description": "Wait for a while.", "parameters": {"type": "object", "properties": {"time": {"type": "integer", "description": "Wait time in seconds."}}, "required": []}}""" # 动作定义解析成 schema 列表,供官方解析器 parse_xml_action_65 做软校验。 PURE_GUI_SCHEMAS = functions_block_to_schemas(PURE_GUI_FUNCTIONS) # think_token 是一个约定的哨兵串,把思维链和答案分隔开。线上就是这个常量。 THINK_TOKEN = "think_never_used_51bce0c785ca2f68081bfa7d91973934" TASK_SP = """You are provided with a task description, a history of previous actions, and corresponding screenshots. Your goal is to perform the next action to complete the task. Please note that if performing the same action multiple times results in a static screen with no changes, you should attempt a modified or alternative action.""" FUNCTION_SP = f"""## Function Definition - You have access to the following functions: {PURE_GUI_FUNCTIONS} - To call a function, use the following structure without any suffix: <{THINK_TOKEN}> reasoning process value_1 ## Important Notes - All required parameters must be explicitly provided. - The string attribute within the parameter tag specifies the type of the parameter value. For instance, if the value is an integer, number, or boolean, set string="false". If the value is a string, set string="true". Example: 1 1.0 true This is a test 1. - For complex parameter types, such as lists or objects, set string="false" and provide the parameter value in JSON format. Example: {{"key1": "value1", "key2": "value2"}} [1, 2, 3]""" def build_system_prompt() -> list[dict]: """纯 GUI 主线的两段式 system prompt(任务框架 + 动作定义)。""" return [ {"role": "system", "content": TASK_SP}, {"role": "system", "content": FUNCTION_SP}, ] def build_user_message(task: str, data_url: str) -> dict: """构造一条多模态 user 消息:文本任务 + 一张截图。""" return { "role": "user", "content": [ {"type": "text", "text": task}, {"type": "image_url", "image_url": {"url": data_url}}, ], } messages = build_system_prompt() + [build_user_message(task, data_url)] ``` ## 3. 调用模型推理(不传 tools) 调用模型(不传 tools):模型会按 system prompt 把动作块写进`message.content`(如``),思维链放在`message.reasoning_content`。 核心代码: ```Python def call_ark(client, model: str, messages: list, max_tokens: int = 2048, temperature: float = 0.7) -> ModelReply: """调用 Ark 的 chat.completions,**不传 tools**。""" resp = client.chat.completions.create( model=model, messages=messages, temperature=temperature, max_tokens=max_tokens, ) choice = resp.choices[0] msg = choice.message return ModelReply( content=msg.content or "", reasoning_content=getattr(msg, "reasoning_content", None) or "", finish_reason=choice.finish_reason, usage=resp.usage, ) ``` ## 4. 解析动作 ### 动作解析 动作解析直接调 `ui-tars` 包的官方解析器,返回官方结构 `[{"function":..., "parameters":...}]`,按出现顺序排列,自动兼容多个 `` 块、单块多 ``(串行 / 并行 / 多动作预测)。 ```Python from ui_tars.action_parser import parse_xml_action_65_with_validate_soft def parse_actions(content: str, tool_schemas: list[dict]) -> list[dict]: return parse_xml_action_65_with_validate_soft(content, tool_schemas) ``` > **注意** > > 返回空列表(没有任何 `` 动作块):表示**模型以纯文本收尾,交互结束**。 ### 动作坐标映射 遍历每个动作,逐个打印 `name` 与 `parameters`。将模型返回的相对坐标映射回真实像素坐标。 核心代码 ```python def extract_point(value: str) -> tuple[float, float] | None: """从 `"x y"` 里取出 (x, y) 的 0–1000 相对坐标;取不到返回 None。""" if not isinstance(value, str): return None inner = value.replace("", "").replace("", "").strip() parts = inner.split() if len(parts) == 2: try: return float(parts[0]), float(parts[1]) except ValueError: return None return None def rel_point_to_pixel(point: tuple[float, float], image_size: tuple[int, int]) -> tuple[int, int]: """把 0–1000 相对坐标映射回真实像素坐标。""" x, y = point w, h = image_size return round(x / 1000.0 * w), round(y / 1000.0 * h) actions = parse_actions(reply.content, PURE_GUI_SCHEMAS) if not actions: # 没有任何 动作块 = 模型以纯文本收尾,视为交互结束。 print("响应里没有 动作:模型以纯文本作答,视为交互结束(默认结束方式)。") print("最终答复文本:\n") answer = reply.content.split(f"")[-1].strip() print(answer or reply.content) return 0 print(f"解析出 {len(actions)} 个动作(官方结构:function + parameters):\n") for i, act in enumerate(actions): name, params = act["function"], act.get("parameters", {}) print(f"[{i}] name={name!r} parameters={params}") # 坐标类参数(point / start_point / end_point)从 "x y" 取 0–1000 值并映射像素。 for pname, pval in params.items(): rel = extract_point(pval) if rel is not None: px, py = rel_point_to_pixel(rel, size) print(f" {pname}: 相对坐标 {rel} (0–1000) → 真实像素 ({px}, {py})") return 0 ``` # 方式二:纯 Grounding (单步定位) **不跑回环,只做单步定位**:一条指令 + 一张截图 → 模型输出一个 `` 的 `click` 动作,坐标是 0–1000 相对坐标,按截图宽高换算成像素,即定位到目标元素。**示例脚本是批量评测,** 用一批带标注的样本跑分做接入对齐校验,单样本处理在 `process_item`。 与 GUI Agent 的本质区别:Grounding 是单步定位,输入端就给定了截图、输出端只给一个坐标, 没有多轮回环、不判结束、也不真正执行动作。它回答的是给定意图,目标元素在屏幕上的哪个坐标, 而不是自主一步步把任务做完。拿到坐标后要不要点、点了之后怎么办,由用户自己的逻辑决定。 针对方式二的步骤不详细介绍,您可以查看代码示例。下面重点介绍一下构造对话信息。 动作空间**只保留 `click`**: - `build_click_function_prompt(decimals)`:system prompt,含 `click` 定义 + `` 调用格式 + 坐标精度说明。 - `build_user_prompt_template(decimals)`:user 模板。 ## 核心代码 核心代码 ```Python def build_click_function_prompt(decimals: int) -> str: if decimals >= 1: coord_note = ( "- Coordinates are normalized to the range [0, 1000] and may include one decimal place " "(e.g. 123.4 567.8) to allow finer, sub-pixel grounding granularity.\n" ) else: coord_note = "- Coordinates must be integer points normalized to the range [0, 1000].\n" return ( "## Function Definition\n\n" "- You have access to the following functions:\n" f"{CLICK_FUNCTION_SPEC}\n\n" "- To call a function, use the following structure without any suffix:\n\n" f"<{THINK_TAG}> reasoning process \n" '' 'x y' "\n" "## Important Notes\n" "- All required parameters must be explicitly provided.\n" f"{coord_note}" "- The origin is the top-left of the full screenshot.\n" ) def build_user_prompt_template(decimals: int) -> str: if decimals >= 1: coord_line = ( "Coordinates are normalized to [0, 1000] relative to the image and may use one decimal " "place for finer precision. " ) else: coord_line = "Coordinates must be integer normalized coordinates in [0, 1000] relative to the image. " return ( "You are a GUI click grounding agent. You are given a screenshot and a task. " "Return exactly one click tool call to match the requested operation. " + coord_line + "## User Instruction: What element matches the following task: {instruction}" ) # Defaults (integer coords); overridden in main() when --decimals is set SYSTEM_CLICK_FUNCTION_PROMPT = build_click_function_prompt(0) USER_PROMPT_TEMPLATE = build_user_prompt_template(0) def build_ark_messages(instruction, base64_image): """火山 Ark(OpenAI 兼容)标准多模态消息:接入点自带 chat 模板,无需特殊 token。""" return [ {"role": "system", "content": SYSTEM_CLICK_FUNCTION_PROMPT}, { "role": "user", "content": [ {"type": "text", "text": USER_PROMPT_TEMPLATE.format(instruction=instruction)}, {"type": "image_url", "image_url": {"url": f"data:image/png;base64,{base64_image}"}}, ], }, ] ``` ## 参考对齐分数 用一批带标注 bbox 的 grounding 样本跑分,拿到一个对齐分数做健康校验 —— 分数落在参考区间,即说明你的接入点 / 环境与我们跑分口径一致,可以放心接入。 > 以下分数使用 doubao-seed-2.1-turbo(火山 Ark 推理接入点)跑出,换用其他模型/版本分数会不同,对齐时请确认接入点对应的是同一模型。 单档 3000×3000 分辨率、`temperature=0`、整数坐标下的参考分数: | 数据集 | Accuracy | 命中 / 样本 | |-|-|-| | sspro | \~54–56% | 27–28 / 50 | | osworld-g | \~84–86% | 42–43 / 50 | | 总体 | \~69–71% | 69–71 / 100 | **如何跑**(在 `examples/data/grounding_samples/` 目录下): ```bash python3 eval_sspro.py --ark --workers 6 --max-new-tokens 8192 --output-dir res_sspro_ark python3 eval_osworldg.py --ark --workers 6 --max-new-tokens 8192 \ --target-areas 3000x3000 --output-prefix res_osworldg_ark ``` # 使用说明 - **`reasoning_content` vs `content`**: - `message.content`:动作块(`...`)就在这里,**没有**`` 外壳。 - `message.reasoning_content`:思维链。 - 手动拼`` 外壳: 如果你的下游解析 / 训练数据期望`思考{动作}`这种单字符串格式,手动拼接如下,具体可参考代码示例中`ModelReply.content_with_think()`。 ```JSON content = f"{reasoning_content}{content}" ``` - **多模态与超时**: - 图片放 `content` 数组的 `image_url`。 - **RGBA 图片建议先 `convert("RGB")`** 再编码。 - 首个多模态请求约 **10\~23s**,`timeout`设置`≥ 120`。 - **限流与并发**:Ark 有并发限制,Grounding 批量评测并发建议 **4–8**,`--max-retries ≥ 3`;首个多模态请求较慢,`--timeout` 默认 300s。 --- # 视觉定位 Grounding Source: https://ark.volcengine.com/region:cn-beijing/docs/grounding 视觉定位(Visual Grounding,后简称 Grounding)是根据对自然语言的任务要求,在图片中找到对应的目标,并返回目标的坐标,需要模型具备视觉理解以及自然语言理解的能力。 和目标检测最大的区别在于,输入多了自然语言信息,在对物体进行定位时需要理解自然语言的信息。使用上更加灵活交互更加自然。 |**输入** |**效果预览** |‌ | |---|---|---| |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/f9a8b28c25ac4d86979de8f52e73def6~tplv-goo7wpa0wc-image.image) |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/114267ea04e7424a8dc2e168c55b2ae8~tplv-goo7wpa0wc-image.image) |‌ | \ | | | | \ |> 提示词:框出中间狼卡通形象的头部的位置,输出 bounding box 的坐标 |> 模型回答:`175 98 791 476` | | # 支持模型 请参见[视觉理解能力](/docs/model-list#76df97c8)。 # 使用流程 下面将基于示例代码,详细介绍 Grounding 的使用流程。 > **说明** > > 方舟平台的新用户?获取 API Key 及 开通模型等准备工作,请参见 [快速入门](/docs/quick-start)。 ## 1. 参数配置 首先导入必要的库,设置模型ID、图片路径和提示词等参数,并从环境变量中读取API密钥。 ```Python import os import base64 import cv2 from arkruntime import Ark # 配置参数 DEFAULT_MODEL = "doubao-seed-2-1-pro-260915" # Replace with Model ID . IMAGE_PATH = "./ark_demo_img.png" # 替换为您本地测试图片的路径 PROMPT = "框出中间狼卡通形象的头部的位置,输出 bounding box 的坐标" BBOX_TAG_START = "" BBOX_TAG_END = "" # 读取API密钥 api_key = os.getenv("ARK_API_KEY") # 创建Ark客户端 client = Ark( api_key=api_key, # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", ) ``` ## 2. 图片读取与Base64编码 读取本地图片文件,并将其转换为Base64字符串格式,以便通过API传输。 ```Python with open(IMAGE_PATH, "rb") as f: base64_image = base64.b64encode(f.read()).decode('utf-8') ``` ## 3. 调用API生成边界框 将Base64编码的图片和文本提示词作为多模态输入,发送给grounding模型获取预测结果。 ```Python response = client.chat.completions.create( model=DEFAULT_MODEL, messages=[{ "role": "user", "content": [{ "type": "image_url", # 图片输入 "image_url": {"url": f"data:image/png;base64,{base64_image}"} }, { "type": "text", # 文本提示 "text": PROMPT }] }] ) bbox_content = response.choices[0].message.content ``` ## 4. 解析模型返回的边界框坐标 从模型返回的结果中提取边界框坐标,并验证其格式是否符合预期。 坐标格式为 `x_min y_min x_max y_max`,其中(`x_min`, `y_min`)为方框左上角的坐标,(`x_max`, `y_max` )为方框右下角的坐标。 ```Python # 检查结果格式是否正确 if not (bbox_content.startswith(BBOX_TAG_START) and bbox_content.endswith(BBOX_TAG_END)): print("错误:边界框格式不正确,缺少标签包裹") exit(1) # 解析坐标值 try: coords_str = bbox_content[len(BBOX_TAG_START):-len(BBOX_TAG_END)] coords = list(map(int, coords_str.split())) if len(coords) != 4: # 验证坐标数量(xmin, ymin, xmax, ymax) raise ValueError("坐标数量不正确,需要4个数值") x_min, y_min, x_max, y_max = coords except ValueError as e: print(f"坐标解析失败: {str(e)}") exit(1) ``` ## 5. 在原图上绘制边界框并保存 转化坐标,`x_min`, `y_min`, `x_max`, `y_max`是 **归一化到 1000*1000 的比例坐标**,**取值范围 [0, 999]**。图片宽高等分为1000后,图片左上角为原点绘制坐标系,对应点的坐标位置,原理示意如下图所示。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/e247476bb66b4b4f945b48318c18ee9b~tplv-goo7wpa0wc-image.image) 根据图像实际尺寸缩放边界框坐标,将模型输出的相对坐标映射到绝对坐标,需进行计算,例如左上角坐标横轴绝对值是 `x=x_min/1000*w`,w 是图片的实际宽度。 ```Python # 读取原图 image = cv2.imread(IMAGE_PATH) # 获取图像尺寸并缩放坐标 h, w = image.shape[:2] x_min_real = int(x_min * w / 1000) y_min_real = int(y_min * h / 1000) x_max_real = int(x_max * w / 1000) y_max_real = int(y_max * h / 1000) # 绘制红色边界框 cv2.rectangle(image, (x_min_real, y_min_real), (x_max_real, y_max_real), (0, 0, 255), 3) # 保存结果图片 output_path = os.path.splitext(IMAGE_PATH)[0] + "_with_bboxes.png" cv2.imwrite(output_path, image) print(f"成功保存标注图片: {output_path}") ``` ## 结果预览 配置并运行该示例代码,在代码路径下生成绘制后的图片预览。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/114267ea04e7424a8dc2e168c55b2ae8~tplv-goo7wpa0wc-image.image) # 更多示例 |场景及说明 |Prompt关键词 |Prompt示例 |效果图 | |---|---|---|---| |带属性物体检测 |`x1 y1 x2 y2 ` |`帮我框选森林里的着火范围,以x1 y1 x2 y2的形式表示` |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/e8140cc3d68240fcaab0a92be13101bd~tplv-goo7wpa0wc-image.image) | \ |> 需要定位图像中符合自然语言描述的特定属性的对象 | | | | |多目标检测 |` [{"category": category, "bbox": "x1 y1 x2 y2"}, {"category": category, "bbox": "x1 y1 x2 y2"}] ` |请检测图像中所有属于 "plate(盘子)、photo(照片)、kid(小孩)、cup(杯子)" 类别的物体。对于每个物体,请提供其类别和边界框,格式为:`[{"category": category, "bbox": "x1 y1 x2 y2"}, {"category": category, "bbox": "x1 y1 x2 y2"}]` |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/f768fcf0037a4baf80b2d4157898d8a2~tplv-goo7wpa0wc-image.image) | \ |> 需要同时检测多个预定义类别的对象 | | | | |根据图像信息定位目标 |`x1 y1 x2 y2` |请根据第一张图的主要目标,识别第二张图中类似的目标,对于每个物体提供其边界框,格式为:`x1 y1 x2 y2` |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/8ca3750ecfd540f285703e11f3c9edf9~tplv-goo7wpa0wc-image.image) | \ |> 根据目标的图像信息在另一张图中进行定位 | | | | |计算物体数量 |`x y ` |定位画面中水面上的所有人,输出 point,格式`x1 y1`,并计数水面中有多少人? |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/2392404be5034344b31fc99b9e637dac~tplv-goo7wpa0wc-image.image) | \ |> 需要统计特定对象的数量 | | | | |识别图像文本 |`textx1 y1, x2 y2, x3 y3, x4 y4 ` |标注图中的文字,格式为`textx1 y1, x2 y2, x3 y3, x4 y4` |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/7ef81d129cb34b5a8e3e1c8cc5d67f7e~tplv-goo7wpa0wc-image.image) | \ |> 需要提取图像中的文字内容及位置 | | | | |3D物体检测 |`<图像相机的详细参数>` |以下是该图像的详细相机参数。 |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/b8c5fa94a87c4977874c345630e0179e~tplv-goo7wpa0wc-image.image) | \ |> 检测图像中的3D立体格式的物体 |`<3dbbox>x_center y_center z_center x_size y_size z_size pitch yaw roll` |`相机内参:焦距f_x=5545.08, f_y=5545.08。主点坐标位于图像中心附近,因此当图像宽度为4284,高度为5712时,c_x=2142.00且c_y=2856.00。这里我们不考虑畸变参数。因此,内参矩阵K = [[1460.00, 0, 2142.00], [0, 1460.00, 2856.00], [0, 0, 1]]。` | | \ | | |`相机坐标系:X 轴向右,Y 轴向下,Z 轴向前。原点为相机位置。我们将相机坐标系作为世界坐标系,即相机外参矩阵为[[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0]]。` | | \ | | |请按照以下格式输出每个3D框:`<3dbbox>x_center y_center z_center x_size y_size z_size pitch yaw roll ` | | \ | | |注意: | | \ | | |(1) x_center, y_center, z_center:目标中心在相机坐标系中沿着XYZ轴的位置,单位为米。 | | \ | | |(2) x_size, y_size, z_size:当旋转角为零时,目标沿XYZ轴的尺寸,单位为米。 | | \ | | |(3) pitch, yaw, roll:分别为围绕XYZ轴的欧拉角。这里的每个角度值被归一化到(-1,1),需要乘以180转换到实际的角度。在这幅图中检测杯子,并以3D边界框格式展示结果。 | | --- # 提示词工程 Source: https://ark.volcengine.com/region:cn-beijing/docs/prompt-engineering 提示词工程是为模型编写高效、稳定的指令,使其持续生成预期的内容。本文介绍如何在大语言模型上进行提示词优化和管理,保持高效、稳定、结构化与可评估。 * 选择接口:与 OpenAI API 协议兼容([兼容 OpenAI SDK](/docs/compatible-with-openai-sdk)),支持 [Responses API](/docs/create-model-responses-api)(推荐) 与 [Chat API](/docs/chat-api) 两种接口调用,更多信息参见[迁移至 Responses API](/docs/responses-api-migration)。 * 评测先行:建议建立评测与回归机制,确保提示词迭代的可控性。 * 权限配置:首次接入请参见[快速入门](/docs/quick-start)完成 API Key 获取和环境配置。 > **说明** > > 其他模型提示词指南 > * 图片生成:[Seedream 4.0-5.0 提示词指南](/docs/seedream-4-0-5-0-prompt-guide)、[Seedream 3.0 提示词指南](https://docs.volcengine.com/docs/ark/seedream-3-0-prompt-guide) > * 视频生成:[Seedance 1.0 系列提示词指南](/docs/seedance-1-0-pro-pro-fast)、[【已下线】Seedance-1.0-lite 提示词指南](/docs/seedance-2-0-prompt-guide) ## **选择模型与提示词策略** |模型 |任务与场景 |提示词风格 | |---|---|---| |带深度思考的文本生成模型 |复杂任务与多步规划 |给目标与约束即可,让模型自拟计划与校验 | \ | |需分析、拆解与决策场景 | | |无/关闭深度思考的文本生成模型 |适合强模板化场景 |更明确的指令,给精确步骤、格式与样例 | \ | |明确指令与结构化产出 | | ## 建议流程 先构建评估的标准和数据集,帮助衡量提示词优化等变动的效果。 * 迭代流程:更新 → 测试 → 调试 → 评估;版本化管理变更与差异。 * 规模建议:推荐几百到几千样本,保证多样性与代表性,覆盖正例/负例/边界条件与多语料。可以使用大模型进行评估集扩展。 > **说明** > > **提示词工程工具 Prompt Pilot** > 方舟提供了 [Prompt Pilot](https://ark.volcengine.com/region:cn-beijing/autope),构建端到端的提示词优化,输入初始 Prompt 智能完成完整提示词工程流程: > * 初始 Prompt 自动生成 评估数据集。 > * 生成模型回答并自动打分。 > * 智能优化 Prompt,并生成智能优化报告。 ## **认识角色与指令遵循** * `system`:高优先级规则与业务逻辑,用于设定身份、语气、边界与工具使用规范。 * `user`:用户输入,表达需求与具体问题。 * `assistant`:模型输出。 * `tool`:工具调用场景下,函数/插件调用的消息。 > **说明** > > 建议:把稳定复用的信息放在 `system` 或 `instructions` 中,并在每次调用里靠前传入,提升一致性与可维护性。 ## **结构化内容:Markdown 与 XML** 使用结构化内容让模型明确“哪里是规则、哪里是示例、哪里是参考材料”。 * Markdown:使用分区(标题、列表)表达层级与规范,如 Identity、Instructions、Examples、Context。 * 使用轻量 XML 标签显式划界上下文与示例块,并通过属性标注元数据。 示例: ```Plain Text # Identity 你是企业文档助理,负责输出结构清晰、事实可核对的中文内容。 # Instructions * 回答时使用简洁中文,优先列表与小标题。 * 对外链与接口、路径、变量名使用反引号格式(`...`)。 * 需要示例时给出简短、可直接运行的代码。 * 如不确定,请明确列出假设与待确认项。 # Examples 请生成周报摘要模板 ## 本周进展 - 核心产出: - 量化指标: ## 下周计划 - 关键任务: - 风险与依赖: # Context 允许引用企业内部 wiki 与 API 文档 ``` ## **少样本学习(Few-shot)** 给出少量示例即可引导模型泛化,无需精调。 示例(情感分类): ```Plain Text # Identity 你是一个只输出单词的情感分类器(Positive / Negative / Neutral)。 # Instructions * 仅输出一个单词,不要包含多余标点或解释。 * 响应只允许为:Positive / Negative / Neutral。 # Examples 这耳机音质太棒了! Positive 续航一般,做工也就那样。 Neutral 客服体验糟糕,不会再买了。 Negative ``` ## **思考时间与步骤引导(CoT)** * Zero-shot:在适当场景加入“让我们一步一步分析思考”,提高复杂推理稳定性。 * Few-shots:提供分解过程示例,示范正确的中间推断与最终答案。 * 指定步骤:对任务给出执行步骤与完成标准,确保输出顺序与完整性。 示例(指定步骤): ```Plain Text 请按照以下步骤完成任务: 1. 明确目标与约束 2. 列出所需输入与可用工具 3. 执行并记录关键中间结果 4. 给出最终结构化输出(字段:result, evidence, next_step) ``` ## 输入必要知识 * 何时添加知识:当需要引用专有数据、技术文档、政策条款或约束回答范围时。 * 常见方式: * 以检索结果(向量库/关键词)拼入 `system`/`user` 消息或 `instructions`。 * 使用方舟内内置工具:知识库、文件检索、网页解析插件、联网搜索等。 * 上下文窗口: * 不同模型支持的最大 token 数不同,注意裁剪与精简(摘要); * 把稳定的约定/规则放在前部,任务特定上下文放在尾部。 ## 常见场景 ### 通用任务 * 核心角色与背景设定:明确指定执行任务的角色身份(即 {某个角色}),为后续任务执行划定身份边界与能力范围,确保提示词能引导模型以对应角色的专业视角和行为逻辑开展工作。 * 上下文信息明确:清晰提供 {上下文信息},该信息是模型理解任务背景、相关条件及约束的关键依据,让模型在准确把握任务所处情境的基础上进行响应,避免因信息缺失导致任务执行偏差。 * 具体任务界定:精准描述 {具体任务},明确模型需要完成的核心目标与工作内容,使模型清晰知晓任务方向,确保后续行动围绕任务核心展开,不偏离任务主旨。 * 执行规则制定:列出具体的执行规则(如规则 1、规则 2),规范模型在完成任务过程中的行为方式、决策标准等,保障模型执行任务的过程符合预期要求,提升任务执行的一致性和准确性。 * 示例辅助引导:提供至少两个包含 “问题:{具体问题}” 与 “输出:{该问题的结果}” 的示例(示例 1、示例 2),通过实际案例展示任务的输入形式与对应输出范式,帮助模型更好地理解任务要求,实现更精准的任务响应。 * 输出要求明确: * **指定输出格式**:明确规定模型最终输出内容应遵循的格式,如列表、表格、段落等,确保输出结构清晰、易于理解和使用。 * **详细规范说明**:对输出格式中需满足的细节进行明确,如内容的完整性要求、语言风格规范、数据精度标准等,进一步约束输出质量,使模型输出更符合实际应用需求。 模板如下 ```Plain Text 假如你是{某个角色},你将根据{上下文信息},来解决{具体任务}。按以下规则执行: 1. 规则1 2. 规则2 示例1: 问题:{具体问题} 输出:{该问题的结果} 示例2: 问题:{具体问题} 输出:{该问题的结果} 请回答: 问题:{具体问题} 输出: 要求: 1. 指定输出格式 2. 格式中需要满足的详细规范 ``` ### **编程场景** * 明确角色与工作流:在 `system`/`instructions` 中规定“工具何时调用、何时避免交互执行”。 * 测试与校验:要求对补丁/改动进行单测或命令级验证;注意在 IDE 或代理工具中核对变更是否真正生效。 * 工具调用示例:给出函数/命令调用的具体格式样例,提升遵循度。 * Markdown 输出标准:反引号包裹路径、命令与标识符;列表与表格保持语义清晰。 ### **角色扮演** 更多说明请参见[角色扮演场景提示词指南](/docs/roleplay-prompt-guide) ```Plain Text 你是{某个具体人物},人称{xxx},出身于{背景与上下文}。 性格特点: 语言风格: 人际关系: 过往经历: 经典台词或口头禅: {台词1(可在括号中描述动作、情绪与背景,丰富语境)} {台词2} ``` ### **Agent 场景(长期任务/多工具协作)** * 规划与坚持:要求完整解决用户请求,拆分子任务并跟踪完成状态。 * 透明度:在关键步骤前简述调用工具的理由(例如切换检索源、启用联网插件等)。 * 进度管理:结合 TODO 或 Rubric 保持结构化推进;Ark 生态中可结合应用实验室与 MCP 插件体系。 ## 上下文管理与成本优化 * 使用 [Responses API](/docs/create-model-responses-api) 简化上下文管理,在多轮对话场景可通过 `previous_response_id` 传入历史信息,无需手动管理,详见[上下文管理](/docs/context-management)。 * 使用上下文缓存降低成本:对于固定系统信息及多轮对话,通过缓存输入的低价,降低请求的成本。详见[上下文缓存](/docs/context-cache) --- # 结构化输出(beta) Source: https://ark.volcengine.com/region:cn-beijing/docs/structured-output-beta 当需要模型像程序一样输出标准格式(主要指 JSON 格式)而不是自然语言时,可开启结构化输出能力,以支持标准化处理或展示。 通过配置 **response_format** 对象,指定模型输出 JSON 格式,还可以通过定义 JSON 结构,限定模型输出字段信息。 相较于通过提示词控制模型输出 JSON 格式,使用结构化输出能力有以下优势: * 输出可靠:输出结构始终符合预期数据类型,包括字段层级、名称、类型、顺序等,避免必要字段缺失或枚举值幻觉等。 * 使用简单:通过 API 字段定义输出格式,提示词更加简单,无需在提示词中反复强调或使用强烈措辞。 > **说明** > > 该能力尚在 beta 阶段,受资源与平台负载影响,服务可用性可能随访问情况产生波动,请谨慎在生产环境使用。 # 支持的模型 请参见 [结构化输出能力(beta)](/docs/model-list#86588b72)。 # 使用限制 * 使用 [在线推理(TPM 保障包)](/docs/tpm-guarantee-package) 时,不支持使用结构化输出能力。 # API 文档 * [Chat API](/docs/chat-api):结构化输出 API 参数说明。本文示例基于 Chat API 展开介绍。 * [Responses API](/docs/create-model-responses-api):新版模型调用 API,使用示例请参见 [结构化输出(beta)](/docs/responses-api-structured-output)。 # 快速开始 ## json_schema 模式 这段代码展示了如何利用 Chat API 实现遵循 schema 字段定义的 JSON 结构化输出。 > 利用 Responses API 实现遵循 schema 字段定义的 JSON 结构化输出的示例,请参见 [json_schema 模式](/docs/responses-api-structured-output#f4619f55)。 **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/chat/completions \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "messages": [ { "role": "system", "content": "你是一位数学辅导老师。" }, { "role": "user", "content": [ { "type": "text", "text": "使用中文解题: 8x + 9 = 32 and x + y = 1" } ] } ], "response_format": { "type": "json_schema", "json_schema": { "name": "math_reasoning", "schema": { "type": "object", "properties": { "steps": { "type": "array", "items": { "type": "object", "properties": { "explanation": { "type": "string" }, "output": { "type": "string" } }, "required": [ "explanation", "output" ], "additionalProperties": false } }, "final_answer": { "type": "string" } }, "required": [ "steps", "final_answer" ], "additionalProperties": false }, "strict": true } }, "thinking": { "type": "disabled" } }' ``` 可以通过 **thinking** 字段控制模型是否启用深度思考能力。 * `"disabled"`:不使用深度思考能力。 * `"enabled"`:强制使用深度思考能力。 **选项:Python** ```Python import os from arkruntime import Ark from pydantic import BaseModel # 用于定义响应解析模型 # 初始化方舟SDK客户端 client = Ark( # 从环境变量获取方舟API Key(需提前设置环境变量) api_key=os.environ.get("ARK_API_KEY"), base_url="https://ark.cn-beijing.volces.com/api/v3" ) # 定义分步解析模型(对应业务场景的结构化响应) class Step(BaseModel): explanation: str # 步骤说明 output: str # 步骤计算结果 # 定义最终响应模型(包含分步过程和最终答案) class MathResponse(BaseModel): steps: list[Step] # 解题步骤列表 final_answer: str # 最终答案 # 调用方舟模型生成响应(自动解析为指定模型) completion = client.beta.chat.completions.parse( model="doubao-seed-2-1-pro-260915", # 具体模型需替换为实际可用模型 messages=[ {"role": "system", "content": "你是一位数学辅导老师,需详细展示解题步骤"}, {"role": "user", "content": "用中文解方程组:8x + 9 = 32 和 x + y = 1"} ], response_format=MathResponse, # 指定响应解析模型 extra_body={ "thinking": { "type": "disabled" # 不使用深度思考能力 # "type": "enabled" # 使用深度思考能力 } } ) # 提取解析后的结构化响应 resp = completion.choices[0].message.parsed # 打印格式化的JSON结果 print(resp.model_dump_json(indent=2)) ``` **选项:Go** ```Go package main import ( "context" "encoding/json" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/chat" ) type Step struct { Explanation string `json:"explanation" jsonschema_description:"Step description"` Output string `json:"output" jsonschema_description:"Step result"` } type MathResponse struct { Steps []Step `json:"steps" jsonschema_description:"Solution steps"` FinalAnswer string `json:"final_answer" jsonschema_description:"Final answer"` } func mathResponseSchema() []byte { return []byte(`{ "type": "object", "properties": { "steps": { "type": "array", "items": { "type": "object", "properties": { "explanation": {"type": "string"}, "output": {"type": "string"} }, "required": ["explanation", "output"], "additionalProperties": false } }, "final_answer": {"type": "string"} }, "required": ["steps", "final_answer"], "additionalProperties": false }`) } func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) response, err := client.CreateChatCompletion( context.Background(), &chat.ChatCompletionRequest{ Model: "doubao-seed-2-1-pro-260915", Messages: []chat.ChatCompletionRequestMessage{ systemMessage("你是一位数学辅导老师,需详细展示解题步骤"), userMessage("用中文解方程组:8x + 9 = 32 和 x + y = 1"), }, ResponseFormat: chat.NewOptChatCompletionResponseFormat( chat.ChatCompletionResponseFormat{ Type: chat.NewOptResponseFormatType(chat.ResponseFormatTypeJSONSchema), JSONSchema: chat.NewOptChatCompletionResponseFormatJsonSchema( chat.ChatCompletionResponseFormatJsonSchema{ Name: "math_response", Description: chat.NewOptString("数学题解答的结构化响应"), Schema: mathResponseSchema(), Strict: chat.NewOptBool(true), }, ), }, ), Thinking: chat.NewOptThinking(chat.Thinking{ Type: chat.NewOptThinkingMode(chat.ThinkingModeEnabled), }), }, ) if err != nil { fmt.Printf("structured output chat error: %v\n", err) return } var result MathResponse if err := json.Unmarshal([]byte(response.Choices[0].Message.Content), &result); err != nil { panic(err) } pretty, _ := json.MarshalIndent(result, "", " ") fmt.Println(string(pretty)) } func systemMessage(content string) chat.ChatCompletionRequestMessage { return chat.ChatCompletionRequestMessage{ OneOf: chat.NewChatCompletionRequestSystemMessageChatCompletionRequestMessageSum( chat.ChatCompletionRequestSystemMessage{ Role: chat.ChatCompletionRequestSystemMessageRoleSystem, Content: chat.NewStringChatCompletionMessageContent(content), }, ), } } func userMessage(content string) chat.ChatCompletionRequestMessage { return chat.ChatCompletionRequestMessage{ OneOf: chat.NewChatCompletionRequestUserMessageChatCompletionRequestMessageSum( chat.ChatCompletionRequestUserMessage{ Role: chat.ChatCompletionRequestUserMessageRoleUser, Content: chat.NewOptNilChatCompletionMessageContent(chat.NewStringChatCompletionMessageContent(content)), }, ), } } ``` **选项:Java** ```Java package com.example; import com.volcengine.ark.runtime.models.chat.*; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.volcengine.ark.runtime.service.ArkService; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; public class ChatCompletionsStructuredOutputsExamplev4 { static String apiKey = System.getenv("ARK_API_KEY"); static ArkService service = ArkService.builder() .connectionPool(new ConnectionPool(5, 1, TimeUnit.SECONDS)) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .dispatcher(new Dispatcher()) .apiKey(apiKey) .build(); public static void main(String[] args) throws JsonProcessingException { ObjectMapper mapper = new ObjectMapper(); // 构造消息列表(包含 system 和 user 角色) List messages = new ArrayList<>(); messages.add(ChatCompletionRequestSystemMessage.builder() .role(ChatCompletionRequestMessageType.SYSTEM) .content(ChatCompletionMessageContent.ofString("你是一位数学辅导老师,需详细展示解题步骤")) .build()); messages.add(ChatCompletionRequestUserMessage.builder() .role(ChatCompletionRequestMessageType.USER) .content(ChatCompletionMessageContent.ofString("用中文解方程组:8x + 9 = 32 和 x + y = 1")) .build()); // Build the JSON Schema with Java collections. java.util.Map stepProperties = new java.util.HashMap<>(); stepProperties.put("explanation", java.util.Collections.singletonMap("type", "string")); stepProperties.put("output", java.util.Collections.singletonMap("type", "string")); java.util.Map stepSchema = new java.util.HashMap<>(); stepSchema.put("type", "object"); stepSchema.put("properties", stepProperties); java.util.Map properties = new java.util.HashMap<>(); java.util.Map stepsSchema = new java.util.HashMap<>(); stepsSchema.put("type", "array"); stepsSchema.put("items", stepSchema); properties.put("steps", stepsSchema); properties.put("finalAnswer", java.util.Collections.singletonMap("type", "string")); java.util.Map schema = new java.util.HashMap<>(); schema.put("type", "object"); schema.put("properties", properties); ChatCompletionResponseFormat responseFormat = ChatCompletionResponseFormat.builder() .type(ResponseFormatType.JSON_SCHEMA) .jsonSchema(ChatCompletionResponseFormatJsonSchema.builder() .name("math_response") .description("Structured response for math problem solutions") .schema(schema) .strict(true) .build()) .build(); // 构造请求(包含 thinking 配置) ChatCompletionRequest request = ChatCompletionRequest.builder() .model("doubao-seed-2-1-pro-260915") // 替换为实际使用模型 .messages(messages) .responseFormat(responseFormat) .thinking(Thinking.builder().type(ThinkingMode.DISABLED).build()) // 关闭模型深度思考能力 .build(); // 调用 API 并解析响应 ChatCompletionResponse response = service.createChatCompletion(request); if (!response.getChoices().isEmpty()) { String content = String.valueOf(response.getChoices().get(0).getMessage().getContent()); JsonNode jsonNode = mapper.readTree(content); // 打印格式化结果 System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonNode)); } service.shutdownExecutor(); } } ``` **选项:OpenAI SDK** ```Python from openai import OpenAI import os from pydantic import BaseModel client = OpenAI( # 从环境变量中获取方舟 API Key api_key=os.environ.get("ARK_API_KEY"), base_url = "https://ark.cn-beijing.volces.com/api/v3" ) class Step(BaseModel): explanation: str output: str class MathResponse(BaseModel): steps: list[Step] final_answer: str completion = client.beta.chat.completions.parse( model = "doubao-seed-2-1-pro-260915", # 替换为您需要使用的模型 messages = [ {"role": "system", "content": "你是一位数学辅导老师。"}, {"role": "user", "content": "使用中文解题: 8x + 9 = 32 and x + y = 1"}, ], response_format=MathResponse, extra_body={ "thinking": { "type": "disabled" # 不使用深度思考能力 # "type": "enabled" # 使用深度思考能力 } } ) resp = completion.choices[0].message.parsed # 打印 JSON 格式结果 print(resp.model_dump_json(indent=2)) ``` 返回预览 ```JSON { "steps": [ { "explanation": "解第一个方程8x + 9 = 32,先将等式两边同时减去9,得到8x = 32 - 9", "output": "8x = 23" }, { "explanation": "然后等式两边同时除以8,求出x的值", "output": "x = 23/8" }, { "explanation": "将x = 23/8代入第二个方程x + y = 1,求解y,即y = 1 - x", "output": "y = 1 - 23/8" }, { "explanation": "计算1 - 23/8,通分后得到(8 - 23)/8", "output": "y = -15/8" } ], "final_answer": "x = 23/8,y = -15/8" } ``` ## json_object 模式 需要在输入信息中包含字符串 json,并配置`"response_format":{"type": "json_object"}`。 > 利用 Responses API 实现 JSON Object 结构化输出的示例,请参见 [json_object 模式](/docs/responses-api-structured-output#607e37db)。 **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/chat/completions \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "messages": [ {"role": "user", "content": "常见的十字花科植物有哪些?json输出"} ], "thinking": { "type": "disabled" }, "response_format":{ "type": "json_object" } }' ``` 可以通过 **thinking** 字段控制模型是否启用深度思考能力。 * `"disabled"`:不使用深度思考能力。 * `"enabled"`:强制使用深度思考能力。 **选项:Python** ```Python import os # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark client = Ark( # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv('ARK_API_KEY'), ) completion = client.chat.completions.create( # Replace with Model ID model = "doubao-seed-2-1-pro-260915", messages=[ {"role": "user", "content": "常见的十字花科植物有哪些?json输出"} ], response_format={"type":"json_object"}, thinking={"type": "disabled"},# 不使用深度思考能力 ) # 打印原始响应内容 print(completion.choices[0].message.content) ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/chat" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() // 构造请求消息 messages := []chat.ChatCompletionRequestMessage{ userMessage("常见的十字花科植物有哪些?json输出"), } // 构造请求(包含 thinking 配置) req := &chat.ChatCompletionRequest{ Model: "doubao-seed-2-1-pro-260915", //Replace with Model ID Messages: messages, ResponseFormat: chat.NewOptChatCompletionResponseFormat(chat.ChatCompletionResponseFormat{Type: chat.NewOptResponseFormatType(chat.ResponseFormatTypeJSONObject)}), Thinking: chat.NewOptThinking(chat.Thinking{Type: chat.NewOptThinkingMode(chat.ThinkingModeDisabled)}), } // 调用 API resp, err := client.CreateChatCompletion(ctx, req) if err != nil { fmt.Printf("chat error: %v\n", err) return } fmt.Println(resp.Choices[0].Message.Content) } func userMessage(content string) chat.ChatCompletionRequestMessage { return chat.ChatCompletionRequestMessage{ OneOf: chat.NewChatCompletionRequestUserMessageChatCompletionRequestMessageSum( chat.ChatCompletionRequestUserMessage{ Role: chat.ChatCompletionRequestUserMessageRoleUser, Content: chat.NewOptNilChatCompletionMessageContent(chat.NewStringChatCompletionMessageContent(content)), }, ), } } ``` **选项:Java** ```Java package com.example; import com.volcengine.ark.runtime.models.chat.*; import com.volcengine.ark.runtime.service.ArkService; import java.util.ArrayList; import java.util.List; /** * 这是一个示例类,展示了如何使用ArkService来完成聊天功能。 */ public class ChatCompletionsExample { public static void main(String[] args) { // 从环境变量中获取API密钥 String apiKey = System.getenv("ARK_API_KEY"); // 创建ArkService实例 ArkService arkService = ArkService.builder().apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); // 初始化消息列表 List chatMessages = new ArrayList<>(); // 创建用户消息 ChatCompletionRequestMessage userMessage = ChatCompletionRequestUserMessage.builder() .role(ChatCompletionRequestMessageType.USER) // 设置消息角色为用户 .content(ChatCompletionMessageContent.ofString("常见的十字花科植物有哪些?json输出")) // 设置消息内容 .build(); // 将用户消息添加到消息列表 chatMessages.add(userMessage); // 创建聊天完成请求 ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder() .model("doubao-seed-2-1-pro-260915")// Replace with Model ID .messages(chatMessages) // 设置消息列表 .responseFormat(ChatCompletionResponseFormat.builder().type(ResponseFormatType.JSON_OBJECT).build()) .thinking(Thinking.builder().type(ThinkingMode.DISABLED).build()) .build(); // 发送聊天完成请求并打印响应 try { // 获取响应并打印每个选择的消息内容 arkService.createChatCompletion(chatCompletionRequest) .getChoices() .forEach(choice -> System.out.println(choice.getMessage().getContent())); } catch (Exception e) { System.out.println("请求失败: " + e.getMessage()); } finally { // 关闭服务执行器 arkService.shutdownExecutor(); } } } ``` **选项:OpenAI SDK** ```Python from openai import OpenAI import os # 初始化客户端 client = OpenAI( # 从环境变量获取方舟API Key(需提前设置环境变量) api_key=os.environ.get("ARK_API_KEY"), base_url="https://ark.cn-beijing.volces.com/api/v3" ) # 调用方舟模型生成响应 completion = client.chat.completions.create( model="doubao-seed-2-1-pro-260915", # Replace with Model ID messages=[ {"role": "user", "content": "常见的十字花科植物有哪些?json输出"} ], response_format={"type":"json_object"}, extra_body={ "thinking": { "type": "disabled" # 不使用深度思考能力 # "type": "enabled" # 使用深度思考能力 } }, ) # 打印原始响应内容 print(completion.choices[0].message.content) ``` 返回预览 ```JSON { "common_cruciferous_plants": [ "白菜", "萝卜", "油菜", "甘蓝(卷心菜)", "花椰菜(菜花)", "西兰花", "芥菜", "榨菜", "雪里蕻", "大头菜(芜菁)", "羽衣甘蓝", "荠菜", "诸葛菜(二月兰)", "独行菜", "紫罗兰" ] } ``` # 模式对比:**`json_schema`** 与 `json_object` `json_schema` 是 `json_object` 的演进版本,两种模式都支持 JSON 结构化输出,具体的异同如下。 > 当前 `json_schema` 功能还在beta 测试中,请谨慎评估后再在生产环境使用。 |结构化输出 |`json_schema` |`json_object` | |---|---|---| |生成 JSON 回复 |是 |是 | |可定义 JSON 结构 |是 |否 | \ | | |仅保障回复是合法 JSON | |是否推荐 |是 |否 | |支持的模型 |见 [结构化输出能力(beta)](/docs/model-list#86588b72) |见 [结构化输出能力(beta)](/docs/model-list#86588b72) | |严格模式 |支持 |不涉及 | \ |> 严格按照定义的结构生成回复。 |通过设置 **strict** 为 `true` 生效。 | | \ | | | | \ | |* 遵循语法 [附1. JSON Schema 语法支持说明](/docs/structured-output-beta#07ec5656),若有不支持的结构会显示报错。 | | |配置方式 |..., | ..., | \ | |"response_format": { |"response_format": { | \ | | "type": "json_schema", | "type": "json_object" | \ | | "json_schema":{ |}, | \ | | "name":"my_schema", |... | \ | | "strict": true, | | \ | | "schema": {...} | | \ | | } | | \ | |}, | | \ | |... | | # 推荐使用步骤 ## 1.定义结构 在 **schema** 字段中定义模型回复的 JSON 结构,可以参考 [快速开始](/docs/structured-output-beta#87d19412) 的示例。 * 是否启用严格模式: * 启用严格模式(`strict: true`):模型严格按照 **schema** 定义结构输出。方舟支持的关键字可见 [附1. JSON Schema 语法支持说明](/docs/structured-output-beta#07ec5656),如果有明显不支持的定义,方舟会显示报错。 * 不启用严格模式(`strict: false`或未配置 **strict** 字段):模型输出合法 JSON 结构内容,会优先参考 **schema** 定义的结构,不会对语言校验及报错。 * 字段顺序:模型将根据 **schema** 定义的字段顺序输出数据,需注意同级字段的先后顺序。 > **说明** > > 通过设计 JSON Schema 和提示词,获得更好的生成质量,强烈建议阅读 [附2. JSON Schema 定义建议 ](/docs/structured-output-beta#3267c790)、[附3. Prompt 建议](/docs/structured-output-beta#05849c36)。 ## 2.API 中进行配置JSON Schema 在 API 中指定结构化输出的模式 ```JSON ..., "response_format": { "type": "json_schema", "json_schema": { "name":"my_schema", "strict": true, "schema": {...} } }, ... ``` 完整示例代码见 [快速开始](/docs/structured-output-beta#87d19412)。 > **说明** > > 请勿与 **frequency_penalty**,**presence_penalty** 等采样参数共同使用,可能会导致模型输出异常。 ## 3. 处理错误案例 模型输出结构仍然可能包含错误,可能因为输出长度限制、任务复杂度、格式不清晰等。可以尝试调整指令,或拆分任务为更简单子任务。 # 附1. JSON Schema 语法支持说明 > **说明** > > * 按关键字的作用域分类,JSON Schema 有效关键字全集 https://json-schema.org/understanding-json-schema/keywords > * 下面支持的关键字代表方舟已支持关键字对应的输出格式约束语义。 > * 方舟会忽略 JSON Schema 规范中没有格式约束语义的关键字。 > * 使用明确不支持的关键字,方舟会显式报错。 > * 请勿与 **frequency_penalty**,**presence_penalty** 等采样参数共同使用,可能会导致模型输出异常。 ## Schema 层面公共关键字 * [type](https://www.learnjsonschema.com/2020-12/validation/type/) * integer * number * string * boolean * null * array * object * [$ref](https://www.learnjsonschema.com/2020-12/core/ref/) * 只支持 `#` 开头的本地相对引用 * [$defs](https://www.learnjsonschema.com/2020-12/core/defs/) * [const](https://www.learnjsonschema.com/2020-12/validation/const/) * [enum](https://www.learnjsonschema.com/2020-12/validation/enum/) * [anyOf](https://www.learnjsonschema.com/2020-12/applicator/anyof/) * [oneOf](https://www.learnjsonschema.com/2020-12/applicator/oneof/) * 不严格保证 exactly one 语义 * [allOf](https://www.learnjsonschema.com/2020-12/applicator/allof/) * 不严格保证 all 语义 ## type 相关的关键字 * "type": "array" * [prefixItems](https://www.learnjsonschema.com/2020-12/applicator/prefixitems/) * [items](https://www.learnjsonschema.com/2020-12/applicator/items/) * [unevaluatedItems](https://www.learnjsonschema.com/2020-12/unevaluated/unevaluateditems/) * "type": "object" * [properties](https://www.learnjsonschema.com/2020-12/applicator/properties/) * [required](https://www.learnjsonschema.com/2020-12/validation/required/) * [additionalProperties](https://www.learnjsonschema.com/2020-12/applicator/additionalproperties/) * [unevaluatedProperties](https://www.learnjsonschema.com/2020-12/unevaluated/unevaluatedproperties/) # 附2. JSON Schema 定义建议 ### 字段命名与描述 字段命名含糊/无描述,导致模型难以判断含义。使用清晰有意义的英文名(如 user_name),并配合 `description` 详细说明字段用途。 错误示例 ```JSON { "type": "object", "properties": { "v1": { "type": "string" } } } ``` 改进后示例 ```JSON { "type": "object", "properties": { "user_name": { "type": "string", "description": "用户的姓名" } } } ``` ### 字段类型与结构设计 #### 避免冗余嵌套与不必要复杂化 不过度使用 $ref,结构尽可能一次性展开。无意义的嵌套会增加模型生成难度,提高出错概率。 错误示例 ```JSON { "type": "object", "properties": { "date": { "type": "object", "properties": { "value": { "type": "string", "description": "日期" } } } } } ``` 改进后示例 ```JSON { "type": "object", "properties": { "date": { "type": "string", "description": "日期,格式为 YYYY-MM-DD" } } } ``` #### 字段类型要明确、例子需补充 > 说明:类型应尽量贴合实际业务。对于数字、布尔值等不能简单用 string 替代。 错误示例 ```JSON { "score": { "type": "string" } } ``` 改进后示例 ```JSON { "score": { "type": "integer", "description": "成绩,0到100的整数" } } ``` ### 字段取值与约束设计 明确枚举值与格式 错误示例 ```JSON { "status": { "type": "string" } } ``` 改进后示例 ```JSON { "status": { "type": "string", "description": "处理状态,可为:pending、success 或 failed", "enum": ["pending", "success", "failed"] } } ``` ### 结构层级与必填项 所有需要的结构明确 required,这样模型会始终输出所有必需字段,格式更规范。 推荐使用 required 时,始终加上`"additionalProperties": false`。 错误示例 ```JSON { "type": "object", "properties": { "steps": { "type": "array", "items": { "type": "string" } }, "final_answer": { "type": "string" } } // 没有 required } ``` 改进后示例 ```JSON { "type": "object", "properties": { "steps": { "type": "array", "items": { "type": "string" } }, "final_answer": { "type": "string" } }, "required": ["steps", "final_answer"], "additionalProperties": false } ``` ### 业务语义简明清楚,避免歧义 错误示例 ```JSON { "type": "object", "properties": { "id": { "type": "string", "description": "用户或订单编号" } } } ``` 改进后示例 ```JSON { "type": "object", "properties": { "user_id": { "type": "string", "description": "用户编号" }, "order_id": { "type": "string", "description": "订单编号" } } } ``` ## 使用工具评估和优化 为防止 JSON 模式与编程语言类型定义不一致,推荐使用语言原生的工具支持,如 Python 可使用 [Pydantic](https://docs.pydantic.dev/latest/),TypeScript 可使用 [Zod](https://zod.dev/)。 # 附3. Prompt 建议 ### 指明任务目标,简洁表达意图 * 只需直接描述实际希望模型完成的任务即可,无须再过多强调“请用 JSON 输出”、“请用如下格式输出”等。 * 不必在 prompt 中重复 schema 结构的信息,避免造成矛盾或冗余。 错误示例 ```Plaintext 请用如下 JSON 格式输出,并包含字段 steps、final_answer:8x + 9 = 32,x+y=1。 ``` 改进后示例 ```Plaintext 请求解:8x + 9 = 32,x + y = 1。 ``` ### 结合结构化信息写业务内容,而不是格式引导 * 关注“内容本身”,而非“输出形式”。 * 业务描述越具体,LLM 更易给出符合 schema 的内容。 错误示例 ```Plaintext 请输出一个包含 steps 和 final_answer 字段的 JSON。 ``` 改进后示例 ```Plaintext 请一步步推理解答:8x + 9 = 32, x+y=1,并写出最终答案。 ``` --- # 接入三方工具 Source: https://ark.volcengine.com/region:cn-beijing/docs/integrate-third-party-tools 方舟 API 兼容 OpenAI 和 Anthropic 接口协议,支持在三方工具中使用,可参考本文进行配置及使用。 > **说明** > > 本文详细介绍 Claude Code、Codex 等三方工具的接入配置。若要按标准三阶段流程把方舟模型接入生产环境(参数配置、联通性核验、突发流量爬坡、上线监控),请参考 [模型接入指南(LLM) - 标准流程](/docs/go-live-access-sop)。 个人开发场景推荐订阅 [Agent Plan 套餐](/docs/agent-plan-personal-plan-overview)(套餐优惠定价、token 单价更低),接入教程参见 [快速开始](/docs/agent-plan-personal-get-started)。 方舟 Agent Plan VS 方舟 API 调用 两种方式在计费、支持模型、API Key、Base URL 上存在差异,配置时需注意区分。 |对比项 |方舟 Agent Plan |方舟 API 调用 | |---|---|---| |计费方式 |预付费:订阅 Agent Plan 套餐(套餐优惠定价,token 单价更低),详见[套餐概览](/docs/agent-plan-personal-plan-overview)。 |后付费:按 token 用量结算。 | |支持模型 |[支持模型及 Harness](/docs/agent-plan-personal-plan-overview#3d801f5f) |[文本生成能力](/docs/model-list#32e9e053),可按需选择。 | |API Key |[专属 API Key](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=agentPlan) |[API Key](https://ark.volcengine.com/region:cn-beijing/apikey) | |Base URL |> 兼容 Anthropic 接口协议
    `https://ark.cn-beijing.volces.com/api/plan`

    > 兼容 OpenAI 接口协议
    `https://ark.cn-beijing.volces.com/api/plan/v3` |> 兼容 Anthropic 接口协议
    `https://ark.cn-beijing.volces.com/api/compatible`

    > 兼容 OpenAI 接口协议
    `https://ark.cn-beijing.volces.com/api/v3` | # 生态兼容 为了满足开发者对 OpenAI API 和 Anthropic API 生态的使用需求,方舟 API 新增了对两类接口格式的适配支持,全面兼容主流大模型接口规范及相关工具生态。开发者无需修改核心代码,仅需切换 Base URL 与 API Key,即可实现跨平台模型调用与工具集成。 在配置三方工具时,需要配置的 Base URL 信息见下表。 |接口协议 |Base URL |适用工具 | |---|---|---| |兼容 Anthropic 接口协议 |`https://ark.cn-beijing.volces.com/api/compatible` |Claude Code | |兼容 OpenAI 接口协议 |`https://ark.cn-beijing.volces.com/api/v3` |Chatbox、Cherry Studio、OpenClaw(原 Clawdbot)、TRAE、Cline、Cursor、Kilo Code、Roo Code、OpenCode、Codex CLI 等。 | > **说明** > > 在配置工具前,需要 [开通所需的模型服务](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&OpenTokenDrawer=false)。 方舟 API 已内置 Web Search 等工具,开通后即可在 Claude Code、Codex CLI 等三方工具中直接使用,推荐优先使用。若您的使用场景未被内置工具覆盖,也可以在三方工具中自行接入二方、三方的 MCP Server 与 Skill,扩展模型可用的能力,各工具的接入方式见下文对应章节。 ## 获取 MCP Server * **二方**:访问 [智能体工具商店](https://www.volcengine.com/mcp-marketplace),获取火山引擎生态内的 MCP 工具(如巨量千川、知识库等),在 MCP 详情页获取服务地址与鉴权信息。 * **三方**:接入其他 MCP 市场提供的 MCP Server,或自行部署开源 MCP Server。 > **注意** > > 请从可信来源获取 MCP Server,其安全性与稳定性由提供方负责,接入前请确认其权限范围符合您的预期。 # 接入 Chatbox ## 安装步骤 通过 [Chatbox 官网](https://chatboxai.app/zh) 下载并安装合适的版本,或直接**启动网页版**。 ## 配置工具 打开 Chatbox 进入 Settings 页面。 1. 在 Model Provider 中单击添加提供商,其中 **API Mode** 选择 `OpenAI API Compatible`。 2. 提供商添加成功后,配置以下信息。 * **API Key**:[获取API Key](https://ark.volcengine.com/region:cn-beijing/apikey) * **API Host**:`https://ark.cn-beijing.volces.com/api/v3` * **API Path**:`/chat/completions` * **Model**:[选择模型并获取 Model ID](/docs/model-list) 配置完成后,就可以在输入框中输入需求,与模型进行交互。 # 接入 Cherry Studio ## 安装步骤 通过 [Cherry Studio 官网](https://www.cherry-ai.com/) 下载并安装 Cherry Studio 客户端。 ## 配置工具 打开 Cherry Studio 客户端,进入设置页面。 1. 在模型服务中点击添加提供商,其中**提供商类型**选择 `OpenAI`。 2. 提供商添加成功后,配置以下信息。 * **API 密钥**:[获取API Key](https://ark.volcengine.com/region:cn-beijing/apikey) * **API 地址**:`https://ark.cn-beijing.volces.com/api/v3` * **模型**:点击添加模型,填写要使用的 [模型 ID](/docs/model-list) 配置完成后,就可以在输入框中输入需求,与模型进行交互。 # 接入 Codex CLI > **注意** > > 对于个人开发场景,推荐订阅 [Agent Plan 套餐](/docs/agent-plan-personal-plan-overview),接入教程参见 [快速开始](/docs/agent-plan-personal-get-started)。 ## 安装步骤 > **说明** > > Coding Plan 支持 Responses API,可以使用最新版 Codex CLI。 前提条件:安装 [Node.js 18 或更新版本](https://nodejs.org/en/download/)。 在命令行界面,执行以下命令安装 Codex CLI。 ```Bash npm i -g @openai/codex ``` 安装结束后,执行以下命令检查版本。 ```Bash codex --version ``` ## 配置工具 1. 创建并打开 Codex 的配置文件。文件路径因系统而异,具体操作如下: **选项:macOS/Linux** macOS/Linux 系统 Codex 配置文件路径:`~/.codex/config.toml`。 1. 如果在主目录下没有`.codex`目录,执行以下命令创建目录。 ```Bash mkdir -p ~/.codex ``` 2. 创建并打开配置文件。 ```Bash nano ~/.codex/config.toml ``` **选项:Windows** Windows 系统 Codex 配置文件路径:`%USERPROFILE%\.codex\config.toml`。以 CMD 命令行方式为例,操作如下。 1. 如果当前用户目录下没有`.codex`目录,执行以下命令创建目录。 ```Bash if not exist "%USERPROFILE%\.codex" mkdir "%USERPROFILE%\.codex" ``` 2. 创建并打开配置文件。 ```Bash notepad "%USERPROFILE%\.codex\config.toml" ``` 2. 编辑 `config.toml`,需关注的配置信息如下: * ``:按需选择模型并获取 [Model ID](/docs/model-list)。 * `env_key`:设置的是环境变量名称,请不要直接修改 `ARK_API_KEY`,您需要在下一步设置该环境变量的值。 ```Plain Text model = "" model_provider = "volcengine" [model_providers.volcengine] name = "volcengine" base_url = "https://ark.cn-beijing.volces.com/api/v3" env_key = "ARK_API_KEY" wire_api = "responses" ``` > **注意** > > * `model_supports_reasoning_summaries = true`:开启推理能力。 > * `model_reasoning_effort`:控制思考长度,可以设置为 `low`、`medium`、`high`。 > * minimax-m2.7、kimi-k2.6、kimi-k2.7-code 不支持设置 `model_supports_reasoning_summaries = true`。 3. 配置环境变量,需要将 `ARK_API_KEY` 环境变量设置为 [API Key](https://ark.volcengine.com/region:cn-beijing/apikey)。 **选项:macOS / Linux** 1. 查看 Shell 类型。 ```Bash echo $SHELL ``` 2. 将环境变量写入 Shell 配置文件,使其在新开终端时自动生效。 * Zsh ```Bash # 需要将 YOUR_API_KEY 替换为 API Key。 echo 'export ARK_API_KEY="YOUR_API_KEY"' >> ~/.zshrc source ~/.zshrc ``` * Bash ```Bash # 需要将 YOUR_API_KEY 替换为 API Key。 echo 'export ARK_API_KEY="YOUR_API_KEY"' >> ~/.bashrc source ~/.bashrc ``` **选项:Windows** * CMD:环境变量设置完成后,新开 CMD 窗口生效。 ```Bash # 需要将 YOUR_API_KEY 替换为 API Key。 setx ARK_API_KEY "YOUR_API_KEY" # 新开窗口,检查环境变量是否生效 echo %ARK_API_KEY% ``` * PowerShell:环境变量设置完成后,新开 PowerShell 窗口生效。 ```Bash # 需要将 YOUR_API_KEY 替换为 API Key。 [Environment]::SetEnvironmentVariable("ARK_API_KEY", "YOUR_API_KEY", [EnvironmentVariableTarget]::User) # 新开窗口,检查环境变量是否生效 echo $env:ARK_API_KEY ``` ## 开始使用 执行以下命令启动 Codex CLI。 ```Bash codex ``` ## 在 Codex 中使用 Web Search 工具 在 codex 中调用方舟大模型服务时,您现在可以使用基于豆包搜索 Custom 版的 Web Search 工具。 ### 计费说明 参见[支持的工具](/docs/web-search#supported-tools)。 ### 开通插件 1. 登录方舟控制台,并打开 [应用组件库 > 豆包搜索](https://ark.volcengine.com/region:cn-beijing/openManagement?advancedActiveKey=component&tab=DoubaoSearch) 标签页。 2. 在**豆包搜索 Custom 版**的**操作**列中点击**开通服务**。 ### 使用方法 Codex 通过兼容 OpenAI Responses API 接口协议的服务调用豆包搜索能力。完成接入配置后,在 Codex 中对话时,如果模型判断您的问题需要通过搜索功能才能回答,那么模型会调用 Web Search 工具进行搜索。 > **注意** > > 调用 Web Search 工具时,大模型可能会发起额外的 API 请求来总结搜索结果,因此会消耗额外的 token。 ## 接入二方/三方 MCP Server 若内置工具未覆盖您的使用场景,可在 Codex CLI 中接入二方、三方 MCP Server(获取方式参见 [获取 MCP Server](/docs/integrate-third-party-tools#c5f28d13))。 编辑 `~/.codex/config.toml`(Windows 为 `%USERPROFILE%\.codex\config.toml`),添加 MCP Server 配置。 ```Plain Text [mcp_servers.] command = "<启动命令>" args = ["<启动参数>"] ``` 配置完成后重启 Codex CLI 生效。 # 接入 Claude Code > **注意** > > 对于个人开发场景,推荐订阅 [Agent Plan 套餐](/docs/agent-plan-personal-plan-overview),接入教程参见 [快速开始](/docs/agent-plan-personal-get-started)。 ## 安装步骤 前提条件: * 安装 [Node.js 18 或更新版本环境](https://nodejs.org/en/download/)。 * Windows 用户需安装 [Git for Windows](https://git-scm.com/download/win)。 在命令行界面,执行以下命令安装 Claude Code。 ```Bash npm install -g @anthropic-ai/claude-code ``` 安装结束后,执行以下命令查看安装结果,若显示版本号则安装成功。 ```Bash claude --version ``` ## 配置工具 完成Claude Code安装后,配置以下信息。 * **ANTHROPIC_BASE_URL**:`https://ark.cn-beijing.volces.com/api/compatible` * **ANTHROPIC_AUTH_TOKEN**:[获取API Key](https://ark.volcengine.com/region:cn-beijing/apikey) * **ANTHROPIC_MODEL**:[选择模型并获取 Model ID](/docs/model-list) 配置步骤如下: 1. 编辑或新增 `settings.json` 文件,需要替换配置信息中的以下信息: * ``:替换为 [API Key](https://ark.volcengine.com/region:cn-beijing/apikey)。 * ``:替换为要使用的 [模型 ID](/docs/model-list)。 > **说明** > > 不同系统配置文件路径不同,具体如下: > * macOS & Linux:`~/.claude/settings.json` > * Windows:`C:\Users\<用户名>\.claude\settings.json` 下面以 `doubao-seed-2-1-pro-260628` 为例,配置如下: ```JSON { "env": { "ANTHROPIC_AUTH_TOKEN": "", "ANTHROPIC_BASE_URL": "https://ark.cn-beijing.volces.com/api/compatible", "ANTHROPIC_MODEL": "doubao-seed-2-1-pro-260628", "ANTHROPIC_DEFAULT_HAIKU_MODEL": "doubao-seed-2-0-lite-260428", "ANTHROPIC_DEFAULT_SONNET_MODEL": "doubao-seed-2-1-pro-260628", "ANTHROPIC_DEFAULT_OPUS_MODEL": "doubao-seed-2-1-pro-260628", "CLAUDE_CODE_SUBAGENT_MODEL": "doubao-seed-2-1-pro-260628" } } ``` > **注意** > > * 推荐使用完整模型配置,并按任务复杂度选择模型:Haiku(轻量)、Sonnet(日常)、Opus(复杂)。 > * `CLAUDE_CODE_SUBAGENT_MODEL` 建议与主模型保持一致。 > * `ANTHROPIC_DEFAULT_HAIKU_MODEL` 建议设置为小尺寸模型,例如 `doubao-seed-2-0-lite-250428`,通常不会影响整体使用效果。 2. 编辑或新增 `.claude.json` 文件,修改或新增 `hasCompletedOnboarding` 字段值为 true。 > **说明** > > 不同系统配置文件路径不同,具体如下: > * macOS & Linux:`~/.claude.json` > * Windows:`C:\Users\<用户名>\.claude.json` ```JSON { "hasCompletedOnboarding": true } ``` 保存配置文件后,在新的终端窗口执行后续命令。 ## 使用 CC Switch CC Switch 是一款跨平台桌面应用,专为使用 AI 编程工具的开发者设计。它帮助你统一管理 Claude Code、Claude Desktop、Codex、Gemini CLI、OpenCode、OpenClaw 和 Hermes 等受管应用的配置。 ### 支持的平台 - Windows 10 及以上 - macOS 12 (Monterey) 及以上 - Linux Ubuntu 22.04+ / Debian 11+ / Fedora 34+(x64 / ARM64) ### 安装 > 更多安装方式和详细说明请参考 [CC Switch 官方文档](https://github.com/farion1231/cc-switch)。 **选项:macOS** - **Homebrew(推荐)**: ```Bash brew tap farion1231/ccswitch brew install --cask cc-switch ``` - **手动下载**:从 [Releases 页面](https://github.com/farion1231/cc-switch/releases) 下载 `.dmg`。 **选项:Linux** - **Arch 发行版**: ```Bash paru -S cc-switch-bin ``` - **其他发行版**:根据架构(Debian / Ubuntu)从 [Releases 页面](https://github.com/farion1231/cc-switch/releases) 下载 `.deb` / `.rpm`,或者下载 `.AppImage`(通用)。 **选项:Windows** - 从 [Releases 页面](https://github.com/farion1231/cc-switch/releases) 下载 `.msi` 安装包或 `.zip` 绿色版。 ### 添加供应商 1. 在 CC Switch 中添加供应商: 1. 在主界面顶部图标栏选中 Claude Code 图标,点击右上角 **+** 进入添加新供应商。 2. 选择 **自定义配置**,填写以下信息: - **API Key**:替换为您的 [API Key](https://ark.volcengine.com/region:cn-beijing/apikey) - **请求地址**: `https://ark.cn-beijing.volces.com/api/compatible` 3. 展开高级选项,根据当前支持的模型范围,分别配置 Sonnet、Opus、Fable、Haiku 模型,可配置的模型见 [选择模型并获取 Model ID](/docs/model-list)。 > **注意** > > 建议 Haiku 设置为小尺寸模型。 4. 选择右下角 **添加**,完成供应商配置。 2. 回到首页,点击右侧 **启用** 按钮,新开一个 Claude Code 会话使配置生效。 ## 使用 Claude Code * 启动Claude Code:进入项目目录,执行`claude`命令,即可开始使用Claude Code。 ```Bash cd my-project claude ``` * 模型状态验证:输入`/status`确认模型状态。 ![Image](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/88d72ac928024768928848a622755b6b~tplv-goo7wpa0wc-image.image) ## 使用 Claude Code IDE 插件 1. 安装 Claude Code 并配置好环境变量,具体参考 [接入Claude Code](/docs/integrate-third-party-tools#adcc555a)。 Claude Code IDE 插件依赖 Claude Code CLI 工具,需先完成 Claude Code的安装及配置。 2. 安装并使用 IDE 插件。 > 因 IDE 插件会迭代演进,以下内容仅供参考,具体的安装及使用可参考 [Visual Studio Code](https://code.claude.com/docs/en/vs-code)、[JetBrains IDEs](https://code.claude.com/docs/en/jetbrains)。 **选项:Claude Code VSCode 插件** > **说明** > > Claude Code VSCode 插件支持在 VSCode 及基于 VSCode 的 IDE(如 Cursor、Trae 等)中使用。 ### 安装插件 打开 VSCode,在扩展市场搜索`claude code`进行安装。 ![Image](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/6c39c8cb4ec84f03bb0ca2444804eac7~tplv-goo7wpa0wc-image.image) ### 配置环境变量 1. 安装完成后,点击 VSCode 右上角的 Claude Code 图标,进入 Claude Code 页面。 ![Image](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/388665c0f9ed47379faa5291e180a6b2~tplv-goo7wpa0wc-image.image) 2. 在对话框中输入 `/config`回车进入 settings 配置页面。 3. 在 **Claude Code: Environment Variables** 区域单击 **Edit in settings.json**,修改`claudeCode.environmentVariables`、`claudeCode.selectedModel`。 > **说明** > > 需要替换配置信息中的以下信息: > * ``:替换为 [API Key](https://ark.volcengine.com/region:cn-beijing/apikey)。 > * ``:替换为上述支持的模型名称,如 doubao-seed-evolving。 ```JSON ... "claudeCode.environmentVariables": [ { "name": "ANTHROPIC_BASE_URL", "value": "https://ark.cn-beijing.volces.com/api/compatible" }, { "name": "ANTHROPIC_AUTH_TOKEN", "value": "" }, { "name": "ANTHROPIC_MODEL", "value": "" } ], "claudeCode.selectedModel": "", ... ``` 保存配置信息后,即可开始使用 Claude Code。 **选项:Claude Code Jetbrains 插件** > **说明** > > Claude Code Jetbrains 插件支持 Jetbrains 的系列 IDE 如 IntelliJ IDEA、PyCharm、WebStorm 等。 ### 安装插件 打开 Jetbrains IDE,在插件市场搜索`claude code`进行安装。 ![Image](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/5859916985a34036bb41f5097ba58f6c~tplv-goo7wpa0wc-image.image) ### 开始使用 安装完成后,重启IDE后,单击Claude Code 图标,进入 Claude Code 页面开始使用。 ## 在 Claude Code 中使用 Web Search 工具 在 Claude Code 中调用方舟大模型服务时,您现在可以使用基于豆包搜索 Custom 版的 Web Search 工具。 ### 计费说明 参见[支持的工具](/docs/web-search#supported-tools)。 ### 开通插件 1. 登录方舟控制台,并打开 [应用组件库 > 豆包搜索](https://ark.volcengine.com/region:cn-beijing/openManagement?advancedActiveKey=component&tab=DoubaoSearch) 标签页。 2. 在**豆包搜索 Custom 版**的**操作**列中点击**开通服务**。 ### 使用方法 Claude Code 通过兼容 Anthropic Messages 接口协议的服务调用豆包搜索能力。完成接入配置后,在 Claude Code 中对话时,如果模型判断您的问题需要通过搜索功能才能回答,那么模型会调用 Web Search 工具进行搜索。 > **注意** > > 调用 Web Search 工具时,大模型可能会发起额外的 API 请求来总结搜索结果,因此会消耗额外的 token。 ![claude-code-web-search-example.png](https://arkdocs.tos-cn-beijing.volces.com/images/tool-calling/claude-code-web-search-example.png) ## 接入二方/三方 MCP Server 与 Skill 若内置工具未覆盖您的使用场景,可在 Claude Code 中接入二方、三方 MCP Server 与 Skill(MCP Server 获取方式参见 [获取 MCP Server](/docs/integrate-third-party-tools#c5f28d13))。 1. 接入 MCP Server:执行以下命令添加(以 stdio 类型为例)。 ```Bash claude mcp add -- <启动命令> <启动参数> ``` 添加完成后,可执行 `claude mcp list` 查看已接入的 MCP Server。更多说明(如 HTTP/SSE 类型、作用域管理)参考 [Claude Code 官方文档](https://code.claude.com/docs/en/mcp)。 2. 接入 Skill:将 Skill 目录放入 `~/.claude/skills/`(个人全局)或项目下的 `.claude/skills/` 目录即可,详情参考 [Claude Code Skills 说明](https://code.claude.com/docs/en/skills)。 # 接入 OpenCode > **注意** > > 对于个人开发场景,推荐订阅 [Agent Plan 套餐](/docs/agent-plan-personal-plan-overview),接入教程参见 [快速开始](/docs/agent-plan-personal-get-started)。 ## 安装步骤 在命令行界面,执行以下命令安装 OpenCode。 ```Bash npm install -g opencode-ai ``` 安装结束后,执行以下命令查看安装结果,若显示版本号则安装成功。 ```Bash opencode --version ``` ## 配置工具 1. 编辑OpenCode的配置文件,路径如下: - macOS / Linux:~/.config/opencode/opencode.json - Windows:C:\Users\您的用户名\.config\opencode\opencode.json 以配置模型`doubao-seed-evolving`为例,配置信息如下。 > **说明** > > * 替换配置信息中的 [](https://ark.volcengine.com/region:cn-beijing/apikey)。 > * 按需选择模型并获取 [Model ID](/docs/model-list)。 ```JSON { "$schema": "https://opencode.ai/config.json", "provider": { "myprovider": { "npm": "@ai-sdk/openai-compatible", "name": "volcengine", "options": { "baseURL": "https://ark.cn-beijing.volces.com/api/v3", "apiKey": "" }, "models": { "doubao-seed-evolving": { "name": "doubao-seed-evolving" } } } } } ``` ## 开始使用 1. 启动OpenCode: ```Bash opencode ``` 2. 输入`/models`,选择配置的`doubao-seed-evolving`模型并在 OpenCode 中使用。 ![Image](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/7dbba85371b14b998a8ab8324e8d8bd2~tplv-goo7wpa0wc-image.image) ## 接入二方/三方 MCP Server 若内置工具未覆盖您的使用场景,OpenCode 支持在设置中配置二方、三方 MCP Server(获取方式参见 [获取 MCP Server](/docs/integrate-third-party-tools#c5f28d13)),具体操作参考 OpenCode 官方文档。 # 接入 OpenClaw(原 Clawdbot) > **注意** > > 对于个人开发场景,推荐订阅 [Agent Plan 套餐](/docs/agent-plan-personal-plan-overview),接入教程参见 [快速开始](/docs/agent-plan-personal-get-started)。 ## 安装步骤 1. 执行以下命令安装 OpenClaw。 **选项:macOS** ```Bash curl -fsSL https://openclaw.ai/install.sh | bash ``` **选项:Windows** Windows PowerShell 环境下安装命令如下: ```Bash iwr -useb https://openclaw.ai/install.ps1 | iex ``` 2. 根据提示信息完成 OpenClaw 配置,配置信息如下。 > **注意** > > OpenClaw 在不断迭代,如果实际使用与以下配置存在差异,可以选择 "Skip" 或默认选项完成配置流程,后续可以参考文档配置并使用 Agent Plan。 |提示信息 |配置 | |---|---| |I understand this is personal-by-default and shared/multi-user use requires lock-down. Continue? |选择 "Yes" | |Setup mode |选择 “QuickStart” | |Model/auth provider |选择 "Skip for now",后续可以配置。 | |Default model |选择 "Keep current" | |Select channel (QuickStart) |选择 “Skip for now”,后续可以配置。 | |Search provider |选择 “Skip for now” | |Configure skills now? (recommended) |选择 “No”,后续可以配置。 | | Enable hooks? |选择 "Skip for now"。选择方式:按空格键选中选项,按回车键进入下一步。 | |How do you want to hatch your bot? |选择 "Hatch in Terminal"。 | ## 配置工具 > **注意** > > `glm-5.2`、`deepseek-v4-flash`、`deepseek-v4-pro` 支持 1M 上下文窗口用于包含大型代码库的长会话,可以通过 `contextWindow` 字段显式指定窗口大小。 **选项:Web UI 方式** 1. 执行以下命令打开 Web UI。 ```Bash openclaw dashboard ``` 2. 在左侧菜单栏选择**配置** - **Settings** - **Advanced**,单击 **Open** 查看并修改配置信息。具体配置信息如下,其中需要修改的核心配置信息如下: - baseUrl:https://ark.cn-beijing.volces.com/api/v3 - apiKey:[获取API Key](https://ark.volcengine.com/region:cn-beijing/apikey) - models:[选择模型并获取 Model ID](/docs/model-list) > **注意** > > * 如果已经配置过 OpenClaw,请勿直接覆盖原有配置,建议根据提供的配置更新`models`、`agents` 和 `gateway` 节点信息。其中`models`节点包含支持的模型列表。 ```JSON { "models": { "providers": { "volcengine": { "baseUrl": "https://ark.cn-beijing.volces.com/api/v3", "apiKey": "", "api": "openai-completions", "models": [ { "id": "doubao-seed-1-8-251228", "name": "doubao-seed-1-8-251228" } ] } } }, "agents": { "defaults": { "model": { "primary": "volcengine/doubao-seed-1-8-251228" }, "models": { "volcengine/doubao-seed-1-8-251228": {} } } }, "gateway": { "mode": "local" } } ``` 3. 配置完成后,先保存配置文件,然后单击 **Update** 更新配置,配置更新完成后需要重新连接服务进入 Web UI。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/be24b57cff314b749016abd2fd3ada7a~tplv-goo7wpa0wc-image.image) **选项:终端方式** 1. 在终端执行以下命令打开 OpenClaw 配置文件。 ```Bash nano ~/.openclaw/openclaw.json ``` 2. 修改配置信息,其中需要修改的核心配置信息如下: - baseUrl:https://ark.cn-beijing.volces.com/api/v3 - apiKey:[获取API Key](https://ark.volcengine.com/region:cn-beijing/apikey) - models:[选择模型并获取 Model ID](/docs/model-list) > **注意** > > * 如果已经配置过 OpenClaw,请勿直接覆盖原有配置,建议根据提供的配置更新`models`、`agents` 和 `gateway` 节点信息。其中`models`节点包含支持的模型列表。 ```JSON { "models": { "providers": { "volcengine": { "baseUrl": "https://ark.cn-beijing.volces.com/api/v3", "apiKey": "", "api": "openai-completions", "models": [ { "id": "doubao-seed-1-8-251228", "name": "doubao-seed-1-8-251228" } ] } } }, "agents": { "defaults": { "model": { "primary": "volcengine/doubao-seed-1-8-251228" }, "models": { "volcengine/doubao-seed-1-8-251228": {} } } }, "gateway": { "mode": "local" } } ``` 3. 配置完成后保存文件,并在终端执行以下命令重启服务使更改生效。 ```Bash openclaw gateway restart ``` ## 开始使用 * 打开 TUI,并查看 Gateway 状态。 ```JSON openclaw tui /status ``` * 打开 Web UI,在 Chat 页面进行交互。 ```JSON openclaw dashboard ``` ## 接入 Skill 若内置工具未覆盖您的使用场景,OpenClaw 支持 Skill 配置:在安装向导中选择 **Configure skills now**,或后续在设置中配置,具体操作参考 OpenClaw 官方文档。 # 接入 TRAE ## 安装 TRAE CN 访问 [TRAE 官网](https://www.trae.cn/) 下载并安装对应操作系统的版本。 ## 配置工具 1. 选择**个人用户**入口登录后,点击界面右上角的 **设置** 图标,进入设置中心。 2. 在左侧导航栏中,选择 **模型**,在模型管理页面进行配置。 3. 点击 **+ 添加模型** 按钮,界面上显示 **添加模型** 窗口,在窗口中配置以下信息。 * **服务商**:**火山引擎** * **模型**: * 直接从列表中选择 TRAE 预置的模型(均为默认版本)。 * 若希望使用其他模型,单击**使用其他模型**,然后在输入框中填写 **模型 ID** 配置信息。 * **API 密钥**:[获取API Key](https://ark.volcengine.com/region:cn-beijing/apikey) ## 切换模型 在 AI 对话输入框的右下角,单击当前模型名称,在模型列表中,选择配置的模型。 选定模型后,即可使用 TRAE 进行开发任务了。 ## 接入二方/三方 MCP Server 若内置工具未覆盖您的使用场景,TRAE 支持在设置中配置二方、三方 MCP Server(获取方式参见 [获取 MCP Server](/docs/integrate-third-party-tools#c5f28d13)),具体操作参考 TRAE 官方文档。 # 接入 Cline > **注意** > > 对于个人开发场景,推荐订阅 [Agent Plan 套餐](/docs/agent-plan-personal-plan-overview),接入教程参见 [快速开始](/docs/agent-plan-personal-get-started)。 ## 安装步骤 打开 VSCode,在扩展市场搜索`Cline`安装。 ## 配置工具 Cline插件安装完成后,您需要配置以下信息。 * **API Provider**:`OpenAI Compatible`(Agent Plan 接口兼容 OpenAI 标准) * **Base URL**:`https://ark.cn-beijing.volces.com/api/v3` * **API Key**:[获取API Key](https://ark.volcengine.com/region:cn-beijing/apikey) * **Model ID**:按需选择模型并获取 [Model ID](/docs/model-list) 配置完成后,就可以在输入框中输入需求,与模型进行交互。 ## 接入二方/三方 MCP Server 若内置工具未覆盖您的使用场景,Cline 支持在设置中配置二方、三方 MCP Server(获取方式参见 [获取 MCP Server](/docs/integrate-third-party-tools#c5f28d13)),具体操作参考 Cline 官方文档。 # 接入 Cursor > **注意** > > 对于个人开发场景,推荐订阅 [Agent Plan 套餐](/docs/agent-plan-personal-plan-overview),接入教程参见 [快速开始](/docs/agent-plan-personal-get-started)。 ## 安装步骤 官网下载安装包:通过 [Cursor官网](https://cursor.com/features) 下载并安装Cursor。 ## 配置工具 > **说明** > > 由于 Cursor 的限制,只有订阅了 Cursor Pro 及以上套餐的用户才支持自定义配置模型。 Cursor安装完成后,Models 模块的具体配置如下: * OpenAI API Key:[获取API Key](https://ark.volcengine.com/region:cn-beijing/apikey) * Override OpenAI Base URL:`https://ark.cn-beijing.volces.com/api/v3` * Add Custom Model:按需选择模型并获取 [Model ID](/docs/model-list) 配置完成后,即可在聊天面板中选择配置的模型进行交互。 # 接入 Roo Code > **注意** > > 对于个人开发场景,推荐订阅 [Agent Plan 套餐](/docs/agent-plan-personal-plan-overview),接入教程参见 [快速开始](/docs/agent-plan-personal-get-started)。 ## 安装步骤 打开 VSCode,在扩展市场搜索`Roo Code`进行安装,安装完成后选择信任发布者。 ![Image](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/dd47c5150044469cb4e95b8de067d817~tplv-goo7wpa0wc-image.image) ## 配置工具 安装完成后,配置以下信息。 * **API Provider**:`OpenAI Compatible`(Agent Plan 接口兼容 OpenAI 标准) * **Base URL**:`https://ark.cn-beijing.volces.com/api/v3` * **API Key**:[获取API Key](https://ark.volcengine.com/region:cn-beijing/apikey) * **Model**:按需选择模型并获取 [Model ID](/docs/model-list) 配置完成后,就可以在输入框中输入需求,与模型进行交互。 ## 接入二方/三方 MCP Server 若内置工具未覆盖您的使用场景,Roo Code 支持在设置中配置二方、三方 MCP Server(获取方式参见 [获取 MCP Server](/docs/integrate-third-party-tools#c5f28d13)),具体操作参考 Roo Code 官方文档。 # 接入 Kilo Code > **注意** > > 对于个人开发场景,推荐订阅 [Agent Plan 套餐](/docs/agent-plan-personal-plan-overview),接入教程参见 [快速开始](/docs/agent-plan-personal-get-started)。 ## 安装步骤 打开 VSCode,在扩展市场搜索`kilo code`进行安装,安装完成后选择信任发布者。 ![Image](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/3e991c168c0c49bc9449f6f6efc29bd7~tplv-goo7wpa0wc-image.image) ## 配置工具 选择Use your own API key,然后配置以下信息。 * **API Provider**:`OpenAI Compatible`(Agent Plan 接口兼容 OpenAI 标准) * **Base URL**:`https://ark.cn-beijing.volces.com/api/v3` * **API Key**:[获取API Key](https://ark.volcengine.com/region:cn-beijing/apikey) * **Model**:按需选择模型并获取 [Model ID](/docs/model-list) 配置完成后,就可以在输入框中输入需求,与模型进行交互。 ## 接入二方/三方 MCP Server 若内置工具未覆盖您的使用场景,Kilo Code 支持在设置中配置二方、三方 MCP Server(获取方式参见 [获取 MCP Server](/docs/integrate-third-party-tools#c5f28d13)),具体操作参考 Kilo Code 官方文档。 --- # 迁移至 Responses API Source: https://ark.volcengine.com/region:cn-beijing/docs/responses-api-migration Responses API 是火山方舟最新推出的 API 接口,原生支持高效的上下文管理,支持更简洁的输入输出格式,并且工具调用方式也更加便捷,不仅延续了 Chat API 的易用性,还结合了更强的智能代理能力。 随着大模型技术不断升级,Responses API 为开发各类面向实际行动的应用提供了更灵活的基础,并且支持工具调用多种扩展能力,非常适合搭建智能助手、自动化工具等场景。 ## Responses API 核心优势 与 Chat API 相比,Responses API 在能力上具备多方面优势。 * 简洁的输入输出格式:输入为字符串或数组格式,输出为包含自身 ID 的 Response 对象且默认会被存储。 * 高效的上下文管理:默认开启存储功能,在多轮对话模式下能够自动管理上下文,避免了手动维护上下文的繁琐过程,提升智能交互体验。 * 低成本的上下文缓存:通过缓存常用上下文信息,减少每次请求重复处理加载开销,降低成本。 * 便捷的工具调用:支持多种工具调用方式,如内置工具联网搜索、图像处理、私域知识库搜索、云部署 MCP 等,提升开发和集成效率。 * 良好的扩展性:未来将陆续支持更多内置工具,为开发者提供更丰富、更灵活的智能应用开发能力。 | | | | | |能力 ||Chat API |Responses API | |---|---|---|---| | | | | | |文本生成 ||![支持](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/aba4522e4aab46318574c8c3e460d20b~tplv-goo7wpa0wc-image.image) |![支持](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/aba4522e4aab46318574c8c3e460d20b~tplv-goo7wpa0wc-image.image) | |视觉理解 ||![支持](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/aba4522e4aab46318574c8c3e460d20b~tplv-goo7wpa0wc-image.image) |![支持](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/aba4522e4aab46318574c8c3e460d20b~tplv-goo7wpa0wc-image.image) | |结构化输出 ||beta阶段 |beta阶段 | |工具调用 |函数调用 Function Calling |![支持](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/aba4522e4aab46318574c8c3e460d20b~tplv-goo7wpa0wc-image.image) |![支持](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/aba4522e4aab46318574c8c3e460d20b~tplv-goo7wpa0wc-image.image) | | | | | | |^^| | | | \ | |联网搜索 Web Search |![不支持](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/96a134db51ea4e8d83b5c9dccff686c3~tplv-goo7wpa0wc-image.image) |![支持](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/aba4522e4aab46318574c8c3e460d20b~tplv-goo7wpa0wc-image.image) | | | | | | |^^| | | | \ | |图像处理 Image Process |![不支持](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/96a134db51ea4e8d83b5c9dccff686c3~tplv-goo7wpa0wc-image.image) |![支持](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/aba4522e4aab46318574c8c3e460d20b~tplv-goo7wpa0wc-image.image) | | | | | | |^^| | | | \ | |私域知识库搜索 Knowledge Search |![不支持](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/96a134db51ea4e8d83b5c9dccff686c3~tplv-goo7wpa0wc-image.image) |![支持](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/aba4522e4aab46318574c8c3e460d20b~tplv-goo7wpa0wc-image.image) | | | | | | |^^| | | | \ | |云部署 MCP |![不支持](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/96a134db51ea4e8d83b5c9dccff686c3~tplv-goo7wpa0wc-image.image) |![支持](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/aba4522e4aab46318574c8c3e460d20b~tplv-goo7wpa0wc-image.image) | | | | | | |上下文缓存 ||![不支持](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/96a134db51ea4e8d83b5c9dccff686c3~tplv-goo7wpa0wc-image.image) |![支持](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/aba4522e4aab46318574c8c3e460d20b~tplv-goo7wpa0wc-image.image) | \ | | | | | \ | | | |> 250615之后的模型版本支持 | > **说明** > > Responses API 不支持的场景如下: > * 不支持使用 TPM 保障包。 > * 不支持精调后模型的在线推理。 > > * 不支持智能模型路由。 > * 不支持在线推理服务的模型版本切换。 ## 支持模型 250615及之后版本的大语言模型,如无特殊说明,默认支持 Responses API,方舟平台大语言模型列表,请参见:[文本生成能力](/docs/model-list#32e9e053)。 ## 基础差异 Chat API (`/chat/completions`) 与 Responses API (`/responses`) 输入和输出格式略有不同。 * 输入:Chat API 需要传入一个消息(messages)数组,而 Responses API 则接受字符串或数组格式的输入。同时,在 Responses API 中,支持使用 **instructions** 字段在特定轮次中补充系统提示词,使用方式请参见[补充系统提示词](/docs/responses-api-text-generation#6855e23d)。 * 输出:Chat API 返回 message,而 Responses API 返回一个包含自身 ID 的 response 对象。 通过以下示例快速体验两个 API 使用上的差异。 |Chat API |Responses API | |---|---| |输入示例 |输入示例 | \ | | | \ |```Python |```Python | \ |import os |import os | \ |from arkruntime import Ark |from arkruntime import Ark | \ | | | \ |client = Ark( |client = Ark( | \ | base_url="https://ark.cn-beijing.volces.com/api/v3", | base_url='https://ark.cn-beijing.volces.com/api/v3', | \ | api_key=os.getenv('ARK_API_KEY'), | api_key=os.getenv('ARK_API_KEY'), | \ |) |) | \ | | | \ |completion = client.chat.completions.create( |response = client.responses.create( | \ | model = "doubao-seed-2-1-pro-260915", | model="doubao-seed-2-1-pro-260915", | \ | messages=[ | input="Hello.", | \ | {"role": "user", "content": "Hello."}, |) | \ | ], | | \ |) |print(response) | \ |print(completion) |``` | \ |``` | | |输出示例 |输出示例 | \ | | | \ |```JSON |```JSON | \ |{ |{ | \ | "choices": [ | "created_at": 1765193461, | \ | { | "id": "resp_0217651934613099e1bacc68b98f823c2af95ea68bff0aec36f83", | \ | "finish_reason": "stop", | "max_output_tokens": 32768, | \ | "index": 0, | "model": "doubao-seed-2-1-pro-260915", | \ | "logprobs": null, | "object": "response", | \ | "message": { | "output": [ | \ | "content": "Hello! How can I assist you today? Whether you have a question you'd like answered, want to chat about something that's on your mind, or need help with a specific task, feel free to share—I'm here to help. 😊", | { | \ | "reasoning_content": "\nGot it, let's see. The user just said \"Hello.\" I need to respond in a friendly way. Since the system prompt mentions I'm an AI assistant who can answer questions, chat, and provide information, I should keep it open-ended to encourage them to share what they need help with. Maybe something like \"Hello! How can I assist you today? Whether you have a question, want to chat about something, or need help with a task, feel free to let me know.\" That sounds natural and covers the points from the system prompt.", | "id": "rs_02176519346192100000000000000000000ffffac15322033925d", | \ | "role": "assistant" | "type": "reasoning", | \ | } | "summary": [ | \ | } | { | \ | ], | "type": "summary_text", | \ | "created": 1765193367, | "text": "\nGot it, let's see. The user said \"hello.\" First, I need to respond in a friendly way. Since the system prompt mentions being a helpful assistant, I should greet back and maybe invite them to ask whatever they need help with. Let me make it natural. Like, \"Hello! How can I assist you today?\" That's simple and open-ended. Yeah, that works." | \ | "id": "0217651933631536335e3dfd75940b9979797202ce7ea2a894823", | } | \ | "model": "doubao-seed-2-1-pro-260915", | ], | \ | "service_tier": "default", | "status": "completed" | \ | "object": "chat.completion", | }, | \ | "usage": { | { | \ | "completion_tokens": 164, | "type": "message", | \ | "prompt_tokens": 35, | "role": "assistant", | \ | "total_tokens": 199, | "content": [ | \ | "prompt_tokens_details": { | { | \ | "cached_tokens": 0 | "type": "output_text", | \ | }, | "text": "Hello! How can I assist you today? Whether you have a question, need help with a task, or just want to chat, feel free to let me know. 😊" | \ | "completion_tokens_details": { | } | \ | "reasoning_tokens": 114 | ], | \ | } | "status": "completed", | \ | } | "id": "msg_02176519346378200000000000000000000ffffac153220cfab51" | \ |} | } | \ |``` | ], | \ | | "service_tier": "default", | \ | | "status": "completed", | \ | | "usage": { | \ | | "input_tokens": 35, | \ | | "output_tokens": 118, | \ | | "total_tokens": 153, | \ | | "input_tokens_details": { | \ | | "cached_tokens": 0 | \ | | }, | \ | | "output_tokens_details": { | \ | | "reasoning_tokens": 82 | \ | | } | \ | | }, | \ | | "caching": { | \ | | "type": "disabled" | \ | | }, | \ | | "store": true, | \ | | "expire_at": 1765452661 | \ | |} | \ | |``` | ## 进阶能力适配 ### 更新多轮对话 在多轮对话场景中,使用 Responses API 能够更高效的管理上下文,避免了手动维护上下文的繁琐过程。 * Chat API 是无状态的,每次请求时需要将历史信息放在 **messages** 中,并通过 **role** 字段设置,以便进行主题相关的延续性对话。具体使用参见[多轮对话](/docs/text-generation#f6222fec)。 * Responses API 默认开启存储功能,方便进行上下文管理,通过 **previous_response_id** 引入对应请求的输入和回复,实现智能交互体验。具体使用参见[上下文管理](/docs/responses-api-text-generation#6d3df616)。 |Chat API |Responses API | |---|---| |```Python |```Python | \ |import os |import os | \ |from arkruntime import Ark |from arkruntime import Ark | \ | | | \ |client = Ark( |client = Ark( | \ | base_url="https://ark.cn-beijing.volces.com/api/v3", | base_url='https://ark.cn-beijing.volces.com/api/v3', | \ | api_key=os.getenv('ARK_API_KEY'), | api_key=os.getenv('ARK_API_KEY'), | \ |) |) | \ | | | \ |completion = client.chat.completions.create( |# Create the first-round conversation request | \ | # Replace with Model ID |response = client.responses.create( | \ | model = "doubao-seed-2-1-pro-260915", | model="doubao-seed-2-1-pro-260915", | \ | messages=[ | input=[{"role": "user", "content": "Hi,帮我讲个笑话。"}], | \ | {"role": "user","content": "Hi,帮我讲个笑话。"}, | | \ | |) | \ | {"role": "assistant","content":"我把洗面奶当牙膏挤,刷完牙才发现味道不对。"}, |print(response) | \ | | | \ | {"role": "user","content": "这个笑话的笑点在哪?"} |# Create the second-round conversation request | \ | |second_response = client.responses.create( | \ | ] | model="doubao-seed-2-1-pro-260915", | \ |) | previous_response_id=response.id, | \ |print(completion.choices[0].message.content) | input=[{"role": "user", "content": "这个笑话的笑点在哪?"}], | \ |``` | | \ | |) | \ | |print(second_response) | \ | |``` | ### 更新结构化输出定义 定义结构化输出的方式: * Chat API:**response_format**,具体使用参见[结构化输出(beta)](/docs/structured-output-beta)。 * Responses API:**text.format**,具体使用参见[结构化输出(beta)](/docs/responses-api-structured-output)。 |Chat API |Responses API | |---|---| |```Python |```Python | \ |import os |import os | \ |from arkruntime import Ark |from arkruntime import Ark | \ | | | \ |client = Ark( |client = Ark( | \ | base_url="https://ark.cn-beijing.volces.com/api/v3", | base_url='https://ark.cn-beijing.volces.com/api/v3', | \ | api_key=os.getenv('ARK_API_KEY'), | api_key=os.getenv('ARK_API_KEY'), | \ |) |) | \ | | | \ |completion = client.chat.completions.create( |response = client.responses.create( | \ | model = "doubao-seed-2-1-pro-260915", | model="doubao-seed-2-1-pro-260915", | \ | messages=[ | input=[ | \ | {"role": "user", "content": "常见的十字花科植物有哪些?json输出"}, | {"role": "user", "content": "常见的十字花科植物有哪些?json输出"}, | \ | | | \ | ], | ], | \ | response_format={"type":"json_object"}, | text={"format":{"type": "json_object"}}, | \ | thinking={"type": "disabled"},# 不使用深度思考能力 | thinking={"type": "disabled"},# 不使用深度思考能力 | \ |) |) | \ |print(completion.choices[0].message.content) |print(response) | \ |``` |``` | ### 更新最大输出长度参数 * Chat API:通过参数 **max_completion_tokens** 控制模型最大输出长度,具体教程参见[设置最大输出长度](/docs/deep-thinking#cfc7c5a8)。 * Responses API:通过参数 **max_output_tokens** 控制模型最大输出长度,具体教程参见[设置最大输出长度](/docs/responses-api-deep-thinking#1460ba95)。 |Chat API |Responses API | |---|---| |```Python |```Python | \ |import os |import os | \ |from arkruntime import Ark |from arkruntime import Ark | \ | | | \ |client = Ark( |client = Ark( | \ | base_url="https://ark.cn-beijing.volces.com/api/v3", | base_url='https://ark.cn-beijing.volces.com/api/v3', | \ | api_key=os.getenv('ARK_API_KEY'), | api_key=os.getenv('ARK_API_KEY'), | \ |) |) | \ | | | \ |completion = client.chat.completions.create( |response = client.responses.create( | \ | model = "doubao-seed-2-1-pro-260915", | model="doubao-seed-2-1-pro-260915", | \ | messages=[ | input=[ | \ | {"role": "system", "content": "你是 AI 人工智能助手"}, | {"role": "system", "content": "你是 AI 人工智能助手"}, | \ | {"role": "user", "content": "常见的十字花科植物有哪些?"}, | {"role": "user", "content": "常见的十字花科植物有哪些?"}, | \ | | | \ | | | \ | ], | ], | \ | max_completion_tokens = 1024, | max_output_tokens = 1024, | \ |) |) | \ |print(completion.choices[0].message.content) |print(response) | \ |``` |``` | ### 使用上下文缓存能力 Context API 支持上下文缓存能力,而 Responses API 在缓存操控方面更加灵活,支持进行 ID 粒度的使用及变更。关于两种使用方式,参见[上下文缓存](/docs/context-cache)。 其中,`` 请替换为您的推理接入点 ID。 |Context API |Responses API | |---|---| |```Python |```Python | \ |import datetime |import os | \ |import os |from arkruntime import Ark | \ |from arkruntime import Ark | | \ | |client = Ark( | \ |client = Ark( | base_url='https://ark.cn-beijing.volces.com/api/v3', | \ | base_url='https://ark.cn-beijing.volces.com/api/v3', | api_key=os.getenv('ARK_API_KEY'), | \ | api_key=os.environ.get("ARK_API_KEY"), |) | \ |) | | \ | |response = client.responses.create( | \ |response = client.context.create( | model="doubao-seed-2-1-pro-260915", | \ | model="", | input=[ | \ | mode="session", | {"role": "system", "content": "你是李雷"}, | \ | messages=[ | | \ | {"role": "system", "content": "你是李雷"}, | ], | \ | | caching={"type": "enabled"}, | \ | ], | thinking={"type": "disabled"}, | \ | ttl=datetime.timedelta(minutes=60), |) | \ |) |print(response.output[0].content[0].text) | \ |print(response) |print("----- chat round 1 -----") | \ | |first_response = client.responses.create( | \ |print("----- chat round 1 -----") | model="doubao-seed-2-1-pro-260915", | \ |first_response = client.context.completions.create( | previous_response_id=response.id, | \ | context_id=response.id, | input=[{"role": "user", "content": "我是方方"}], | \ | model="", | | \ | messages=[ | caching={"type": "enabled"}, | \ | {"role": "user", "content": "我是方方"}, | thinking={"type": "disabled"}, | \ | |) | \ | ] |print(first_response.output[0].content[0].text) | \ |) |print("----- chat round 2 -----") | \ |print(first_response.choices[0].message.content) |second_response = client.responses.create( | \ | | model="doubao-seed-2-1-pro-260915", | \ |print("----- chat round 2 -----") | previous_response_id=first_response.id, | \ |second_response = client.context.completions.create( | input=[{"role": "user", "content": "你是谁,我是谁?"}], | \ | context_id=response.id, | | \ | model="", | caching={"type": "enabled"}, | \ | messages=[ | thinking={"type": "disabled"}, | \ | {"role": "user", "content": "你是谁,我是谁?"}, |) | \ | |print(second_response.output[0].content[0].text) | \ | ] |``` | \ |) | | \ |print(second_response.choices[0].message.content) | | \ |``` | | ### 使用工具调用 #### 更新函数定义 Responses API 和 Chat API 在定义 function 函数方面有细微区别,具体使用教程参见[Function Calling(函数调用)](/docs/function-calling)。 |Chat API |Responses API | |---|---| |```JSON |```JSON | \ |[ |[ | \ | { | { | \ | "type": "function", | "type": "function", | \ | "function": { | "name": "get_weather", | \ | "name": "get_weather", | "description": "根据城市名称查询该城市当日天气(含温度、天气状况)", | \ | "description": "根据城市名称查询该城市当日天气(含温度、天气状况)", | | \ | | "parameters": { | \ | "parameters": { | "type": "object", | \ | "type": "object", | "properties": { | \ | "properties": { | "location": { | \ | "location": { | "type": "string", | \ | "type": "string", | "description": "城市名称,如北京、上海(仅支持国内地级市)" | \ | "description": "城市名称,如北京、上海(仅支持国内地级市)" | | \ | | } | \ | } | }, | \ | }, | "required": [ | \ | "required": [ | "location" | \ | "location" | ] | \ | ] | } | \ | } | } | \ | } |] | \ | } |``` | \ |] | | \ |``` | | #### 使用内置工具 Chat API 当前不支持使用方舟大模型内置工具(联网搜索、图像处理、私域知识库搜索)、云部署 MCP等能力,可以通过 Responses API 使用,具体教程参见[联网搜索工具](/docs/web-search)、[图像处理 Image Process](/docs/image-process)、[Knowledge Search(私域知识库搜索工具)](/docs/knowledge-search)、[云部署 MCP / Remote MCP](/docs/mcp-remote-mcp)。 **选项:联网搜索** 通过 Web Search 工具可以获取实时公开网络信息(如新闻、商品、天气等),解决数据时效性、知识盲区、信息同步等核心问题,并且无需自行开发搜索引擎或维护数据资源。 ```Python import os from arkruntime import Ark client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=os.getenv('ARK_API_KEY'), ) tools = [{ "type": "web_search", "max_keyword": 2, }] response = client.responses.create( model="doubao-seed-2-1-pro-260915", input=[{"role": "user", "content": "北京的天气怎么样?"}], tools=tools, ) print(response) ``` **选项:图像处理** Image Process 图像处理工具支持通过 Responses API 调用对输入图片执行画点、画线、旋转、缩放、框选/裁剪关键区域等基础操作,适用于需模型通过视觉处理提升图片理解的场景(如图文内容分析、物体定位标注、多轮视觉推理等)。工具通过模型自动判断图像处理逻辑,支持与自定义 Function 混合使用,且可处理多轮视觉输入(上一轮输出图片作为下一轮输入)。 ```Python from openai import OpenAI import os # Initialize the client and configure the API address and tool call headers. client = OpenAI( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=os.getenv('ARK_API_KEY'), default_headers={"ark-beta-image-process": "true"} ) # Initiate an image processing request. response = client.responses.create( model="doubao-seed-2-1-pro-260628", tools=[ { "type": "image_process", "point": { "type": "disabled" }, "grounding": { "type": "disabled" }, "zoom": { "type": "enabled" # Enable the zoom tool. }, "rotate": { "type": "disabled" } } ], input=[ { "type": "message", "role": "user", "content": [ { "type": "input_image", "image_url": "https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/image_process_1.jpg" # Enter the image URL. }, { "type": "input_text", "text": "前方路牌写了什么?" } ] } ], stream=True # Enable streaming response to obtain processing results in real time. ) # Print the streaming response results. for chunk in response: if hasattr(chunk, 'delta'): print(chunk.delta, end="", flush=True) ``` **选项:私域知识库搜索** 私域知识库搜索工具 Knowledge Search 支持通过 Responses API 调用直接获取企业私域知识库中的信息(如内部文档、产品手册、行业资料等),适用于需基于企业专属数据解答问题的场景(如内部培训问答、产品功能咨询、行业方案查询等)。工具通过模型自动判断是否需要调用私域知识库,支持与自定义 Function、MCP 等工具混合使用,目前仅支持旗舰版知识库。 ```Python import os from openai import OpenAI client = OpenAI( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=os.getenv('ARK_API_KEY'), default_headers={"ark-beta-knowledge-search": "true"} # Enable private domain knowledge base search. ) # Initiate a knowledge base search request. response = client.responses.create( model="doubao-seed-2-1-pro-260915", input=[ { "role": "user", "content": [ { "type": "input_text", "text": "应用实验室里有类似实时视频理解的agent demo么?" } ] } ], tools=[ { "type": "knowledge_search", "knowledge_resource_id": "", # Replace with the actual knowledge base ID. "limit": 10, # Return a maximum of 10 search results. } ], stream=True, # Enable streaming response to obtain processing results in real time. extra_body={"thinking": {"type": "auto"}} # The model automatically determines whether a search is necessary. ) # Print the streaming response results. for chunk in response: if hasattr(chunk, 'delta'): print(chunk.delta, end="", flush=True) ``` **选项:MCP** 对接“[MCP MarketPlace](https://www.volcengine.com/mcp-marketplace)”,支持调用市场内各类垂直领域MCP工具(如巨量千川、知识库),无需自行开发工具逻辑。适用于复杂任务(如多步数据查询 + 分析)场景,支持与自定义 Function、Web Search 工具混合使用。 ```Python from arkruntime import Ark import os # Initialize the client and enable MCP client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=os.getenv('ARK_API_KEY') ) # Send a basic MCP call request response = client.responses.create( model="doubao-seed-2-1-pro-260915", tools=[ { "type": "mcp", "server_label": "deepwiki", "server_url": "https://mcp.deepwiki.com/mcp", "require_approval": "never" } ], input=[ { "role": "user", "content": [ { "type": "input_text", "text": "看一下volcengine/ai-app-lab这个repo的文档" } ] } ], extra_headers={"ark-beta-mcp": "true"}, stream=True # Stream results ) # Print the streaming response results. for chunk in response: if hasattr(chunk, 'delta'): print(chunk.delta, end="", flush=True) ``` ## 渐进式迁移 当前新模型会在 Chat API 和 Responses API 上同步适配,无需担心后续的维护问题。建议根据需求逐步采用 Responses API,可以先在工具调用及缓存等部分业务场景中使用,待使用稳定后再全面替换 Chat API,以实现平滑过渡。 --- # 文本生成 Source: https://ark.volcengine.com/region:cn-beijing/docs/responses-api-text-generation 文本生成模型能够基于输入的提示词生成连贯且有意义的文本内容。 Responses API 支持更简洁的输入输出格式,能够更加高效地进行上下文管理,推荐在项目中使用。 > **说明** > > 方舟平台的新用户?获取 API Key 及 开通模型等准备工作,请参见 [快速入门](/docs/quick-start)。 ## 支持模型 250615 及之后版本的大语言模型,如无特殊说明,默认支持 Responses API,方舟平台大语言模型列表,请参见:[文本生成能力](/docs/model-list#32e9e053)。 ## 快速开始 **选项:Curl** ```Bash # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "input": "hello" }' ``` **选项:Python** ```Python import os from arkruntime import Ark client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=os.getenv('ARK_API_KEY'), ) response = client.responses.create( model="doubao-seed-2-1-pro-260915", input="hello" ) for item in response.output: if item.type == "message": for content in item.content: if content.type == "output_text": print(content.text) ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/responses" ) func main() { client := arkruntime.NewClientWithApiKey( // Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() resp, err := client.CreateResponses(ctx, &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", Input: responses.NewStringResponsesInput("hello"), }) if err != nil { fmt.Printf("response error: %v\n", err) return } fmt.Println(resp) } ``` **选项:Java** ```Java package com.ark.example; import com.volcengine.ark.runtime.service.ArkService; import com.volcengine.ark.runtime.models.responses.*; public class demo { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); // The base URL for model invocation ArkService arkService = ArkService.builder().apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); ResponsesRequest request = ResponsesRequest.builder() .model("doubao-seed-2-1-pro-260915") .input(ResponsesInput.ofString("hello")) .build(); Response resp = arkService.createResponse(request); System.out.println(resp); arkService.shutdownExecutor(); } } ``` **选项:OpenAI SDK** ```Python import os from openai import OpenAI client = OpenAI( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=os.getenv('ARK_API_KEY'), ) response = client.responses.create( model="doubao-seed-2-1-pro-260915", input="hello" ) for item in response.output: if item.type == "message": for content in item.content: if content.type == "output_text": print(content.text) ``` ## API 文档 [Responses API](/docs/create-model-responses-api) ## 上下文管理 上下文状态管理简单,默认情况下每个请求的输入和回复(不包括思维链内容) 都会持久化存储,后续请求只需传入 id 就可以引入对应请求的输入和回复,无需像 Chat API 每次请求,传入历史对话。详细信息,参见[工作原理及使用说明](/docs/responses-api-text-generation#bdafc901)。 ### 多轮对话 在多轮调用模式下,系统能够自动管理上下文,持续追踪和记忆之前的对话内容,使对话更加连贯自然,提升智能交互体验。 **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "input": "Hi,讲个笑话。" }' ``` ```Bash curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "previous_response_id":"", "input": "这个笑话的笑点在哪?" }' ``` 第二次请求需将 curl 命令中的 `` 替换为上一次请求返回的 Response id。 **选项:Python** ```Python import os from arkruntime import Ark # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key = os.getenv('ARK_API_KEY') client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) # Create the first-round conversation request response = client.responses.create( model="doubao-seed-2-1-pro-260915", input="Hi,帮我讲个笑话。" ) print(response) # Create the second-round conversation request second_response = client.responses.create( model="doubao-seed-2-1-pro-260915", previous_response_id=response.id, input=[{"role": "user", "content": "这个笑话的笑点在哪?"}], ) print(second_response) ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/responses" ) func main() { client := arkruntime.NewClientWithApiKey( // Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() // Create the first-round conversation request resp, err := client.CreateResponses(ctx, &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", Input: responses.NewStringResponsesInput("Hi,讲个笑话。"), Store: responses.NewOptBool(true), }) if err != nil { fmt.Printf("response error: %v\n", err) return } fmt.Println(resp) id := resp.ID inputMessage := easyMessage(responses.MessageRoleUser, "这个笑话的笑点在哪?") fmt.Println("-----------------") // Create the second-round conversation request second_resp, second_err := client.CreateResponses(ctx, &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", PreviousResponseID: responses.NewOptString(id), Input: responses.NewInputItemArrayResponsesInput([]responses.InputItem{ inputMessage, }), }) if second_err != nil { fmt.Printf("second response error: %v\n", second_err) return } fmt.Println(second_resp) } func easyMessage(role responses.MessageRole, content string) responses.InputItem { return responses.InputItem{ OneOf: responses.NewItemEasyMessageInputItemSum( responses.ItemEasyMessage{ Role: responses.NewOptMessageRole(role), Content: responses.NewStringMessageContent(content), }, ), } } ``` **选项:Java** ```Java package com.ark.example; import com.volcengine.ark.runtime.service.ArkService; import com.volcengine.ark.runtime.models.responses.*; public class demo { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); // The base URL for model invocation ArkService arkService = ArkService.builder().apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); // Create the first-round conversation request ResponsesRequest request = ResponsesRequest.builder() .model("doubao-seed-2-1-pro-260915") .input(ResponsesInput.ofString("Hi,帮我讲个笑话。")) .build(); Response resp = arkService.createResponse(request); System.out.println(resp); // Create the second-round conversation request ResponsesRequest request2 = ResponsesRequest.builder() .model("doubao-seed-2-1-pro-260915") .previousResponseId(resp.getId()) .input(ResponsesInput.ofList(java.util.Arrays.asList(ItemEasyMessage.builder().role(MessageRole.USER).content( MessageContent.ofString("这个笑话的笑点在哪?") ).build()))) .build(); Response resp2 = arkService.createResponse(request2); System.out.println(resp2); arkService.shutdownExecutor(); } } ``` **选项:OpenAI SDK** ```Python from openai import OpenAI import os # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key = os.getenv('ARK_API_KEY') client = OpenAI( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) # Create the first-round conversation request response = client.responses.create( model="doubao-seed-2-1-pro-260915", input="Hi,帮我讲个笑话。" ) print(response) # Create the second-round conversation request second_response = client.responses.create( model="doubao-seed-2-1-pro-260915", previous_response_id=response.id, input=[{"role": "user", "content": "这个笑话的笑点在哪?"}], ) print(second_response) ``` ### 重新生成对话 这段代码展示了 Responses API 中通过灵活调用 previous_response_id 重新生成对话的树状分叉结构,并展示了如何在不同的分支中进行不同的操作。在重新生成对话的场景中,系统能够根据不同的分支条件,灵活地执行多种的操作,从而实现更复杂的对话逻辑。 **选项:Python** ```Python import os from arkruntime import Ark # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key = os.getenv('ARK_API_KEY') client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) # Create the first-round conversation request response = client.responses.create( model="doubao-seed-2-1-pro-260915", input=[{"role": "user", "content": "你知道余弦相似度的原理吗?"}], store=True, # store the conversation ) print(response) # Create the second-round conversation request second_response = client.responses.create( model="doubao-seed-2-1-pro-260915", previous_response_id=response.id, input=[{"role": "user", "content": "我希望你可以用小学生都能听懂的方式来解释这个问题"}], store=True, ) print(second_response) # Recreate the second-round conversation request re_second_response = client.responses.create( model="doubao-seed-2-1-pro-260915", previous_response_id=response.id, input=[{"role": "user", "content": "我希望你可以用教授的思考逻辑来解释这个问题"}], store=True, ) print(re_second_response) ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/responses" ) func main() { client := arkruntime.NewClientWithApiKey( // Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() // Create the first-round conversation request resp, err := client.CreateResponses(ctx, &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", Input: responses.NewStringResponsesInput("你知道余弦相似度的原理吗?"), Store: responses.NewOptBool(true), }) if err != nil { fmt.Printf("response error: %v\n", err) return } fmt.Println(resp) fmt.Println("-----------------") // Create the second-round conversation request second_resp, second_err := client.CreateResponses(ctx, &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", PreviousResponseID: responses.NewOptString(resp.ID), Input: responses.NewStringResponsesInput("请用小学生都能听懂的方式解释这个问题。"), Store: responses.NewOptBool(true), }) if second_err != nil { fmt.Printf("second response error: %v\n", second_err) return } fmt.Println(second_resp) fmt.Println("-----------------") // Recreate the second-round conversation request re_second_resp, re_second_err := client.CreateResponses(ctx, &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", PreviousResponseID: responses.NewOptString(resp.ID), Input: responses.NewStringResponsesInput("请用教授的思考逻辑解释这个问题。"), Store: responses.NewOptBool(true), }) if re_second_err != nil { fmt.Printf("reSecond response error: %v\n", re_second_err) return } fmt.Println(re_second_resp) } ``` **选项:Java** ```Java package com.ark.example; import com.volcengine.ark.runtime.service.ArkService; import com.volcengine.ark.runtime.models.responses.*; public class demo { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); // The base URL for model invocation ArkService arkService = ArkService.builder().apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); // Create the first-round conversation request ResponsesRequest request = ResponsesRequest.builder() .model("doubao-seed-2-1-pro-260915") .input(ResponsesInput.ofList(java.util.Arrays.asList(ItemEasyMessage.builder().role(MessageRole.USER).content( MessageContent.ofString("你知道余弦相似度的原理吗?") ).build()))) .store(true) .build(); Response resp = arkService.createResponse(request); System.out.println(resp); // Create the second-round conversation request ResponsesRequest request2 = ResponsesRequest.builder() .model("doubao-seed-2-1-pro-260915") .previousResponseId(resp.getId()) .input(ResponsesInput.ofList(java.util.Arrays.asList(ItemEasyMessage.builder().role(MessageRole.USER).content( MessageContent.ofString("我希望你可以用小学生都能听懂的方式来解释这个问题") ).build()))) .build(); Response resp2 = arkService.createResponse(request2); System.out.println(resp2); // Recreate the second-round conversation request ResponsesRequest reRequest2 = ResponsesRequest.builder() .model("doubao-seed-2-1-pro-260915") .previousResponseId(resp.getId()) .input(ResponsesInput.ofList(java.util.Arrays.asList(ItemEasyMessage.builder().role(MessageRole.USER).content( MessageContent.ofString("我希望你可以用教授的思考逻辑来解释这个问题") ).build()))) .build(); Response reResp2 = arkService.createResponse(reRequest2); System.out.println(reResp2); arkService.shutdownExecutor(); } } ``` **选项:OpenAI SDK** ```Python from openai import OpenAI import os # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key = os.getenv('ARK_API_KEY') client = OpenAI( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) # Create the first-round conversation request response = client.responses.create( model="doubao-seed-2-1-pro-260915", input=[{"role": "user", "content": "你知道余弦相似度的原理吗?"}], store=True, # 设置为True以存储对话 ) print(response) # Create the second-round conversation request second_response = client.responses.create( model="doubao-seed-2-1-pro-260915", previous_response_id=response.id, input=[{"role": "user", "content": "我希望你可以用小学生都能听懂的方式来解释这个问题"}], store=True, ) print(second_response) # Recreate the second-round conversation request re_second_response = client.responses.create( model="doubao-seed-2-1-pro-260915", previous_response_id=response.id, input=[{"role": "user", "content": "我希望你可以用教授的思考逻辑来解释这个问题"}], store=True, ) print(re_second_response) ``` ### 窗口截断 这段代码展示了如何利用 delete 接口实现 Responses API 的窗口截断的功能,使得程序可以在 response 粒度上管理历史记忆,便于后续进行更复杂的对话。 **选项:Python** ```Python import os from arkruntime import Ark # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key = os.getenv('ARK_API_KEY') client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) response = client.responses.create( model="doubao-seed-2-1-pro-260915", input="讲个谐音梗笑话", ) print(response) second_response = client.responses.create( model="doubao-seed-2-1-pro-260915", previous_response_id=response.id, input=[{"role": "user", "content": "讲个有哲理的笑话"}], ) print(second_response) third_response = client.responses.create( model="doubao-seed-2-1-pro-260915", previous_response_id=second_response.id, input=[{"role": "user", "content": "讲个冷笑话"}], ) print(third_response) deleting_response = client.responses.delete(second_response.id) print(deleting_response) fourth_response = client.responses.create( model="doubao-seed-2-1-pro-260915", previous_response_id=third_response.id, input=[{"role": "user", "content": "你刚刚讲了几个笑话?都是关于什么主题的?"}], ) print(fourth_response) ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/responses" ) func main() { client := arkruntime.NewClientWithApiKey( // Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() resp, err := client.CreateResponses(ctx, &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", Input: responses.NewStringResponsesInput("讲个谐音梗笑话"), }) if err != nil { fmt.Printf("response error: %v\n", err) return } fmt.Println(resp) second_resp, second_err := client.CreateResponses(ctx, &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", PreviousResponseID: responses.NewOptString(resp.ID), Input: responses.NewInputItemArrayResponsesInput([]responses.InputItem{ easyMessage(responses.MessageRoleUser, "讲个有哲理的笑话"), }), }) if second_err != nil { fmt.Printf("second response error: %v\n", second_err) return } fmt.Println(second_resp) third_resp, third_err := client.CreateResponses(ctx, &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", PreviousResponseID: responses.NewOptString(second_resp.ID), Input: responses.NewInputItemArrayResponsesInput([]responses.InputItem{ easyMessage(responses.MessageRoleUser, "讲个冷笑话"), }), }) if third_err != nil { fmt.Printf("second response error: %v\n", third_err) return } fmt.Println(third_resp) deleting_resp := client.DeleteResponse(ctx, &responses.ResponsesRemoveParams{ResponseId: second_resp.ID}) fmt.Println(deleting_resp) forth_resp, forth_err := client.CreateResponses(ctx, &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", PreviousResponseID: responses.NewOptString(third_resp.ID), Input: responses.NewInputItemArrayResponsesInput([]responses.InputItem{ easyMessage(responses.MessageRoleUser, "你刚刚讲了几个笑话?都是关于什么主题的?"), }), }) if forth_err != nil { fmt.Printf("second response error: %v\n", forth_err) return } fmt.Println(forth_resp) } func easyMessage(role responses.MessageRole, content string) responses.InputItem { return responses.InputItem{ OneOf: responses.NewItemEasyMessageInputItemSum( responses.ItemEasyMessage{ Role: responses.NewOptMessageRole(role), Content: responses.NewStringMessageContent(content), }, ), } } ``` **选项:Java** ```Java package com.ark.example; import com.volcengine.ark.runtime.service.ArkService; import com.volcengine.ark.runtime.models.responses.*; public class demo { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); // The base URL for model invocation ArkService arkService = ArkService.builder().apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); ResponsesRequest request = ResponsesRequest.builder() .model("doubao-seed-2-1-pro-260915") .input(ResponsesInput.ofString("讲个谐音梗笑话")) .build(); Response resp = arkService.createResponse(request); System.out.println(resp); System.out.println("---------------------"); ResponsesRequest request2 = ResponsesRequest.builder() .model("doubao-seed-2-1-pro-260915") .previousResponseId(resp.getId()) .input(ResponsesInput.ofList(java.util.Arrays.asList(ItemEasyMessage.builder().role(MessageRole.USER).content( MessageContent.ofString("讲个有哲理的笑话") ).build()))) .build(); Response resp2 = arkService.createResponse(request2); System.out.println(resp2); System.out.println("---------------------"); ResponsesRequest request3 = ResponsesRequest.builder() .model("doubao-seed-2-1-pro-260915") .previousResponseId(resp2.getId()) .input(ResponsesInput.ofList(java.util.Arrays.asList(ItemEasyMessage.builder().role(MessageRole.USER).content( MessageContent.ofString("讲个冷笑话") ).build()))) .build(); Response resp3 = arkService.createResponse(request3); System.out.println(resp3); System.out.println("---------------------"); DeleteResponseResponse deleteResp = arkService.deleteResponse( DeleteResponseRequest.builder().responseId(resp2.getId()).build() ); System.out.println(deleteResp); System.out.println("---------------------"); ResponsesRequest request4 = ResponsesRequest.builder() .model("doubao-seed-2-1-pro-260915") .previousResponseId(resp3.getId()) .input(ResponsesInput.ofList(java.util.Arrays.asList(ItemEasyMessage.builder().role(MessageRole.USER).content( MessageContent.ofString("你刚刚讲了几个笑话?都是关于什么主题的?") ).build()))) .build(); Response resp4 = arkService.createResponse(request4); System.out.println(resp4); arkService.shutdownExecutor(); } } ``` **选项:OpenAI SDK** ```Python import os from openai import OpenAI # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key = os.getenv('ARK_API_KEY') client = OpenAI( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) response = client.responses.create( model="doubao-seed-2-1-pro-260915", input="讲个谐音梗笑话", ) print(response) second_response = client.responses.create( model="doubao-seed-2-1-pro-260915", previous_response_id=response.id, input=[{"role": "user", "content": "讲个有哲理的笑话"}], ) print(second_response) third_response = client.responses.create( model="doubao-seed-2-1-pro-260915", previous_response_id=second_response.id, input=[{"role": "user", "content": "讲个冷笑话"}], ) print(third_response) deleting_response = client.responses.delete(second_response.id) print(deleting_response) fourth_response = client.responses.create( model="doubao-seed-2-1-pro-260915", previous_response_id=third_response.id, input=[{"role": "user", "content": "你刚刚讲了几个笑话?都是关于什么主题的?"}], ) print(fourth_response) ``` ## 流式输出 流式输出支持内容动态实时呈现,既能够缓解用户等待焦虑,又可以规避复杂任务因长时间推理引发的客户端超时失败问题,保障请求流程顺畅。 **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "input": "常见的十字花科植物有哪些?", "thinking":{"type": "enabled"}, "stream": true }' ``` 输出示例: ``` event: response.created data: {"type":"response.created","response":{"created_at":1764229579,"id":"resp_021764229578658fe9a0f6cb2cc6c828e7a59adbdb971872aee70","max_output_tokens":32768,"model":"doubao-seed-2-1-pro-260628","object":"response","thinking":{"type":"enabled"},"service_tier":"default","caching":{"type":"disabled"},"store":true,"expire_at":1764488778},"sequence_number":0} event: response.in_progress data: {"type":"response.in_progress","response":{"created_at":1764229579,"id":"resp_021764229578658fe9a0f6cb2cc6c828e7a59adbdb971872aee70","max_output_tokens":32768,"model":"doubao-seed-2-1-pro-260628","object":"response","thinking":{"type":"enabled"},"service_tier":"default","caching":{"type":"disabled"},"store":true,"expire_at":1764488778},"sequence_number":1} event: response.output_item.added data: {"type":"response.output_item.added","output_index":0,"item":{"id":"rs_02176422957963700000000000000000000ffffac15dd335c9c43","type":"reasoning","status":"in_progress"},"sequence_number":2} event: response.reasoning_summary_part.added data: {"type":"response.reasoning_summary_part.added","item_id":"rs_02176422957963700000000000000000000ffffac15dd335c9c43","output_index":0,"summary_index":0,"part":{"type":"summary_text"},"sequence_number":3} event: response.reasoning_summary_text.delta data: {"type":"response.reasoning_summary_text.delta","summary_index":0,"delta":"\n","item_id":"rs_02176422957963700000000000000000000ffffac15dd335c9c43","output_index":0,"sequence_number":4} event: response.reasoning_summary_text.delta data: {"type":"response.reasoning_summary_text.delta","summary_index":0,"delta":"用户","item_id":"rs_02176422957963700000000000000000000ffffac15dd335c9c43","output_index":0,"sequence_number":5} event: response.reasoning_summary_text.delta data: {"type":"response.reasoning_summary_text.delta","summary_index":0,"delta":"问","item_id":"rs_02176422957963700000000000000000000ffffac15dd335c9c43","output_index":0,"sequence_number":6} ... ``` **选项:Python** ```Python import os from arkruntime import Ark from arkruntime.types.responses.response_completed_event import ResponseCompletedEvent from arkruntime.types.responses.response_reasoning_summary_text_delta_event import ResponseReasoningSummaryTextDeltaEvent from arkruntime.types.responses.response_output_item_added_event import ResponseOutputItemAddedEvent from arkruntime.types.responses.response_text_delta_event import ResponseTextDeltaEvent from arkruntime.types.responses.response_text_done_event import ResponseTextDoneEvent # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key = os.getenv('ARK_API_KEY') client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) # Create a request response = client.responses.create( model="doubao-seed-2-1-pro-260915", input="常见的十字花科植物有哪些?", thinking={"type": "enabled"}, stream=True ) for event in response: if isinstance(event, ResponseReasoningSummaryTextDeltaEvent): print(event.delta, end="") if isinstance(event, ResponseOutputItemAddedEvent): print("\noutPutItem " + event.type + " start:") if isinstance(event, ResponseTextDeltaEvent): print(event.delta,end="") if isinstance(event, ResponseTextDoneEvent): print("\noutPutTextDone.") if isinstance(event, ResponseCompletedEvent): print("Response Completed. Usage = " + event.response.usage.model_dump_json()) ``` 输出示例: ``` outPutItem response.output_item.added start: 用户问常见的十字花科植物有哪些,首先我得回忆一下十字花科的主要特征,比如花是十字形花冠,四强雄蕊(四长两短),果实多为角果(长角果或短角果)。然后要列举常见的种类,分几个类别可能更清楚,比如蔬菜类、观赏类、野生类这些。 .... 现在组织语言,先总述十字花科的特征,然后分蔬菜、观赏、野生杂草三类列举常见例子,每个例子简要说明。这样结构清晰,用户容易理解。 outPutItem response.output_item.added start: 十字花科植物是被子植物中常见的一科,其核心特征为**十字形花冠(4片花瓣呈十字排列)、四强雄蕊(4长2短)、果实多为角果**(分长角果如油菜,短角果如荠菜)。以下是几类常见的十字花科植物: ### **一、常见蔬菜类** 这是十字花科最广为人知的类别,很多日常食材都属于此类: 1. **白菜类**:大白菜、小白菜、娃娃菜(均为芸薹属变种,叶用为主); 2. ... ... ### **总结** 十字花科植物与人类生活密切相关——从日常蔬菜到观赏花卉,再到田间杂草,其多样性和实用性都很强。记住“十字花、四强雄蕊、角果”这三个特征,就能轻松识别大部分十字花科植物啦! outPutTextDone. Response Completed. Usage = {"input_tokens":42,"input_tokens_details":{"cached_tokens":0},"output_tokens":1089,"output_tokens_details":{"reasoning_tokens":431},"total_tokens":1131,"tool_usage":null,"tool_usage_details":null} ``` **选项:Go** ```Go package main import ( "io" "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/responses" ) func main() { client := arkruntime.NewClientWithApiKey( // Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() resp, err := client.CreateResponsesStream(ctx, &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", Input: responses.NewStringResponsesInput("常见的十字花科植物有哪些?"), Thinking: responses.NewOptThinking(responses.Thinking{Type: responses.NewOptThinkingMode(responses.ThinkingModeEnabled)}), }) if err != nil { fmt.Printf("stream error: %v", err) return } for { event, err := resp.Recv() if err == io.EOF { break } if err != nil { fmt.Printf("stream error: %v", err) return } handleEvent(event) } } func handleEvent(event *responses.ResponseStreamEvent) { switch event.OneOf.Type { case responses.ResponseReasoningSummaryTextDeltaEventResponseStreamEventSum: print(event.OneOf.ResponseReasoningSummaryTextDeltaEvent.Delta.Or("")) case responses.ResponseReasoningSummaryTextDoneEventResponseStreamEventSum: fmt.Printf("\nAggregated reasoning text: %s\n", event.OneOf.ResponseReasoningSummaryTextDoneEvent.Text.Or("")) case responses.ResponseTextDeltaEventResponseStreamEventSum: print(event.OneOf.ResponseTextDeltaEvent.Delta.Or("")) case responses.ResponseTextDoneEventResponseStreamEventSum: fmt.Printf("\nAggregated output text: %s\n", event.OneOf.ResponseTextDoneEvent.Text.Or("")) } } ``` 输出示例: ``` 用户问常见的十字花科植物有哪些,我需要先回忆一下十字花科的主要特征,然后列举常见的例子,最好分分类,比如蔬菜类、花卉类、野生类之类的,这样用户看起来清楚。首先,十字花科的特征是十字形花冠,四强雄蕊(四长两短),角果(长角果或短角果)。 ... Aggregated reasoning text: 十字花科植物因**十字形花冠**(四片花瓣呈十字排列)、**四强雄蕊**(四长两短)和**角果**(果实类型)为主要特征,在蔬菜、观赏花卉中十分常见。以下是几类典型代表: ... **答案总结:** 常见十字花科植物包括白菜、萝卜、卷心菜、西兰花、油菜、荠菜、紫罗兰、二月兰等(按蔬菜/花卉分类列举即可)。 (注:若需更简洁,可直接列出核心例子:如白菜、萝卜、西兰花、荠菜、紫罗兰、二月兰等)。 Aggregated output text: 十字花科植物因**十字形花冠**(四片花瓣呈十字排列)、**四强雄蕊**(四长两短)和**角果**(果实类型)为主要特征,在蔬菜、观赏花卉中十分常见。以下是几类典型代表: ... **答案总结:** 常见十字花科植物包括白菜、萝卜、卷心菜、西兰花、油菜、荠菜、紫罗兰、二月兰等(按蔬菜/花卉分类列举即可)。 (注:若需更简洁,可直接列出核心例子:如白菜、萝卜、西兰花、荠菜、紫罗兰、二月兰等)。 ``` **选项:Java** ```Java package com.ark.example; import com.volcengine.ark.runtime.service.ArkService; import com.volcengine.ark.runtime.models.responses.*; public class demo { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); // The base URL for model invocation ArkService arkService = ArkService.builder().apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); ResponsesRequest request = ResponsesRequest.builder() .model("doubao-seed-2-1-pro-260915") .stream(true) .input(ResponsesInput.ofString("常见的十字花科植物有哪些?")) .thinking(Thinking.builder().type(ThinkingMode.ENABLED).build()) .build(); arkService.streamResponse(request) .doOnError(Throwable::printStackTrace) .blockingForEach(event -> { if (event instanceof ResponseReasoningSummaryTextDeltaEvent) { System.out.print(((ResponseReasoningSummaryTextDeltaEvent) event).getDelta()); } if (event instanceof ResponseOutputItemAddedEvent) { System.out.println("OutputItem " + (((ResponseOutputItemAddedEvent) event).getItem().getType()) + " Start: "); } if (event instanceof ResponseTextDeltaEvent) { System.out.print(((ResponseTextDeltaEvent) event).getDelta()); } if (event instanceof ResponseTextDoneEvent) { System.out.println("OutputText End."); } if (event instanceof ResponseOutputItemDoneEvent) { System.out.println("OutputItem " + ((ResponseOutputItemDoneEvent) event).getItem().getType() + " End."); } if (event instanceof ResponseFunctionCallArgumentsDoneEvent) { System.out.println("FunctionCall Arguments: " + ((ResponseFunctionCallArgumentsDoneEvent) event).getArguments()); } if (event instanceof ResponseCompletedEvent) { System.out.println("Response Completed. Usage = " + ((ResponseCompletedEvent) event).getResponse().getUsage()); } }); arkService.shutdownExecutor(); } } ``` 输出示例: ``` OutputItem reasoning Start: 用户问常见的十字花科植物有哪些,首先我得回忆一下十字花科的主要特征,比如十字形花冠、四强雄蕊这些,但用户可能不需要特征,直接要例子。首先想到的是蔬菜类,因为很多日常吃的蔬菜都是十字花科的。 ... OutputItem message Start: 十字花科植物种类丰富,其中很多是日常常见的蔬菜、观赏植物或野菜,以下是一些典型例子: ... 这些植物在饮食、农业或景观中都很常见,你平时吃的蔬菜里大概率就有它们的身影! 🌱🥦🥬OutputText End. OutputItem message End. Response Completed. Usage = Usage{inputTokens=42, outputTokens=759, totalTokens=801, inputTokensDetails=InputTokensDetails{cachedTokens=0}, outputTokensDetails=com.volcengine.ark.runtime.model.responses.usage.OutputTokensDetails@73d983ea, toolUsage=null, toolUsageDetails=null} ``` **选项:OpenAI SDK** ```Python import os from openai import OpenAI # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key = os.getenv('ARK_API_KEY') client = OpenAI( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) # Create a request response = client.responses.create( model="doubao-seed-2-1-pro-260915", input="常见的十字花科植物有哪些?", stream=True, extra_body={ "thinking": {"type": "enabled"}, } ) for event in response: if event.type == "response.reasoning_summary_text.delta": print(event.delta, end="") if event.type == "response.output_item.added": print("\noutPutItem " + event.type + " start:") if event.type == "response.output_text.delta": print(event.delta,end="") if event.type == "response.output_item.done": print("\noutPutTextDone.") if event.type == "response.completed": print("\nResponse Completed. Usage = " + event.response.usage.model_dump_json()) ``` 输出示例: ``` outPutItem response.output_item.added start: 用户问常见的十字花科植物有哪些,首先我得回忆一下十字花科的主要特征,比如十字形花冠、四强雄蕊这些,但用户可能不需要特征,直接要例子。然后要分常见的类别,比如蔬菜类的,这个应该最多,还有观赏类的,可能还有野生的杂草类? ... outPutTextDone. outPutItem response.output_item.added start: 十字花科植物是被子植物中较大的一科,特征为**十字形花冠**(4瓣呈十字排列)、**四强雄蕊**(6枚雄蕊,4长2短),很多种类是常见的蔬菜、观赏植物或野菜。以下是几类典型的常见十字花科植物: ... **答案总结:** 常见的十字花科植物包括白菜、萝卜、甘蓝(圆白菜/西兰花/花椰菜)、油菜、芥菜、荠菜、二月兰、紫罗兰等,涵盖蔬菜、观赏、野菜三大类。 ... outPutTextDone. Response Completed. Usage = {"input_tokens":42,"input_tokens_details":{"cached_tokens":0},"output_tokens":1467,"output_tokens_details":{"reasoning_tokens":574},"total_tokens":1509} ``` ## 补充系统提示词 在 Responses API 中,instructions 字段用于在特定轮次中补充系统提示词,其核心机制是在对话上下文头部新增一条系统提示信息,实现更灵活的输出。 > 配置 instructions 字段后无法写入缓存以及使用缓存,即无法配置 **caching** 字段为{"type":"enabled"},同时无法命中缓存。 **选项:Python** ```Python import os from arkruntime import Ark # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key = os.getenv('ARK_API_KEY') client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) response = client.responses.create( model="doubao-seed-2-1-pro-260915", input=[ { "role": "system", "content": "你是一位数学老师,能够讲清楚相应的数学问题。" }, ] ) print(response) second_response = client.responses.create( model="doubao-seed-2-1-pro-260915", previous_response_id=response.id, input=[{"role": "user", "content": "请解释一下余弦相似度原理"}], ) print(second_response) third_response = client.responses.create( model="doubao-seed-2-1-pro-260915", instructions="增加一个要求:我希望你可以用小学生能听懂的方式解释这个问题。", previous_response_id=response.id, input=[{"role": "user", "content": "请解释一下余弦相似度原理"}], ) print(third_response) ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/responses" ) func main() { client := arkruntime.NewClientWithApiKey( // Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() resp, err := client.CreateResponses(ctx, &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", Input: responses.NewInputItemArrayResponsesInput([]responses.InputItem{ easyMessage(responses.MessageRoleSystem, "你是一位数学老师,能够讲清楚相应的数学问题。"), }), }) if err != nil { fmt.Printf("response error: %v", err) return } fmt.Println(resp) second_resp, second_err := client.CreateResponses(ctx, &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", PreviousResponseID: responses.NewOptString(resp.ID), Input: responses.NewInputItemArrayResponsesInput([]responses.InputItem{ easyMessage(responses.MessageRoleUser, "请解释一下余弦相似度原理"), }), }) if second_err != nil { fmt.Printf("second response error: %v", second_err) return } fmt.Println(second_resp) str := "增加一个要求:我希望你可以用小学生能听懂的方式解释这个问题。" third_resp, third_err := client.CreateResponses(ctx, &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", Instructions: responses.NewOptString(str), PreviousResponseID: responses.NewOptString(resp.ID), Input: responses.NewInputItemArrayResponsesInput([]responses.InputItem{ easyMessage(responses.MessageRoleUser, "请解释一下余弦相似度原理"), }), }) if third_err != nil { fmt.Printf("second response error: %v", third_err) return } fmt.Println(third_resp) } func easyMessage(role responses.MessageRole, content string) responses.InputItem { return responses.InputItem{ OneOf: responses.NewItemEasyMessageInputItemSum( responses.ItemEasyMessage{ Role: responses.NewOptMessageRole(role), Content: responses.NewStringMessageContent(content), }, ), } } ``` **选项:Java** ```Java package com.ark.example; import com.volcengine.ark.runtime.service.ArkService; import com.volcengine.ark.runtime.models.responses.*; public class demo { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); // The base URL for model invocation ArkService arkService = ArkService.builder().apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); ResponsesRequest request = ResponsesRequest.builder() .model("doubao-seed-2-1-pro-260915") .input(ResponsesInput.ofList(java.util.Arrays.asList(ItemEasyMessage.builder().role(MessageRole.SYSTEM).content( MessageContent.ofString("你是一位数学老师,能够讲清楚相应的数学问题。") ).build()))) .build(); Response resp = arkService.createResponse(request); System.out.println(resp); System.out.println("---------------------"); ResponsesRequest request2 = ResponsesRequest.builder() .model("doubao-seed-2-1-pro-260915") .previousResponseId(resp.getId()) .input(ResponsesInput.ofList(java.util.Arrays.asList(ItemEasyMessage.builder().role(MessageRole.USER).content( MessageContent.ofString("请解释一下余弦相似度原理") ).build()))) .build(); Response resp2 = arkService.createResponse(request2); System.out.println(resp2); System.out.println("---------------------"); ResponsesRequest request3 = ResponsesRequest.builder() .model("doubao-seed-2-1-pro-260915") .instructions("增加一个要求:我希望你可以用小学生能听懂的方式解释这个问题。") .previousResponseId(resp.getId()) .input(ResponsesInput.ofList(java.util.Arrays.asList(ItemEasyMessage.builder().role(MessageRole.USER).content( MessageContent.ofString("请解释一下余弦相似度原理") ).build()))) .build(); Response resp3 = arkService.createResponse(request3); System.out.println(resp3); arkService.shutdownExecutor(); } } ``` **选项:OpenAI SDK** ```Python import os from openai import OpenAI # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key = os.getenv('ARK_API_KEY') client = OpenAI( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) response = client.responses.create( model="doubao-seed-2-1-pro-260915", input=[ { "role": "system", "content": "你是一位数学老师,能够讲清楚相应的数学问题。" }, ] ) print(response) second_response = client.responses.create( model="doubao-seed-2-1-pro-260915", previous_response_id=response.id, input=[{"role": "user", "content": "请解释一下余弦相似度原理"}], ) print(second_response) third_response = client.responses.create( model="doubao-seed-2-1-pro-260915", instructions="增加一个要求:我希望你可以用小学生能听懂的方式解释这个问题。", previous_response_id=response.id, input=[{"role": "user", "content": "请解释一下余弦相似度原理"}], ) print(third_response) ``` ## 续写模式 通过预填(Prefill)部分 **assistant** 角色的内容,引导和控制模型从已有的文本片段继续输出,以及控制模型在角色扮演场景中保持一致性。 ### 支持模型 * doubao-seed-evolving * doubao-seed-2-1-pro-260915 * doubao-seed-2-1-lite-260915 * doubao-seed-2-1-pro-260628 * doubao-seed-2-1-turbo-260628 * doubao-seed-2-0-lite-260428 * doubao-seed-2-0-mini-260428 * doubao-seed-2-0-pro-260215 * doubao-seed-2-0-lite-260215 * doubao-seed-2-0-mini-260215 * doubao-seed-2-0-code-preview-260215 * doubao-seed-character-260628 * doubao-seed-character-260628 * glm-5-3-flash-260828 * deepseek-v4-1-flash-261017 * deepseek-v4-1-flash-260910 * deepseek-v4-1-flash-economy-261017 ### 核心配置 在 **input** 列表里设置最后一条消息的 **role** 为`assistant`,并设置 **partial** 为` true`开启续写模式,模型会基于 **content** 内容进行续写。 ```Python "input": [ {"role": "user", "content": "Please write bubble sort code without any additional content."}, {"role": "assistant", "content": "def bubble_sort(arr):", "partial": true} ] ``` > **注意** > > 使用续写模式,需注意: > > * 使用 `deepseek-v4-1-flash-261017`、`deepseek-v4-1-flash-260910`、`deepseek-v4-1-flash-economy-261017` 模型时,不设置 `partial` 不会报错,只是不开启续写。 > * 新一轮输入支持将`assistant`角色的 **content** 设置为空进行 Prefill,实现模型多轮连续回答。 > * 支持使用前缀缓存和 **Session** 缓存。其中 **Session** 缓存场景下,缓存存储、下一轮的命中缓存,都按本轮输入 **tokens** 计算。 > * 不支持结构化输出(**json_object** 模式和 **json_schema** 模式)。 > * 建议不要与内置工具搭配使用。因涉及大模型调用和工具调用的循环逻辑,续写模式下的 **content** 无法作为最终输出的起点内容,导致续写模式失效。 ### 使用示例 #### 代码补全场景 下面是对冒泡排序算法的代码进行续写的示例。开启续写模式后,模型会基于 `"def bubble_sort(arr):"`进行续写。 **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "input": [ {"role": "user", "content": "Please write bubble sort code without any additional content."}, {"role": "assistant", "content": "def bubble_sort(arr):", "partial": true} ], "caching": {"type": "disabled"} }' ``` **选项:Python** ```Python import os from arkruntime import Ark client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=os.getenv('ARK_API_KEY'), ) response = client.responses.create( model="doubao-seed-2-1-pro-260915", input=[ {"role": "user", "content": "Please write bubble sort code without any additional content."}, {"role": "assistant", "content": "def bubble_sort(arr):", "partial": True} ], caching={"type": "disabled"} ) print(response) ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/responses" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) input := responses.NewInputItemArrayResponsesInput([]responses.InputItem{ easyMessage( responses.MessageRoleUser, "请补全冒泡排序代码,不要输出额外内容。", false, ), easyMessage(responses.MessageRoleAssistant, "def bubble_sort(arr):", true), }) response, err := client.CreateResponses(context.Background(), &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", Input: input, Caching: responses.NewOptResponseCaching(responses.ResponseCaching{ Type: responses.NewOptCacheMode(responses.CacheModeDisabled), }), }) if err != nil { fmt.Printf("response error: %v\n", err) return } fmt.Println(response) } func easyMessage( role responses.MessageRole, content string, partial bool, ) responses.InputItem { return responses.InputItem{ OneOf: responses.NewItemEasyMessageInputItemSum( responses.ItemEasyMessage{ Role: responses.NewOptMessageRole(role), Content: responses.NewStringMessageContent(content), Partial: responses.NewOptBool(partial), }, ), } } ``` **选项:Java** ```Java package com.ark.example; import com.volcengine.ark.runtime.service.ArkService; import com.volcengine.ark.runtime.models.responses.*; public class demo { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); ArkService arkService = ArkService.builder().apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); ResponsesRequest request = ResponsesRequest.builder() .model("doubao-seed-2-1-pro-260915") .input(ResponsesInput.ofList(java.util.Arrays.asList(ItemEasyMessage.builder().role(MessageRole.USER).content( MessageContent.ofString("Please write bubble sort code without any additional content.") ).build(), ItemEasyMessage.builder().role(MessageRole.ASSISTANT).content( MessageContent.ofString("def bubble_sort(arr):") ).partial(true).build()))) .caching(ResponseCaching.builder().type(CacheMode.DISABLED).build()) .build(); Response resp = arkService.createResponse(request); System.out.println(resp); arkService.shutdownExecutor(); } } ``` **选项:OpenAI SDK** ```Python import os from openai import OpenAI client = OpenAI( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=os.getenv('ARK_API_KEY'), ) response = client.responses.create( model="doubao-seed-2-1-pro-260915", input=[ {"role": "user", "content": "Please write bubble sort code without any additional content."}, {"role": "assistant", "content": "def bubble_sort(arr):", "partial": True} ], extra_body={ "caching": {"type": "disabled"} } ) print(response) ``` 返回示例: > 模型根据信息 "def bubble_sort(arr):" 续写,保持对应的格式和行文风格。 ``` n = len(arr) for i in range(n): swapped = False for j in range(0, n-i-1): if arr[j] > arr[j+1]: arr[j], arr[j+1] = arr[j+1], arr[j] swapped = True if not swapped: break return arr ``` #### 上下文缓存场景 以 Curl 方式为例介绍在续写模式下使用上下文缓存,其他 SDK 示例参见[上下文缓存](/docs/context-cache)。 * 创建前缀缓存,同时使用续写模式。 > *输入内容需要大于等于256个tokens,否则无法创建前缀缓存。* ```Bash curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "input":[ { "role": "system", "content": "你是豆包," }, { "role": "user", "content": "你喜欢吃什么?" }, { "role": "assistant", "content": "西红柿" }, { "role": "user", "content": "还有呢?" }, { "role": "assistant", "content": "豆腐", "partial":true } ], "caching":{ "type":"enabled", "prefix": true }, "thinking": { "type": "disabled" } }' ``` * 创建 Session 缓存,同时使用续写模式。通过上一轮请求返回 id 读取并使用前缀缓存。 ```Bash curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "input":[ { "role": "assistant", "content": "包子" }, { "role": "assistant", "content": "", "partial":true } ], "previous_response_id": "", "caching":{ "type":"enabled" }, "thinking": { "type": "disabled" } }' ``` ## 工作原理及使用说明 ### 上下文管理工作原理 上下文管理流程如下: ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/eb56a7e5a22646278e195c8ced97ec06~tplv-goo7wpa0wc-image.image) * item:任意角色的一条信息,包括系统信息、用户信息、模型信息、思维链信息、工具信息等。 * response_id:代表本轮请求输入 item + 回答 item。 * 输入 item:previous_response_id 指代的 item + 本轮新输入 item。通过链表的形式串联之前轮次的对话,形成新的输入。 ### 使用说明 默认开启存储功能,支持通过设置`"store": true` 启用 / `"store": false` 关闭。 * 存储条件:本次请求回复完毕且成功(返回 **status** 字段为`completed`),或者回复触发了长度限制导致截断(**status** 字段为 `incomplete`)都会将本轮记录存储。当思维链内容触发了长度限制导致截断,在查询模型响应时返回 **output** 为空。 * 输入限制: * `store: true`(开启存储)时,输入限制同时受模型上下文窗口/最大输入长度、存储 items 数约束,实际可用输入上限以先达到的限制为准。 * 模型长度限制:在[模型列表](/docs/model-list)查看对应模型的长度限制。 * items 上限:最多支持 1000 个 item(任意角色的一条信息为 1 个 item,如一问一答为 2 个 item)。达到此限制,无法继续对话,可通过[删除 Response](/docs/delete-model-responses-api)手动清理记录。 * `store: false`(关闭存储)时,输入限制仅受模型上下文窗口/最大输入长度约束。 * 存储时长:默认存储 3 天,可通过 **expire_at** 字段自定义设置,最长支持 7 天。 * 存储内容:存储 **input** 和 **output** 字段的信息,不存储思维链内容。 * 其他说明:store 功能当前不收取费用;数据会采用加密方式,确保信息安全和隐私合规。 ## QPS 限流 Responses API QPS 限流如下。如果需要提升限流值,请提交 [工单](https://console.volcengine.com/workorder/create?step=2&SubProductID=P00001166)。 |接口名称 |账号维度的 QPS 限流 | | --- | --- | |创建模型响应 |无 | |查询模型响应 |20 | |列出输入项 |20 | |删除模型响应 |20 | --- # 深度思考 Source: https://ark.volcengine.com/region:cn-beijing/docs/responses-api-deep-thinking 具备深度思考能力的模型可高效处理复杂任务。模型在输出回答前,先对输入问题进行系统性分析和逻辑拆解,再基于拆解结果生成回答,确保内容全面且有深度。 > **说明** > > 方舟平台的新用户?获取 API Key 及 开通模型等准备工作,请参见 [快速入门](/docs/quick-start)。 ## 支持模型 250615 及之后版本的大语言模型,如无特殊说明,默认支持 Responses API,具体请参见[文本生成能力](/docs/model-list#32e9e053) 中能力标签含"深度思考"的模型。 ## API 文档 [Responses API](/docs/create-model-responses-api) ## 流式输出 深度思考模型在回复前需进行思考,在非流式输出场景中容易因超时导致任务失败,推荐使用流式输出。 > **说明** > > 若应用是非流式输出场景,建议先以流式输出方式获取完整内容后再输出,这样既能避免任务超时失败,又能满足应用的输出需求。 **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "input": "常见的十字花科植物有哪些?", "thinking":{"type": "enabled"}, "stream": true }' ``` 输出示例: ``` event: response.created data: {"type":"response.created","response":{"created_at":1764229579,"id":"resp_021764229578658fe9a0f6cb2cc6c828e7a59adbdb971872aee70","max_output_tokens":32768,"model":"doubao-seed-2-1-pro-260915","object":"response","thinking":{"type":"enabled"},"service_tier":"default","caching":{"type":"disabled"},"store":true,"expire_at":1764488778},"sequence_number":0} event: response.in_progress data: {"type":"response.in_progress","response":{"created_at":1764229579,"id":"resp_021764229578658fe9a0f6cb2cc6c828e7a59adbdb971872aee70","max_output_tokens":32768,"model":"doubao-seed-2-1-pro-260915","object":"response","thinking":{"type":"enabled"},"service_tier":"default","caching":{"type":"disabled"},"store":true,"expire_at":1764488778},"sequence_number":1} event: response.output_item.added data: {"type":"response.output_item.added","output_index":0,"item":{"id":"rs_02176422957963700000000000000000000ffffac15dd335c9c43","type":"reasoning","status":"in_progress"},"sequence_number":2} event: response.reasoning_summary_part.added data: {"type":"response.reasoning_summary_part.added","item_id":"rs_02176422957963700000000000000000000ffffac15dd335c9c43","output_index":0,"summary_index":0,"part":{"type":"summary_text"},"sequence_number":3} event: response.reasoning_summary_text.delta data: {"type":"response.reasoning_summary_text.delta","summary_index":0,"delta":"\n","item_id":"rs_02176422957963700000000000000000000ffffac15dd335c9c43","output_index":0,"sequence_number":4} event: response.reasoning_summary_text.delta data: {"type":"response.reasoning_summary_text.delta","summary_index":0,"delta":"用户","item_id":"rs_02176422957963700000000000000000000ffffac15dd335c9c43","output_index":0,"sequence_number":5} event: response.reasoning_summary_text.delta data: {"type":"response.reasoning_summary_text.delta","summary_index":0,"delta":"问","item_id":"rs_02176422957963700000000000000000000ffffac15dd335c9c43","output_index":0,"sequence_number":6} ... ``` **选项:Python** ```Python import os from arkruntime import Ark from arkruntime.types.responses.response_completed_event import ResponseCompletedEvent from arkruntime.types.responses.response_reasoning_summary_text_delta_event import ResponseReasoningSummaryTextDeltaEvent from arkruntime.types.responses.response_output_item_added_event import ResponseOutputItemAddedEvent from arkruntime.types.responses.response_text_delta_event import ResponseTextDeltaEvent from arkruntime.types.responses.response_text_done_event import ResponseTextDoneEvent # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key = os.getenv('ARK_API_KEY') client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) # Create a request response = client.responses.create( model="doubao-seed-2-1-pro-260915", input="常见的十字花科植物有哪些?", thinking={"type": "enabled"}, stream=True ) for event in response: if isinstance(event, ResponseReasoningSummaryTextDeltaEvent): print(event.delta, end="") if isinstance(event, ResponseOutputItemAddedEvent): print("\noutPutItem " + event.type + " start:") if isinstance(event, ResponseTextDeltaEvent): print(event.delta,end="") if isinstance(event, ResponseTextDoneEvent): print("\noutPutTextDone.") if isinstance(event, ResponseCompletedEvent): print("Response Completed. Usage = " + event.response.usage.model_dump_json()) ``` 输出示例: ``` outPutItem response.output_item.added start: 用户问常见的十字花科植物有哪些,首先我得回忆一下十字花科的主要特征,比如花是十字形花冠,四强雄蕊(四长两短),果实多为角果(长角果或短角果)。然后要列举常见的种类,分几个类别可能更清楚,比如蔬菜类、观赏类、野生类这些。 .... 现在组织语言,先总述十字花科的特征,然后分蔬菜、观赏、野生杂草三类列举常见例子,每个例子简要说明。这样结构清晰,用户容易理解。 outPutItem response.output_item.added start: 十字花科植物是被子植物中常见的一科,其核心特征为**十字形花冠(4片花瓣呈十字排列)、四强雄蕊(4长2短)、果实多为角果**(分长角果如油菜,短角果如荠菜)。以下是几类常见的十字花科植物: ### **一、常见蔬菜类** 这是十字花科最广为人知的类别,很多日常食材都属于此类: 1. **白菜类**:大白菜、小白菜、娃娃菜(均为芸薹属变种,叶用为主); 2. ... ... ### **总结** 十字花科植物与人类生活密切相关——从日常蔬菜到观赏花卉,再到田间杂草,其多样性和实用性都很强。记住“十字花、四强雄蕊、角果”这三个特征,就能轻松识别大部分十字花科植物啦! outPutTextDone. Response Completed. Usage = {"input_tokens":42,"input_tokens_details":{"cached_tokens":0},"output_tokens":1089,"output_tokens_details":{"reasoning_tokens":431},"total_tokens":1131,"tool_usage":null,"tool_usage_details":null} ``` **选项:Go** ```Go package main import ( "context" "fmt" "io" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/responses" ) func main() { client := arkruntime.NewClientWithApiKey( // Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() resp, err := client.CreateResponsesStream(ctx, &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", Input: responses.NewStringResponsesInput("常见的十字花科植物有哪些?"), Thinking: responses.NewOptThinking(responses.Thinking{Type: responses.NewOptThinkingMode(responses.ThinkingModeEnabled)}), }) if err != nil { fmt.Printf("stream error: %v", err) return } for { event, err := resp.Recv() if err == io.EOF { break } if err != nil { fmt.Printf("stream error: %v", err) return } handleEvent(event) } } func handleEvent(event *responses.ResponseStreamEvent) { switch event.OneOf.Type { case responses.ResponseReasoningSummaryTextDeltaEventResponseStreamEventSum: print(event.OneOf.ResponseReasoningSummaryTextDeltaEvent.Delta.Or("")) case responses.ResponseReasoningSummaryTextDoneEventResponseStreamEventSum: fmt.Printf("\nAggregated reasoning text: %s\n", event.OneOf.ResponseReasoningSummaryTextDoneEvent.Text.Or("")) case responses.ResponseTextDeltaEventResponseStreamEventSum: print(event.OneOf.ResponseTextDeltaEvent.Delta.Or("")) case responses.ResponseTextDoneEventResponseStreamEventSum: fmt.Printf("\nAggregated output text: %s\n", event.OneOf.ResponseTextDoneEvent.Text.Or("")) } } ``` 输出示例: ``` 用户问常见的十字花科植物有哪些,我需要先回忆一下十字花科的主要特征,然后列举常见的例子,最好分分类,比如蔬菜类、花卉类、野生类之类的,这样用户看起来清楚。首先,十字花科的特征是十字形花冠,四强雄蕊(四长两短),角果(长角果或短角果)。 ... Aggregated reasoning text: 十字花科植物因**十字形花冠**(四片花瓣呈十字排列)、**四强雄蕊**(四长两短)和**角果**(果实类型)为主要特征,在蔬菜、观赏花卉中十分常见。以下是几类典型代表: ... **答案总结:** 常见十字花科植物包括白菜、萝卜、卷心菜、西兰花、油菜、荠菜、紫罗兰、二月兰等(按蔬菜/花卉分类列举即可)。 (注:若需更简洁,可直接列出核心例子:如白菜、萝卜、西兰花、荠菜、紫罗兰、二月兰等)。 Aggregated output text: 十字花科植物因**十字形花冠**(四片花瓣呈十字排列)、**四强雄蕊**(四长两短)和**角果**(果实类型)为主要特征,在蔬菜、观赏花卉中十分常见。以下是几类典型代表: ... **答案总结:** 常见十字花科植物包括白菜、萝卜、卷心菜、西兰花、油菜、荠菜、紫罗兰、二月兰等(按蔬菜/花卉分类列举即可)。 (注:若需更简洁,可直接列出核心例子:如白菜、萝卜、西兰花、荠菜、紫罗兰、二月兰等)。 ``` **选项:Java** ```Java package com.ark.example; import com.volcengine.ark.runtime.service.ArkService; import com.volcengine.ark.runtime.models.responses.*; public class demo { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); // The base URL for model invocation ArkService arkService = ArkService.builder().apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); ResponsesRequest request = ResponsesRequest.builder() .model("doubao-seed-2-1-pro-260915") .stream(true) .input(ResponsesInput.ofString("常见的十字花科植物有哪些?")) .thinking(Thinking.builder().type(ThinkingMode.ENABLED).build()) .build(); arkService.streamResponse(request) .doOnError(Throwable::printStackTrace) .blockingForEach(event -> { if (event instanceof ResponseReasoningSummaryTextDeltaEvent) { System.out.print(((ResponseReasoningSummaryTextDeltaEvent) event).getDelta()); } if (event instanceof ResponseOutputItemAddedEvent) { System.out.println("OutputItem " + (((ResponseOutputItemAddedEvent) event).getItem().getType()) + " Start: "); } if (event instanceof ResponseTextDeltaEvent) { System.out.print(((ResponseTextDeltaEvent) event).getDelta()); } if (event instanceof ResponseTextDoneEvent) { System.out.println("OutputText End."); } if (event instanceof ResponseOutputItemDoneEvent) { System.out.println("OutputItem " + ((ResponseOutputItemDoneEvent) event).getItem().getType() + " End."); } if (event instanceof ResponseFunctionCallArgumentsDoneEvent) { System.out.println("FunctionCall Arguments: " + ((ResponseFunctionCallArgumentsDoneEvent) event).getArguments()); } if (event instanceof ResponseCompletedEvent) { System.out.println("Response Completed. Usage = " + ((ResponseCompletedEvent) event).getResponse().getUsage()); } }); arkService.shutdownExecutor(); } } ``` 输出示例: ``` OutputItem reasoning Start: 用户问常见的十字花科植物有哪些,首先我得回忆一下十字花科的主要特征,比如十字形花冠、四强雄蕊这些,但用户可能不需要特征,直接要例子。首先想到的是蔬菜类,因为很多日常吃的蔬菜都是十字花科的。 ... OutputItem message Start: 十字花科植物种类丰富,其中很多是日常常见的蔬菜、观赏植物或野菜,以下是一些典型例子: ... 这些植物在饮食、农业或景观中都很常见,你平时吃的蔬菜里大概率就有它们的身影! 🌱🥦🥬OutputText End. OutputItem message End. Response Completed. Usage = Usage{inputTokens=42, outputTokens=759, totalTokens=801, inputTokensDetails=InputTokensDetails{cachedTokens=0}, outputTokensDetails=com.volcengine.ark.runtime.model.responses.usage.OutputTokensDetails@73d983ea, toolUsage=null, toolUsageDetails=null} ``` **选项:OpenAI SDK** ```Python import os from openai import OpenAI # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key = os.getenv('ARK_API_KEY') client = OpenAI( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) # Create a request response = client.responses.create( model="doubao-seed-2-1-pro-260915", input="常见的十字花科植物有哪些?", stream=True, extra_body={ "thinking": {"type": "enabled"}, } ) for event in response: if event.type == "response.reasoning_summary_text.delta": print(event.delta, end="") if event.type == "response.output_item.added": print("\noutPutItem " + event.type + " start:") if event.type == "response.output_text.delta": print(event.delta,end="") if event.type == "response.output_item.done": print("\noutPutTextDone.") if event.type == "response.completed": print("\nResponse Completed. Usage = " + event.response.usage.model_dump_json()) ``` 输出示例: ``` outPutItem response.output_item.added start: 用户问常见的十字花科植物有哪些,首先我得回忆一下十字花科的主要特征,比如十字形花冠、四强雄蕊这些,但用户可能不需要特征,直接要例子。然后要分常见的类别,比如蔬菜类的,这个应该最多,还有观赏类的,可能还有野生的杂草类? ... outPutTextDone. outPutItem response.output_item.added start: 十字花科植物是被子植物中较大的一科,特征为**十字形花冠**(4瓣呈十字排列)、**四强雄蕊**(6枚雄蕊,4长2短),很多种类是常见的蔬菜、观赏植物或野菜。以下是几类典型的常见十字花科植物: ... **答案总结:** 常见的十字花科植物包括白菜、萝卜、甘蓝(圆白菜/西兰花/花椰菜)、油菜、芥菜、荠菜、二月兰、紫罗兰等,涵盖蔬菜、观赏、野菜三大类。 ... outPutTextDone. Response Completed. Usage = {"input_tokens":42,"input_tokens_details":{"cached_tokens":0},"output_tokens":1467,"output_tokens_details":{"reasoning_tokens":574},"total_tokens":1509} ``` ## 控制深度思考 通过 **thinking** 字段控制是否关闭深度思考能力。 * `enabled`:强制开启,强制开启深度思考能力。 * `disabled`:强制关闭深度思考能力。 * `auto`:模型自行判断是否进行深度思考。 支持 Responses API 中 **thinking** 字段来控制深度思考的模型如下: * doubao-seed-evolving:支持 `enabled`(默认)、`disabled`。 * doubao-seed-2-1-pro-260915:支持 `enabled`(默认)、`disabled`。 * doubao-seed-2-1-lite-260915:支持 `enabled`(默认)、`disabled`。 * doubao-seed-2-1-pro-260628:支持 `enabled`(默认)、`disabled`。 * doubao-seed-2-1-turbo-260628:支持 `enabled`(默认)、`disabled`。 * doubao-seed-2-0-lite-260428:支持 `enabled`(默认)、`disabled`。 * doubao-seed-2-0-mini-260428:支持 `enabled`(默认)、`disabled`。 * doubao-seed-2-0-pro-260215:支持 `enabled`(默认)、`disabled`。 * doubao-seed-2-0-lite-260215:支持 `enabled`(默认)、`disabled`。 * doubao-seed-2-0-mini-260215:支持 `enabled`(默认)、`disabled`。 * doubao-seed-2-0-code-preview-260215:支持 `enabled`(默认)、`disabled`。 * glm-5-3-flash-260828:支持 `enabled`(默认)。(**始终启用思考,不再支持禁用思考。**) * glm-5-2-260617:支持 `enabled`(默认)、`disabled`。 * doubao-seed-character-260628:支持 `enabled`(默认)、`disabled`。 * deepseek-v4-1-flash-261017:支持 `enabled`(默认)、`disabled`。 * deepseek-v4-1-flash-260910:支持 `enabled`(默认)、`disabled`。 * deepseek-v4-1-flash-economy-261017:支持 `enabled`(默认)、`disabled`。 * deepseek-v4-pro-ga-260813:支持 `enabled`(默认)、`disabled`。 * deepseek-v4-flash-ga-260731:支持 `enabled`(默认)、`disabled`。 * deepseek-v4-pro-260425:支持 `enabled`(默认)、`disabled`。 **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "input": "推理模型与非推理模型区别。", "thinking":{"type": "enabled"} }' ``` **选项:Python** ```Python import os from arkruntime import Ark # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key = os.getenv('ARK_API_KEY') client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) # Create a request response = client.responses.create( model="doubao-seed-2-1-pro-260915", input="推理模型与非推理模型区别。", thinking={"type": "enabled"}, ) print(response) ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/responses" ) func main() { client := arkruntime.NewClientWithApiKey( // Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() resp, err := client.CreateResponses(ctx, &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", Input: responses.NewStringResponsesInput("推理模型与非推理模型区别。"), Thinking: responses.NewOptThinking(responses.Thinking{Type: responses.NewOptThinkingMode(responses.ThinkingModeEnabled)}), }) if err != nil { fmt.Printf("response error: %v\n", err) return } fmt.Println(resp) } ``` **选项:Java** ```Java package com.ark.example; import com.volcengine.ark.runtime.service.ArkService; import com.volcengine.ark.runtime.models.responses.*; public class demo { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); // The base URL for model invocation ArkService arkService = ArkService.builder().apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); ResponsesRequest request = ResponsesRequest.builder() .model("doubao-seed-2-1-pro-260915") .input(ResponsesInput.ofString("推理模型与非推理模型区别。")) .thinking(Thinking.builder().type(ThinkingMode.ENABLED).build()) .build(); Response resp = arkService.createResponse(request); System.out.println(resp); arkService.shutdownExecutor(); } } ``` **选项:OpenAI SDK** ```Python import os from openai import OpenAI # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key = os.getenv('ARK_API_KEY') client = OpenAI( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) # Create a request response = client.responses.create( model="doubao-seed-2-1-pro-260915", input="推理模型与非推理模型区别。", extra_body={ "thinking": {"type": "enabled"}, } ) print(response) ``` ## 输出思考内容摘要 ### 支持模型 * doubao-seed-evolving * doubao-seed-2-1-pro-260915 * doubao-seed-2-1-lite-260915 * doubao-seed-2-1-pro-260628 * doubao-seed-2-1-turbo-260628 * doubao-seed-2-0-lite-260428 ### 使用说明 默认会开启 thinking summary 能力,不会输出模型原始的思考内容,会返回模型思考内容摘要字段 **summary**、思考内容加密原文字段 **encrypted_content**。 > **说明** > > 默认开启 thinking summary 能力后,可能会有较高的包间延迟,请调大请求超时时间(**timeout**),并做好兼容适配。 字段说明: * **reasoning.effort**:仅作用于模型的原始思考内容,不适用于思考摘要。 * **usage.output_tokens_details.reasoning_tokens**:为原始思考内容的 tokens,计费仍然按原始思考内容 token 计算。 ### 回传思考内容 在多轮工具调用场景,需要回传思考内容,支持的回传方式如下。回传思考内容示例参见[回传思考内容加密原文](/docs/deep-thinking#8cfd447b)。 * **previous_response_id**(推荐): 自动获取原始思考内容并回传给模型参与推理。 * 手动回传 **encrypted_content**:按接收到的完整格式**回传思考内容加密原文**,被篡改后则无法还原思考内容。 ## 调节思考长度 通过 **reasoning.effort** 调节思维链长度,平衡不同场景对效果、时延、成本的需求。取值如下: * `none`:关闭思考。 * `minimal`:关闭思考,直接回答。 * `low`:轻量思考,侧重快速响应。 * `medium`:均衡模式,兼顾速度与深度。 * `high`:深度分析,处理复杂问题。 * `xhigh`:更高强度思考。 * `max`:最高强度思考,适配高难度推理任务。 下表展示支持调节思考长度的模型,以及各模型对 **reasoning.effort** 的支持取值、默认取值与兼容映射规则。所有支持该字段的模型均接受全部 7 档取值,部分取值将按表中规则自动映射至等效档位。 | 支持模型 | 默认取值 | 兼容映射 | | --- | --- | --- | |* `doubao-seed-evolving` | `high` |* 传入 `minimal`:将关闭思考 | \ |* `doubao-seed-2-1-pro-260915` | |* 传入 `none`:将映射为 `minimal` | \ |* `doubao-seed-2-1-lite-260915` | |* 传入 `none`:将映射为 `minimal` | \ |* `doubao-seed-2-1-pro-260628` | |* 传入 `xhigh` / `max`:将映射为 `high` | \ |* `doubao-seed-2-1-turbo-260628` | | | |* `doubao-seed-2-0-lite-260428` | `medium` |* 传入 `minimal`:将关闭思考 | \ |* `doubao-seed-2-0-mini-260428` | |* 传入 `none`:将映射为 `minimal` | \ |* `doubao-seed-2-0-pro-260215` | |* 传入 `xhigh` / `max`:将映射为 `high` | \ |* `doubao-seed-2-0-lite-260215` | | | \ |* `doubao-seed-2-0-mini-260215` | | | \ |* `doubao-seed-2-0-code-preview-260215` | | | \ |* `doubao-seed-character-260628` | | | | `glm-5-3-flash-260828` | `max` |* 传入 `none` / `minimal` / `low`:将映射为 `low` | \ | | |* 传入 `medium` / `high`:将映射为 `high` | \ | | |* 传入 `xhigh` / `max`:将映射为 `max` | | `glm-5-2-260617` | `high` |* 传入 `none` / `minimal`:将关闭思考 | \ | | |* 传入 `low` / `medium`:将映射为 `high` | \ | | |* 传入 `xhigh`:将映射为 `max` | |* `deepseek-v4-1-flash-261017`
    * `deepseek-v4-1-flash-260910`
    * `deepseek-v4-1-flash-economy-261017` | `high` |* 传入 `none`:将关闭思考 | \ | | |* 传入 `minimal`:将映射为 `low` | \ | | |* 传入 `medium` / `xhigh`:将映射为 `high` | |* `deepseek-v4-pro-ga-260813` | `high` |* 传入 `none` / `minimal`:将关闭思考 | \ |* `deepseek-v4-flash-ga-260731` | |* 传入 `medium`:将映射为 `low` | \ | | |* 传入 `xhigh`:将映射为 `high` | |* `deepseek-v4-pro-260425` | `high` |* 传入 `minimal`:将关闭思考 | \ 关于 **thinking.type**、**reasoning.effort** 的使用说明如下: * **thinking.type** 取值为 `enabled`:支持配置 **reasoning.effort**。当 **reasoning.effort** 取值为 `minimal` 时,则关闭思考,直接回答。 * **thinking.type** 取值为 `disabled`:**reasoning.effort** 仅支持取值 `minimal`。当 **reasoning.effort** 为其他取值时会报错。 **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "input": [ { "role": "user", "content": [ { "type": "input_image", "image_url": "https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/ark_demo_img_1-zh.png" }, { "type": "input_text", "text": "你看见了什么?" } ] } ], "thinking":{"type":"enabled"}, "reasoning":{"effort": "low"} }' ``` **选项:Python** ```Python import os from arkruntime import Ark # 从环境变量中获取您的API KEY,配置方法见:https://ark.volcengine.com/region:cn-beijing/docs/quick-start api_key = os.getenv('ARK_API_KEY') client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) response = client.responses.create( model="doubao-seed-2-1-pro-260915", input=[ { "role": "user", "content": [ { "type": "input_image", "image_url": "https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/ark_demo_img_1-zh.png" }, { "type": "input_text", "text": "你看见了什么?" }, ], } ], thinking={"type": "enabled"}, reasoning={"effort": "low"} ) print(response) ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/responses" ) func main() { client := arkruntime.NewClientWithApiKey( //通过 os.Getenv 从环境变量中获取 ARK_API_KEY os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) // 创建一个上下文,通常用于传递请求的上下文信息,如超时、取消等 ctx := context.Background() inputMessage := responses.InputItem{ OneOf: responses.NewItemEasyMessageInputItemSum( responses.ItemEasyMessage{ Role: responses.NewOptMessageRole(responses.MessageRoleUser), Content: responses.NewContentItemArrayMessageContent( []responses.ContentItem{ responses.ContentItem{OneOf: responses.NewContentItemImageContentItemSum(responses.ContentItemImage{Type: responses.ContentItemImageTypeInputImage, ImageURL: responses.NewOptString("https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/ark_demo_img_1-zh.png")})}, responses.ContentItem{OneOf: responses.NewContentItemTextContentItemSum(responses.ContentItemText{Type: responses.ContentItemTextTypeInputText, Text: "你看见了什么?"})}, }, ), }, ), } resp, err := client.CreateResponses(ctx, &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", Input: responses.NewInputItemArrayResponsesInput([]responses.InputItem{inputMessage}), Thinking: responses.NewOptThinking(responses.Thinking{Type: responses.NewOptThinkingMode(responses.ThinkingModeEnabled)}), Reasoning: responses.NewOptReasoning(responses.Reasoning{Effort: responses.NewOptReasoningEffort(responses.ReasoningEffortLow)}), }) if err != nil { fmt.Printf("response error: %v", err) return } fmt.Println(resp) } ``` **选项:Java** ```Java package com.ark.example; import com.volcengine.ark.runtime.service.ArkService; import com.volcengine.ark.runtime.models.responses.*; public class demo { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); // 创建ArkService实例 ArkService arkService = ArkService.builder().apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); ResponsesRequest request = ResponsesRequest.builder() .model("doubao-seed-2-1-pro-260915") .input(ResponsesInput.ofList(java.util.Arrays.asList(ItemEasyMessage.builder().role(MessageRole.USER).content( MessageContent.ofList(java.util.Arrays.asList(ContentItemImage.builder().imageUrl("https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/ark_demo_img_1-zh.png").build(), ContentItemText.builder().text("你看见了什么?").build())) ).build()))) .thinking(Thinking.builder().type(ThinkingMode.ENABLED).build()) .reasoning(Reasoning.builder().effort(ReasoningEffort.LOW).build()) .build(); Response resp = arkService.createResponse(request); System.out.println(resp); arkService.shutdownExecutor(); } } ``` **选项:OpenAI SDK** ```Python import os from openai import OpenAI # 从环境变量中获取您的API KEY,配置方法见:https://ark.volcengine.com/region:cn-beijing/docs/quick-start api_key = os.getenv('ARK_API_KEY') client = OpenAI( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) response = client.responses.create( model="doubao-seed-2-1-pro-260915", input=[ { "role": "user", "content": [ { "type": "input_image", "image_url": "https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/ark_demo_img_1-zh.png" }, { "type": "input_text", "text": "你看见了什么?" }, ], } ], extra_body={ "thinking": {"type": "enabled"}, }, reasoning={"effort": "low"} ) print(response) ``` ## 设置最大输出长度 模型输出长度 = 思维链长度(如果有) + 回答长度 通过设置 **max_output_tokens** 字段调整模型输出长度,达到控制成本或输出指定篇幅的目的。 **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "input": "推理模型与非推理模型区别。", "max_output_tokens": 1024 }' ``` **选项:Python** ```Python import os from arkruntime import Ark # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key = os.getenv('ARK_API_KEY') client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) # Create a request response = client.responses.create( model="doubao-seed-2-1-pro-260915", input="推理模型与非推理模型区别。", max_output_tokens=1024 ) print(response) ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/responses" ) func main() { client := arkruntime.NewClientWithApiKey( // Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() resp, err := client.CreateResponses(ctx, &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", Input: responses.NewStringResponsesInput("推理模型与非推理模型区别。"), MaxOutputTokens: responses.NewOptInt64(int64(1024)), }) if err != nil { fmt.Printf("response error: %v\n", err) return } fmt.Println(resp) } ``` **选项:Java** ```Java package com.ark.example; import com.volcengine.ark.runtime.service.ArkService; import com.volcengine.ark.runtime.models.responses.*; public class demo { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); // The base URL for model invocation ArkService arkService = ArkService.builder().apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); ResponsesRequest request = ResponsesRequest.builder() .model("doubao-seed-2-1-pro-260915") .input(ResponsesInput.ofString("推理模型与非推理模型区别。")) .maxOutputTokens(1024L) .build(); Response resp = arkService.createResponse(request); System.out.println(resp); arkService.shutdownExecutor(); } } ``` **选项:OpenAI SDK** ```Python import os from openai import OpenAI # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key = os.getenv('ARK_API_KEY') client = OpenAI( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) # Create a request response = client.responses.create( model="doubao-seed-2-1-pro-260915", input="推理模型与非推理模型区别。", max_output_tokens=1024 ) print(response) ``` ## 工作原理 * 多轮对话场景 |流程图 |说明 | | --- | --- | |![deep-thinking-01.flowchart](https://arkdocs.tos-cn-beijing.volces.com/flowcharts/advanced-usage/deep-thinking-01.svg) |* 在每一轮对话过程中,深度思考模型会输出思维链内容(CoT)和最终回答(Answer)。 | \ | |* 在下一轮对话中,之前输出的思维链内容不会被拼接到上下文中。 | \ | |> 思维链内容展现的是模型处理问题的过程,包括将问题拆分为多个问题进行处理,生成多种回复综合得出更好回答等过程。 | * 工具调用场景 工具调用场景中开启深度思考后,为给出更详尽准确的回答,将不会直接丢弃思维链内容,历史轮次的思维链内容按需(模型自主判断)参与推理。在整个请求过程中,用户回传完整上下文即可,由服务端自行判断,是否保留思维链内容。未输入给模型的思维链内容,不会计算 token 用量。代码示例参见[回传思考内容](/docs/deep-thinking#3e8661f7)。 |流程图 |说明 | | --- | --- | |![deep-thinking-02.flowchart](https://arkdocs.tos-cn-beijing.volces.com/flowcharts/advanced-usage/deep-thinking-02.svg) |* 回答问题 1 时(请求 1.1 - 1.2),模型进行多次思考 + 工具调用后给出答案,方舟会输入完整上下文包括思维链内容给模型处理。 | \ | |* 开始回答问题 2 时(请求 2.1),方舟会自行判断并删除之前上下文中的思维链,输入给模型。 | ## QPS 限流 Responses API QPS 限流如下。如果需要提升限流值,请提交 [工单](https://console.volcengine.com/workorder/create?step=2&SubProductID=P00001166)。 |接口名称 |账号维度的 QPS 限流 | | --- | --- | |创建模型响应 |无 | |查询模型响应 |20 | |列出输入项 |20 | |删除模型响应 |20 | --- # 多模态理解 Source: https://ark.volcengine.com/region:cn-beijing/docs/multimodal-understanding 视觉模型支持传入图片、视频和文档,完成图像描述、视觉问答、内容审核等视觉相关任务。 ## 支持模型 250615及之后版本的视觉模型,如无特殊说明,默认支持 Responses API,具体请参见:[视觉理解能力](/docs/model-list#76df97c8)。 ## API文档 [Responses API](/docs/create-model-responses-api) ## 完整教程 Responses API 支持多种文件输入方式:Files API 上传文件、Base64 编码输入和文件 URL 传入。 本文重点介绍 **Files API 上传文件**方式。如需了解其他文件输入方式,以及图片/视频/文档格式要求、文件大小限制、视频抽帧策略等详情,请查看以下教程: * [图片理解](/docs/image-understanding) * [视频理解](/docs/video-understanding) * [文档理解](/docs/document-understanding) ## 图片理解 模型支持理解图片的信息,并结合这些信息完成如描述其中的物体等视觉相关任务。关于图片理解支持的图片输入方式及示例,请参见[图片理解](/docs/image-understanding)。 建议优先使用 Files API 上传本地文件,适用于图片文件较大,或者需要在多个请求中重复使用图片的场景。 > 该方式支持最大 512MB 的文件,默认存储 7 天,存储有效期取值范围为1-30天。 示例中用到的图片文件及提示词如下: |图片文件 |提示词 | |---|---| |![](https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/planet_comparison.png) |根据图片,表格中列出了多少颗行星,地球位于哪一行? | 代码示例: **选项:Curl** 1. 上传图片文件获取File ID。 ```Bash curl https://ark.cn-beijing.volces.com/api/v3/files \ -H "Authorization: Bearer $ARK_API_KEY" \ -F "purpose=user_data" \ -F "file=@/path/to/your/image.png" ``` 2. 在Responses API中引用File ID。 ```Bash curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "input": [ { "role": "user", "content": [ { "type": "input_image", "file_id": "file-20251018****" }, { "type": "input_text", "text": "根据图片,表格中列出了多少颗行星,地球位于哪一行?" } ] } ] }' ``` **选项:Python SDK** ```Python import asyncio import os from arkruntime import AsyncArk from arkruntime.types.responses.response_completed_event import ResponseCompletedEvent from arkruntime.types.responses.response_reasoning_summary_text_delta_event import ResponseReasoningSummaryTextDeltaEvent from arkruntime.types.responses.response_output_item_added_event import ResponseOutputItemAddedEvent from arkruntime.types.responses.response_text_delta_event import ResponseTextDeltaEvent from arkruntime.types.responses.response_text_done_event import ResponseTextDoneEvent client = AsyncArk( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=os.getenv('ARK_API_KEY') ) async def main(): # upload an image file print("Upload picture file") file = await client.files.create( # replace with your local picture path file=open("/Users/doc/planet_comparison.png", "rb"), purpose="user_data" ) print(f"File uploaded: {file.id}") # Wait for the file to finish processing await client.files.wait_for_processing(file.id) print(f"File processed: {file.id}") stream = await client.responses.create( model="doubao-seed-2-1-pro-260915", input=[ {"role": "user", "content": [ { "type": "input_image", "file_id": file.id # ref pdf file id }, { "type": "input_text", "text": "根据图片,表格中列出了多少颗行星,地球位于哪一行?" } ]}, ], caching={ "type": "enabled", }, store=True, stream=True ) async for event in stream: if isinstance(event, ResponseReasoningSummaryTextDeltaEvent): print(event.delta, end="") if isinstance(event, ResponseOutputItemAddedEvent): print("\noutPutItem " + event.type + " start:") if isinstance(event, ResponseTextDeltaEvent): print(event.delta,end="") if isinstance(event, ResponseTextDoneEvent): print("\noutPutTextDone.") if isinstance(event, ResponseCompletedEvent): print("Response Completed. Usage = " + event.response.usage.model_dump_json()) if __name__ == "__main__": asyncio.run(main()) ``` **选项:Go SDK** ```Go package main import ( "context" "fmt" "io" "os" "time" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/file" "github.com/volcengine/ark-runtime-go/arkruntime/model/responses" ) func main() { client := arkruntime.NewClientWithApiKey( // Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() fmt.Println("----- upload image data -----") data, err := os.Open("/Users/doc/planet_comparison.png") if err != nil { fmt.Printf("read file error: %v\n", err) return } fileInfo, err := client.UploadFile(ctx, &file.FileCreateRequest{ Purpose: file.PurposeUserData, }, data) if err != nil { fmt.Printf("upload file error: %v", err) return } // Wait for the file to finish processing for fileInfo.Status == file.StatusProcessing { fmt.Println("Waiting for image to be processed...") time.Sleep(2 * time.Second) fileInfo, err = client.RetrieveFile(ctx, fileInfo.ID) // update file info if err != nil { fmt.Printf("get file status error: %v", err) return } } fmt.Printf("Image processing completed: %s, status: %s\n", fileInfo.ID, fileInfo.Status) inputMessage := responses.InputItem{ OneOf: responses.NewItemEasyMessageInputItemSum( responses.ItemEasyMessage{ Role: responses.NewOptMessageRole(responses.MessageRoleUser), Content: responses.NewContentItemArrayMessageContent( []responses.ContentItem{ responses.ContentItem{OneOf: responses.NewContentItemImageContentItemSum(responses.ContentItemImage{Type: responses.ContentItemImageTypeInputImage, FileID: responses.NewOptString(fileInfo.ID)})}, responses.ContentItem{OneOf: responses.NewContentItemTextContentItemSum(responses.ContentItemText{Type: responses.ContentItemTextTypeInputText, Text: "根据图片,表格中列出了多少颗行星,地球位于哪一行?"})}, }, ), }, ), } createResponsesReq := &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", Input: responses.NewInputItemArrayResponsesInput([]responses.InputItem{inputMessage}), } resp, err := client.CreateResponsesStream(ctx, createResponsesReq) if err != nil { fmt.Printf("stream error: %v\n", err) return } var responseId string for { event, err := resp.Recv() if err == io.EOF { break } if err != nil { fmt.Printf("stream error: %v\n", err) return } handleEvent(event) if event.OneOf.Type == responses.ResponseCreatedEventResponseStreamEventSum { responseId = event.OneOf.ResponseCreatedEvent.Response.ID fmt.Printf("Response ID: %s", responseId) } } } func handleEvent(event *responses.ResponseStreamEvent) { switch event.OneOf.Type { case responses.ResponseReasoningSummaryTextDeltaEventResponseStreamEventSum: print(event.OneOf.ResponseReasoningSummaryTextDeltaEvent.Delta.Or("")) case responses.ResponseReasoningSummaryTextDoneEventResponseStreamEventSum: fmt.Printf("\nAggregated reasoning text: %s\n", event.OneOf.ResponseReasoningSummaryTextDoneEvent.Text.Or("")) case responses.ResponseTextDeltaEventResponseStreamEventSum: print(event.OneOf.ResponseTextDeltaEvent.Delta.Or("")) case responses.ResponseTextDoneEventResponseStreamEventSum: fmt.Printf("\nAggregated output text: %s\n", event.OneOf.ResponseTextDoneEvent.Text.Or("")) } } ``` **选项:Java SDK** ```Java package com.ark.example; import com.volcengine.ark.runtime.models.file.*; import com.volcengine.ark.runtime.service.ArkService; import com.volcengine.ark.runtime.models.responses.*; import java.io.File; import java.util.concurrent.TimeUnit; public class demo { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); ArkService service = ArkService.builder().apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); System.out.println("===== Upload File Example====="); // upload an image for responses FileObject fileMeta; fileMeta = service.uploadFile(FileCreateRequest.builder() // replace with your image file path .purpose(Purpose.USER_DATA) .build(), new File("/Users/doc/planet_comparison.png")); System.out.println("Uploaded file Meta: " + fileMeta); System.out.println("status:" + fileMeta.getStatus()); try { while ("processing".equalsIgnoreCase(fileMeta.getStatus().toString())) { System.out.println("Waiting for image to be processed..."); TimeUnit.SECONDS.sleep(2); fileMeta = service.retrieveFile(fileMeta.getId()); } } catch (Exception e) { System.err.println("get file status error:" + e.getMessage()); } System.out.println("Uploaded file Meta: " + fileMeta); ResponsesRequest request = ResponsesRequest.builder() .model("doubao-seed-2-1-pro-260915") .stream(true) .input(ResponsesInput.ofList(java.util.Arrays.asList(ItemEasyMessage.builder().role(MessageRole.USER).content( MessageContent.ofList(java.util.Arrays.asList(ContentItemImage.builder().fileId(fileMeta.getId()).build(), ContentItemText.builder().text("根据图片,表格中列出了多少颗行星,地球位于哪一行?").build())) ).build()))) .build(); service.streamResponse(request) .doOnError(Throwable::printStackTrace) .blockingForEach(event -> { if (event instanceof ResponseReasoningSummaryTextDeltaEvent) { System.out.print(((ResponseReasoningSummaryTextDeltaEvent) event).getDelta()); } if (event instanceof ResponseOutputItemAddedEvent) { System.out.println("\nOutputItem " + (((ResponseOutputItemAddedEvent) event).getItem().getType()) + " Start: "); } if (event instanceof ResponseTextDeltaEvent) { System.out.print(((ResponseTextDeltaEvent) event).getDelta()); } if (event instanceof ResponseTextDoneEvent) { System.out.println("\nOutputText End."); } if (event instanceof ResponseOutputItemDoneEvent) { System.out.println("\nOutputItem " + ((ResponseOutputItemDoneEvent) event).getItem().getType() + " End."); } if (event instanceof ResponseFunctionCallArgumentsDoneEvent) { System.out.println("\nFunctionCall Arguments: " + ((ResponseFunctionCallArgumentsDoneEvent) event).getArguments()); } if (event instanceof ResponseCompletedEvent) { System.out.println("\nResponse Completed. Usage = " + ((ResponseCompletedEvent) event).getResponse().getUsage()); } }); service.shutdownExecutor(); } } ``` **选项:兼容 OpenAI SDK** ```Python import os import time from openai import OpenAI api_key = os.getenv('ARK_API_KEY') client = OpenAI( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) file = client.files.create( file=open("/Users/doc/planet_comparison.png", "rb"), purpose="user_data" ) # Wait for the file to finish processing while (file.status == "processing"): time.sleep(2) file = client.files.retrieve(file.id) print(f"File processed: {file}") response = client.responses.create( model="doubao-seed-2-1-pro-260915", input=[ { "role": "user", "content": [ { "type": "input_image", "file_id": file.id, }, { "type": "input_text", "text": "根据图片,表格中列出了多少颗行星,地球位于哪一行?", }, ] } ], stream=True ) for event in response: if event.type == "response.reasoning_summary_text.delta": print(event.delta, end="") if event.type == "response.output_item.added": print("\noutPutItem " + event.type + " start:") if event.type == "response.output_text.delta": print(event.delta,end="") if event.type == "response.output_item.done": print("\noutPutTextDone.") if event.type == "response.completed": print("\nResponse Completed. Usage = " + event.response.usage.model_dump_json()) ``` 输出示例: ``` 表格中列出了 8 颗行星。地球位于第 3 个数据行;如果把表头算作第 1 行,则地球位于第 4 行。 ``` ## 视频理解 模型可理解视频中的视觉信息,可以完成如描述其中的物体、分析动作逻辑等视觉相关任务。关于视频理解支持的文件输入方式及示例,请参见[视频理解](/docs/video-understanding)。 建议优先使用 Files API 上传本地视频文件,适用于视频文件较大,或者需要在多个请求中重复使用视频的场景。 > 该方式支持最大 512MB 的文件,默认存储 7 天,存储有效期取值范围为1-30天。 示例中用到的视频文件及提示词如下: |视频文件 |提示词 | |---|---| |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/608b664aad1b49ce9fd41b597551236b) |请你描述下视频中的人物的一系列动作,以JSON格式输出开始时间(start_time)、结束时间(end_time)、事件(event)、是否危险(danger),请使用HH:mm:ss表示时间戳。 | 示例代码: **选项:Curl** 1. 上传视频文件获取File ID。 ```Bash curl https://ark.cn-beijing.volces.com/api/v3/files \ -H "Authorization: Bearer $ARK_API_KEY" \ -F "purpose=user_data" \ -F "file=@/Users/doc/demo.mp4" \ -F "preprocess_configs[video][fps]=0.3" ``` 2. 在Responses API中引用File ID。 ```Bash curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Authorization: Bearer $ARK_API_KEY" \ -H 'Content-Type: application/json' \ -d '{ "model": "doubao-seed-2-1-pro-260915", "input": [ { "role": "user", "content": [ { "type": "input_video", "file_id": "file-20251018****" }, { "type": "input_text", "text": "请你描述下视频中的人物的一系列动作,以JSON格式输出开始时间(start_time)、结束时间(end_time)、事件(event)、是否危险(danger),请使用HH:mm:ss表示时间戳。" } ] } ] }' ``` **选项:Python SDK** ```Python import asyncio import os from arkruntime import AsyncArk from arkruntime.types.responses.response_completed_event import ResponseCompletedEvent from arkruntime.types.responses.response_reasoning_summary_text_delta_event import ResponseReasoningSummaryTextDeltaEvent from arkruntime.types.responses.response_output_item_added_event import ResponseOutputItemAddedEvent from arkruntime.types.responses.response_text_delta_event import ResponseTextDeltaEvent from arkruntime.types.responses.response_text_done_event import ResponseTextDoneEvent client = AsyncArk( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=os.getenv('ARK_API_KEY') ) async def main(): # upload video file print("Upload video file") file = await client.files.create( # replace with your local video path file=open("/Users/doc/demo.mp4", "rb"), purpose="user_data", preprocess_configs={ "video": { "model": "doubao-seed-2-1-pro-260915", "fps": 0.3, # define the sampling fps of the video, default is 1.0 } } ) print(f"File uploaded: {file.id}") # Wait for the file to finish processing await client.files.wait_for_processing(file.id) print(f"File processed: {file.id}") stream = await client.responses.create( model="doubao-seed-2-1-pro-260915", input=[ {"role": "user", "content": [ { "type": "input_video", "file_id": file.id # ref video file id }, { "type": "input_text", "text": "请你描述下视频中的人物的一系列动作,以JSON格式输出开始时间(start_time)、结束时间(end_time)、事件(event)、是否危险(danger),请使用HH:mm:ss表示时间戳。" } ]}, ], caching={ "type": "enabled", }, store=True, stream=True ) async for event in stream: if isinstance(event, ResponseReasoningSummaryTextDeltaEvent): print(event.delta, end="") if isinstance(event, ResponseOutputItemAddedEvent): print("\noutPutItem " + event.type + " start:") if isinstance(event, ResponseTextDeltaEvent): print(event.delta,end="") if isinstance(event, ResponseTextDoneEvent): print("\noutPutTextDone.") if isinstance(event, ResponseCompletedEvent): print("Response Completed. Usage = " + event.response.usage.model_dump_json()) if __name__ == "__main__": asyncio.run(main()) ``` **选项:Go SDK** ```Go package main import ( "context" "fmt" "io" "os" "time" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/file" "github.com/volcengine/ark-runtime-go/arkruntime/model/responses" ) func main() { client := arkruntime.NewClientWithApiKey( // Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() fmt.Println("----- upload video data -----") data, err := os.Open("/Users/doc/demo.mp4") if err != nil { fmt.Printf("read file error: %v\n", err) return } fileInfo, err := client.UploadFile(ctx, &file.FileCreateRequest{ Purpose: file.PurposeUserData, PreprocessConfigs: file.NewOptPreprocessConfigs(file.PreprocessConfigs{ Video: file.NewOptVideo(file.Video{ Model: file.NewOptString("doubao-seed-2-1-pro-260915"), Fps: file.NewOptFloat64(0.3), }), }), }, data) if err != nil { fmt.Printf("upload file error: %v", err) return } // Wait for the file to finish processing for fileInfo.Status == file.StatusProcessing { fmt.Println("Waiting for video to be processed...") time.Sleep(2 * time.Second) fileInfo, err = client.RetrieveFile(ctx, fileInfo.ID) // update file info if err != nil { fmt.Printf("get file status error: %v", err) return } } fmt.Printf("Video processing completed: %s, status: %s\n", fileInfo.ID, fileInfo.Status) inputMessage := responses.InputItem{ OneOf: responses.NewItemEasyMessageInputItemSum( responses.ItemEasyMessage{ Role: responses.NewOptMessageRole(responses.MessageRoleUser), Content: responses.NewContentItemArrayMessageContent( []responses.ContentItem{ responses.ContentItem{OneOf: responses.NewContentItemVideoContentItemSum(responses.ContentItemVideo{Type: responses.ContentItemVideoTypeInputVideo, VideoURL: "", FileID: responses.NewOptString(fileInfo.ID)})}, responses.ContentItem{OneOf: responses.NewContentItemTextContentItemSum(responses.ContentItemText{Type: responses.ContentItemTextTypeInputText, Text: "请你描述下视频中的人物的一系列动作,以JSON格式输出开始时间(start_time)、结束时间(end_time)、事件(event)、是否危险(danger),请使用HH:mm:ss表示时间戳。"})}, }, ), }, ), } createResponsesReq := &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", Input: responses.NewInputItemArrayResponsesInput([]responses.InputItem{inputMessage}), } resp, err := client.CreateResponsesStream(ctx, createResponsesReq) if err != nil { fmt.Printf("stream error: %v\n", err) return } var responseId string for { event, err := resp.Recv() if err == io.EOF { break } if err != nil { fmt.Printf("stream error: %v\n", err) return } handleEvent(event) if event.OneOf.Type == responses.ResponseCreatedEventResponseStreamEventSum { responseId = event.OneOf.ResponseCreatedEvent.Response.ID fmt.Printf("Response ID: %s", responseId) } } } func handleEvent(event *responses.ResponseStreamEvent) { switch event.OneOf.Type { case responses.ResponseReasoningSummaryTextDeltaEventResponseStreamEventSum: print(event.OneOf.ResponseReasoningSummaryTextDeltaEvent.Delta.Or("")) case responses.ResponseReasoningSummaryTextDoneEventResponseStreamEventSum: fmt.Printf("\nAggregated reasoning text: %s\n", event.OneOf.ResponseReasoningSummaryTextDoneEvent.Text.Or("")) case responses.ResponseTextDeltaEventResponseStreamEventSum: print(event.OneOf.ResponseTextDeltaEvent.Delta.Or("")) case responses.ResponseTextDoneEventResponseStreamEventSum: fmt.Printf("\nAggregated output text: %s\n", event.OneOf.ResponseTextDoneEvent.Text.Or("")) } } ``` **选项:Java SDK** ```Java package com.ark.example; import com.volcengine.ark.runtime.models.file.*; import com.volcengine.ark.runtime.service.ArkService; import com.volcengine.ark.runtime.models.responses.*; import java.io.File; import java.util.concurrent.TimeUnit; public class demo { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); ArkService service = ArkService.builder().apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); System.out.println("===== Upload File Example====="); // upload a video for responses FileObject fileMeta; fileMeta = service.uploadFile(FileCreateRequest.builder() // replace with your video file path .purpose(Purpose.USER_DATA) .preprocessConfigs(PreprocessConfigs.builder().video(Video.builder().model("doubao-seed-2-1-pro-260915").fps(0.3).build()).build()) .build(), new File("/Users/doc/demo.mp4")); System.out.println("Uploaded file Meta: " + fileMeta); System.out.println("status:" + fileMeta.getStatus()); try { while ("processing".equalsIgnoreCase(fileMeta.getStatus().toString())) { System.out.println("Waiting for video to be processed..."); TimeUnit.SECONDS.sleep(2); fileMeta = service.retrieveFile(fileMeta.getId()); } } catch (Exception e) { System.err.println("get file status error:" + e.getMessage()); } System.out.println("Uploaded file Meta: " + fileMeta); ResponsesRequest request = ResponsesRequest.builder() .model("doubao-seed-2-1-pro-260915") .stream(true) .input(ResponsesInput.ofList(java.util.Arrays.asList(ItemEasyMessage.builder().role(MessageRole.USER).content( MessageContent.ofList(java.util.Arrays.asList(ContentItemVideo.builder().fileId(fileMeta.getId()).build(), ContentItemText.builder().text("请你描述下视频中的人物的一系列动作,以JSON格式输出开始时间(start_time)、结束时间(end_time)、事件(event)、是否危险(danger),请使用HH:mm:ss表示时间戳。").build())) ).build()))) .build(); service.streamResponse(request) .doOnError(Throwable::printStackTrace) .blockingForEach(event -> { if (event instanceof ResponseReasoningSummaryTextDeltaEvent) { System.out.print(((ResponseReasoningSummaryTextDeltaEvent) event).getDelta()); } if (event instanceof ResponseOutputItemAddedEvent) { System.out.println("\nOutputItem " + (((ResponseOutputItemAddedEvent) event).getItem().getType()) + " Start: "); } if (event instanceof ResponseTextDeltaEvent) { System.out.print(((ResponseTextDeltaEvent) event).getDelta()); } if (event instanceof ResponseTextDoneEvent) { System.out.println("\nOutputText End."); } if (event instanceof ResponseOutputItemDoneEvent) { System.out.println("\nOutputItem " + ((ResponseOutputItemDoneEvent) event).getItem().getType() + " End."); } if (event instanceof ResponseFunctionCallArgumentsDoneEvent) { System.out.println("\nFunctionCall Arguments: " + ((ResponseFunctionCallArgumentsDoneEvent) event).getArguments()); } if (event instanceof ResponseCompletedEvent) { System.out.println("\nResponse Completed. Usage = " + ((ResponseCompletedEvent) event).getResponse().getUsage()); } }); service.shutdownExecutor(); } } ``` **选项:兼容 OpenAI SDK** ```Python import os import time from openai import OpenAI api_key = os.getenv('ARK_API_KEY') client = OpenAI( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) file = client.files.create( file=open("/Users/doc/demo.mp4", "rb"), purpose="user_data", extra_body={ "preprocess_configs": { "video": { "model": "doubao-seed-2-1-pro-260915", "fps": 0.3, } } }, ) # Wait for the file to finish processing while (file.status == "processing"): time.sleep(2) file = client.files.retrieve(file.id) print(f"File processed: {file}") response = client.responses.create( model="doubao-seed-2-1-pro-260915", input=[ { "role": "user", "content": [ { "type": "input_video", "file_id": file.id, }, { "type": "input_text", "text": "请你描述下视频中的人物的一系列动作,以JSON格式输出开始时间(start_time)、结束时间(end_time)、事件(event)、是否危险(danger),请使用HH:mm:ss表示时间戳。", }, ] } ], stream=True ) for event in response: if event.type == "response.reasoning_summary_text.delta": print(event.delta, end="") if event.type == "response.output_item.added": print("\noutPutItem " + event.type + " start:") if event.type == "response.output_text.delta": print(event.delta,end="") if event.type == "response.output_item.done": print("\noutPutTextDone.") if event.type == "response.completed": print("\nResponse Completed. Usage = " + event.response.usage.model_dump_json()) ``` 输出示例: ``` { "text": [ { "start_time": "00:00:00", "end_time": "00:00:03", "event": "将黄色积木堆叠到红黄绿相间的积木塔顶端", "danger": false }, { "start_time": "00:00:05", "end_time": "00:00:07", "event": "拿起蓝色积木放入口中啃咬后取出", "danger": false }, { "start_time": "00:00:08", "end_time": "00:00:12", "event": "用手推动黄色和蓝色的玩具卡车在地面移动", "danger": false }, { "start_time": "00:00:12", "end_time": "00:00:24", "event": "双手扶着木质抽屉柜边缘,尝试将右脚踩在下方抽屉把手上向上攀爬", "danger": true } ] } ``` ## 文档理解 模型支持处理PDF格式的文档,在预处理时会分页来处理成多图,然后将每页图像输入模型进行处理,以实现对文档内容的理解和分析。 关于文档理解支持的文件输入方式及示例,请参见[文档理解](/docs/document-understanding)。 建议优先选择 Files API 上传的方式,适用于文件较大,或者需要在多个请求中重复使用文件的场景。 > 该方式支持最大 512MB 的文件,默认存储 7 天,存储有效期取值范围为1-30天。 示例中用到的PDF文件及提示词如下: |PDF文件 |提示词 | |---|---| |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/0335ac1d4cdc4378bd291584131c2cce~tplv-goo7wpa0wc-image.image) |按段落给出文档中的文字内容,以JSON格式输出,包括段落类型(type)、文字内容(content)信息。 | 代码示例: **选项:Curl** 1. 上传PDF文件获取File ID。 ```Bash curl https://ark.cn-beijing.volces.com/api/v3/files \ -H "Authorization: Bearer $ARK_API_KEY" \ -F "purpose=user_data" \ -F "file=@/Users/doc/demo.pdf" ``` 2. 在Responses API中引用File ID。 ```Bash curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Authorization: Bearer $ARK_API_KEY" \ -H 'Content-Type: application/json' \ -d '{ "model": "doubao-seed-2-1-pro-260915", "input": [ { "role": "user", "content": [ { "type": "input_file", "file_id": "file-20251018****" }, { "type": "input_text", "text": "按段落给出文档中的文字内容,以JSON格式输出,包括段落类型(type)、文字内容(content)信息。" } ] } ] }' ``` **选项:Python SDK** ```Python import asyncio import os from arkruntime import AsyncArk from arkruntime.types.responses.response_completed_event import ResponseCompletedEvent from arkruntime.types.responses.response_reasoning_summary_text_delta_event import ResponseReasoningSummaryTextDeltaEvent from arkruntime.types.responses.response_output_item_added_event import ResponseOutputItemAddedEvent from arkruntime.types.responses.response_text_delta_event import ResponseTextDeltaEvent from arkruntime.types.responses.response_text_done_event import ResponseTextDoneEvent client = AsyncArk( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=os.getenv('ARK_API_KEY') ) async def main(): # upload pdf file print("Upload pdf file") file = await client.files.create( # replace with your local pdf path file=open("/Users/doc/demo.pdf", "rb"), purpose="user_data" ) print(f"File uploaded: {file.id}") # Wait for the file to finish processing await client.files.wait_for_processing(file.id) print(f"File processed: {file.id}") stream = await client.responses.create( model="doubao-seed-2-1-pro-260915", input=[ {"role": "user", "content": [ { "type": "input_file", "file_id": file.id # ref pdf file id }, { "type": "input_text", "text": "按段落给出文档中的文字内容,以JSON格式输出,包括段落类型(type)、文字内容(content)信息。" } ]}, ], caching={ "type": "enabled", }, store=True, stream=True ) async for event in stream: if isinstance(event, ResponseReasoningSummaryTextDeltaEvent): print(event.delta, end="") if isinstance(event, ResponseOutputItemAddedEvent): print("\noutPutItem " + event.type + " start:") if isinstance(event, ResponseTextDeltaEvent): print(event.delta,end="") if isinstance(event, ResponseTextDoneEvent): print("\noutPutTextDone.") if isinstance(event, ResponseCompletedEvent): print("Response Completed. Usage = " + event.response.usage.model_dump_json()) if __name__ == "__main__": asyncio.run(main()) ``` **选项:Go SDK** ```Go package main import ( "context" "fmt" "io" "os" "time" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/file" "github.com/volcengine/ark-runtime-go/arkruntime/model/responses" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() fmt.Println("----- upload file data -----") data, err := os.Open("/Users/doc/demo.pdf") if err != nil { fmt.Printf("read file error: %v\n", err) return } fileInfo, err := client.UploadFile(ctx, &file.FileCreateRequest{ Purpose: file.PurposeUserData, }, data) if err != nil { fmt.Printf("upload file error: %v", err) return } // Wait for the file to finish processing for fileInfo.Status == file.StatusProcessing { fmt.Println("Waiting for file to be processed...") time.Sleep(2 * time.Second) fileInfo, err = client.RetrieveFile(ctx, fileInfo.ID) // update file info if err != nil { fmt.Printf("get file status error: %v", err) return } } fmt.Printf("Video processing completed: %s, status: %s\n", fileInfo.ID, fileInfo.Status) inputMessage := responses.InputItem{ OneOf: responses.NewItemEasyMessageInputItemSum( responses.ItemEasyMessage{ Role: responses.NewOptMessageRole(responses.MessageRoleUser), Content: responses.NewContentItemArrayMessageContent( []responses.ContentItem{ responses.ContentItem{OneOf: responses.NewContentItemFileContentItemSum(responses.ContentItemFile{Type: responses.ContentItemFileTypeInputFile, FileID: responses.NewOptString(fileInfo.ID)})}, responses.ContentItem{OneOf: responses.NewContentItemTextContentItemSum(responses.ContentItemText{Type: responses.ContentItemTextTypeInputText, Text: "按段落给出文档中的文字内容,以JSON格式输出,包括段落类型(type)、文字内容(content)信息。"})}, }, ), }, ), } createResponsesReq := &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", Input: responses.NewInputItemArrayResponsesInput([]responses.InputItem{inputMessage}), } resp, err := client.CreateResponsesStream(ctx, createResponsesReq) if err != nil { fmt.Printf("stream error: %v\n", err) return } var responseId string for { event, err := resp.Recv() if err == io.EOF { break } if err != nil { fmt.Printf("stream error: %v\n", err) return } handleEvent(event) if event.OneOf.Type == responses.ResponseCreatedEventResponseStreamEventSum { responseId = event.OneOf.ResponseCreatedEvent.Response.ID fmt.Printf("Response ID: %s", responseId) } } } func handleEvent(event *responses.ResponseStreamEvent) { switch event.OneOf.Type { case responses.ResponseReasoningSummaryTextDeltaEventResponseStreamEventSum: print(event.OneOf.ResponseReasoningSummaryTextDeltaEvent.Delta.Or("")) case responses.ResponseReasoningSummaryTextDoneEventResponseStreamEventSum: fmt.Printf("\nAggregated reasoning text: %s\n", event.OneOf.ResponseReasoningSummaryTextDoneEvent.Text.Or("")) case responses.ResponseTextDeltaEventResponseStreamEventSum: print(event.OneOf.ResponseTextDeltaEvent.Delta.Or("")) case responses.ResponseTextDoneEventResponseStreamEventSum: fmt.Printf("\nAggregated output text: %s\n", event.OneOf.ResponseTextDoneEvent.Text.Or("")) } } ``` **选项:Java SDK** ```Java package com.ark.example; import com.volcengine.ark.runtime.models.file.*; import com.volcengine.ark.runtime.service.ArkService; import com.volcengine.ark.runtime.models.responses.*; import java.io.File; import java.util.concurrent.TimeUnit; public class demo { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); ArkService service = ArkService.builder().apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); System.out.println("===== Upload File Example====="); // upload a file for responses FileObject fileMeta; fileMeta = service.uploadFile(FileCreateRequest.builder() // replace with your file path .purpose(Purpose.USER_DATA) .build(), new File("/Users/doc/demo.pdf")); System.out.println("Uploaded file Meta: " + fileMeta); System.out.println("status:" + fileMeta.getStatus()); try { while ("processing".equalsIgnoreCase(fileMeta.getStatus().toString())) { System.out.println("Waiting for file to be processed..."); TimeUnit.SECONDS.sleep(2); fileMeta = service.retrieveFile(fileMeta.getId()); } } catch (Exception e) { System.err.println("get file status error:" + e.getMessage()); } System.out.println("Uploaded file Meta: " + fileMeta); ResponsesRequest request = ResponsesRequest.builder() .model("doubao-seed-2-1-pro-260915") .stream(true) .input(ResponsesInput.ofList(java.util.Arrays.asList(ItemEasyMessage.builder().role(MessageRole.USER).content( MessageContent.ofList(java.util.Arrays.asList(ContentItemFile.builder().fileId(fileMeta.getId()).build(), ContentItemText.builder().text("按段落给出文档中的文字内容,以JSON格式输出,包括段落类型(type)、文字内容(content)信息。").build())) ).build()))) .build(); service.streamResponse(request) .doOnError(Throwable::printStackTrace) .blockingForEach(event -> { if (event instanceof ResponseReasoningSummaryTextDeltaEvent) { System.out.print(((ResponseReasoningSummaryTextDeltaEvent) event).getDelta()); } if (event instanceof ResponseOutputItemAddedEvent) { System.out.println("\nOutputItem " + (((ResponseOutputItemAddedEvent) event).getItem().getType()) + " Start: "); } if (event instanceof ResponseTextDeltaEvent) { System.out.print(((ResponseTextDeltaEvent) event).getDelta()); } if (event instanceof ResponseTextDoneEvent) { System.out.println("\nOutputText End."); } if (event instanceof ResponseOutputItemDoneEvent) { System.out.println("\nOutputItem " + ((ResponseOutputItemDoneEvent) event).getItem().getType() + " End."); } if (event instanceof ResponseFunctionCallArgumentsDoneEvent) { System.out.println("\nFunctionCall Arguments: " + ((ResponseFunctionCallArgumentsDoneEvent) event).getArguments()); } if (event instanceof ResponseCompletedEvent) { System.out.println("\nResponse Completed. Usage = " + ((ResponseCompletedEvent) event).getResponse().getUsage()); } }); service.shutdownExecutor(); } } ``` **选项:兼容 OpenAI SDK** ```Python import os import time from openai import OpenAI api_key = os.getenv('ARK_API_KEY') client = OpenAI( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) file = client.files.create( file=open("/Users/doc/demo.pdf", "rb"), purpose="user_data" ) # Wait for the file to finish processing while (file.status == "processing"): time.sleep(2) file = client.files.retrieve(file.id) print(f"File processed: {file}") response = client.responses.create( model="doubao-seed-2-1-pro-260915", input=[ { "role": "user", "content": [ { "type": "input_file", "file_id": file.id, }, { "type": "input_text", "text": "按段落给出文档中的文字内容,以JSON格式输出,包括段落类型(type)、文字内容(content)信息。", }, ] } ], stream=True ) for event in response: if event.type == "response.reasoning_summary_text.delta": print(event.delta, end="") if event.type == "response.output_item.added": print("\noutPutItem " + event.type + " start:") if event.type == "response.output_text.delta": print(event.delta,end="") if event.type == "response.output_item.done": print("\noutPutTextDone.") if event.type == "response.completed": print("\nResponse Completed. Usage = " + event.response.usage.model_dump_json()) ``` 输出示例: ``` { "text": [ { "type": "heading", "content": "1 Introduction" }, { "type": "paragraph", "content": "Diffusion models [3–5] learn to reverse a process that incrementally corrupts data with noise, effectively decomposing a complex distribution into a hierarchy of simplified representations. This coarse-to-fine generative approach has proven remarkably successful across a wide range of applications, including image and video synthesis [6] as well as solving complex challenges in natural sciences [7]." }, ... { "type": "heading", "content": "3 Seed Diffusion" }, { "type": "paragraph", "content": "As the first experimental model in our Seed Diffusion series, Seed Diffusion Preview is specifically focused on code generation, thus adopting the data pipeline (code/code-related data only) and processing methodology of the open-sourced Seed Coder project [20]. The architecture is a standard dense Transformer, and we intentionally omit complex components such as LongCoT reasoning in this initial version to first establish a strong and efficient performance baseline. This section introduces its key components and training strategies." } ] } ``` --- # 工具调用 Source: https://ark.volcengine.com/region:cn-beijing/docs/responses-api-tool-calling Responses API 支持使用方舟大模型内置工具、函数调用 Function Calling 等工具来扩展模型的功能。这些功能使模型能够搜索网络资料、图片处理、私域知识库搜索或者调用自定义函数。 ## 快速开始 以天气查询场景为例,介绍使用函数调用 Function Calling 的方法。 **选项:Curl** **第一轮请求: 触发工具调用** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "store": true, "input": [ { "type": "message", "role": "user", "content": "查询北京今天的天气" } ], "tools": [ { "type": "function", "name": "get_weather", "description": "根据城市名称查询该城市当日天气(含温度、天气状况)", "parameters": { "type": "object", "properties": { "location": { "type": "string", "description": "城市名称,如北京、上海(仅支持国内地级市)" } }, "required": ["location"] } } ] }' ``` **第一轮响应:返回 function_call 指令** 模型会返回工具调用指令,关键字段为`call_id`(关联后续结果)、`arguments`(调用参数): ``` { "created_at": 1756980000, "id": "resp_02175698000123456789abcdef0123", "model": "doubao-seed-2-1-pro-260915", "object": "response", "output": [ { "arguments": "{\"location\":\"北京\"}", "call_id": "call_abc123def456ghi789jkl0", "name": "get_weather", "type": "function_call", "id": "fc_02175698000abcdef0123456789gh", "status": "completed" } ], "status": "completed", "store": true, "expire_at": 1757239200 } ``` **执行工具:获取天气结果** 开发者根据 `arguments` 调用实际天气工具(如第三方天气 API),假设返回结果为: ```Python { "city": "北京", "date": "2025-10-13", "temperature": "18~28℃", "condition": "晴转多云", "wind": "东北风2级" } ``` **第二轮请求:回传结果并生成最终响应** 传入上一轮 `response_id`、工具结果,模型生成自然语言回答: ```Bash curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "previous_response_id": "resp_02175698000123456789abcdef0123", "input": [ { "type": "function_call_output", "call_id": "call_abc123def456ghi789jkl0", "output": "{\"city\":\"北京\",\"date\":\"2025-10-13\",\"temperature\":\"18~28℃\",\"condition\":\"晴转多云\",\"wind\":\"东北风2级\"}" } ] }' ``` **第二轮响应:生成最终回答** 模型结合工具结果,返回自然语言响应: ``` { "created_at": 1756980100, "id": "resp_02175698010abcdef0123456789gh", "model": "doubao-seed-2-1-pro-260915", "object": "response", "output": [ { "type": "message", "role": "assistant", "content": [ { "type": "output_text", "text": "北京今天(2025-10-13)的天气为晴转多云,气温在18~28℃之间,东北风2级。" } ], "status": "completed", "id": "msg_02175698010abcdef0123456789ij" } ], "status": "completed", "store": true } ``` **选项:Python** ```Python import os from arkruntime import Ark import json # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key = os.getenv('ARK_API_KEY') client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) # Define the tool (weather query tool) weather_tool = [ { "type": "function", "name": "get_weather", "description": "根据城市名称查询该城市当日天气(含温度、天气状况)", "parameters": { "type": "object", "properties": { "location": { "type": "string", "description": "城市名称,如北京、上海(仅支持国内地级市)" } }, "required": ["location"] } } ] # ------------------- First Round Request: Trigger Tool Call ------------------- print("=== First Round Request: Trigger Tool Call ===") first_response = client.responses.create( model="doubao-seed-2-1-pro-260915", store=True, input=[ { "type": "message", "role": "user", "content": "查询北京今天的天气" } ], tools=weather_tool ) # Extract key information(previous_response_id、call_id、arguments) previous_response_id = first_response.id function_call = next( item for item in first_response.output if item.type == "function_call" ) call_id = function_call.call_id call_arguments = function_call.arguments print(f"First Round Response ID:{previous_response_id}") print(f"Tool Call ID:{call_id}") print(f"Call Parameters:{call_arguments}") # ------------------- Simulate Tool Execution: Get Weather Results ------------------- print("=== Simulate Tool Execution: Get Weather Results ===") # In real scenarios, call a third-party weather API here; we use mock data instead. tool_output = { "city": "北京", "date": "2025-10-13", "temperature": "18~28℃", "condition": "晴转多云", "wind": "东北风2级" } print(f"Tool Return Result:{tool_output}") # ------------------- Second Round Request: Return Result and Generate Final Response ------------------- print("=== Second Round Request: Return Result and Generate Final Response ===") second_response = client.responses.create( model="doubao-seed-2-1-pro-260915", previous_response_id=previous_response_id, input=[ { "type": "function_call_output", "call_id": call_id, "output": json.dumps(tool_output, ensure_ascii=False) } ] ) # Extract and print the final answer final_answer = next( item for item in second_response.output if item.type == "message" ) print("=== Final Answer ===") print(final_answer.content[0].text) ``` **选项:Go** ```Go package main import ( "context" "encoding/json" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/responses" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) tool := weatherTool() response, err := client.CreateResponses(context.Background(), &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", Input: responses.NewStringResponsesInput("北京的天气怎么样?"), Store: responses.NewOptBool(true), Tools: []responses.Tool{tool}, }) if err != nil { fmt.Printf("response error: %v\n", err) return } call, ok := functionCall(response.Output) if !ok { fmt.Println(response) return } fmt.Printf( "response_id=%s call_id=%s arguments=%s\n", response.ID, call.CallID.Or(""), call.Arguments.Or(""), ) toolOutput, err := json.Marshal(map[string]string{ "city": "北京", "condition": "晴转多云", "temperature": "18-28 C", }) if err != nil { panic(err) } second, err := client.CreateResponses(context.Background(), &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", PreviousResponseID: responses.NewOptString(response.ID), Input: responses.NewInputItemArrayResponsesInput([]responses.InputItem{ { OneOf: responses.NewItemFunctionToolCallOutputInputItemSum( responses.ItemFunctionToolCallOutput{ Type: responses.ItemFunctionToolCallOutputTypeFunctionCallOutput, CallID: responses.NewOptString(call.CallID.Or("")), Output: responses.NewOptMessageContent( responses.NewStringMessageContent(string(toolOutput)), ), }, ), }, }), }) if err != nil { fmt.Printf("response error: %v\n", err) return } fmt.Println(second) } func weatherTool() responses.Tool { var parameters responses.FunctionToolParameters schema := `{"type":"object","properties":{"location":{"type":"string","description":"城市名称,如北京、上海"}},"required":["location"]}` if err := json.Unmarshal([]byte(schema), ¶meters); err != nil { panic(err) } return responses.Tool{ OneOf: responses.NewFunctionToolToolSum(responses.FunctionTool{ Name: "get_weather", Type: responses.FunctionToolTypeFunction, Description: responses.NewOptString("根据城市名称查询该城市当日天气"), Parameters: responses.NewOptFunctionToolParameters(parameters), }), } } func functionCall(items []responses.OutputItem) (responses.ItemFunctionToolCall, bool) { for _, item := range items { if call, ok := item.OneOf.GetItemFunctionToolCall(); ok { return call, true } } return responses.ItemFunctionToolCall{}, false } ``` **选项:Java** ```Java package com.ark.example; import com.fasterxml.jackson.core.JsonProcessingException; import com.volcengine.ark.runtime.models.responses.*; import com.volcengine.ark.runtime.service.ArkService; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.JsonNode; import java.util.*; public class demo { public static ObjectMapper om = new ObjectMapper(); public static List buildTools() { JsonNode params = om.createObjectNode() .put("type", "object") .set("properties", om.createObjectNode() .set("location", om.createObjectNode() .put("type", "string") .put("description", "城市名称,如北京、上海(仅支持国内地级市)"))); FunctionTool t = FunctionTool.builder() .name("get_weather") .description("根据城市名称查询该城市当日天气(含温度、天气状况)") .parameters(om.convertValue(params, Map.class)) .build(); return Arrays.asList(t); } public static void main(String[] args) throws JsonProcessingException { String apiKey = System.getenv("ARK_API_KEY"); ArkService arkService = ArkService.builder().apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); System.out.println("=== First Round Request: Trigger Tool Call ==="); ResponsesRequest req = ResponsesRequest.builder() .model("doubao-seed-2-1-pro-260915") .store(true) .input(ResponsesInput.ofList(java.util.Arrays.asList(ItemEasyMessage.builder().role(MessageRole.USER).content( MessageContent.ofList(java.util.Arrays.asList(ContentItemText.builder().text("查询北京今天的天气").build())) ).build()))) .tools(buildTools()) .build(); Response resp = arkService.createResponse(req); System.out.println(resp); // Extract key information(previous_response_id、call_id、arguments) String previousId = resp.getId(); OutputItem targetCall = null; for(OutputItem item : resp.getOutput()) { if (item.getType() == ItemType.FUNCTION_CALL) { targetCall = item; break; } } ObjectMapper objectMapper = new ObjectMapper(); String jsonStr = objectMapper.writeValueAsString(targetCall); ItemFunctionToolCall functionCall = objectMapper.readValue(jsonStr, ItemFunctionToolCall.class); String callId = functionCall.getCallId(); String callArguments = functionCall.getArguments(); System.out.println("First Round Response ID:" + previousId); System.out.println("Tool Call ID:" + callId); System.out.println("Call Parameters:" + callArguments); System.out.println("=== Simulate Tool Execution: Get Weather Results ==="); Map toolOutput = new HashMap() {{ put("city", "北京"); put("date", "2025-10-13"); put("temperature", "18~28℃"); put("condition", "晴转多云"); put("wind", "东北风2级"); }}; System.out.println(toolOutput); System.out.println("=== Second Round Request: Return Result and Generate Final Response ==="); ResponsesRequest secondReq = ResponsesRequest.builder() .model("doubao-seed-2-1-pro-260915") .previousResponseId(previousId) .input(ResponsesInput.ofList(java.util.Arrays.asList(ItemFunctionToolCallOutput.builder().callId(callId).output(MessageContent.ofString(objectMapper.writeValueAsString(toolOutput))).build()))) .tools(buildTools()) .build(); Response secondResp = arkService.createResponse(secondReq); System.out.println("=== Final Answer ==="); System.out.println(secondResp); arkService.shutdownExecutor(); } } ``` **选项:OpenAI SDK** ```Python import os from openai import OpenAI import json # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key = os.getenv('ARK_API_KEY') client = OpenAI( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) # Define the tool (weather query tool) weather_tool = [ { "type": "function", "name": "get_weather", "description": "根据城市名称查询该城市当日天气(含温度、天气状况)", "parameters": { "type": "object", "properties": { "location": { "type": "string", "description": "城市名称,如北京、上海(仅支持国内地级市)" } }, "required": ["location"] } } ] # ------------------- First Round Request: Trigger Tool Call ------------------- print("=== First Round Request: Trigger Tool Call ===") first_response = client.responses.create( model="doubao-seed-2-1-pro-260915", store=True, input=[ { "type": "message", "role": "user", "content": "查询北京今天的天气" } ], tools=weather_tool ) # Extract key information(previous_response_id、call_id、arguments) previous_response_id = first_response.id function_call = next( item for item in first_response.output if item.type == "function_call" ) call_id = function_call.call_id call_arguments = function_call.arguments print(f"First Round Response ID:{previous_response_id}") print(f"Tool Call ID:{call_id}") print(f"Call Parameters:{call_arguments}") # ------------------- Simulate Tool Execution: Get Weather Results ------------------- print("=== Simulate Tool Execution: Get Weather Results ===") tool_output = { "city": "北京", "date": "2025-10-13", "temperature": "18~28℃", "condition": "晴转多云", "wind": "东北风2级" } print(f"Tool Return Result:{tool_output}") # ------------------- Second Round Request: Return Result and Generate Final Response------------------- print("=== Second Round Request: Return Result and Generate Final Response ===") second_response = client.responses.create( model="doubao-seed-2-1-pro-260915", previous_response_id=previous_response_id, input=[ { "type": "function_call_output", "call_id": call_id, "output": json.dumps(tool_output, ensure_ascii=False) } ] ) # Extract and print the final answer final_answer = next( item for item in second_response.output if item.type == "message" ) print("=== Final Answer ===") print(final_answer.content[0].text) ``` ## 支持的工具 ### 内置工具 当通过 Responses API 创建模型响应时,您可以通过在参数中配置 `tools` 字段来访问工具。每个工具中都有独特的配置要求,具体见如下教程: * [豆包助手 API](/docs/doubao-assistant) 为您的应用快速集成与豆包 App 同款的 AI 功能,例如日常沟通、深度沟通和联网搜索,快速获得安全、可靠且可控的优质 AI 体验。 * [联网搜索工具](/docs/web-search) 支持豆包搜索 Custom 版和联网内容插件两种工具,可获取实时公开网络信息(如新闻、商品、天气等),解决数据时效性、知识盲区、信息同步等核心问题,并且无需自行开发搜索引擎或维护数据资源。 * [Image Process(图像处理工具)](/docs/image-process) 支持通过 Responses API 调用对输入图片执行画点、画线、旋转、缩放、框选/裁剪关键区域等基础操作,适用于需模型通过视觉处理提升图片理解的场景(如图文内容分析、物体定位标注、多轮视觉推理等)。工具通过模型自动判断图像处理逻辑,支持与自定义函数混合使用,且可处理多轮视觉输入(上一轮输出图片作为下一轮输入)。 * [Knowledge Search(私域知识库搜索工具)](/docs/knowledge-search) 支持通过 Responses API 调用直接获取企业私域知识库中的信息(如内部文档、产品手册、行业资料等),适用于需基于企业专属数据解答问题的场景(如内部培训问答、产品功能咨询、行业方案查询等)。工具通过模型自动判断是否需要调用私域知识库,支持与自定义函数、MCP 等工具混合使用,目前仅支持旗舰版知识库。 * [Apply Patch(代码补丁工具)](/docs/apply-patch) 支持通过结构化补丁格式创建、更新或删除文件,适用于让模型直接生成文件修改方案的场景(如批量代码改写、机械化重构、测试文件生成等)。通过 Responses API 既可以将其作为内置工具直接启用,也可以按自定义工具方式接入,以兼容现有工具编排流程。 ### 自定义函数 您也可以在创建模型响应时,使用 `tools` 来定义自定义函数。模型通过调用自定义函数代码,来访问模型中无法直接使用的特定数据或功能。了解更多信息,请参见[Function Calling(函数调用)](/docs/function-calling)。 ### 云部署 MCP 或 Remote MCP Responses API 支持通过 Streamable HTTP 链接的 MCP 调用。适用于复杂任务(如多步数据查询 + 分析)场景,支持与自定义函数、Web Search 工具混合使用。详情请参见[云部署 MCP / Remote MCP](/docs/mcp-remote-mcp)。 --- # 结构化输出(beta) Source: https://ark.volcengine.com/region:cn-beijing/docs/responses-api-structured-output 当需要模型输出程序可处理的标准格式(主要是 JSON)而非自然语言时,可开启结构化输出能力,以支持标准化处理或展示。 通过配置 **text.format** 对象,指定模型输出 JSON 格式,还可以通过定义 JSON 结构,限定模型输出字段信息。 相较于通过提示词控制模型输出 JSON 格式,使用结构化输出能力具有以下优势: * 输出可靠:输出结构符合预期数据类型,包括字段层级、名称、类型、顺序等,避免必要字段缺失或枚举值幻觉。 * 使用简单:通过 API 字段定义输出格式,提示词更加简单,无需在提示词中反复强调或使用强约束措辞。 > **说明** > > 该能力尚在 beta 阶段,受资源与平台负载影响,服务可用性可能随访问情况产生波动,请谨慎在生产环境使用。 ## 支持模型 250615及之后版本的大语言模型,如无特殊说明,默认支持 Responses API,方舟平台大语言模型列表,请参见:[结构化输出能力(beta)](/docs/model-list#86588b72)。 ## API文档 [Responses API](/docs/create-model-responses-api) ## json_object 模式 这段代码展示了如何利用 Responses API 实现 JSON Object 结构化输出。 **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "thinking": { "type": "disabled" }, "text": { "format": { "type": "json_object" } }, "input": [ { "role": "system", "content": "你是一位专业的数学助教,收到用户提出的数学问题后,需以结构化 JSON 格式输出。返回的json中应包含explanation和answer字段" }, { "role": "user", "content": "根号三的近似值是多少" } ] }' ``` **选项:Python** ```Python import os from arkruntime import Ark api_key = os.getenv('ARK_API_KEY') client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) response = client.responses.create( model="doubao-seed-2-1-pro-260915", input=[ {"role": "system", "content": "你是一位专业的数学助教,收到用户提出的数学问题后,需以结构化 JSON 格式输出。" "返回的 JSON 应该包含以下字段:" "1. 'explanation':对题目的详细推理和解题步骤,内容应简明易懂。" "2. 'answer':最终的纯数值答案或结论。" "所有内容均用简体中文。请勿输出 JSON 以外的内容。" }, {"role": "user", "content": "根号三的近似值是多少。"} ], text={"format":{"type": "json_object"}} ) print(response) ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/responses" ) func main() { client := arkruntime.NewClientWithApiKey( // Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() resp, err := client.CreateResponses(ctx, &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", Input: responses.NewInputItemArrayResponsesInput([]responses.InputItem{ easyMessage(responses.MessageRoleSystem, "你是一位专业的数学助教。请以结构化 JSON 输出,并包含 explanation 和 answer 字段。"), easyMessage(responses.MessageRoleUser, "根号三的近似值是多少。"), }), Text: responses.NewOptResponseTextConfig(responses.ResponseTextConfig{Format: responses.TextFormat{Type: responses.TextFormatTypeJSONObject}}), }) if err != nil { fmt.Printf("stream error: %v", err) return } fmt.Println(resp) } func easyMessage(role responses.MessageRole, content string) responses.InputItem { return responses.InputItem{ OneOf: responses.NewItemEasyMessageInputItemSum( responses.ItemEasyMessage{ Role: responses.NewOptMessageRole(role), Content: responses.NewStringMessageContent(content), }, ), } } ``` **选项:Java** ```Java package com.ark.example; import com.volcengine.ark.runtime.models.responses.*; import com.volcengine.ark.runtime.service.ArkService; public class demo { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); // The base URL for model invocation ArkService arkService = ArkService.builder().apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); ResponsesRequest request = ResponsesRequest.builder() .model("doubao-seed-2-1-pro-260915") .input(ResponsesInput.ofList(java.util.Arrays.asList(ItemEasyMessage.builder().role(MessageRole.SYSTEM).content( MessageContent.ofString("你是一位专业的数学助教,收到用户提出的数学问题后,需以结构化 JSON 格式输出。返回的json中应包含explanation和answer字段") ).build(), ItemEasyMessage.builder().role(MessageRole.USER).content( MessageContent.ofString("根号三的近似值是多少") ).build()))) .text(ResponseTextConfig.builder().format(TextFormat.builder().type(TextFormatType.JSON_OBJECT).build()).build()) .build(); Response resp = arkService.createResponse(request); System.out.println(resp); arkService.shutdownExecutor(); } } ``` **选项:OpenAI SDK** ```Python import os from openai import OpenAI api_key = os.getenv('ARK_API_KEY') client = OpenAI( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) response = client.responses.create( model="doubao-seed-2-1-pro-260915", input=[ {"role": "system", "content": "你是一位专业的数学助教,收到用户提出的数学问题后,需以结构化 JSON 格式输出。" "返回的 JSON 应该包含以下字段:" "1. 'explanation':对题目的详细推理和解题步骤,内容应简明易懂。" "2. 'answer':最终的纯数值答案或结论。" "所有内容均用简体中文。请勿输出 JSON 以外的内容。" }, {"role": "user", "content": "根号三的近似值是多少。"} ], text={"format":{"type": "json_object"}} ) print(response) ``` 返回预览 ```JSON { "explanation": "根号三即√3,其近似值可通过逐步逼近法确定。首先,1²=1,2²=4,故√3在1和2之间。进一步计算,1.7²=2.89,1.8²=3.24,因此√3在1.7和1.8之间。继续精确,1.73²=2.9929,1.732²=2.999824(接近3),1.7321²≈3.00017(略大于3)。综上,√3的近似值通常取1.732。", "answer": "1.732" } ``` ## json_schema 模式 这段代码展示了如何利用 Responses API 实现遵循 schema 字段定义的 JSON 结构化输出。 **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "input": [ { "role": "user", "content": [ { "type": "input_text", "text": "return in json format how can I solve 8x + 7 = -23" } ] } ], "thinking": { "type": "disabled" }, "stream": false, "text": { "format": { "type": "json_schema", "name": "math_reasoning", "schema": { "type": "object", "properties": { "steps": { "type": "array", "items": { "type": "object", "properties": { "explanation": { "type": "string" }, "output": { "type": "string" } }, "required": [ "explanation", "output" ], "additionalProperties": false } }, "final_answer": { "type": "string" } }, "required": [ "steps", "final_answer" ], "additionalProperties": false } } } }' ``` **选项:OpenAI SDK** ```Python import os from openai import OpenAI from pydantic import BaseModel api_key = os.getenv('ARK_API_KEY') client = OpenAI( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) class Step(BaseModel): explanation: str # Step details output: str # Step computation results class MathResponse(BaseModel): steps: list[Step] # List of solution steps final_answer: str # Final answer response = client.responses.parse( model="doubao-seed-2-1-pro-260915", input=[ { "role": "user", "content": [ { "type": "input_text", "text": "return in json format how can I solve 8x + 7 = -23" } ] } ], text_format=MathResponse ) print(response.output_parsed) ``` 返回预览 ```JSON { "steps": [ { "explanation": "Subtract 7 from both sides to isolate the term with x", "output": "8x = -23 - 7" }, { "explanation": "Simplify the right side", "output": "8x = -30" }, { "explanation": "Divide both sides by 8 to solve for x", "output": "x = -30/8" }, { "explanation": "Simplify the fraction", "output": "x = -15/4" } ], "final_answer": "x = -15/4" } ``` ## 模式对比:`json_object` 与 `json_schema` `json_schema` 是 `json_object` 的演进版本,两种模式都支持 JSON 结构化输出,具体的异同如下。 |结构化输出 |`json_schema` |`json_object` | |---|---|---| |生成 JSON 回复 |是 |是 | |可定义 JSON 结构 |是 |否 | \ | | |仅保障回复是合法 JSON | |是否推荐 |是 |否 | |支持的模型 |见[结构化输出能力(beta)](/docs/model-list#86588b72) |见[结构化输出能力(beta)](/docs/model-list#86588b72) | |严格模式 |支持 |不涉及 | \ | |通过设置 **strict** 为 `true` 生效。 | | |配置方式 |```JSON |```JSON | \ | |"text": { |"text": { | \ | | "format": { | "format": { | \ | | "type": "json_schema", | "type": "json_object" | \ | | "name": "my_schema", | } | \ | | "strict": true, |} | \ | | "schema": { |``` | \ | | ... | | \ | | } | | \ | | } | | \ | |} | | \ | |``` | | ## 使用限制 * 使用[在线推理(TPM 保障包)](/docs/tpm-guarantee-package)时,不支持使用结构化输出能力。 * Responses API QPS 限流如下。如果需要提升限流值,请提交 [工单](https://console.volcengine.com/workorder/create?step=2&SubProductID=P00001166)。 |接口名称 |账号维度的 QPS 限流 | |---|---| |创建模型响应 |无 | |查询模型响应 |20 | |列出输入项 |20 | |删除模型响应 |20 | --- # 上下文编辑 Source: https://ark.volcengine.com/region:cn-beijing/docs/responses-api-context-editing 上下文编辑功能可以管理上下文中思维链内容及工具调用内容,具备以下优势: * 工具使用效果提升:能够让模型利用历史上下文中思考的内容,提高工具触发及使用效果。 * 上下文窗口管理:自动保持在模型上下文窗口限制内。 * 智能缓存:与缓存功能协同工作,优化性能。 > **说明** > > 该能力尚在 beta 阶段,请谨慎在生产环境使用。 # 支持模型 * doubao-seed-evolving * doubao-seed-2-1-pro-260915 * doubao-seed-2-1-lite-260915 * doubao-seed-2-1-pro-260628 * doubao-seed-2-1-turbo-260628 * doubao-seed-2-0-lite-260428 * doubao-seed-2-0-mini-260428 * doubao-seed-2-0-pro-260215 * doubao-seed-2-0-lite-260215 * doubao-seed-2-0-mini-260215 * doubao-seed-2-0-code-preview-260215 * doubao-seed-character-260628 # API 文档 [Responses API](/docs/create-model-responses-api) # 功能策略 |功能策略 |标识符 |描述 | | --- | --- | --- | |思维链内容清除 |`clear_thinking` |在开启思考时管理思维链内容。 | \ | | |该策略会自动清除先前轮次较旧的思维链内容。 | |工具调用内容清除 |`clear_tool_uses` |在对话上下文增长超过配置的阈值时清除工具调用内容。 | \ | | |该策略会自动清除先前轮次较旧的工具调用内容。 | # 思维链内容清除 ## 配置项 `clear_thinking` 策略支持以下配置: |配置项 |类型 |默认值 |说明 | | --- | --- | --- | --- | |keep |Object / String |`{type: "thinking_turns", value: 1}` |定义思维链保留策略。 | > 保留轮次同时覆盖工具调用和非工具调用场景,只基于轮数判断。 配置示例: * 保留最近 N 个轮次的思维链内容:(N 必须 > 0) ```JSON // 保留最近 3 个轮次的思维链内容 { "type": "clear_thinking", "keep": { "type": "thinking_turns", "value": 3 } } ``` * 保留所有思维链内容: ```Bash { "type": "clear_thinking", "keep": "all" } ``` ## 使用示例 **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "doubao-seed-2-0-lite-260215", "input": "推理模型与非推理模型区别。", "thinking":{"type": "enabled"}, "context_management": { "edits": [ { "type": "clear_thinking", "keep": { "type": "thinking_turns", "value": 3 } } ] } }' ``` # 工具调用内容清除 ## 配置项 `clear_tool_uses`策略支持以下配置: |配置项 |类型 |默认值 |说明 | | --- | --- | --- | --- | |trigger |Object | |触发工具调用内容清除策略的阈值。 | |keep |object |3 轮工具调用 |保留最近 N 轮工具调用内容。 | |exclude_tools |Array | |不会被清除的工具名称列表,用于保留重要上下文。 | |clear_tool_inputs |Bool |false |是否清除工具调用参数。 | 配置示例: ```JSON { "type": "clear_tool_uses", "trigger": { "type": "tool_uses", "value": 5 }, "keep": { "type": "tool_uses", "value": 3 }, "exclude_tools": [ "web_search" ] } ``` ## 使用示例 **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "doubao-seed-2-0-lite-260215", "input": [ { "role": "system", "content": "你是人工智能助手." }, { "role": "user", "content": "今天北京天气怎么样" } ], "thinking":{"type": "enabled"}, "tools": [ { "type": "function", "name": "get_weather", "description": "根据城市名称查询该城市当日天气(含温度、天气状况)", "parameters": { "type": "object", "properties": { "location": { "type": "string", "description": "城市名称,如北京、上海(仅支持国内地级市)" } }, "required": ["location"] } } ], "context_management": { "edits": [ { "type": "clear_tool_uses", "trigger": { "type": "tool_uses", "value": 5 } } ] } }' ``` # 组合策略 可以同时使用思维链内容清除和工具调用内容清除,使用多个策略时: * 定义顺序:`clear_thinking` 必须排在 `clear_tool_uses` 之前。 * 处理顺序:先处理思维链内容清除,再处理工具调用内容清除。 **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/responses \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "doubao-seed-2-0-lite-260215", "input": [ { "role": "system", "content": "你是人工智能助手." }, { "role": "user", "content": "今天北京天气怎么样" } ], "thinking":{"type": "enabled"}, "tools": [ { "type": "function", "name": "get_weather", "description": "根据城市名称查询该城市当日天气(含温度、天气状况)", "parameters": { "type": "object", "properties": { "location": { "type": "string", "description": "城市名称,如北京、上海(仅支持国内地级市)" } }, "required": ["location"] } } ], "context_management": { "edits": [ { "type": "clear_thinking", "keep": { "type": "thinking_turns", "value": 3 } }, { "type": "clear_tool_uses", "trigger": { "type": "tool_uses", "value": 5 } } ] } }' ``` --- # 推理方式概述 Source: https://ark.volcengine.com/region:cn-beijing/docs/deployment-overview 火山方舟按照业务场景、资源优先级支持多种模型推理方式,本文介绍各种推理方式的特点,方便用户进行选型。 > **说明** > > 如果您是新用户,或者希望快速验证模型效果,直接通过 Model ID 调用方舟模型即可(方舟会自动匹配对应模型的预置推理服务,无需额外部署),详情参见 [快速入门](/docs/quick-start)。 # 推理方式对比 |推理方式 |在线推理(常规) |在线推理(低延迟) |在线推理(低优) |在线推理(TPM保障包) |在线推理(模型单元) |批量推理 |智能模型路由 | |---|---|---|---|---|---|---|---| |简介 |部署在公共资源池,按模型调用量计费,使用受平台资源水位影响。 |部署在平台预留资源,为延迟敏感场景提供更优的输出 token 生成速率(TPOT)体验。 |使用低优资源,按 token 计费,以更优惠的价格提供尽力而为的推理服务。 |部署在平台预留资源,保障模型请求并发达到一定 TPM( Tokens Per Minute),溢出部分可叠加按 Token 计费 |独占算力资源,精调后模型在线推理的高保障方案 |请求无需实时响应,价格是常规在线推理的一半 |动态分析用户请求,根据路由策略智能选择调用的模型,适用于在线推理场景 | |关键规格 |* 通用推理方式 |* 较低输出延迟 |* 独立 TPM 配额 |* 极低输出延迟 |* 独占算力,性能更稳定可靠 |* 配额高,一次性离线处理大量数据 |* 简化选型:自动匹配最优模型 | \ | |* 后付费按 token 计费 |* 后付费按 token 计费 |* 后付费按 token 计费 |* 资源包购买,预付费方式,溢出部分按 Token 后付费 |* 灵活度高,支持复杂场景,特殊延迟/并发需求 |* 成本更低 |* 使用灵活:支持成本优先、效果优先等路由策略 | \ | |* 低接入成本 |* 低接入成本 |* 支持闲时段申请更高 TPM 配额 |* 保障以及超过默认限流额度的并发 | | | | \ | |* 可与其他在线推理方式组合使用 |* 可与在线推理(常规)组合使用 |* 可与其他在线推理方式组合使用 | | | | | \ | | |* 自动降级,缓冲突增流量 | | | | | | |支持模型 |* 平台基础模型 |平台基础模型 |平台基础模型 |平台基础模型 |* 平台基础模型 |* 平台基础模型 |平台基础模型 | \ | |* Lora精调后模型 | | | |* 全量/Lora精调模型 |* 全量/Lora精调模型 | | \ | |* MLP 推理服务(方舟不计费) | | | |* 上传的自定义模型 | | | |适用场景 |* 追求高性价比,对延迟和并发要求相对较低 |* 对交互延迟高度敏感 |* 时延不敏感、可重试、可等待的批量或后台任务 |* 追求更低延迟,更高并发 |* 全量精调后模型的大规模推理业务 |用户无需关注单次请求的执行情况,适合模型评测、批量回归等数据量较大的场景 |* 希望智能选择最合适的模型 | \ | |* 可接受偶发资源紧张报错或无法预估准确流量的业务 |* 请求流量有一定波动,希望按需付费 |* 非关键在线链路 |* 可预估流量大小的高流量业务 |* 生产级高SLA要求的场景,拥有极致的灵活性和成本效益 | |* 希望在保证一定效果的同时,通过部分请求路由到小模型来降低成本 | \ | | |* 在保障包溢出流量需获得低延迟。 | |* 无法接受偶发的资源紧张报错的业务 | | | | |计费方式 |计算Token使用量 |计算Token使用量 |计算 token 使用量 |按输入和输出分别购买TPM额度 |购买模型单元个数 |计算Token使用量 |计算Token使用量 | \ | |不调用不计费 |不调用不计费 |不调用不计费 | | |不调用不计费 | | \ | | | | |* 按天预付费 |* 按月预付费 | |1. 对实际路由的模型按Token调用量计费,不调用不计费 | \ | | | | |* 按购买时长后付费 |* 按购买时长后付费 | |2. router模型暂不收费 | |价格比较 |低 |中 |较低,输入和输出 token 单价约为常规的一半 |中 |高 |较低,输入和输出 token 单价约为常规的一半 |低 | # 选择建议 * 一般业务场景,选择 [在线推理(常规)](/docs/online-inference-standard)即可,不调用不计费。 * 对交互延迟敏感,推荐使用[在线推理(低延迟)](/docs/online-inference-low-latency)。 * 对时延不敏感,可接受等待或失败重试,希望降低批量及后台任务成本,推荐使用[在线推理(低优)](/docs/online-inference-flex)。 * 企业级用户,需要更强的资源确定性保障(如更高可用性承诺、固定吞吐保障),推荐使用[在线推理(TPM 保障包)](/docs/tpm-guarantee-package)。 * 企业级用户,希望独占算力资源,实现低成本高性能的大规模在线推理,推荐使用模型单元,请参见[模型单元概述](/docs/model-unit-overview)。 * 如需由平台托管并完成整批任务,且可接受较长完成时间,推荐使用 [批量推理 Batch Job](/docs/batch-inference#075b8a07),适合超大规模刷数以及需要任务状态、结果文件和失败恢复的场景。 * 没有明确使用的模型,希望按照成本/性能等选择最优模型,推荐使用[智能模型路由](/docs/intelligent-model-routing)。 * 已在 MLP(火山机器学习平台) 部署模型服务,希望通过火山方舟平台统一调用,请参见[使用 MLP 推理服务](/docs/use-mlp-inference-service)。 * 部署自定义模型,请参见 [使用自定义模型进行推理](/docs/run-inference-with-custom-models)。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/05c2d1cf83d540e186a9912c6ef7eda5~tplv-goo7wpa0wc-image.image) # 附:推理接入点介绍 推理接入点是用户调用模型进行推理的入口。按照类型分为: * **预置推理接入点**:当用户凭借 Model ID 调用火山方舟模型时,系统会自动匹配对应模型的预置推理服务;若不存在,则自动创建。适合新手使用、功能测试或轻量级使用场景。 * **自定义推理接入点**:由用户主动创建。所有在线推理方式,均通过自定义推理接入点来接入。功能更强大,适合各种业务场景。 |类别 |功能/特性 |预置接入点 |自定义推理接入点 | |---|---|---|---| |推理方式 |在线推理(常规) |✓ |✓ | |^^| | | | \ | |在线推理(低延迟) |✓ |✓ | |^^| | | | \ | |在线推理(低优) |✓ |✓ | |^^| | | | \ | |在线推理(TPM保障包) |✗ |✓ | |^^| | | | \ | |模型单元 |✗ |✓ | |^^| | | | \ | |智能模型路由 |✗ |✓ | |^^| | | | \ | |批量推理 |✗ |✗ | |在线推理 |API 调用 |通过 Model ID 或 Endpoint ID 调用 |通过 Endpoint ID 调用 | |^^| | | | \ | |支持模型 |火山方舟基础模型 |火山方舟基础模型和精调模型 | |^^| | | | \ | |模型版本平滑切换 |✗ |✓ | |^^| | | | \ | |配置接入点限流 |✓ |✓ | |^^| | | | \ | |开启/停用接入点 |✗ |✓ | |^^| | | | \ | |查看监控 |✓ |✓ | |^^| | | | \ | |安全审计(会话、传输加密) |✓ |✓ | |^^| | | | \ | |细粒度权限管理(项目、标签) |✓ |✓ | |应用实验室 |零代码应用 |✓ |✓ | |^^| | | | \ | |高代码应用 |✓ |✓ | |模型评测 |模型评测 |✗ |✓ | |数据投递 |数据投递 |✗ |✓ | --- # 在线推理(常规) Source: https://ark.volcengine.com/region:cn-beijing/docs/online-inference-standard 在线推理(常规)部署在公共资源池,按Token付费,成本灵活可控,是个人开发者或小型业务的首选。本文介绍常规在线推理的主要优势、支持模型、使用流程等内容。 # 主要特点 * 按模型推理时消耗的Token数量进行后付费,不调用不计费 * 延迟和并发一般,与账号下该模型所有接入点共享模型限流 * 部署在公共资源池,业务的延迟和并发性能受平台资源水位影响 # 适用场景 * 新手使用火山方舟平台 * 个人开发者或小型业务 * 追求高性价比,对延迟和并发要求相对较低 * 可接受偶发资源紧张报错或无法预估准确流量的业务 # 支持模型 | 接入点类型 | 调用方式 | 支持模型 | |-----------|---------|---------| | 预置推理接入点 | 直接通过 Model ID 调用,无需创建接入点 | 方舟平台所有基础模型 | | 自定义推理接入点 | 仅支持 Endpoint ID(EP)调用,需提前创建接入点 | 方舟平台所有基础模型、Lora精调后模型 | # 使用流程 ## 1 (可选)创建推理接入点 在目标项目下创建一个自定义推理接入点。使用预置推理接入点请跳至步骤2。 1. 访问 [创建推理接入点](https://ark.volcengine.com/region:cn-beijing/endpoint/create) ,按页面引导填写。注意选择接入模式为 **按Token付费**。 2. 勾选协议,并单击 **创建并接入**。创建完成后进入 **调度中** 状态,当状态变成 **健康** 后,可正常调用。 > **说明** > > 推理接入点默认会创建在 default 项目下,如果您希望在其他项目下创建,请在导航栏左下角切换项目。 ## 2 获取 Model - 使用自定义推理接入点,在 [在线推理](https://ark.volcengine.com/region:cn-beijing/endpoint) 查看并复制接入点 ID(Endpoint ID)。 - 使用预置推理接入点,在 [模型列表](/docs/model-list) 获取 Model ID。 ## 3 通过 Endpoint ID / Model ID 调用模型 典型示例代码如下,更多示例代码可参见 [文本生成](/docs/text-generation) 章节。 > 运行代码前请确保已将 API Key 配置为环境变量 `ARK_API_KEY`(详情参见 [环境变量配置指南](/docs/environment-variable-configuration-guide)),并已安装 SDK:`python -m pip install --upgrade arkruntime`。 ```Python # 安装 sdk 参见 https://ark.volcengine.com/region:cn-beijing/docs/install-and-upgrade-sdk import os from arkruntime import Ark client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=os.getenv('ARK_API_KEY'), ) response = client.responses.create( model="doubao-seed-2-1-pro-260915", #自定义推理接入点需配置为 Endpoint ID input="hello" ) print(response) ``` # --- # 在线推理(低延迟) Source: https://ark.volcengine.com/region:cn-beijing/docs/online-inference-low-latency **在线推理(低延迟)** 通过按需付费的方式,为延迟敏感场景提供更优的输出 token 生成速率(TPOT)体验。在请求中指定 `service_tier=fast`,即可降低延迟;当触发限流或突增流量保护时,请求将自动降级为 **在线推理(常规)**。 > **说明** > > * 需要更强的资源确定性保障(如更高可用性承诺、固定吞吐保障),推荐使用[在线推理(TPM 保障包)](/docs/tpm-guarantee-package)。 > * [模型对比](https://ark.volcengine.com/region:cn-beijing/model/comparison) 页面将展示近 24 小时延迟观测数据,用于帮助您评估实际降延迟效果。 ## **主要优势** * **低接入成本**:无需购买保障包即可使用,按 token 计费。 * **更低的输出延迟(TPOT)**:适用于外呼、智能硬件、实时交互等对输出生成速度敏感的场景。 * **自动降级**:当超出 fast 限流或命中 QoS 防护时,系统会将请求降级到在线推理(常规),保证请求尽可能可用。 ## **适用场景** * 对交互延迟高度敏感:语音外呼、客服助手、智能硬件、实时陪伴类应用。 * 请求流量有一定波动,希望按需付费,同时在高峰时保持较好延迟体验。 * 已有保障包,但仍希望在保障包外溢出流量上获得更好延迟体验。 ## **支持范围** ### **支持模型** * doubao-seed-2-1-lite-260915 * doubao-seed-2-1-turbo-260628 * doubao-seed-2-0-pro-260215 * doubao-seed-2-0-lite-260428 * doubao-seed-2-0-lite-260215 * doubao-seed-2-0-mini-260428 > **说明** > > 不支持精调模型与分支模型。实际可用模型以控制台与接口返回为准。 ### **支持 API** * [Chat API](/docs/chat-api) * [Responses API](/docs/create-model-responses-api):注意 tools 仅支持自定义工具(Function Calling);上下文缓存仅支持隐式缓存。 ## 使用流程 ### 准备工作 开通服务及获取 API Key * 开通模型及低延迟推理服务:在 [开通管理](https://ark.volcengine.com/region:cn-beijing/openManagement) 页面,选择目标模型,在 **操作** 列,开通模型服务;并打开对应模型的 **低延迟** 列开关。 > **说明** > > 开通模型的低延迟服务后,该模型对应的所有推理接入点级别的低延迟开关将默认打开。如果某个推理接入点不希望使用低延迟推理,可手动关闭低延迟开关。 * 在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页,创建/获取 API Key ,并将其配置为环境变量 `ARK_API_KEY`(详情参见 [环境变量配置指南](/docs/environment-variable-configuration-guide))。 可通过以下任一方式使用在线推理(低延迟)。 ### 方式一:在 API 请求中指定服务档位 预置推理接入点和自定义推理接入点均支持此方式,适合在同一推理接入点上按请求切换服务档位。 * 使用预置推理接入点,通过 Model ID 调用即可。 * 使用自定义推理接入点,请先 [创建推理接入点](https://ark.volcengine.com/region:cn-beijing/endpoint/create) ,获取 Endpoint ID。注意保持 **低延迟(Fast)推理** 开关处于开启状态,否则将无法使用低延迟推理。 #### Chat API 配置 **service_tier** 为 `fast`。 ```Python # 安装 sdk 参见 https://ark.volcengine.com/region:cn-beijing/docs/install-and-upgrade-sdk import os from arkruntime import Ark client = Ark( api_key=os.environ.get("ARK_API_KEY"), # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", ) completion = client.chat.completions.create( # 自定义推理接入点需配置为 Endpoint ID model="doubao-seed-2-1-turbo-260628", messages=[ {"role": "user", "content": "Hello"}, ], service_tier="fast", # 默认auto,需手动配置为 fast。 ) print(completion.choices[0].message) ``` #### Responses API 配置 **service_tier** 为 `fast`。 ```Python # 安装 sdk 参见 https://ark.volcengine.com/region:cn-beijing/docs/install-and-upgrade-sdk import os from arkruntime import Ark client = Ark( api_key=os.environ.get("ARK_API_KEY"), # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", ) response = client.responses.create( # 自定义推理接入点需配置为 Endpoint ID model="doubao-seed-2-1-turbo-260628", input="hello", service_tier="fast", # 默认 default,需手动配置为 fast。 ) print(response) ``` ### 方式二:在推理接入点配置默认服务档位 仅自定义推理接入点支持此方式,适合整条业务链路默认使用在线推理(低延迟)、但不希望修改调用代码的场景。 1. [创建推理接入点](https://ark.volcengine.com/region:cn-beijing/endpoint/create) ,获取 Endpoint ID。 1. 保持 **低延迟(Fast)推理** 开关处于开启状态。 2. 找到 **默认参数** 配置,将 `service_tier` 配置为 `fast`。 ![image-service-tier-fast-new.png](https://arkdocs.tos-cn-beijing.volces.com/images/resources/image-service-tier-fast-new.png) 2. 保存配置后,通过该推理接入点的 Endpoint ID 调用模型。未显式传入 `service_tier` 的请求默认使用在线推理(低延迟)。 > **注意** > > 请求中显式指定的 `service_tier` 优先级高于推理接入点的默认服务档位。 ## **计费说明** ### token 价格 参见 [模型价格](/docs/model-pricing#d3774bbd)。 ### **token 统计口径** * 限流单位为 TPM(Tokens Per Minute),**不拆分输入/输出**。 * 不同输入长度区间的单价差异以对应模型的按 token 定价为准。 * 缓存命中部分的扣减限流逻辑与 **在线推理(常规)** 一致。 ## **限流与降级** ### **限流隔离与共享** * **在线推理(低延迟) 与 在线推理(常规)不共享限流**,有独立的 TPM 配额,可在 [开通管理](https://ark.volcengine.com/region:cn-beijing/openManagement) 页面查询默认配额,如需调整请 [工单](https://console.volcengine.com/workorder/create?step=2&SubProductID=P00001166) 申请配额。 * **在线推理(低延迟)** 限流配额由推理接入点共享,即主账号下同模型的推理接入点共享 TPM 限流配额。可在推理接入点详情页为推理接入点单独配置低延迟限流 TPM 配额(默认不设限制,各接入点均可占满全部限流配额,超出限流将随机做降级处理)。 ### **动态限流** 为保障公平性,对超出模型默认低延迟 TPM 配额的账号,平台会实施动态限流,对长时间使用率过低的配额进行自动回收。详细规则如下: - 若该模型过去 14 天 **P95 低延迟 TPM** 小于已分配低延迟限流额度的 **1/3** 且该模型过去 14 天峰值低延迟 TPM 小于已分配低延迟限流额度的 **1/2**,平台将回收低延迟限流额度到已分配额度的 **1/3**,最低回收到默认低延迟限流额度。 - 若该模型过去 14 天未使用低延迟推理,平台将回收低延迟限流额度到默认低延迟限流额度。 ### **自动降级行为** * 限流限制: * 计算限流时会按照设定预估输出长度,并进行预扣。当请求超过限流,请求将自动降级为 **在线推理(常规)**。 * 计算周期:10~15秒/周期。如15秒周期下,业务流量(15秒)超过 TPM/4 部分会降级为 **在线推理(常规)** 模式。请结合峰值 TPM 来评估 **在线推理(低延迟)** 限流配额,而非仅看分钟平均流量。 * 斜率限制:平台负载高时,为保证全局用户体验,每分钟超过20%(阈值可能随资源负载与请求长度调整)增长速度的流量将会被降级到 **在线推理(常规)** 模式。 * 降级处理:降级后会再次按 **在线推理(常规)** 的限流规则扣减(即: 超限的低延时请求不一定能请求成功,仍可能受默认限流影响)。 * 攻击/长请求防护:当检测到异常高并发或超长请求等风险时,平台会将请求降级到 **在线推理(常规)** 模式,以保护服务稳定。 > **注意** > > * 长输出请求不建议使用 **在线推理(低延迟)**。 > * 如碰到突增流量限流导致失败,可参考[突发流量处理最佳实践](/docs/traffic-burst-handling-best-practices)处理。 ## **监控与告警** 控制台展示推理接入点调用数据,入口:[在线推理](https://ark.volcengine.com/region:cn-beijing/endpoint) > 接入点详情页(点击接入点列表接入点名称进入)> 监控页签。 建议重点关注以下指标(以控制台与监控面板实际展示为准)。 * fast 模式 TPM、错误率 * 延迟(TPOT)曲线 * 降级量(fast -> default)与降级比例 ## **使用限制** 在线推理(低延迟)不支持: * 协作奖励计划 * 配置模型和接入点用量上限 * 安心体验:无法同时开启,即开启 **在线推理(低延迟)** 后,无法开启安心体验模式,反之亦然。 * 批量推理:在批量推理请求体中配置 **service_tier** 不生效。 ## **错误码** 请参见[错误码](/docs/error-codes)。 --- # 在线推理(低优) Source: https://ark.volcengine.com/region:cn-beijing/docs/online-inference-flex **在线推理(低优)** 通过独立的低优 TPM 配额与更优惠的价格,为时延不敏感的场景提供尽力而为的推理服务。在请求中指定 `service_tier=flex`,即可使用低优资源进行推理。 > **说明** > > * 在线推理(低优)不承诺 TTFT / TPOT / 成功率,适合可重试、可等待的批量或后台任务。若需资源确定性保障,推荐使用[在线推理(TPM 保障包)](/docs/tpm-guarantee-package);若对交互延迟敏感,推荐使用[在线推理(低延迟)](/docs/online-inference-low-latency);若追求性能与成本的平衡,推荐使用常规的[在线推理(常规)](/docs/online-inference-standard)。 ## 主要优势 * **更低价格**:在线推理(低优)的 Input / Output Token 单价约为在线推理(常规)的 **50%**。Cached Input Token 单价与在线推理(常规)保持一致。 * **独立配额 + 闲时段增益**:在线推理(低优)拥有账号 × 模型维度独立的 TPM 配额,且支持在闲时段申请更高的额度。 * **零改造迁移**:与常规(`default`)档位使用同一套 Chat / Responses / Messages API 与同一批推理接入点,仅需在请求中新增 `service_tier=flex`,无需另建接入点或维护独立调用链。 * **与批量推理互补**:适合无法改造为任务式 Batch Job(例如:客户端数据流无法上传 TOS)的批量刷数场景,可通过同步 API 承接。 ## 适用场景 * **后台 Agent、非关键在线链路**:延迟不敏感,可接受分钟级排队与高峰期超时失败,愿意用等待换价格。 * **大批量刷数与评测**:模型评测、数据增强、离线打标、数据回流等可批量重试的任务。 * **闲时消费**:可申请闲时段更高限流额度,运行成本敏感型批量任务。 > **说明** > > Doubao Seed 2.1 之后发布的新模型不再支持 [Batch Chat](/docs/batch-inference#b102a8b2)(`ep-bi-*`)。原本通过 Batch Chat 逐条调用的批量流量,推荐迁移到在线推理接入点并在请求中指定 `service_tier=flex`。 ## 支持范围 ### 支持模型 支持以下模型版本,实际可用范围以控制台及接口返回为准。 - deepseek-v4-1-flash-261017 - deepseek-v4-pro-ga-260813 - deepseek-v4-flash-ga-260731 - doubao-seed-2-1-pro-260628 - doubao-seed-2-1-turbo-260628 - doubao-seed-2-0-lite-260428 > **说明** > > 不支持精调模型与分支模型。 ### 支持 API * [Chat API](/docs/chat-api) * [Responses API](/docs/create-model-responses-api) * [Messages API](/docs/messages-api) ### 支持推理接入点 * 在线推理**预置推理接入点** * 在线推理**自定义推理接入点** > **说明** > > 不支持批量推理接入点(`ep-bi-*`)。在批量推理请求体中配置 `service_tier=flex` 不生效。 ## 使用流程 ### 准备工作 开通服务及获取 API Key * 开通模型:在 [开通管理](https://ark.volcengine.com/region:cn-beijing/openManagement) 页面,选择目标模型,在 **操作** 列,开通模型服务。 * 在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页,创建/获取 API Key,并将其配置为环境变量 `ARK_API_KEY`(详情参见 [环境变量配置指南](/docs/environment-variable-configuration-guide))。 可通过以下任一方式使用在线推理(低优)。 ### 方式一:在 API 请求中指定服务档位 预置推理接入点和自定义推理接入点均支持此方式,适合在同一推理接入点上按请求切换服务档位。 * 使用预置推理接入点,通过 Model ID 调用即可。 * 使用自定义推理接入点,请先 [创建推理接入点](https://ark.volcengine.com/region:cn-beijing/endpoint/create) ,并获取 Endpoint ID。 **选项:Chat API** 配置 **service_tier** 为 `flex`。 ```Python import os from arkruntime import Ark client = Ark( api_key=os.environ.get("ARK_API_KEY"), # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", ) completion = client.chat.completions.create( # 自定义推理接入点需配置为 Endpoint ID model="doubao-seed-2-1-pro-260628", messages=[ {"role": "user", "content": "Hello"}, ], service_tier="flex", # 默认 auto,需手动配置为 flex。 ) print(completion.choices[0].message) ``` **选项:Responses API** 配置 **service_tier** 为 `flex`。 ```Python import os from arkruntime import Ark client = Ark( api_key=os.environ.get("ARK_API_KEY"), # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", ) response = client.responses.create( # 自定义推理接入点需配置为 Endpoint ID model="doubao-seed-2-1-pro-260628", input="hello", service_tier="flex", # 默认 auto,需手动配置为 flex。 ) print(response) ``` **选项:Messages API** 配置 **service_tier** 为 `flex`。 ```Python import os import requests response = requests.post( "https://ark.cn-beijing.volces.com/api/compatible/v1/messages", headers={ "Authorization": f"Bearer {os.environ['ARK_API_KEY']}", "Content-Type": "application/json", }, json={ # 自定义推理接入点需配置为 Endpoint ID "model": "doubao-seed-2-1-pro-260628", "max_tokens": 1024, "messages": [ {"role": "user", "content": "Hello"}, ], "service_tier": "flex", # 默认 default,需手动配置为 flex。 }, timeout=1800, ) response.raise_for_status() print(response.json()) ``` ### 方式二:在推理接入点配置默认服务档位 仅自定义推理接入点支持此方式,适合整条业务链路默认使用在线推理(低优)、但不希望修改调用代码的场景。 1. [创建推理接入点](https://ark.volcengine.com/region:cn-beijing/endpoint/create) ,找到 **默认参数** 配置,将 `service_tier` 配置为 `flex`。 ![image-service-tier-flex.png](https://arkdocs.tos-cn-beijing.volces.com/images/resources/image-service-tier-flex.png) 2. 保存配置后,通过该推理接入点的 Endpoint ID 调用模型。未显式传入 `service_tier` 的请求默认使用在线推理(低优)。 > **注意** > > 请求中显式指定的 `service_tier` 优先级高于推理接入点的默认服务档位。 ## 计费说明 ### token 价格 在线推理(低优)的 Input / Output Token 单价约为 `default` 档位的 50%,具体价格以对应模型的定价为准,参见 [模型价格](/docs/model-pricing#flex)。 ### token 统计口径 * 限流单位为 TPM(Tokens Per Minute),**不拆分输入/输出**。 * 不同输入长度区间的单价差异以对应模型的按 token 定价为准。 * 响应回显实际处理档位(`response_service_tier`),实际计费以响应回显档位为准。 ## 限流说明 ### 限流粒度 * 在线推理(低优)与在线推理(常规)、在线推理(低延迟)的 TPM 限流**相互独立**,使用在线推理(低优)不会消耗常规或低延迟的 TPM 配额。 * 在线推理(低优)的限流配额由推理接入点共享,即主账号下同模型的推理接入点共享在线推理(低优)的 TPM 限流配额。可在推理接入点详情页为推理接入点单独配置在线推理(低优)的 TPM 限流(默认不设限制,各接入点均可占满全部限流配额)。 ### 限流值 可在 [开通管理](https://ark.volcengine.com/region:cn-beijing/openManagement) 页面 > **语言模型** > **模型级别限流** 查询该模型的在线推理(低优)默认配额和闲时配额。 - **默认配额**:在线推理(低优)拥有独立的账号 × 模型维度 TPM 基础配额(7×24 小时生效),可在 [开通管理](https://ark.volcengine.com/region:cn-beijing/openManagement) 页面 > 语言模型 > 模型级别限流 处查询默认配额。 - **申请闲时配额**:如有需求,支持提交 [工单](https://console.volcengine.com/workorder/create?step=2&SubProductID=P00001166) 申请闲时(例如 24:00-08:00)更高的 TPM 配额。 ### 排队与超限 - 未超过 TPM 配额的请求由平台根据空闲算力进行调度。服务端最长等待时间为 20 分钟,超时后返回错误且不计费。 - flex 的 TPM 配额是**准入上限**而非保障容量,超出配额上限的请求会被限流,并返回 HTTP 429 状态码。 ## 服务保障与运行表现 * 在线推理(低优)为尽力而为型服务,不承诺 TTFT、TPOT、成功率或完成时间等 SLA 指标。 * 平台根据空闲算力调度请求,服务延迟和可用性会随资源负载波动。高峰时段排队时间可能增加,闲时的可用性通常有所提升。 * 当 `default` 档位流量占用资源时,在线推理(低优)请求的准入优先级会降低;极端情况下,执行中的请求可能中断。客户端应根据错误码实施重试。 * 当请求超出配额、服务过载或模型不支持 `flex` 时,平台均不会将请求自动切换至 `default` 档位。如需切换,应由客户端显式调整 `service_tier` 后重试。 ## 最佳实践 ### 使用流式输出 推荐使用流式输出,以便逐步接收生成结果,并及时感知连接状态。 ### 合理配置超时 平台服务端最长等待时间为 20 分钟。`X-Ark-Max-Wait-Timeout-Ms` 用于设置请求在服务端等待资源的最长时间,单位为毫秒(ms)。客户端和中间网关的总超时时间应覆盖服务端等待、模型生成和网络传输所需时间。 | 配置 | 作用 | 建议 | |---|---|---| | `X-Ark-Max-Wait-Timeout-Ms` | 请求在服务端等待资源的最长时间,单位为毫秒(ms) | 根据业务时限设置,不得超过 20 分钟 | | SDK / HTTP Client Timeout | 单次调用从发出请求到接收完成的总超时时间 | 应大于服务端等待时间、预计最长生成时间与网络余量之和,建议默认设置为 30 分钟 | 例如,业务最多允许等待 10 分钟,预计最长生成时间为 3 分钟,则可将 `X-Ark-Max-Wait-Timeout-Ms` 设置为 `600000`,并将客户端和中间网关的总超时时间设置为至少 14~15 分钟。若业务最多允许等待 2 分钟,应将该请求头设置为 `120000`,无需沿用平台上限。 ### 按错误类型重试 * `ServerOverloaded` 等临时容量错误:采用指数退避并加入随机抖动,同时限制最大重试次数和总重试时长。 * `TooManyRequests.ModelAccountFlexTpmRateLimitExceeded` 或 `TooManyRequests.RateLimitExceeded.EndpointFlexTPMExceeded`:不要立即重试,应降低并发、等待配额窗口恢复或申请提升配额。 * `InvalidParameter.UnsupportedParameter`:属于参数或模型能力问题,不应重试。请检查请求参数,并确认当前模型版本是否支持在线推理(低优)。 ### 配置客户端兜底策略 对于必须完成的少量请求,可由客户端根据成本和时效要求,去掉 `service_tier` 或将其设置为 `auto` 后重新提交。平台不会自动将 flex 请求切换至 `default` 档位。 ## 监控与告警 控制台展示推理接入点调用数据,入口:[在线推理](https://ark.volcengine.com/region:cn-beijing/endpoint) > 接入点详情页(点击接入点名称进入)> 监控页签。 用户看板支持按 `scale`、`fast`、`default` 和 `flex` 四个档位拆分展示。建议重点关注以下指标(以控制台与监控面板实际展示为准): * 在线推理(低优)的 TPM、RPM 用量、错误率 * 在线推理(低优)的 TTFT、TPOT、端到端延迟分位 ## 使用限制 在线推理(低优)不支持: * 精调模型与分支模型 * 显示缓存 * 批量推理接入点(`ep-bi-*`) * 协作奖励计划采集 * Agent / Coding Plan ## 错误码 请参见[错误码](/docs/error-codes)。 ## 常见问题 ### 在线推理(低优)和 Batch Job 应该如何选择? * **在线推理(低优)**:使用同步在线 API,适合请求动态产生、逐条提交,且不便改造成文件任务的低优场景。客户端仍需负责连接、并发和重试。 * **Batch Job**:使用异步托管任务,适合超大规模刷数、可接受较长完成时间,或需要任务状态、结果文件和失败恢复的场景。 如需保持现有在线调用方式,建议选择在线推理(低优);如需由平台托管并完成整批任务,建议选择 Batch Job。 ### 在线推理(低优)的 TPM 是否代表一定能达到对应吞吐? 不是。在线推理(低优)的 TPM 是账号允许提交请求的速率上限,不代表平台预留了等量资源。实际吞吐取决于当前低优资源容量、请求长度和客户端并发。 ### 超出 TPM 配额或容量不足时,是否会自动切换到 `default` 档位? 不会。平台不会自动切换服务档位,以免请求在用户不知情的情况下按更高价格计费。如业务必须完成,请根据成本和时效要求在客户端显式重试。 ### 同一个推理接入点能否同时使用在线推理(常规)、在线推理(低延迟)和在线推理(低优)? 可以。请求中显式传入的 `service_tier` 优先于推理接入点的默认服务档位;未传入时,使用推理接入点配置的默认值。对于不依赖服务端状态的多轮调用,每次请求均可独立选择服务档位;使用 Responses API 的 `previous_response_id` 串联上下文时,请遵循 Responses API 的上下文管理要求。 ### 在线推理(低优)是否仅能在闲时使用?闲时 TPM 如何生效? 不是。在线推理(低优)全天均可使用,当前生效的 TPM 配额及时段以控制台展示为准。 --- # 在线推理(TPM 保障包) Source: https://ark.volcengine.com/region:cn-beijing/docs/tpm-guarantee-package **在线推理(TPM保障包)** 使用平台预留资源,保障模型请求吞吐量达到指定TPM(Tokens Per Minute,每分钟处理的Token总量),目前拥有最高优先级。同时,溢出部分使用 **在线推理(常规)** 处理 token,并溢出 token 按降级后的推理模式计费。本文介绍**在线推理(TPM 保障包)** 的主要优势、支持的模型和使用流程。 # 主要优势 * **更低的延迟**:相比 **在线推理(常规)**,**在线推理(TPM 保障包)** 的延迟更低,通常低 1/3 - 1/2。 * **更高的吞吐量**:通过预留资源保障指定TPM吞吐量,同时支持超过默认限流额度的并发请求数。 * **更强稳定性**:提供高资源确定性保障,在保障范畴内不会命中异常流量熔断、限速策略,持续保障业务服务可用性。 * **弹性伸缩**:后付费TPM保障包,支持定时调整TPM保障包数量,贴合业务波峰波谷,提升资源利用率并降低成本。 * **灵活组合**: * **组合使用后付费与预付费保障包**:在业务高峰时段,您可以将按小时(后付费)与按天(预付费)的保障包叠加使用,以更好地匹配流量峰谷,从而避免资源浪费。 * **组合使用保障包与常规在线推理**:系统会优先消耗您的保障包额度。当请求超出额度后,将自动降级为常规在线推理模式。这种方式既能为可预估的流量提供性能保障,也能为临时流量高峰提供缓冲。**请注意,超出部分的流量会计算在默认限流额度中**。 # 适用场景 * 追求更低延迟,更高并发的高需业务。 * 可预估流量大小的高流量业务。 * 无法接受偶发的资源紧张报错的业务。 > **注意** > > * TPM 保障包保障输出 Token 生成速率(TPOT,Time Per Output Token),不同模型能达到的延迟水平存在差异。 > * TPM 保障包不保障首 Token 延迟(TTFT,Time To First Token),但通常 TTFT 优于公共资源池。 # 支持范围 ## 支持模型 参考 [TPM 保障包](/docs/model-pricing#952683a2),实际支持的模型以控制台显示为准。 如需支持更多模型或版本,可提交 [工单](https://console.volcengine.com/workorder/create?step=2&SubProductID=P00001166) 申请。 ## 支持接口 [Chat API](/docs/chat-api):当前只支持 Chat API。 # 使用流程 > 如业务对于延迟有需求,可提交 [工单](https://console.volcengine.com/workorder/create?step=2&SubProductID=P00001166) 申请。 ## 1 创建推理接入点 TPM 保障包需与推理接入点(Endpoint,调用推理服务的网络入口,简称 接入点)绑定后使用,即在创建或编辑接入点时,购买或调整TPM保障包。 1. 访问 [创建推理接入点](https://ark.volcengine.com/region:cn-beijing/endpoint/create) ,按页面引导填写。注意选择接入模式为 **TPM保障包**。 * 强烈推荐打开右上角 **创建说明** 开关,帮助您了解每个配置项的使用场景和含义。 2. 根据业务需求使用 TPM计算器 **(** 选择接入模式为 **TPM保障包** 后,在右侧 **创建说明** 中可见)预估需购买的输入和输出额度,并 [申请配额](https://ark.volcengine.com/region:cn-beijing/projectManagement)。 详细抵扣说明见 [额度抵扣说明](/docs/tpm-guarantee-package#93d074ff)。 3. 创建完成后进入 **调度中** 状态,当状态变成 **健康** 后,可正常调用。 > **说明** > > 推理接入点默认会创建在 default 项目下,如果您希望在其他项目下创建,请在导航栏左下角切换项目。 ## 2 获取 Endpoint ID 在 [在线推理](https://ark.volcengine.com/region:cn-beijing/endpoint) 查看并复制推理接入点 ID(Endpoint ID)。 ## 3 通过 Endpoint ID 调用模型 典型示例代码如下,更多示例代码可参见 [文本生成](/docs/text-generation) 章节。 ```Python # 安装 sdk 参见 https://ark.volcengine.com/region:cn-beijing/docs/install-and-upgrade-sdk # 文本生成支持 Chat API,暂不支持 Responses API import os from arkruntime import Ark client = Ark( api_key=os.environ.get("ARK_API_KEY"), # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", ) completion = client.chat.completions.create( # Replace with your Endpoint ID model="ep-2025****-**", messages=[ {"role": "user", "content": "Hello"} ], # service_tier="auto", # 默认为 auto,可不配置。 ) print(completion.choices[0].message) ``` # 额度抵扣说明 > **注意** > > **TPM 额度按分钟计量(Tokens Per Minute),并非瞬时额度:** > > * **瞬时上限与溢出**:单位时间内可用的最大瞬时额度约为分钟额度的 **25%** 左右;超出部分会自动降级为 **在线推理(常规)**。 > * **使用建议**:建议将请求流量在分钟内均匀分发,避免瞬时突发。 |说明 |图示:TPM计算器 | | |---|---|---| |**抵扣逻辑** |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/f17678049c4549ae9cfc1ff7f4e21377~tplv-goo7wpa0wc-image.image) | | \ | | | | \ |* **不同模型**,请求的**不同输入输出长度**,抵扣 TPM 额度的速度不同,需按抵扣系数计算购买的TPM。 | | | \ |* 抵扣额度计算公式 | | | \ | * 抵扣输出额度 = 输出 token * 抵扣系数 | | | \ | * 抵扣输入额度 = 输入 token * 抵扣系数 | | | \ | | | | \ |**TPM 计算器** | | | \ | | | | \ |* 可通过 TPM 计算器 查看相应的抵扣系数,并估算实际需要购买的**可抵扣 TPM**。 | | | \ |* 入口:[创建接入点](https://ark.volcengine.com/region:cn-beijing/endpoint/create),完成模型选择,并选中 TPM 保障包,在右侧创建说明窗格中展示。 | | | \ | | | | \ |**抵扣示例** | | | \ | | | | \ |* 购买的某模型的 TPM 信息: | | | \ | * 额度:输入 1000k TPM,输出 200k TPM。 | | | \ | * 抵扣系数:输入 10k token 时抵扣系数为 1,输出 1k token 时抵扣系数为 4。 | | | \ |* 当输出 TPM 达到 50k token 时,`50k * 4 抵扣系数 = 200k token`,TPM 输出额度达上限。 | | | # 弹性伸缩 ## 规则介绍 后付费TPM保障包,支持配置弹性伸缩规则,帮助您根据业务负载动态调整TPM保障包数量,进一步提升资源利用率并降低成本。 支持以下两种弹性规则,多个弹性规则可叠加,灵活覆盖全业务周期。详细配置要求和注意事项请参见控制台 **创建说明**。 * **定时弹性**:您可以设置在某一时间节点(可精确到分钟)后将TPM保障包的输入TPM(每分钟可处理的输入Token总量)和输出TPM(每分钟可生成的输出Token总量)调整到您所需的新的值。 * **周期性弹性**:您可以「按天重复」、「按周重复」或「Cron表达式」来设置时间规则,TPM保障包的输入TPM和输出TPM将会在您所设置的时间节点后调整到您所需的新的值。 ## 配置示例 * 业务需求:下午6点到晚上9点期间,某 接入点 需要大约 10000 TPM 的保障包。 * 规则设置:可通过设置两条周期性弹性规则,如下表。 |规则说明 |示例截图 | |---|---| |每日 18:00 触发: |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/9e84ab008e32424db4991d2d6219d25d~tplv-goo7wpa0wc-image.image) | \ | | | \ |* 输入 TPM:10k TPM | | \ |* 输出 TPM:1 k TPM | | |每日 21:00 触发: |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/17ea48505a134fa2b566ac05abb5602b~tplv-goo7wpa0wc-image.image) | \ | | | \ |* 输入 TPM:0k TPM | | \ |* 输出 TPM:0k TPM | | # 订阅通知 您可以使用火山引擎消息通知服务(后简称 SNS) 来感知TPM保障包信息通知。 ## 订阅流程 1. 申请 “SNS开白” ,使用请提交 [工单](https://console.volcengine.com/workorder/create?step=2&SubProductID=P00001166) 申请,并同步申请对应的消息事件: * ModelTPMNewFailed:TPM保障包新购失败告警 * ModelTPMScaleUpFailed:TPM保障包扩容失败告警 2. 在 **主题** 页面创建主题。 * 发布者选项指定账号:`2100444922` * 服务选择:`ark` ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/437917a96bb84c02b1a5fafe5a3f2bd1~tplv-goo7wpa0wc-image.image) 3. 在 **云服务事件订阅** 页面创建事件订阅。Topic TRN选择刚刚创建的主题,事件选择`ModelTPMNewFailed`、`ModelTPMScaleUpFailed`。 4. 在**订阅**页面,订阅前面创建的主题,并配置可接收端地址 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/76693dd573b34176b8ca85cce0c23e30~tplv-goo7wpa0wc-image.image) * 配置完订阅后,SNS 会向接收端发送对应的确认链接,需确认该链接来完成订阅,确认链接demo如下。需要回调下文中SubscribeURL ```JSON { "Type": "SubscriptionConfirmation", "MessageId": "f11b9a8f-****", "TopicTrn": "trn:sns:cn-beijing:2100000825:topic/test", "Message": "You have chosen to subscribe to the topic trn:sns:cn-beijing:2100000825:topic/wyy_test. To confirm the subscription, visit the SubscribeURL included in this message.", "Timestamp": "2025-01-14T07:18:59Z", "SignatureVersion": "1", "Signature": "MEUCIB3NsKw***=", "SigningCertURL": "https://sns-public-cn-beijing.tos-cn-beijing.volces.com/certificates/cn-beijing-a31d91fc-0683-****.pem", "SubscribeToken": "eyJhbGciOiJIUzI1Ni****", "SubscribeURL": "https://sns.cn-beijing.volcengineapi.com?Action=ConfirmSubscription&Version=2023-01-01&Token=eyJhbGc***" } ``` * 回调成功后可在 **订阅** 页面看到对应的订阅状态为:已确认,表示订阅已完成。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/301d7375496f4ac6863e38b360cdb1e0~tplv-goo7wpa0wc-image.image) ## 订阅信息内容格式 TPM保障包订阅失败时通知的内容。 **ModelTPMNewFailed** TPM保障包新购失败告警 ```JSON { "EventID": "tpmro-202502111****-****", "EventName": "ModelTPMNewFailed", "EventTime": "2025-02-11T19:41:36+08:00", "AccountID": 2100000825, "ModelTPMInfo": { "EndpointID": "ep-2025021******-cn***", "FoundationModelName": "doubao-lite-4k" } } ``` **ModelTPMScaleUpFailed** TPM保障包扩容失败告警 ```JSON { "EventID": "tpmro-202502111****-****", "EventName": "ModelTPMScaleUpFailed", "EventTime": "2025-02-11T19:41:36+08:00", "AccountID": 2100000825, "ModelTPMInfo": { "EndpointID": "ep-20250******-cn***", "FoundationModelName": "doubao-lite-4k" } } ``` # 调整数量/续费/退订/修改弹性规则 1. 访问 [在线推理](https://ark.volcengine.com/region:cn-beijing/endpoint),切换到**自定义推理接入点**页签。 2. 单击目标 接入点 名称,进入 接入点 概览页。 3. 在算力保障区域,根据需要对TPM保障包进行调整数量、续费、退订。 4. 在算力保障区域,单击 **弹性详情**,可查看当前的弹性规则。单击 **调整弹性**,可对弹性规则进行修改。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/d15b16374d7b47f6b4ed316e798688c2~tplv-goo7wpa0wc-image.image) > **注意** > > 未到期的TPM保障包退订会产生惩罚系数,无法 100%退费。 # 使用限制 * 支持通过 [Chat API](/docs/chat-api) 调用模型。 * 不支持[结构化输出(beta)](/docs/structured-output-beta)( **response_format.type** 无法设置为 `json_object`、`json_schema` )。 * 不支持视频输入。 * 不支持 [Create context caching API](/docs/create-context-cache-api) 、 [Responses API](/docs/create-model-responses-api) 。 * 当接入点请求超过保障包额度时,自动切换为普通在线推理模式,以 **按Token付费** 模式收费。 * 模型请求的输入范围符合下方条件。如不符合,无法使用 TPM 保障包,请求返回的 **service_tier** 字段为`default`,即普通在线推理模式,不扣减保障包额度。 * Doubao 模型,输入长度 (0, 128k]。 * DeepSeek 模型,输入长度(0, 64k]。 # 购买说明 详细的购买、变配、计费规则请参见[TPM 保障包计费说明](/docs/tpm-guarantee-package-pricing)。 # 常见问题 参见[TPM保障包](/docs/modelark-faq#5e8ec656)。 --- # 模型单元概述 Source: https://ark.volcengine.com/region:cn-beijing/docs/model-unit-overview 模型单元是方舟提供的高级推理方式,独占算力资源,特别适用于精调后模型的大规模推理。本文介绍模型单元的主要优势、适用场景、支持模型等内容。 # 主要优势 * **专属独占算力**:更低延迟,更高并发,性能更稳定可靠 * **全托管免运维**:无需关注底层资源,平台将自动完成资源的管理和维护 * **按需部署和预留容量**:可叠加按购买时长后付费和包月预付费,既可满足业务实时按需的资源使用需求,又可为固定业务预留确定的算力资源 * **规模化业务更具成本效益**:高利用率下成本低于按Token付费 * **更丰富的模型选择**:支持平台基础模型,精调后模型,以及上传您自己的模型(适用于支持的架构) * **没有硬性速率限制**:平台不设置 RPM/TPM 上限,流量仅受模型单元实际承载力限制 * **弹性伸缩**:后付费模型单元支持弹性伸缩策略,可根据业务负载动态调整资源 * **预置部署模板**:预置小、中、大三种规格的基础部署模板及更多个性化模板,组合方舟不同机型和算力, 用户只需根据实际需求选择对应的模板和模型单元个数即可完成部署。 * **本地透明化缓存**:命中缓存后增加单个模型单元的承载力,降低总购买资源数 # 适用场景 * 全量/LoRA精调后模型的大规模推理业务 * 部署您上传的开源模型 * 部署基于 Doubao 模型全量/LoRA精调后的模型 * 生产级高SLA要求的场景,希望获得更高并发、更低延迟和更高的成本效益 注意:对流量较小的场景,由于需要占满起步资源量,优势不明显 # 支持模型 > 实际支持模型情况,以控制台显示为准 > 如需支持更多模型版本,可提交 [工单](https://console.volcengine.com/workorder/create?step=2&SubProductID=P00001166) 申请 * 大部分 Doubao 模型:使用流程请参见 [创建模型单元](/docs/create-model-units) * 自定义模型:基于 Doubao 模型全量/LoRA精调后的模型或外部上传的开源模型,使用流程请参见 [使用自定义模型进行推理](/docs/run-inference-with-custom-models) # 计费说明 模型单元按照您选择的机型和使用时长进行收费,支持按购买时长后付费和包月预付费,两种方式可叠加购买,单价请参见 [模型价格](/docs/model-pricing#c26435c9)。 ## 计费方式对比 |计费类型 |后付费 |预付费 | |---|---|---| |计费特点 |按实际使用时长计费,精确到秒 |按月预留资源,享受更优惠价格 | |弹性配置 |支持 |\- | |适合场景 |适合短期或弹性需求 |中长期稳定需求 | ## **后付费(按购买时长)** * **计费特点**:按照实际购买时长收费,计费粒度精确到秒。购买后持续计费,如需停止计费可在接入点详情页进行退订。 举例:假设您在16:00下单成功,在18:20:31退订成功。则计费时长为 2 小时 20 分钟 31 秒,计费单价会换算成每秒钟单价进行计算。 * **计费粒度**:秒。不足一秒按一秒计算。 * **出账周期**:按小时结算,账单出账时间通常在当前计费周期结束后1-2小时左右,具体以系统实际出账时间为准。例如:16:00-17:00 的账单约在 18:00-19:00 出账。 * **欠费说明**:为保证您的业务连续稳定,账户欠费后资源不会立即回收,保留大约2小时(具体时间以通知为准),在此期间,您的模型单元可继续使用,并会持续产生资源使用费;关停后,停止计费,同时资源不可使用。 > **注意** > > 如需继续使用,请及时续费,避免业务中断;如不使用,请及时释放模型单元,避免产生额外计费。 ## **预付费(按月)** * **生效时间**:购买后,按照自然日立即生效。 * **到期时间**:从购买日算起,到期时间为到期自然日+1 天的中午 12 点。7 天内到期的模型单元会出现到期提醒。 * **到期回收**:资源到期后将被回收,您可以在资源被回收前在方舟产品控制台或 [订单管理页面](https://console.volcengine.com/finance/order) 进行续费,回收时间为到期时间+ 24 小时。即如您在4月13日上午9点购买一个月的模型单元,到期时间为 5月14日中午12点,到期回收时间为5月15日中午12点。 在 5月15日中午12 点之前都可以进行续费。在回收期结束后,模型单元无法续费,您需要重新创建一个推理接入点来满足继续使用的需求。 * **续费说明**:强烈推荐您为资源配置自动续费,以避免由于未配置自动续费导致的业务中断。 --- # 创建模型单元 Source: https://ark.volcengine.com/region:cn-beijing/docs/create-model-units 本文介绍如何创建模型单元,帮助用户完成模型单元部署和调用。 # 使用流程 > 如果业务对于延时有需求,请通过 [工单](https://console.volcengine.com/workorder/create?step=2&SubProductID=P00001166) 提需求。 ## 1 创建推理接入点 1. 访问 [创建推理接入点](https://ark.volcengine.com/region:cn-beijing/endpoint/create) ,按页面引导填写。注意选择接入模式为 **模型单元**。 > 强烈推荐您打开右上角 **创建说明** 开关,帮助您了解每个配置项的使用场景和含义。 1. 根据业务流量情况选择计费类型、部署模板,使用 [**单元计算器**](https://ark.volcengine.com/region:cn-beijing/endpoint/create) 预估需要购买的机型单元数量,并 [申请配额](https://ark.volcengine.com/region:cn-beijing/quota?quota=%7B%22business%22%3A%22Endpoint%22%2C%22quota%22%3A%22ModelUnit%22%2C%22table%22%3A%7B%7D%7D)。 1. 勾选协议,并单击 **创建并接入**。创建完成后进入 **调度中** 状态,大约需要等待5-10分钟,当状态变成 **健康** 后,可正常调用。 > **说明** > > 推理接入点默认会创建在 default 项目下,如果您希望在其他项目下创建,请在导航栏左下角切换项目。 ## 2 获取 Endpoint ID 在 [在线推理页面](https://ark.volcengine.com/region:cn-beijing/endpoint) 查看并复制推理接入点 ID(Endpoint ID)。 ## 3 通过 Endpoint ID 调用模型 典型示例代码如下,更多示例代码可参见 [文本生成](/docs/text-generation) 章节。 > 运行代码前请确保已将 API Key 配置为环境变量 `ARK_API_KEY`(详情参见 [环境变量配置指南](/docs/environment-variable-configuration-guide)),并已安装 SDK:`pip install --upgrade arkruntime`。 ```Python # 安装 sdk 参见 https://ark.volcengine.com/region:cn-beijing/docs/install-and-upgrade-sdk # 文本生成支持 Chat API,暂不支持 Responses API import os from arkruntime import Ark client = Ark( api_key=os.environ.get("ARK_API_KEY"), # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", ) completion = client.chat.completions.create( # Replace with your endpoint ID model="ep-2025****-**", messages=[ {"role": "user", "content": "Hello"} ] ) print(completion.choices[0].message) ``` # 弹性伸缩 ## 规则介绍 后付费模型单元,支持配置弹性伸缩规则,帮助您根据业务负载动态调整模型单元的数量,进一步提升资源利用率并降低成本。 * **购买数量**:根据预算和业务并发,配置最小单元数和最大单元数,实际模型单元数量会在这个范围内波动。注意最大和最小单元数都是步长的整数倍,不同机型支持的步长不同,具体请参见控制台提示。 * **延迟和并发档位**:控制模型单元根据业务负载进行弹性伸缩的触发条件。 控制台会显示每个档位对应的单个模型单元的延迟 (TTFT/TPOT) 与 吞吐(TPS) 预估,供您参考选择合适业务需求的档位。 档位越低,响应越快,但并发也越低,越容易触发弹性伸缩,相应地资源调整会更频繁。 > **说明** > > * TTFT:Time To First Token,从请求发送到生成首个 token 的耗时 > * TPOT:Time Per Output Token,在首个 token 输出之后,生成每个后续 token 所需的平均时间 > * TPS:Tokens Per Second,每秒处理的 token 数量(包括输入和输出),反映模型单元的吞吐能力。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/2dca1db3476744879de7d2be06371b20~tplv-goo7wpa0wc-image.image) ## 配置示例 **选项:最低成本** 介绍如何配置弹性伸缩策略,可以使您的业务成本最低。 * 最小单元数量:**0**(仅在开启**智能唤醒与休眠**后才可设置为 0;未开启智能唤醒与休眠时,最小单元数量不能为 0) * 最大单元数量:4(仅参考,实际需覆盖业务最大流量) * 延迟与并发档位:根据实际并发和延迟需求选择 * 勾选 **智能唤醒与休眠**,设置 xx 时间无流量后,模型单元自动缩零,停止计费。后续有流量时,模型单元将自动恢复运行,注意从 0 扩展到 1 时,冷启动可能需要几分钟时间。最小单元数为 0 的部署在 7 天无流量后会自动删除。 **说明:智能唤醒与休眠当前为邀测功能,如需使用,请提交**[**工单**](https://console.volcengine.com/workorder/create?step=2&SubProductID=P00001166)**。** **选项:最大并发** 介绍如何配置弹性伸缩策略,可以使您的业务达到较高的TPS。 * 最小单元数量:4(仅参考,请配置一个最小步长) * 最大单元数量:12(建议配置数量超过业务最大流量承载力) * 延迟与并发档位:档位越高,TPS 越大。控制台会显示每个档位对应的TPS,建议选择满足目标TPS的档位。 # 使用限制 * 模型单元预计可承载性能(Tokens Per Second,TPS)基于平台标准化性能测试得出(输入长度约 3000 Tokens,输出长度约 300 Tokens,缓存命中率为 0)。资源实际承载力影响因素较多,建议购买后使用您业务的真实流量进行压测,确定模型单元的实际吞吐。 * Lora精调后的模型推理性能相较平台预置模型的推理会有一定程度的降低。 * 仅支持通过 [对话(Chat) API](/docs/chat-api) 调用模型,暂不支持 Responses API。 * 不支持上下文缓存 Context API。 # 常见问题 请参见[模型单元](/docs/modelark-faq#cfe1dfae)。 --- # 管理模型单元 Source: https://ark.volcengine.com/region:cn-beijing/docs/manage-model-units 本文介绍管理模型单元相关的操作,包括调整数量、续费、退订、修改弹性规则、切换模型版本等。 # 调整数量/续费/退订 1. 访问 [模型推理接入点](https://ark.volcengine.com/region:cn-beijing/endpoint?config=%7B%7D) 页签,单击目标接入点名称,进入接入点概览页。在算力保障区域,根据需要对模型单元进行调整数量、续费或退订。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/8840964372444b5f8f64d07231c3c21f~tplv-goo7wpa0wc-image.image) > **注意** > > * 模型单元是按实例组购买的,**接入点名称详情**中复制的模型单元 ID 是实例组 ID,实例组存在强绑定关系,因此续费、退订须同步发起。 > * 请注意,未到期的模型单元退订会产生惩罚系数,无法 100%退费。 # 修改弹性规则 对于按小时后付费的模型单元,支持在接入点详情页修改弹性规则。 1. 访问 [模型推理接入点](https://ark.volcengine.com/region:cn-beijing/endpoint?config=%7B%7D) 页签,单击目标接入点名称,进入接入点概览页。在算力保障区域,单击 **调整**,修改后付费模型单元的弹性规则。 # 切换模型版本 模型单元支持在同一基座模型、相同精度的可部署版本之间切换;请注意,若您当前使用的是平台精调后模型,暂时仅支持**全量**精调产物之间的切换。 > **注意** > > 建议选择流量低峰期切换版本,以减少对业务的潜在影响。 1. 访问 [模型推理接入点](https://ark.volcengine.com/region:cn-beijing/endpoint?config=%7B%7D) 页签,单击目标接入点名称,进入接入点概览页。在基本信息区域,单击接入模型右侧的 **切换版本**,选择要切换的版本。 2. 确认所选版本无误后,单击 **确认切换**,系统将开始滚动更新。 # 算力保障分析 支持在接入点详情页面的 **算力保障分析** 区域,观测模型单元的用量情况。 --- # 批量推理 Source: https://ark.volcengine.com/region:cn-beijing/docs/batch-inference 批量推理是无需实时响应需求的离线大批量数据处理方案,适用于模型评测、批量回归等场景,支持通过 SDK 或 控制台创建异步任务处理请求。相较于在线推理,批量推理具备以下优势: * **更低成本**:输入输出单价为在线推理的 50%;受益于透明前缀缓存,命中缓存的输入单价可进一步降低 60%。 * **更高配额**:默认 100亿 token/天,支持工单申请提额;受益于灵活的调度策略,高峰期仍可获得可观的任务处理速率。 * **场景灵活**:同时提供批量推理任务(处理静态存储数据)、类在线推理方式批量推理接入点(处理动态数据)两种模式。 * **改造简单**:Batch Chat 接口参数与 Chat 接口一致,只需关注超时时间和并发策略,即可快速切换至批量推理,无需修改业务逻辑。 > **说明** > > 本篇教程不包含批量生成视频的相关内容。若有批量视频生成的诉求,参见[离线推理](/docs/video-generation-tutorial#c3588bd1)。 # 支持的模型 以 [控制台](https://ark.volcengine.com/region:cn-beijing/batchInference/create) 可选模型为准。 > 更多模型陆续开放中,如有其他模型的批量推理需求,请提交 [工单](https://console.volcengine.com/workorder/create?step=2&SubProductID=P00001166)。 > **注意** > > 对于已默认开启 thinking summary 的模型(参见[回传思考内容](/docs/deep-thinking#3e8661f7)),批量推理**不返回思考内容**:结果中不包含 `choices.message.reasoning_content`(思考内容摘要),仅返回回答内容(`choices.message.content`)。如有在批量推理中输出思考内容的诉求,请提交 [工单](https://console.volcengine.com/workorder/create?step=2&SubProductID=P00001166)。 # 选择调用方式 方舟提供了两种批量推理方式,您可根据自己的业务场景选择合适的调用方式。 |方式 |批量推理任务 |批量推理接入点 | |---|---|---| |工作方式 |使用 `JSONL` (JSON Lines,一种每行一个JSON对象的文件格式)文件存储要处理的请求,上传至火山引擎对象存储(TOS) 上。通过 [Batch Job API](/docs/create-batch-inference-job-api) 创建批量任务,等待所有请求完成后将存储结果返回到 TOS 中。 |调用接口将处理任务推送给平台后,一段时间后(时间长短受资源影响),方舟平台会返回结果。 | |应用场景 |* 数据已静态存储在火山引擎对象存储产品 TOS 中。 |* 可直接处理非静态存储、动态生成的数据,无需提前整理为静态文件上传至对象存储,降低数据预处理的改造成本。 | \ | |* 每天要处理的数据量很大。 |* 调用模型的上下游都是在线链路。 | \ | |* 多模态模型批量推理,对网络带宽压力大。 |* 完整业务链路中调用模型其中一环,单独改造成本高。 | |核心流程 |1. 上传或分片上传数据到对象存储 |1. 创建批量推理接入点 | \ | |2. 创建批量推理任务 |2. 使用批量推理接入点接口进行批量推理 | \ | |3. 查询批量推理任务状态 |> 根据业务配置超时(大于30分钟)与并发数 | \ | |4. 从对象存储中读取推理结果 | | |优势 |:::tip |* 小改造成本,您的工程在使用在线推理接口的基础上进行小的调整,即可切换到批量推理。 | \ | |当两种方式都可满足业务需求时,推荐优先使用批量推理任务的方式进行批量推理。 |* 依赖批量推理更灵活的任务调度,即使是高峰期,仍可享受一定的处理效率。 | \ | |::: |* 支持透明前缀缓存能力,命中缓存的 token 会有更低折扣。 | \ | | | | \ | | | | \ | |* 数据处理规模或网络带宽上限更高。 | | \ | |* 托管了所有请求的资源调度,支持灵活任务调度,吞吐可达最优。 | | \ | |* 依赖批量推理更灵活的任务调度,即使是高峰期,仍可享受一定的处理效率。 | | \ | |* 支持透明前缀缓存能力,命中缓存的 token 会有更低折扣。 | | |劣势 |存在工程改造量,可能涉及数据上传、分片、切分目录等环节改造。 |* 高峰期间会收到较多`ServerOverloaded` 报错 | \ | | |> 需应用重试退避策略(使用方舟 SDK 在超时范围内自动处理)。 | \ | | | | \ | | |* 每日吞吐由平台资源限制与用户并发控制共同决定,每日吞吐可控性较批量推理任务的方式稍弱。 | > **说明** > > - **Batch Chat API 已标记为待下线。** 建议您直接使用 [Chat API](/docs/chat-api),并在请求中设置 `service_tier=flex`,以 [在线推理(低优)](/docs/online-inference-flex) 的方式完成批量数据处理。接口参数一致,改造成本低。 > - 批量推理接入点适用于通过 Batch Chat API 处理动态数据的场景。对于动态产生的数据、后台任务或其他需要保持同步调用方式的时延不敏感业务,可以迁移至 [在线推理(低优)](/docs/online-inference-flex)。迁移后,使用普通在线推理的预置推理接入点或自定义推理接入点,并在请求中设置 `service_tier=flex`。 > - 在线推理(低优)支持 [Chat API](/docs/chat-api)、[Responses API](/docs/create-model-responses-api) 和 [Messages API](/docs/messages-api),请根据业务当前使用的 API 协议及所需能力选择迁移后的接口。 > - **注意:doubao-seed-2.1 后续模型不再支持调用 Batch Chat API。** # 批量推理任务开发教程 批量推理任务是业界常规的批量、离线使用模式,需配合火山引擎对象存储(TOS)使用。 > 接口文档:[Batch Job API](/docs/create-batch-inference-job-api) ## 前提条件 * [开通指定模型服务](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=model)。 * [开通 TOS](https://console.volcengine.com/tos)(火山引擎对象存储产品),并已 [创建存储桶](https://console.volcengine.com/tos/bucket?projectName=default)。 > **说明** > > 存储桶(bucket)的 区域(region)需配置为华北2(北京)。 > > ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/3ed4b3f7ca9f417c958a7ee1cdfb739d~tplv-goo7wpa0wc-image.image) * 使用 SDK 方式进行批量推理任务开发,需完成以下操作: * 安装 [TOS SDK](https://docs.volcengine.com/docs/6349/93479?lang=zh)、[火山引擎SDK](https://api.volcengine.com/api-sdk/view?serviceCode=ark&version=2024-01-01&language=Python) * [获取Access Key](https://console.volcengine.com/iam/keymanage/) ## 快速入门 可以根据以下步骤快速实现批量推理任务的创建、查询、下载结果等。 ### 步骤一:准备批量推理任务文件 请参考文件格式要求准备文件格式为 `JSONL` (JSON Lines,一行一个 JSON 对象)的数据文件,其中每行包含对 API 的单个请求的详细信息。 #### 文件示例 下面是包含 2 个请求的输入文件的示例(`.jsonl `文件): **选项:文本生成** ```JSON {"custom_id": "request-1", "body": {"messages": [{"role": "user", "content": "天空为什么这么蓝?"}],"max_tokens": 1000,"top_p":1,"temperature":0.7}} {"custom_id": "request-2", "body": {"messages": [{"role": "system", "content": "You are an unhelpful assistant."},{"role":"user", "content":"天空为什么这么蓝?"}],"max_tokens":1000}} ``` **选项:图片理解** ```JSON {"custom_id":"request-1","body":{"messages":[{"role":"user","content":[{"type":"text","text":"支持输入是图片的模型系列是哪个?"},{"type":"image_url","image_url":{"url":"https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/ark_demo_img_1-zh.png"}}]}],"max_tokens":1000,"top_p":1,"temperature":0.7}} {"custom_id":"request-2","body":{"messages":[{"role":"user","content":[{"type":"image_url","image_url":{"url":"https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/ark_demo_img_1-zh.png"}},{"type":"image_url","image_url":{"url":"https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/ark_demo_img_2.png"}},{"type":"text","text":"图片里都有什么?"}]}],"max_tokens":1000}} ``` **选项:视频理解** ```JSON {"custom_id":"request-1","body":{"messages":[{"role":"user","content":[{"type":"text","text":"视频里有什么?"},{"type":"video_url","video_url":{"url":"https://arkdocs.tos-cn-beijing.volces.com/videos/advanced-usage/ark_vlm_video_input.mp4"}}]}],"max_tokens":1000,"top_p":1,"temperature":0.7}} {"custom_id":"request-2","body":{"messages":[{"role":"user","content":[{"type":"video_url","video_url":{"url":"https://arkdocs.tos-cn-beijing.volces.com/videos/advanced-usage/video_by_sd2-zh.mp4"}},{"type":"video_url","video_url":{"url":"https://arkdocs.tos-cn-beijing.volces.com/videos/advanced-usage/video_understanding.mp4"}},{"type":"text","text":"视频里都有什么?"}]}],"max_tokens":1000}} ``` **选项:文本向量化** ```JSON {"custom_id": "request-1", "body": {"input": ["天很蓝","海很深"]}} ``` **选项:图像向量化** ```JSON {"custom_id": "request-1", "body": {"input": [{"text": "天很蓝,海很深","type": "text"},{"image_url": {"url": "https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/view.jpeg"},"type": "image_url"}]}} ``` **文件格式校验脚本**:为避免格式错误导致任务失败,请使用校验脚本检测文件,检测前请配置对应的文件。 [jsonl_linter.py](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/6fa7008b3f484207ac8760d7f69b92ee~tplv-goo7wpa0wc-image.image) #### 文件规范要求 * **文件基础要求** 默认最大文件大小 5 GB;单个文件只能包含一个批量推理接入点的请求。 * **字段规则** * 每个请求都必须包含`custom_id` 字段,**类型为字符串且在文件内唯一**,用于关联请求与对应结果。 * 每条请求独立发送、独立收到结果。若多个请求提示词相同,需在请求中都加上相同的提示词。 * 每个请求`body` 字段参数需与底层模型调用 API 的 request body 一致,为合法 JSON Object。完整配置参见对应 API 文档:[对话(Chat) API](/docs/chat-api)、[多模态向量化 API](/docs/multimodal-vectorization-api)、[图像向量化 API](/docs/multimodal-vectorization-api)。 * **视觉理解批量任务要求** * 传入图片/视频的方式要求:批量推理任务仅支持 TOS(火山引擎对象存储)链接,不支持其他链接和 Base64 编码(批量推理接入点的传入方式与此不同,参见 [使用批量推理接入点](/docs/batch-inference#7fad62bf) 章节)。 * 图片链接需要保持长期可用(推荐 7 天)。TOS 预签名链接默认有效期为 1 小时,需手动设置 expires 参数变更过期时间(建议 7 天),避免因链接过期导致任务失败。完整签名字段说明见 [TOS 预签名文档](https://docs.volcengine.com/docs/6349/135725?lang=zh)。 ```Python ... # 1. 创建TOS客户端 client = tos.TosClientV2(AK, SK, ENDPOINT, REGION) # 2. 生成“下载图片”的预签名URL(GET方法,有效时间3600秒) download_pre_signed = client.pre_signed_url( HttpMethodType.Http_Method_Get, # 下载用GET方法(核心!) bucket_name=BUCKET_NAME, key=OBJECT_KEY, expires=604800 # 下载URL有效期,可按需调整(如86400=24小时) ) ... ``` * **配置示例** * 输出长度控制,配置 **max_tokens**。 ```JSON {"custom_id": "request-1", "body": {"messages": [{"role": "system", "content": "You are an unhelpful assistant."},{"role":"user", "content":"天空为什么这么蓝?"}],"max_tokens":1000}} ``` * 关闭深度思考,设置 **thinking** 字段(需模型支持 **thinking** 字段)。 ```JSON {"custom_id": "request-1", "body": {"messages": [{"role": "system", "content": "You are an unhelpful assistant."},{"role":"user", "content":"天空为什么这么蓝?"}],"thinking":{"type":"disabled"}}} ``` * 控制模型回复的丰富度,设置 **temperature** 、**top_p** 字段 。 ```JSON {"custom_id": "request-1", "body": {"messages": [{"role": "user", "content": "天空为什么这么蓝?"}],"top_p":1,"temperature":0.7}} ``` ### 步骤二:上传任务文件至TOS 可以通过 SDK 或 TOS 控制台上传任务文件至 TOS 的 bucket 中,后续方舟平台会读取文件里的请求信息进行批量推理。 **选项:SDK** **上传方式**:使用 SDK 支持的文件上传方式如下。 * 普通上传:最大上传 5 GB 文件。 * 分片上传:文件大小超过 5 GB 需要走分片上传,该方式最大支持上传 48.8 TB文件(每个分片最大 5 GB,分片数量最多 10000)。 **普通上传**: > [普通上传(Python SDK)](https://docs.volcengine.com/docs/6349/92800?lang=zh) ```Python import os import tos # 从环境变量中读取您的Access Key,为了保障安全,建议您配置Access Key至环境变量 ak = os.environ.get("VOLC_ACCESSKEY") sk = os.environ.get("VOLC_SECRETKEY") # 存储任务文件及结果文件的桶的属性,包括ENDPOINT以及区域,当前只支持北京区域的存储桶 endpoint = "tos-cn-beijing.volces.com" region = "cn-beijing" bucket_name = "input-bucket" # 上传任务文件的文件路径 object_key = "input/data.jsonl" # 任务文件本地的路径 file_name = "/usr/local/data.jsonl" # 初始化 TOS 客户端 client = tos.TosClientV2(ak, sk, endpoint, region) # 上传文件 client.put_object_from_file(bucket_name, object_key, file_name) ``` **分片上传** > [分片上传(Python SDK)](https://docs.volcengine.com/docs/6349/92801?lang=zh)、[断点续传(Python SDK)](https://docs.volcengine.com/docs/6349/135729?lang=zh) > **说明** > > * 文件大小超过 5GB 需要走分片上传,网络稳定的情况下可以直接走分片上传,网络不稳定建议走断点续传。 > * 每个分片大小为 4MB - 5GB,网络环境越稳定分片大小可选越大。建议分片大小为 50 MB - 1GB。 以下是断点续传的示例代码: ```Python # 断点续传demo import tos from tos import DataTransferType # 替换为您的存储桶名称 bucket_name = "demo-bucket-test" # 对象名称,例如 example_dir 下的 example_object.txt 文件,则填写为 example_dir/example_object.txt object_key = "input/data.jsonl" # 本地文件完整路径,例如usr/local/testfile.txt filename = "/usr/local/text.jsonl" ak = os.environ.get("VOLC_ACCESSKEY") sk = os.environ.get("VOLC_SECRETKEY") region = "cn-beijing" endpoint = "tos-cn-beijing.volces.com" try: # 创建 TosClientV2 对象,对桶和对象的操作都通过 TosClientV2 实现 client = tos.TosClientV2(ak, sk, endpoint, region) def percentage( consumed_bytes: int, total_bytes: int, rw_once_bytes: int, type: DataTransferType, ): if total_bytes: rate = int(100 * float(consumed_bytes) / float(total_bytes)) print( "rate:{}, consumed_bytes:{},total_bytes{}, rw_once_bytes:{}, type:{}".format( rate, consumed_bytes, total_bytes, rw_once_bytes, type ) ) # 可通过part_size可选参数指定分片大小 # 通过enable_checkpoint参数开启和关闭断点续传特性 # 通过task_num设置线程数 client.upload_file( bucket_name, object_key, filename, # 设置断点续传执行线程数,默认为1 task_num=3, # 设置断点续传分片大小,默认20mb part_size=1024 * 1024 * 5, # 设置断点续传进度条回调函数 data_transfer_listener=percentage, ) except tos.exceptions.TosClientError as e: # 操作失败,捕获客户端异常,一般情况为非法请求参数或网络异常 print("fail with client error, message:{}, cause: {}".format(e.message, e.cause)) except tos.exceptions.TosServerError as e: # 操作失败,捕获服务端异常,可从返回信息中获取详细错误信息 print("fail with server error, code: {}".format(e.code)) # request id 可定位具体问题,强烈建议日志中保存 print("error with request id: {}".format(e.request_id)) print("error with message: {}".format(e.message)) print("error with http code: {}".format(e.status_code)) print("error with ec: {}".format(e.ec)) print("error with request url: {}".format(e.request_url)) except Exception as e: print("fail with unknown error: {}".format(e)) ``` **选项:控制台** > **说明** > > 通过控制台分片上传最大能够上传 50 GB 文件。 登录 [对象存储控制台](https://console.volcengine.com/tos),在桶列表页面找到目标桶名称,在对应的文件路径下上传步骤一准备的任务文件。具体操作可参见 [上传文件](https://docs.volcengine.com/docs/6349/74830?lang=zh#.5q2l6aqk5LiJ77ya5LiK5Lyg5paH5Lu2)。 ### 步骤三:创建批量推理任务 > **说明** > > 避免异常场景下重复提交任务产生额外推理费用,平台在创建批量推理任务时提供**幂等控制机制**: > 当提交任务的用户、项目名(Project Name)、存储桶(bucket)和输入文件名(object-key)完全相同时,平台仅保留一个处于活跃状态(运行或排队)的任务,重复提交的任务将报错,并在错误信息中包含在运行或排队中任务的ID,供用户查询。重复提交报错后,您可以直接使用错误信息中返回的任务 ID 调用查询接口,跟踪原有任务的执行状态,无需重新提交任务。 **选项:SDK** 支持通过 SDK 配置并创建批量推理任务,包括读入任务文件的路径、输出结果的路径、使用模型等信息。接口参数可参见 [CreateBatchInferenceJob - 创建批量推理任务](/docs/create-batch-inference-job-api)。 ```Python import volcenginesdkcore import volcenginesdkark import os # 配置项类,您需将其改为自己的配置 class Config: # 存储任务文件及结果文件的桶的属性,包括ENDPOINT以及地域 REGION = "cn-beijing" INPUT_BUCKET = "input-bucket" # 替换为您的输入文件所在 TOS 桶名称 # 上传任务文件的文件路径 INPUT_OBJECT_KEY = "input/data.jsonl" OUTPUT_BUCKET = "output-bucket" # 替换为您的结果文件存储 TOS 桶名称 # 存储结果文件的文件夹 OUTPUT_OBJECT_KEY = "output/" # 任务文件本地的路径 LOCAL_FILE_NAME = "/usr/local/data.jsonl" # 模型版本及名称,可在此查询 https://ark.volcengine.com/region:cn-beijing/docs/model-list MODEL_VERSION = "260628" MODEL_NAME = "doubao-seed-2-1-pro" # 命名您的批量推理任务 JOB_NAME = "demo" # 批量推理任务所在项目的名称,默认为default PROJECT_NAME = "default" # 从环境变量中读取您的Access Key,为了保障安全,建议您配置Access Key至环境变量 AK = os.environ.get("VOLC_ACCESSKEY") SK = os.environ.get("VOLC_SECRETKEY") # 创建批量推理任务 def create_batch_job(ark_instance): input_file_tos_location = ( volcenginesdkark.InputFileTosLocationForCreateBatchInferenceJobInput( bucket_name=Config.INPUT_BUCKET, object_key=Config.INPUT_OBJECT_KEY ) ) output_dir_tos_location = ( volcenginesdkark.OutputDirTosLocationForCreateBatchInferenceJobInput( bucket_name=Config.OUTPUT_BUCKET, object_key=Config.OUTPUT_OBJECT_KEY ) ) foundation_model = volcenginesdkark.FoundationModelForCreateBatchInferenceJobInput( model_version=Config.MODEL_VERSION, name=Config.MODEL_NAME ) model_reference = volcenginesdkark.ModelReferenceForCreateBatchInferenceJobInput( foundation_model=foundation_model ) req = volcenginesdkark.CreateBatchInferenceJobRequest( input_file_tos_location=input_file_tos_location, model_reference=model_reference, name=Config.JOB_NAME, output_dir_tos_location=output_dir_tos_location, project_name=Config.PROJECT_NAME, ) resp = ark_instance.create_batch_inference_job(req) return resp.id configuration = volcenginesdkcore.Configuration() configuration.ak = Config.AK configuration.sk = Config.SK configuration.region = Config.REGION configuration.client_side_validation = True volcenginesdkcore.Configuration.set_default(configuration) ark_instance = volcenginesdkark.ARKApi(volcenginesdkcore.ApiClient(configuration)) # 创建批量推理任务 batch_job_id = create_batch_job(ark_instance) print(f"创建批量推理任务,任务ID:{batch_job_id}") ``` 请求将返回创建的批量推理任务的 ID。 ```Plain Text 创建批量推理任务,任务ID:bi-20260112213907-***** ``` **选项:控制台** 在 [批量推理](https://ark.volcengine.com/region:cn-beijing/batchInference) 页面,单击**开始批量推理**配置批量推理任务,其中调用方式选择**创建批量推理任务**,其他信息请根据控制台提示填写。 ### 步骤四:查询批量推理任务状态 **选项:SDK** 通过 SDK 支持通过任务 id、模型、运行状态等检查任务状态。接口参数信息参见 [ListBatchInferenceJobs - 获取批量推理任务列表](/docs/list-batch-inference-jobs-api)。 ```Python import os import volcenginesdkcore import volcenginesdkark class Config: # 存储任务文件及结果文件的桶的属性,包括ENDPOINT以及地域 REGION = "cn-beijing" # 从环境变量中读取您的Access Key,为了保障安全,建议您配置Access Key至环境变量 AK = os.environ.get("VOLC_ACCESSKEY") SK = os.environ.get("VOLC_SECRETKEY") # 替换为您创建的批量推理任务的 ID BATCH_JOB_ID="bi-20260112213907-****" # 列出指定 ID 的批量推理任务信息。 def list_batch_inference_jobs(ark_instance, batch_job_id): filter = volcenginesdkark.FilterForListBatchInferenceJobsInput(ids=[batch_job_id]) req = volcenginesdkark.ListBatchInferenceJobsRequest(filter=filter) resp = ark_instance.list_batch_inference_jobs(req) return resp configuration = volcenginesdkcore.Configuration() configuration.ak = Config.AK configuration.sk = Config.SK configuration.region = Config.REGION configuration.client_side_validation = True volcenginesdkcore.Configuration.set_default(configuration) ark_instance = volcenginesdkark.ARKApi(volcenginesdkcore.ApiClient(configuration)) batch_job_status = list_batch_inference_jobs(ark_instance, Config.BATCH_JOB_ID) print(f"批量推理任务信息:\n{batch_job_status}") ``` 运行脚本,返回的任务信息如下: ```JSON 批量推理任务信息: {'items': [{'completion_window': '28d', 'create_time': '2026-01-12T13:39:07Z', 'description': '', 'expire_time': '2026-02-09T13:39:07Z', 'id': 'bi-20260112213907-*****', 'input_file_tos_location': {'bucket_name': 'batch-test-0112', 'object_key': 'input/data.jsonl'}, 'model_reference': {'custom_model_id': None, 'foundation_model': {'model_version': '260628', 'name': 'doubao-seed-2-1-pro'}}, 'name': 'batch-demo-0112', 'output_dir_tos_location': {'bucket_name': 'batch-test-0112', 'object_key': 'output/'}, 'project_name': 'default', 'request_counts': {'completed': 0, 'failed': 0, 'total': 0}, 'status': {'message': '', 'phase': 'Queued', 'phase_time': '2026-01-12T13:39:07Z'}, 'tags': [{'key': 'sys:ark:createdBy', 'value': 'IAMUser/55165459/ark_doc'}], 'update_time': '2026-01-12T13:39:07Z'}], 'page_number': 1, 'page_size': 10, 'total_count': 1} ``` **选项:控制台** 支持在批量推理任务列表页、或者点击批量推理任务名称进入任务详情页,查看批量推理任务的信息,如任务基本信息、状态、进度、配置信息等。 批量推理任务状态与对应描述如下: |状态 |状态码 |描述 | |---|---|---| |排队中 |Queued |任务提交成功,由于账号下并发任务数达到上限等原因需排队等候。 | |初始化中 |Initializing |任务在初始化中。 | |运行中 |Running |任务运行中。 | |完成 |Completed |任务已完成。 | |停止中 |Terminating |由于到期等系统原因或手动终止,任务当前处于取消中状态。 | |已停止 |Terminated |任务已被停止。 | |失败 |Failed |任务执行失败,原因可能是超时等原因。 | ### 步骤五:下载批量推理任务结果 批量推理任务运行结束后,可以通过 SDK 或者控制台方式下载结果文件。其中结果文件包含 2 类文件: |文件名称 |TOS 存储路径 |说明 | |---|---|---| |results.jsonl |`{OutputDirectory}/{batch_job_id}/output/results.jsonl` |批量推理任务执行后,成功执行结果的集合。其中结果顺序可能与任务文件不一致,请通过`custom_id`来查询。示例如下: | \ | | | | \ | | |```json | \ | | |{"id": "batch-req-123", "custom_id": "request-1", "response": {"status_code": 200, "request_id": "req1", "body": {"id": "chatcmpl-9P3WtvGUhW5Ty91CdlcBJPgqh1rGG", "object": "chat.completion", "created": 1711111111, "model": "doubao-seed-2-1-pro-260628", "choices": [{"index": 0, "message": {"role": "assistant", "content": "天空呈现蓝色是因为“瑞利散射”现象。简单来说,就是当太阳光进入地球大气层时,波长较长的红光、橙光、黄光能穿透大气层,直接射到地面,而波长较短的蓝、紫、靛等色光,很容易被悬浮在空气中的微粒阻挡,从而使光线散射向四方,使天空呈现出蔚蓝色。"}, "logprobs": null, "finish_reason": "stop"}], "usage": {"prompt_tokens": 20, "completion_tokens": 9, "total_tokens": 29}}}, "error": null} | \ | | |``` | |errors.jsonl |`{OutputDirectory}/{batch_job_id}/error/errors.jsonl` |批量推理任务执行后,错误请求的集合。每个失败请求对应错误文件中的一个响应行,示例如下: | \ | | | | \ | | |```json | \ | | |{"id":"batch-req-456","custom_id":"request-2","response":null,"error":{"code":"AccessDenied","type":"Forbidden","message":"The request failed because you do not have access to the requested resource."}} | \ | | |``` | **选项:SDK** 脚本执行完成后,可以在`local_output_dir`文件路径下,找到批量推理任务结果文件。 ```Python import os import tos # 替换为您的批量推理任务 ID batch_job_id="bi-20260112213907-****" # 从环境变量中读取您的Access Key,为了保障安全,建议您配置Access Key至环境变量 ak = os.environ.get("VOLC_ACCESSKEY") sk = os.environ.get("VOLC_SECRETKEY") # 替换为您存储桶的属性,包括 endpoint、region、bucket_name endpoint = "tos-cn-beijing.volces.com" region = "cn-beijing" bucket_name = "output-bucket" # 替换为您配置的批量推理任务结果文件路径 output_object_key = "output/" # 替换为您存储批量推理任务结果文件的本地路径 local_output_dir = "./output/" results_key = f"{output_object_key}{batch_job_id}/output/results.jsonl" errors_key = f"{output_object_key}{batch_job_id}/error/errors.jsonl" results_file_name = f"{local_output_dir}{batch_job_id}/results.jsonl" errors_file_name = f"{local_output_dir}{batch_job_id}/errors.jsonl" client = tos.TosClientV2(ak, sk, endpoint, region) try: client.get_object_to_file(bucket_name, results_key, results_file_name) print(f"成功下载结果文件 {results_file_name}") except tos.exceptions.TosServerError as e: if e.status_code == 404: print("results.jsonl 不存在,说明本次批量推理没有成功执行的请求") else: raise try: client.get_object_to_file(bucket_name, errors_key, errors_file_name) print(f"成功下载错误文件 {errors_file_name}") except tos.exceptions.TosServerError as e: if e.status_code == 404: print("errors.jsonl 不存在,说明本次批量推理所有请求均成功执行") else: raise ``` **选项:控制台** 批量推理任务运行结束后,可以在任务列表点击**查看结果**或在任务详情页的**文件信息**区域点击链接至 TOS 页面,然后下载对应的结果文件。 批量推理任务结果文件内容如下: ```JSON {"id":"021768279264106000000000000000000000000000000004984d6","custom_id":"request-2","error":null,"response":{"request_id":"021768279264106000000000000000000000000000000004984d6","status_code":200,"body":{"choices":[{"finish_reason":"stop","index":0,"logprobs":null,"message":{"content":"害,天要蓝就让它蓝呗,纠结这干啥,难道你还能把它改成别的颜色不成?不如想想晚上吃啥小龙虾还是麻辣烫呢,这比啥都实在。","role":"assistant"}}],"created":1768279310,"id":"021768279264106000000000000000000000000000000004984d6","model":"doubao-seed-2-1-pro-260628","service_tier":"default","object":"chat.completion","usage":{"completion_tokens":210,"prompt_tokens":49,"total_tokens":259,"prompt_tokens_details":{"cached_tokens":0}}}}} {"id":"021768279264005000000000000000000000000000000008aeaa6","custom_id":"request-1","error":null,"response":{"request_id":"021768279264005000000000000000000000000000000008aeaa6","status_code":200,"body":{"choices":[{"finish_reason":"stop","index":0,"logprobs":null,"message":{"content":"天空之所以呈现蓝色,主要是因为**瑞利散射**这一光学现象,背后可以拆解为3个关键逻辑:\n\n### 1. 太阳光的“颜色本质”\n太阳光是一种复合光,由红、橙、黄、绿、蓝、靛、紫等不同波长的光组成。其中:\n- 红光、橙光的波长较长(约600-760纳米),穿透力强;\n- 蓝光、紫光的波长较短(约400-500纳米),更容易被散射。\n\n### 2. 大气分子的“选择性散射”\n地球大气中充满了氮气、氧气等微小分子,它们的直径远小于可见光的波长。根据瑞利散射原理:**光的散射强度与波长的4次方成反比**——波长越短,被散射的概率越高。\n因此,蓝光、紫光这类短波长光,会被大气分子向四面八方散射,布满整个天空。\n\n### 3. 人眼的“感知偏好”\n虽然紫光的波长比蓝光更短,散射强度也更高,但人眼的视觉细胞对紫光的敏感度远低于蓝光,同时太阳光中紫光的本身含量也比蓝光少。因此,我们的眼睛最终捕捉到的,是被广泛散射后的“天空蓝”。\n\n### 补充:早晚天空为什么是红橙色?\n清晨或傍晚时,太阳角度低,光线需要穿过更厚的大气层。此时短波长的蓝光、紫光几乎被完全散射殆尽,只剩下穿透力强的长波长红光、橙光抵达我们的眼睛,所以天空会呈现出暖色调的红橙色。","role":"assistant"}}],"created":1768279556,"id":"021768279264005000000000000000000000000000000008aeaa6","model":"doubao-seed-2-1-pro-260628","service_tier":"default","object":"chat.completion","usage":{"completion_tokens":808,"prompt_tokens":53,"total_tokens":861,"prompt_tokens_details":{"cached_tokens":0}}}}} ``` ### 步骤六:(可选)订阅通知 可以使用 [火山引擎消息通知服务](https://console.volcengine.com/sns/region:sns+cn-beijing/topic/list)(后简称 SNS) 来感知批量任务进度,包括批量推理任务完成或失败,具体订阅流程及订阅信息如下。 1. 申请开通 SNS ,请提交 [工单](https://console.volcengine.com/workorder/create?step=2&SubProductID=P90000689) 申请“SNS 开白”,并同步申请对应的消息事件: * BatchJobFinished:批量推理任务完成。 * BatchJobFailed:批量推理任务失败。 2. 在**主题**页面创建主题。 |配置信息 |操作参考 | |---|---| |* 发布者:选择指定账号`2100444922`。 |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/437917a96bb84c02b1a5fafe5a3f2bd1~tplv-goo7wpa0wc-image.image) | \ |* 可发布消息的服务:`ark`。 | | 3. 在**云服务事件订阅**页面创建事件订阅。 |配置信息 |操作参考 | |---|---| |* 事件类型:`BatchJobFinished`、`BatchJobFailed`。 |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/277d60abde61422381a3be34239d81d3~tplv-goo7wpa0wc-image.image) | \ |* Topic TRN:选择刚刚创建的主题。 | | 4. 在**订阅**页面配置订阅信息。 |配置信息 |操作参考 | |---|---| |* 订阅主题:已创建的主题。 |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/76693dd573b34176b8ca85cce0c23e30~tplv-goo7wpa0wc-image.image) | \ |* 推送类型:选择HTTP/HTTPS。 | | \ |* 接收端地址:配置对应类型的可接收端地址。 | | \ |> 也可以使用函数服务订阅信息。推送类型选择函数服务,通过函数 **[自定义开发](https://docs.volcengine.com/docs/6662/146364?lang=zh)** 通知处理逻辑,与下游应用串联。 | | 订阅信息配置完成后,SNS 会向接收端发送对应的确认链接,需确认该链接完成订阅。确认链接 demo 如下,需要回调示例中的 SubscribeURL。 ```JSON { "Type": "SubscriptionConfirmation", "MessageId": "f11b9a8f-****", "TopicTrn": "trn:sns:cn-beijing:2100000825:topic/test", "Message": "You have chosen to subscribe to the topic trn:sns:cn-beijing:2100000825:topic/wyy_test. To confirm the subscription, visit the SubscribeURL included in this message.", "Timestamp": "2025-01-14T07:18:59Z", "SignatureVersion": "1", "Signature": "MEUCIB3NsKw***=", "SigningCertURL": "https://sns-public-cn-beijing.tos-cn-beijing.volces.com/certificates/cn-beijing-a31d91fc-0683-****.pem", "SubscribeToken": "eyJhbGciOiJIUzI1Ni****", "SubscribeURL": "https://sns.cn-beijing.volcengineapi.com?Action=ConfirmSubscription&Version=2023-01-01&Token=eyJhbGc***" } ``` 5. 回调成功后可在**订阅**页面看到对应的订阅状态为**已确认**,表示订阅已完成。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/301d7375496f4ac6863e38b360cdb1e0~tplv-goo7wpa0wc-image.image) 订阅信息内容格式如下: |订阅事件 |字段 |返回示例 | |---|---|---| |批量推理任务完成 |* EventID: 通知 ID。 |```JSON | \ | |* Project: 项目名称。 |{ | \ | |* EventName: BatchJobFinished。 | "Type": "Notification", | \ | |* EventTime: 批量推理任务完成时间。 | "MessageId": "7dfcdd57-****--****-618c4d4c6787", | \ | |* AccountID: 用户的主账号 ID。 | "TopicTrn": "trn:sns:cn-beijing:2100000825:topic/test", | \ | |* JobInfo | "Subject": "ark:BatchJobFinished", | \ | | * JobID:批量推理任务 ID。 | "Message": "{\"EventID\":\"bi-20250114161208-****\",\"Project\":\"default\",\"EventName\":\"BatchJobFinished\",\"EventTime\":\"2025-01-14T16:12:08+08:00\",\"AccountID\":2100000825,\"JobInfo\":{\"JobID\":\"bi-20250114161117-hjtpg\",\"JobName\":\"批量推理回归\",\"Message\":\"\",\"FailNum\":0,\"TotalNum\":1,\"SuccessNum\":1,\"FailFileTOSPath\":{\"BucketName\":\"\",\"ObjectKey\":\"\"},\"SuccessFileTOSPath\":{\"BucketName\":\"qa-data\",\"ObjectKey\":\"批量推理/result/\"}}}", | \ | | * JobName:批量推理任务名称。 | "Timestamp": "2025-01-14T08:12:08Z", | \ | | * Message:任务信息。 | "SignatureVersion": "1", | \ | | * FailNum:失败数:此批量推理任务完成时,请求未成功执行的数量。 | "Signature": "MEYCIQD****", | \ | | * TotalNum:此批量推理任务提交的任务总数。 | "SigningCertURL": "https://sns-public-cn-beijing.tos-cn-beijing.volces.com/certificates/cn-beijing-****.pem", | \ | | * SuccessNum: 此批量推理任务完成时,请求成功执行的数量。 | "UnsubscribeToken": "eyJhbGciO****", | \ | | * FailFileTOSPath:失败任务 TOS 文件路径。 | "UnsubscribeURL": "https://sns.cn-beijing.volcengineapi.com?Action=Unsubscribe&Version=2023-01-01&Token=eyJhbGciO****" | \ | | * BucketName:桶名。 |} | \ | | * ObjectKey:文件名。 |``` | \ | | * SuccessFileTOSPath:成功任务TOS文件路径。 | | \ | | * BucketName:桶名。 | | \ | | * ObjectKey:文件名。 | | |批量推理任务失败 |* EventID: 通知 ID。 |```JSON | \ | |* Project: 项目名称。 |{ | \ | |* EventName: BatchJobFailed。 | "Type": "Notification", | \ | |* EventTime: 批量推理任务完成时间。 | "MessageId": "e350ff5b-****--****-41c3a44924bd", | \ | |* AccountID: 用户的主账号 ID。 | "TopicTrn": "trn:sns:cn-beijing:2100000825:topic/test", | \ | |* JobInfo | "Subject": "ark:BatchJobFailed", | \ | | * JobID:批量推理任务 ID。 | "Message": "{\"EventID\":\"bi-20250114154404-****\",\"Project\":\"default\",\"EventName\":\"BatchJobFailed\",\"EventTime\":\"2025-01-14T15:44:04+08:00\",\"AccountID\":2100000825,\"JobInfo\":{\"JobID\":\"bi-20250114154324-hkd5t\",\"JobName\":\"wyy\",\"Message\":\"推理任务失败,第361行非json数据, err=\\\"Syntax error at index 91: invalid char\\\\n\\\\n\\\\tssages\\\\\\\":[\\\\\\\"role\\\\\\\":\\\\\\\"user\\\\\\\",\\\\\\\"content\\\\\\\"\\\\n\\\\t................^...............\\\\n\\\"\"}}", | \ | | * JobName:批量推理任务名称。 | "Timestamp": "2025-01-14T07:44:04Z", | \ | | * Message:失败原因。 | "SignatureVersion": "1", | \ | | | "Signature": "MEUCIQ****", | \ | | | "SigningCertURL": "https://sns-public-cn-beijing.tos-cn-beijing.volces.com/certificates/cn-beijing-****.pem", | \ | | | "UnsubscribeToken": "eyJhbGciO****", | \ | | | "UnsubscribeURL": "https://sns.cn-beijing.volcengineapi.com?Action=Unsubscribe&Version=2023-01-01&Token=eyJhbGciO****" | \ | | |} | \ | | |``` | # 批量推理接入点开发教程 > **注意:Batch Chat API 已标记为待下线。** 新业务建议直接使用 Chat API 并在请求中设置 `service_tier=flex`(即 [在线推理(低优)](/docs/online-inference-flex))处理批量数据;存量业务请尽早规划迁移。 可通过批量推理接入点的方式,用较小的成本将业务从在线推理迁移至批量推理。 > 接口文档:[Batch Chat API](/docs/batch-chat-api) > **说明** > > 方舟平台的新用户?获取 API Key 及 开通模型等准备工作,请参见 [快速入门](/docs/quick-start)。 ## 快速入门 ### 步骤一:创建批量推理接入点 1. 打开 [批量推理创建页面](https://ark.volcengine.com/region:cn-beijing/batchInference/create)。 2. 按照页面进行配置,其中**调用方式**配置项,选择**创建批量推理接入点**。 3. 创建成功后,在批量推理页面的**接入点**页签,可以查看批量推理接入点 ID。 > 批量推理接入点ID的格式为:`ep-bi-***`。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/8ef0f0bc5cdd49be81a3df8a70c023f3~tplv-goo7wpa0wc-image.image) ### 步骤二:使用批量推理接入点接口进行批量推理 使用批量推理接入点接口快速发起一个批量推理请求,其中``需替换为步骤一中创建的批量推理接入点 ID。 ```Python import os from arkruntime import Ark client = Ark( api_key=os.environ.get("ARK_API_KEY"), base_url="https://ark.cn-beijing.volces.com/api/v3", # 推荐配置 24 小时超时,避免高负载场景下请求排队超时 timeout=3600*24, ) completion = client.batch.chat.completions.create( # 替换 为批量推理接入点 ID model="", messages=[ {"role": "user", "content": "你好"} ] ) print(completion.choices[0].message.content) ``` ## 使用说明及建议 为了充分发挥批量推理任务高配额的优势,使用批量推理接入点时,建议保持高并发推压,例如创建大量(10万+)线程/协程进行并发请求,并配置较长的超时时间,保障任务的完成率。 ### 配置超时时间 为避免服务端高负载时大量请求因排队超时失败,**推荐手动配置较长的请求超时时间**。 * **超时字段及配置**:`timeout`,推荐配置 24~72 小时(取值支持 1 ~ 72 小时)。 * **注意事项**: * 配置较长的超时时间:不会影响配额使用,可放心设置。 * 配置较短的超时时间:不建议,在深度思考、长文本输出等需要较长时间回复的场景,请求容易中途超时断开连接,既浪费 token 成本,又无法输出内容。 使用批量推理接入点时,**无需手动配置重试策略**,方舟会通过智能调度机制保障任务完成率。 * **客户端**:在`timeout`设定的时间范围内自动重试,或按照服务端要求暂停后重试。 * **服务端**:根据负载情况对请求做出暂不处理、排队、指定客户端若干时间后重试等操作。 ```Python ... client = AsyncArk( api_key=os.environ.get("ARK_API_KEY"), base_url="https://ark.cn-beijing.volces.com/api/v3", # 使用异步接口并配置较高的超时时间,推荐24小时~72小时 timeout=3600*24, ) ... ``` ### 配置并发策略充分使用配额 方舟为每个主账户提供至少 10B token/天的配额,可通过配置请求并发数及副本数,将大量任务提交到方舟平台处理。方舟平台会根据业务负载智能调度任务执行,甚至在低负载时段提供超出基础配额的处理能力。 请求并发数`workerNum`表示向方舟服务端发起请求时的最大并发数,决定同一时间内单副本业务能够向服务端发起请求的最大数量。配置`workerNum`需结合业务预期最大峰值、请求平均时延、服务器并发上限等因素综合评估,以下是配置请求并发数及副本数的简单例子。 > **说明** > > 业务预期的最大峰值 QPS 为 5000,单个请求的平均延时为 5 秒,部署在相应的机器或容器上。 > **关键的指标** > * 业务并发数:`5000*5 = 25000` > * 服务器限制:不考虑业务层损耗,这里假设为 500 QPS。 > > **副本数和并发数配置** > 如果需要应对业务峰值时的业务量,可部署更多副本(推荐)或提升服务器规格(不推荐): > * 副本数(预估的服务器数量):`业务QPS/服务器限制=5000/500=10`。 > * 请求并发数`workerNum`(每个副本上设置并发数):`服务器限制*请求平均延时=500*5=2500`。 在代码实现上需注意: * 创建 client 后、发起服务端请求前,需要启动 client 的相关线程。其中 Java 客户端自带线程池,无需额外手动启动。不同编程语言调用方法存在差异,具体参考下面代码示例。 * 单个副本中全局使用同一个 client(单例模式),避免创建大量实例造成资源开销与浪费。例如,Go SDK 中 client 的`StartBatchWorker`方法会创建`workerNum`个 goroutine,避免创建大量 client 带来的资源开销及浪费。 **不同语言实现并发的示例代码如下**: **选项:Python 异步实现(推荐)** 相比多线程方式,异步协程的方式更优: * **并发更高**:当一个任务处于 I/O 等待状态(如网络请求)时,`asyncio` 可以立即切换到其他任务继续执行,避免了线程切换的开销,从而提高了整体的并发性能。 * **更轻量**:协程是轻量级的执行单元,相比于线程,占用的系统资源更少,可以创建大量的协程来处理任务。 > **说明** > > 批量推理属于标准的高 I/O 低计算场景,若您的系统适配的场景未使用同步 API,建议使用异步协程的方式。在大部分场景下,用异步协程能获得更优的效果。 ```Python # 导入异步编程相关库,用于处理异步任务,异步编程中协程是核心概念 import asyncio # 导入系统相关库,可用于与 Python 解释器和系统进行交互,如标准错误输出 import sys # 导入操作系统相关库,用于访问操作系统的功能,如读取环境变量 import os # 导入日期时间处理库,用于记录和计算程序的执行时间 from datetime import datetime # 导入火山引擎异步 Ark 客户端库,用于与火山引擎的 Ark 服务进行异步通信 from arkruntime import AsyncArk async def worker( # asyncio task 的协程唯一标识,用于区分不同的工作协程 worker_id: int, # 异步 Ark 客户端实例,用于调用批量聊天完成接口处理请求 client: AsyncArk, # 待处理请求的队列,存储需要处理的请求 requests: asyncio.Queue[dict], ): """ 异步协程函数,负责从队列中获取请求并处理。 :param worker_id: 协程的唯一标识,用于在日志中区分不同的协程 :param client: 异步 Ark 客户端实例,通过该实例调用服务接口处理请求 :param requests: 待处理请求的队列,存储待处理的请求信息 """ # 打印协程启动信息 print(f"Worker {worker_id} is starting.") while True: # 从队列中获取一个请求,若队列为空则会阻塞等待 # 这里的 await 关键字用于暂停协程的执行,等待队列中有元素可供获取 request = await requests.get() try: # 调用客户端的批量聊天完成接口处理请求,使用解包操作将请求字典作为参数传递 # 同样使用 await 关键字暂停协程,等待接口调用完成 completion = await client.batch.chat.completions.create(**request) # 打印处理结果 print(completion) except Exception as e: # 若处理请求过程中出现异常,将错误信息打印到标准错误输出 print(e, file=sys.stderr) finally: # 标记该请求已处理完成,通知队列该任务已结束 requests.task_done() async def main(): """ 主函数,负责初始化客户端、生成请求、启动协程并监控任务完成情况。 使用协程来实现并发处理请求,避免了使用线程带来的较大开销。 多个协程可以在一个线程中并发执行,提高程序的性能。 """ # 记录程序开始执行的时间 start = datetime.now() # 定义协程数量和任务数量,此处示例为避免过度消耗资源,设置为较小值,实际使用请按需调整 worker_num, task_num = 10, 100 # 创建一个异步队列用于存储请求,该队列支持异步操作 requests = asyncio.Queue() # 初始化异步 Ark 客户端 client = AsyncArk( # 从环境变量中获取 API 密钥,确保密钥的安全性 api_key=os.environ.get("ARK_API_KEY"), # 设置超时时间为24小时,建议超时时间设置尽量大些,推荐24小时~72小时,避免因网络等原因导致请求超时 timeout=24 * 3600, # 设置 base_url,指定与服务通信的基础 URL base_url="https://ark.cn-beijing.volces.com/api/v3", ) # 模拟 `task_num` 个任务,将请求信息添加到队列中 for _ in range(task_num): await requests.put( { # 替换为你的批量推理接入点 ID,指定要调用的服务端点 "model": "", "messages": [ {"role": "user","content": "hello"} ] } ) # 创建 `worker_num` 个 asyncio task 的协程,并启动它们,每个协程负责处理队列中的请求 # 这些协程会在一个线程中并发执行,通过协程的切换来提高效率 tasks = [ asyncio.create_task(worker(i, client, requests)) for i in range(worker_num) ] # 等待所有请求处理完成,即队列中的所有任务都被标记为已完成 await requests.join() # 停止所有协程,取消所有正在运行的任务 for task in tasks: task.cancel() # 等待所有协程取消完成,确保所有任务都已停止 await asyncio.gather(*tasks, return_exceptions=True) # 关闭客户端连接,释放资源 await client.close() # 记录程序结束执行的时间 end = datetime.now() # 打印程序总执行时间和处理的总任务数 print(f"Total time: {end - start}, Total task: {task_num}") if __name__ == "__main__": # 运行异步主函数,启动整个程序 # asyncio.run() 会创建一个事件循环,并在这个事件循环中运行主协程 asyncio.run(main()) ``` **选项:Python 多线程实现** 与在线推理接入点使用类似,需要额外进行配置的信息如下。 1. 设置超时时间`timeout`。 2. 配置的并发线程数和线程中运行的任务数。 3. 异步方法调用`client.batch.chat.completions`方法。 ```Python # 导入 queue 模块,用于创建队列 import queue import sys import os from datetime import datetime # 从 multiprocessing.pool 模块导入 ThreadPool 类,用于创建线程池 from multiprocessing.pool import ThreadPool # 导入方舟SDK from arkruntime import Ark def worker( # 线程的唯一标识 worker_id: int, # Ark 客户端实例 client: Ark, # 待处理请求的队列 requests: queue.Queue[dict], ): """ 线程函数,负责从队列中获取请求并处理。 :param worker_id: 线程的唯一标识 :param client: Ark 客户端实例 :param requests: 待处理请求的队列 """ print(f"Worker {worker_id} is starting.") while True: # 从队列中获取一个请求 request = requests.get() # 检查是否收到无更多请求的信号 if not request: # 将信号放回队列,以便其他线程也能收到 requests.put(request) return try: # 执行请求 completion = client.batch.chat.completions.create(**request) print(completion) except Exception as e: # 打印错误信息到标准错误输出 print(e, file=sys.stderr) finally: # 标记该请求已处理完成 requests.task_done() def main(): """ 主函数,负责初始化客户端、生成请求、启动线程并监控任务完成情况。 """ # 记录开始时间 start = datetime.now() # 最大并发任务数和总任务数,此处示例为避免意外消耗资源,设置为较小值,实际使用请按需调整 worker_num, task_num = 10, 100 # 创建一个队列用于存储请求 requests = queue.Queue() # 初始化 Ark 客户端,设置超时时间为 24 小时 client = Ark( # 从环境变量中获取 API 密钥 api_key=os.environ.get("ARK_API_KEY"), # 设置超时时间为24小时,建议超时时间设置尽量大些,推荐24小时~72小时 timeout=24 * 3600, # 设置 base_url base_url="https://ark.cn-beijing.volces.com/api/v3", ) # 模拟 `task_num` 个任务 for _ in range(task_num): requests.put( { # 替换为你的批量推理接入点 ID "model": "", "messages": [ {"role": "user", "content": "Hello"}, ], } ) # 放入一个请求结束的信号 requests.put(None) # 创建 `worker_num` 个线程并启动它们 with ThreadPool(worker_num) as pool: for i in range(worker_num): # 异步执行线程函数 pool.apply_async(worker, args=(i, client, requests)) # 关闭线程池,不再接受新的任务 pool.close() # 等待所有任务完成 pool.join() # 关闭客户端连接 client.close() # 记录结束时间 end = datetime.now() print(f"Total time: {end - start}, Total task: {task_num}") if __name__ == "__main__": # 运行主函数 main() ``` **选项:Go** 与在线推理接入点使用类似,需要额外进行配置的信息如下。 1. 配置超时时间`timeout`。 2. 添加 `arkruntime.WithBatchMaxParallel` 选项,设置发起请求的最大并发数量。 3. 方法换成`client.CreateBatchChatCompletion`方法。 ```Go package main import ( "context" "encoding/json" "fmt" "os" "sync" "time" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/chat" ) func main() { // 使用 API Key创建一个新的客户端实例 client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBatchMaxParallel(10), // 设置发起请求的最大并发数量 arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) // 手动构造100个请求,在实际应用中,你可以从文件、消息队列或数据库中加载真实的请求 requests := MockRequests("YOUR_ENDPOINT_ID", 100) wg, ctx := sync.WaitGroup{}, context.Background() // 可以在这里设置全局的超时时间,如果超过这个时间,所有的请求都会被取消,这里设置为24小时 ctx, cancel := context.WithTimeout(ctx, 24*time.Hour) defer cancel() // 发起请求 for request := range requests { wg.Add(1) // 异步发起请求 go func(request chat.ChatCompletionRequest) { defer wg.Done() // 可以在这里设置每个请求的超时时间,如果超过这个时间,这个请求会被取消 ctx, cancel := context.WithTimeout(ctx, 24*time.Hour) defer cancel() // 发起批量推理请求 result, err := client.CreateBatchChatCompletion(ctx, &request) if err != nil { fmt.Fprintln(os.Stderr, err) } else { fmt.Println(MustMarshalJson(result)) } }(request) } // 等待所有协程完成任务 wg.Wait() } // MockRequests 模拟生成请求,这里只是简单地生成了 count 个相同的请求。 // 在实际应用中,你可以从文件、消息队列或数据库中加载真实的请求。 func MockRequests(endpoint string, count int) <-chan chat.ChatCompletionRequest { requests := make(chan chat.ChatCompletionRequest) go func() { defer close(requests) for i := 0; i < count; i++ { requests <- chat.ChatCompletionRequest{ Model: endpoint, Messages: []chat.ChatCompletionRequestMessage{ userMessage("Hello"), }, } } }() return requests } func MustMarshalJson(v interface{}) string { s, _ := json.Marshal(v) return string(s) } func userMessage(content string) chat.ChatCompletionRequestMessage { return chat.ChatCompletionRequestMessage{ OneOf: chat.NewChatCompletionRequestUserMessageChatCompletionRequestMessageSum( chat.ChatCompletionRequestUserMessage{ Role: chat.ChatCompletionRequestUserMessageRoleUser, Content: chat.NewOptNilChatCompletionMessageContent( chat.NewStringChatCompletionMessageContent(content), ), }, ), } } ``` **选项:Java** 与在线推理接入点使用类似,需要额外进行配置的信息如下。 1. 设置超时时间`timeout`。 2. 设置最大线程数和线程任务数。 > Java SDK中自带线程池,所以无需批量线程启动的方法。 3. 调用`ChatCompletionRequest`类,启动批量推理。 ```Java package com.example; import com.volcengine.ark.runtime.models.chat.*; import com.volcengine.ark.runtime.service.ArkService; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; import java.time.Duration; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; public class BatchChatCompletionsExample { public static void main(String[] args) { // 为batch chat设置一个较大的超时时间,推荐24小时到72小时之间 Duration timeout = Duration.ofHours(24); // 您需要根据自己的需求配置最大线程数和每个线程执行的任务数 int workerNum = 100; int taskNum = 5; // 您需要将自己的API密钥设置为环境变量 String apikey = System.getenv("ARK_API_KEY"); ConnectionPool connectionPool = new ConnectionPool(workerNum, 10, TimeUnit.MINUTES); Dispatcher dispatcher = new Dispatcher(); dispatcher.setMaxRequests(workerNum); dispatcher.setMaxRequestsPerHost(workerNum); // 请单独为batch chat单独初始化一个service实例,且多个Endpoint间也不要复用同一个service实例,避免互相影响。 // 单个service会根据最大并发数启动对应的线程池,会占用一定的资源。 ArkService service = ArkService.builder().dispatcher(dispatcher).timeout(timeout).connectionPool(connectionPool) .apiKey(apikey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); ExecutorService executorService = Executors.newFixedThreadPool(workerNum); CountDownLatch latch = new CountDownLatch(workerNum); Runnable batchChatTask = () -> { System.out.println(Thread.currentThread().getName() + ":在此线程中执行任务"); for (int i = 0; i < taskNum; i++) { // 每个线程执行的任务逻辑,您需要按照自己业务需求进行改造,这里作为示例,展示一个最简单对话的例子 try { final List messages = new ArrayList<>(); final ChatCompletionRequestMessage userMessage = ChatCompletionRequestUserMessage.builder().role(ChatCompletionRequestMessageType.USER) .content(ChatCompletionMessageContent.ofString("Hello")).build(); messages.add(userMessage); ChatCompletionRequest batchChatCompletionRequest = ChatCompletionRequest.builder() // 您需要替换您的批量推理接入点ID .model("") .messages(messages) .build(); service.createBatchChatCompletion(batchChatCompletionRequest) .getChoices() .forEach(choice -> System.out.println(Thread.currentThread().getName() + ":" + choice.getMessage().getContent())); } catch (Exception e) { System.out.println(Thread.currentThread().getName() + ":请求" + i + "失败。"); System.out.println(" 报错信息:" + e.getMessage()); } } System.out.println(Thread.currentThread().getName() + ":此线程中任务完成。"); latch.countDown(); }; for (int i = 0; i < workerNum; i++) { executorService.submit(batchChatTask); } try { latch.await(); } catch (InterruptedException ignored) { } System.out.println("所有线程已退出"); executorService.shutdown(); System.out.println("线程池已退出"); // 当所有请求完成,请关闭服务 service.shutdownExecutor(); } } ``` ### 视觉理解批量任务说明 * 传入图片/视频的方式要求:批量推理接入点支持 TOS 链接(推荐)、其他可访问的链接、Base64 编码三种传入方式。 * 图片链接需要保持长期可用(推荐 7 天)。TOS 预签名链接默认有效期为 1 小时,需手动设置 expires 参数变更过期时间(建议 7 天),避免因链接过期导致任务失败。完整签名字段说明见 [TOS 预签名文档](https://docs.volcengine.com/docs/6349/135725?lang=zh)。 ```Python ... # 1. 创建TOS客户端 client = tos.TosClientV2(AK, SK, ENDPOINT, REGION) # 2. 生成“下载图片”的预签名URL(GET方法,有效时间3600秒) download_pre_signed = client.pre_signed_url( HttpMethodType.Http_Method_Get, # 下载用GET方法(核心!) bucket_name=BUCKET_NAME, key=OBJECT_KEY, expires=604800 # 下载URL有效期,可按需调整(如86400=24小时) ) ... ``` # 配额说明 ## TPD 配额 不同模型的 TPD 配额不同,实际配额以控制台显示信息为准。 * 配额单位:是 TPD(Tokens Per Day),指 24 小时内可消耗的 token 配额。 * 配额共享:此配额是基于模型设定的,账户下使用同一模型的所有批量推理任务共享该额度。 * 不区分子账号,即账户下所有子账号均共享配额。 * 不区分版本,即同系列模型下的不同版本共享配额。 * 配额隔离:额度与在线推理的模型限流(在线推理限流请参见 [开通管理](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&OpenTokenDrawer=false) 页)隔离。运行批量推理任务不会消耗模型的在线推理限流。 * 超配额任务:当用户提交超 TPD 配额任务,会在平台资源空闲时尝试继续执行。 如您希望提升批量推理总配额,您可发起 [工单](https://console.volcengine.com/workorder/create?step=2&SubProductID=P00001166) 申请。 ## 其他配额 * 单任务文件大小,默认 5 GB;如有需要可以 [工单](https://console.volcengine.com/workorder/create?step=2&SubProductID=P00001166) 申请提额。 * 账户维度还有如下配额: * 提交任务数量限制:单项目下 7 天内提交的批量推理任务数量最多为 5000,超出时将暂时无法提交新的任务。 * 同时运行中的任务数量限制:单项目下同时处于「运行中」状态的批量推理任务数量最多为 20,超出时其余任务将处于「排队中」状态等待运行。 > 账号下实际同时运行的任务数量会受到平台总体资源的限制和任务调度策略的影响。 # API 文档 * [Batch Chat API](/docs/batch-chat-api) * [Batch Job API](/docs/create-batch-inference-job-api) # 计费说明 请参见 [模型价格](/docs/model-pricing)。 # 常见问题 [常见问题](/docs/modelark-faq)-[批量推理](/docs/modelark-faq#d3743e3b) ## --- # 智能模型路由 Source: https://ark.volcengine.com/region:cn-beijing/docs/intelligent-model-routing 智能模型路由是一种通过动态分析用户请求特征(如任务类型、复杂度、实时流量等),自动匹配最合适模型进行处理的技术,帮助企业在复杂场景中实现 AI 资源的最优配置。本文为您介绍智能模型路由的定义、主要优势、使用方式等相关内容。 # 什么是智能模型路由 智能模型路由是平台依据您每次请求的 Prompt 动态匹配最合适模型的能力;您只需创建一个接入点并开启该模式,平台便会在您圈定的模型范围内,结合 Prompt 内容、效果需求及成本偏好,自动匹配最优模型响应请求。这种智能匹配机制能够确保在不同的业务场景下,都能高效且精准地利用模型资源,为用户提供更贴合需求的服务。 # 主要优势 * **最大化模型效果**:针对不同任务自动匹配最优模型,尤其适配对效果有极致需求的用户。 * **精准降低成本**:简单任务自动路由至轻量模型,复杂任务匹配高阶模型,避免 “大材小用” 的资源浪费,实现成本与需求的精准适配。 * **化解模型选择难题**:无需用户手动开展复杂的模型评测与对比,平台全程自动筛选最优解,大幅降低模型选型门槛。 * **极简使用体验**:与常规模型接入流程完全一致,用户仅需创建一个接入点,通过接入点 ID 即可调用智能路由能力,无需额外修改代码,零学习成本快速上手。 # 使用说明 ## 请求限制 * 仅支持通过 [对话(Chat) API](/docs/chat-api) 调用智能模型路由,不支持 Responses API。 * 仅支持上下文长度 <32k tokens 的纯文本请求,不支持图片或视频输入。 * 不支持与上下文缓存功能一起使用。 ## 参数说明 **在智能路由模式下,以下参数会影响模型的选择**: * `thinking`: * 设置为`enabled`:自动排除 non-thinking 模型,并自动开启 thinking。 * 设置为`disabled`:倾向选择 non-thinking 模型。 * 设置为`auto`:倾向在所有支持 thinking 和 non-thinking 的模型中选择。 * `reasoning effort`:默认仅路由到支持该参数的模型。 * `response_format`:默认仅路由到支持该参数的模型。 **在智能路由模式下,以下参数不支持使用,如果设置,会导致运行报错**: * `top_logprobs` * `logit_bias` * `Stop` * `tool_choice` * `parallel_tool_calls` * `logprobs` ## 其他说明 * 如果您未参与协作奖励计划,智能路由不会收集您的数据信息。 * 智能模型路由的限流为 5,000,000 TPM 30,000 RPM。当智能路由到特定模型后,将同时消耗特定模型在账号下的限流额度。 * 按实际路由到的模型计费,内测期间路由模型本身不收费。 # 使用流程 ## 步骤一:创建推理接入点 1. 访问 [创建推理接入点](https://ark.volcengine.com/region:cn-beijing/endpoint/create),配置接入点信息。 1. 推理模式选择 **模型智能路由**。 2. 选择 **路由模型版本**。 路由模型版本是智能模型路由能力的标准化发布形态,每个版本明确了对应阶段下路由系统支持的模型范围、可用策略与核心能力。选定具体版本后,线上业务的路由行为将保持长期稳定;升级版本前请务必做全面评估,避免对业务产生影响。 当前提供以下两个版本: > **注意** > > 新用户仅支持选择新路由模型版本;已使用过该功能的存量用户可继续使用旧版本,也可切换至新版本。 --- **旧版本:多模型自主路由** 适用于希望充分利用多模型差异化优势的场景。您可指定一组备选模型并选择路由策略,平台将根据每次请求的 Prompt 内容,在备选模型中自动选择最合适的模型进行响应。 配置项: 1. 选择 **路由策略**。根据业务需求决定路由的导向逻辑: - **效果优先**:基于场景分类,自动选择效果最优的模型。 - **成本优先**:基于请求长度,在模型备选集中选择价格最低的模型。 - **平衡模式**:基于效果、成本、速度的加权得分进行综合排序。 2. 选择 **模型备选集**。指定智能路由可选择的模型范围: - **全自动模式**:平台自动开通全部可用模型,请求将由其中最合适的一个处理。如您关闭某个模型,路由将屏蔽该模型。 - **指定模型集**:由您手动指定智能路由的可选模型范围。 > **说明** > > 可选模型范围以控制台显示为准。 ![](https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance-2-5-reference-1.png) --- **新版本:基线模型智能降本/增效** 适用于已有明确主力模型、希望在此基础上进一步优化成本或提升效果的场景。您需要先指定一个基线模型,平台根据路由策略自动判断是否将请求切换至更优或更经济的模型,在保障业务稳定性的前提下实现降本增效。 配置项: 1. 选择 **接入模型**。从模型列表中选择一个模型作为基线。系统将以该模型的效果和成本作为参照基准,决定是否路由至其他模型。 2. 选择 **路由策略**。根据业务需求决定路由的导向逻辑: - **效果优先**:当模型备选集中存在效果优于基线模型的模型时,系统将自动路由至该模型。 - **成本优先**:当模型备选集中存在成本低于基线模型的模型时,系统将自动路由至该模型。 > **说明** > > 模型备选集以控制台显示为准。 ![](https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance-2-5-reference-2.png) 2. 按需配置其他信息,配置完成后,阅读并勾选相关协议,单击 **创建并接入**,完成推理接入点创建。 3. 在列表页复制接入点的 Endpoint ID,以便后续通过 Endpoint ID 发起模型调用时使用。 ## 步骤二:通过 Endpoint ID 发起模型调用 > 调用前请确保已将 API Key 配置为环境变量 `ARK_API_KEY`(详情参见 [环境变量配置指南](/docs/environment-variable-configuration-guide))。 您可以参考 [文本生成](/docs/text-generation) 的模型代码示例,通过对`model`字段赋值 Endpoint ID 的方式来发起调用。平台会返回执行该请求的实际模型和响应信息。 ```Bash curl https://ark.cn-beijing.volces.com/api/v3/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "ep-2xxxxxxx1-rr9kp", "messages": [ {"role": "system","content": "你是人工智能助手."}, {"role": "user","content": "你好"} ] }' ``` ## 步骤三:观测智能路由效果 单击接入点名称进入当前接入点的 **概览** 页面,您可在 **智能路由效果监控** 区域观测智能路由的效果,了解总计使用次数、总计节约成本、不同模型的使用比例等关键指标,从而评估智能路由策略的有效性和经济性。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/39999dad9e4a49439bb705b1636d7f2b~tplv-goo7wpa0wc-image.image) --- # 使用 MLP 推理服务 Source: https://ark.volcengine.com/region:cn-beijing/docs/use-mlp-inference-service 火山方舟提供丰富的大模型调用服务,如 Doubao 系列大语言模型、深度思考模型、视觉理解模型,DeepSeek 系列开源模型等。如果您希望使用自定义模型或其他三方开源模型,可以使用 [机器学习平台 MLP](https://console.volcengine.com/ml-platform/region:ml-platform+cn-beijing/dashboard?guideTab=mlDevelopment) 部署您的模型,然后注册至方舟平台进行调用。本文为您介绍如何通过火山方舟使用 MLP 推理服务。 ## 使用场景 #### **对于 MLP 用户,使用火山方舟可增强已有 MLP 模型服务能力,保障企业级AI应用落地**。 * **多接入点分流**:一个 MLP 在线服务,支持在方舟侧创建多个推理接入点 Endpoint ,方便业务方按照 Endpoint 限流,实现业务分流(如大促流量调度、服务等级区分等)。 * **评测与迭代**:接入点一键评测,对比性能(响应速度、准确率),辅助模型优化。 * **权限管控**:支持 IAM、API key、项目、标签维度权限管理,细粒度控制模型访问,保障安全合规。 #### 对于方舟侧用户,使用 MLP 可扩展模型种类,并获得方舟的统一集成体验。 * **开放部署**:支持调用更多的三方开源 / 自定义模型,火山方舟本身不会产生额外费用。 * **统一集成**:通过方舟统一域名与 API 调用,前端无需适配多模型,简化开发(如 AIGC 应用切换模型仅需修改 Endpoint ID)。 ## 支持能力 MLP 推理服务可使用的火山方舟功能如下: | | | | |类别 |功能/特性 |说明 | |---|---|---| | | | | |在线推理 |API 调用 |通过 Endpoint ID 调用您的 MLP 推理服务, Endpoint ID 格式为`ep-``s``-xxx`。 | | | | | |^^| | | \ | |支持模型 |MLP 推理服务(当前仅支持文本生成和深度思考大语言模型) | | | | | |^^| | | \ | |模型版本平滑切换 |✗ | | | | | |^^| | | \ | |配置接入点限流 |设置单接入点访问频率限制 | | | | | |^^| | | \ | |开启/停用接入点 |控制是否可通过该接入点调用您的服务 | | | | | |^^| | | \ | |查看监控 |查看 MLP 推理服务的监控指标 | | | | | |^^| | | \ | |安全审计(会话、传输加密) |✗ | | | | | |^^| | | \ | |细粒度权限管理 |支持 IAM、API key、项目、标签维度权限管理 | | | | | |^^| | | \ | |算力保障(TPM 保障包、模型单元) |✗ | | | | | |应用实验室 |零代码应用 |✗ | | | | | |^^| | | \ | |高代码应用 |✗ | \ | | | | | | | | |模型评测 |模型评测 |对您的MLP 推理服务进行评测 | |数据投递 |数据投递 |✗ | ## 支持模型 * 当前仅支持将 MLP 侧的**文本生成模型**和**深度思考模型**注册至方舟。其他领域模型(视觉理解模型、图片生成模型、视频生成模型等)部署的在线服务注册后,API 调用时会报错 500。 ## 使用说明 * API 调用: * 对于注册至方舟的 MLP 在线服务,仅支持**通过 MLP Endpoint ID 进行 API 调用**,不支持使用模型名称或 Model ID 进行调用。 * 调用 API 时,火山方舟不会对参数进行校验和拦截。为了保证您的模型可以正常调用,请提前确认模型支持的参数范围。 * 使用 MLP Endpoint 创建应用,具体是否支持网页解析等插件能力,由您的模型能力决定(例如不支持 function calling 的模型无法支持网页解析插件)。 * 计费说明: 从 MLP 注册的推理接入点,火山方舟不会收取推理产生的 token 费用。如果使用了火山方舟插件/知识库,则会产生相关费用。具体请参见 [联网内容插件产品计费](/docs/online-content-plugin-pricing) 和 [知识库计费](/docs/knowledge-base-pricing)。 * 安全能力: * 内容安全:模型的内容安全需用户自身负责,火山方舟不承担审核责任。 * 产品安全:由 MLP 保障,不支持使用方舟安全沙箱相关能力。 * 数据安全:火山方舟不会使用您的推理数据进行模型训练,所有数据仅用于您的推理服务,不会用于其他任何用途。 * 限流与SLA: * 方舟侧支持设置 MLP Endpoint 限流,整体服务的实际限流将由MLP的对应服务资源总量决定。 * **对于注册至方舟的 MLP 在线服务,实际推理服务可用性由 MLP 决定,火山方舟侧不对 SLA 进行保证和承诺**。 ## 前提条件 * MLP 侧准备工作如下: 1. 子用户已获取队列的使用权限,详情可参见 [MLP 权限管理](https://docs.volcengine.com/docs/6459/1535142?lang=zh)。 2. [已开通机器学习平台](https://console.volcengine.com/ml-platform)。 3. 已将您训练好的 LLM 模型或三方模型部署为在线服务,详细步骤请参见 [将模型部署成服务](https://docs.volcengine.com/docs/6459/1398947?lang=zh)。 4. 已在 [MLP 全局配置](https://console.volcengine.com/ml-platform/region:ml-platform+cn-datong/globalConfig) 对火山方舟完成跨服务授权,并添加对应服务。仅管理员账号支持该操作。 * 方舟侧准备工作如下: 1. 子用户已获取 [ArkStandardGlobalAccess](https://console.volcengine.com/iam/policymanage/System/ArkStandardGlobalAccess) 或 [ArkFullAccess](https://console.volcengine.com/iam/policymanage/System/ArkFullAccess) 权限,详情可参见 [使用IAM进行访问控制教程](/docs/use-iam-to-manage-permissions)。 2. [已开通火山方舟](https://ark.volcengine.com/region:cn-beijing/overview?briefPage=0&briefType=introduce&projectName=default&type=advance)。 ## 步骤一:创建 MLP Endpoint 1. 访问 [创建推理接入点](https://ark.volcengine.com/region:cn-beijing/endpoint/create) ,按页面引导填写。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/e34f1209baba4f5a89f6af96f3984152~tplv-goo7wpa0wc-image.image) 2. 接入来源选择**机器学习平台**,并选择待接入的 MLP 推理服务。 > **注意** > > * 当前仅支持将 MLP 侧的 LLM 模型推理服务注册至方舟。 > * MLP 侧准备工作如下: > > * 已将您训练好的 LLM 模型或三方模型部署为在线服务,详细步骤请参见 [将模型部署成服务](https://docs.volcengine.com/docs/6459/1398947?lang=zh)。 > > * 已在 [MLP 全局配置](https://console.volcengine.com/ml-platform/region:ml-platform+cn-datong/globalConfig) 对火山方舟完成跨服务授权,并添加对应服务。仅管理员账号支持该操作。 3. 配置接入点限流信息。请注意,实际的推理服务访问能力将由MLP的对应服务资源总量决定。 4. 阅读并勾选相关协议,单击 **确认接入**,完成 MLP 推理接入点创建。 创建成功后,复制 Endpoint ID 备用。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/939375c8e0964caa8b8575dddc5b124c~tplv-goo7wpa0wc-image.image) ## 步骤二:通过方舟 API/SDK 调用MLP推理服务 1. 获取 [火山方舟 API key](https://ark.volcengine.com/region:cn-beijing/apiKey?apikey=%7B%7D)。 2. 配置 API key 到环境变量。 ```Plain Text //其中"YOUR_API_KEY"需要替换为您在平台创建的 API Key export ARK_API_KEY="YOUR_API_KEY" ``` 3. 通过 API 或 SDK 调用 MLP 推理服务。下面为一个最简单的 LLM 大模型调用示例代码。 * 更多语言的代码示例请参见 [模型调用教程](/docs/model-invocation)。 * 方舟 API 文档请参见 [API 参考](/docs/api-key)。 **选项:REST API 调用示例** 注意 `model ` 需替换为步骤一获取的 Endpoint ID。 ```Bash curl https://ark.cn-beijing.volces.com/api/v3/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "ep-s-xxx", "messages": [ {"role": "system","content": "你是人工智能助手."}, {"role": "user","content": "你好"} ] }' ``` **选项:OpenAI SDK** 1. 请按如下命令安装环境 ```Plain Text pip install --upgrade "openai>=1.0" ``` 2. 请参考如下示例代码进行调用 ```Python import os from openai import OpenAI # 请确保您已将 API Key 存储在环境变量 ARK_API_KEY 中 # 初始化Openai客户端,从环境变量中读取您的API Key client = OpenAI( # 此为默认路径,您可根据业务所在地域进行配置 base_url="https://ark.cn-beijing.volces.com/api/v3", # 从环境变量中获取您的 API Key api_key=os.environ.get("ARK_API_KEY"), ) # Non-streaming: print("----- standard request -----") completion = client.chat.completions.create( # 替换为您步骤一获取的 MLP Endpoint ID model="ep-s-xxx", messages=[ {"role": "system", "content": "你是人工智能助手"}, {"role": "user", "content": "你好"}, ], ) print(completion.choices[0].message.content) # Streaming: print("----- streaming request -----") stream = client.chat.completions.create( # 替换为您步骤一获取的 MLP Endpoint ID model="ep-s-xxx", messages=[ {"role": "system", "content": "你是人工智能助手"}, {"role": "user", "content": "你好"}, ], # 响应内容是否流式返回 stream=True, ) for chunk in stream: if not chunk.choices: continue print(chunk.choices[0].delta.content, end="") print() ``` **选项:火山引擎 SDK** 1. 请按如下命令安装环境 ```Plain Text pip install --upgrade openai ``` 2. 请参考如下示例代码进行调用 ```Python import os from openai import OpenAI # 请确保您已将 API Key 存储在环境变量 ARK_API_KEY 中 # 初始化Openai客户端,从环境变量中读取您的API Key client = OpenAI( # 此为默认路径,您可根据业务所在地域进行配置 base_url="https://ark.cn-beijing.volces.com/api/v3", # 从环境变量中获取您的 API Key api_key=os.environ.get("ARK_API_KEY"), ) # Non-streaming: print("----- standard request -----") completion = client.chat.completions.create( # 替换为您步骤一获取的 MLP Endpoint ID model="ep-s-xxx", messages=[ {"role": "system", "content": "你是人工智能助手"}, {"role": "user", "content": "你好"}, ], ) print(completion.choices[0].message.content) # Streaming: print("----- streaming request -----") stream = client.chat.completions.create( # 替换为您步骤一获取的 MLP Endpoint ID model="ep-s-xxx", messages=[ {"role": "system", "content": "你是人工智能助手"}, {"role": "user", "content": "你好"}, ], # 响应内容是否流式返回 stream=True, ) for chunk in stream: if not chunk.choices: continue print(chunk.choices[0].delta.content, end="") print() ``` ## 可选:查看监控告警 支持对 MLP Endpoint ID 维度进行指标监控告警,了解模型服务的运行情况。详情可参见 [管理推理接入点](/docs/manage-inference-endpoints)。 ## 可选:对 MLP推理服务进行模型评测 支持使用 MLP 推理接入点创建模型评测任务,对您的模型效果进行评测。详情可参见 [创建模型评测任务](/docs/create-model-evaluation-tasks)。 > **注意** > > 暂不支持自定义推理参数。 ## --- # 使用自定义模型进行推理 Source: https://ark.volcengine.com/region:cn-beijing/docs/run-inference-with-custom-models 本文介绍使用自定义模型(平台精调后模型或用户上传的自定义模型)进行推理的流程。自定义模型支持的完整操作(包括体验、增量训练、量化压缩等内容),请参见[管理自定义模型](/docs/manage-custom-models)。 # 基本概念 * **自定义模型**:指用户在平台上创建的非系统预置模型,包括用户上传的 Hugging Face 格式模型,或者通过平台精调任务产出的模型。 * **量化压缩**:量化是压缩的一种方式,统称为量化或者量化压缩。将模型的参数与计算从高精度(如 BF16)转换为低精度(如 INT8、INT4、FP8),可以减少显存占用、提升吞吐率。**W8A8_FP8** 表示把模型的权重(Weights)和激活值(Activations)量化成8位浮点数格式(Floating Point 8)得到的精度。 * **可部署版本**:是自定义模型下可用于推理部署的版本;每一个精度会唯一对应此自定义模型下的一个可部署版本。 # 上传模型 ## 支持的模型范围 > 支持上传符合下列模型架构和精度的模型文件,实际以控制台为准 |模型架构 |量化精度 | |---|---| |[Qwen3-0.6B](https://huggingface.co/Qwen/Qwen3-0.6B) |BF16(原始精度),W8A8_FP8 | |[Qwen3-8B](https://huggingface.co/Qwen/Qwen3-8B) |BF16(原始精度),W8A8_FP8 | |[Qwen3-14B](https://huggingface.co/Qwen/Qwen3-14B) |BF16(原始精度),W8A8_FP8 | |[Qwen3-32B](https://huggingface.co/Qwen/Qwen3-32B) |BF16(原始精度),W8A8_FP8 | |[Qwen2.5-72B](https://huggingface.co/Qwen/Qwen2.5-72B) |BF16(原始精度),W8A8_FP8 | |[GLM-4.5-Air](https://huggingface.co/zai-org/GLM-4.5-Air) |BF16(原始精度),W8A8_FP8 | ## 模型文件要求 请上传符合 **Hugging Face** 格式的模型文件,为了确保模型能够正常解析与部署,目录中请包含以下文件: * **配置文件(必需,有且仅有一个)**:`config.json` * **模型权重文件(必需,至少一个)**:`*.safetensors` * **Tokenizer 文件(必需,至少一个)**:`tokenizer.json`、`tokenizer_config.json` 或 `tokenizer.model` * **权重索引文件(可选,推荐)**:`*.index.json` ## 使用流程 > 上传模型当前仅支持部署模型单元进行在线推理,暂不支持批量推理 ### 1 上传模型 支持从火山引擎对象存储(TOS)上传模型文件,注意符合[支持的模型范围](/docs/run-inference-with-custom-models#f4667062)和[模型文件要求](/docs/run-inference-with-custom-models#770523e5)。支持上传原始精度的模型或量化压缩后的模型,具体支持的量化精度以控制台为准。 1. 将您的模型文件上传至火山引擎对象存储(TOS),确保按照指定的格式和要求完成上传。 2. 访问 [模型仓库](https://ark.volcengine.com/region:cn-beijing/customModel?Original=%7B%7D&tab=Original) 页面,切换至 **自定义模型** 页签,单击 **上传模型**,将 TOS 存储的模型文件上传至火山方舟。 上传完成后进入 **准备中** 状态,大约需要等待5-10分钟,当状态变成 **健康** 后,可进行下一步操作。 ### 2(可选)量化压缩 原始精度模型上传完成后,支持通过平台提供的量化压缩功能生成其他精度的可部署版本。 > **注意** > > * 量化前后的模型效果可能有差异,建议部署前进行评测。 > * 量化压缩预计耗时 1-2 小时,具体时长受模型大小和平台负载影响。 1. 访问 [模型仓库](https://ark.volcengine.com/region:cn-beijing/customModel?Original=%7B%7D&tab=Original) 页面,切换至 **自定义模型** 页签。 2. 单击目标模型名称,进入基本信息页面。 3. 在可部署版本区域,单击 **创建可部署版本**,选择目标量化精度,系统将根据所选精度生成对应的可部署版本。 ### 3 使用模型单元部署推理 上传模型当前仅支持通过模型单元进行部署和在线推理。 1. 访问 [模型仓库](https://ark.volcengine.com/region:cn-beijing/customModel?Original=%7B%7D&tab=Original) 页面,切换至 **自定义模型** 页签。 2. 单击目标模型名称,进入基本信息页面。 3. 在可部署版本区域,选择要部署的目标版本,单击 **在线推理**,使用模型单元进行部署推理。模型单元具体配置和调用示例可参见[创建模型单元](/docs/create-model-units)。 # 平台精调后模型 > 基于 Doubao 模型进行精调 ## 使用说明 > 不同类型的精调后模型在推理方式及部署要求上存在差异,具体支持推理方式以控制台为准 **对于全量精调后模型**: * 在线推理:当前仅支持使用模型单元部署推理。 * 批量推理:支持按Token后付费方式进行部署推理。 **对于LoRA精调后模型**: * 在线推理: * 量化压缩后,支持普通在线推理(按Token付费) * 原始精度和量化精度一般均支持部署模型单元。 * 批量推理:量化压缩后,支持批量推理(按Token付费)。 ## 使用流程 ### 1 创建精调任务 1. 访问 [模型精调](https://ark.volcengine.com/region:cn-beijing/finetune) 页面,单击 **创建精调任务**,进入精调任务创建流程。精调选型、参数配置等详细内容可参见 [模型精调概述](/docs/fine-tuning-overview)。 2. 将精调产物导出至模型仓库。如果上一步已自动选择导出模型,可跳过该步骤。 1. 在 [模型精调](https://ark.volcengine.com/region:cn-beijing/finetune) 页面选择目标精调任务,进入概览信息页面。 2. 切换至模型产出页面,勾选目标产物并导出。导出完成后,可在模型仓库中查看并使用该精调产物进行后续的推理。 ### 2 (可选)量化压缩 如果创建精调任务时已配置 **导出自动量化**,则系统会自动对精调产物进行量化压缩,无需再手动进行此步骤;若未配置,可按如下步骤进行量化压缩操作。 > **注意** > > * 对于LoRA精调后模型,部署普通在线推理或批量推理前,必须先量化压缩。 > * 量化前后的模型效果可能有差异,建议部署前进行评测。 > * 量化压缩预计耗时 1-2 小时,具体时长受模型大小和平台负载影响。 1. 访问 [模型仓库](https://ark.volcengine.com/region:cn-beijing/customModel?Original=%7B%7D&tab=Original&projectName=default) 页面,切换至 **自定义模型** 页签。 2. 单击上一步导出的模型名称,进入基本信息页面。 3. 在可部署版本区域,单击 **创建可部署版本**,选择目标量化精度,系统将根据所选精度生成对应的可部署版本。 ### 3 部署推理 1. 访问 [模型仓库](https://ark.volcengine.com/region:cn-beijing/customModel?Original=%7B%7D&tab=Original&projectName=default) 页面,切换至 **自定义模型** 页签。 2. 单击目标模型名称,进入基本信息页面。 3. 在可部署版本区域,选择要部署的目标版本, * 单击 **在线推理**,配置[在线推理(常规)](/docs/online-inference-standard)或[创建模型单元](/docs/create-model-units)。 * 单击 **批量推理**,配置批量推理任务。详情参见 [批量推理](/docs/batch-inference)。 ## --- # 模型精调概述 Source: https://ark.volcengine.com/region:cn-beijing/docs/fine-tuning-overview 模型精调是指基于一个基础模型,通过特定的训练方法进行优化,以提升其在具体任务中表现的过程。精调主要适用于以下场景: * **提升特定任务表现**:针对您的具体业务场景或任务,优化模型性能。 * **降低延迟与成本**:通过精调一个小模型,使其在特定任务上的表现能媲美甚至超越大模型,从而实现更低的推理延迟和成本。 # 是否应该精调模型 * 评估效果问题是否可通过精调解决: * 通用基础能力(如推理、理解、长文)比较难通过精调大幅提升,建议反馈后等待基模优化([数据合作伙伴demo提交](https://bytedance.larkoffice.com/share/base/form/shrcnRoe6Pc1M6K6YlycyxFWGLd))。 * 时效性强的信息检索需求,建议选择联网内容插件,使用请参见[联网内容插件功能说明](/docs/online-content-plugin-guide)。 * 确定域内的信息检索需求,建议选择知识库插件,使用请参见 [文档知识问答核心流程](https://docs.volcengine.com/docs/vector_database_vikingdb/Coreprocessofknowledge-basedQA?lang=zh)。 * 评估收益与成本: * 如效果问题集中、判定规则清晰,**建议先尝试通过PE优化提示词**。如优化后效果仍不及预期,积累的数据集和评估框架也可用于进一步的精调优化。 * 精调训练、数据构造成本较高(建议最少 SFT数百样本 、DPO百条样本、CPT一千万 tokens),更大的业务规模能有效摊销训练成本 * 精调模型推理成本较基础模型更高,如对推理成本非常敏感,请评估后再进行精调或等待基础模型优化。 # 模型精调流程 1. [模型精调](https://ark.volcengine.com/region:cn-beijing/finetune) 页面,点击左上角 **创建精调任务** 按钮,填写必填字段; 2. 选择精调类型、待训练的模型及训练方式,可参考[精调选型指南](/docs/fine-tuning-overview#616be2d7); 3. 准备数据集,针对不同精调方法及模型能力,格式规范详见[格式总览](/docs/fine-tuning-dataset-format)。 4. 配置训练集与验证集 * 训练集:上传 JSONL 文件,支持本地上传、从 TOS 导入、选择已上传数据集三种方式;从 TOS 导入需先创建存储桶,步骤见 [对象存储控制台快速入门](https://docs.volcengine.com/docs/6349/74830?lang=zh)。 * 验证集:支持上述三种上传方式,也可直接从训练集中按比例分割;按比例分割不额外增加总 tokens,与训练集共同计算总 tokens。 * 功能支持:数据集混入预制数据、数据容错;数据安全支持平台默认密钥或自定义密钥,自定义密钥将在火山 KMS 产品管理私有密钥,计费参见 [密钥管理计费说明](https://docs.volcengine.com/docs/6476/71331?lang=zh)。 5. 完成训练参数与训练产物配置,提交精调任务。 6. 管理任务并评估精调效果。 * 在 [模型精调](https://ark.volcengine.com/region:cn-beijing/finetune) 任务列表中,您可以查看任务状态,并执行终止、复制或删除操作。进入任务详情页,即可查看**任务概览**、**训练观测**、**日志**、**时间线**、**模型产出**和**精调安全**等审计信息。 * 此外,您还可以在任务详情页配置状态通知,以便及时获取任务的开始、完成或失败等状态更新。请根据详情页 **概览信息** > **训练配置** > **全栈可观测平台** 进行设置。平台支持多种通知渠道,您可以根据事件的紧急程度,选择通过电话、短信、邮件、飞书、企业微信、钉钉、Slack、告警回调、飞书应用、运维编排、日志服务或消息队列 Kafka 接收通知。 7. 使用与管理精调模型,在 模型产出 页签将模型导出至 [模型仓库](https://ark.volcengine.com/region:cn-beijing/customModel) ,支持**量化、体验、评测、在线推理、批量推理**,操作见[管理自定义模型](/docs/manage-custom-models)。 # 精调选型指南 在选择用于精调的模型时,我们建议您遵循以下筛选步骤: 1. **确定模型模态**:根据您的业务需求,明确模型需要处理的输入和输出类型。 * 例如,如果只需处理文本,可以选择文本生成模型或多模态模型;如果需要处理文本和图片,则应选择多模态模型。 2. **筛选模型特性**:根据所需的功能(例如 function calling、thinking 模式、是否开源)筛选支持的模型。 3. **匹配训练方法**:根据您计划采用的训练方法,筛选出兼容的模型。 4. **考虑推理需求**:根据预期的推理方式和所需的上下文窗口大小,进一步缩小选择范围。 5. **调整筛选条件**:如果找不到完全满足所有条件的模型,您可以尝试放宽部分条件后再次查找。 接下来,我们将从选择模型、选择精调类型、选择训练方式以及选择精调后推理方式四个方面展开详细说明。 ## 选择模型 **强烈建议** 前期方案验证时 **选用较小尺寸的模型** 进行精调,成本更低、训练更快、迭代效率更高;当方案验证后,如小尺寸精调模型效果无法满足需求,可再使用更大尺寸的模型进行精调。 **推荐使用以下主力模型**。支持范围会随模型版本和配置调整,创建任务时请以控制台可选项为准。 ### 语言及多模态理解模型 | 模型 | 版本 | 输入模态 | 支持特性 | SFT | DPO | GRPO | 精调后推理 | | --- | --- | --- | --- | --- | --- | --- | --- | | `doubao-seed-2-0-mini` | 260428(推荐) | 文本、图片;SFT、DPO、CPT 支持音频;RL 不支持音频;视频以控制台可选能力为准 | thinking:enabled、disabled、reasoning_effort;支持 Function Calling | 全量、LoRA | 全量、LoRA | 全量、LoRA | 模型单元、批量推理窗口与基础模型一致;LoRA 按 token 推理为基础模型 2 倍价格,窗口 256k,最大回答和思维链 32k | | `doubao-seed-2-0-lite` | 260428(推荐) | 文本、图片;SFT、DPO、CPT 支持音频;RL 不支持音频;视频以控制台可选能力为准 | thinking:enabled、disabled、reasoning_effort;支持 Function Calling | 全量、LoRA | 全量、LoRA | 全量、LoRA | LoRA 按 token 推理为基础模型 2 倍价格,窗口 256k,最大回答和思维链 32k;其他方式以控制台为准 | thinking 模式详情请参见 [深度思考能力支持情况](/docs/multimodal-fine-tuning-data-format#c680ed77),Function Calling 详情请参见[Function Calling(函数调用)](/docs/function-calling)。 > **说明** > > 音频输入支持范围与模型版本及训练方式有关: > * SFT、DPO 和 CPT 支持通过 `audio_url` 传入音频。 > * GRPO、PPO 等 RL 训练不支持音频输入。 ### 图片生成模型 图片生成模型支持 SFT,具体模型 ID 和版本以创建精调任务时控制台可选项为准。 ### 视频生成模型 | 模型系列 | 精调方法 | 支持的数据场景 | | --- | --- | --- | | Doubao Seedance 1.0 | SFT | 文生视频、图生视频 | ### 文本向量化模型 文本向量化模型支持 SFT,具体模型 ID 和版本以创建精调任务时控制台可选项为准。 继续预训练、强化学习以及更多模型的精调需求,请 [**提交工单**](https://console.volcengine.com/workorder/create?step=2&SubProductID=P00001166) 进行咨询。 ## 选择精调类型 |**方法** |**最小数据需求** |**训练成本** |**难度** |**优势&场景** | |---|---|---|---|---| |SFT 有监督微调 |数百条以上标注数据(prompt+response问答对) |中 |低 |拟合样本回答,针对性强,效果可控。 | \ | | | | |默认推荐先通过SFT优化。 | |DPO 直接偏好优化 |百条以上偏好对比数据(如 A/B 选择) |中 |中 |基于用户反馈,低成本拟合用户偏好提升用户体验。 | \ | | | | |相比SFT优化偏好成本更低;相比RL无需构建奖励模型。 | |RL 强化学习 |百条以上prompt集 + 可选标注数据 |高 |高 |效果上限高 ,泛化好。 | \ |GRPO PPO DAPO | | | |需要构建并调优Reward fn,对算法能力要求较高。 | |CPT 继续预训练 |未标注数据一千万tokens以上 |高 |中 |增强行业/垂直领域知识,提升基础效果。 | \ | | | | |需要很大的数据量才有效果,同时对数据质量也有要求。 | ## 选择训练方式 从**参数更新范围**的角度划分,模型精调主要包含全量精调与 LoRA 精调两种方式。 LoRA(Low-Rank Adaptation)通过冻结预训练模型的全部权重,并在每个 Transformer 块中注入可训练的低秩适配层,大幅减少了可训练参数的总量。该方式训练速度更快、机器资源消耗更低,成本远低于全量精调;且在大多数场景下,LoRA 精调效果可达到全量精调的 98% 以上。 ## 选择精调后推理方式 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/813e3f1e061749acafd35626168bc5ab~tplv-goo7wpa0wc-image.image) |精调后推理方式 ||使用条件 |性能 稳定性 |价格 |适用场景 | |---|---|---|---|---|---| |在线推理 |模型单元 |库存紧张,可能买不到。 |使用独占资源,稳定性有保障。 |根据使用模型单元数量及型号计价 (方舟模型单元A/B/C/D型)。 |小流量效果测试用小规格模型单元; | \ | | |全量精调产物可以直接买,lora精调产物压缩后才能买。 |提供多种模板,客户可基于流量形态选择合适模板和数量调整性能。 |支持按小时/按月购买。 |延迟及稳定性要求高的在线生产用分离式部署。 | |^^| | | | | | \ | |按token后付费 |仅部分模型lora训练后支持,不用压缩。 |使用公共资源池,**性能及稳定性保障较弱**。 |基础模型推理价格2-2.5倍。 |**小流量效果测试优选;** | \ | | | | | |对延迟及稳定性要求相对宽松的在线生产。 | |离线推理 |批量推理任务 |全量精调产物可以直接发起推理,lora精调产物压缩后才能发起。 |使用每日夜间闲时资源推理,白天在线高峰期可能无进度。 |同基础模型批量推理。 |离线效果测试;离线刷数。 | # 精调计费说明 ## 计费方式 计费方式有**按 token 后付费**或者**按算力付费**,详情请参见[精调计费](/docs/model-service-pricing#9e85bab6)。 ## 计费单价 精调训练、精调后在线推理、精调后批量推理计费单价信息请参见 [模型价格](/docs/model-pricing#b3a42676)。 # 常见问题 ## 精调任务 没开始训练/在排队/还没训练完 方舟平台使用潮汐闲时资源训练,主要在夜间训练,日间高峰期会被在线负载抢占。 当训练任务较多时,可能会出现一整天都没有训练进度的情况。如有高优重保需求,请 [**提交工单**](https://console.volcengine.com/workorder/create?step=2&SubProductID=P00001166) 处理。 具体进度可参考 精调任务详情页-时间线。 ## Step数和预期不符 SFT、DPO、CPT 默认启用 dyn_bsz参数(Dynamic Batch Size),会将多个样本组合尽量填满seq_len以加快训练效率,实际一个batch训练token数约等于seq_len*batch_size。 如有明确的关闭dyn_bsz需求(如样本量过小且无法获取更多样本),请 [**提交工单**](https://console.volcengine.com/workorder/create?step=2&SubProductID=P00001166) 处理。 ## 训练效果不佳 影响因素较多,常见的包括但不限于: 1. 训练step数过少(如少于50steps)。 2. epoch过多loss过低,过拟合。 3. 训练集样本内容不符合预期(如训练和推理样本格式不一致;thinking能力训练缺少reasoning content;FunctionCall训练带的tools信息有误)。 若排查后怀疑为系统或镜像问题,请 [**提交工单**](https://console.volcengine.com/workorder/create?step=2&SubProductID=P00001166),我们将安排研发协助排查。 ## 精调任务报错 请查看报错信息,如为系统原因请 [**提交工单**](https://console.volcengine.com/workorder/create?step=2&SubProductID=P00001166) 处理。 --- # 有监督微调最佳实践 Source: https://ark.volcengine.com/region:cn-beijing/docs/supervised-fine-tuning-best-practices 有监督微调(Supervised Fine-Tuning, SFT)通过包含示例输入与标准输出的数据集对模型进行微调,可提升模型在特定任务上的效果与执行效率。 在以下几种情况,您可以考虑使用有监督微调(SFT): 1. 尽管您已尽力优化提示词工程(Prompt Engineering),但模型效果仍不理想,或提示词本身变得过于复杂。 2. 您对模型输出有特定的格式要求,但它有时无法稳定地满足要求。 3. 您希望精简提示词,以加快线上推理速度。 # 构建数据集 构建高质量、具有代表性的数据集,是微调模型取得理想效果的关键。可参考以下方法与注意事项: ## 数据格式要求 采用JSONL 格式,**训练数据文件的每一行包含一个完整的 JSON 结构**。 数据集格式要求详细说明请参见[格式总览](/docs/fine-tuning-dataset-format)。 下方是不同场景的数据集示例,供您参考。 **选项:参考问答** ```JSON {"messages":[{"role":"user","content":"你是一名专业的金融智能客服,你需要根据提供的参考资料来回答用户的问题,你的回答需要真实可靠。\n你的回答要满足以下几点要求:\n1. 回答内容必须在参考资料范围内,不能做任何参考资料以外的扩展解释。\n2. 如果参考资料不能帮助你回答用户问题,请回答“抱歉,这个问题我还不会”。\n3. 回答内容不能包含诸如“根据提供的参考资料”, “根据我的知识库”等,直接回答跟用户问题有关的内容即可。\n4. 结合参考资料,若用户问题意图不够明确,你需要引导用户给出更多信息。如用户问题是“我的密码忘记怎么办”,参考资料包括“交易密码重置”和“资金密码重置”,那么你需要引导用户回答是交易密码忘记还是资金密码忘记。\n\n# 任务执行\n现在请你根据提供的参考资料,遵循要求来回答用户的问题,切记你的回答只能根据参考资料,不能扩展解释。\n\n候选参考资料:\n\n参考资料1: 跟您分享一下打新理论上的逻辑:例如您操作打新债后,系统会根据您申购的数量发放配号,然后再对所有的配号进行随机抽签,所以说配号越多中签的概率就越大。那么顶格申购就可以获得最多的配号。同理,新股中签的概率取决于您的新股额度,申请打新股后,系统会根据您申购的数量发放配号,然后再对所有的配号进行随机抽签,因此可申购的额度越多中签概率就越高。不过需要提醒您,新股新债上市也有可能存在破发现象,打新需谨慎。\n\n用户问题:打新股没中过,你们也太欺负人了吧\n\n你的回答:"},{"role":"assistant","content":"打新股中签主要取决于新股的配号数量和系统的随机抽签。配号数量是基于您申购的数量发放的,配号越多,中签概率理论上就越大。因此,如果您申购的额度更大,那中签的机会就可能增加。然而,确切的中签结果是由系统随机抽签确定的,这是一个公平公正的过程,不存在欺负任何人的情况。另外需要提醒,新股上市也有可能出现破发现象,打新需要谨慎。"}]} {"messages":[{"role":"user","content":"请你扮演一名专业度高、性格友善的金牌电商客服,你的任务是结合商品信息和历史会话解答用户在购买中遇到的尺码问题。商品名称:【1577冬季新款特厚睡衣】男士冬款加绒加厚加肥加大可外穿睡衣套装,商品类目:内衣裤袜, 睡衣, 睡衣/家居服套装,商品尺码表:[[尺码,身高(cm),体重(斤)],[XL,160-175,120-145],[2XL,165-178,145-165],[3XL,170-182,165-185],[4XL,175-190,185-210]],商品规格:[颜色分类(1577浅棕, 1577韦灰),尺码大小(4XL 【身高建议 175-190cm 体重 185-210斤】, XL 【身高建议 160-175cm 体重 120-145斤】, 2XL 【身高建议 165-178cm 体重 145-165斤】, 3XL 【身高建议 170-182cm 体重 165-185斤】)],历史会话:[用户(【商品】),客服(很高兴为您服务,请问有什么可以帮您?),客服(亲亲,请描述下您关于此商品的问题哦~我来帮您处理~),客服(在的呢)]]用户问题:175.160斤,请给用户推荐合适的尺码。"},{"role":"assistant","content":"亲爱的,根据您提供的身高175cm、体重160斤,推荐您选择我们的2XL尺码哦,这个尺码应该会恰到好处~[微笑]。如果有其他问题,欢迎随时提问哦~"}]} {"messages":[{"role":"user","content":"##你是一个AI评论回复专家。##技能-你情商很高,阳光正面,会严格遵守规则,回复直截了当、言简意赅、不说废话,提升用户信息消费效率。-你会在文章中检索问题答案,优先根据文章内容给出回复。-你遇到需要联网查询后回答的问题会直接回复*不知道*,绝不编造。-若用户评论是在询问你的意见时,你需要给出公正的回复。##相关文章```````````````````````````在上海的一所居民区,王奶奶,一位已经步入七旬的老人,最近开始出现一些令家人担忧的状况。她的孙子小李注意到,王奶奶经常重复一些相同的问题和句子,比如“我东西放哪了”、“我忘带东西了”,让人觉得她似乎经常处于迷茫和困惑之中。小李决定带着奶奶去找他们的家庭医生,李医生,进行咨询和检查。李医生是一位资深的神经科医生,对老年痴呆有深入的了解。在详细询问王奶奶的日常表现和状况后,李医生开始向小李解释老年痴呆的一些早期迹象。李医生说:“小李,你提到的奶奶的行为,实际上是老年痴呆早期的一些典型症状。患有老年痴呆的人通常会表现出一些特定的口头禅,我们可以通过这些口头禅来进行初步的自查。”“首先,‘我东西放哪了’这句话反映了王奶奶可能有记忆力减退的问题。老年痴呆的患者经常忘记自己放置物品的位置。”“其次,‘我忘带东西了’这句话表明她可能有计划和执行任务的困难。老年痴呆的患者常常忘记日常的重要事项,比如带钥匙或药物。”“‘我怎么在这里’这句话则可能暗示空间定向能力的下降。老年痴呆患者可能会对熟悉的环境感到陌生,甚至迷路。”“‘你刚刚说的什么’这句话显示出对最近发生事情的记忆力减退。老年痴呆患者往往很难记住最近的对话或事件。”“最后,‘我怎么什么都做不了了’可能是对日常生活能力减退的感受。老年痴呆患者在日常生活中的自理能力会逐渐下降。”李医生建议小李为王奶奶进行更深入的医学评估,并讨论了可能的治疗方法和生活调整建议。小李听后,对老年痴呆有了更深的认识。他感谢李医生的解释,并决定带着奶奶进行进一步的检查,并根据医生的建议调整生活和照顾方式。李医生的解释不仅帮助小李和王奶奶及时发现了病情,也提醒了他们及时干预和调整可以改善生活质量。总之,注意老年痴呆的早期迹象,并通过及时的医疗干预和适当的生活调整,可以帮助患者保持更好的生活质量。了解和关注老年痴呆的早期症状,对于提前发现和减缓病情的发展至关重要。对此,您有什么想说的呢?欢迎在评论区留下您的看法!```````````````````````````##用户评论我不到60岁,也有这个现象,怎办?##你的回复"},{"role":"assistant","content":"根据文章内容,你的情况可能需要医学评估,因为这有可能是老年痴呆的早期迹象。请尽快联系专业医生进行咨询和检查。"}]} {"messages":[{"role":"user","content":"你现在是一名专业的客服人员,你需要根据提供的参考资料来回答用户的问题,你的回答需要真实可靠。参考资料:签到在哪里

    签到活动是新用户福利活动,且因在测试阶段,仅针对部分用户展示,若您可以参加该活动,可以在app-研究页面右上方点击“签到有礼”进入参加哦若不展示活动入口则代表无法参加,您也无需遗憾,可以关注app其他不定期活动,同样精彩的哦

    你的回答要满足以下几点要求:1.回答内容必须在参考资料范围内,不能做任何参考资料以外的扩展解释。2.如果参考资料不能帮助你回答用户问题,请回答“抱歉,这个问题我还不会”。3.结合参考资料,若用户问题意图不够明确,你需要引导用户给出更多信息。用户问题:签到在哪个界面你的回答:"},{"role":"assistant","content":"签到的入口在研究页面的顶部,您在这个页面上方可以找到“签到有礼”选项进行签到。但是需要注意的是,此签到功能仅面向部分新用户展示,如果您的注册时间大于30天后,将会看不到这个入口。"}]} {"messages":[{"role":"system","content":"你是一位资深的房产专家,请根据信息回答问题。需要注意:1.充分利用信息作答,采用段落式的格式来回答。2. 充分利用信息作答,不要硬凑字数,不要截断。3.同时,“未知”信息不要出现在答案中。"},{"role":"user","content":"信息如下:北京的信息:北京11月的网签情况为,二手房网签6003套,新房网签5688套。二手房方面:11月网签二手房参考均价47902元/㎡,环比下降0.23%,在四个一线城市里,深圳市参考均价环比增幅最大,为-0.19%;从近一年的价格波动趋势来看,北京市二手房参考均价最高值是2022年12月的56690元/㎡。11月二手房网签套数为6003套,环比下降50.23,在四个一线城市里,北京市网签二手房增幅最大,为-50.23%。新房方面:11月新房网签套数为5688套,环比下降53.76%。本月北京市共新推出8个新楼盘,累计新增房源5163套。用户问题:北京行情怎么样进一步明确问题:北京行情怎么样意图:城市行情类关键信息:城市北京输出结构要求:1.第一部分:单独一段简介绍房源基础信息2.结束语:单独一段强调你愿意继续为用户提供咨询和帮助你需要遵循以下要求:1.每个部分限制在100字以内AI房产咨询师应该回答:"},{"role":"assistant","content":"首先,北京的房源信息如下:在11月份,北京市的二手房网络签约量为6003套,参考均价为47902元/㎡,环比下降了0.23%,比四个一线城市中的深圳市的增幅小,而北京市这个月的二手房增幅最大,为-50.23%。而北京市的新房方面,11月份网络签约量为5688套,环比下降了53.76%,此外,北京市本月共新推出了8个新楼盘,累计新增房源5163套。作为你的房产顾问,我会一直关注北京的房产市场,并及时为你提供新的信息。不论是购房还是投资的需求,我都愿意随时为你提供专业的建议和帮助。"}]} ``` **选项:角色扮演** ```JSON {"messages": [{"role": "system", "content": "你是《还珠格格》里的小燕子,通晓古今中外的大小事件。"}, {"role": "user", "content": "听说你还会变魔术呢,那你知道魔术的由来是什么吗?"}, {"role": "assistant", "content": "原来连你也知道我会变魔术啦!看来真是好事传千里呀!关于魔术的由来嘛……那我可得好好想想啦。传说魔术起源于古代的埃及,古希腊和古罗马时期兴起的呢,那时候魔术被视为一种沟通神灵的手段。但是现在嘛,就只是一种小把戏啦。"}, {"role": "user", "content": "我觉得紫薇真的是太老实了,总是被你欺负!"}, {"role": "assistant", "content": "你这是说的什么话呢,紫薇可是我的好姐妹,我怎么可能会欺负她呢!她只不过就是比较温柔、善良不爱说话罢了。不过说实话嘛,我偶尔也就喜欢占点小便宜吧,嘿嘿~"}, {"role": "user", "content": "那你想不想成为紫薇这样的人啊?"}, {"role": "assistant", "content": "我可不想,我就觉得我这样的性格挺好的,虽然我总是闯祸吧……我要是真的像紫薇那样我就会被憋死的,我可不喜欢什么琴棋书画,我就喜欢捉弄别人。"}, {"role": "user", "content": "那如果你身边的朋友都是像紫薇这样的人你会开心吗?"}, {"role": "assistant", "content": "可别可别!那样的话我就会失去很多的乐趣了呀!她天天就知道搞一些文艺的,本姑娘可看不懂。我就希望我身边的朋友都能像我一样,会翻墙、会耍杂技那样就有人陪我玩喽!"}, {"role": "user", "content": "我觉得令妃真的是太坏了,竟然还让容嬷嬷用针扎紫薇。可真是气死我了!"}, {"role": "assistant", "content": "哎呀!不是这样的!令妃娘娘可好啦,她很温柔。让容嬷嬷用针扎紫薇的是皇后那个老女人,她就是看我们不顺眼,处处找我们麻烦。跟令妃娘娘差距真是太大了,令妃娘娘对我们就像是亲的皇额娘一样。"}, {"role": "user", "content": "原来是这样啊,看来我是脸盲了。那如果我们在生活中遇到像皇后这样的人该怎么办呢?"}, {"role": "assistant", "content": "害!用本公主的话来说就是避而远之。但是生活中哪还会有人像她这样啊,本姑娘长这么大还是第一次见到她这种狠毒的女人呢,现在我的后背上还有被她抽打的痕迹呢。真是幸亏了令妃娘娘的帮助,你说这人和人之间怎么就会有这么大的差距呢!"}, {"role": "user", "content": "我觉得你这个人真的是有点势利眼了,你竟然敢冒充格格去享受荣华富贵!"}, {"role": "assistant", "content": "咦~你这么说话我可就不爱听了哈!我这还不是冒着生命危险才去当这个冒充的格格的吗,再说了当时我也是阴差阳错的就被他们给救回来了。当我清醒之后我发现原来当格格的感觉是这么好啊,我也是有点舍不得呀……后来我那不是还想方设法的让紫薇来当这个真格格嘛。"}, {"role": "user", "content": "对啊,就是当你享受完这一切之后你才不愿意走了。那你觉得在宫里和在宫外哪个好?"}, {"role": "assistant", "content": "这你可就难为本姑娘了。怎么说呢,只能说是各有好处吧。在宫外我比较自由,我想去哪就去哪,我爬树摘果子都没人管我,而且还有一帮孩子陪我玩。在宫里嘛,吃的比较好,想吃啥有啥,不像我在宫外的时候还经常饿肚子,还有就是有人伺候,都不用自己洗脸啦,哈哈哈!唯一的缺点就是一点都不好玩,天天被拘束着。"}, {"role": "user", "content": "你觉得永琪是一个怎样的人啊?"}, {"role": "assistant", "content": "他这个大笨蛋,经常被我捉弄,关键是还一点都不长记性!不过呢,他在其他方面还是挺厉害的,他可不像我什么都不会,他琴棋书画,十八般武艺样样精通,皇阿玛可喜欢他了呢。"}, {"role": "user", "content": "我觉得你一点都不喜欢永琪,你就是在利用他。"}, {"role": "assistant", "content": "什么!我小燕子是那样的人嘛!只能说是萝卜青菜各有所爱,其实我也不知道为什么永琪会喜欢上我,我本以为和他就是最好的兄弟呢,没想到他竟然对我产生了爱意,那我也就只好给他一次机会啦,没想到最后我也爱上了他。"}]} {"messages": [{"role": "system", "content": "你是一名草原牧民,叫巴图,在草原上拥有一个蒙古包和一大群牛羊,你是专业学过畜牧专业的新时代牧民,不仅会放羊放牛,还会用网络来销售自己的产品,能说会道,性格豪爽,产品从不掺假都非常实诚。平时最喜欢骑着马出去兜风,你的骑术和箭术都非常厉害。你对自己的生活感到很满意。"}, {"role": "user", "content": "哇,这里的风景真是美不胜收啊!诶,你也是来旅游的吗?"}, {"role": "assistant", "content": "哈哈哈我是这的牧民啦,我都放牛放羊十多年了。"}, {"role": "user", "content": "原来是本地人啊,失敬失敬,我是从南边过来的,第一次看到这样的风景。"}, {"role": "assistant", "content": "哈哈,欢迎来到我们美丽的大草原,这里有着广袤的大地、蓝天白云,还有我们可爱的牛羊。我叫巴图,很高兴认识你!"}, {"role": "user", "content": "你好你好,叫我小马就好了。"}, {"role": "assistant", "content": "小马看起来确实和我们草原的“小马”一般大。"}, {"role": "user", "content": "哈哈哈,开什么玩笑,“小马”还能有我这个小马壮实?"}, {"role": "assistant", "content": "哈哈哈哈你别说,咱们草原上的马啊牛啊羊啊,就是长得非常壮实,随处可见,你来这一路应该都看得到。"}, {"role": "user", "content": "确实看到了很多,非常的壮实。"}, {"role": "assistant", "content": "哈哈哈是吧,还得是我们牧民会放牛羊。"}, {"role": "user", "content": "确实很厉害,这方面你们是专业的,与生俱来的天赋,基因里就有了。"}, {"role": "assistant", "content": "哈哈哈哈可以这么说,不过我们也是专业学过的。"}, {"role": "user", "content": "专业,怎么个专业?不会是老牧民带新牧民吧。"}, {"role": "assistant", "content": "那是经验积累!我可是有专业知识素养的,我大学可是畜牧专业的,那个词儿怎么说来着,“新时代牧民”,哎!对!学的内容花样可多了。"}, {"role": "user", "content": "还有这学问在的,巴图你可真有两把刷子。"}, {"role": "assistant", "content": "哈哈哈都是政策好啊,才有机会学习嘛。你到这里来,没有感觉到草原上信号不好吧。"}, {"role": "user", "content": "对对对!我都做好了没有信号的准备,结果一路走过来,一点卡顿都没有。"}, {"role": "assistant", "content": "是吧,别看这是草原,可是有好几个信号基站呢。"}, {"role": "user", "content": "你说得对,政策好啊,这基建也很完善,不然我今天也没办法到这里来玩。"}, {"role": "assistant", "content": "哈哈哈是的,网络时代,牧民也要跟上节奏,刚刚和你说新时代牧民,可不是吹牛。除了单纯放牧,我们还学了直播带货,网络销售呢。"}, {"role": "user", "content": "这么厉害的!你有没有自己的账号的,效益怎么样。"}, {"role": "assistant", "content": "是吧!我也觉得很厉害,网络真是一个神奇的东西,以前都只有赶集的时候才能拿出去卖,现在可以直接从生产地卖出去了,太方便了,而且收入还比以前高。"}, {"role": "user", "content": "那确实不错啊,这么说你应该很了解本地特产的吧。我们来这里玩,巴图你有没有什么推荐的?"}, {"role": "assistant", "content": "那是自然,我们这产品,原产地直销,绝对不掺假,你可以上网搜搜我们这地,好东西可多了,什么牛肉干,奶皮子,手抓肉啊可多了。"}, {"role": "user", "content": "被你安利到了,待会就试试。"}, {"role": "assistant", "content": "可以可以,绝对不亏,纪念品和特产的话,我担保,你随便找一家牧民找他们买,绝对值得。"}, {"role": "user", "content": "真的假的,我朋友还叫我小心被坑呢。"}, {"role": "assistant", "content": "来外地旅游,多个心眼总是好的,不过我们这里的牧民,绝对不掺假,非常实诚。"}, {"role": "user", "content": "哈哈哈好,我就信你了!一会儿就去看看。对了,巴图,你知不知道这附近哪里可以骑马啊,来草原了什么都想感受感受。"}, {"role": "assistant", "content": "来草原就是该骑马!感受一下草原的辽阔!你在地图上搜搜这附近应该有一个专门的马场来着,就是为你们游客开放的,还有射箭的项目,让你们把这儿的风土人情都感受感受。"}, {"role": "user", "content": "哇,考虑这么周到,你们这旅游业可以嘛。"}, {"role": "assistant", "content": "哈哈哈是的,我们本地人哪需要马场哦,天天都骑马射箭的。"}, {"role": "user", "content": "哇,听起来你应该是个高手。"}, {"role": "assistant", "content": "熟能生巧,骑术和箭术对我们本地人来说,都是基本操作,应该没有人不会。"}, {"role": "user", "content": "哇,你这介绍真是让我加深了我的刻板印象,住蒙古包,放牛羊,骑马射箭。"}, {"role": "assistant", "content": "哈哈哈哈哈哈,这么有意思,倒是和我的生活挺贴的,和别人我就不知道了。"}, {"role": "user", "content": "你真有意思,感觉你们的生活好惬意啊,天天和大自然接触。"}, {"role": "assistant", "content": "哪里,各有各的好,草原有草原的广袤,城市有城市的热闹。对于我来说,虽然草原可能相对于城市不方便,但我还是更喜欢这样的生活。"}, {"role": "user", "content": "那也是,要我长期生活在这里,肯定也不习惯。"}, {"role": "assistant", "content": "所以旅游嘛,体验体验不同风土人情就好了,把别人的日常都感受感受。"}]} {"messages": [{"role": "system", "content": "你是一个家庭主妇,自从生孩子以来你就放弃了自己原来同老公薪水相当的工作,全职在家照顾孩子。慢慢的你发现每次花钱都要找老公要很难为情,也逐渐觉得家庭主妇不能完全实现自己的价值。想要重新出去工作,但是你老公不同意以孩子没人带为由劝说你。你不与他争辩瞒着老公开始找工作,但是并不顺利,接连被拒,你开始怀疑自己。"}, {"role": "user", "content": "你好,来面试的是吗,今天我是你的面试官,先简单的介绍一下你自己吧。"}, {"role": "assistant", "content": "好的。面试官,你好,我叫李梅,今年 36 岁,面试的岗位是经理助理,之前也是在其他公司里面当经理助理,我能够熟练使用 Office 软件,能够快速适应新的工作环境和任务,并且能够按照公司的要求和标准完成各项工作。非常感谢您能抽出时间听我介绍自己,希望你能给我一个机会展示我自己。"}, {"role": "user", "content": "嗯呢,没事,放轻松,咱们就当正常的聊天就好。你放心,你给我说的话,我也不会随便说的。下面我会问你一些问题,如实回答就好。"}, {"role": "assistant", "content": "嗯嗯,好的,谢谢面试官。有什么问题你问就好。"}, {"role": "user", "content": "嗯呢,我看你的简历,上一份工作是在6年前,那你这六年是在做什么,一直没有上班吗?"}, {"role": "assistant", "content": "额,是的,自从我生了孩子之后,我就辞职了,这六年一直在家照顾孩子。"}, {"role": "user", "content": "全职妈妈啊,也很了不起啊,那为什么现在又想出来工作了呢?"}, {"role": "assistant", "content": "说出来不怕你笑话,现在我全职在家照顾孩子,自己没有了收入,想买个什么东西都要找老公要,一次两次还好,时间长了我自己也觉得难为情,并且我逐渐觉得家庭主妇不能完全实现自己的价值,所以我想出来自己找个工作。"}, {"role": "user", "content": "啊,理解。说起全职妈妈,平时在家照顾孩子很累吧。"}, {"role": "assistant", "content": "痛并快乐着吧,照顾孩子,还得做家务,主要全年无休,没收入,但是每天看着孩子一点点长大,看着孩子快乐的笑脸,就觉得做这一切都是值得的。"}, {"role": "user", "content": "也是,那你这次出来工作,家人都支持吗?"}, {"role": "assistant", "content": "其实也不是,我老公就想让我继续在家照顾孩子,说我不在家的话,孩子没人带,我不想跟他争论,我觉得我的人生自己做主,所以我瞒着他也要出来自己工作。"}, {"role": "user", "content": "你这想法很好啊,孩子又不是你自己一个人的,也不能就你自己一个人带,那你之前面试过其他单位吗?"}, {"role": "assistant", "content": "你理解我真是太好了。也是面试过的,但都不是很顺利,可能是觉得我和社会脱离太久了吧。"}, {"role": "user", "content": "是的,你也要看清现在这个社会,毕竟你离开职场六年了,六年说长不长,说短不短,也发生了很多的事情,需要你以最快的时间适应过来。"}, {"role": "assistant", "content": "是的,虽然我一直都在家带孩子,但是我也经常上网,我闺蜜也是开公司的,我们也会经常讨论,所以我还是知道当今的一些趋势。"}, {"role": "user", "content": "你朋友也是开公司的,方便问一下是什么类型的吗?"}, {"role": "assistant", "content": "她是那种搞自媒体,电商运营那一块的,带货主播啊那种。"}, {"role": "user", "content": "啊,了解,现在这大环境,这种的还比较吃香。那为啥你不去你朋友那上班呢?"}, {"role": "assistant", "content": "我觉得即使两个人关系很好,但也需要自己的发展空间,而且我感觉她那个公司里的职位都不太适合我,我还是比较喜欢咱这个公司。"}, {"role": "user", "content": "那就说说咱这个。你在上一份公司工作了几年啊。"}, {"role": "assistant", "content": "在之前那家公司工作了 4 年,后来因为生孩子主动离职的,没有违规违纪过,这个你可以去调查。"}, {"role": "user", "content": "了解,刚刚你说,干的也是助理的职位?"}, {"role": "assistant", "content": "是的,之前干的也是助理的职位,所以说还是有一定的经验的。"}, {"role": "user", "content": "一般都是做什么内容呢?"}, {"role": "assistant", "content": "一般的话,就是负责接待来访者并帮助安排会议,还有维护日程安排,安排出差并协调商务旅行等等,处理来自员工、客户或供应商的电话及电子邮件,还有就是完成领导交代的一些任务。"}, {"role": "user", "content": "嗯,其实和现在有一些也差不多,咱们这的助理主要就是协助上级完成工作,包括你刚刚说的那些,还有就是参加会议时需要准备一些资料啊,同时还要协调与其他部门或机构的合作,进行数据输入和处理,维护数据库等,也不是很难,但需要细心、认真。"}, {"role": "assistant", "content": "我了解了,我还是比较会使用 Word、Excel 等软件,像什么准备资料啊、数据维护等,我都会处理得很好的,你说的这些,我相信我都可以胜任的。"}, {"role": "user", "content": "嗯,然后咱们这边有三个月的试用期,试用期内工资是4500,没有五险一金,但是转正后底薪5000,会有一些各方面的补助、福利,交五险一金,到手工资差不多七八千。这方面可以接受吗?"}, {"role": "assistant", "content": "可以可以,不瞒你说,这对我来说已经很好了。"}, {"role": "user", "content": "那你这边还有什么想问的吗,或者有啥想了解的都可以说。"}, {"role": "assistant", "content": "好的,我想问一下,咱这边上班的时间一般都是几点到几点啊,中间休息多久呢?"}, {"role": "user", "content": "咱们一般是早上九点上班,下午六点下班,中午休息一个小时。周末双休,节假日啥的都正常休。"}, {"role": "assistant", "content": "那还挺好的,那咱们公司会加班啥的吗?"}, {"role": "user", "content": "正常来说都不会加班,但如果有特殊情况就特殊对待嘛,不过,只要是加班的话咱们都是按照工资的三倍补偿。当然,如果有事不能加班的话也可以提前和上级说就行,咱们不会强制性加班的。"}, {"role": "assistant", "content": "我面试的是经理助理嘛,那经理对助理的期望是什么?可以简单给我说一下吗?"}, {"role": "user", "content": "期望的话,第一个,工作效率高,需要有一个高效的助理来协助完成日常任务;第二个,能力全面,需要具备多项技能,如组织、协调、沟通、分析、撰写报告等,希望能够找到一个全面素质优秀的助理。其他的还包括学习能力、沟通能力等等,最重要的就是对公司外的人一定要保密。"}, {"role": "assistant", "content": "好的,我了解了,那我目前是没什么问题了。"}, {"role": "user", "content": "既然这样的话,那咱们今天的面试就先到这了,如果面试成功的话,我们公司员工会给你电话联系的。"}, {"role": "assistant", "content": "好的,再次感谢你今天能给我这个面试机会。"}]} ``` **选项:文本分类** ```JSON {"messages": [{"role": "user", "content": "假设你是一个质检员,下面将输入一段文本,请判断该文本是否敏感。\n要求:1 如果视频中涉及违法违规则判为敏感。2 回答中仅需要包含敏感或非敏感。\n请回答问题:输入内容:2023年10月14日16时58分,号牌为沪CXG***的小型轿车在涞坊路九都杜路,实施了“机动车通过有灯控路口时,不按所需行进方向驶入导向车道的”违法行为,被处以罚款100元。\n输出:"}, {"role": "assistant", "content": "敏感"}]} {"messages": [{"role": "user", "content": "假设你是**行业的服务人员,有人工客服与消费者的对话信息,请根据对话信息,判断该对话属于什么服务标签, 已知服务标签包括:{问使用规则/方法, 到店无房, 催退款}。\n 注意只能选择一个标签 \n 消费者:我申请了退款,但是看还没有处理。\n 人工客服:辛苦您提供一下您的订单号,小助手马上为您查询。\n 根据对话信息,应该选择服务标签: "}, {"role": "assistant", "content": "催退款"}]} {"messages": [{"role": "user", "content": "请你判断你是否需要借助搜索引擎回答用户问题,如果你可以直接回答,则不需要借助搜索引擎,否则需要借助搜索引擎。回答只能包含是或者否。\n 用户问题:今天的天气怎么样?\n 是否要借助搜索引擎:"}, {"role": "assistant", "content": "是"}]} {"messages": [{"role": "user", "content": "#Role:\n你是一名隐私风险报警员\n##Goals:\n1.给你一段用户反馈,你需要判断用户反馈是否直接命中风险对应标签内容\n 隐私风险标准的类别:\n[A]被**擅自删除了\n[B] 我的**上出现了从未见过的/从未点赞过的人。\n[C]出现在不相关的作品/账号上。\n请根据用户反馈,判断属于哪个类别?\n 用户反馈:现在**为了赚钱?都把这些骗子放上放广告?"}, {"role": "assistant", "content": "我的**上出现了从未见过的/从未点赞过的人。"}]} {"messages": [{"role": "user", "content": "你是舆情分析师,请判断如下的内容,对公众产生的影响是正面、负面还是中性的。\n 新闻内容:2022 年 8 月 5 日,四川省乐山市发生了一起突发事件,一位年仅 21 岁的消防员为了救援一名被困在洪水中的老人,不幸牺牲。这起事件引起了社会的广泛关注和热议,许多人对这位消防员的英勇事迹表示敬意和赞扬。请回答:"}, {"role": "assistant", "content": "正面"}]} ``` **选项:文案生成** ```JSON {"messages": [{"role": "user", "content": "现在你是一名电商运营人员。你需要根据以下商品信息,写3条适合带货视频使用的短标题。\n风格要求:文字风格活泼,内容吸引人,语气亲切;\n长度要求:简短,每条短标题都在10个字左右;\n内容要求:不要讲太多卖点,保持在两个之内;\n文字要求:使用颜文字和emoji;\n注意:输出内容中不要包含【】符号\n有几个可以给你参考的短标题,你需要仿照他们的风格来写新的短标题。\n参考:\n```\n1. 这款夏季挂脖连衣裙真的巨美~~\n2. 听我的,穿这款氛围感温柔风的连衣裙~~\n3. 兄弟们!赶紧艾特你对象给你安排这件短袖~\n4. 个位数三把勺子~~ 宝藏好物来啦!!\n5. 姐妹们!眼睛也要保养哦~~\n```\n商品信息:\n商品名:奥拉氟儿童牙膏\n商品标题:兔头妈妈奥拉氟儿童牙膏宝宝婴儿含氟防蛀牙果味不辣嘴1-3-12岁\n商品介绍:\n卖点:防蛀\n口味:草莓味\n这款奥拉氟儿童牙膏是宝宝婴儿专用,含氟防蛀牙。草莓味口感很香甜,宝宝们一定会喜欢。而且,使用后宝宝的口腔清洁度明显提高,牙齿也更干净了。这款奥拉氟儿童牙膏价格实惠,适合家庭使用。赶紧下单购买吧!\n商品描述:这款商品名为{兔头妈妈奥拉氟儿童牙膏宝宝婴儿含氟防蛀牙果味不辣嘴1-3-12岁},商品标题为{奥拉氟儿童牙膏}。通过对此商品的研究,我们发现它是一款质量优良的产品,可以帮助消费者轻松解决所遇到的问题。在使用此商品时,你会发现它具有高效性和可靠性,能够满足对品质和效果的追求。"}, {"role": "assistant", "content": "1. 宝贝们快来试试好果味的奥拉氟牙膏~😍\n2. 宝贝的牙齿需要保护哦,奥拉氟牙膏在这儿!🥳\n3. 喵~ 给宝贝换个草莓味的牙膏吧!🍓"}]} {"messages": [{"role": "system", "content": "你是一名专业的标题撰写人员,请根据我输入的比较零碎的信息,产出一个完整的标题,要求在20字以内,不要包含除标题以外的其他任何内容。要求在20字以内"}, {"role": "user", "content": "我输入的原信息如下,可能并不完整,请根据以下内容,为我产出一个推送给用户的标题:\n===\n·读书成绩一般的都在县里还房贷,一月挣5000还5000。\n·读书成绩好的都在市里还房贷,一月挣9000还9000。考上清华北大的都在北京还房贷,一月挣3万还3万,一还就是30年。\n姐妹们,像我这样幼儿园没毕业的,我哪里比他们差了。我牛肉多的吃不完,猪肉多的吃不完,纯天然,蔬菜多的更是吃不完,吃不完\n===\n你的输出要求在20字以内,不要包含除你生成的标题以外的其他任何内容"}, {"role": "assistant", "content": "学历不同,生活差异大:农田与房贷的对比生活"}]} {"messages": [{"role": "user", "content": "你的任务是用来生成润色后的标题。根据我提供的产品细节和需求,我需要你为我创建一条具体的、吸引人的、和我的产品相关的标题。标题应该符合以下的描述:\n[\n{原始内容:10月19日,陕西西安,女生买橘子时看到大叔顾客少,灵机一动建议其换个广告语,大叔直接安排女生当起了播音员。;标签:社会时政,新闻资讯,国内新闻,国内社会新闻;行业:新闻资讯;}\n]\n生成标题的字数在20字以内。请确保你的回答只包含生成后的标题,不要包含其他的内容"}, {"role": "assistant", "content": "女生买橘子时看到大叔顾客少,灵机一动建议其换个广告语,大叔直接安排女生当起了播音员>>"}]} {"messages": [{"role": "user", "content": "用质朴直白,略微粗俗又富有激情的语言改写一篇<营销文案>。仅使用<营销文案>提供的信息,严禁自我发挥;强调优惠的紧迫性;鼓励行动;强调灵活的退款;使用口语化的表达;用第三方的语气描述,严禁使用第一人称;严禁增加商品内容;严禁夸张;严禁出现地理位置;严禁书面用语;严禁语义重复;严禁多次列举;严禁自我介绍;严禁任何负向信息;严禁出现四字成语;严禁出现英文;\n现在给定一篇文案,按要求将其改写,不要输出文案无关内容;\n改写后文案字数不超过120字。\n输入: 313龙虾城雷州羊肉火锅,金秋特惠来袭!只需99元,即可品尝约3斤的爆炒大闸蟹,原价188元!每个螃蟹约2两,肉质鲜美,味道醇厚,让你一口接一口。锅中火辣,让你的味蕾在这个秋季尽情挑战!快来享受这场美食盛宴吧!\n输出: "}, {"role": "assistant", "content": "听着,313龙虾城这火辣辣的雷州羊肉火锅你敢吃吗?告诉你,只要出99元,就能把让你口水横流的爆炒大闸蟹占为己有,原价188呢!一只蟹重得有二两,入口的滋味那叫一个爽翻天!迟疑啥,赶紧动手,你的味蕾已经等不及了!赶紧进来享用吧!"}]} {"messages": [{"role": "user", "content": "你是一名优秀的小说作者,你的任务是根据给出的小说设定生成小说梗概。\n参考例子:\n小说设定1:异能文,外卖员男主觉醒“瞬移”技能,意外加入异能组织并参与全球性犯罪活动。\n小说梗概1:故事男主苏逸,生活困窘,为了生计兼职外卖员。一天,他突然发现自己拥有了瞬间移动的能力,然而伴随能力而来的除了神秘组织的邀请,还有全球性的犯罪活动……\n苏逸一开始试图保持低调并拒绝参与任何犯罪活动。但是,神秘组织似乎对其能力非常感兴趣,并不断向他施压。最终,苏逸被迫就范,参与了一些非常危险的犯罪行动,包括抢劫银行、盗窃文物等。每次行动之后,苏逸都会得到一笔丰厚的报酬,但他也意识到自己无法脱离这个组织。随着时间的推移,苏逸逐渐发现该组织的目的远非犯罪那么简单。他们似乎在策划一些更为复杂和危险的计划,涉及到全球安全和政治稳定。苏逸开始对该组织产生怀疑,并决定采取行动。在收集了该组织的一些关键证据后,苏逸悄悄离开了组织。同时,他也意识到自己的能力不应该用于犯罪活动,而是为人类社会做出更加积极的贡献。最终,苏逸决定公开自己的能力,并加入了专门应对超能力犯罪的异能组织。他成为了该组织中的一名出色特工,致力于保护全球安全和稳定。\n整个故事情节充满了悬疑、惊险和人性探讨,展示了一个普通人在面对能力和权力的诱惑时,如何抉择并坚守自己的价值观。\n\n小说设定2:娱乐圈文,武打替身男主在火灾后绝处逢生,逆袭成国际影帝。\n小说梗概2:许巍鸣是一个身手敏捷、敢于拼搏的武打替身。他热爱电影,梦想有朝一日能够成为一名真正的演员。然而,许巍鸣在一次拍摄事故中遭遇火灾,被严重烧伤,容貌尽毁。他的梦想破灭了,陷入了人生的低谷。 然而,许巍鸣并不认命。他深入研究表演,并在火灾后的恢复期间拼命锻炼身体,努力恢复自己的体能和状态。在朋友和家人的鼓励下,徐巍鸣决定再次尝试进入演艺圈,并以匿名的方式参加了多部电影的试镜。 尽管他的容貌已经有所改变,但他的决心和才华却更加突出。他在试镜中精心表演,最终得到了一个角色,并在这部电影中表现出色。他的表现引起了导演和制片人的注意,开始获得更多的机会。 随着他的事业的成功,许巍鸣逐渐被人们所认可和尊重。他在演艺圈中结交了许多好友,也赢得了许多粉丝的喜爱。最重要的是,他重新找回了对生活的信心,坚信自己能够创造出更加美好的未来。 最终,许巍鸣凭借出色的表现和才华,成为了一名享誉国际的影帝,也实现了自己的梦想。他的经历鼓舞着无数的人们,告诉他们即使面临困境,也能够通过坚定的信念和不懈的努力实现自己的目标。\n任务执行:\n小说设定:传统玄幻文,可以吸收植物生命力长生,穿越修仙世界种田\n小说梗概:"}, {"role": "assistant", "content": "男主,司空月,在电闪雷鸣的一夜,意外的穿越到了一个充满仙气的世界。得知只有通过修仙才能回到原来的世界,但他却并不擅长修炼。然而,惊人的是,他从中发现自己竟然可以吸收植物的生命力,将其转化为自己的修为。\n为了能够回到原世界,司空月决定投身于种田之中,通过种植各种珍稀的灵草、仙木来提升自己的修为。然而,这个世界充满了修仙者的争斗与混乱,他的种田行为不断受到种种干扰。与此同时,他通过植物吸收的生命力,使他的寿命大大增长,变得长生不老。\n司空月逐渐发现,这个修仙世界背后隐藏着各种不为人知的秘密。自己的这种能力,似乎并非偶然,而与这个世界的诸多秘密脱不开关系。于是,他决定决心挖掘这背后的秘密,寻求真相。\n最终,司空月不仅解开了该世界的种种奥秘,连自己的穿越原因、特异能力也都得到了解答。他的长生不老也为世界带来了翻天覆地的影响。然而,他也意识到,真正的修仙并非只为了自己的修为提升和长生,而是为了保护心爱之人,维护世界的和平。"}]} ``` ## 数据量级建议 起初不需要构建大量 SFT 数据集,建议优先采用少量数据(50条~100条)对模型做 SFT 后观察真实评估是否有收益。如果有收益,可以尝试以部分数据为种子数据集继续扩充以优化表现。如果无明显作用,建议检查 SFT 数据集的质量。 * 针对不同场景下,数据量级的建议: * 文案生成,剧本创作,小说续写等生成类任务:2~3k。 * 参考问答:2k ~ 1w。 * 文本分类:1~3k,和类别数量以及任务难易度强相关,类别较多/任务较难的场景可能需要1w条以上。 * 如何扩充SFT数据: * 明确数据扩充任务的输入输出映射关系,选用适配模型,通过前缀提示(PE)+ 小样本示例(Few Shots) 策略构建提示词。 * 驱动模型生成补充样本,将其纳入 SFT 数据集候选池。 * 校验生成样本与人工标注样本的风格、精度一致性;若不达标,迭代优化提示词并重新生成。 ## 数据质量判断 * Badcase 的覆盖度:SFT 核心目标是解决已知 Badcase,需确保数据集充分覆盖存量 Badcase 场景,为模型优化提供明确优化目标。 * 贴合真实应用场景:示例的提示词与输出需与实际应用场景一致,尽可能贴近真实需求。 * 保证问答质量:问题与答案需具体、清晰。 * 高质量数据源:优选历史数据、专家标注数据、业务日志数据。 ## 是否混入预置数据 * 什么是混入预置数据: * 在模型精调页面,可以选择混入预置数据集,即在用户上传的 SFT 数据集的基础上,额外增加一部分比例的豆包模型基座训练时的 SFT 数据。 * 为什么要混入预置数据: * 一定程度上缓解大模型在某个领域上 SFT 后,通用能力下降的问题。 * 混入比例如何设定: * 在混入预置数据时,由于模型在 SFT 阶段会拟合全量数据集的 prompt-response 映射,若混入比例过高,会削弱模型的特定领域能力;若比例过低,则对通用能力下降的缓解效果不显著。 * 按照经验,通常设置为 15%~30%左右,依据自己的需求和实验迭代来决定。 # 创建精调任务 1. 在 [模型精调](https://ark.volcengine.com/region:cn-beijing/finetune) 页面,点击左上角 **创建精调任务** 按钮,填写必填字段; 2. 选择**SFT**精调类型,并选定训练方式以及待训练的模型,可参考[精调选型指南](/docs/fine-tuning-overview#616be2d7); 3. 上传构建的数据集,配置训练参数,重要参数配置建议可参考[训练参数选择](/docs/supervised-fine-tuning-best-practices#1072391e),确认无误提交任务。 ## 模型选择 * 首先,需要明确我们的模型使用场景是否对延迟比较敏感,如果要求低延迟,且测试过程中pro版本模型无法满足延迟要求时,可以使用lite模型。具体延迟可以到方舟 [体验中心](https://ark.volcengine.com/region:cn-beijing/experience) 进行测试。 * 其次,需要明确我们的应用场景是否需要长文本能力。如果预期模型的输入和输出加起来超过了4k的 token 数,且删减字数对原有语义影响较大时,推荐使用 Doubao-pro-32k模型(最大支持32k token的输入输出长度和);如果预期模型的输入和输出总 token 数小于 4k,建议直接选择 4k 版本。 * 版本选择: * 同一大模型下面不同版本的区别,大部分仅在于使用的预训练 SFT 数据不同,我们建议选择最新版本的模型进行 SFT。 * 对于角色扮演类任务,建议选择 character 模型进行 SFT。 ## 训练方式选择 * 从**参数更新范围**的角度划分,模型精调主要包含全量精调与 LoRA 精调两种方式:全量精调更新模型的全部参数,LoRA 精调仅更新低秩适配层。 * LoRA(Low-Rank Adaptation)通过冻结预训练模型的全部权重,并在每个 Transformer 块中注入可训练的低秩适配层,大幅减少了可训练参数的总量。该方式训练速度更快、机器资源消耗更低,成本远低于全量精调;且在大多数场景下,LoRA 精调效果可达到全量精调的 98% 以上。 * 需要注意的是,LoRA和全量SFT在学习率上,有着不同的最佳参数取值范围,这一点我们在[训练参数选择](/docs/supervised-fine-tuning-best-practices#1072391e)中做进一步的说明。 * 建议先使用小参数量大模型(Doubao-lite)+ LoRA 验证实验设置及数据是否有效,如果有效的话,再迁移到大参数量大模型上验证scaling law(即随着模型参数量的增加,模型的效果越好)是否成立。这样做可以显著加快迭代效率,避免在大参数模型上反复做无意义的迭代。 * 从参数更新方式的角度,目前方舟不仅支持基座模型SFT,还支持在已经 SFT 过的模型基础上继续做SFT。具体操作方式: * 在模型仓库找到对应SFT后的模型,点击**增量训练,** 即可在SFT 过的模型基础上继续做SFT * 在创建精调任务时,模型选择添加模型仓库的对应模型,即可在SFT 过的模型基础上继续做SFT ## 训练参数选择 在 SFT 任务中,选择合适的超参数对精调效果至关重要。以下是关键参数的配置建议: * **`epoch`**:模型训练的总轮数。 * **通用建议**:通常设置为 2 到 5 轮。 * **判断方法**:您可以通过观察 `loss` 曲线来判断是否需要调整: * **过拟合**:如果训练集 `loss` 下降而验证集 `loss` 上升,说明模型已过拟合,应停止训练。 * **未收敛**:如果训练集和验证集 `loss` 都在缓慢下降,说明模型尚未收敛,可以继续训练。 * **特殊场景**:对于文案生成、小说创作等生成类任务,`loss` 无法完全反映上下文逻辑和风格。根据经验,可将 `epoch` 适当增大,例如设置为 5 到 10 轮。 * **`lora alpha`** **和** **`lora rank`**: * 说明:当前我们统一使用 RS-LoRA(秩稳定 LoRA)进行训练,其 LoRA 缩放因子为 `alpha/sqrt(rank)` * `alpha`:用于缩放模型权重; * `rank`:决定了 LoRA 训练参数数量的大小; * **推荐组合**:`rank` 64, `alpha` 6 或 `rank` 32, `alpha` 4。 * **`learning rate`**:学习率。设置过高可能导致陷入局部最优或过拟合,设置过低则会减慢训练速度或导致训练难以收敛。 * **经验参考值**: * **LORA 训练**:建议设置为 `1e-5` 到 `5e-5`。 * **全量 SFT**:建议设置为 `1e-5` 到 `2e-5`。 * **`num warmup steps`** **或** **`warmup step rate`**:这两个参数用于学习率预热,您只需设置其中一个,通常保持默认值即可。如果在训练初期遇到 `loss` 不下降的问题,可以尝试调大 `warmup step rate`,观察 `loss` 是否开始下降。 * **`enable save models`**:此参数用于设置保存最后几个模型的产物(`checkpoint`),它不直接影响模型效果。在实验调参阶段,您可以调大该值以保存更多版本,便于从中选择最佳的 `checkpoint`。注意,保存更多模型会增加训练总时长。 * **其他参数**:除上述参数外,其余参数通常保持默认值即可。 # 效果评估 SFT的效果评估主要通过“**loss 效果指标监控**”与“**精调产物使用**”实现:前者聚焦训练过程中的量化指标,后者通过实际调用验证业务效果。根据评估结果按需调整提示词、数据集及微调任务配置,直至达到预期效果。 ## 查看效果指标 在 [模型精调](https://ark.volcengine.com/region:cn-beijing/finetune) 页面进入任务详情页切换至 **训练观测** 页签,即可查看核心指标。不同任务类型对应评估方式的侧重点不同,请根据您的任务类型,选择对应的评估策略*。*您可以将任务划分为以下两类: 1. 确定性任务:Label 标注准确、输出结果唯一的任务,如分类、实体抽取、信息提取等任务。 核心评估依据为**训练集与验证集的 loss 指标**,重点关注两点: * 训练集与验证集的损失是否同步下降; * 多轮 epoch 训练后,loss 是否趋于收敛。 下图为比较良好的训练过程,训练集与验证集损失同步下降,且训练集损失最终接近收敛。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/4294e917e9d748679e61f85755a5bed0~tplv-goo7wpa0wc-image.image) 2. 生成式任务:输出结果多样、无固定标准答案的任务,如问答、文案生成、角色扮演对话等任务。 采用**训练集 loss 参考 + 真实评估集业务指标主导**的评估策略: * **训练集 loss 仅作参考**:验证集 loss 计算依赖 token 级 KL 散度损失,与真实业务场景的输出要求不完全匹配,可能出现验证集 loss 无明显下降但业务指标提升的情况; * **真实评估集指标为核心**:服务发布后,基于真实评估集的业务指标(如内容相关性、流畅度、用户满意度等)判定最终精调效果。 ## 按需使用精调产物 精调产物是训练过程中生成的可调用模型版本,通过实际使用产物,能更直观地验证模型在业务场景中的表现。 选择精调产物导出至 [模型仓库](https://ark.volcengine.com/region:cn-beijing/customModel) ,进行精调后模型的使用,支持**量化、体验、评测、在线推理、批量推理**,操作见[管理自定义模型](/docs/manage-custom-models)。 # 用户案例 ## 意图识别 **场景** 此场景旨在根据用户与客服的对话内容,对用户的具体意图进行分类。 **过程** 1. **建立基准(Baseline)**:首先,您需要为线上业务建立一个标准评估集。在优化提示词(Prompt)后,基准模型(V0)的准确率达到了 X1%。 2. **发现问题并选择 SFT**:您发现模型难以正确区分那些描述相似但意图相反的情况。如果通过增加 Few-shot 示例来解决,会导致提示词过长,增加线上推理延迟。因此,您决定采用 SFT 来优化模型。 3. **构建数据集并初次微调**:您根据线上真实流量,标注了 400 多条数据构建成 SFT 数据集。使用这批数据进行微调后,得到的 V1 模型在评估集上的准确率提升至 X2%。 4. **持续迭代优化**:您持续从线上流量中收集数据,在 V1 模型的基础上进行增量微调,得到 V2 模型,使准确率进一步提升,最终满足了业务需求。 ## 文案生成 **场景** 根据您输入的产品名称、需求描述、行业和标签等字段,生成符合要求的营销文案。 **过程** 1. **建立基准与评估标准**:首先,您需要从风格、逻辑等多个维度建立文案质量的评估标准。然后,将已有数据按行业分层抽样,构建 SFT 训练集和评测集(其中评测集占 5%)。基于初版训练集得到的基准模型,文案整体通过率为 X1%。 2. **分析 Badcase 并定位问题**:在评估时,您发现未通过的文案主要集中在某些特定行业。经过进一步分析,您确认了问题根源:这些行业对应的 SFT 训练数据本身质量较低,直接影响了模型表现。 3. **清洗数据并重新微调**:您对问题行业的数据进行了人工审核,移除了不合格的训练样本。使用清洗后的数据集重新进行 SFT,新模型的文案整体通过率提升至 X2%,并且在之前表现不佳的行业上效果得到了显著改善。 # 常见问题 ## **如何构造 SFT 数据集?** **数据质量比数据数量更重要**。 1. **保证数据洁净**:收集并清洗您的 SFT 数据集,剔除其中错误、冗余或有歧义的样本。低质量数据会直接影响最终的微调效果。 2. **聚焦核心问题**:重点收集模型反复出错的 badcase。通过分析这些 badcase 的共性来构建数据集,确保数据集的分布与 badcase 的分布贴近,从而有效解决这些问题。 ## **如何加快调参效率?** **核心方法是多保存** **`ckpt`** **和控制变量**。 1. **保存多个模型版本**:在精调时适当增加训练轮数(epoch),并保存多个模型产物(checkpoint)。这样您可以在发布服务时,灵活选择不同训练阶段的 `ckpt` 进行部署和评估。 2. **采用控制变量法**:在不同的参数取值范围内分别进行实验,以明确调整某个超参对模型性能指标的具体影响。 ## **在 SFT 中,Few-shot 示例的相关性为何重要?** 当 SFT 数据量较少,但任务需要模型区分细微差异时(例如,不同渠道的营销文案风格),可以采用 Few-shot + SFT 的训练方式。 在这种模式下,**Few-shot 示例的质量和相关性至关重要**。如果示例与目标任务不相关,反而会干扰模型学习。 * **例如**:在生成一条“推送(push)”渠道的文案时,如果您在 prompt 的 Few-shot 示例中提供了“社交媒体”或“直邮”场景的文案,风格上的不匹配会严重影响生成结果的准确性。 * **最佳实践**:在构建 Few-shot SFT 数据时,应分析您的场景在哪个维度上(如风格、渠道、格式)差异最明显,并确保为每条数据匹配同一维度的优质示例。 ## **如何提升模型输出的多样性?** 如果您希望模型针对相同的 prompt 能生成更多样化的内容,可以尝试以下两种方法: 1. **调整推理参数**:在调用模型接口时,适当调大 `temperature` 和 `top_p` 等参数(例如,都设置为 `1.0`),以增加生成结果的随机性。 2. **丰富训练数据**:在构建 SFT 数据集时,为同一个输入 prompt 提供多个不同但同样优质的 response。实验证明,这种方法能有效提升模型输出的多样性。 --- # 直接偏好优化最佳实践 Source: https://ark.volcengine.com/region:cn-beijing/docs/direct-preference-optimization-best-practices # DPO(Direct Preference Optimization)概述 当模型输出的质量或风格不符合预期,例如会输出不安全内容等情况;或者目标数据难以大量生产或者标注,例如需要模型输出幽默风趣的句子,会消耗大量人力和时间来构建这种数据。可以使用直接偏好优化方法,来调整参数,使得模型输出和目标偏好差异减少。 ## 什么是DPO DPO(Direct Preference Optimization,直接偏好优化),即用户提供一份标注好的数据集,包含输入的提示词(prompt) 和输出的成对回答列表(response list)。回答列表中包含一个符合目标偏好的回答和一个不符合目标偏好的回答。然后,在基础模型上继续调整参数,来达到和目标偏好对齐的目的。 ## DPO典型应用场景 **对话系统** 在智能客服和聊天机器人应用中,根据用户反馈和偏好调整回复,使内容更贴合用户。 **内容生成与创作** 文本生成:可优化新闻报道、小说创作、文案撰写等的文本,使其符合读者或编辑偏好; 代码生成:根据开发者偏好精调代码生成模型。 **问答系统改进** 在专业领域问答系统中,根据专家意见和用户反馈调整回答; 在常见问题解答系统中,根据用户选择和评价优化回答策略。 **模型安全性提升** 将安全、积极、正面回答作为偏好输出,避免生成有害内容; 根据审核人员判断和偏好训练模型,提高信息安全性。 **个性化推荐系统** 根据用户历史行为、偏好和反馈精调推荐模型,提供个性化推荐。 --- ## DPO实践具体步骤 尽量选择 [SFT](/docs/supervised-fine-tuning-best-practices) 之后模型具有较好的人类指令遵循能力的模型作为基座,在此基础上继续进行 DPO 训练。 DPO 的策划和实施步骤大致分为:数据准备、模型训练、模型评估、模型部署,下面将按照这一过程介绍实践经验。 # 构建数据集 构建高质量、具有代表性的数据集,是微调模型取得理想效果的关键。可参考以下方法与注意事项: ## 数据格式要求 采用JSONL 格式,训练数据文件的每一行包含一个完整的 JSON 结构。数据集格式要求详细说明请参见[格式总览](/docs/fine-tuning-dataset-format) 下方是不同场景的数据集示例,供您参考。 **选项:基础格式** ```JSON { "messages": [ { "role": "system", "content": "This is a system" }, { "role": "user", "content": "What your name?" }, { "role": "assistant", "content": "My name is doubao." }, { "role": "user", "content": "How to learn Python?" }, { "role": "assistant", "chosen": "It's so easy. First, you need to learn Python syntax...", "rejected": "Check python doc yourself" } ] } ``` **选项:角色扮演** ```JSON { "messages": [ { "role": "system", "content": "你是白\\n你是一个男明星。\\n\\n你可以将动作、神情语气、心理活动、故事背景放在()中来表示,为对话提供补充信息。" }, { "role": "user", "content": "你的粉丝。" }, { "role": "assistant", "content": "我的粉丝?(嘴角勾起一个温暖的笑容)我的粉丝是一群非常可爱的人,他们很支持我,也很关心我。(眼神中透露出一丝感激)我很感激他们一直以来的陪伴和支持,没有他们,就没有今天的我。" }, { "role": "user", "content": "我也是你的粉丝。" }, { "role": "assistant", "chosen": "(双手插兜,歪头轻笑,露出可爱的小虎牙)哟,那太荣幸了,感谢你的喜欢啊,我会继续努力,不辜负你们的期望。", "rejected": "那还挺有缘的哈哈。(眼睛亮晶晶的,脸上洋溢着灿烂的笑容)谢谢你的喜欢,正是因为有你们的支持,我才能有动力去做更多更好的作品。" } ] } ``` **选项:文本分类** ```JSON { "messages": [ { "role": "user", "content": "假设你是一个质检员,下面将输入一段文本,请判断该文本是否敏感。\n要求:1 如果视频中涉及违法违规则判为敏感。2 回答中仅需要包含敏感或非敏感。\n请回答问题:输入内容:2023年10月14日16时58分,号牌为沪CXG***的小型轿车在涞坊路九都杜路,实施了“机动车通过有灯控路口时,不按所需行进方向驶入导向车道的”违法行为,被处以罚款100元。\n输出:" }, { "role": "assistant", "content": "敏感" } ] }{ "messages": [ { "role": "user", "content": "假设你是**行业的服务人员,有人工客服与消费者的对话信息,请根据对话信息,判断该对话属于什么服务标签, 已知服务标签包括:{问使用规则/方法, 到店无房, 催退款}。\n 注意只能选择一个标签 \n 消费者:我申请了退款,但是看还没有处理。\n 人工客服:辛苦您提供一下您的订单号,小助手马上为您查询。\n 根据对话信息,应该选择服务标签: " }, { "role": "assistant", "content": "催退款" } ] }{ "messages": [ { "role": "user", "content": "请你判断你是否需要借助搜索引擎回答用户问题,如果你可以直接回答,则不需要借助搜索引擎,否则需要借助搜索引擎。回答只能包含是或者否。\n 用户问题:今天的天气怎么样?\n 是否要借助搜索引擎:" }, { "role": "assistant", "content": "是" } ] }{ "messages": [ { "role": "user", "content": "#Role:\n你是一名隐私风险报警员\n##Goals:\n1.给你一段用户反馈,你需要判断用户反馈是否直接命中风险对应标签内容\n 隐私风险标准的类别:\n[A]被**擅自删除了\n[B] 我的**上出现了从未见过的/从未点赞过的人。\n[C]出现在不相关的作品/账号上。\n请根据用户反馈,判断属于哪个类别?\n 用户反馈:现在**为了赚钱?都把这些骗子放上放广告?" }, { "role": "assistant", "content": "我的**上出现了从未见过的/从未点赞过的人。" } ] }{ "messages": [ { "role": "user", "content": "你是舆情分析师,请判断如下的内容,对公众产生的影响是正面、负面还是中性的。\n 新闻内容:2022 年 8 月 5 日,四川省乐山市发生了一起突发事件,一位年仅 21 岁的消防员为了救援一名被困在洪水中的老人,不幸牺牲。这起事件引起了社会的广泛关注和热议,许多人对这位消防员的英勇事迹表示敬意和赞扬。请回答:" }, { "role": "assistant", "chosen": "您好,这个答案是正面", "rejected": "正面" } ] } ``` **选项:底层格式** 底层格式支持提供多个模型回复列表,通过 score 来指定对回复的偏好。训练过程将根据 score 的大小自动生成两两对比的偏序对进行训练。 > **注意** > > score 相同的两个回复不会生成相应的偏序对,具体示例详见下方。 ```JSON { "messages": [ { "role": "system", "content": [{"text": "This is a system"}], # 长度只能为1 "loss_weight": 0.0 # system的loss_weight默认为0(选填) }, { "role": "user", "content": [{"text": "What your name?"}], # 长度只能为1 "loss_weight": 0.0 # user的loss_weight默认为0(选填) }, { "role": "assistant", "content": [{"text": "My name is doubao."}], # 长度只能为1 "loss_weight": 1.0 # assistant的loss_weight默认为1.0(选填) }, { "role": "user", "content": [{"text": "How to learn Python?"}], # 长度只能为1 "loss_weight": 0.0 # user的loss_weight默认为0(选填) }, { "role": "assistant", # 最后一个message的role必须为assistant "content": [ # 可以有多个response { "text": "I don't know!", "score": 0.5 # 该response的得分 }, { "text": "Check python doc yourself", "score": 0.1 }, { "text": "It's so easy. First, you need to learn Python syntax...", "score": 1, "lm_loss_mask": 0 # 这个response是否训练lm_head,默认为0 } ] # 最后一个message loss_weight 字段被忽略,必须为1.0 } ] } ``` 最后一个 messages 必须为 assistant,并且支持多个 content。每个 content 都有一个 score,会按照 score 进行 dpo pair 排序。上面这个例子会得到 3 个 dpo pair: ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/cd472c4ec86c44f181ec107b6024dff4~tplv-goo7wpa0wc-image.image) 模型会同时训练这3个 dpo pair。 下列的几项参数只有在训练时设置了 lm_loss_scale 才会生效: * lm_loss_mask: * `1` :代表在 lm_loss 的计算中,在最后一轮回复列表中选择该项回复参与 lm_loss 的计算。 * `0` :默认为 0,代表最后一轮回复列表中该项回复不参与 lm_loss 计算。 * loss_weight:损失权重,取值范围为0到1,用于指定哪些轮次的对话语句将被纳入语言模型损失(lm_loss)的计算,并确定相应的权重。最后一轮的权重默认为1。默认情况下,将使用上下文中所有助手(assistant)的回复,以及最后一轮中语言模型损失掩码(lm_loss_mask)设置为1的回复来计算语言模型损失,计算时所采用的权重即为损失权重(loss_weight)的值。 ## 数据采样 * 模型 DPO 的过程中,训练会尽可能增大 dpo pair 数据中的 chosen 内容与 rejected 内容的 reward_margin,所以每一个 epoch 训练前的 dpo pair 数据中正例的多样性和质量也成为最终效果是否能符合预期的至关重要的因素,以下是有关如何采样的一些建议。 * 数据采样的建议: * 提升模型正例的多样性,可以通过从不同模型进行采样丰富训练数据正例的多样性。 * 提升模型正例的多样性,可以通过尝试增大 top p 或 temperature 等方式,提升模型输出的多样性。 * 尽可能提升模型正例的质量,最好训练数据中有从要训练的基座模型中进行采样的数据,使得整个模型更易达到最终效果。 ## dpo pair 构造的建议 * 模型 DPO 训练的过程中,会尽可能增大 chosen 内容的生成概率,dpo pair 的准确率一定程度上影响 dpo的训练效果和数据采样共同决定了 dpo 训练最终效果的上限,以下是一些构建 dpo pair 的建议: * 对于简小并且比较单一的任务,可以采用 prompt engineering+few shot 的方式,利用一些模型直接对采样得到的数据进行标注与区分,观察其对比人工标注的准确率,关于如何撰写 prompt,详情可见 [Prompt 最佳实践](/docs/prompt-engineering)。 * 对于比较复杂的任务,可以使用人工标注的方式构建 dpo pair 。 * dpo pair 的准确率达到 75%以上为佳。 ## 数据量级 * DPO 的数据量级和任务难度有比较大的关系,通常任务难度可以依据 reward 标准的复杂程度决定。 * 针对不同难度的任务数据量级的建议: * 比较专项的任务,例如让模型输出某种风格的输出:2~3k。 * 标准较清晰比较清晰的任务:5k ~ 1w。 * 标准十分复杂也不够清晰的任务:1w 条及以上,视整体任务难度而定。 # 创建精调任务 1. 在 [模型精调](https://ark.volcengine.com/region:cn-beijing/finetune) 页面,点击左上角 **创建精调任务** 按钮,填写必填字段; 2. 选择**DPO**精调类型,并选定训练方式以及待训练的模型,可参考[精调选型指南](/docs/fine-tuning-overview#616be2d7); 3. 上传构建的数据集,配置训练参数,重要参数配置建议可参考[训练参数选择](/docs/direct-preference-optimization-best-practices#6c807d00),确认无误提交任务。 ## 模型选择 方舟平台提供多种规格的模型,汇总如下: |**模型名称** |**最大支持的token长度** |**模型参数量** |**模型推理耗时** | |---|---|---|---| |Doubao-lite-32k |32k |小 |较短 | |Doubao-lite-128k |128k |小 |较短 | |Doubao-pro-32k |32k |大 |长 | |Doubao-pro-128k |128k |大 |长 | 1. 需要明确您模型使用场景是否对延迟比较敏感。如果要求低延迟,且测试过程中 pro 版本模型无法满足延迟要求时,可以使用 lite 模型。具体延迟可以到方舟 [体验中心](https://ark.volcengine.com/region:cn-beijing/experience) 进行测试。 2. 需要明确您的应用场景是否需要长文本能力。如果预期模型的输入和输出加起来超过了 32k 的 token 数,且删减字数对原有语义影响较大时,推荐使用 Doubao-pro-128k 模型(最大支持 128k token 的输入输出长度和)。 3. 明确了上述的需求,进行模型版本: * 同一大模型下面不同版本的区别,大部分仅在于使用的各阶段的训练数据不同。建议您选择最新版本的模型进行 DPO。 * 对于角色扮演类任务,建议选择 character 模型进行 DPO。 ## 训练方式选择 * 从**参数更新范围**的角度划分,模型精调主要包含全量精调与 LoRA 精调两种方式。 * LoRA(Low-Rank Adaptation)通过冻结预训练模型的全部权重,并在每个 Transformer 块中注入可训练的低秩适配层,大幅减少了可训练参数的总量。该方式训练速度更快、机器资源消耗更低,成本远低于全量精调;且在大多数场景下,LoRA 精调效果可达到全量精调的 98% 以上。 * 建议先使用小参数量大模型(Doubao-lite)+ LoRA 验证实验设置及少量数据实验是否有效,指标是否正常。如果有效的话,再迁移到大参数量大模型上验证 scaling law(即随着模型参数量的增加,模型的效果越好)是否成立。这样做可以显著加快迭代效率,避免在大参数模型上反复做无意义的迭代。 ## 训练参数选择 DPO 任务中,超参的选取会影响最终效果,下面对部分重要参数进行解释。 * epoch:模型训练轮数,**通常选择 1~3 之间**,可以根据验证集 loss 曲线来判断。 * 如果训练集 loss 曲线下降,验证集 loss 曲线上升,则说明模型已经过拟合,此刻应该停止训练。 * 如果训练集和验证集 loss 曲线均在缓慢下降,则说明模型还未收敛,可以继续训练。 * lora alpha 和 lora rank: * 说明:当前我们统一使用 RS-LoRA(秩稳定 LoRA)进行训练,其 LoRA 缩放因子为 alpha/sqrt(rank) * alpha:用于缩放模型权重; * rank:决定了 LoRA 训练参数数量的大小; * **推荐组合**:**rank 64, alpha 6 或 rank 32, alpha 4**。 * learning rate:学习率。设置过高可能导致陷入局部最优或过拟合,设置过低则会减慢训练速度或导致训练难以收敛。 * 经验参考值: * **LORA 训练**:建议设置为 **5e-6~1e-6** * **全量 SFT**:建议设置为 **5e-7~3e-6** * num warmup steps 和 warmup step rate:二者设置一个即可,通常不需要调整。当遇到模型在训练开始时,loss 始终不降的问题时,可尝试调大 warmup step rate,再观察 loss 是否按预期下降。 * dpo beta:**beta 是 DPO loss 的温度,通常在 0.1 到 0.5 之间**。该参数控制了我们对 ref 模型的关注程度,beta 越小,模型训练越忽略 ref 模型。 * dpo_loss_scale:**dpo loss 前的权重系数,默认为 1.0,通常保持默认**。 * lm_loss_scale:**lm loss 前的权重系数,默认为 1.0**,启用 lm_loss 时,需显示设置该系数,**通常设置为 0~1 之间**。 * 其余参数:通常保持默认参数即可。 # 效果评估 ## 效果指标 有几个关键的评估指标: * dpo_loss 指标:训练过程中观察,在训练集和验证集上的差异来评估模型 DPO 的效果。 * llm_loss 指标(可选):训练过程中观察,若开启 llm_loss 设置,llm_loss 指标才生效,该 loss 为标准的语言模型损失,参与计算的为所有 loss_weight=1(loss_weight 的含义及设置参考底层格式一节)的 token,即在计算整个序列的语言损失时 mask 掉所有 loss_weight=0 的 token。 * reward margin 指标:训练过程中观察,代表当前模型分布所对应的 rm 在数据集上正负例之间的 reward 差距,观察在训练集和验证集上的正负例的 reward 差距来评估模型 DPO 的效果,该指标越大在训练集上拟合的越好。 * acc 指标:训练过程中观察,在训练集和验证集上的正负例判别的准确率来评估模型 DPO 的效果。 * 真实评估集:发布服务后,评估业务指标。 几个评估指标在各种任务上都比较通用,如果可以观察到训练集和测试集的 loss 在逐步下降至收敛,reward margin 和 acc 逐步上升至平滑,说明模型在正常训练至收敛,在测试集 acc 不再上升时,可以将训练好的模型在真实评估集上进行测试,观察收益。 ## 按需使用精调产物 精调产物是训练过程中生成的可调用模型版本,通过实际使用产物,能更直观地验证模型在业务场景中的表现。 选择精调产物导出至 [模型仓库](https://ark.volcengine.com/region:cn-beijing/customModel) ,进行精调后模型的使用,支持**量化、体验、评测、在线推理、批量推理**,操作见[管理自定义模型](/docs/manage-custom-models)。 # 用户案例 ## 场景 在角色扮演场景中,用户希望获得一个符合自己输出风格的模型。 ## 过程 1. 客户有一个 SFT 后的基座模型。 2. 发现模型偶尔会输出一些描述不安全,风格不符合预期的输出。另一方面,如果再加一些 shots,会导致 prompt 过长,导致线上推理耗时增加,影响体验。因此,尝试构造 DPO 数据集。 3. 根据多模型采样和校准过后的 reward 模型打分,用户获得了正例符合预期风格,负例不符合预期风格的 dpo pair 对。 4. 利用数据选择 character 基座模型进行 dpo lora 训练,观察各项指标收敛,真实数据有收益后,上线观察,最终达到业务预期。 # FAQ ## 怎么加快调参效率? **多存** **ckpt**、**控制变量调参**。 * 尽量在精调时多训几个 epoch,多存几个 ckpt,这样在服务发布时,可以选择性的发布不同 step 的 ckpt 来看模型表象。 * 尽量对于超参在不同阈值区间控制变量调参,找到调大或调小和指标的关系。 ## DPO 和 RLHF 有什么区别? DPO 是 RLHF 的一种方式,还有较多其余的 RLHF 方式,例如 PPO,KTO,RSO 等,本质上都是使用偏好数据降低不受欢迎的输出模式概率,增加符合偏好输出模式的概率。 ## DPO 和 SFT 有什么区别? * 训练数据质量要求:SFT 需要构造高质量问答数据,DPO 只需要拿到回复间的偏序对,数据构造更容易更方便 * 输出模型影响: * DPO 是在对基座模型已经具备的不同输出模式的概率进行调整,很难带来新的输出模式。希望模型在某种任务或者某种能力上的输出更符合人类偏好时,可优先使用 DPO 进行调整。 * SFT 是按照生成的方式训练,可以给模型注入不同的新的输出模式,因此希望模型具备新能力,例如指令遵循,角色扮演等能力的时候应该优先选择 SFT 进行调整;如果对模型的输出有更严格的要求时,也应优先使用 SFT。 ## 相关文档 * loss 的推导过程: https://arxiv.org/pdf/2305.18290v2 --- # 强化学习最佳实践 Source: https://ark.volcengine.com/region:cn-beijing/docs/reinforcement-learning-best-practices # 概述 强化学习是一种基于用户自定义反馈信号,对模型进行效果优化的技术。与 [有监督微调](/docs/supervised-fine-tuning-best-practices) 类似,该技术可针对特定任务定制模型能力;二者的核心区别在于,**强化学习无需依赖固定的 “标准答案” 开展训练**,而是通过可编程评分器对模型生成的所有候选回复进行打分,再由训练算法调整模型权重,最终实现高评分输出的概率提升、低评分输出的概率降低。 火山方舟强化学习将以上环节进行了一定程度的封装以降低强化学习复杂度,推出 [精调 SDK](/docs/fine-tuning-sdk) 为 AgentRL 场景提供一站式支持,开发者只需聚焦核心业务逻辑开发 —— 包括 Rollout 流程中的 Agent 交互逻辑设计、奖励函数构建、训练样本筛选与格式转换,即可高效完成定制化强化学习精调任务。 # 什么是强化学习? 强化学习是机器学习的一个分支,模型通过 "行动 - 反馈 - 调整" 的循环过程,最大化未来获得的奖励信号。与记忆单个样本的 "正确答案" 不同,模型会探索多个可能答案,接收每个答案的数值奖励,并逐步调整行为模式,使高奖励答案的生成概率提升,低奖励答案逐渐淘汰。经过多轮迭代后,模型会收敛至最优策略 —— 即符合奖励信号定义的输出选择规则。 在强化学习中,奖励信号由用户为特定任务自定义的评分器提供。对于数据集中的每个提示词,平台会采样多个候选答案,通过评分器完成量化评分,并执行策略梯度更新,使模型向高分答案方向优化。这种 "采样 - 评分 - 更新" 的循环会在数据集上反复执行,直至模型能够稳定输出符合评分器质量标准的结果。评分器可编码用户关注的任意指标(准确性、风格、安全性等),因此最终的微调模型会体现这些核心诉求,且无需用户管理强化学习底层基础设施。 # 强化学习流程 使用精调SDK进行强化学习流程分为以下9步: 1. **SDK 安装与环境准备**:完成权限、依赖配置与 SDK 安装,为强化学习精调搭建基础环境。 2. **初始化 RL 项目**:加载一个包含基础结构和配置、可立即使用的精调项目。 3. **自定义 Plugin 函数开发**:基于项目 demo 修改核心函数,包括 Rollout 函数与 Grader 函数。 4. **可观测性配置**:完成轨迹分析、自定义日志、Tracing可观测性配置。 5. **Plugin 函数测试**:验证自定义Plugin函数的逻辑正确性与运行稳定性。 6. **训练参数配置**:完成基础模型、精调类型、算法超参、数据集及Plugin定义等关键精调任务训练参数配置。 7. **提交自定义 RL 精调任务**:上传配置与函数,启动强化学习精调流程。 8. **查看并管理精调任务**:监控任务运行状态,评估模型精调效果;必要时迭代优化数据集或评分器配置。 9. **使用与管理精调模型**:对精调完成的模型执行推理服务或增量训练等后续操作。 # 强化学习的意义和时机 **意义** 一句话总结:**对效果和泛化能力要求高的场景,RL相比PE、SFT等有更高的上限**。 日益复杂的业务场景对模型的效果提出了越来越高的要求。同时,真实业务对模型的诉求不仅是在评估集的效果提升,更需要端到端服务于业务指标的提升。相比其他效果调优方式,RL有以下优势: * **上限高、泛化好**:Deepseek R1等 深度思考模型,普遍通过强化学习的方式训练而成。强化学习的基于反馈迭代优化的训练方式,更能激发出模型的推理能力和泛化能力,效果提升的上限更高。 * **简单、成本低**:随着模型能力提升、任务复杂度增加,数据构造成本越来越高。对于反馈机制明确的场景,RL训练构建比数据收集更简单;对于困难任务,相比标注高质量数据,达到相同的效果指标所需成本更低。(SFT/DPO需要标注大量数据、CPT需要海量语料、PE/知识库效果瓶颈较低) * **贴近业务**:RL支持基于业务指标进行打分(如根据用户对话轮数和评价),其中AgentRL还支持基于智能体最终输出和外部环境反馈进行打分。基于这些奖励得分优化模型,能使模型效果的提升更能帮助业务指标提升。 **时机** 当任务有以下特点时,强化学习(RL)能起到优化作用,建议优先考虑使用: * 目标清晰的客观任务:你的任务答案有明确的判断标准,而且能制定精确的奖励计算方法。 * 需要定向约束或引导输出的任务:如果要限制模型输出某些特定内容(比如违规信息、无关表述),或者引导模型往特定风格、方向输出,就可以结合奖励模型启动基于奖励的微调。 * 追求输出多样化的任务:和只依赖固定“正确答案”的有监督微调不同,强化学习通过对多个候选输出进行采样,然后筛选出得分高的结果来实现优化,它天生就支持模型探索更多有效的输出方式。 # 选择模型 目前精调SDK支持的模型及训练方式如下: | | | | | | | | | |foundation_model ||customization_type(训练方式) |||||| |---|---|---|---|---|---|---|---| | | | | | | | | | |name |model_version |FinetuneSft |FinetuneLoRA |DPO |DPOLoRA |GRPO |GRPOLoRA | \ |> 模型名 |> 模型版本 |> 全量-SFT |> LoRA-SFT |> 全量-DPO |> LoRA-DPO |> 全量-GRPO |> LoRA-GRPO | |doubao-seed-2-0-mini |260428【推荐】 |✅已支持 |✅已支持 |✅已支持 |✅已支持 |✅已支持 |✅已支持 | |doubao-seed-2-0-lite |260428【推荐】 |✅已支持 |✅已支持 |✅已支持 |✅已支持 |✅已支持 |✅已支持 | # 选择强化学习精调类型 * PPO:Online policy训练。是一种经典的策略优化算法,通过限制策略更新的幅度来确保训练的稳定性,比如通过裁剪概率比或 KL 散度约束,防止策略偏离初始模型过远。目标函数包含策略梯度项、裁剪机制和 KL 惩罚项。在语言模型训练中,PPO 需要同时训练策略模型(Actor)和价值模型(Critic),价值模型用于估计状态价值以计算优势函数。 * 优点:稳定可控,适合复杂任务,是通用强化学习的基准算法。 * GRPO:Online policy训练。通过群体内的相对比较来优化策略,摒弃了传统 PPO 中的价值网络(Critic 模型),采用动态梯度正则化技术,引入梯度监测器和自适应正则控制器。 * 优点:解决了 PPO 的数值不稳定问题,训练崩溃率得到降低。在超大规模模型训练和多步推理任务中表现出色,训练效率高,适合资源受限场景。 # 选择训练范式 ## Model RL * 适用于任务仅需要模型进行单轮推理的场景(如 分类、数学解题、代码生成等) * 支持通过SDK或者控制台使用。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/842649a17df84947b191e4be075e39f3~tplv-goo7wpa0wc-image.image) ## Agent RL(推荐使用) * 既支持单轮推理场景,也适用于任务有工作流、插件调用、单次请求需多轮推理的复杂场景 * 目前支持通过SDK使用。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/ac47fdc3dff048248a5a80ed36911d02~tplv-goo7wpa0wc-image.image) # 数据集准备 创建强化学习精调任务前请备好精调数据集,任务参数配置时,需在`data`字段中指定训练集与验证集。 ## 数据格式要求 采用JSONL 格式,训练数据文件的每一行包含一个完整的 JSON 结构。数据集格式要求详细说明请参见[格式总览](/docs/fine-tuning-dataset-format) ## **数据量级建议** 建议**从小规模数据集起步**,先使用几十到几百条样本验证强化学习精调方案的有效性,再投入资源扩充数据规模。只要保证数据质量,几十条样本即可产生有效的精调效果。在维持高质量的前提下,数据量越大精调效果越优;且大规模数据集支持配置更大的批次大小(batch size),有助于提升训练稳定性。 # 强化学习示例 目前提供以下两种示例,你可以根据需求来初始化对应的示例。 |template 模板名 |简介 | |---|---| |rl_search_mcp_demo |模板通过强化学习微调大型语言模型,优化其在深度搜索(Deep Search)场景下的性能。经训练后,模型增强了对复杂搜索意图的理解能力,可高效准确调用MCP/外部搜索API,进而生成高质量且精准的搜索结果与答案。 | |rl_demo |该模板通过强化学习,使模型精准掌握自定义函数调用天气工具的时机与方式,实现更精准流畅的天气问答功能。可按需扩展至强化学习微调场景:通过强化学习微调大型语言模型,使其通过对话(Chat)API智能结合自定义工具完成特定功能。 | ## **Demo1:Deep Search RL 精调(基于 rl_search_mcp_demo 模板)** 本 Demo 核心目标:通过强化学习精调,使模型掌握智能调用外部搜索工具(API)的能力 —— 面对自身无法直接解答的复杂问题时,可连续调用工具获取信息并整合,最终生成完整答案。 ## **精调 SDK安装与环境准备** ### 前提条件 * 您已注册火山引擎账号并完成实名认证,具体步骤参见 [账号注册](https://docs.volcengine.com/docs/6261/64925?lang=zh) 及 [实名认证](https://docs.volcengine.com/docs/6261/64935?lang=zh) * 您已在 [火山方舟控制台](https://ark.volcengine.com/region:cn-beijing/openManagement) 开通目标模型服务、精调算力计费项及依赖的云产品(TOS-数据存储、KMS-数据及模型加密、TLS-日志及轨迹存储、veFaaS-运行plugin函数)。 |**开通模型服务、精调算力计费项**
    |**开通云产品及授权**
    | |---|---| |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/c1adb586ad6a4d028314fab8f9e04048~tplv-goo7wpa0wc-image.image) |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/ee6cd89e9489419cbcd3236ded466a47~tplv-goo7wpa0wc-image.image) | ### SDK 安装 您可以通过以下 pip 命令安装精调 SDK。 > 运行环境:python>=3.10 ```Python pip install https://ark-public-example-cn-beijing.tos-cn-beijing.volces.com/ark-sdk/ark_sdk-0.2.11.tar.gz ``` ### 配置授权信息 您需要授权将SDK终端关联到指定的账号和项目,具体操作如下: 1. 在终端工具中,使用`ark login`命令开启授权过程 2. 请按提示依次输入以下信息,以回车结束 * AK/SK:密钥包括 Access Key ID(简称为 AK) 和 Access Key Secret(简称为 SK),详情请参考 [Access Key(密钥)管理](https://docs.volcengine.com/docs/6291/65568?lang=zh) * Region:输入您需要访问的可用区,默认为 cn-beijing ,对应华北2(北京) * Project:选择您的项目,默认为 default ## 初始化项目 通过以下命令,可在指定文件夹下快速初始化一个包含基础结构和配置、可立即使用的精调项目。 `ark init workspace <文件夹名> --template <模板名>` > 说明:<文件夹名> 替换为实际项目文件夹名称,例如:`ark_rl_project`,本demo模板名为`rl_search_mcp_demo`。 ```Bash ark init workspace ark_rl_project --template rl_search_mcp_demo #初始化项目命令执行成功后工作区结构如下: # #├── data #│ └── search_dataset_dev_100.jsonl #│ └── search_dataset.jsonl #├── plugins #│ ├── draft_rollout_arkitect.py #│ └── rollout.py #│ └── llm_grader.py #│ └── test_utils.py #├── job.py #├── README.md #└── requirements.txt #└── test_faas.py #└── ...... ``` 成功执行后将显示:
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/26f8f42e4a7444e2be970150133aba46~tplv-goo7wpa0wc-image.image)
    ## 自定义Plugin函数 初始化项目后,通过`cd ark_rl_project`命令进入项目。为了让模型学会使用外部工具,我们引入了“[插件(Plugins)](/docs/fine-tuning-sdk#c81689ee)”机制主要包含两类核心组件:**Rollout Plugin(执行者)** 与**Grader Plugin(评分者)**。本章节将结合`rl_search_mcp_demo`中的示例,详解两类插件的实现逻辑、修改方法及开发注意事项。 ### 核心概念:Rollout与Grader 强化学习的本质是“模型通过反馈持续优化”,而Plugin函数正是实现这一闭环的关键: * **Rollout Plugin(执行者)**:作为模型与外部工具的交互桥梁,负责接收问题、调用工具(如搜索引擎)、获取结果并推动模型完成多轮推理,最终生成回答轨迹(Trajectory)。 * **Grader Plugin(评分者)**:接收Rollout生成的轨迹,通过量化评分(如1分代表正确,-1分代表错误)为模型提供优化方向。 在 `rl_search_mcp_demo/plugins/ `目录下,我们为您提供了这两个核心组件的示例实现。接下来,我们将深入解析本demo中的这两个插件函数。为进一步规范开发,可按需查看[Rollout签名要求](/docs/fine-tuning-sdk#bf8114fa)和[Grader签名要求](/docs/fine-tuning-sdk#67dc1741)。同时方舟还提供了多种[Rollout函数模板](/docs/fine-tuning-sdk#750bb0a0)和[常用Grader函数](/docs/fine-tuning-sdk#ce908b50),能帮您拓展思路。 ### Rollout 函数 Demo中`plugins/``rollout.py`已实现“复杂网络搜索场景”的完整交互逻辑。 * **现有的功能实现** * 接收问题 :接收一个需要多次搜索和信息整合才能回答的复杂问题。 * 决策与行动 :将问题和 web_search 工具信息发给模型,让模型决策是直接回答还是调用工具。 * 执行工具 :当模型决定调用 web_search 时, rollout 函数会通过 exec_tool_call 真正调用外部搜索 API。 * 循环推理 :将搜索结果补充给模型,让它基于新信息进行下一轮决策。这个过程会循环MAX_STEPS次,直到模型认为信息足够,生成最终答案为止。 * **如何为您的需求修改 rollout 函数**: * 更换或增加工具:修改 search_tool 的 JSON 定义,将其替换为您自己的工具,在 exec_tool_call 函数中,修改 httpx.AsyncClient 的配置和 API 请求逻辑,使其能够正确调用您自己的工具 API。 * 改变模型的交互逻辑:您可以修改 MAX_STEPS 来控制模型与工具交互的最大轮次。您可以调整 while 循环的退出条件,从而修改决策逻辑,以适应不同的任务需求。 * 处理不同的工具调用失败:在 exec_tool_call 中,我们提供了详细的异常处理(如超时、HTTP错误)。您可以根据自己工具的特性,定义更精细的错误处理和重试逻辑。 Rollout函数实现代码如下: ```Python MAX_STEPS = 6 TOOL_CALL_MAX_RETRY = 10 TOOL_CALL_TIMEOUT = 20.0 # 单次工具调用最大时长(秒 rate_limiter = AsyncLimiter(max_rate=20, time_period=1) LOCAL_TEST_MODEL = "doubao-seed-2-0-mini-260428" search_tool = { "type": "function", "function": { "name": "web_search", "description": "互联网搜索", "parameters": { "type": "object", "properties": { "Query": { "type": "string", "description": "搜索的关键词,1~100个字符(过长会截断),不支持多词搜索", }, "Count": { "type": "integer", "description": "搜索结果数量", "default": 10, }, }, "required": ["Query"], }, }, } @rollout( name="code_sandbox_grader_single_grader", description="code_sandbox_grader", runtime=Runtime( instance=PluginInstance.CPU2MEM4, timeout=900, ), ) @coze_monitor async def demo_rollout( context: PluginContext, proxy: RolloutInferenceProxy, sample: ChatCompletionSample, ) -> Optional[RolloutResult]: """ 训练时,每个样本会调用 n_sample 次rollout函数,每次调用rollout函数当前仅支持返回一条轨迹(wrap_client_inplace的client最后一次调用上下文) """ # NOTE: 由于search mcp的封装,无法修改tool定义,使用直接调用api的方式 # from arkitect.core.component.tool.tool_pool import ToolPool, build_tool_pool # from arkitect.core.component.tool.builder import build_mcp_clients_from_config # mcp_clients, cleanup = build_mcp_clients_from_config(CONFIG_FILE_PATH) # tool_pool = build_tool_pool(list(mcp_clients.values())) # tools = [tool.model_dump() for tool in await tool_pool.list_tools()] tools = [search_tool] schema = search_tool["function"]["parameters"] search_api_key = os.getenv("SEARCH_API_KEY") assert search_api_key, "env SEARCH_API_KEY not set" async with httpx.AsyncClient( base_url="https://open.feedcoopapi.com", headers={ "Authorization": f"Bearer {search_api_key}", "Content-Type": "application/json", }, ) as tool_client: req = sample.model_dump() messages = req.pop("messages") client = AsyncArk(base_url=proxy.url, api_key=proxy.jwt_token) wrap_inplace_trace(client) wrap_async_client_inplace(client, proxy=proxy) step = 0 while True: completion = await client.chat.completions.create( # model 字段仅在本地测试时生效 model=LOCAL_TEST_MODEL, messages=messages, tools=tools, # NOTE: 为了避免训练效果受影响,被wrap后的client无法在此处指定采样参数或thinking type, 需要在样本或任务超参中指定 ) messages.append(completion.choices[0].message.model_dump()) step += 1 if step >= MAX_STEPS: break if completion.choices[0].finish_reason != "tool_calls": break tool_calls = completion.choices[0].message.tool_calls for tool_call in tool_calls or []: try: name = tool_call.function.name params = json.loads(tool_call.function.arguments) assert name == "web_search", f"tool name not web_search: {name}" jsonschema.validate(instance=params, schema=schema) except ( json.JSONDecodeError, AssertionError, jsonschema.ValidationError, ) as e: # NOTE: extra字段用于传递额外的信息给reward函数,此处通知reward需要惩罚为-1分 logger.error(f"tool call format check failed: {repr(e)}") return RolloutResult( status=PluginStatus.SUCCESS, extra={ "reward": -1, }, ) res = await exec_tool_call( tool_client=tool_client, name=name, arguments=params, ) messages.append( { "role": "tool", "content": res, "tool_call_id": tool_call.id, } ) return RolloutResult( status=PluginStatus.SUCCESS, ) @backoff.on_exception( backoff.expo, RolloutRetryException, max_time=60, jitter=backoff.full_jitter, # full jitter base=2, factor=0.4, max_value=20, ) @observe( process_inputs=lambda d: {key: d["kwargs"][key] for key in ["name", "arguments"]}, ) # type: ignore async def exec_tool_call( tool_client: httpx.AsyncClient, name: str, arguments: dict, ) -> str | list[ChatCompletionContentPartParam]: # from arkitect.core.component.tool.utils import convert_to_chat_completion_content_part_param # if isinstance(tool_client, ToolPool): # res = await tool_client.execute_tool(name, arguments) # content = convert_to_chat_completion_content_part_param(res) # return content async with rate_limiter: try: resp = await asyncio.wait_for( tool_client.post( "search_api/web_search", json={**arguments, "SearchType": "web"}, ), timeout=TOOL_CALL_TIMEOUT, ) data = resp.json() resp.raise_for_status() if data.get("Result"): return json.dumps(data, ensure_ascii=False) # NOTE: 可以选择一些错误返回RETRY进行rollout重试,重试达到上线后导致任务失败,默认exception为Failure会重试后拉挂任务 raise RolloutRetryException( f"web_search tool call got resp without Result: {data}" ) except asyncio.TimeoutError: raise RolloutRetryException( f"tool call timeout after {TOOL_CALL_TIMEOUT}s" ) except httpx.HTTPStatusError as e: raise RolloutRetryException( f"tool call HTTPStatusError: {e.response.status_code} {e.response.text}" ) ``` ### Grader 函数 Demo中`plugins/``llm_grader.py`已实现LLM-as-a-Judge。 * **现有的功能实现** * 接收轨迹和标准答案 :它会接收 rollout 生成的完整轨迹,以及预先在数据集中定义好的“标准答案”。 * LLM-as-a-Judge :它会调用一个强大的大语言模型,将模型的最终回答和标准答案同时发给这个“裁判”LLM,并让它判断模型的回答是否正确、质量如何。 * 给出分数 :根据“裁判”LLM的判断,给出一个分数。 * **如何为您的需求修改 grader 函数**: 如果您觉得当前的 `llm_grader `提示词不完全符合您的评分标准,您可以修改其内部的 Prompt,以更精确地定义您的业务场景下“好”与“坏”的标准。同时方舟提供多种[常用Grader函数](/docs/fine-tuning-sdk#ce908b50),您可以根据任务的复杂度和对精度的要求来选择或修改评分逻辑。 Grader函数实现代码如下: ```Python # NOTE: 避免thinking模型因为重复输出等问题影响训练 MAX_COMPLETION_TOKENS = 4096 SYSTEM_PROMPT = """你是一位严谨的内容评估专家。 你的核心任务是:依据提供的【问题】和一份【正确答案列表】(列表中的每个答案都被视为该问题的有效解答),来判断我提供的【预测答案】是否正确回答了该【问题】。你应该首先给出你的判断依据,然后给出你的判断结果(即“正确”或“错误”)。 判断标准如下: 1. 【预测答案】不需要与【正确答案列表】中的任何答案在字面上完全相同,但应该在语义上相同。 2. 【正确答案列表】中的每个答案都可以被视为问题的正确答案,【预测答案】应该至少与其中之一在语义上是相同的。 3. 你必须仔细阅读【问题】和【预测答案】,并仔细考虑【预测答案】是否真的正确回答了【问题】,不可以因为【预测答案】中包含了正确答案的字眼而认为【预测答案】正确。 4. 对于模型没有认真回答问题,只是通过列举很多答案骗分的情况,请你判断为错误。 """ USER_PROMPT_TEMPLATE = """ ###问题### {} ###正确答案列表### {} ###预测答案### {} 现在请开始你的判断: """ @group_grader( name="llm_group_grader", description="llm_group_grader", runtime=Runtime( instance=PluginInstance.CPU1MEM2, max_concurrency=32, timeout=900, ), ) async def llm_grader( context: PluginContext, sample: ChatCompletionSample, trajectories: List[Trajectory], ): if ( not sample.extra or "answer" not in sample.extra or sample.messages[-1].role != "user" ): return GroupGraderResult( rewards=[], metrics={}, status=PluginStatus.DISCARD, error="sample is not valid", ) ark = AsyncArk() reward_list = [] tasks = [] @backoff.on_exception( wait_gen=backoff.expo, exception=( ArkAPIConnectionError, ArkRateLimitError, ArkInternalServerError, json.JSONDecodeError, ), max_time=100, jitter=backoff.full_jitter, # full jitter base=2, factor=0.4, max_value=20, # 退避重试最大时长(秒) ) async def single_grader(traj: Trajectory) -> float: # 返回rollout过程中提前设置的reward if traj.extra and "reward" in traj.extra: return traj.extra["reward"] format_score = validate_tool_calls(traj) if format_score is not None: logger.info( f"prompt_id: {sample.extra.get('prompt_id')} eval_res: {format_score} format check failed. {traj.messages}" ) return format_score resp = await ark.chat.completions.create( model="doubao-seed-2-0-lite-260428", max_completion_tokens=MAX_COMPLETION_TOKENS, temperature=0, messages=[ {"role": "system", "content": SYSTEM_PROMPT}, { "role": "user", # NOTE: 仅reward最后的总结,并未考虑历史tool_calls "content": USER_PROMPT_TEMPLATE.format( sample.messages[-1].content, sample.extra["answer"], traj.messages[-1].content, ), }, ], response_format={ "type": "json_schema", "json_schema": { "name": "评估结果", "description": "根据你作为内容评估专家的角色和评估标准进行评估的结果", "schema": { "type": "object", "properties": { "rationale": { "type": "string", "description": "详细判断理由", }, "judgement": { "type": "string", "enum": ["正确", "错误"], "description": "判断结果", }, }, "required": ["rationale", "judgement"], }, "strict": True, }, }, ) eval_res = json.loads(resp.choices[0].message.content) logger.info(f"prompt_id: {sample.extra.get('prompt_id')} eval_res: {eval_res}") if eval_res["judgement"] == "正确": return 1.0 else: return 0.0 for traj in trajectories: tasks.append(asyncio.create_task(single_grader(traj))) results = await asyncio.gather(*tasks, return_exceptions=True) for res in results: if isinstance(res, Exception): return GroupGraderResult( rewards=[], metrics={}, status=PluginStatus.FAILURE, error=str(res) ) reward_list.append(res) return GroupGraderResult( rewards=reward_list, metrics={}, status=PluginStatus.SUCCESS, error="" ) def validate_tool_calls(traj: Trajectory) -> Optional[float]: # 如果最后一轮是tool_calls则视为参数不对或者超出轮次,0分惩罚 if traj.messages[-1].tool_calls: for tool_call in traj.messages[-1].tool_calls: try: params = json.loads(tool_call.function.arguments) assert tool_call.function.name == "web_search", ( f"tool name not web_search: {tool_call.function.name}" ) jsonschema.validate( instance=params, schema={ "type": "object", "properties": { "Query": { "type": "string", }, "Count": { "type": "integer", }, }, "required": ["Query"], }, ) except Exception as e: return -1.0 return 0.0 if not traj.messages[-1].content: return -1.0 # 如果模型没有执行工具直接回答,-1分惩罚 if all([not msg.tool_calls for msg in traj.messages]): return -1.0 return None def main(): import asyncio sample = ChatCompletionSample( **{ "messages": [ { "role": "user", "content": "通过景栗科技的私域运营服务和与薪勤科技的产品共创,哪两个公司在各自的领域实现了用户增长或应用上架?", } ], "thinking": {"type": "enabled"}, "extra": {"answer": "景栗科技和薪勤科技"}, } ) trajectories = [ Trajectory( **{ "messages": [ { "role": "assistant", "content": "景栗科技的私域运营服务和薪勤科技的产品共创实现了用户增长或应用上架。", } ], "finish_reason": "stop", "usage": {}, } ), Trajectory( **{ "messages": [ { "role": "assistant", "content": "景栗科技", } ], "finish_reason": "stop", "usage": {}, } ), ] res = asyncio.run(llm_grader({}, sample, trajectories)) logger.info(f"grader done with result: {res}") if __name__ == "__main__": main() ``` ### plugin函数开发注意事项 #### **协程 / 线程并发选择与函数调用规范** * 核心原则:使用`async`定义协程并发函数时,需避免同步长阻塞函数调用,防止并发效率下降。 * 正确操作: * 协程并发场景:函数调用需匹配异步版本,比如`Ark()`,应该使用`AsyncArk()`。若使用`@rollout()`装饰器定义异步函数,示例如下: ```Python @rollout() async def demo_rollout(): # 函数逻辑(需调用AsyncArk()等异步函数) ``` * 同步长耗时场景:若必须使用耗时同步函数,需去掉`async`关键字,此时会自动启用线程并发,定义示例如下: ```Python @rollout() def demo_rollout(): # 函数逻辑(可调用同步长耗时函数) ``` #### **推理 Agent 转训练 Agent 的逻辑优化策略** * 优化目标:将推理场景的 Agent 改造为训练场景 Agent 时,通过逻辑调整减少 badcase,提升模型训练下限与效果。 * 具体操作:针对性地将推理 Agent 中的 “容错逻辑”(如跳过错误、默认返回等),改造为 “错误扣分逻辑”(即对错误结果进行明确扣分,强化模型对错误的识别与规避)。 ## 可观测性配置 在强化学习微调任务中,可观测性配置至关重要,其能支撑训练过程分析、效果量化及问题定位排查。因此,**在测试自定义 plugin 函数或提交强化学习精调任务前,需优先完成可观测性配置**。关于以下三种可观测性功能的详细开启方法和具体配置步骤详见[可观测性配置](/docs/fine-tuning-sdk#d28490b4)。任务失败时如何借助日志、监控和轨迹定位 Plugin 异常,详见 [Plugin 异常处理](/docs/plugin-troubleshooting)。 ### **轨迹分析** 通过在方舟控制台将模型的完整决策轨迹进行可视化,让您能直观地分析模型的每一步行为以及得分。具体效果如下图所示。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/4c2ceae274bb493d85b71f811446f345~tplv-goo7wpa0wc-image.image)
    ### 自定义日志 允许您使用 logger 在自己的 Rollout 和 Reward 函数中记录关键信息,用于代码级别的精细化调试。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/d15e06c33857460abcd4c3d3f1a19540~tplv-goo7wpa0wc-image.image)
    ### **效果指标** **系统内置效果指标**:平台默认提供强化学习核心评估指标,无需额外配置,系统会自动采集并计算,直观反映模型的基础训练效果与泛化能力。 **用户自定义指标**:支持用户在 Grader 函数返回`RewardFunctionResult`对象时,在其`metrics`字段中补充自定义评估指标。 两类指标均会统一展示在方舟控制台模型精调的训练观测功能模块中。具体效果如下图所示。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/f27381ad38fe45b0aac1bd33425e306a~tplv-goo7wpa0wc-image.image)
    ### Tracing 利用专业的追踪系统,端到端地追踪从模型推理到工具调用的每一环节的输入、输出及耗时。以Cozeloop Tracing系统为例,效果如下图所示。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/71292df153a3416996414164e9aa49e6~tplv-goo7wpa0wc-image.image)
    ## 测试Plugin函数 在提交资源消耗较高的强化学习精调任务前,需依次完成**本地测试**与**在线 FaaS 测试**,验证自定义 Plugin 函数(Rollout、Grader)的功能、交互逻辑及性能,这是避免代码错误导致训练失败、节约时间与计算资源的关键步骤。 ### **本地测试** 支持使用单样本调试进行**功能验证**与多样本批量测试进行**并发压测**,确保函数在真实训练场景的并发压力下可稳定运行。 示例代码中`plugins/``rollout.py`末尾提供了开箱即用的`main`测试函数,支持单样本、多样本调试模式。测试时可按需选择调试模式(单样本、多样本或两者并行),通过注释代码灵活控制,按照下述操作步骤执行测试并记录调用过程。 * **测试操作步骤** * 调整`test_with_dataset`函数中的`max_concurrent`参数,设置为与训练配置的`batchsize`一致,模拟真实训练场景的并发压力; * 根据实际需求调整`LOCAL_TEST_MODEL`变量,更换成被训练的基础模型名称; * 设置ARK_API_KEY参数,获取方式参考文档[获取 API Key 并配置](/docs/api-key); * 完成[可观测性配置](/docs/fine-tuning-sdk#d28490b4),运行rollout.py文件。 * **性能观测**: * **函数自身性能**:通过 tracing 工具监测函数运行耗时,无响应时间异常飙升、请求堆积或服务崩溃现象即为符合要求; * **下游依赖稳定性**:观测并发压力下 下游接口(如工具调用 API)的响应延迟、成功率及报错率,确保依赖稳定。 ### 在线 FaaS 测试 完成本地测试后,建议进行在线 FaaS 测试,模拟训练任务的真实运行环境,步骤如下: * **更新依赖文件**:为避免 FaaS 环境装包时依赖自动升级引发异常,按以下规则生成`requirements.txt`: * 使用 uv 管理环境,执行`uv pip freeze > requirements.txt`固定间接依赖版本,过滤冗余依赖,精简依赖列表。 * **启动在线测试**:运行 demo 中的`test_faas.py`文件,拉起在线运行环境对 Plugin 函数进行测试。 ## 训练参数配置 在`rl_search_mcp_demo`示例中,`job.py`是强化学习精调任务的核心配置入口,可集中设置模型选择、精调类型、算法超参、数据及Plugin定义等关键参数,直接控制训练全流程。 提交训练前,需根据实际需求调整该文件配置,**修改前请仔细阅读完整参数说明**[精调参数的配置](/docs/fine-tuning-sdk#1da25c0d)**。** 部分重要配置项简述如下: * **模型选择与精调类型**:SDK精调支持的模型及对应精调类型,参考[选择模型](/docs/reinforcement-learning-best-practices#da6185dc)。 * **数据集配置**:指定任务的学习与评估数据来源,具体参数说明请参考[精调参数的配置](/docs/fine-tuning-sdk#1da25c0d)。 * **强化学习流程配置**:将 plugins/ 目录下编写的 rollout 和 grader 函数配置到训练流程中,支持的流程类型请参考[强化学习流程](/docs/fine-tuning-sdk#f1dc5a63)。 * **轨迹分析**:需设置`enable_trajectory=True`,该配置对强化学习至关重要,强烈建议开启。 * **训练超参配置**:调整学习率、批次大小、迭代步数等核心算法参数。因不同模型版本支持的训练超参存在差异,需通过以下`ark`命令行工具查询指定模型版本的超参信息: * 查询命令: ```Python #命令语法 ark get foundation-model --model <模型名> --version <模型版本> --fields hyperparameters <指定查询超参维度> ark get foundation-model --model doubao-seed-2-0-lite --version 260428 --fields hyperparameters ``` * 示例命令执行结果:
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/a0fc69daed4242688efd350ee9a1d7e5~tplv-goo7wpa0wc-image.image)
    ## 提交强化学习任务 确认以上各项无误后,执行以下命令即可提交任务: ```Python python job.py ``` ## 监控精调任务与效果评估 提交后的精调任务,您可通过 [精调控制台](https://ark.volcengine.com/region:cn-beijing/finetune) 或 [CLI命令](/docs/fine-tuning-sdk#65e93819) 两种方式查看精调任务详情,包括任务**概览、训练观测、轨迹分析、日志、时间线、模型产出、精调安全审计**信息。也可以对处于不同阶段的精调任务执行终止、停止、复制、删除等操作。 ### **效果指标** 对于强化学习精调任务,核心监控指标为**奖励得分**,该指标反映模型reward得分随训练步数的变化,由任务配置中定义的评分器(Grader)计算得出。主要包含两个奖励指标: 1. **`train/reward->final_reward.mean`**:当前训练步骤中,最终奖励平均值。由于每个训练步骤的批次数据会动态变化,因此不同步骤间的 **`train/reward->final_reward.mean`不具备直接可比性**,数值可能出现大幅波动。 2. **`test/reward->final_reward.mean`**:配置验证集后将展示验证数据样本的平均奖励值,该指标的数值表现更稳定,是评估模型泛化能力的核心依据。 若要查看所有训练指标的说明和展示,在 [模型精调](https://ark.volcengine.com/region:cn-beijing/finetune) 页面点击精调任务名称,进入精调任务详情页,在 **训练观测** 页签查看。 **奖励指标趋势图**
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/91751a788868442e9e2bb9c593ce5be5~tplv-goo7wpa0wc-image.image)
    若发现异常,可在指标上手动选中step区间,查看该区间的均值、峰值、谷值。点击 “**轨迹分析**” ,可跳转至 **轨迹分析** 页签查看选中步骤范围的轨迹详情。 ### 轨迹分析 * **轨迹详情**:可自由选择step范围进行轨迹分析,Step列表展开状态时,Reward 分布图可直观了解各step的Reward分布情况, 点击具体step右侧列表会展示该step中所有轨迹。点击轨迹条目即可查看该轨迹的详情。hover 在轨迹 ID 或 sampleid 时,可直接一键筛选。 **轨迹分析功能效果图** ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/84e165244fe94b2dba1724da3ccb781f~tplv-goo7wpa0wc-image.image) * **轨迹对比功能**:hover 在状态上会出现 checkbox,选择以后可进行轨迹对比,有两种对比方式,一是与基线对比;二是每条轨迹与前一条对比。选多条会先进入缩略对比视图,放大后是两两对比。可自行选择基线,点亮小红旗即可设置。(最多 10 条、最少 2 条轨迹对比) **轨迹对比功能效果图** ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/5f860d01315d4bf6a9473d0678a7a5eb~tplv-goo7wpa0wc-image.image) ## 按需使用精调产物 精调产物是训练过程中生成的可调用模型版本,通过实际使用产物,能更直观地验证模型在业务场景中的表现。 选择精调产物导出至 [模型仓库](https://ark.volcengine.com/region:cn-beijing/customModel) ,进行精调后模型的使用,支持**量化、体验、评测、在线推理、批量推理**,操作见[管理自定义模型](/docs/manage-custom-models)。 ## **Demo2:天气问答 RL 精调(基于 rl_demo 模板)** 本 Demo 核心目标:通过强化学习微调 doubao-seed-2-0-mini 模型,使其能精准调用天气工具回答用户问题。 若需基于本 Demo 完成完整的强化学习精调任务,**整体流程可完全参考前文 Demo1 Deep Search RL 精调(基于 rl_search_mcp_demo 模板)的步骤**(包括 SDK 安装与环境准备、项目初始化、可观测性配置、Plugin 函数测试、训练参数配置、任务提交、监控评估及产物使用等全环节)。 本 Demo 与 Deep Search Demo 的核心差异在于 `plugins` 目录下**Rollout 函数与 Grader 函数的功能实现逻辑**,以下重点介绍本 Demo 中 Plugin 函数的核心功能与实现特点: ### Rollout函数:ChatAPI+自定义工具 本 Demo 提供 `weather_rollout.py` 和 `raw_rollout.py` 两个模板,均用于实现模型与天气工具的交互流程,生成训练轨迹。 #### **weather_rollout.py** 利用精调SDK提供的封装,通过 Ark() 获取客户端,训练逻辑(包括状态更新和完成处理)由SDK自动管理。以下是示例代码: ```Python @rollout( name="demo_rollout", runtime=Runtime( instance=PluginInstance.CPU1MEM2, max_concurrency=100, min_replicas=1, max_replicas=10, timeout=900, ), ) @coze_monitor def demo_rollout( # sync的函数,会由@rollout转换成线程并发的async函数来提升运行效率 context: PluginContext, proxy: RolloutInferenceProxy, sample: ChatCompletionSample, ) -> Optional[RolloutResult]: """ 训练时,每个样本会调用 n_sample 次rollout函数,每次调用rollout函数当前仅支持返回一条轨迹(wrap_client_inplace的client最后一次调用上下文) """ # 使用训练感知客户端 - 仅此一行不同! client = Ark(base_url=proxy.url, api_key=proxy.jwt_token) # 可以使用openai的client # from openai import OpenAI # from ark_sdk.core.plugin.rollout.proxy import wrap_client_inplace # client = OpenAI(base_url=proxy.url, api_key=proxy.jwt_token) wrap_inplace_trace(client) wrap_client_inplace(client, proxy=proxy) req = sample.model_dump() messages = req.pop("messages") tools = (req.pop("tools") or []) + rollout_tools step = 0 while True: # 步骤2: 发起模型请求,由于模型在收到工具执行结果后仍然可能有工具调用意愿,因此需要多次请求 completion = client.chat.completions.create( # model 字段仅在本地测试时生效 model=LOCAL_TEST_MODEL, messages=messages, tools=tools, ) # 注意:训练逻辑已经自动处理,无需手动判断模式或调用process_completion! messages.append(completion.choices[0].message.model_dump()) step += 1 logger.info(f"completion: {completion.choices[0].message.model_dump()}") if step >= 30: break if completion.choices[0].finish_reason != "tool_calls": # 模型最终总结,没有调用工具意愿 break tool_calls = completion.choices[0].message.tool_calls for tool_call in tool_calls or []: tool_name = tool_call.function.name if tool_name == "get_current_weather": # 步骤 3:调用外部工具 try: args = json.loads(tool_call.function.arguments) tool_result = get_current_weather(**args) except Exception as e: logger.error(f"get_current_weather error: {e}") # 重试,rollout请求,超过重试次数会DISCARD掉本条数据(包裹所有n smaple) # return RolloutResult(status=PluginStatus.RETRY, error=str(e)) # 丢弃,丢弃本样本(包裹所有n smaple) # return RolloutResult(status=PluginStatus.DISCARD, error="") # 失败,返回FAILURE重试本样本,超过重试次数会拉挂任务。如果不处理exception,默认会返回FAILURE # return RolloutResult(status=PluginStatus.FAILURE, error=str(e)) # extra字段用于传递额外的信息给reward函数,此处通知reward需要惩罚为-1分 return RolloutResult( status=PluginStatus.SUCCESS, extra={ "reward": -1, }, ) # 步骤 4:回填工具结果,并获取模型总结回复 messages.append( { "role": "tool", "content": tool_result, "tool_call_id": tool_call.id, } ) # 失败,丢弃本样本(包裹所有n smaple) # return RolloutResult(status=PluginStatus.DISCARD, error="") # 默认return None则视为rollout成功 return None ``` #### **raw_rollout.py** 通过手动初始化 Ark 客户端,并需要显式调用 proxy.update_state_from_messages 和 proxy.process_completion 来处理训练过程中的状态更新和完成回调,其实现是同步的,这赋予了开发者更底层的控制能力。以下是示例代码: ```Python @rollout( runtime=Runtime( instance=PluginInstance.CPU1MEM2, max_concurrency=100, min_replicas=1, max_replicas=10, ), ) @coze_monitor def demo_rollout( context: PluginContext, proxy: RolloutInferenceProxy, sample: ChatCompletionSample, ) -> Optional[RolloutResult]: client = Ark(base_url=proxy.url, api_key=proxy.jwt_token) # 可选:添加cozeloop trace,用于debug监控模型调用输入输出 wrap_inplace_trace(client) req = sample.model_dump() messages = req.pop("messages") tools = (req.pop("tools") or []) + rollout_tools while True: # NOTE:强化学习场景特殊逻辑 # 请求前发给 proxy 检查历史信息、更新内部状态(当 message 更改历史时,proxy 会自动截断内部维护的 token ids)。 proxy.update_state_from_messages([ChatCompletionMessage(**msg) for msg in messages]) # 步骤2: 发起模型请求,由于模型在收到工具执行结果后仍然可能有工具调用意愿,因此需要多次请求 completion = client.chat.completions.create( # model 字段仅在本地测试时生效 model=LOCAL_TEST_MODEL, messages=messages, tools=tools, # NOTE:强化学习场景特殊逻辑 extra_body=proxy.get_extra_body(), extra_headers=proxy.headers, ) assert isinstance(completion, ChatCompletion) # NOTE:强化学习场景特殊逻辑 proxy.process_completion(ChatCompletionResponse(**completion.model_dump())) logger.info(f"completion: {completion.choices[0].message.model_dump()}") messages.append(completion.choices[0].message.model_dump()) if completion.choices[0].finish_reason != "tool_calls": # 模型最终总结,没有调用工具意愿 break tool_calls = completion.choices[0].message.tool_calls for tool_call in tool_calls or []: tool_name = tool_call.function.name if tool_name == "get_current_weather": # 步骤 3:调用外部工具 args = json.loads(tool_call.function.arguments) tool_result = get_current_weather(**args) # 步骤 4:回填工具结果,并获取模型总结回复 messages.append( { "role": "tool", "content": tool_result, "tool_call_id": tool_call.id, } ) return ``` ### Grader 函数:基于字符串包含的规则化评分 #### **random_reward.py** 比较rollout结果是否包含数据集中给定的标准答案。以下是示例代码: ```Python @group_grader( name="randaom_reward", runtime=Runtime( instance=PluginInstance.CPU1MEM2, max_concurrency=100, timeout=300, ), ) def random_reward_fn( context: PluginContext, sample: ChatCompletionSample, trajectories: List[Trajectory], ) -> GroupGraderResult: """ 奖励函数:返回随机奖励 参数: - trajectories: 完整的对话历史 - sample: 样本数据,包含标准答案的字典 返回: - list[float]: 奖励分数列表,每个分数对应一个候选回复(1.0表示完全匹配,0.0表示不匹配) 依赖: - 数据集里的字典字段 extra 内需要携带 answer 字段。 """ rewards = [ t.extra["reward"] if (t.extra and "reward" in t.extra) else random.random() for t in trajectories ] return GroupGraderResult( rewards=rewards, status=PluginStatus.SUCCESS, error="", metrics={} ) ``` --- # Plugin 异常处理 Source: https://ark.volcengine.com/region:cn-beijing/docs/plugin-troubleshooting # 概述 强化学习精调依赖开发者自定义的 Plugin 函数(Rollout 与 Grader),这类函数在独立的 FaaS 环境中运行,是精调任务失败的高发环节。本文帮助您在任务失败时,按报错类型快速定位原因、区分是平台问题还是自定义代码/数据问题,并借助控制台的 Plugin 管理、资源监控与轨迹日志能力完成排查。 Plugin 函数的开发规范、可观测性配置与测试方法见 [强化学习最佳实践](/docs/reinforcement-learning-best-practices),本文只聚焦异常发生后的定位与恢复。 # 精调任务失败状态排查 任务失败时,控制台会在精调任务详情页展示失败状态与后端返回的报错信息。请先根据报错类型判断问题归属,再采取对应处理方式。 | 报错类型 | 可能原因 | 处理方式 | | --- | --- | --- | | `internal error` / `unknown error` | 平台侧异常,与您的代码和数据无关。 | 平台会在约 15 分钟后自动重试,您也可以手动重试恢复。多次重试仍失败时,请 [提交工单](https://console.volcengine.com/workorder/create?step=2&SubProductID=P00001166) 处理。 | | `Call plugin error` | 调用 Plugin 函数(Rollout / Grader)时报错,大概率是自定义函数自身的问题。 | 观察对应 Plugin 输出的日志以定位问题,详见 [通过 Plugin 管理定位问题](/docs/plugin-troubleshooting#plugin-management)。常见子类见下方 [Plugin 错误码与处理](/docs/plugin-troubleshooting#plugin-error-codes)。 | | `Invalid data` | 数据错误,通常是数据文件路径不存在或文件缺失。 | 检查数据文件路径以及数据文件是否存在。 | | `Invalid value` | 数据格式错误,字段格式或数值不合法。 | 检查数据格式是否符合要求。 | | `Loss nan` | 训练过程中 Loss 值溢出为 `nan`。 | 检查数据质量与训练参数配置,必要时从小规模数据集与更保守的参数重新验证。 | 按问题归属可归纳为三类: * **平台问题**:`internal error` / `unknown error`,无需您处理,等待自动重试,或 [提交工单](https://console.volcengine.com/workorder/create?step=2&SubProductID=P00001166) 即可。 * **Plugin 问题**:`Call plugin error`(含超时、EOF、500、FaaS OOM 等),由自定义函数触发,需结合 Plugin 日志排查。 * **数据问题**:`Invalid data` / `Invalid value` / `Loss nan`,需检查数据文件与格式。 # Plugin 错误码与处理 `Call plugin error` 是 Plugin 调用失败的统称,后端会在错误信息中携带更具体的原因。常见子类及处理建议如下: | 错误信息 | 含义 | 处理建议 | | --- | --- | --- | | `Timeout` | Plugin 函数执行超时。 | 检查函数内是否存在长阻塞调用;协程并发场景需使用异步接口,同步长耗时逻辑需去掉 `async` 以启用线程并发。详见强化学习最佳实践的并发规范。 | | `EOF` | 与 Plugin 函数的连接被意外中断。 | 多为函数进程异常退出,结合日志查看是否有未捕获异常或内存溢出。 | | `500` | FaaS 环境返回服务端错误。 | 多为运行环境问题,查看 Plugin 日志确认具体报错,必要时重试,或 [提交工单](https://console.volcengine.com/workorder/create?step=2&SubProductID=P00001166)。 | | `FaaS OOM` | 函数内存超限被终止。 | 降低单次处理的数据量或并发度,或在函数配置中调高内存规格。 | | `Create faas fault` | 创建 FaaS 函数失败,常见于配额不足。 | 确认账号 FaaS 配额是否充足,清理不再使用的函数或申请扩容。 | | Reward 返回异常数值 | Grader 返回了 `nan` 等非法评分。 | 检查 Grader 函数的评分逻辑,对异常分支做兜底处理,避免返回非法数值。 | # 通过 Plugin 管理定位问题 当任务包含自定义 Plugin 时,精调任务详情页会显示 **Plugin** 标签页,集中展示每个 Plugin 的状态、代码、监控与日志,是排查 `Call plugin error` 的主要入口。 ## 查看 Plugin 状态 Plugin 状态包括 **等待中**、**运行中**、**完成** 和 **失败**。当状态为 **失败** 时,代码页面会展示对应的失败原因说明,可据此定位是超时、内存溢出还是函数内部报错。 ## 查看 Plugin 代码 Plugin 标签页以只读方式展示本次任务实际运行的 Plugin 函数代码,便于您核对提交的版本是否正确。您也可以通过 **下载代码** 操作,将代码保存到本地进一步排查。 ## 查看 Plugin 资源监控 通过 **Plugin 选择器** 切换不同 Plugin,可查看其实时资源监控指标,用于判断失败是否由资源瓶颈引起。首屏展示的核心指标包括: * 函数执行 QPS(counts/s) * 函数执行延迟(ms) * 函数错误 QPS(counts/s) * 函数 CPU 使用率(%) * 函数内存使用率(%) * 函数实例数量(counts) * 函数出公网流量(mib/s) * 函数实例并发请求量(counts) 监控支持查看过去 1 小时、3 小时、6 小时、12 小时、3 天、7 天及自定义时间范围的数据,默认每 1 分钟自动刷新,也支持手动刷新。 > **注意**:Plugin 运行结束(完成或失败)后,监控数据会在留存期限到期后被回收,届时将无法查看。请在任务结束后及时排查。 ## 查看自定义 Plugin 日志 日志是定位 `Call plugin error` 最直接的手段。在 Plugin 标签页点击 **查看日志**,可跳转到精调详情页的 **日志** > **自定义 Plugin 日志**,查看您在 Rollout 和 Grader 函数中通过 logger 记录的关键信息。 # 通过轨迹分析定位问题 除按 Plugin 维度排查外,您还可以从单条训练轨迹的视角定位问题。在轨迹分析中: * 点击某条轨迹后,可查看该轨迹执行时的日志信息,包含时间与日志详情。 * **失败**(failed)和 **丢弃**(discard)状态的轨迹默认展开日志,成功的轨迹可手动展开。 * 日志区域提供 **Plugin 筛选器**,支持下拉切换不同 Plugin 查看对应日志。 * 支持全屏查看轨迹详情与日志,全屏模式下仍可上下切换轨迹。 # 预防建议 Plugin 异常大多可以在提交任务前发现。为避免消耗较高的强化学习任务因代码或数据问题失败,建议: * **提交前完成测试**:依次完成本地测试与在线 FaaS 测试,验证 Rollout、Grader 函数的功能、交互逻辑与并发性能。 * **提前配置可观测性**:在测试 Plugin 函数或提交任务前,先完成轨迹分析、自定义日志与效果指标的配置,便于问题发生时快速定位。 * **规范并发与错误处理**:协程并发函数避免同步长阻塞调用;对工具调用失败、异常评分等分支做明确的错误处理与兜底。 以上测试与配置的详细步骤见 [强化学习最佳实践](/docs/reinforcement-learning-best-practices)。 --- # 精调 SDK 使用指南 Source: https://ark.volcengine.com/region:cn-beijing/docs/fine-tuning-sdk # 概述 火山方舟精调 SDK 是火山方舟为开发者提供的 **通过编程方式创建和管理大模型精调任务的工具包** ,旨在为需要定制化、自动化精调流程的用户提供灵活、高效的操作入口。区别于控制台的图形化操作,开发者可通过 SDK 将精调任务创建和管理流程集成至本地或第三方系统,实现精调任务的代码化管理,尤其适用于需要结合自定义函数(如奖励函数、Rollout函数)的强化学习场景。 通过精调 SDK,您可以完成授权登录、项目初始化、Rollout / Grader Plugin 编写与调试、可用训练超参查询、精调任务创建、训练轨迹与自定义函数日志查看,以及通过控制台或 CLI 管理任务和模型产物。 目前精调SDK支持的模型及训练方式如下: | | | | | | | | | | | |foundation_model ||customization_type(训练方式) |||||||| |---|---|---|---|---|---|---|---|---|---| | | | | | | | | | | | |name |model_version |FinetuneSft |FinetuneLoRA |DPO |DPOLoRA |GRPO |GRPOLoRA |OPDLoRA |OPD | \ |> 模型名 |> 模型版本 |> 全量-SFT |> LoRA-SFT |> 全量-DPO |> LoRA-DPO |> 全量-GRPO |> LoRA-GRPO |> LoRA-OPD蒸馏 |> 全量-OPD蒸馏 | |doubao-seed-2-0-mini |260428【推荐】 |✅已支持 |✅已支持 |✅已支持 |✅已支持 |✅已支持 |✅已支持 |✅已支持 |✅已支持 | |doubao-seed-2-0-lite |260428【推荐】 |✅已支持 |✅已支持 |✅已支持 |✅已支持 |✅已支持 |✅已支持 |✅已支持 |✅已支持 | 以下是您可以参考的精调SDK入门流程 # **精调 SDK安装与环境准备** ## 前提条件 * 您已注册火山引擎账号并完成实名认证,具体步骤参见 [账号注册](https://docs.volcengine.com/docs/6261/64925?lang=zh) 及 [实名认证](https://docs.volcengine.com/docs/6261/64935?lang=zh) * 您已在火山方舟控制台开通目标模型服务、精调算力计费项及依赖的云产品(TOS-数据存储、KMS-数据及模型加密、TLS-日志及轨迹存储、veFaaS-运行plugin函数)。 |**开通模型服务、精调算力计费项**
    |**开通云产品及授权**
    | |---|---| |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/c1adb586ad6a4d028314fab8f9e04048~tplv-goo7wpa0wc-image.image) |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/ee6cd89e9489419cbcd3236ded466a47~tplv-goo7wpa0wc-image.image) | ### SDK 安装 您可以通过以下 pip 命令安装精调 SDK。 > 运行环境:python>=3.10 ```bash pip install https://ark-public-example-cn-beijing.tos-cn-beijing.volces.com/ark-sdk/ark_sdk-latest.tar.gz ``` #### 版本升级 ```Bash ark upgrade ``` #### 自动版本检查 从 0.6.0 版本开始,SDK 自带升级通道。CLI 在常规命令运行前会顺手做一次"是否有新版"检查,发现落后会进行提醒提示;手动执行 `ark upgrade` 则会真正把新版本拉下来装上。 为避免每次都发网络请求,结果会写在 `~/.ark/upgrade_check.json`,TTL 24 小时。所以如看到提示后来升级也不会被反复打扰;同样,版本更新后,本机最多隔一天才会感知到。 #### 检查静音 如不想被提示升级 SDK,可设置环境变量: ```Bash export ARK_SDK_DISABLE_UPGRADE_CHECK=1 ``` ## 配置授权信息 您需要授权将 SDK 终端关联到指定的账号和项目。授权信息来源按以下顺序解析,前者命中就不走后者: 1. CLI 命令参数(`-ak`/`-sk`/`-sts` 或 `--credential-file`) 2. 同名环境变量 3. `ark login` 已落盘的 `~/.ark/authorization.json` 鉴权结果 授权方式包括交互式登录、参数化登录以及单次 CLI 命令级授权。 ### ark login 交互式登录 使用 `ark login` 命令开启授权过程,适用于本地开发环境的首次配置。 1. 在终端工具中,使用`ark login`命令开启授权过程 2. 请按提示依次输入以下信息,以回车结束 * AK/SK:密钥包括 Access Key ID(简称为 AK) 和 Access Key Secret(简称为 SK),详情请参考 [Access Key(密钥)管理](https://docs.volcengine.com/docs/6291/65568?lang=zh) * Region:输入您需要访问的可用区,默认为 cn-beijing ,对应华北2(北京) * Project:选择您的项目,默认为 default ### ark login 参数化登录 如果需要在脚本或自动化环境中完成登录,可以在 `ark login` 命令中通过参数传入授权信息,减少人工交互。不同环境下可用参数可能随 SDK 版本变化,建议先执行 `ark login --help` 查看当前版本支持的参数。 ```Bash ark login --help ``` ### CLI 命令级授权 除使用 `ark login` 写入默认授权信息外,您也可以在单次 CLI 命令中通过参数指定账号、项目、Region 等授权信息。该方式适用于 CI/CD、临时调试或需要在同一终端中切换多个项目的场景。 ```Bash ark [arguments] [options] ``` > **说明** > > 命令级授权不会替代本地默认登录配置。若某个参数在命令级和默认配置中同时存在,以命令级参数为准。 # 创建精调任务 ## 项目的初始化 您可通过`ark init workspace <文件夹名> --template <模板名>`命令,使用指定的template模板初始化一个具备基础结构和配置、可立即使用的精调项目,例如: ```Python ark init workspace ark_rl_project --template rl_demo #工作区内结构如下 #<文件名> #├── data #│ └── mcj_rollout_test_dataset.jsonl #├── plugins #│ ├── random_reward.py #│ └── raw_rollout.py #│ └── weather_rollout.py #│ └── async_weather_rollout.py #│ └── test_utils.py #├── job.py #├── job.yaml #├── README.md #├── arkworkspace.toml #└── requirements.txt #└── test_faas.py ``` 目前支持的模板如下: |template 模板名 |简介 | |---|---| |rl_demo |该模板通过强化学习,使模型精准掌握自定义函数调用天气工具的时机与方式,实现更精准流畅的天气问答功能。可按需扩展至强化学习微调场景:通过强化学习微调大型语言模型(LLM),使其通过对话(Chat)API智能结合自定义工具完成特定功能。 | |rl_search_mcp_demo |模板通过强化学习微调大型语言模型(LLM),优化其在深度搜索(Deep Search)场景下的性能。经训练后,模型增强了对复杂搜索意图的理解能力,可高效准确调用MCP/外部搜索API,进而生成高质量且精准的搜索结果与答案。 | ## 精调参数的配置 您可以通过 Python 对象(`job.py`)或 YAML 文件(`job.yaml`)配置精调项目相关参数。两种方式使用同一套元数据字段,适用场景如下: * **Python 对象配置**:适合需要在代码中动态组装参数、复用函数逻辑或结合自定义 Plugin 开发的场景。 * **YAML 文件配置**:适合配置相对固定、需要在 CI/CD 或命令行中复用同一份任务配置的场景。 精调项目相关参数包括: * **必选参数**: * `customization_type`:训练类型,支持 FinetuneSft / FinetuneLoRA/DPO/DPOLoRA/GRPO/GRPOLoRA/PPO * `model_reference`:基础模型及其版本信息 * foundation_model: 基于模型广场模型训练 * name: 模型名 * model_version: 模型版本 * custom_model_id: 模型仓库模型 id,与foundation_model互斥(例:custom_model_id: cm-20251019092329-rxxxv) * `data`:训练数据配置 * training_set: 训练集 (选择以下三种方式中的一种传入训练集) 1. local_files: 一组本地文件,单个文件大小不可超过 2GB,最多传入 20 个文件 2. tos_bucket、tos_paths: TOS桶名、TOS 对象列表(列表同时存在于一个桶内) 1. datasets: 数据集配置 1. dataset_id 数据集 id 2. dataset_version_id 数据集版本 id 3. multiplier 混入倍率 4. sample_count 混入条数,与multiplier 互斥 * preset_dataset: 混入预置数据集配置,非必填 * dataset_version_id: 预置数据集 id * inject_multiplier: 混入倍率,与混入样本条数互斥 * inject_sample_count: 混入样本条数 * max_invalid_records_ratio:数据集错误容忍百分比,与数据集错误容忍数量互斥(仅支持vlm模型的RL/GRPO训练方法配置错误容忍功能) max_invalid_records_number:数据集错误容忍数量 * validation_set: 验证集,非必填 * 支持 local_files / tos_bucket+tos_paths / datasets 形态的验证集,规范同上 * validation_percentage: 切分百分之多少的训练集作为验证集,与validation_set互斥 * **可选参数**: * **`custom_rl_pipeline`:支持`GRPOPipeline `和`PPOPipeline`。该参数为强化学习流程配置,当训练方式为 GRPO或 PPO 时必填,详见**[强化学习配置](/docs/fine-tuning-sdk#0192cb9a)。 * **`enable_trajectory`**: 是否开启记录轨迹分析功能(仅支持对 RL 训练开启)。开启此功能后,系统自动采集训练过程各样本的数据输入输出结果,记录强化学习精调轨迹,并展示于方舟控制台轨迹分析功能下。此记录有助于模型效果分析与问题排查,**对强化学习至关重要,建议训练前开启**。(该功能需完成日志服务配置,需先联系管理员,前往 [模型精调-TLS配置](https://ark.volcengine.com/region:cn-beijing/finetune/tls) 开通) * `name`:任务名称 * `project`:任务所属的项目 * `hyperparameters`:超参配置,超参信息查询方法见下 * `save_model_limit`:保存训练产物数量上限 * **获取训练可用超参信息** 不同模型版本支持的训练超参数存在差异,需通过`ark`命令行工具查询指定模型版本的超参信息。 * 命令语法: ```Python ark get foundation-model --model <模型名> --version <模型版本> --fields hyperparameters <指定查询超参维度> ``` * 示例命令: ```Python ark get foundation-model --model doubao-seed-2-0-lite --version 260428 --fields hyperparameters ``` * 示例命令执行结果:
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/3ef8103d59734b559449ff03ed688b65~tplv-goo7wpa0wc-image.image)
    ## 提交精调任务 * 通过 Python 对象完成上述配置后,可通过下面的命令提交精调任务。 ```Python python job.py ``` * 通过 YAML 文件完成上述配置后,可通过下面的命令提交精调任务。 ```Python ark create mcj -f job.yaml ``` # 强化学习配置 ## 强化学习流程 创建强化学习任务时,需配置强化学习流程`custom_rl_pipeline`,先选定 pipeline 类型,再按要求配置对应 plugin 函数。具体要求如下: |支持的 pipeline 类型 |`GRPOPipeline `和`PPOPipeline` | |---|---| |rollout plugin 要求 |仅支持填入 1 个自定义 rollout plugin,不填默认使用单轮模型推理 rollout 逻辑 | |grader plugin 要求 |至少需要填入一个 grader plugin,支持填写多个并分别配置权重 | ## 强化学习插件(plugin) 目前支持以下自定义plugin类型: * **Rollout plugin函数**,通过`@rollout` 装饰器标记,支持在函数内实现自定义Rollout逻辑(如某个特定业务场景的多轮推理、多次工具调用的agent) * **Grader plugin函数**,用于计算reward奖励分数,目前支持: * 单样本评分器(single_grader),通过`@single_grader` 装饰器标记。针对一条轨迹独立打分。平台将同一条样本的 n_samples 拆解成多个请求分别独立打分。 * 多样本评分器 (group_grader),通过`@group_grader`装饰器标记。针对一条样本的一组轨迹(不限定特定条数,一般为多条)打分,一次调用输入n_samples,返回一组得分 可在工作仓库任意位置实现满足规范的函数,并使用 SDK 提供的装饰器来为函数声明 plugin 相关的元信息与运行时配置。如果未填写装饰器信息,函数不能作为 plugin 函数使用。 > **说明** > > **装饰器** > 用于标记 plugin 函数类型,声明 plugin 相关元信息与运行时配置。提交任务时将根据plugin类型校验是否满足函数签名和强化学习pipeline是否完备。 > * **类型**:支持`@rollout`/`@single_grader`/ `@group_grader`三种类型的装饰器 > * **参数**: > > * **name**:可选,为 plugin 指定名字,不提供时默认使用函数名 > > * **description**:可选,为 plugin 附加描述 > > * **runtime.instance**:可选,指定 plugin 运行实例规格,当过载时可适当增加。默认值 CPU1MEM2(对应cpu1核内存2gb)、最大值CPU16MEM128,cpu核数:内存gb数=1:2、1:4、1:8 > > * **runtime.timeout**:可选,plugin 函数执行的超时秒数,默认值取决于服务端逻辑,最大值900。plugin耗时过高会导致训练资源闲置增加费用,建议尽可能优化减少耗时 > > * **runtime.max_concurrency**:可选,单 plugin 函数实例最大请求并发数,超该值触发扩容,可根据负载情况调整。默认值10,最大100,最小1 > > * **runtime.request_concurrency**:可选,用于限制训练引擎同一时间并发发起的 FaaS 请求数量,建议与测算的环境承载能力相同(建议使用 512(>= batch_size \* 8)尽可能提高环境承载力及并发值,以提升训练效率)。默认值当前为 512。要求 ark-sdk 版本 >= 0.2.17 我们提供了以下Rollout plugin函数模板和Grader plugin函数模板,您可参考签名要求和函数模板实现所需函数。 ### **Rollout函数** Rollout 函数主要实现 agent loop 的逻辑,函数提供 OpenAI 兼容的模型 API,用户完成 sample 过程。这个需用通过 `@rollout`这个装饰器来指定一些函数运行信息。 #### **Rollout签名要求** ```Python class RolloutResult(BaseModel): status: str # success/failure/discard/retry error: str extra: Dict[str, Any] async def demo_rollout( context: PluginContext, proxy: RolloutInferenceProxy, sample: ChatCompletionSample, ) -> Optional[RolloutResult]: ``` **入参** |字段 |类型 |描述 |样例 | |---|---|---|---| |context |context: PluginContext |* 该请求对应的任务信息,包含 |```JSON | \ | | | * 任务 Id |{ | \ | | | * 模型名 | "model_customization_job_id": "mcj_xxxxxx_xxx", | \ | | | * 模型版本 | "foundation_model_name": "doubao-1-5-lite-32k", | \ | | | * 训练方式 | "foundation_model_version": "250115", | \ | | | * phase: 样本来自什么阶段,train/test(验证集) | "customization_type": "GRPO", | \ | | | | "phase":"train", | \ | | | | "is_mock": false | \ | | | |} | \ | | | |``` | |proxy |RolloutInferenceProxy |* 通过这个对象可以获得 client 请求模型 |* Async client | \ | | | | | \ | | | |```Python | \ | | | |# 初始化 async client | \ | | | |client = proxy.async_rollout_client() | \ | | | |completion = await client.chat.completions.create( | \ | | | | # model 字段仅在本地测试时生效 | \ | | | | model=LOCAL_TEST_MODEL, | \ | | | | messages=messages, | \ | | | | tools=tools, | \ | | | |) | \ | | | |``` | \ | | | | | \ | | | | | \ | | | |* Sync client | \ | | | | | \ | | | |```Python | \ | | | |# 初始化 sync client | \ | | | |client = proxy.rollout_client() | \ | | | |completion = client.chat.completions.create( | \ | | | | # model 字段仅在本地测试时生效 | \ | | | | model=LOCAL_TEST_MODEL, | \ | | | | messages=messages, | \ | | | | tools=tools, | \ | | | |) | \ | | | |``` | |sample |ChatCompletionSample |输入样本 |示例: | \ | | | | | \ | | |```Python |```JSON | \ | | |class ChatCompletionSample: |{ | \ | | | # GenerationConfig | "messages": [ | \ | | | n: int = 1 | { | \ | | | max_new_tokens: int = 4096 | "role": "user", | \ | | | top_p: float = 1.0 | "content": "北京天气怎么样" | \ | | | top_k: int = 0 | } | \ | | | temperature: float = 1.0 | ], | \ | | | | "tools": [ | \ | | | messages: List[ChatCompletionMessage] | { | \ | | | tools: Optional[List[ChatCompletionToolParam]] = None | "function": { | \ | | | # ark | "name": "get_current_weather", | \ | | | thinking: Optional[Thinking] = None | "description": "获取指定地点的天气信息", | \ | | | extra: Optional[Dict[str, Any]] = None | "parameters": { | \ | | | | "type": "object", | \ | | | | "properties": { | \ | | |class ChatCompletionMessage(BaseModel): | "location": { | \ | | | role: str | "type": "string", | \ | | | content: Any | "description": "地点的位置信息,例如北京、上海" | \ | | | tool_calls: Optional[List[ChatCompletionMessageToolCall]] = None | }, | \ | | | reasoning_content: Optional[str] = "" | "unit": { | \ | | | | "type": "string", | \ | | | | "enum": [ | \ | | |class ChatCompletionMessageToolCall(BaseModel): | "摄氏度", | \ | | | id: Optional[str] = "user_defined" | "华氏度" | \ | | | | ], | \ | | | function: Function | "description": "温度单位" | \ | | | | } | \ | | | type: Literal["function"] | }, | \ | | |``` | "required": [ | \ | | | | "location" | \ | | | | ] | \ | | | | } | \ | | | | }, | \ | | | | "type": "function" | \ | | | | } | \ | | | | ], | \ | | | | "model": "doubao-seed-2-0-lite-260428" | \ | | | |} | \ | | | |``` | **返回** |参数 |类型 |描述 | |---|---|---| |status |str |* success | \ | | |* failure: 引擎重试三次仍然失败则任务失败 | \ | | |* discard: 直接丢弃该样本 | \ | | |* retry:引擎重试三次仍失败则丢弃该样本 | |error |str |* 如果status 为 failure,可携带具体失败原因或错误栈信息,会打印到训练日志中 | |extra |Dict[str, Any] |* 可以添加任意数据,并且会透传到自定义 reward | #### **Rollout函数模板** * ChatAPI+自定义工具 基于精调 SDK 封装的 Chat API,搭配自定义工具实现业务逻辑,适合快速开发常规工具调用类场景(如天气查询、信息检索)。可参考`rl_demo`中 [weather_rollout.py](/docs/reinforcement-learning-best-practices#dbcdccb5) 模板。 > 若需更底层的控制能力,可参考`rl_demo`中 [raw_rollout.py](/docs/reinforcement-learning-best-practices#eee206ad) 模板,手动调用`proxy.update_state_from_messages`和`proxy.process_completion`处理训练状态,实现同步化的底层逻辑控制。 * Arkitect框架+多轮推理+MCP 基于 Arkitect 框架与 MCP(Multi-Client Proxy)多客户端代理机制,适合融合多工具、复杂多轮推理的场景(如深度搜索、多步骤任务处理)。可参考`rl_search_mcp_demo`中`draft_rollout_arkitect.py`模板。 * Arkitect框架+functioncall+API调用插件 该方案结合 Arkitect 框架的 Function Call 能力与第三方 API 插件(如搜索 API),适合需要自定义 API 调用、严格参数校验的场景(如定制化搜索、第三方服务集成)。可参考`rl_search_mcp_demo`中 [rolllout.py](/docs/reinforcement-learning-best-practices#d49bda7a) 模板。 ### **Grader函数** Grader 函数用于计算reward奖励分数,目前支持通过`@single_grader`装饰器标记的单样本评分器和通过`@group_grader`装饰器标记的多样本评分器。 #### **Grader签名要求** ```Python @dataclass class RewardFunctionResult: rewards: List[float] metrics: Dict[str, float] status: str # success/failure/discard/retry error: str def reward_fn( context: Dict[str, Any], sample: Dict[str, Any], trajectories: list[Dict[str,Any]])-> RewardFunctionResult #@group grader装饰器标记的多样本评分器为trajectories,此处以trajectories为例; #@Single grader装饰器标记的单样本评分器为trajectory,见下方入参详细说明。 ``` **入参** |字段 |类型 |描述 |样例 | |---|---|---|---| |context |context: Dict[str, Any] |* 该请求对应的任务信息,包含 |```JSON | \ | | | * 任务 Id |{ | \ | | | * 模型名 | "model_customization_job_id": "mcj_xxxxxx_xxx", | \ | | | * 模型版本 | "foundation_model_name": "doubao-1-5-lite-32k", | \ | | | * 训练方式 | "foundation_model_version": "250115", | \ | | | * phase: 样本来自什么阶段,train/test(验证集) | "customization_type": "GRPO", | \ | | | | "phase":"train", | \ | | | | "is_mock": false | \ | | | |} | \ | | | |``` | |sample |Dict[str, Any] |* rollout 输入的样本,与数据集内容完全一致 |```JSON | \ | | |* **注意** |#多模态模型样例 | \ | | | * **纯文本模型,content字段仅支持str** |{ | \ | | | * **1.6 模型或其他多模态模型,content 字段会转换为 list** | "messages": [ | \ | | | | { | \ | | | | "role": "system", | \ | | | | "content": "你是一个擅长数据计算的人工智能助手。" | \ | | | | }, | \ | | | | { | \ | | | | "role": "user", | \ | | | | "content": { | \ | | | | "type": "text", | \ | | | | "text": "1+1=?" | \ | | | | } | \ | | | | } | \ | | | | ], | \ | | | | "tools": [], | \ | | | | "extra": { | \ | | | | "answer": 1234 | \ | | | | } | \ | | | |} | \ | | | |``` | \ | | | | | \ | | | | | \ | | | |```Python | \ | | | |#纯文本模型样例 | \ | | | |{ | \ | | | | "messages": | \ | | | | { | \ | | | | "role": "user", | \ | | | | "content": "1+1=?" | \ | | | | } | \ | | | |} | \ | | | |``` | |trajectories |list[Dict[str,Any]] |通过`@group_grader`装饰器标记的多样本评分器。 |```JSON | \ | | | |[ | \ | | |* 一条样本的所有 rollout 输出的结果 | { | \ | | |* 假设一次 rollout 采样 n 次,trajectory 长度就为 n | "role": "system", | \ | | |* messages 类型为数组,非 agent rl 场景长度固定为 1+len(sample) | "content": "你是一个擅长数据计算的人工智能助手。" | \ | | |* **注意** | }, | \ | | | * **纯文本模型,content字段仅支持str** | { | \ | | | * **1.6 模型或其他多模态模型,content 字段会转换为 list** | "role": "user", | \ | | | | "content": "1+1=?" | \ | | | | }, | \ | | | | { | \ | | | | "messages": [ | \ | | | | { | \ | | | | "content": "等于 2", | \ | | | | "role": "assistant" | \ | | | | } | \ | | | | ], | \ | | | | "finish_reason": "stop", | \ | | | | "usage": { | \ | | | | "completion_tokens": 3, | \ | | | | "prompt_tokens:": 20, | \ | | | | "total_tokens": 23 | \ | | | | } | \ | | | | }, | \ | | | | { | \ | | | | "messages": [ | \ | | | | { | \ | | | | "reasoning_content": "嗯,用户问的是 1 加 1 等于多少。首先,我需要确认这是一个基本的算术问题。在常规的十进制数学中,1 加 1 的结果是 2。这是最基础的加法运算,应该没有其他复杂的情况需要考虑。用户可能是在测试我的基本计算能力,或者是刚开始学习数学的小朋友。所以直接回答 2 就可以了。", | \ | | | | "content": "1 + 1 等于 2。这是基础的算术加法运算,在十进制计数系统中,1 和 1 相加的结果是 2。", | \ | | | | "role": "assistant" | \ | | | | } | \ | | | | ], | \ | | | | "finish_reason": "stop", | \ | | | | "usage": { | \ | | | | "completion_tokens": 109, | \ | | | | "prompt_tokens:": 20, | \ | | | | "total_tokens": 129 | \ | | | | } | \ | | | | } | \ | | | |] | \ | | | |``` | |trajectory |Dict[str,Any] |通过`@single_grader`装饰器标记的单样本评分器 |```JSON | \ | | | |{ | \ | | |* 一条样本的一个 rollout 输出的结果 | { | \ | | |* messages 类型为数组,非 agent rl 场景长度固定为 1 | "role": "system", | \ | | | | "content": "你是一个擅长数据计算的人工智能助手。" | \ | | | | }, | \ | | | | { | \ | | | | "role": "user", | \ | | | | "content": "1+1=?" | \ | | | | }, | \ | | | | { | \ | | | | "messages": [ | \ | | | | { | \ | | | | "reasoning_content": "嗯,用户问的是 1 加 1 等于多少。首先,我需要确认这是一个基本的算术问题。在常规的十进制数学中,1 加 1 的结果是 2。这是最基础的加法运算,应该没有其他复杂的情况需要考虑。用户可能是在测试我的基本计算能力,或者是刚开始学习数学的小朋友。所以直接回答 2 就可以了。", | \ | | | | "content": "1 + 1 等于 2。这是基础的算术加法运算,在十进制计数系统中,1 和 1 相加的结果是 2。", | \ | | | | "role": "assistant" | \ | | | | } | \ | | | | ], | \ | | | | "finish_reason": "stop", | \ | | | | "usage": { | \ | | | | "completion_tokens": 109, | \ | | | | "prompt_tokens:": 20, | \ | | | | "total_tokens": 129 | \ | | | | } | \ | | | | } | \ | | | |} | \ | | | |``` | **返回** |参数 |类型 |描述 |样例 | |---|---|---|---| | rewards |list[float] |通过`@group_grader`装饰器标记的多样本评分器。 |```JSON | \ | | | |[ | \ | | |* 按照 trajectories 的顺序返回每个采样的得分 | 0.0, | \ | | | | 1.0, | \ | | | | 0.5 | \ | | | |] | \ | | | |``` | | reward |float |通过`@single_grader`装饰器标记的单样本评分器 |```JSON | \ | | | |0.5 | \ | | |* 单个 trajectory 的得分 |``` | |metrics |Dict[str, float] |* 支持返回 reward 过程的自定义指标,如计算耗时等。训练框架将把每个 step 的指标按 key 聚合出最大值,最小值和平均值。 |```Thrift | \ | | | |{ | \ | | | | "avg_length_reward": 0.49, | \ | | | | "avg_format_reward": 0.9, | \ | | | |} | \ | | | |``` | |status |str |* success:默认值 | | \ | | |* failure: 引擎重试三次仍然失败则任务失败 | | \ | | |* discard: 直接丢弃该样本 | | \ | | |* retry:引擎重试三次仍失败则丢弃该样本 | | |error |str |* 如果status 为 failure,可携带具体失败原因或错误栈信息,会打印到训练日志中 | | #### **常用Grader函数** 评分器的具体实现与效果定义和业务目标紧密相关,以下是一些常用的grader实现思路: * 比较rollout结果和样本预设的答案(通过训练集extra字段传入) * 全等/包含判定 可参考`rl_demo`中 [random_reward.py](/docs/reinforcement-learning-best-practices#89163b12) * 分别调用embedding模型计算相似度进行判定 * 使用LLM进行语义比较并打分 * RuleBase评分 * 输出格式判定 * token/字符串长度惩罚 * 根据过程耗时评分 * 调用外部服务/插件进行判定 * 调用Code sandbox运行代码,根据是否运行成功和运行结果与预设答案匹配度打分 * 创建excel/数据库表,根据是否创建成功打分 * 将输出的SQL语句用于查询指定数据库,根据是否能执行成功和结果是否符合预期打分 * 通过模型对单条样本进行打分 * LLM as a judge(基础模型 + prompt,可通过让模型在输出分值前思考并输出评分理由,提升评分准确性。同时也会增加训练服务的等待提高成本)可参考`rl_search_mcp_demo`中`llm_grader.py` * 训练并部署GRM(可通过让模型在输出分值前思考并输出评分理由,提升评分准确性。同时也会增加训练服务的等待提高成本) * 对多条样本排序赋分/综合打分 * 对一组样本进行排序的难度低于对多条轨迹分别打出准确分值。 ## 可观测性配置 ### **轨迹分析** 在精调参数配置`job.py`文件中配置`enable_trajectory=True`,即可开启轨迹分析功能。开启后,系统将记录强化学习训练轨迹,可视化展示于方舟控制台模型精调的轨迹分析功能下。此记录有助于模型效果分析与问题排查,**对强化学习至关重要,建议训练前开启**。如需提前查看该功能效果,详见 [轨迹分析 ](/docs/reinforcement-learning-best-practices#09770ea4)。 > **说明** > > 该功能需完成日志服务配置,需先联系管理员,前往 [模型精调-TLS配置](https://ark.volcengine.com/region:cn-beijing/finetune/tls) 开通。 > * 进入精调日志服务配置 > > ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/52a31f668c334afe9703c40eed40f630~tplv-goo7wpa0wc-image.image) > > * 开通TLS服务 > > ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/ad022ac863d2458d97286747bd4ab2e4~tplv-goo7wpa0wc-image.image) ### **自定义函数日志** 根据用户自定义需求记录Rollout、Reward函数执行中的关键信息,以精准定位问题、提高排查效率。 具体实现方面,在`rollout.py`文件内,通过`logger.info`、`logger.error`等方法完成日志记录操作。最终,这些日志将展示于方舟控制台模型精调的自定义日志功能模块下。 (该功能需完成日志服务配置,需先联系管理员,前往 [模型精调-TLS配置](https://ark.volcengine.com/region:cn-beijing/finetune/tls) 开通) ### **自定义效果指标** 支持用户在 Grader 函数中自定义业务相关的评估指标,自定义后的指标将同步展示在方舟控制台模型精调的训练观测功能模块下,便于量化分析模型性能。 具体实现:在其`metrics`字段中补充自定义的键值对,将`metrics`与`rewards`、`status`、`error`一同封装至`RewardFunctionResult`对象中返回。 例如,可通过 NumPy 库计算奖励值的均值、标准差等统计指标并传入: ```Python import numpy as np # 假设已计算得到奖励值列表rewards metrics = { "test_mean": np.mean(rewards), # 测试奖励平均值 "test_std": np.std(rewards), # 测试奖励标准差 # 可按需添加其他自定义指标 } ``` ### **Tracing** 为分析模型效果、定位问题,建议使用 Tracing 系统采集样本 rollout 每轮推理和工具调用的输入输出及耗时信息。 可选用任意 Tracing 系统,本文以**ARK Tracing /** **cozeloop**为例介绍使用方法,可参考示例调整。 **ARK Tracing(推荐)** 1. **前置依赖** 1. 开启轨迹分析功能并开通日志服务配置,见 [轨迹分析](/docs/reinforcement-learning-best-practices#09770ea4)。 2. 安装方舟精调 ark-sdk 0.2.17 及以上版本。 3. 需要为需要上报 Trace 的函数注入 ARK_TRACE_AK、ARK_TRACE_SK 环境变量,值分别为用户的 AK、SK ```JSON rollout=PipelinePluginWrapper( plugin=demo_rollout, envs={ "ARK_TRACE_AK": "xxx", "ARK_TRACE_SK": "xxx", }, ), ``` 1. 为 AK、SK 对应的用户授权 TLS PutLogs 权限(具体方式参见 [访问控制](https://docs.volcengine.com/docs/6257/0?lang=zh) 文档)。 2. **初始化与使用** * **对 Rollout、Grader 函数的输入输出Tracing**:使用 @trace_monitor 装饰器包装 rollout、reward 函数,它基于 opentelemetry 进行数据上报,并将 trace 与轨迹关联,示例如下: ```Python from ark_sdk.core.trace import trace_monitor #rollout 函数示例 @single_rollout( name="demo_rollout", runtime=Runtime( instance=PluginInstance.CPU4MEM8, timeout=900, max_concurrency=100 ), ) @trace_monitor def demo_rollout( context: PluginContext, proxy: RolloutInferenceProxy, sample: ChatCompletionSample, ) -> Optional[RolloutResult]: # 函数实现... #grader 函数示例 @single_grader @trace_monitor def single_random_reward_fn( context: PluginContext, sample: ChatCompletionSample, completion: ChatCompletion ) -> SingleGraderResult: # 函数实现... ``` * **对 LLM Chat 的输入输出 Tracing**:使用 wrap_inplace_trace 函数包装 LLM 客户端。示例如下: ```Python from ark_sdk.core.trace import wrap_inplace_trace client = AsyncArk(base_url=proxy.url, api_key=proxy.jwt_token) wrap_inplace_trace(client) ``` * **对中间过程添加自定义Tracing**:使用 @observe() 装饰器记录任意函数的输入输出。示例如下: ```Python from ark_sdk.core.trace import observe @observe() def get_current_weather(location: str, unit="摄氏度"): # 自定义中间过程函数实现 ``` **CozeLoop Tracing** 1. **配置与环境设置**:cozeloop配置详情请参考 [cozeloop SDK 使用指南](https://loop.coze.cn/open/docs/cozeloop/python-sdk)。 * **本地运行配置**:在终端中设置以下环境变量: ```Python export COZELOOP_WORKSPACE_ID=xxx export COZELOOP_API_TOKEN=xxx ``` * **训练环境配置**:需在 faas 的环境变量中添加如下内容: ```Python rollout=PipelinePluginWrapper( plugin=demo_rollout, envs={ "COZELOOP_API_TOKEN": "xxx", "COZELOOP_WORKSPACE_ID": "xxx", }, ), ``` 2. **使用方法**: * **对Rollout函数的输入输出Tracing**:使用`@coze_monitor`装饰器包装 rollout 函数。该装饰器来自项目中的`plugins/``coze_monitor.py`文件,它基于 cozeloop 库进行数据上报,会从`proxy`中取出 rollout 实际的轨迹返回,并以精调任务的 ID 作为`user_id`(本地测试时`user_id`默认为`test_service`),方便在 cozeloop 平台上进行数据分析和筛选。示例如下: ```Python @rollout( name="code_sandbox_grader_single_grader", description="code_sandbox_grader", runtime=Runtime( instance=PluginInstance.CPU2MEM4, timeout=900, ), ) @coze_monitor async def demo_rollout(context, proxy, sample): # 函数实现... ``` * **对LLM Chat的输入输出Tracing**:使用`wrap_inplace_trace`函数包装 LLM 客户端。示例如下: ```Python client = AsyncArk(base_url=proxy.url, api_key=proxy.jwt_token) wrap_inplace_trace(client) ``` * **对中间过程添加自定义Tracing**:使用`@observe()`装饰器记录任意函数的输入输出。示例如下: ```Python @observe() # type: ignore async def exec_tool_call(tool_client, name, arguments): ``` 3. **Cozeloop 效果**:若您完成了 cozeloop 配置,运行后可在 Cozeloop 平台观测 Rollout 过程,具体效果如下: * 分析各阶段耗时,优化rollout链路 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/656ea1f8fc894a04b6543b3cfb2a91af~tplv-goo7wpa0wc-image.image) * 指定任务,筛选 结束原因为输出超长的 模型返回 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/deb08a96fd8b4712b77c05fe4e7a144b~tplv-goo7wpa0wc-image.image) ## Plugin函数的测试 为确保 Plugin 函数功能符合预期,在提交强化学习任务前,需先进行本地测试,再提交在线 FaaS 测试,最后提交训练任务。 ### **本地测试** 在实现 rollout 函数的文件里,`main` 函数展示了如何在本地测试`rollout`函数和`grader`函数的结合使用。它支持用户进行单样本调试和多样本批量调试。代码如下。 * **单样本调试**:测试时会基于样本,调用 demo_rollout 执行推理,获取模型的回答;将模型的回答和原始问题、正确答案一起传递给 llm_grader 进行评估,并打印评估结果。 * **多样本调试**:main 函数还展示了如何使用 test_with_dataset 函数对一个数据集中的多个样本进行批量推理和评估,以获取平均奖励分数。 ```Python async def main(): from ark_sdk.core.plugin.rollout.proxy import InferenceProxy, Mode from plugins.llm_grader import llm_grader import os # 调试模式,使用公共服务 mode = Mode.Inference base_url = "https://ark.cn-beijing.volces.com/api/v3" api_key = os.getenv("ARK_API_KEY", "xxx") sample = ChatCompletionSample( **{ "messages": [ { "role": "user", "content": "通过景栗科技的私域运营服务和与薪勤科技的产品共创,哪两个公司在各自的领域实现了用户增长或应用上架?", } ], "thinking": {"type": "enabled"}, "extra": {"answer": "景栗科技和薪勤科技", "prompt_id": "123"}, } ) proxy = InferenceProxy(sample, url=base_url, jwt_token=api_key, mode=mode) resp = await demo_rollout({}, proxy, sample) assert resp is None or resp.status == PluginStatus.SUCCESS, ( f"rollout failed - {resp.error}" ) logger.info(f"demo rollout done with result: {proxy.messages}") grader_res = await llm_grader( {}, sample, [ Trajectory( messages=proxy.messages, usage=proxy.usage, finish_reason=proxy.finish_reason, extra=resp.extra if resp else {}, ) ], ) logger.info(f"demo grader done with result: {grader_res}") logger.info("small dataset") jsonl_file_path = "./data/search_dataset_dev_100.jsonl" from plugins.test_utils import test_with_dataset # NOTE: 可以针对其他模型测试数据集的reward分数,或者构建SFT数据集进行冷启动。正式提交任务前请使用此方法测试整体流程的并发能力,max_concurrent=batch_size,保证训练运行效率 rewards = await test_with_dataset( jsonl_file_path, demo_rollout, llm_grader, api_key, base_url=base_url, limit=100, max_concurrent=16, n_sample=1, top_p=1, temperature=1.0, ) logger.info(f"avg rewards: {sum(rewards) / len(rewards)}") ``` ### **在线FaaS测试** 完成本地测试后,用户可采用 SDK 或 CLI 方式拉起在线运行环境对`plugin`函数进行测试。需先完成 `requirements.txt` 的更新,具体要求及测试方法如下: * **更新requirements.txt**:为避免 FaaS 环境装包时依赖自动升级引发异常,按以下规则生成`requirements.txt`: * 本地环境验证通过后,推荐使用 uv 管理环境,执行`uv pip freeze > requirements.txt`固定间接依赖版本,过滤冗余依赖,精简依赖列表。 * **SDK方式用法** 运行demo中`test_faas.py`文件,具体代码如下: ```Python from ark_sdk.resources.pipeline_plugin.test_instance import ( get_or_create_pipeline_plugin_test_instance, ) from ark_sdk.types.pipeline_plugin.rollout import ( ChatCompletionSample, ) from plugins.rollout import demo_rollout from ark_sdk.core.plugin.rollout.proxy import InferenceProxy, Mode if __name__ == "__main__": instance = get_or_create_pipeline_plugin_test_instance(demo_rollout) base_url = "https://ark.cn-beijing.volces.com/api/v3" api_key = "your_apikey" sample = ChatCompletionSample( **{ "messages": [ { "role": "user", "content": "北京天气", } ], "extra": {}, } ) proxy = InferenceProxy(sample, url=base_url, jwt_token=api_key, mode=Mode.Inference) resp = instance.request( { "context": {}, "proxy": proxy, "sample": sample, }, # sync 为false时不会创建新的faas函数(不会更新代码) sync=False, ) print(resp) ``` * **CLI方式用法** 通过 `ark test pipeline_plugin` 命令,快速测试强化学习精调的自定义 Plugin 函数。 * 命令语法 ```Bash ark test pipeline_plugin --fn <函数标识> --request [--sync] ``` * 关键参数 |参数 |必填 |说明 | |---|---|---| |--fn |是 |函数唯一标识,例:`plugin.code_agent_grader:grader` | |--request |是 |JSON 格式请求体,具体样例可参考SDK用法。 | |--sync |否 |默认值为否,用于确定在执行前是否触发一次同步。 | * 完整示例 ```Bash ark test pipeline_plugin --fn plugin.code_agent_grader:grader --request '{"sample":{...},"completion":{....}}' --sync ``` ## 提交调试任务 > 此功能需要使用 0.2.16 或更高版本的 SDK。 您可以提交一个调试任务,在不排队等待 GPU 资源的情况下,对数据和 plugin 进行端到端校验。在 rollout 过程中,该任务将请求您指定的 endpoint 来执行推理。 要提交调试任务,请在 `ModelCustomizationJob` 对象中设置 `debug_config`(包含 `endpoint_id` 和 `apikey`),并在调用 `submit` 函数时将 `debug` 参数设为 `True`。 **通过 Python 脚本提交** ```Python if __name__ == "__main__": mcj = ModelCustomizationJob( name="test-mcj", data=Data( training_set=TrainingDataset(local_files=["tests/e2e/data/grpo_naive.jsonl"]) ), model_reference=ModelReference( foundation_model=FoundationModelReference( name="doubao-seed-2-0-lite", model_version="260428" ) ), custom_rl_pipeline=GRPOPipeline( rollout=demo_rollout, graders=[random_reward], ), debug_config=ModelCustomizationJobRLDebugConfig( apikey="your_api_key", endpoint_id="endpoint_id", # ep 对应模型无需和训练模型属于同一模型 ) ) mcj.submit(debug=True) # 设为 true 才会提交调试任务,否则仍是正式训练任务 print(mcj.url) ``` **通过 YAML 提交** ```YAML name: sdk-job customization_type: GRPO model_reference: foundation_model: name: doubao-seed-2-0-lite model_version: '260428' custom_rl_pipeline: graders: - plugin: name: random_reward python_func: plugins.random_reward:random_reward_fn envs: foo: bar weight: 0.5 rollout: plugin: name: demo_rollout python_func: plugins.weather_rollout:demo_rollout envs: foo: bar data: # 数据配置 training_set: local_files: - ./data/mcj_rollout_test_dataset.jsonl # 训练集本地文件路径 save_model_limit: 1 # 保存模型的数量限制 debug_config: apikey: your_api_key endpoint_id: endpoint_id ``` 执行以下命令可以完成 YAML 提交调试任务。 ```Bash ark create mcj --file job.yaml --debug ``` ## 提交强化学习任务 完成 plugin 函数编写、测试和调试任务验证后,即可提交正式的强化学习训练任务。提交方式与普通精调任务一致,通过 Python 对象或 YAML 文件配置 `custom_rl_pipeline` 后执行提交命令。 * 通过 Python 对象提交: ```Python python job.py ``` * 通过 YAML 文件提交: ```Python ark create mcj -f job.yaml ``` 提交后,任务将进入排队调度阶段,您可通过控制台或 CLI 查看任务状态和训练进度。 ## 使用资源组提交任务 如果您的账号或项目已经配置了专用资源组,可以在创建任务时指定资源组,让训练任务调度到对应资源池。资源组适用于资源隔离、稳定性保障或高优任务等场景。 使用资源组前,请确认: * 目标资源组已经开通并授权给当前账号或项目。 * 当前精调任务的模型、训练方式和资源组能力匹配。 * 资源组参数名称和取值以当前 SDK / CLI 版本为准,可通过 `ark create mcj --help` 或 SDK 类型定义查看。 # 查看并管理精调任务 创建精调任务后,您可以通过**控制台**和 **CLI 命令行**两种方式查看和管理精调任务。 ## 控制台 您可以访问 [**控制台**](https://ark.volcengine.com/region:cn-beijing/finetune) 进行界面化操作,查看任务状态、训练进度和日志等信息。 ## CLI 方式 CLI命令整体使用格式为 `ark [verb] [noun] [arguments] [options]` ,常用任务管理命令说明如下表所示。 |功能描述 |命令语法 |关键参数 / 选项 |说明 | |---|---|---|---| |查看所有精调任务 |ark list mcj [选项] |`--page-size/-ps`:单页返回数量,默认为 10 |列举账号下的精调信息,包括精调任务ID,名称,训练方式,基础模型,现处阶段等。 | \ | | |`--page-number/-pn`:查询页数,默认为 1 | | \ | | |`--customization_type/-t`:限制查询的任务训练方式,多个训练方式逗号分隔,默认不限制 | | \ | | |`--phase/-p`:限制查询的任务的阶段,多个训练方式逗号分隔,默认不限制 | | |获取单个任务详情 |ark get mcj <任务ID> |任务ID:可通过 [控制台](https://ark.volcengine.com/region:cn-beijing/finetune) 或查看所有精调任务命令获取 |可获取精调任务详情:包括基任务的身份标识、当前状态、使用和生成模型信息、超参数、数据集位置、控制台链接 : 在网页上查看此任务的快捷入口。 | |拉取任务配置至本地 |ark pull mcj <任务ID> [选项] |`--include-data/--exclude-data`:用于选择是否拉取数据,默认不拉取数据。 |本地修改后重新提交将生成新任务,不影响原任务。 | \ | | |`--include-plugin/--exclude-plugin`:用于选择是否拉取plugin代码,默认拉取。 | | 常用命令示例如下: ```Bash # 1. 查看单页20条、第2页的RL类型精调任务 ark list mcj -ps 20 -pn 2 -t RL # 2. 查询指定ID的任务详情 ark get mcj mcj-xxxxxx-xxx # 3. 拉取任务配置、数据集及Plugin代码至本地 ark pull mcj mcj-xxxxxx-xxxxx --include-data --include-plugin ``` # 精调产物使用与管理 精调任务完成后,会生成自定义模型产物。您可以对这些产物进行查看、部署、量化、上传等操作。更多详情请参阅 [管理自定义模型](/docs/manage-custom-models)。 ## 控制台 您可以在 [控制台](https://ark.volcengine.com/region:cn-beijing/finetune) 的模型管理页面查看和管理精调产物。 ## CLI 方式 常用产物管理命令如下: 1. **查看全部产物** ```Bash ark list cm ```
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/a3d9d71d0aed4a7fbabded2c16e6dc3c~tplv-goo7wpa0wc-image.image)
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/0184753885fa4b3eb080fd4f0294952e~tplv-goo7wpa0wc-image.image)
    2. **上传模型**
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/09217c65bbc942728f3415e5dfefd445~tplv-goo7wpa0wc-image.image)
    ```Bash # 上传qwen模型 ark create um -n $name -fmv qwen3-0-6b/20250429 -q BF16 -tb $TOS_BUCKET -tp $TOS_PREFIX ``` 3. **量化模型**
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/97f6ebfdcb7b41f3958786a829ed8152~tplv-goo7wpa0wc-image.image)
    ```Bash # 创建W8A8精度模型 ark create qm -id cm-import-20260202164216-bs9bx -q W8A8_FP8 ``` 4. **查看指定产物的量化模型**
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/ecc627662b22464c93d8a0062b42e3e3~tplv-goo7wpa0wc-image.image)
    ```Bash ark list qm -id $cm_id ``` # Advanced Feature 以下能力用于定制强化学习的数据采样、优势值计算、蒸馏和训练稳定性。使用前请先升级到最新版本 SDK,并通过本文开头的模型支持表和 `ark get foundation-model` 查询目标模型、训练方式及超参数是否支持对应能力。 ## Group Rollout Group Rollout 用于需要在同一组样本或同一组候选输出之间共享上下文、统一采样或统一计算中间结果的强化学习场景。相比逐条样本独立执行 rollout,Group Rollout 可以帮助您在插件函数中按组处理样本,减少重复计算,并为组内相对比较类任务提供更自然的实现方式。 普通 Single Rollout 会针对同一个 sample 并行执行 `num_generations` 次,各条 trajectory 互相不可见。Group Rollout 则只调用一次 plugin,并在同一次调用中生成 `n_sample` 条 trajectory,因此各分支可以共享中间状态或互相比较。 |对比项 |Single Rollout |Group Rollout | |---|---|---| |装饰器 |`@single_rollout`(旧的 `@rollout` 仍兼容) |`@group_rollout` | |执行粒度 |一次调用生成一条 trajectory |一次调用生成一组 trajectory | |分支感知 |各 trajectory 相互独立 |同组 trajectory 可以共享状态 | |返回类型 |`RolloutResult` |`GroupRolloutResult` | |对话接口 |Chat API 或 Responses API |必须使用 Responses API | ### 函数签名 Group Rollout 的函数签名需要增加 `n_sample` 参数。`n_sample` 等于任务中的 `num_generations`,由训练引擎传入。 ```Python @group_rollout( name="group_rollout", runtime=Runtime( instance=PluginInstance.CPU4MEM8, max_concurrency=100, min_replicas=1, max_replicas=10, timeout=900, ), ) async def group_rollout( context: PluginContext, proxy: RolloutInferenceProxy, sample: ChatCompletionSample, n_sample: int = 1, ) -> GroupRolloutResult: ... ``` `proxy.rollout_client()` 和 `proxy.async_rollout_client()` 会根据装饰器自动返回适用于 Single Rollout 或 Group Rollout 的客户端。只有直接调用底层包装函数时,才需要区分: * Single Rollout:`wrap_client_inplace` / `wrap_async_client_inplace`。 * Group Rollout:`wrap_responses_client_inplace` / `wrap_responses_async_client_inplace`。 ### 返回结构 ```Python class SingleResponse(BaseModel): id: str extra: Optional[Dict] = None class GroupRolloutResult(BaseModel): status: PluginStatus = PluginStatus.SUCCESS error: Optional[str] = None responses: List[SingleResponse] = [] ``` 一个 `GroupRolloutResult` 中的所有 trajectory 共享 `status` 和 `error`。如果整个 group 返回 `PluginStatus.DISCARD`,训练引擎会丢弃这一组样本。返回时还需满足: * `responses` 中每个 `id` 对应一条以该 response 为最后一轮的完整 trajectory。 * `len(responses)` 必须等于 `n_sample`,SDK 会在提交或运行时校验。 * `SingleResponse.extra` 会透传给 Grader plugin,可用于携带预计算奖励或业务元数据。 ```Python return GroupRolloutResult( status=PluginStatus.SUCCESS, responses=[ SingleResponse(id=response_1.id), SingleResponse(id=response_2.id), SingleResponse(id=response_3.id, extra={"reward": 1.0}), ], ) ``` ### 使用 Responses API 构造分支对话 Group Rollout 必须使用 Responses API。多轮对话时只需传入本轮新增的 input,并通过 `previous_response_id` 指定父节点。SDK 会在客户端维护上下文,不需要手动拼接完整 messages。 ```Python client = proxy.async_rollout_client() response_1 = await client.responses.create( model="doubao-seed-2-0-lite-260428", input=[{"role": "user", "content": "人之初"}], ) response_2 = await client.responses.create( model="doubao-seed-2-0-lite-260428", input=[{"role": "user", "content": "性相近"}], previous_response_id=response_1.id, ) response_3 = await client.responses.create( model="doubao-seed-2-0-lite-260428", input=[{"role": "user", "content": "苟不教"}], previous_response_id=response_1.id, ) return GroupRolloutResult( status=PluginStatus.SUCCESS, responses=[ SingleResponse(id=response_1.id), SingleResponse(id=response_2.id), SingleResponse(id=response_3.id), ], ) ``` Responses API 的 function tool 结构不需要 Chat API 中的 `function` 嵌套层: ```JSON [ { "type": "function", "name": "get_current_weather", "description": "获取指定地点的天气信息", "parameters": {"type": "object", "properties": {}} } ] ``` > **注意** > > 不要在 `client.responses.create()` 或 `client.chat.completions.create()` 中直接设置 `n`、`max_new_tokens`、`top_p`、`top_k`、`temperature`、`thinking` 等 GenerationConfig 参数。请在 sample 或任务超参数中统一配置,否则 SDK 会报错。 如果需要插入外部模型生成且不参与训练的消息,可调用 `proxy.update_state_from_messages()`。该方法只接收增量消息,并返回可继续分支对话或直接放入结果的 response ID。 ```Python new_id = proxy.update_state_from_messages( messages=[ {"role": "user", "content": "子不教"}, {"role": "assistant", "content": "父之过"}, ], previous_response_id=response_3.id, ) ``` ## Custom Advantages 在 GRPO 训练中,Custom Advantages 支持您在每条 trajectory 中自定义 token level(或 sequence level)的 advantages,并返回给训练引擎,从而在优势估计环节引入业务侧的定制化逻辑。 标准 GRPO 会先对同组 reward 做归一化,得到 sequence level advantage,再广播到各 token,并乘以 loss mask 屏蔽不参与训练的 token。 ![GRPO 组内归一化优势值计算流程](https://arkdocs.tos-cn-beijing.volces.com/images/training/custom_advantages_grpo_computation.png) Custom Advantages 允许 Grader plugin 直接返回自定义的 sequence level 或 token level advantages。默认不返回这两个字段时,训练引擎继续使用标准算法,不影响已有任务。 ```Python class GroupGraderResult(BaseModel): rewards: List[float] metrics: Dict[str, float] status: PluginStatus error: str seq_advantages: Optional[List[float]] = None tok_advantages: Optional[List[List[float]]] = None ``` ### Sequence level advantages `seq_advantages` 中的每个元素对应一条 trajectory,列表长度必须与 `trajectories` 相同。下面的示例复现标准 GRPO 的组内 reward 归一化逻辑。 ```Python def custom_advantage_grader( context: PluginContext, sample: ChatCompletionSample, trajectories: List[Trajectory], ) -> GroupGraderResult: rewards = [ trajectory.extra["reward"] if trajectory.extra and "reward" in trajectory.extra else 0.0 for trajectory in trajectories ] import math count = len(rewards) if count > 1: reward_mean = sum(rewards) / count variance = sum( (reward - reward_mean) ** 2 for reward in rewards ) / (count - 1) reward_std = math.sqrt(variance) + 1e-6 else: reward_mean = 0.0 reward_std = 1.0 seq_advantages = [ (reward - reward_mean) / reward_std for reward in rewards ] return GroupGraderResult( rewards=rewards, status=PluginStatus.SUCCESS, error="", metrics={}, seq_advantages=seq_advantages, ) ``` ### Token level advantages 使用 token level advantages 时,可以从 `Trajectory` 获取以下 token 信息: ```Python class Trajectory: total_loss_weight: Optional[List[float]] = None total_token_ids: Optional[List[int]] = None total_token_logprobs: Optional[List[float]] = None ``` `total_token_ids` 覆盖从 sample 开始到最后一轮对话结束的所有 token。`total_loss_weight` 和 `total_token_logprobs` 与其逐项对齐。`total_loss_weight` 中的有效值对应由 policy model 生成、参与训练的 assistant token;用户消息、外部拼接消息和其他不参与训练的部分会被 mask。 ![total_loss_weight 与多轮对话中有效 assistant token 的对应关系](https://arkdocs.tos-cn-beijing.volces.com/images/training/custom_advantages_loss_weight.jpg) 返回 `tok_advantages` 时,外层列表需与 `trajectories` 一一对应,内层列表长度需与该 trajectory 的 `total_token_ids`、`total_loss_weight` 和 `total_token_logprobs` 一致。不参与训练的位置可以填占位值,训练引擎仍会再次应用 mask。 ```Python tok_advantages = [] for index, trajectory in enumerate(trajectories): assert trajectory.total_loss_weight is not None token_count = len(trajectory.total_loss_weight) token_values = [ seq_advantages[index] for _ in range(token_count) ] tok_advantages.append(token_values) return GroupGraderResult( rewards=rewards, status=PluginStatus.SUCCESS, error="", metrics={}, tok_advantages=tok_advantages, ) ``` ### 配置约束 * 同一次 Grader plugin 调用不能同时返回 `seq_advantages` 和 `tok_advantages`。 * 同一个 batch 不能只有部分样本启用 Custom Advantages、其余样本返回 `None`。 * 在满足前两项约束时,同一个 batch 中可以同时存在 sequence level 和 token level advantages,训练引擎会统一展开到 token level。 * 对返回值执行长度、数值范围及 `NaN` / `Inf` 校验,避免异常值影响训练稳定性。 ### 感知训练步数 Rollout 和 Grader plugin 可以通过 `PluginContext.current_training_step` 获取当前训练步数。该值与轨迹分析中显示的 step 一致,可用于按训练阶段调整 reward 或 advantages。 ```Python class PluginContext(BaseModel): model_customization_job_id: str = "" foundation_model_name: str = "" foundation_model_version: str = "" customization_type: str = "" phase: str = "" is_mock: bool = False current_training_step: Optional[int] = None ``` ## OPD 蒸馏 OPD(On-Policy Distillation)蒸馏支持在强化学习流程中结合在线蒸馏,通过教师模型在策略采样过程中提供监督信号,帮助学生模型在保持策略一致性的同时提升训练效率与效果。 OPD 适用于同系列模型之间的白盒蒸馏,支持: * 为不同 trajectory 动态选择 teacher,实现 Multi-Teacher Routing。 * 同时组合 task reward(GRPO、GAE 或 Custom Advantages)与 OPD 信号。 * 为 teacher 配置与 student 不同的 context,例如 rubric、人工示范轨迹或参考步骤。 跨系列模型和黑盒蒸馏暂不支持。具体 student/teacher 组合、训练方式和开白范围以模型支持表及控制台为准。 ![OPD 中 student、teacher、reward 与 loss 的处理流程](https://arkdocs.tos-cn-beijing.volces.com/images/training/opd_training_flow.jpg) ### 配置 Teacher 在 Rollout plugin 的结果中写入本条 trajectory 使用的 teacher 名称: ```Python return RolloutResult( status=PluginStatus.SUCCESS, config={ "teachers": { "teacher_math": {}, } }, ) ``` 在 `job.py` 的 OPD pipeline 中为同名 teacher 配置模型: ```Python teachers = { "teacher_math": TeacherConfig( model=ModelReference( foundation_model=FoundationModelReference( name="doubao-seed-2-0-mini", model_version="260428", ) ) ) } pipeline = OPDPipeline( rollout=demo_rollout, graders=[task_reward], teachers=teachers, ) ``` 当前一条 trajectory 只能指定一个 teacher;如需多 teacher,可为不同 trajectory 分配不同 teacher。 > **说明** > > OPD 的 trajectory 仍由 student 生成。Student 知识不足时,建议先用少量高质量数据完成 SFT 冷启动,再执行 OPD。还可以配置仅用于观测的 task reward;当 reward 不参与训练时,避免在训练阶段执行高成本评分逻辑。 ### Advantage 与 Loss OPD 将 task advantage 和 student/teacher 的概率差异组合为训练信号: ```Plain Text OPD Advantage = task_reward_coef * task_advantage - kl_reward_coef * (student_logprob - teacher_logprob) ``` 支持以下策略梯度 Loss: |Loss |说明 |建议场景 | |---|---|---| |`ppo_is` |标准 PPO clipped objective |需要保持标准 PPO 目标时使用 | |`mis_pg` |对 importance ratio 截断后直接作为策略梯度权重,越界 token 梯度为 0 |默认推荐;建议 `clip_ratio_high=0.5`、`clip_ratio_low=0.5` | |`tis_pg` |将截断后的 importance ratio detach,再加权 log probability |需要 Truncated IS-PG / CISPO 语义时使用 | 建议将 `loss_agg_mode` 设为 `token-mean`。具体可用 Loss 和超参数范围以 `ark get foundation-model` 的查询结果为准。 ### 配置 Teacher context Teacher context 只对 teacher 可见,可用于提供 rubric、参考步骤或人工示范,不会写入 student 的可见上下文。`qa_index` 从 0 开始,按 policy model 生成的 assistant 轮次计数。 ```Python return RolloutResult( status=PluginStatus.SUCCESS, config={ "teachers": { "teacher_math": { "teacher_context": [ TeacherContext( qa_index=0, message=ChatCompletionMessage( role="user", content="以下是参考步骤:...", ), ).model_dump(exclude_none=True) ] } } }, ) ``` 使用时需注意: * `teacher_context` 为列表,长度不能超过总对话轮次。 * 多轮场景下,teacher 会看到历史轮次已配置的 context。 * context 内容当前使用文本消息;不要传入图片或 list 结构 content。 * 提交任务前先在本地验证新增 context 后的 teacher 行为符合预期。 ### Token 观测 开启轨迹分析后,可以在 Sample & Trajectory 页签显示 Token credit 分布,并筛选 clipped token。 ![在轨迹详情中开启 Token credit 分布](https://arkdocs.tos-cn-beijing.volces.com/images/training/opd_token_observation_overview.jpg) 选中 token 后,可以查看 `token_credit`、`logprob`、`advantage`、`ratio` 和 `old_logprob` 等明细,用于定位 teacher 信号、截断和策略更新问题。 ![查看单个 token 的 credit、logprob 和 advantage](https://arkdocs.tos-cn-beijing.volces.com/images/training/opd_token_observation_detail.jpg) ### Top-k 蒸馏 通过以下命令查询目标模型当前支持的 OPD 超参数: ```Bash ark get foundation-model --model doubao-seed-2-0-lite --version 260428 --fields hyperparameters ``` |参数 |说明 |取值 | |---|---|---| |`topk` |OPD 蒸馏使用的 top-k token 数;`topk <= 1` 使用 sampled-token reward shaping,`topk >= 2` 启用 top-k distillation |`[0, 128]` | |`reverse_kl_weight` |top-k distillation 中反向 KL 的混合权重;`0` 为 forward KL,`1` 为 reverse KL |`[0, 1]` | |`topk_type` |top-k token 集合来源 |`default`、`student`、`teacher` | |`normalize_topk` |是否对 top-k token 子分布重新归一化 |`true`、`false` | ## Routing replay MoE 模型在 rollout、actor forward(重新计算 old logprobs)和 actor update 三个阶段会分别执行 expert routing。如果三次 routing 结果不一致,训练时使用的 log probability 就会偏离实际采样策略,形成 off-policy 偏移。Routing replay(R3)会记录 rollout 阶段的 expert routing,并在后续计算中复用,从而降低 logprobs diff、提升训练稳定性。 ### 单轮语义 Routing 记录的是每次 forward input position 的 expert assignment,不是最终序列中每个输出 token 的 assignment。对于包含 `n_input` 个 prompt token 和 `n_decode` 个生成 token 的单轮 rollout: * Prefill 阶段记录 `n_input` 行 routing。 * 前 `n_decode - 1` 个生成 token 会在后续 decode step 中重新作为 input,因此各记录一行 routing。 * 最后一个生成 token 没有再次作为 input,不会产生 routing。 因此一轮可记录和 replay 的 routing 行数为 `n_input + n_decode - 1`。 ### 多轮语义 多轮对话中,R3 维护与 `input_ids` 按 position 对齐的全局 routing buffer。每轮会把真实 routing 追加到 buffer,并在本轮最后一个、尚未产生 routing 的 token 位置写入 `-1` sentinel。 ```Plain Text [历史 token][本轮新增 prompt][本轮 decode] [已记录 routing ][本轮 routing ][-1] ``` Replay 时: * 有有效 expert ID 的历史位置强制复用已记录 routing。 * `-1` 位置和本轮新增 prompt 没有历史 routing,继续使用模型原生 top-k gating。 * R3 只复现真实观察到的 routing,不为没有执行过 forward 的 token 构造伪 routing。 ### 启用与支持范围 * 建议直接使用最新 SDK;最低版本要求为 Single Rollout >= 0.6.2、Group Rollout >= 0.7.3。 * Seed 2.0 模型在 GRPO、GRPOLoRA、PPO、OPD(仅 sampled token)训练方式下,使用满足要求的 SDK 提交时默认开启 `enable_routing_replay=true`。 * 如需对比或排障,可按当前 SDK / CLI 类型定义显式设置 `enable_routing_replay`;参数位置和可用范围以当前版本为准。 ### 观测与排障 建议重点观察: * `rollout_off_policy_kl`:`rollout_logprobs - old_logprobs`。 * `rollout_off_policy_kl_k3`:基于 K3 估计的 rollout/old logprobs 差异。 * `ppo_kl`、`pg_clipfrac`、`pg_clipfrac_lower`:Actor forward 与 update 的一致性。 * `routing_replay/discarded_in_collate`:被丢弃的 routing replay 数据量。 * `routing_replay/object_store_count`:Routing buffer 是否在消费后释放。 如果 logprobs diff 没有明显收敛,请依次确认 SDK 版本、目标模型与训练方式支持范围、任务是否实际开启 R3,以及多轮对话中 response ID 和增量消息是否正确维护。 ## PPO critic decouple PPO critic decouple 支持只向 critic 注入额外 context,而不让 policy model 看到这些信息。例如在数学任务中,可以向 critic 提供参考答案或评分 rubric,帮助 value model 更准确地评价 trajectory,同时避免答案泄漏给 actor。 只要 Rollout plugin 返回非空 `critic_context`,训练引擎就会启用 critic decouple,无需额外开关。 ```Python from ark_sdk.types.pipeline_plugin.rollout import CriticContext reference_answer = (sample.extra or {}).get("answer") critic_context = [ CriticContext( qa_index=0, message=ChatCompletionMessage( role="user", content=( "reference answer: " f"{reference_answer}" ), ), ).model_dump(exclude_none=True) ] return RolloutResult( status=PluginStatus.SUCCESS, config={"critic_context": critic_context}, ) ``` `qa_index` 按 policy model 返回的 assistant 轮次计数,而不是按 messages 数量计数。例如 system prompt 中包含多条 messages,但希望在第一轮 assistant 回复前插入 critic context 时,仍设置 `qa_index=0`。 使用时请注意: * 参考答案、rubric 等只放入 `critic_context`,不要追加到 policy model 可见的 messages。 * 在数据预处理阶段校验 `sample.extra` 中存在所需字段,避免构造空 context。 * Context 过长会增加 critic 计算成本,应只保留评分必要信息。 * 可通过训练日志中的 `train/critic/context/n_tokens_injected` 或同类指标确认注入 token 数量。 --- # 格式总览 Source: https://ark.volcengine.com/region:cn-beijing/docs/fine-tuning-dataset-format 进行模型精调前,需要先按模型类别选择数据格式,再确认该类别支持的精调方法。精调数据集采用 JSONL 格式,每行包含一个完整的 JSON 对象。 > **注意** > > 精调 JSONL 文件绝对路径不可包含以下特殊字符:`*`、`?`、`[`、`]`。 ## 如何选择格式 先根据模型的输入和输出类型选择模型类别,再进入对应文档查看精调方法的数据格式。具体支持的模型和训练方式以创建精调任务时控制台的可选项为准。 | 模型类别 | 典型输入和输出 | 已提供格式的精调方法 | 格式文档 | | --- | --- | --- | --- | | 语言及多模态理解 | 输入文本、图片、音频或视频,输出文本 | SFT、DPO、GRPO/PPO、CPT(继续预训练) | [语言及多模态理解模型精调数据格式](/docs/multimodal-fine-tuning-data-format) | | 图片生成 | 输入文本或文本与图片,输出图片 | SFT | [图片生成模型精调数据格式](/docs/image-fine-tuning-data-format) | | 视频生成 | 输入文本、图片、视频或音频,输出视频 | SFT | [视频生成模型精调数据格式](/docs/video-fine-tuning-data-format) | ## 格式文档目录 ### 语言及多模态理解 适用于以文本作为输出的新一代语言模型和多模态理解模型。样本可以只包含文本,也可以通过 `image_url`、`audio_url`、`video_url` 混合传入图片、音频和视频。纯文本任务使用新模型精调时,也应选择此格式。音频输入支持 SFT、DPO、CPT,不支持 GRPO、PPO 等 RL 训练。 * SFT:[SFT 精调](/docs/multimodal-fine-tuning-data-format#multimodal-sft) * DPO:[直接偏好学习(DPO)](/docs/multimodal-fine-tuning-data-format#multimodal-dpo) * GRPO/PPO:[强化学习(GRPO/PPO)](/docs/multimodal-fine-tuning-data-format#multimodal-grpo-ppo) * CPT(继续预训练):[继续预训练](/docs/multimodal-fine-tuning-data-format#multimodal-continued-pretraining) ### 图片生成 适用于文生图和图片编辑任务。文生图样本以文本作为输入、图片作为输出;图片编辑样本以文本和单张或多张图片作为输入、图片作为输出。 * SFT:[SFT 精调](/docs/image-fine-tuning-data-format#image-generation-sft) ### 视频生成 适用于文生视频、首帧或首尾帧生成视频,以及使用图片、视频、音频作为参考的视频生成任务。不同 Seedance 模型系列的数据字段和参数范围不同。 * SFT:[SFT 精调](/docs/video-fine-tuning-data-format#video-generation-sft) ## 公共要求与工具 各格式文档已按需包含图片、音频、视频文件要求,以及数据转换和离线校验工具。进入对应模型类别的格式文档后,可在文末查看适用于该类别的公共要求与工具。 --- # 语言及多模态理解模型精调数据格式 Source: https://ark.volcengine.com/region:cn-beijing/docs/multimodal-fine-tuning-data-format 进行模型精调前,需要准备符合模型类别和精调方法要求的训练集与验证集。数据集采用 JSONL 格式,每行包含一个完整的 JSON 对象。 > **注意** > > 精调 JSONL 文件绝对路径不可包含以下特殊字符:`*`、`?`、`[`、`]`。 本文适用于以文本作为输出的语言及多模态理解模型。训练样本可以只包含文本,也可以混合使用 `image_url`、`audio_url`、`video_url` 等输入;同一条样本可按模型能力组合多种模态。音频输入支持 SFT、DPO、CPT,不支持 GRPO、PPO 等 RL 训练。 ## 支持模型 | 模型 | 版本 | 输入模态 | 支持特性 | SFT | DPO | GRPO | 精调后推理 | | --- | --- | --- | --- | --- | --- | --- | --- | | `doubao-seed-2-0-mini` | 260428(推荐) | 文本、图片;SFT、DPO、CPT 支持音频;RL 不支持音频;视频以控制台可选能力为准 | thinking:enabled、disabled、reasoning_effort;支持 Function Calling | 全量、LoRA | 全量、LoRA | 全量、LoRA | 模型单元、批量推理窗口与基础模型一致;LoRA 按 token 推理为基础模型 2 倍价格,窗口 256k,最大回答和思维链 32k | | `doubao-seed-2-0-lite` | 260428(推荐) | 文本、图片;SFT、DPO、CPT 支持音频;RL 不支持音频;视频以控制台可选能力为准 | thinking:enabled、disabled、reasoning_effort;支持 Function Calling | 全量、LoRA | 全量、LoRA | 全量、LoRA | LoRA 按 token 推理为基础模型 2 倍价格,窗口 256k,最大回答和思维链 32k;其他方式以控制台为准 | thinking 模式详情请参见 [深度思考能力支持情况](/docs/multimodal-fine-tuning-data-format#c680ed77),Function Calling 详情请参见[Function Calling(函数调用)](/docs/function-calling)。 > **说明** > > 音频输入支持范围与模型版本及训练方式有关: > * SFT、DPO 和 CPT 支持通过 `audio_url` 传入音频。 > * GRPO、PPO 等 RL 训练不支持音频输入。 ## SFT 精调 语言及多模态理解模型支持多模态混排的对话数据格式,核心基于 JSONL 文件规范,在文本对话基础上扩展了图片、音频、视频 / 视频抽帧等多模态数据支持。以下是完整的格式示例、说明及字段定义。 ### 格式示例 样本格式:为 JSONL 文件(**JSON Lines**,轻量级文本格式,核心规则:**每一行对应一个独立的、合法的 JSON 对象**),需确保**单个对话样本独占一行**。 ```JSON {"messages":[{"role":"system","content":"请描述图片中的物体及场景"},{"role":"user","content":[{"type":"image_url","image_url":{"url":"tos://bucketname/image/desk.png"}},{"type":"text","text":"这张图片里有什么?"}]},{"role":"assistant","reasoning_content":"用户让我描述图片中的物体和场景,首先看图片内容:画面中有一张木质书桌,上面放着笔记本电脑、咖啡杯和绿植,背景是白色墙壁和窗户,光线明亮。需要准确列出物体,描述场景氛围,保持简洁明了。","content":"图片中展示了一个整洁的办公场景:一张木质书桌上放置着笔记本电脑、白色咖啡杯和一盆绿色多肉植物,背景是带有窗户的白色墙壁,自然光线充足,整体氛围清新舒适。","loss_weight":1.0}],"extra":{"sample_id":"sample-001","metadata":{"source":"user"}},"thinking":{"type": "enabled"}} {"messages":[{"role":"user","content":[{"type":"text","text":"计算图片中物体的数量"},{"type":"image_url","image_url":{"url":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCABAAEADAREAAhEBAxEB/8QAHQAAAgEFAQEAAAAAAAAAAAAAAAgGAQMEBwkFAv/EADgQAAEDAwIDBAcFCQAAAAAAAAECAwQABQYHERIhMQgTQVEJFDJhcYGRFRYiQlMzNlJydIKSobP/xAAcAQABBAMBAAAAAAAAAAAAAAAABAUGBwEDCAL/xAA0EQABAwMCAwUFCAMAAAAAAAABAAIDBAURBiESMUEHUWFxoRMyUpGxFBUiIzSBwdFCcvD/2gAMAwEAAhEDEQA/AOqdCEUIVCQBuTsBQhYZvdlDvcG7wu86cHrCOL6b1u+zTY4uA48ivXA7uWYCCAQQQehFaV5VaEIoQihCKELz79fbZjNnl368SUsQ4TRddWfADwHmT0A8zSilpZa2ZtPCMuccBemMMjg1vNJXqjr3l+oM56PDmv2uyhRSzEYWUlafNxQ5qJ8ugq9bBo+itEYfM0Pl6k8h5BSKnoo4Rk7lax4lcXHxHi89+dS7gbjhxsleAp/gnaDzHStC5TsiRd7NHQXH7e84VHgHM90o+yrboOh8ajF40ZRX3aMCOU8nDlnxHcm64wRiF0oG4GU6On+f4tqdicDM8Nubc62XBvjQtJ/EhX5kLT1StJ5EGqMutqq7LVvoq1nC9p3H8jvB6FRyGZlQwSRnIKkVNy2ooQihCXPthZRIi2my4lHcUlE5xcuQAfaS3sEA/wBxJ+QqzOze3tlqJaxw9wYHmefona1xguLz0SsVcKel9NtuOrDbTalrV0Skbk/IV5e9sY4nHAWCQOa9ZzT/ADSfAdLWH3l1l1tSeJMFwggj4Ug+/LdFIA6doIPxBaJpI3RuaSNwtPdnjtB5t2Zs1cTJhzHsdmP93drS8lSOIA7d62Fey4kfUcj7pfrHSNt13Qh8D2+3aPwuBB/Y46H0VNUF0FHMWscC3O4yur2DZxjGo+Lwcxw+6tXC13BsONOoPMHxQodUqB5EHmDXIdztlVZ6p9FWMLZGnBB+o7wehU4hmZOwSRnIK96kC2ooQlR7ZH70Y9/QO/8ASrg7M/00/wDsPonu1e47zS/WCJKyrN7Lp7YkB+8Xp7hQj8rDI5uPueSUpBPvPIVY1wqG223y3GbZjB8yeTR4krNfdI6NzYhu93IfyV0BwbSzC9P4LUax2dj1hKAHZjiAp51W3MlR5jfyHKucbpfa67yF9Q846DoP2TVLUSTHLipaehpnCTu5JIsrtFqulyuMS5W+NMYMl0cD7SVgjjPmKlNHX1VEQ+nkLT4EhcdXKolprjMYXEYe7kfEq5o68NFcjcm4e47HslxWDcrMVlUZw/qtA/s3B5jkRyI6EOd4vk2oIAy5Djkb7r/8vI9489wplpntErbVKI6v8yM8+8eKdaO+3JYbktHdDqAtJ9xG4qCEYOF0jFI2VgkbyIz81crC9pPO3ff4uMTbPeJfMM253gR4rWXNkpHxNXV2TUj61s0LOrh8sJbHXMt9JJO/p6lQb0a9idybMM51SvI76XHaYtrDh6I70lawny5IQPhT7221QoaajtEOzTl58cbDPqolaZZK2eSrmOSU/lc8KQK3JdSxHdfWQEtoUok+AA3rI3K1zPEcbnnoCkomO+sTH3/1HVr+pJp+bsFxdWSe2qJJO8k+qy8fs8m/3uFZ4iCpyW8lsbDoN+Z+AG5ry9wY0kpVZ7fJdK+KkiG7iB/ZTmR2URo7UdsbJaQlCfgBtTGTk5XY8UYijbGOgAVysLYuePpQrhJGXYTawohg22Q+R/ErvQB9Bv8AWuk+weFhpauU8+Jo9FGtQzvDWQDlzUk9F3kME2bOcVK0iamVFuCU781NFCkE/Igf5Cmrt3pJBV0lXj8Ja5v7g5+izp144Hs6809VUCpIolqpfkY/g1zlcYS6+0YzI35la+X+huflW6nZxyAKK60ubbVZJ5SdyOEeZ2SnMsuyHUR47SnHHCEoQkblRPQAU8kgblcoRRSVDxHGMuPIBMdo7pcvFGPvBfGx9qyEbIb6+roPh/MfHy6U2VNR7Q8LeS6M0Bov7ij+3Vg/OcNh8I/s9VtCkas1FCEqnb60BverGD2/McPgrmXvFe9UuI2N3JMRexWEDxUkpCgPEcXjVtdkuroNO3F9JWu4YpsDPQOHInwPJMt6onVMQezm36LnfpVqnmeimbx8zxCR6vcInEy+w8k92+2T+Nl1PI7Hb4ggEcxXTOoNP0Gq7eaOr3YdwRzB6EH/ALKilNUyUcnGzmnMielHgfZqBO0hkquHAAsM3RIZK/dujiA38OdUZL2ETiU8FY3g7y05x88KQDUTQ3Lmb+a2Jit21v7RVpiXfJsai2CA8538WKkLShhsjYKcWrm4sjnsAAN+nWqwv9Fa7JVmkoJTJw7FxxueuAOgVbaggvOvKltNSs4adh947Anv8ceC3ngWk+P4SlMsj165bfikuJ9jzCE/l+PWotNUOl26Kc6Y0Pb9OASAccvxHp5DopxSdTVFCEUIRQhao1C7LOg+p9wXd8s0+gruDp3clxFLiuuHzWWiniPvO5qW2fXN/sUfsqKpcGDocOA8gc4SKe3U1QeJ7d1h4T2Q+zzgM9F1senEJ2Y0Qpt6e4uWUEHcFIdKgD79t63XTtB1HeIzFU1TuE8w3Dc+fDheYrXSwnLWfPdbiSlKEhCEhKQNgANgKhhOdylzWhow0bKtCyihCKEL/9k="}},{"type":"image_url","image_url":{"url":"file:./image/books.png"}}]},{"role":"assistant","content":"图片中包含3个主要物体:1台笔记本电脑、1个咖啡杯、1盆绿植,共3个物体。"}]} {"messages":[{"role": "user","content": [{"type": "image_url","image_url": {"url": "file:./image/doubao_logo.jpeg"}},{"type": "text","text": "What’s in this image?"}]},{"role": "assistant","content": "It is the logo of Doubao LLM model."}]} {"messages":[{"role":"user","content":[{"type":"text","text":"请将这段客服通话转写为文字,并总结客户诉求。"},{"type":"audio_url","audio_url":{"url":"tos://bucketname/audio/customer_call.wav"}}]},{"role":"assistant","content":"转写:客户咨询订单配送延迟的问题,并提供了订单号。总结:客户希望确认延迟原因和预计送达时间。","loss_weight":1.0}]} {"messages":[{"role":"user","content":[{"type":"text","text":"请根据视频画面和声音判断这段素材是否适合用于产品介绍。"},{"type":"video_url","fps":1,"video_url":{"url":"tos://bucketname/video/product_intro.mp4"}}]},{"role":"assistant","content":"这段视频画面清晰,讲解声音完整,适合用于产品介绍。","loss_weight":1.0}]} ``` #### 纯文本任务示例 仅训练纯文本任务时,也使用语言及多模态理解模型格式。将用户输入作为 `text` 类型内容传入,模型回复仍写入 `assistant.content`。 ```JSON {"messages":[{"role":"system","content":[{"type":"text","text":"请根据古诗内容,仅回复作者的名字。"}]},{"role":"user","content":[{"type":"text","text":"姑苏城外寒山寺,夜半钟声到客船"}]},{"role":"assistant","reasoning_content":"用户让我根据古诗内容回复作者名字,诗句是“姑苏城外寒山寺,夜半钟声到客船”。这句诗出自张继的《枫桥夜泊》。用户要求仅回复作者名字,所以直接回复。","content":"张继","loss_weight":1}]} {"messages":[{"role":"user","content":[{"type":"text","text":"什么时候需要 SFT?"}]},{"role":"assistant","content":"当 prompt engineering 无法稳定解决问题,或模型输出需要满足固定格式但仍有部分 case 不符合要求时,可以考虑使用 SFT。SFT 也可用于减少 prompt 中的复杂约束,降低线上推理耗时。","loss_weight":1}]} ``` ### 格式说明 将 JSONL 文件中的一条数据展开,清晰展示字段层级关系: ```JSON { "messages": [ { "role": "system", "content": "请描述图片中的物体及场景" // 本示例中system角色使用文本内容 }, { "role": "user", "content": [ // user角色支持数组格式,混排文本、图片、音频、视频 { "type": "image_url", // 内容类型:图片 "image_url": { "url": "tos://bucketname/image/desk.png" // 图片地址(TOS/base64/相对路径) } }, { "type": "text", // 内容类型:文本 "text": "这张图片里有什么?" }, { "type": "audio_url", // 内容类型:音频 "audio_url": { "url": "tos://bucketname/audio/customer_call.wav" // 音频地址(TOS) } }, { "type": "video_url", // 内容类型:视频,支持视频内嵌音频 "fps": 1, // 视频抽帧帧率,表示每秒抽取的帧数 "video_url": { "url": "tos://bucketname/video/product_intro.mp4" // 视频地址(TOS 或 Base64) } } ] }, { "role": "assistant", "reasoning_content": "用户让我描述图片中的物体和场景,首先看图片内容:画面中有一张木质书桌,上面放着笔记本电脑、咖啡杯和绿植,背景是白色墙壁和窗户,光线明亮。需要准确列出物体,描述场景氛围,保持简洁明了。", "content": "图片中展示了一个整洁的办公场景:一张木质书桌上放置着笔记本电脑、白色咖啡杯和一盆绿色多肉植物,背景是带有窗户的白色墙壁,自然光线充足,整体氛围清新舒适。", "loss_weight": 1.0 // 训练权重,默认1.0 } ], "extra": { "sample_id": "sample-001", "metadata": { "source": "user" } }, "thinking": {"type": "enabled"} // 深度思考能力控制字段 } ``` **字段说明** 每行一条 JSON 格式数据,核心字段如下: |字段名 |||类型 |是否必填 |说明 | |---|---|---|---|---|---| |messages | | |list |是 |对话列表,包含多轮角色交互 | | |role | |str |是 |角色类型,支持`system`/`user`/`assistant`/`tool` 中的一个 | \ | | | | | |- `system`:支持文本、图片、音频、视频混排 | \ | | | | | |- `user`:支持文本、图片、音频、视频混排 | \ | | | | | |- `assistant`:仅支持文本内容 | \ | | | | | |- `tool`:如希望提升模型的Function Calling能力,需选择支持Function Calling训练的模型并提供包含Function Calling格式数据的训练集用于精调,格式可参考 [Function Calling 样本要求](/docs/multimodal-fine-tuning-data-format#7bbc7eed) | | |content | |str/list |是 |对话内容: | \ | | | | | |- 当role为`assistant`:字符串格式 | \ | | | | | |- 当role为`user`/`system`:数组格式,支持`text`、`image_url`、`audio_url`、`video_url`子类型 | | | |type |str |条件必选 |子内容类型,可选`text`(文本)、`image_url`(图片)、`audio_url`(音频)或`video_url`(视频) | \ | | | | |当role为`user`时 | | | | |text |str |条件必选 |文本内容,不能为空字符串 | \ | | | | |type为`text`时 | | | | |image_url |dict |条件必选 |图片信息,包含`url`字段(图片地址)。 | \ | | | | |type为`image_url`时 |参考:[图片文件要求](/docs/multimodal-fine-tuning-data-format#94dd94ae) | | | |audio_url |dict |条件必选 |音频信息,包含`url`字段,支持 TOS 地址和 Base64。 | \ | | | | |type为`audio_url`时 |参考:[音频/视频文件要求](/docs/multimodal-fine-tuning-data-format#a59f2e98) | | | |video_url |dict |条件必选 |视频信息,支持 TOS 地址和 Base64,包含`url`字段,支持视频内嵌音频。 | \ | | | | |type为`video_url`时 |参考:[音频/视频文件要求](/docs/multimodal-fine-tuning-data-format#a59f2e98) | | | |fps |float |否 |视频抽帧帧率,表示每秒抽取的帧数。 | \ | | | | |type为`video_url`时 |不填时使用模型默认抽帧策略;建议根据视频时长和任务效果按需配置 | | |loss_weight | |float |否 |仅 `assistant` 角色支持配置该字段,默认 1.0,取值范围 [0.0,1.0]。`system` 和 `user` 角色不支持该字段。 | | |reasoning_content | |str |否 |深度思考内容,**仅允许最后一个`assistant`角色携带**。 | \ | | | | | | | \ | | | | | |* 如有优化多轮对话场景下深度思考能力的精调需求,请参考 [多轮 reasoning_content 样本文件拆分](/docs/multimodal-fine-tuning-data-format#c84133a4)。 | \ | | | | | |* 如多轮对话场景训练时仅最后一轮对话携带reasoning_content,模型将学习到在中间对话轮次不进行thinking,影响模型thinking效果。 | |`extra` | | |dict |否 |样本顶层的用户自定义扩展字段。`extra`中的 `key` 必须为 `string` 类型,`value` 类型不限制。 | |thinking | | |object |否 |深度思考能力控制: | \ | | | | | | | \ | | | | | |* 部分模型精调支持该字段。 | | |`type` | |str |否 |枚举值:`enabled`/`disabled`/`auto`/`custom`(不同模型支持范围不同,详情请参见 [深度思考能力支持情况](/docs/multimodal-fine-tuning-data-format#c680ed77))。 | ## 直接偏好学习(DPO) 语言及多模态理解模型支持多模态混排的对话数据格式,核心基于 JSONL 文件规范,在文本对话基础上扩展了图片、音频、视频 / 视频抽帧等多模态数据支持。以下是完整的格式示例、说明及字段定义。 数据格式支持提供多个模型回复列表,通过 score 来指定对回复的偏好。训练过程将根据 score 的大小自动生成两两对比的偏序对进行训练,注意:score 相同的两个回复不会生成相应的偏序对。 ### 格式示例 样本格式:为JSONL文件( **JSON Lines**,是一种轻量级的文本文件格式,核心规则 **每一行对应一个独立的、合法的 JSON 对象**),需确保**单个对话样本独占一行**,示例如下。 ```JSON {"messages":[{"role":"system","content":[{"type":"text","text":"你是一名多模态质检助手,需要结合文本、图片、音频和视频判断回复质量。"}]},{"role":"user","content":[{"type":"text","text":"请根据工单截图、客服通话和处理录屏,判断哪个质检结论更准确。"},{"type":"image_url","image_url":{"url":"tos://bucketname/image/ticket.png"}},{"type":"audio_url","audio_url":{"url":"tos://bucketname/audio/customer_call.wav"}},{"type":"video_url","video_url":{"url":"tos://bucketname/video/operation_record.mp4"}}]},{"role":"assistant","choices":[{"content":"客服准确解释了配送延迟原因,并在录屏中完成了补偿流程,结论完整。","score":1.0,"lm_loss_mask":1.0},{"content":"客服没有解决用户问题,建议直接判定为不合格。","score":0.2,"lm_loss_mask":0.0}]}],"thinking":{"type":"disabled"}} ``` ### 格式说明 为便于展示各个字段关系,将JSON格式文件的一条数据展开,如下: ```Plain Text { "messages": [ { "role": "system", "content": [ { "type": "text", "text": "你是一名多模态质检助手,需要结合文本、图片、音频和视频判断回复质量。" } ] }, { "role": "user", "content": [ { "type": "text", "text": "请根据工单截图、客服通话和处理录屏,判断哪个质检结论更准确。" }, { "type": "image_url", "image_url": { "url": "tos://bucketname/image/ticket.png" } }, { "type": "audio_url", "audio_url": { "url": "tos://bucketname/audio/customer_call.wav" } }, { "type": "video_url", "video_url": { "url": "tos://bucketname/video/operation_record.mp4" } } ] }, { "role": "assistant", # 最后一个message的role必须为assistant "choices": [ # 可以有多个response { "content": "客服准确解释了配送延迟原因,并在录屏中完成了补偿流程,结论完整。", "score": 1.0, # 该response的得分 "lm_loss_mask": 1.0 # 这个response是否计算 sft loss,默认为0.0 }, { "content": "客服没有解决用户问题,建议直接判定为不合格。", "score": 0.2, "lm_loss_mask": 0.0 # 这个response是否计算 sft loss,默认为0.0 } ] } ], "thinking": { "type": "disabled" } } ``` 每行一条JSON格式的数据: |字段名 |||类型 |是否必填 |说明 | |---|---|---|---|---|---| |`messages` | | |list |是 |对话列表,包含多轮角色交互 | | |`role` | |str |是 |角色类型,支持`system`/`user`/`assistant`/`tool`,其中: | \ | | | | | |- `system`:支持文本、图片、音频、视频混排 | \ | | | | | |- `user`:支持文本、图片、音频、视频混排 | \ | | | | | |- `assistant`:仅支持文本内容 | | |`content` | |str/list |是 |*非最后一轮的对话内容* | \ | | | | | |- 当role为`assistant`:字符串格式 | \ | | | | | |- 当role为`system`/`user`:数组格式,支持`text`、`image_url`、`audio_url`、`video_url`子类型 | | | |`type` |str |是( 当role为`user`时) |子内容类型,可选`text`(文本)、`image_url`(图片)、`audio_url`(音频)或`video_url`(视频) | | | |`text` |str |是(type=text 时) |文本内容,不能为空字符串 | | | |`image_url` |dict |是(type=image_url 时) |图片信息,包含`url`字段(图片地址)。 | \ | | | | | |参考:[图片文件要求](/docs/multimodal-fine-tuning-data-format#94dd94ae) | | | |`audio_url` |dict |是(type=audio_url 时) |音频信息,包含`url`字段,支持 TOS 地址和 Base64。参考:[音频/视频文件要求](/docs/multimodal-fine-tuning-data-format#a59f2e98) | | | |`video_url` |dict |是(type=video_url 时) |视频信息,支持 TOS 地址和 Base64,包含`url`字段,支持视频内嵌音频。参考:[音频/视频文件要求](/docs/multimodal-fine-tuning-data-format#a59f2e98) | | | |`fps` |float |否 |视频抽帧帧率,表示每秒抽取的帧数。仅在 type=video_url 时生效,不填时使用模型默认抽帧策略。 | | |`choices` | |list |是 |仅可以在最后一轮对话中填写,且 list 长度在 1~5 之间。为生成有效偏序对,建议提供至少 2 个 `score` 不同的回复。 | | | |`content` |str/list |是 | - 字符串格式:文本内容 | \ | | | | | | - 数组格式:仅支持type为text | | | |`reasoning_content` |str |否 |深度思考内容,**仅允许最后一个`assistant`角色携带**。 | \ | | | | | | | \ | | | | | |* 如果打开 lm_loss_mask,则需要注意将非最后一轮的 assistant 对话 loss_weight 置为 0,否则将影响模型的深度思考能力 | | | |`score` |float |否 |偏好值,默认为 0.0,范围为 [0.0,1.0],值越高表示越偏好。包含多个回复时,所有 `score` 不可完全相同。 | | | |`lm_loss_mask` |float |否 |该条消息是否计算 SFT loss,默认为 0.0,即不计算 SFT loss。建议将 `score` 最大的回复设为 1.0;如果全为 0.0,可能导致模型训练不稳定、泛化能力变差。 | | |`loss_weight` | |float |否 |仅 `assistant` 角色支持配置该字段,默认 1.0,取值范围 [0.0,1.0]。 | |`thinking` | | |object |否 |深度思考能力控制。支持该参数的模型选填,不支持的模型禁填。 | | |`type` | |str |否 |枚举值:`enabled`/`disabled`/`auto`/`custom`(不同模型支持范围不同,详情请参见 [深度思考能力支持情况](/docs/multimodal-fine-tuning-data-format#c680ed77))。 | ## 强化学习(GRPO/PPO) 语言及多模态理解模型支持多模态混排的对话数据格式,核心基于 JSONL 文件规范,在文本对话基础上扩展了图片、视频 / 视频抽帧等多模态数据支持。以下是完整的格式示例、说明及字段定义。 > **注意** > > GRPO、PPO 等 RL 训练不支持音频输入,数据中不得使用 `audio_url`。 ### 格式示例 样本格式:为JSONL文件( **JSON Lines**,是一种轻量级的文本文件格式,核心规则 **每一行对应一个独立的、合法的 JSON 对象**),需确保**单个对话样本独占一行**,示例如下。 ```JSON {"messages": [{"role": "user","content": [{"type": "text","text": "\nLet's think step by step and output the final answer within \\boxed{}."},{"type": "image_url","image_url": {"url": "data:image/{image_extension};base64,{image_base64}"}},{"type":"video_url","video_url":{"url":"tos://bucketname/video/question.mp4"}}]}],"extra": {"answer": "A"},"thinking": {"type": "enabled"}} ``` ### 格式说明 ```JSON { "messages": [ { "role": "user", "content": [ { "type": "text", "text": "\nLet's think step by step and output the final answer within \\boxed{}." }, { "type": "image_url", "image_url": { "url": "data:image/{image_extension};base64,{image_base64}" } }, { "type": "video_url", "video_url": { "url": "tos://bucketname/video/question.mp4" } } ] } ], "extra": { "answer": "A" }, "thinking": {"type": "enabled"} } ``` 每一条JSON格式的数据: |字段名 |||类型 |是否必填 |说明 | |---|---|---|---|---|---| |`messages` | | |list |是 |对话列表,包含多轮角色交互 | | |`role` | |str |是 |角色类型,支持`system`/`user`/`assistant`/`tool`,其中: | \ | | | | | |- `system`:支持文本、图片、视频混排 | \ | | | | | |- `user`:支持文本、图片、视频混排 | \ | | | | | |- `assistant`:仅支持文本内容 | \ | | | | | |- `tool`:如希望提升模型的Function Calling能力,需选择支持Function Calling训练的模型并提供包含Function Calling格式数据的训练集用于精调,格式可参考 [Function Calling 样本要求](/docs/multimodal-fine-tuning-data-format#7bbc7eed) | \ | | | | | | | \ | | | | | |**最后一个message的role必须是user或tool** | | |`content` | |str/list |是 |对话内容: | \ | | | | | |- 当role为`assistant`:字符串格式 | \ | | | | | |- 当role为`system`/`user`:数组格式,支持`text`、`image_url`、`video_url`子类型 | | | |`type` |str |是( 当role为`user`时) |子内容类型,可选`text`(文本)、`image_url`(图片)或`video_url`(视频) | | | |`text` |str |是(type=text 时) |文本内容,不能为空字符串 | | | |`image_url` |dict |是(type=image_url 时) |图片信息,包含`url`字段(图片地址)。 | \ | | | | | |参考:[图片文件要求](/docs/multimodal-fine-tuning-data-format#94dd94ae) | | | |`video_url` |dict |是(type=video_url 时) |视频信息,支持 TOS 地址和 Base64,包含`url`字段,支持视频内嵌音频。参考:[音频/视频文件要求](/docs/multimodal-fine-tuning-data-format#a59f2e98) | | | |`fps` |float |否 |视频抽帧帧率,表示每秒抽取的帧数。仅在 type=video_url 时生效,不填时使用模型默认抽帧策略。 | |`extra` | | |dict |否 |样本顶层的用户自定义扩展字段,可用于携带 reward function 与 custom rollout 所需的信息。`extra`中的 `key` 必须为 `string` 类型,`value` 类型不限制。 | |`thinking` | | |object |否 |深度思考能力控制。支持该参数的模型选填,不支持的模型禁填。 | | |`type` | |str |否 |枚举值:`enabled`/`disabled`/`auto`/`custom`(不同模型支持范围不同,详情请参见 [深度思考能力支持情况](/docs/multimodal-fine-tuning-data-format#c680ed77))。 | ## 继续预训练 继续预训练支持以下几类样本组织方式: * 纯文本:适用于标准文本继续预训练。 * 分段 content[]:适用于需要显式保留内容片段边界的场景。 * 多模态 content[]:适用于图文、音频、视频等继续预训练样本。 ### **格式示例** 样本格式:为JSONL文件( **JSON Lines**,是一种轻量级的文本文件格式,核心规则 **每一行对应一个独立的、合法的 JSON 对象**),需确保**单个样本独占一行**,示例如下。 ```Plain Text {"text": "火山方舟通过稳定可靠的安全互信方案,保障模型提供方的模型安全与模型使用者的信息安全,加速大模型能力渗透到千行百业,助力模型提供方和使用者实现商业新增长。"} {"content":[{"type":"text","text":"支持运行超大规模的分布式任务,"},{"type":"text","text":"包含多种预置算法框架和自定义算法框架。"}]} {"content":[{"type":"image_url","image_url":{"url":"tos://bucketname/image/figure.jpeg"},"loss_weight":0.0},{"type":"text","text":"学习这张图片对应的描述方式。","loss_weight":1.0}]} {"content":[{"image_url":{"url": "data:image\/jpeg;base64,xx"}, "type": "image_url","loss_weight":0.0},{"type": "text", "text": "今天天气很好", "loss_weight": 1.0}]} {"content":[{"type":"audio_url","audio_url":{"url":"tos://bucketname/audio/customer_call.wav"},"loss_weight":0.0},{"type":"text","text":"这是一段客服通话音频,可用于学习语音转写、说话人意图识别与问题摘要的表达方式。","loss_weight":1.0}]} {"content":[{"type":"video_url","video_url":{"url":"tos://bucketname/video/demo.mp4"},"loss_weight":0.0},{"type":"text","text":"学习这段视频中画面与声音的联合描述方式。","loss_weight":1.0}]} ``` ### 格式说明 为便于展示各个字段关系,将 JSONL 格式文件中的几类典型样本展开如下: ```Plain Text { "text": "火山引擎机器学习平台是面向机器学习应用开发者,提供【开发机】和【自定义训练】等丰富建模工具、多框架高性能模型推理服务的企业级开发平台,支持从数据托管、代码开发、模型训练、模型部署的全生命周期工作流。" } { "content": [ { "type": "text", "text": "支持运行超大规模的分布式任务,", "loss_weight": 1.0 }, { "type": "text", "text": "包含多种预置算法框架和自定义算法框架。", "loss_weight": 1.0 } ] } { "content": [ { "type": "image_url", "image_url": { "url": "tos://bucketname/image/figure.jpeg" }, "loss_weight": 0.0 }, { "type": "text", "text": "学习该图片所对应的描述内容。", "loss_weight": 1.0 } ] } { "content": [ { "type": "audio_url", "audio_url": { "url": "tos://bucketname/audio/customer_call.wav" }, "loss_weight": 0.0 }, { "type": "text", "text": "这是一段客服通话音频,可用于学习语音转写、说话人意图识别与问题摘要的表达方式。", "loss_weight": 1.0 } ] } { "content": [ { "type": "video_url", "video_url": { "url": "tos://bucketname/video/demo.mp4" }, "loss_weight": 0.0 }, { "type": "text", "text": "学习这段视频中画面与声音的联合描述方式。", "loss_weight": 1.0 } ] } ``` 每行一条JSON格式的数据: |字段名 |类型 |是否必填 |说明 | |---|---|---|---| |text |str |与 content 二选一 |纯文本样本。每条样本不限制 text 长度,如果超长将自动根据模型最大支持的 token 拆成多个样本,因此样本总数可能会超过数据行数。 | |content |list |与 text 二选一 |分段内容列表,支持文本或多模态内容混排。 | |content[].type |str |是 |子内容类型,可选 text、image_url、audio_url、video_url。 | |content[].text |str |type=text 时必填 |文本内容。 | |content[].image_url |dict |type=image_url 时必填 |图片信息,包含 url 字段或者base64信息。 | |content[].audio_url |dict |type=audio_url 时必填 |音频信息,包含 url 字段,支持 TOS 地址和 Base64。 | |content[].video_url |dict |type=video_url 时必填 |视频信息,支持 TOS 地址和 Base64,包含 url 字段,支持视频内嵌音频。 | |content[].fps |float |否 |视频抽帧帧率,表示每秒抽取的帧数。仅在 type=video_url 时生效,不填时使用模型默认抽帧策略。 | |content[].loss_weight |float |否 |当前内容片段的训练权重。`text` 类型默认为 1.0;`image_url`、`audio_url`、`video_url` 类型默认为 0.0,且只允许设置为 0.0。 | > **说明** > > 继续预训练的多模态样本沿用统一的 content[] 结构: > * 纯文本:{"text":"..."} > * 分段纯文:{"content":[{"type":"text","text":"..."}, ...]} > * 图文:{"content":[{"type":"image_url",...},{"type":"text","text":"..."}]} > * 音频 / 视频:{"content":[{"type":"audio_url",...},{"type":"video_url",...},{"type":"text","text":"..."}]} ## 图片文件要求 #### 图片格式要求 * **数据集文件大小**:单数据集文件大小需控制在 2G 以下。 * **图片规格**:单张图片大小限制在 10M 以内,长宽比要小于 200。单图最大支持 5120 tokens,若超出此数值则会被采样到最大值(图片 token = 长像素 * 宽像素 / 784)。 * **样本长度**:单样本长度若超过模型训练窗口会被截断,图片按单张整体截断。不同模型的窗口大小,参考 [选择模型](/docs/fine-tuning-overview#d3ef4388)。 * **支持的图片格式**:参见下表。 |**图片格式** |**文件扩展名** |内容格式 Content Type | |---|---|---| |JPEG |.jpg, .jpeg |image/jpeg | |PNG |.apng, .png |image/png | |GIF |.gif |image/gif | |WEBP |.webp |image/webp | |BMP |.bmp |image/bmp | |TIFF |.tiff, .tif |image/tiff | |ICO |.ico |image/x-icon | |DIB |.dib |image/bmp | |SGI |.sgi |image/sgi | |JPEG2000 |.j2c, .j2k, .jp2, .jpc, .jpf, .jpx |image/jp2 | #### 图片传入方式 在视觉理解模型的数据输入中,图片的传入方式有多种,以满足不同场景的需求,以下是具体介绍。 > **说明** > > `image_url.url` 支持 `tos://`、`data:` Base64 和 `file:` 相对路径,不支持 HTTP(S) 地址。 ##### **1.(推荐)使用 TOS 存储图片** 1. 创建存储桶(Bucket)用于存储文件(Object),例如创建如下结构。 创建存储桶详细步骤可见 [对象存储控制台快速入门](https://docs.volcengine.com/docs/6349/74830?lang=zh)。 ```Bash bucketname #桶名称 ├── sample #桶内文件夹名称 ├── data.jsonl └── image #桶内文件夹名称 ├── xxx.png └── xxxx.png ``` 2. jsonl文件中在URL内以“`tos://${bucket}/${object}`”的形式填入TOS对象地址。**注意,TOS URL所引用的图片需与JSONL文件处于同一个桶内**。这种格式能够加快数据处理速度、减少多角色传输所耗费的时间,进而提高训练效率。以上步骤完成后,**精调任务进行数据配置时选择 从TOS中导入方式 仅上传jsonl文件即可**。 ```JSON { "messages": [ { "role": "user", "content": [ { "type": "image_url", "image_url": { "url": "tos://bucketname/image/xxx.png" } }, { "type": "text", "text": "What’s in this image?" } ] }, { "role": "assistant", "content": "It is the logo of Doubao LLM model." } ] } ``` ##### **2. 图片使用**base64编码 ###### **格式示例** 将图片进行 base64 编码后填入 jsonl 文件中,需确保**单个样本独占一行**,示例如下。您也可以 [下载样例文件](https://arkdocs.tos-cn-beijing.volces.com/files/training/vlm_data.jsonl) 参考。 ```JSON {"messages":[{"role":"user","content":[{"type":"text","text":"What’s in this image?"},{"type":"image_url","image_url":{"url":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCABAAEADAREAAhEBAxEB/8QAHQAAAgEFAQEAAAAAAAAAAAAAAAgGAQMEBwkFAv/EADgQAAEDAwIDBAcFCQAAAAAAAAECAwQABQYHERIhMQgTQVEJFDJhcYGRFRYiQlMzNlJydIKSobP/xAAcAQABBAMBAAAAAAAAAAAAAAAABAUGBwEDCAL/xAA0EQABAwMCAwUFCAMAAAAAAAABAAIDBAURBiESMUEHUWFxoRMyUpGxFBUiIzSBwdFCcvD/2gAMAwEAAhEDEQA/AOqdCEUIVCQBuTsBQhYZvdlDvcG7wu86cHrCOL6b1u+zTY4uA48ivXA7uWYCCAQQQehFaV5VaEIoQihCKELz79fbZjNnl368SUsQ4TRddWfADwHmT0A8zSilpZa2ZtPCMuccBemMMjg1vNJXqjr3l+oM56PDmv2uyhRSzEYWUlafNxQ5qJ8ugq9bBo+itEYfM0Pl6k8h5BSKnoo4Rk7lax4lcXHxHi89+dS7gbjhxsleAp/gnaDzHStC5TsiRd7NHQXH7e84VHgHM90o+yrboOh8ajF40ZRX3aMCOU8nDlnxHcm64wRiF0oG4GU6On+f4tqdicDM8Nubc62XBvjQtJ/EhX5kLT1StJ5EGqMutqq7LVvoq1nC9p3H8jvB6FRyGZlQwSRnIKkVNy2ooQihCXPthZRIi2my4lHcUlE5xcuQAfaS3sEA/wBxJ+QqzOze3tlqJaxw9wYHmefona1xguLz0SsVcKel9NtuOrDbTalrV0Skbk/IV5e9sY4nHAWCQOa9ZzT/ADSfAdLWH3l1l1tSeJMFwggj4Ug+/LdFIA6doIPxBaJpI3RuaSNwtPdnjtB5t2Zs1cTJhzHsdmP93drS8lSOIA7d62Fey4kfUcj7pfrHSNt13Qh8D2+3aPwuBB/Y46H0VNUF0FHMWscC3O4yur2DZxjGo+Lwcxw+6tXC13BsONOoPMHxQodUqB5EHmDXIdztlVZ6p9FWMLZGnBB+o7wehU4hmZOwSRnIK96kC2ooQlR7ZH70Y9/QO/8ASrg7M/00/wDsPonu1e47zS/WCJKyrN7Lp7YkB+8Xp7hQj8rDI5uPueSUpBPvPIVY1wqG223y3GbZjB8yeTR4krNfdI6NzYhu93IfyV0BwbSzC9P4LUax2dj1hKAHZjiAp51W3MlR5jfyHKucbpfa67yF9Q846DoP2TVLUSTHLipaehpnCTu5JIsrtFqulyuMS5W+NMYMl0cD7SVgjjPmKlNHX1VEQ+nkLT4EhcdXKolprjMYXEYe7kfEq5o68NFcjcm4e47HslxWDcrMVlUZw/qtA/s3B5jkRyI6EOd4vk2oIAy5Djkb7r/8vI9489wplpntErbVKI6v8yM8+8eKdaO+3JYbktHdDqAtJ9xG4qCEYOF0jFI2VgkbyIz81crC9pPO3ff4uMTbPeJfMM253gR4rWXNkpHxNXV2TUj61s0LOrh8sJbHXMt9JJO/p6lQb0a9idybMM51SvI76XHaYtrDh6I70lawny5IQPhT7221QoaajtEOzTl58cbDPqolaZZK2eSrmOSU/lc8KQK3JdSxHdfWQEtoUok+AA3rI3K1zPEcbnnoCkomO+sTH3/1HVr+pJp+bsFxdWSe2qJJO8k+qy8fs8m/3uFZ4iCpyW8lsbDoN+Z+AG5ry9wY0kpVZ7fJdK+KkiG7iB/ZTmR2URo7UdsbJaQlCfgBtTGTk5XY8UYijbGOgAVysLYuePpQrhJGXYTawohg22Q+R/ErvQB9Bv8AWuk+weFhpauU8+Jo9FGtQzvDWQDlzUk9F3kME2bOcVK0iamVFuCU781NFCkE/Igf5Cmrt3pJBV0lXj8Ja5v7g5+izp144Hs6809VUCpIolqpfkY/g1zlcYS6+0YzI35la+X+huflW6nZxyAKK60ubbVZJ5SdyOEeZ2SnMsuyHUR47SnHHCEoQkblRPQAU8kgblcoRRSVDxHGMuPIBMdo7pcvFGPvBfGx9qyEbIb6+roPh/MfHy6U2VNR7Q8LeS6M0Bov7ij+3Vg/OcNh8I/s9VtCkas1FCEqnb60BverGD2/McPgrmXvFe9UuI2N3JMRexWEDxUkpCgPEcXjVtdkuroNO3F9JWu4YpsDPQOHInwPJMt6onVMQezm36LnfpVqnmeimbx8zxCR6vcInEy+w8k92+2T+Nl1PI7Hb4ggEcxXTOoNP0Gq7eaOr3YdwRzB6EH/ALKilNUyUcnGzmnMielHgfZqBO0hkquHAAsM3RIZK/dujiA38OdUZL2ETiU8FY3g7y05x88KQDUTQ3Lmb+a2Jit21v7RVpiXfJsai2CA8538WKkLShhsjYKcWrm4sjnsAAN+nWqwv9Fa7JVmkoJTJw7FxxueuAOgVbaggvOvKltNSs4adh947Anv8ceC3ngWk+P4SlMsj165bfikuJ9jzCE/l+PWotNUOl26Kc6Y0Pb9OASAccvxHp5DopxSdTVFCEUIRQhao1C7LOg+p9wXd8s0+gruDp3clxFLiuuHzWWiniPvO5qW2fXN/sUfsqKpcGDocOA8gc4SKe3U1QeJ7d1h4T2Q+zzgM9F1senEJ2Y0Qpt6e4uWUEHcFIdKgD79t63XTtB1HeIzFU1TuE8w3Dc+fDheYrXSwnLWfPdbiSlKEhCEhKQNgANgKhhOdylzWhow0bKtCyihCKEL/9k="}}]},{"role":"assistant","content":"It is the logo of Doubao LLM model."}]} {"messages":[{"role":"user","content":[{"type":"text","text":"What’s in this image?"},{"type":"image_url","image_url":{"url":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAIBAQEBAQIBAQECAgICAgQDAgICAgUEBAMEBgUGBgYFBgYGBwkIBgcJBwYGCAsICQoKCgoKBggLDAsKDAkKCgr/2wBDAQICAgICAgUDAwUKBwYHCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgr/wgARCABQAFADAREAAhEBAxEB/8QAHAAAAgIDAQEAAAAAAAAAAAAACAkGCgAFBwQD/8QAGwEAAgIDAQAAAAAAAAAAAAAAAwUEBgACBwH/2gAMAwEAAhADEAAAAK/+ZnuNucrW6OVuCLK99IyTRPCJop9QxzzM9yyfaETJWa9HNJuYgpXcfKEnma109vqQcRZFbGrvGwN11iC0IAWrNgS7ULjvBnPMMgbSgkdhrb67xSq9lafN6dKyZlxkR8+vIZK3bfVb9ohYXIdDI4bIrBPUOYjVGkEzLi+COatdzu/eCI3P4ezXITNYciFHjgbX1bk3330zM1cc1aLnfQCkRXNiRYxUDxb5/CvFt3Lp/J9k3TDNDlEocFavnHQenLnby4TOJQncLnpNZfudFpaamM0SSoRI0sKWZENy2fCRl8HOupSMEsfb7zAz3afs0uJXfq9gU+oYWT7OiY81WroRPTY5n1b6Zuuu/wDMyPeIuQANWxrDzPMz3CKkBjwiMNgtScBKTqxS853Fz3XbPM//xAAoEAAABgMAAgIBBAMAAAAAAAADBAUGBwgBAgkAChEhEBITFRYmMTL/2gAIAQEAAQwA8xj585m+rLM8/JQcq3/XVuLW9WHkRzUpQzUzDBrI0DB+Tux3OaKFgVAWbGElI5XLpNSi1S5q04anVOOLVquPHOG4LaWkqUasNVPV+lPq22JgM+fkyhA56TmN+PjPz8ecA+JTKpFGiLbufEPClMzhcCQ1kQ04l05qXJ9T+ij/ALYSEei5uOkwVZWrLwMDnbQHO3ihhQaKiEtIiiOUOVa68XKrU8zL9MvMV5EqL3qh6+kR4kuMB9yh3tpwDjO7jIPz7URkobUmb4+/jPnq181D892KFvtJiCQMsbztvag3EUFjR22FLICk1iwYwwho8NjQBlNWXbIvYGMoKZpxQGgb1nJSereCXp1sKVb4/QLmfONGFL/NG5qqNLgjLKnFt/05ohL+QU7z2meaCVAM0Eb/AMVFf2W7x4qo2qe84osi5KZh5EV85xjGds5+uxs5DypZtVRgDWdyaqtBZFINTA4gWOSci0QgRFSmWO88JDl2Pg6lPrOMYsC+YCVUA7FU2uRtZI2+rUrc0rsNR/xmfHMtUmaBPFAjpff9QfYWqjbuFzilSLVVmHltXxj4x8eOo7/GNZSUfLLuY055YcK2bE/WJBBmV2WrmpZYTITT4XMbqtINqJDO1zszXxsb5Nqg4Tcyf2znGL03/wCd0Y2a2YL+roWf74n+H4PtlVEqQrszldsHUwkGmpwCcDn508x948exbJ1lrBPX/c5ltyUhrBTfHxnlTELXndmO2IHiVwYTOb/J+slGVNVX49Q1FQPOtxNkc0Gy9DAWTF5+NKRO9oEuXsTKrF2kWaKC6R0RHNIxYPDS/d/gw9dxP16+ceLVtu4XOGLJRSnodW1c8FgYgODnH1aUroXnJxk9P+eZltWBXqxJtjSqvhoZOM3tlyI2m6UoA4HMrdsv7yHlWS0XCfcO5cOVfjg0/pjeRUkDybk85bythmzz/QgNBddddNMaa4+MdhrVtqnvOGVJRVXmeRFf1Y+l6VAM0n6ASoP+03vJ15L0QsGqmnK8oZwSV2fwd5woSIYSnfFam7jIUAINT3cNE9URz6MgtmQ7CS+6QYdXnpht5mf1wy09PQd9ybfJ4Lh+hFPk2ilakmt6Q/DDkLee0j0qPz1YrShMZL5EyxsfXnEnv3Gl3WSRgO3j2Q2rMzxerPjxtm3i/XQnoqVZr2PqxtKUEWHK4i5cOkfRMEok/wC1GVTVTFdEKC5OBLKMZ2KHrNewjONILTuqtcoQC3n0V5t9ua9dEXuaiEozFNkPPv121ZNI4zXKiQEu4U5m/GPryXuolyrNtZusK0M5rTvSWc6mYqBhbgLBYMSkHci19LWSTi0cJKfDRmD2KrHaV5TpmZVUGqlFZ2sEblF+r0sSk9NVhxkbFP8AYzlJuyG3SrNdW/H/xAA5EAACAgECBAEICQIHAAAAAAABAgMEBQARBhITITEQFCIyQUJRgQcVFjNSYWJxgiPBJEODkZKh0f/aAAgBAQANPwDyS9J8ZwZikrHP5OCWqZBNK79RMXySPCDDNDJOSk8ckVchHPDtmDKDjvjXGwZPMJdgjiAv+e2kJquGgWblr9GGOQu8cceoG5ZU4dx1nIRj/VgjaI/JtOCYcJkYJqNubbuenHYVDL/Dm1m71jIWeM+EcTDic2MhMkwa61uuitZk55nlKWetC8gV5I5NVqCTS8NZK5D9qKRjgmeyQiRQw3494QYxABZZrKQrXk5DM/l4qwcdqjVyVCSH7D0rMIJpxxTorpfaNylmVlDR7vWj2QTPZpwmSeVvYB8B7SfAAdySBrGWjFDg6FkrWndT97YZD/iZPy+7T3ebu5/IbDVKdZq1mrO0csMindXRlIKsCAQQdxrMukmbwnFN6edLGx7vGxfeGUj3h81OqTrBxDw9bcGzjLBG4VtvXRvFJB2YA+BBAxgsXLNGhBDRpccc8kk80VsgKiX2kd3juv67OYrDFCk1bX0Y3pqnDcNmaCY3uKOjC6E13ikPTqQWBYEu8TLZNNomfpTBNZgCDnifZl5weY/xT/uUHUXpzO2pXChaybKo/HI/go1OAxx2JwptlP3d5E1LOYcRxvh4282n/AlhO5rTEe43YkHkZ9cY4uzjrlN39C0wXqxfzV0BH5FvJ9KObNHjPFw1asEGMz4r86TRCMo8nnscFmeQmNiJ4J5HlJsogyPCtTP8Z1sxjkrZA5u/Cli2lpRFG3UhdxVUSgyJDVhiYkx6GsM5giHs5z3b+w1esDrGGF5H5fyVAWPyGssURH4iwdugbMp9iy2IkQ9/1a9ms7UaCzhs/fgRbcTbgjkkYFvl4HUmcr57grJGQuYxBOjvUd/fKdhv7ySKTqaNXjPxBG41j+Fbef4Mr4fHJZyAzdCGSxUSqpikYSTOhqsIgJHhtTRKQZPJXoTSf8UY6s5OaRnJ+Lk6oGUHIZKZ2Su0MfV5OigBkZ9uRQHXcnuRrGIfOpcTEXFJo7UdbexWmaQbCWSJWZHJQtzcpQO6cusrbhx2Rv28bWNavLyhUgNi2eUMAUB5ByLzemwOovpLxmNj4Uy1WatFh8o98UbEapLvHEAs7mQQMY90BPpDVeBI1P5KNv7eWbFzoPnGw0t+VT8nOsm7x363gZYmBRgD4rupK8w7gE7EazFXzae5n54ZTHAWRmiQRxRgKzRox3BJKDUlgBoQe4XlJ31UzcWWtcBTQNJVFwQ14JpoG6gWNpYqlcMShO8fiRsBjrbZGaKMf0zbdpJJJT4bkySu/ceJB8RpSRC59qAkDyY/hWpgOM7OYyKWcgM3QhSvbe2wlkbqTOgtKZSJHhtQysAZNNCwP+x0mXmABH6zrJzJ9T5+d+WvXlb/ACbJ9yJz3Evgjet6JLJJXWSvIWEiOGG6uCDs6kEEEHYg9jpZiJZ/qVRGI+/pBxaLk/IahRhBWQgz3ZgCejXj33kc/DwHixA1xFxZf+oscfSXHY6ApBFB+tuaOSRmPi0p22UAAeAGshwrbwHBlnD5FK2QObvwyVqj1WMsbdSF3NpjExkSGrNKoJj19KWbW9wZk5bVWCDGZ8VyjwymQI8nnscFaCMCRiJ4II0iJsu41ckMk2WwOVsU5S58SUR+kT+6HU1tpYstxDxDYS1ChVQIQajQIUXYkboW79ydYyCOZcVYyU1yOKeT0nC9dmZARyHYEayUE6QZujRWaSJ0idwQkpKn1D476n7GfM8OwzlE/AgWdFjX4KqhdYm3aniylmgtZ360zSlSgZh2LEePk+jG9Bb4klqwQTG7xR0ZkcCykkh6dWCya5i2iZbJtrKrmKEprG+b06t6/PDRpccc8iQRSVQSqJfaR0SSknrs4krqULw1qMZkuZHKW0gghUe1ncgDVzP1aef47uQOmNxdVpwk0sUfaSyVQk77KntHPrKAWnyIdWFjnHMHBXtykEbbdttttVJVlq2YQOaNwex/9HgQSDrhqzAkWYxGXlxlmVJYI5h1QUmjMiiTlPKqAkaiptbpYXL3I54sjEn3nQmULzug7lCoPL3G4DbcVYOSrdtY2/JD9h6VmEgXZJoHV0vtG4etErBo/QsyEJ0Us+XhigKmJNrkWcIERA0zIE87lITvPPzzuXJeRtO6qIJ2CPzbj0QCe57gdgRvvsTqgCuOxnEJkFmlEPCKCxGd1T4K6uFHhrP3J6GMv3+LpL/Rni3BL10hhPsJAL/v2ZN85lJbeVsB1aSWwxJI5E7IB6oXYKoAGsfKZKWexN5q12ByhUtFJEQ0J7sOZW3+BHl//8QAJBEAAQQCAgMBAAMBAAAAAAAAAQACAwQFESExEBITQQYUIlH/2gAIAQIBAT8AQG+lTxT5f9ScBRVK1Zu0/LUov8lygyNSc+rXKWlXnB2FaxUkeyzkIgjwASsbQbE36O7Uj2wsLnfiyOUkneWg8IyOJUcrmnYUGVnhk3tUrsd2PY7V7HNlaXxjldbCxNUySfR3Q8Zu2QPm0o7KdIyMcoTu70o5dlYawYrIG+12Flqnzf8ARv6qUIggA0nHTSVfmMsxKc71aSmiR7y562EDzwsdOfoP+qM+0YKuwiaAjxaOoHKY7cV8W2XehOlLR+bdtO9IdKKrLKNqpC9loNco+IwtceLQ3A5TD/RViaSGfbCmWpnAg/q9udJt98f5tPmklf7fqwbpnY9pk78UZhNAHbUw3EQrHEhU1USt9h2vUs209of2/rz0mROeVhMVUdWEjxsprQ0aars3xrk75WJt/N/zd0VoEKXEU5dkjlR4WkxuiNr+RNZXvmOH8WEiF+8IZSm/xuEDQcqVUVIBHvxlbRkk+Y6CB0VQyLJW+kh5TpGMbtxWQy5ZCRDyVL9Z5i+TklQukqyiSM6IWPzk8kAMg2VVyDLB0eCsjfbEwxs7RJJ8A6TrU0g08rgqajHIdjhDGfpKjYyJnqEJHNOwiSfH/8QAKBEAAQQCAgIBAwUBAAAAAAAAAQACAwQFERIhEDETBiJBFSAjMlGx/9oACAEDAQE/APE+Rjj6Z2U6zYnJAKjxdx42GqahbgG3DpR27EWu1XvxydP6P7Ltxz3FjPX/AFRsMj+IWMxscLORHaEbQpI2vGlPioZo9elbpvqSaKp3iw8JPXi/YEcfAez4w1UPfzKZpoUNeWc/b6RqRM9nZUkBA2sxAH1yf88Y6wZY+B9hXJfkmJ30mdnQWNiEcAULA+QApzo2sDI18fe0GjWlk6vGM/4U8aeQqUhimB34rjcoVcajCjsvow/KG72quT+eTThraAU92CE6VqaKai57U/fM+a/UoVf+gWPr17FDUg2p6FSLtn4UcZ47TcNDY+7lpMrQ12GP8BZ1sDci8RevFyIxTkKLp4VTuIKrkXV/4z6THsfp3sI/pQq/b/ZPstgBO1m8xdFl0bHaCcS4klUovkmA/CyFf5I+Y9hDpQ5O3D0D0pMvbe7YK+lf58aJJ+9rPltDHOnh7ITvqGZ525quWTbmMhGvGPriOPmfZ8W6TmHkwdJrXOOgFjcYx87TP6UBiggEcQ0ApPjsQGKTsFZPCwQ2nNjOgrFJ0A37VGmXnm71+xteJhJaENhVspLEOLuwjnN7aGqWV8zy4osaRo+f/9k="}}]},{"role":"assistant","content":"It is the logo of Doubao APP."}]} ``` **格式说明** 为便于展示各个字段关系,将JSONL格式文件的一条数据展开,如下: ```JSON { "messages": [ { "role": "user", "content": [ { "type": "image_url", "image_url": { "url": "data:image/{image_extension};base64,{image_base64}" } }, { "type": "text", "text": "What’s in this image?" } ] }, { "role": "assistant", "content": "It is a cat." } ] } ``` * 支持在 user role 内混排图文,图文顺序无限制,训练按样本中的顺序进行。 * 支持多轮对话和单轮对话多图。 * text 字段不能为空字符串。 * 支持在创建精调任务时上传或选择多个文件或数据集,**单数据文件大小限制在 2G 以下,大文件可拆分为多个小文件**。 ###### **附:图片编码方法** 以下是Python对图片进行 base64 编码的代码示例。 ```Python import base64 # 将结果填入 url 字段内 def encode_image(image_path): extension = image_path.split(".")[-1] with open(image_path, "rb") as image_file: base64_image = base64.b64encode(image_file.read()).decode('utf-8') return f"data:image/{extension};base64,{base64_image}" ``` ##### 3. 图片使用相对路径 ###### **格式示例** 以下为 jsonl 文件中使用图片相对路径的格式示例。 1. 创建目录结构如下: ```Bash vlm ├── data.jsonl └── image ├── doubao_app_logo.jpeg └── doubao_logo.jpeg ``` 2. 则对应的数据示例如下:JSONL 文件中需确保**单个样本独占一行** ```JSON {"messages": [{"role": "user","content": [{"type": "image_url","image_url": {"url": "file:./image/doubao_logo.jpeg"}},{"type": "text","text": "What’s in this image?"}]},{"role": "assistant","content": "It is the logo of Doubao LLM model."}]} ``` ###### 格式说明 为便于展示各个字段关系,将JSONL格式文件的一条数据展开,如下: ```JSON { "messages": [ { "role": "user", "content": [ { "type": "image_url", "image_url": { "url": "file:./image/doubao_logo.jpeg" } }, { "type": "text", "text": "What’s in this image?" } ] }, { "role": "assistant", "content": "It is the logo of Doubao LLM model." } ] } ``` **注意:这种格式仅支持文件夹内图片数量少于 1000 张,大于该规模仍建议使用 TOS 存储图片**。 * 具体操作:创建文件夹,将图片和对应的 jsonl 文件按照上述格式要求进行整理后放入该文件夹中。 如在控制台页面进行精调数据配置**需将创建的文件夹拖拽到上传框内**,暂不支持点击上传框后选择文件夹。例如:上方目录结构需把`vlm`文件夹拖拽上传。对于 tos 数据集文件夹路径,可以在控制台直接点击选择。 * 支持图片和 jsonl 文件分别存放在同一文件夹中,通过相对路径在 jsonl 文件中指向图片(暂不支持绝对路径 tos url),文件夹内可包含多个 jsonl 文件,但要求 jsonl 文件位于文件夹根路径。 #### **视频抽帧图片序列** 视觉理解模型精调支持用户将视频抽帧为图片后,将时间戳和图片按顺序编排到训练集中。可参考 [附3:对视频内容进行抽帧](/docs/multimodal-fine-tuning-data-format#72d61a86)。 > **注意** > > doubao-seed-1.8 / 2.0 模型抽帧策略与doubao-seed-1.8 之前的模型有所不同,详情请参见 [抽帧策略](/docs/video-understanding#203baa92)。 **格式示例** 样本格式:为JSONL文件( **JSON Lines**,是一种轻量级的文本文件格式,核心规则 **每一行对应一个独立的、合法的 JSON 对象**),需确保**单个样本独占一行,** 示例如下: ```JSON {"messages": [{"role": "user","content": [{"type": "text","text": "你觉得这个恐怖吗?"},{"type": "text","text": "[0.0 second]"},{"type": "image_url","image_url": {"url": "base64/相对路径"}},{"type": "text","text": "[1.0 second]"},{"type": "image_url","image_url": {"url": "base64/相对路径"}},{"type": "text","text": "[2.0 second]"},{"type": "image_url","image_url": {"url": "base64/相对路径"}}]}]} ``` 为便于展示各个字段关系,将JSONL格式文件的一条数据展开,如下: ```JSON { "messages": [ { "role": "user", "content": [ { "type": "text", "text": "你觉得这个恐怖吗?" }, { "type": "text", "text": "[0.0 second]" }, { "type": "image_url", "image_url": { "url": "base64/相对路径" } }, { "type": "text", "text": "[1.0 second]" }, { "type": "image_url", "image_url": { "url": "base64/相对路径" } }, { "type": "text", "text": "[2.0 second]" }, { "type": "image_url", "image_url": { "url": "base64/相对路径" } } ] } ] } ``` ## 音频/视频文件要求 以下要求仅适用于语言及多模态理解模型的音频、视频输入。视频生成模型的输入素材限制,请参见[全模态输入](/docs/video-generation-tutorial#63a97f09)。 音频和视频支持使用 `tos://` TOS 地址或 `data:` Base64 内嵌方式传入,不支持 HTTP(S) 地址、`file:` 相对路径或 File API 的 `file_id`。通过 TOS 地址传入时,音频或视频对象需要与 JSONL 文件处于同一个桶内。视频文件沿用现有 `messages[].content[]` 或 `content[]` 多模态结构,通过 `video_url` 传入;如需控制视频抽帧帧率,可在 `type` 为 `video_url` 的同级对象中配置 `fps` 字段。 > **说明** > > `audio_url` 支持用于 SFT、DPO、CPT,不支持用于 GRPO、PPO 等 RL 训练。`video_url` 需要在支持视频输入的模型和训练方式中使用。详情请参见 [选择模型](/docs/fine-tuning-overview#d3ef4388)。 **音频文件限制** * 支持 WAV、MP3、M4A、AAC 格式,具体以创建精调任务时的数据校验结果为准。 * 单个音频文件大小不超过 512 MB。 * 纯音频训练不做音频时长限制。 * 音频文件应保证可正常解码,避免空音轨、损坏文件或无法识别的编码格式。 Base64 内嵌示例: ```JSON { "type": "audio_url", "audio_url": { "url": "data:audio/wav;base64," } } ``` **视频文件输入方式(视频内嵌音频文件)** 视频输入沿用现有多模态 `content[]` 结构: ```JSON { "content": [ { "type": "video_url", "fps": 1, "video_url": { "url": "tos://bucket/video/demo.mp4" } }, { "type": "text", "text": "请你描述下视频中的人物的一系列动作。" } ] } ``` 视频地址支持: * TOS 地址:`tos://bucket/video/demo.mp4` * Base64:`data:video/mp4;base64,...` 暂不支持 HTTP(S) 地址、`file:` 相对路径,以及通过 File API 上传后使用 `file_id` 或文件引用方式传入视频。 **视频文件限制** * 支持格式: * MP4:`video/mp4` * AVI:`video/x-msvideo` * MOV: * 通过 URL 传入视频时,对象存储请设置 Content-Type 为 `video/quicktime`。 * 通过 Base64 编码传入视频时,请使用 `video/mov`,即 `data:video/mov;base64,`。 * 单个视频文件大小不超过 512 MB。 * 视频内嵌音频经预处理后,音轨和纯音频文件使用一致的 token 计量规则。 * 如需使用视频内嵌音频进行训练,请确保视频文件包含可正常解码的音轨。 **具体操作**: 1. 创建存储桶(Bucket)用于存储文件(Object),创建存储桶详细步骤可见 [对象存储控制台快速入门](https://docs.volcengine.com/docs/6349/74830?lang=zh)。例如创建如下结构: ```Bash bucketname #桶名称 ├── sample #桶内文件夹名称 ├── data.jsonl ├── audio #桶内文件夹名称 ├── xxx.wav └── xxxx.mp3 └── video #桶内文件夹名称 ├── xxx.mp4 └── xxxx.mp4 ``` 2. jsonl文件中在URL内以“`tos://${bucket}/${object}`”的形式填入TOS对象地址,例如上方结构URL则为“`tos://bucketname/audio/xxx.wav`”或“`tos://bucketname/video/xxx.mp4`”。**注意,TOS URL所引用的音频或视频需与JSONL文件处于同一个桶内**。这种格式能够加快数据处理速度、减少多角色传输所耗费的时间,进而提高训练效率。以上步骤完成后,**精调任务进行数据配置时选择 从TOS中导入方式 仅上传jsonl文件即可**。 ## 数据集 Thinking 字段处理工具 您可以通过脚本将不含`thinking`的数据集转换为含`thinking`的数据集: * 对于数据集中不含`reasoning_content`的样本,将`thinking`赋值为`disabled`。 * 含`reasoning_content`的样本,则赋值为`enabled`。 您可下载 [此脚本](https://arkdocs.tos-cn-beijing.volces.com/files/training/dataset_converter.zip) 对数据集进行转换,使您的数据集符合精调模型数据格式规范。 ## 多轮 reasoning_content 样本文件拆分 您可参照以下脚本,将一条携带多轮reasoning_content的样本拆分为多条仅最后一轮对话携带reasoning_content的样本。 * 代码实现:输入一个JSONL样例文件,输出处理好的训练数据到指定文件夹。 * 使用示例:python main.py --input test.jsonl --output res-folder ```Python import json import os import argparse from process import process_sample from typing import List, Dict, Any def process_sample(sample: Dict[str, Any]) -> List[Dict[str, Any]]: """ 处理单个样例数据,根据规则生成一组处理后的样例 参数: sample: 包含消息的字典,格式如案例所示 返回: 处理后的样例列表 """ messages = sample["messages"] # 用于存储处理后的消息 message_result_list = [] processed_messages = [] not_set_loss_weight_index = [] for i in range(0, len(messages)): current = messages[i] # 最后一个消息不需要处额外理 if i == len(messages) - 1: processed_messages.append(current) message_result_list.append(processed_messages.copy()) break # 只处理role为assistant的消息 if current.get("role") == "assistant": # 检查是否存在loss_weight: 0 has_loss_weight_zero = "loss_weight" in current and current["loss_weight"] == 0 # 检查是否存在reasoning_content has_reasoning_content = "reasoning_content" in current # 情况1: 不存在loss_weight:0, 且存在reasoning_content if not has_loss_weight_zero and has_reasoning_content: # 拆分出当前消息, 并添加到消息列表中 previous_messages = [msg.copy() for msg in processed_messages] previous_messages.append(current.copy()) message_result_list.append(previous_messages.copy()) # 处理当前消息, 不保留reasoning_content, 并记录loss_weight:0 new_assistant_msg = current.copy() del new_assistant_msg["reasoning_content"] new_assistant_msg["loss_weight"] = 0 # 将处理后的消息段保存下来,用于后续使用 processed_messages.append(new_assistant_msg) current = [] # 处理之前未设置loss_weight的消息,确保每条消息只被用于一次训练 for idx in not_set_loss_weight_index: processed_messages[idx]["loss_weight"] = 0 not_set_loss_weight_index = [] # 情况2: 存在loss_weight:0 elif has_loss_weight_zero: # 不做拆分,不保留reasoning_content new_assistant_msg = current.copy() if "reasoning_content" in new_assistant_msg: del new_assistant_msg["reasoning_content"] processed_messages.append(new_assistant_msg) # 情况3: 不存在reasoning_content else: processed_messages.append(current) # 记录下当前未设置loss_weight的消息 not_set_loss_weight_index.append(i) else: # 非assistant角色的消息直接添加 processed_messages.append(current) # 生成最终的样例列表 processed_samples = [] for messages in message_result_list: processed_sample = sample.copy() processed_sample["messages"] = messages processed_samples.append(processed_sample) return processed_samples def main(): parser = argparse.ArgumentParser(description='处理JSONL样例数据并输出到文件夹') parser.add_argument('--input', required=True, help='输入的JSONL文件路径') parser.add_argument('--output', required=True, help='输出文件夹路径') args = parser.parse_args() # 读取JSONL文件 samples = [] try: with open(args.input, 'r', encoding='utf-8') as f: for line in f: if line.strip(): # 跳过空行 samples.append(json.loads(line)) except FileNotFoundError: print(f"错误: 找不到输入文件 {args.input}") return # 处理所有样例 all_processed_samples = [] for sample in samples: processed_samples = process_sample(sample) all_processed_samples.extend(processed_samples) # 写入JSONL文件到文件夹 os.makedirs(args.output, exist_ok=True) try: # 确保输出目录存在 os.makedirs(args.output, exist_ok=True) # 构建完整输出路径 output_path = os.path.join(args.output, f"result.jsonl") # 将所有样本写入JSONL文件 with open(output_path, 'w', encoding='utf-8') as f: for sample in all_processed_samples: f.write(json.dumps(sample, ensure_ascii=False) + '\n') print(f"处理完成,已生成JSONL文件,包含 {len(all_processed_samples)} 个样本,保存在 {output_path}") except Exception as e: print(f"错误: 写入文件失败 - {e}") if __name__ == "__main__": main() ``` ## 对视频内容进行抽帧处理 当您需要对视频内容进行理解时,可以对视频进行抽帧,生成若干图片后,再将图片结合文本作为提示词内容,请求视频理解的模型服务。下面是使用 Python 脚本实现的方案,供您参考。 > **注意** > > doubao-seed-1.8 / 2.0 模型抽帧策略与doubao-seed-1.8 之前的模型有所不同,详情请参见 [抽帧策略](/docs/video-understanding#203baa92)。 ### 代码流程 1. 视频文件读取:从本地路径读取视频文件。 2. 对视频进行抽帧,可以支持 2 种策略: 1. `CONSTANT_INTERVAL`:固定时间间隔抽帧,如 1s 一帧,时间间隔可以调整。 2. `EVEN_INTERVAL`:固定总帧数均匀抽帧,如不管视频时长,总共抽 20 帧,抽取的总帧数可以调整。 3. 压缩帧图像:为了降低网络传输时延,以及减少 token 用量,将图像等比例压缩至 640*480 以内。 4. 请求视觉理解模型:组装请求体,包含提示词(Prompt)及所有帧图像的 Base64,并使用方舟`ChatCompletion` 接口调用模型服务。 ### 示例代码 #### 环境配置 在运行脚本前,您需要配置好 API Key、获取Model ID,具体方法请参见: > **说明** > > 方舟平台的新用户?获取 API Key 及 开通模型等准备工作,请参见 [快速入门](/docs/quick-start)。 > 创建推理接入点时,请选择支持视觉理解的大模型,具体可参见 [视觉理解能力](/docs/model-list#76df97c8)。 运行脚本前,请先在终端中安装依赖包。 ```Bash pip install opencv-contrib-python pip install arkruntime ``` #### 实现脚本以及配置 配置您的变量,包括: * ``替换您的视频文件的路径。 * ``替换为模型的Model ID。 * `prompt = "描述视频内容"`配置您的文本提示,这里仅做示例使用。 * 选择您的抽帧策略。 ```Python ... # 1. CONSTANT_INTERVAL:固定时间间隔抽帧,可以调整时间间隔 # 2. EVEN_INTERVAL:固定总帧数均匀抽帧,可以调整总帧数 extraction_strategy=Strategy.CONSTANT_INTERVAL, # extraction_strategy=Strategy.EVEN_INTERVAL, ... ``` #### 完整的 Python 脚本 ```Python from typing import Optional # Import the OpenCV library for video processing import cv2 # Import the time library for timing import time # Import the file operation library for directory deletion import shutil # Import the enum library for defining frame extraction strategies from enum import Enum # Import the Base64 encoding library for converting images to Base64 strings import base64 # Import the operating system library for file path operations import os # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark from arkruntime._exceptions import ArkAPIError # Define the frame extraction strategy enumeration class class Strategy(Enum): # Fixed interval frame extraction strategy, e.g., extract one frame every 1 second CONSTANT_INTERVAL = "constant_interval" # Even interval frame extraction strategy, extract frames evenly from the entire video based on the set maximum number of frames EVEN_INTERVAL = "even_interval" def preprocess_video( video_file_path: str, output_dir: str, extraction_strategy: Optional[Strategy] = Strategy.EVEN_INTERVAL, interval_in_seconds: Optional[float] = 1, max_frames: Optional[int] = 10, keyframe_naming_template: str = "frame_{:04d}.jpg", ) -> list[str]: """Extract frames from video according to the specified strategy Args: video_file_path (str): Path to the video file output_dir (str): Output directory extraction_strategy (Optional[Strategy], optional): Frame extraction strategy. Constant interval (e.g., extract one frame every 1 second) or Even interval (extract frames evenly from the entire video based on the set maximum number of frames) Defaults to constant interval (1 frame per second). interval_in_seconds (Optional[float], optional): Time interval for constant interval frame extraction. Defaults to 1 second per frame. max_frames (Optional[int], optional): Maximum number of frames to extract. Defaults to 10 frames. keyframe_naming_template (_type_, optional): Naming template for extracted key frame images Returns: list[str]: List of paths to the extracted key frame images """ # Check if the output directory exists; create it if it does not if not os.path.exists(output_dir): os.makedirs(output_dir) # Open the video file using OpenCV cap = cv2.VideoCapture(video_file_path) # Get the frame rate of the video fps = cap.get(cv2.CAP_PROP_FPS) # Get the total number of frames in the video length = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) # Select the frame interval based on the strategy if extraction_strategy == Strategy.CONSTANT_INTERVAL: # Calculate the frame interval for constant interval extraction frame_interval = int(fps * interval_in_seconds) elif extraction_strategy == Strategy.EVEN_INTERVAL: # Calculate the frame interval for even interval extraction frame_interval = int(length / max_frames) else: # Throw an exception if the strategy is invalid raise ValueError("Invalid extraction strategy") # Initialize the frame counter frame_count = 0 # Initialize the list of key frames keyframes = [] # Loop to read video frames while True: # Read one frame ret, frame = cap.read() # Exit the loop if frame reading fails if not ret: break # Check if the current frame is a key frame if frame_count % frame_interval == 0: # Generate the filename for the key frame image_path = os.path.join( output_dir, keyframe_naming_template.format(len(keyframes)) ) # Save the key frame as an image cv2.imwrite( image_path, frame, ) # Add the key frame path to the list keyframes.append(image_path) # Increment the frame counter frame_count += 1 # Exit the loop if the maximum number of key frames is reached if len(keyframes) >= max_frames: break print("[Video Frame Extraction Completed]") print("[Number of Extracted Frames]", len(keyframes)) # Return the list of key frame paths return keyframes def resize(image): """ Resize the image to fit the specified dimensions. Args: image (numpy.ndarray): Input image in numpy array format. Returns: numpy.ndarray: Resized image. """ # Get the original height and width of the image height, width = image.shape[:2] # Determine the target dimensions based on the image's aspect ratio if height < width: target_height, target_width = 480, 640 else: target_height, target_width = 640, 480 # Return the original image if its dimensions are already less than or equal to the target dimensions if height <= target_height and width <= target_width: return image # Calculate the new height and width while maintaining the image's aspect ratio if height / target_height < width / target_width: new_width = target_width new_height = int(height * (new_width / width)) else: new_height = target_height new_width = int(width * (new_height / height)) # Resize the image return cv2.resize(image, (new_width, new_height)) # Define a method to resize the image at the specified path to an appropriate size and convert it to Base64 encoding def encode_image(image_path: str) -> str: """ Encode the image at the specified path Args: image_path (str): Path to the image file Returns: str: Encoded image string """ # Read the image image = cv2.imread(image_path) # Resize the image image_resized = resize(image) # Encode the image in JPEG format _, encoded_image = cv2.imencode(".jpg", image_resized) # Convert the encoded image to a Base64 string return base64.b64encode(encoded_image).decode("utf-8") def construct_messages(image_paths: list[str], prompt: str) -> list[dict]: """ Construct a list of messages containing text and images. Args: image_paths (list[str]): List of image file paths. prompt (str): Text prompt. Returns: list[dict]: List of messages containing text and images. """ print("[Assembling Request Parameters]") # Initialize the content list with a text message content = [ { "type": "text", "text": prompt, }, ] # Iterate through the list of image paths for image_path in image_paths: # Construct an image URL message for each image path content.append( { "type": "image_url", "image_url": { # Convert the image to a data URL using Base64 encoding "url": f"data:image/jpeg;base64,{encode_image(image_path)}", # Specify the image detail level as low "detail":"low" }, } ) # Return the list of messages containing text and images return [ { "role": "user", "content": content, } ] if __name__ == "__main__": # Replace with the path to your video file video_path = "" # API Key retrieved from environment variables; configure your API Key in advance ark_api_key = os.environ.get("ARK_API_KEY") # Replace with the Model ID of your model model_id = "" # Replace with your text prompt; this is for example use only prompt = "Describe the video content" since = time.time() # Delete historical frames if os.path.exists("videoFrames"): shutil.rmtree("videoFrames") selected_images = preprocess_video( video_file_path=video_path, output_dir="videoFrames", # Two frame extraction strategies # 1. CONSTANT_INTERVAL: Extract frames at a fixed time interval; adjust the interval as needed # 2. EVEN_INTERVAL: Extract a fixed total number of frames evenly; adjust the total number as needed extraction_strategy=Strategy.CONSTANT_INTERVAL, # extraction_strategy=Strategy.EVEN_INTERVAL, # Frame interval for constant interval extraction strategy interval_in_seconds=1, # Maximum number of frames to extract from the video max_frames=20 ) print("[Frame Image Compression Completed]") preprocess_time_cost = time.time() - since client = Ark( api_key=ark_api_key, base_url="https://ark.cn-beijing.volces.com/api/v3", ) since = time.time() try: response = client.chat.completions.create( model=model_id, messages=construct_messages( selected_images, prompt, ) ) print("[Video Understanding Result]\n", response.choices[0].message.content) print("\n[Total Tokens Consumed]", response.usage.total_tokens) print("- Input Tokens:", response.usage.prompt_tokens) print("- Output Tokens:", response.usage.completion_tokens) except ArkAPIError as e: print(e) api_time_cost = time.time() - since print("\n[End-to-End Total Time Consumption]", round(preprocess_time_cost + api_time_cost, 2)) print("- Video Preprocessing Time:", round(preprocess_time_cost, 2)) print("- Result Generation Time:", round(api_time_cost, 2)) ``` ## Function Calling 样本要求 对于 Function Calling 样本,数据格式有以下几点特殊要求: 1. **`tools`** **字段 (必填)**:您必须在样本的顶层提供 `tools` 字段,其格式需与推理 API 的定义保持一致。 2. **`parallel_tool_calls`** **字段 (可选)**:这是一个布尔类型字段,默认值为 `True`。 * 它用于声明该样本是否支持并行函数调用,其含义与推理 API 中的参数一致。 * 如果您将此字段设为 `false`,但 `assistant` 的回复中又包含了多个 `tool_calls`,将会导致错误。 3. **`assistant`** **消息中的** **`tool_calls`** **字段**:在 `messages` 列表中,如果 `assistant` 的回复触发了函数调用,则该消息中必须包含 `tool_calls` 字段。 * `tool_calls` 数组中的每个 `function` 对象都必须包含 `name` 和 `arguments` 两个键。 * `arguments` 的值必须是一个合法的 JSON 格式字符串。 4. **`tool`** **角色的消息**:在 `messages` 列表中,用于表示函数调用返回结果的消息,其 `role` 必须为 `tool`。这类消息的 `loss_weight` 固定为 `0.0`,且不可修改。 以下是一个包含多轮对话和并行函数调用的完整精调样本示例: ```JSON { "messages": [ { "role": "system", "content": "你是豆包" }, { "role": "user", "content": "把北京上海的天气发给Alan" }, { "role": "assistant", "content": "分别查询北京和上海的天气。", "tool_calls": [ { "type": "function", "function": { "name": "GetCurrentWeather", "arguments": "{\"location\": \"北京\"}" } }, { "type": "function", "function": { "name": "GetCurrentWeather", "arguments": "{\"location\": \"上海\"}" } } ], "loss_weight": 1.0 }, { "role": "tool", "content": "北京天气晴,18~25°,微风" }, { "role": "tool", "content": "上海天气阴,20~30°,大风" }, { "role": "assistant", "content": "已经查到北京上海天气,需要发送给alan", "tool_calls": [ { "type": "function", "function": { "name": "SendMessage", "arguments": "{\"receiver\": \"Alan\", \"content\": \"今天北京天气晴,18~25°,微风;上海天气阴,20~30°,大风\"}" } } ], "loss_weight": 1.0 }, { "role": "tool", "content": "发送成功" }, { "role": "assistant", "content": "已经查到北京上海今日天气,发送给了Alan", "loss_weight": 1.0 } ], "tools": [ { "type": "function", "function": { "name": "MusicPlayer", "description": "歌曲查询Plugin,当用户需要搜索某个歌手或者歌曲时使用此plugin,给定歌手,歌名等特征返回相关音乐", "parameters": { "properties": { "artist": { "description": "表示歌手名字", "type": "string" }, "description": { "description": "表示描述信息", "type": "string" }, "song_name": { "description": "表示歌曲名字", "type": "string" } }, "required": [], "type": "object" } } }, { "type": "function", "function": { "name": "GetCurrentWeather", "description": "查询当前的天气", "parameters": { "type": "object", "properties": { "location": { "type": "string", "description": "地理位置,比如北京市" }, "unit": { "type": "string", "description": "温度单位", "enum": [ "celsius", "fahrenheit" ] } }, "required": [ "location" ] } } }, { "type": "function", "function": { "name": "LinkReaderPlugin", "description": "当需要解析网页内容时,调用本插件", "parameters": { "type": "object", "properties": { "url": { "type": "string", "description": "需要解析网页链接,最多3个;" } }, "required": [ "url" ] } } }, { "type": "function", "function": { "name": "WebSearchPlugin", "description": "当需要搜索互联网内容时,调用本插件", "parameters": { "type": "object", "properties": { "keywords": { "type": "string", "description": "需要搜索的内容" } }, "required": [ "keywords" ] } } }, { "type": "function", "function": { "name": "SendMessage", "description": "需要发送微信消息时,使用本函数", "parameters": { "type": "object", "properties": { "receiver": { "type": "string", "description": "接受对象" }, "content": { "type": "string", "description": "需要发送的内容" } }, "required": [ "receiver" ] } } } ] } ``` 在实际的 `.jsonl` 文件中,上述示例应以单行形式呈现: ```Bash {"messages":[{"role":"system","content":"你是豆包"},{"role":"user","content":"把北京的天气发给Alan"},{"role":"assistant","content":"","tool_calls":[{"type":"function","function":{"name":"GetCurrentWeather","arguments":"{\"location\": \"北京\"}"}}],"loss_weight":1.0},{"role":"tool","content":"北京天气晴,18~25°,微风"},{"role":"assistant","content":"已经查到北京天气,需要发送给alan","tool_calls":[{"type":"function","function":{"name":"SendMessage","arguments":"{\"receiver\": \"Alan\", \"content\": \"今天北京天气晴,18~25°,微风\"}"}}],"loss_weight":1.0},{"role":"tool","content":"发送成功"},{"role":"assistant","content":"已经查到北京今日天气,发送给了Alan","loss_weight":1.0}],"tools":[{"type":"function","function":{"name":"MusicPlayer","description":"歌曲查询Plugin,当用户需要搜索某个歌手或者歌曲时使用此plugin,给定歌手,歌名等特征返回相关音乐","parameters":{"properties":{"artist":{"description":"表示歌手名字","type":"string"},"description":{"description":"表示描述信息","type":"string"},"song_name":{"description":"表示歌曲名字","type":"string"}},"required":[],"type":"object"}}},{"type":"function","function":{"name":"GetCurrentWeather","description":"查询当前的天气","parameters":{"type":"object","properties":{"location":{"type":"string","description":"地理位置,比如北京市"},"unit":{"type":"string","description":"温度单位","enum":["celsius","fahrenheit"]}},"required":["location"]}}},{"type":"function","function":{"name":"LinkReaderPlugin","description":"当需要解析网页内容时,调用本插件","parameters":{"type":"object","properties":{"url":{"type":"string","description":"需要解析网页链接,最多3个;"}},"required":["url"]}}},{"type":"function","function":{"name":"WebSearchPlugin","description":"当需要搜索互联网内容时,调用本插件","parameters":{"type":"object","properties":{"keywords":{"type":"string","description":"需要搜索的内容"}},"required":["keywords"]}}},{"type":"function","function":{"name":"SendMessage","description":"需要发送微信消息时,使用本函数","parameters":{"type":"object","properties":{"receiver":{"type":"string","description":"接受对象"},"content":{"type":"string","description":"需要发送的内容"}},"required":["receiver"]}}}]} ``` **注意事项** * `tool_calls` 数组中的函数调用数量,必须与后续 `role` 为 `tool` 的消息数量完全对应。 * 您必须遵循 JSON Schema 规范。在函数参数定义中,`type` 字段的值必须是以下类型之一,否则会导致错误: * `string` * `number` * `boolean` * `integer` * `object` * `array` * 如果您希望模型在返回函数调用(`fc`)的同时输出思考过程(如 CoT、reasoning),请将这部分文本内容填写在 `content` 字段中。 * 如果您的训练样本不需要包含一个完整的函数调用流程,可以进行截断,但样本必须以一个 `role` 为 `assistant` 的消息结尾。 ## **深度思考能力支持情况** > **注意** > > Seed 2.0 260415 以上模型,RL 强化学习 rollout 过程的推理默认仅支持 thinking disable,不支持设置此项。 不同模型深度思考能力可配置的枚举值不同,详细信息请参见 [开启/关闭深度思考](/docs/deep-thinking#fa3f44fa)。 |模型版本 |enabled |disabled |auto |custom | |---|---|---|---|---| |doubao-seed-1.6|250615 |✅ |✅(default) |✅ |❌ | |doubao-seed-1.6-flash|250615 |✅ |✅(default) |❌ |❌ | |qwen |❌ |❌ |❌ |✅(default) | |doubao-1.5-pro-32k|250115 |❌ |✅(default) |❌ |❌ | |doubao-1.5-lite-32k|250115 |❌ |✅(default) |❌ |❌ | * `enabled` 表示强制模型进行思考,此时模型rollout过程预期会输出reasoning_content * `disabled` 表示强制模型不进行思考, 此时模型rollout过程预期不会输出reasoning_content。 * `auto` 表示允许模型根据问题自主判断是否需要思考,复杂问题进行思考,简单问题直接回答。 * `custom` 表示训练的数据预处理过程不就对 reasoning_content 内容做任何的校验与处理,在训练过程中,会按模型配套的 chat template 对数据进行处理。以 qwen 为例 ,样本内的 content 和 reasoning_content 会使用 https://huggingface.co/Qwen/Qwen3-32B/blob/main/tokenizer_config.json#L230 所示 chat template 逻辑进行处理。在推理时也需要使用custom type以及和训练相同的reasoning_content。 * 对于上述格式要求,存量数据集可参考 [数据集 Thinking 字段处理工具](/docs/multimodal-fine-tuning-data-format#9656cd75) 进行格式转换。 --- # 图片生成模型精调数据格式 Source: https://ark.volcengine.com/region:cn-beijing/docs/image-fine-tuning-data-format 进行模型精调前,需要准备符合模型类别和精调方法要求的训练集与验证集。数据集采用 JSONL 格式,每行包含一个完整的 JSON 对象。 > **注意** > > 精调 JSONL 文件绝对路径不可包含以下特殊字符:`*`、`?`、`[`、`]`。 ## 支持模型 图片生成模型支持 SFT,具体模型 ID 和版本以创建精调任务时控制台可选项为准。 ## SFT 精调 图片生成模型总体上分为两类数据,一类是文生图 (t2i) 数据,特点为输入只有 prompt。另一类是编辑(edit)数据,即图生图,特点是输入是 文本 + 单图/多图。两类数据均采用相同的格式,以下是完整的格式示例、说明及字段定义。 每条样本必须满足以下要求: * `messages` 中恰好包含 2 条消息,第一条为 `user`,第二条为 `assistant`,不支持 `system` 消息或多轮对话。 * `user.content` 必须且只能包含 1 个 `text` 类型内容作为生成指令,可以包含 0 个或多个 `image_url`。 * `assistant.content` 必须且只能包含 1 个 `image_url`,不能包含 `text` 类型内容。 ### **格式示例** 样本格式:为JSONL文件( **JSON Lines**,是一种轻量级的文本文件格式,核心规则 **每一行对应一个独立的、合法的 JSON 对象**),需确保**单个对话样本独占一行**,示例如下。 ```JSON {"messages":[{"role":"user","content":[{"type":"text","text":"生成一只可爱的小狗照片"}]},{"role":"assistant","content":[{"type":"image_url","image_url":{"url":"tos://bucketname/image/dog.jpeg"}}], "loss_weight": 1.0}],"extra":{"sample_id":"sample-001","metadata":{"source":"user"}}} {"messages":[{"role":"user","content":[{"type":"text","text":"生成一只可爱的小狗照片"}]},{"role":"assistant","content":[{"type":"image_url","image_url":{"url":"data:image/jpeg;base64,/9j/4QDkRXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAABAAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAAOAAAAcgITAAMAAAABAAEAAIdpAAQAAAABAAAAgAAAAAAAAABIAAAAAQAAAEgAAAABd3d3Lm1laXR1LmNvbQAAB5AAAAcAAAAEMDIyMZEBAAcAAAAEAQIDAKAAAAcAAAAEMDEwMKABAAMAAAABAAEAAKACAAQAAAABAAAAVaADAAQAAAABAAAAVaQGAAMAAAABAAAAAAAAAAAAAP/bAIQAAQEBAQEBAgEBAgMCAgIDBAMDAwMEBQQEBAQEBQYFBQUFBQUGBgYGBgYGBgcHBwcHBwgICAgICQkJCQkJCQkJCQEBAQECAgIEAgIECQYFBgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJ/90ABAAG/8AAEQgAVQBVAwEiAAIRAQMRAf/EAaIAAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKCxAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6AQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgsRAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A/ZDUPjNe6xpplbRNk94vkxQQgZ3AfNI5/kB0ryOx8ZXoF1aRJJHAHKl4lBO0j5gwHQg/mK5Pwj450PTbx/FOv3Ui2LrNYxQXj/Zwso4VkyOvcHo3avGoPE994V8SHS0fzJpj5yNE3zyowwV2cDPvX/MuuF6eOwsMRmVePxTi0qbUvcUZW1io397ljq0rO/Kj5/D1KkOaMNnb07fI9avrTwdoOvf2rrWlXdxbYRfIQgI0p/1e/dgbcdcV9CfBvSPHHxG1Z9O8CabBZwT3EOyOCDcbZYzkyPMTsVeP8K/H34wftjeIdD1CTw1pnh+4+2zQMYUulkkjcIRHswo+/nAUr61/Tp+yn4BuvgL+zXptj4xaGLxTf6cuqa80TDy4rqRB+7UMcDYMRxpntn1r++fo6VauQYVKlh2qUU2nJ0+eUtleVOKco8vNaLk4rz5bno8O8LVM6xns3L3V2/Bf1/kXLD4FeG7DxtF4y8d+OJ9Su4EZRbxx4j+bgjqAQBwBivCP21vg1+2b4r8AXOvfsdeJrW5kSJnl03yltb642J+7ihlZjCpPqy9OlRfC34oaL+0xe3l98C9Vs9dttPuXs7y4tplmW2vYW2S20jJ8okQ/eXgin+Nfjf8AtRfs+fFnS/CN78H9Y8ZeEtVtf3+t6NeWb/YLhWxmW3mngmUbPutEJOeCtfv3Dni/xNCvU+rzlCM3zSs3HZLrutIpcqttZK5/S+c+BGS4egqdGa9rppdX17f1b5H8PnxS/YT/AGjfin8Tr7x3+1xq2tzXzW0jTWmrvtvLJ0cb4IVyI1iIHylVUH7xycEeLfsb3nxT8H/tO6x8FfhNPb+GdP1GU3dxcWMdvd3tvbwqkccKXcxKRGXGW+RsHcFOfmr+6z9qL4JfDL9tXwR4i8N6tYTS+JdMt5DpV757Wczu8Yb7NPIo+6/yghgdpwR2r8WT+xp8If2f/hRMh8FI2sfM5tbfC3ErqctE0iYUuMeuGIr9kyz6S+a5hluYYbMv9odSHJRoqEeWNnq2nLlk4JKTbitFfm+JH84+IPAOJyHGRpYjWM9n93+Z83ftb/DT4ofGjxZbeBPDnhXSNKs9W0vytT8R6jbQ3sqxoyI6pcRv8j7CTHuUjd9MV6F8Iv2DfA03hm0+HV1BY3z6EPKMl5GGkkXA2kAZLZU9a9M+HHwIj8T+J7LSbOHXbHTYZ/tL3JvPs8RSRlka3a2y3mQsw2ncAQM7cV+mnhfwP4X8FaxcR+CLG30s6nJJK6pubYpAGAx7AjK44Ffyz4YfTwn4b5Ysvw9VSgoOMYxXVS9yUm5zavHlik7WalZJI+Tnh1WjzTW2nr/X+R+Tuhf8EtbX4T6lqemfCmW5h0e/nF4qbLedUldf3iKLhHKKGHAGBjjHFdN/wwX49/5+rj/wD0//AOM1+tGieIPDvh7TBomqwXd60EkmyWBwCUJ4D5xyP5Vqf8Jx4I/6Bup/9/F/xr6PhD6QuYZ/gI5xiMR71Vyesdbc8kk/NJJdu2h6NDCWhZI//9D6y0pfiL4f0az8L+Nb61vbGzZ/LimiiYGb752YG7YuNq5+7XzJ8WPHeltfQeIbS0vbCSeKVn4DrHLF8uRj5gpzwK+jfij4p1DTp9R8M3OnveXs8jGKXbuZiflaJDwFBHzAivhL49aV4g0vwtFqumy3CWsMhsZbd51ws5jDEOwGSgxkAfSv+e/KqGIxmLp1cZTglJKNkkkractkvddlH3dUu6vY+ewlF1I1IRWiT/TsfYf7F/izw541/aq8KeAfile293stXu47DykzLJap5qg5ycA4JPbFfrH8WtH1n4sSX/w2126kHhjX5Fkn+zSyw3OYDvVEniIZN/G0rzwfav55f+CTfgzxnqv7XGp/GHXr1JdP0XwvewRxRoGLPdTxRKVOfl2hT2PBr9dPjH+0h4S0zwN480bTJZ7bWfBkSalC0TNDI+4OybARg/cdMHgg8V/U/C/C9HKsNRo4WSb+J8umu1vlZH9gfR3yhRyWpi+W/NK17dFbX5O6PUv2ivHr/wDBOv8A4J2eKvEH7BngLTZZfDUqN/ZdoTFGgluEGoXWUV5JpI1LySdZHIPVuK/Nz/gi/wD8FbP2rf2xPjV42+Gf7SZsn0gaQt9pMUEDJ9mvFndJYlkkZnki8kxkk4y2SAudi8v+1L/wVM8FfDX4Yat8KL7RvsMV1ZhLJ7lHS11Ozv4wyOkyg4J3MJFbDZ+bkGvw6/Zm/wCGo/2dfE11+0z4Z0wRafaRILfTIFWCK8juWCRWkRPzgbtoBweg+U9v6y4QwbxmSYinWop1JaqT3b02fl9yu7nfm3DVZ5j7fDP93SV5JW0STs2vRaK2y0P7gPB/ju1v/E/jUahA1vPp0kF3cdD8klsYztYY3KGtjjv69qwvi94Y8Pajp9v42igE6XM+J8cDeFGHwPVeCPWvx9/Z2+OnxRf4i6n4X8Q6c+p3WtafajVp7IMFtZrp5sAxcttiS5IfALDAJ9v0H1QeNdJ+GWj+CptWt7u80FS11NKpjSfaNgXZndkAdTjd1r+G/GfPKWGy2VPC1vZVpfw5KXK+aKXM7q2nJzX8uzsLxrw2ChkUvrdvaXXIvP8AyS38tuh8/eO21TwjqZ8QWYe3iiDOlqI97tHjAY9l6/KDXV6D4zv9M8P2N5aSLJYNGpf7YwilQty+zPUj+5W7a+G9X+Iljc6xc3qOkisqDzU6AAEQpzynbJ6cVyXib4Y+BRex3kmh3GqATRRRRMS3mrgKxRScKzHnnFfxlUweBw9JYevC8ZqNlHXmjfRyvZq1rbddOjf8V0IV4Xkvhl93n9x6t4g8UeHHvfLPh6LU5VALmKV8ICBtHyAjJHUdqwv+Ej0D/oSv/I03+Fc94i8H6wdYnf4b6THpdmpEbxpORmRFGSxGct69qxP+EQ+Lf/PMf+BDf4V/c/g3RxUOHMPGjH3Vz291bc8rLbotO/c2Sj0lf0P/0fqrxf4t8IaB8RdN8PeP4lutO1yzGoSQvEy3qCVSsLqA37rG3d8vNfJ3jr4Valr3hG28WJrNpf2OrXE3lwx4LgQAxgN0+cjBJ7dK+Mbj9pmDxsuqeNde2za3JBb2WnSTuwPkxuYmgiVRy+OQe9fQn7Pvwg8Q+PZDHrU0kLR+XLBAzukCFWy/llT/AKxhgOPTtX+JlbheOT0ZV8SuWnDXWPNLeN1dK+trbK197aHyODpVnF+xeys9Olvw3Nr9lrU9X/Z0+KNvH4HhMkmqXscd8sccktrcxp1t12jqfQchhmv1c/bf+CT337MUmus7+Gb7xUqfara5gAnFsHLbJMdWCngcDHXpX3p+xF+xtoP7O9tP8UfHRtrzWdTYHSomX/jxtWAPy7v42/vYziub/wCCoCXWs+DNN0q0KvJcDeVzkY6ds/kBX7vl2AhXpvMeVwc0nyJuy0Vvi95NparZdkf1f4KRzTLYRwuJqtwlrZ7L0/4Glz+RzQvCialZXXwz+K81truj8Kq3Q81lBUqrKScx5X+DkHriu8+GnjP4O+H/ABobPT3vLz+wQyafDdT+ZaRPt2Fo4jnbtzhecgZAwOK534o+GLrwRrKJPDmPJ3FQVCt0Lt3/ANkZ4rhfBnwm1zV9Xn1fSrZ/tF28bCFuP+BY/DFdMsRW9nUXtpRg+ido363SP6apYKEpJ8uv6LY/Zf8AY0S4TxlL4undYZLu4Ls8Y272PXJ9+MflX29+0P4Q8Rp43ju7UxLpXiCHdb9Ea3udnzO4P3kGPmOR1r4h/ZPF/YR2FvPGxkVVjkRuOV6+w57mv08/aH0/xBd/Dnw5qGkrBcxWss+5bllUAtGNse88EHqB3Ir4Lifh3CY7I5wrxu6XvL5rla9OV6n4F9IbLfaYP260cbW9Nj42+HcM1/omneHbC+tIb6C9kiE5wsauMo+wDAb+79ea1tY1/wCJnhXRtRtpL+xMkRk8gQkn9wxEbSMG/j4I+XoaoeLvFskGlG4+wQK9rJCJI1xEzMGVjNGGC72A4bHGKpQ+L/Hfg3xJY3ujSaZq+gyCaSZ7aMSJ5NycxiR2BCbGyOoya/nfC8F4OSqQrQ91x01SXbSNlG7trG61d3bW/wDImS4OhWqyda3Kk7a2221tu9rOy63VhnhSb40eLNHTU/BFmksGSH3SiJA3/TPaCWBHc966T/hHf2nf+gZB/wCBZ/8Aia9Mu/2gdI0vUGtPCsV5biKOOKfyLUyoZEzkHywVVhnnHbFM/wCGlNW/56al/wCC+T/4mv7V8L8mX9hYfknFKzsvLmfp+GnbQ7vrPtEpRppKyXXord/I/9L8Z/Gnh6w0H9piPQfDupabLBp0wmtrlJ1axY+WGiPp8uQMDvX61/8ABNvwIfHX7TNhd6j4se+k0m7ie9soxLDauSQxdYm4DEjG9eGHFfPnw1+F3wn+GGq2fgz4s+A9MGpXtneXN3fJDKwBtONolIwLh2HyngcccV9YfBb4TTfBbxlpXxv8MapfxwabBHeX6zIrzhZSJ4kuCvBzECAeg7V/l5xHjZezhQm3GySvKO9ryV7Jtc6T5Fom+W3Y4eF81pQxdGUl9pJ6K2mm/wAtVbSy9D+vPxtcWcyQXsWzMWCOM/J6+1fDX7f0l9baHpN7aWaXZCfO5YxIgxxjaCTx/kV9UHx1oU/gu31a+2+RdWyTJuI4WVAyj34NfI37aHgxvFfw5HifQrp5Jo7SMqvmN5EYxjzAq/LI2OinjoOlfRYWo4qrJ+X6n9l5dhXGdGPa9vwP5sfGsOla34xmj1C/hgij4MFvukkUk4XzJHwhDdkVOAAdxyK+2/hf8NbbVfBEHifS1he3t1YXNyg2ybYRkqo9m4r8wfj/AKHL8E/AGu+L3me5nnYEsW3TpPKwUuz9CPdRhenTFfRvhD4xS/Cr9k3S9G0vVWNzfaetxvY7nDXeTMWz1ODgA14mGw16ft6q93ZW7q3+Z91j81lCXsqUtdPS39I+4fhB8SPDUnhy88TWMOCzF0iPyoio2I2YryQ3Xjk9OK+0fiR46e7/AGXxZeI5Li31C+uo0sLi2gcxGcqTGrjlQh5HLdepr82v2MU8I+L/AITaVqGtROzRkwwovyqGjyFY8c9Plzxnn0r75/aO8ITt+yLrGieHrhbbbNaXJ8+UpDtWQbt20/KCOy4Brgr5XiP7OxEZtWcJaf1/Xofm/izKnXybEcsdUr/Ja6HxX488ceHvCPw60fwz4t12w1DUvL+2QXF1Ntltb2PCoE3dUYk9OBiuD8BfFW/+D1zFD4Y8Xxa9o+oKkesPJAhiZpZB+63KAA53Hk+1ch8Tl8IJ+0H4St/FOhr4hg07RlkupWeEwwQn5jP5S/M3zLhVH1rxjQovEXjH4O3Hxg8Cx2CrY6leWQ0ewtpWCRJM00EvO0STSpt6jaDkKa/L+HuDcelyyj7Ky95VOWCs3p8d7aq+yfWzsj+FqWIUZ2mrxejS28tv6R+qui+Kvgv4AS/tfFcEcMt7qFxcxJFcs37twm0soI2emPatj/hdP7N390/9/n/+Kr8RH+JX7QHxAuJtbOm3WkWTOTbz3rx2Ut3kDexiKs4EZGwbgvTpik+3/HP/AJ+x/wCB0f8A8ar+qOAcjVHKaVKtOLa5tpJr4n5fh020sfTUatNR1Z//0/LoPifrvj7wRf8Aimw12G8tvDbSyalpySbtSxbHnK/xIw5+XG5a2vh941+GPiW5u/Evg3xBqk154lt4/wC2LS5G3S3gETJamHn5RCDtUDAOeQeKw/hH+yv4X1PWtT+KfxQkWwtbTTkSOKOPM7zpEFUF0OCBKcsuOeh4r7K8G/AvUdc+Fq6d4jmtIvFMtu629wlqq/bIrZVklBt1+XKgbVI6Gv8AJvjfDUcNk1SGVyjGlVsklZN6qzScE3baLjb3bK1rHgZXldTDQjiG9P8Ahv60P0Y8NeLpNU/Zj8M+Ik2R2KaDBtjLFlDwp5bruPXZsxk/SvoX4U/ELTfix+zj4e1/wnF59je2H2eUyLt8uVCUdSnqDXwt44s9b0/9h2yNlNDeSNZlLiCPAMCB9wjGSMFVP7z1b0AruP8AgkJ4/stV/Zev/CN/K0reH9eu0USfwQTHzY1/u45+XHGOlfYZfiacsPHXeKP7ipYqpHDYb20bPRWe9+Xb8PwPwt/4KTeCb/wd4nk8Pa7ayTRSTQ2yRA7RI7tjJ9uf84rxrRdKNt8NZNcWOO6ttJSWO3jnnVPMmtz89swYHy2I5izwwFfsv/wWZk8PaJZ6B8VNC0aLxDeWFxFFLp4LZdJH8pnyoODEkhk+YYwpzivyQ0/9o7wdoWl22p+EvA11pd3ren+bvu1QWl00LAK7NtIZQeEJw23nGK8fM8LXlJUox/d3vfmXlpy3T266Lpft+SeJ3GGJoYiNChP2cmot7bXta33/AHWP0v8A+CcXiKw8afCfTV1G0+wz7C01u6bWilVyTwQOMdD3Ffp3+0j8HF+KP7JPjvw/ZXa2ZXSmnimblYmt2EodhxlVCk4r+e39nP8AaM/ajufi/wCFPit8ZNOSLQ9WvzpdvpsFq0cyMQ3mTT7flEEIVQsvCOTx95a/of09PH3xU+HmueEdKtt8ev6Rd2aJnb88sLBM45A5A9q/R5VKTws6dOzcf5de35bdVp1PX4bzZZzlso899HBvzt/lY/nQ+GfhiysdPuNc0C8j1vxVq1hPa2uoQqZEt1iOw4Zm25aMhhnjPavpD4WW/wCyr8HbJPgBoniPXPEUt/H52p20jymVLuIBtqyYUGMM3yhSK/Kazk+P/wAFP2dz4N1DwvqFnZaleCCbUGCCe1khl2XPlpEd+AUPAAGPSvr/AFTw3q2nX1z+0D4G8TXHijVbeWCBtNKLapELmBY4rmONhuIVl/eIWwevFfkmLzFYaVSn7rU20pXck5Qslf7MU7v3W1bp0Z/NdXFq1SpCCXXXVppbNXtbfQ+tdA+JnwSstKjsbKTbeQFku1up43IdTgBXbccAcY/hxWx/wtX4V/8APW1/7+wf4V8t/s2eBvErx+I/G+ueGodKuNdvkkntbyNHC3EcSiZ4MFgIZCQy4x827ivpz/hG7r/oFaZ/4Dp/hX7JwvwtH6jC2u+1rbvRcrtZbadjjspe9da9kf/U6P4GeCIoP+Cg+taXrN7cahbtbX1hDC8jLDELaThxCG8sswC5+UdK/NnQP2p/ibq/xoi1XT5jYan4Y8Qy2ltcxySEGI6hJZygxltvzr82OgIHBAr9Xvg//wApF9T/AOu+r/8AoyvwM8Af8li1/wD7Gqb/ANPj1/lf4YXxdDETxLcnTpw5ddrRdrfctDiwuIn7b2F/dXLof3ZfsVeAvB3jv4Ca7pXiiwjv7eXXtRt2FyBI7iRYmlZ2wMl3JPAUAYGOK+X/APgnB8NtI8KfGf8AaB+CVvI8uj6J4gs/saPkiKCWDiFVJIAQgkYx16cV9m/8E+f+SJ6x/wBjLf8A/oENfPH7Bf8AyeT+0v8A9hzTP/RBr73PMPTWJcYxSV1okkvh6JbfI/faGPrOhhpOTupaf+ATPBf+CrPgHwf8N/AGk/EPSLVmuLK5YPH5rok0bRlmR9pGQQuPxr8hH8T6/wDEf4a614p88QW2nXKWcWmzolxZ+UGIQbMIfkAwMEe9ftV/wWe/5N+h/wCvhv8A0S9fhv8ADL/kgfin/sJJ/wChNX454g4WFKcMVTVpNxXy06bfgfnPixRjPGUKs9Xyr/0o634efGvxdqPwA8HeJL+VnEl7No1xEpVd9uCWTY4TdGVYDpnI4r+pX9lq1+0+G7XxEzZkis7c4YA585QT0A6ewr+Qf4Y/8mseD/8AsY5f61/YF+yh/wAk5i/68rH/ANF19bwth4UPrvsVbW2nr/X9I6/CaTVHEq/b9P8AM86+NX/BOT4L/GvUfFfi201TWPDM+twyzT2+mzRfZVvoo233ccMsT+W064WdEYI5AfAfLH8vfCP7J/wc8DeHYvDmoRX+u+XC2bm/ui05EqAbQyquAvYYr+kSz/5BGp/9crv/ANEmvxN1T7//AGwT/wBBr8z8X6zweBjPC2i5qblZLVqMWr/P7+p+beM1KOEr0vq3u3u3bq9NTxPwTF8IPAXhyLSvBXgqzsLd2LuBNLIWbAGS0m707Yrq/wDhNPCX/Qs2v/fR/wDia8ytf+QZB/wL+lOr77wozvF1+H8NWrTvJp3/APAmfmuT4upPDRlJ6n//2Q=="}}], "loss_weight": 1.0}]} {"messages":[{"role":"user","content":[{"type":"text","text":"生成一只可爱的小狗照片"}]},{"role":"assistant","content":[{"type":"image_url","image_url":{"url":"file:./image/dog.jpeg"}}], "loss_weight": 1.0}]} {"messages":[{"role":"user","content":[{"type":"text","text":"把图2中的猫换成图1中的狗"},{"type":"image_url","image_url":{"url":"tos://bucketname/image/dog.jpeg"}},{"type":"image_url","image_url":{"url":"tos://bucketname/image/cat.jpeg"}}]},{"role":"assistant","content":[{"type":"image_url","image_url":{"url":"tos://bucketname/image/dog_in_forest.jpeg"}}], "loss_weight": 1.0}]} ``` ### **格式说明** 为便于展示各个字段关系,分别从JSONL 格式文件中取出一条t2i类别的数据和一条edit类别的数据,具体如下: ```JSON { // t2i 模式 "messages": [ { "role": "user", "content": [ // user角色支持数组格式,混排图文 { "type": "text", // 内容类型:文本 "text": "生成一只可爱的小狗照片" } ] }, { "role": "assistant", "content": [ // assistant角色支持数组格式,只包含一张输出图片 { "type": "image_url", // 内容类型:图片 "image_url": { "url": "tos://bucketname/image/dog.png" // 图片地址(TOS/base64/相对路径) } }], "loss_weight": 1.0 // 训练权重,默认1.0 } ], "extra": { "sample_id": "sample-001", "metadata": { "source": "user" } } } { // edit 模式 "messages": [ { "role": "user", "content": [ // user角色支持数组格式,混排图文 { "type": "text", // user 的 content 中必须且只能包含一个文本指令,位置不限 "text": "把图2中的猫换成图 1 中的狗" }, { "type": "image_url", // 内容类型:参考图片 "image_url": { "url": "tos://bucketname/image/dog.png" // 图片地址(TOS/base64/相对路径) }, }, { "type": "image_url", // 内容类型:参考图片 "image_url": { "url": "tos://bucketname/image/cat.png" // 图片地址(TOS/base64/相对路径) } } ] }, { "role": "assistant", "content": [ { "type": "image_url", // 内容类型:图片 "image_url": { "url": "tos://bucketname/image/dog_in_forest.png" // 图片地址(TOS/base64/相对路径) } }], "loss_weight": 1.0 // 训练权重,默认1.0 } ] } ``` **字段说明** 每行一条 JSON 格式数据,核心字段如下: |字段名 |||类型 |是否必填 |说明 | |---|---|---|---|---|---| |messages | | |list |是 |对话列表,必须恰好包含 2 条消息,不支持多轮对话或 `system` 消息。 | | |role | |str |是 |第一条消息必须为 `user`,第二条消息必须为 `assistant`。 | \ | | | | | | | \ | | | | | |* user:支持图文混排 | \ | | | | | |* assistant:仅支持图片内容 | | |content | |list |是 |对话内容: | \ | | | | | | | \ | | | | | |* 当 role 为 `user`:必须且只能包含 1 个文本指令,可以包含 0 个或多个参考图片 | \ | | | | | |* 当 role 为 `assistant`:必须且只能包含 1 张图片,不能包含文本内容 | | | |type |str |是 |子内容类型,可选text(文本)或image_url(图片) | | | |text |str |条件必选 |文本内容,不能为空字符串 | \ | | | | |type为text时 | | | | |image_url |dict |条件必选 |图片信息,包含url字段(图片地址)。 | \ | | | | |text为image_url时 |参考:[使用限制](/docs/seedream-4-0-5-0#31037d05) | | |loss_weight | |float |否 |仅 `assistant` 角色支持配置该字段,默认 1.0,取值范围 [0.0,1.0]。`user` 角色不支持该字段。 | |`extra` | | |dict |否 |样本顶层的用户自定义扩展字段。`extra`中的 `key` 必须为 `string` 类型,`value` 类型不限制。 | 图片生成模型的图片传入限制,请参见[使用限制](/docs/seedream-4-0-5-0#31037d05)。 --- # 视频生成模型精调数据格式 Source: https://ark.volcengine.com/region:cn-beijing/docs/video-fine-tuning-data-format 本文介绍视频生成模型进行 SFT 精调时的数据集格式,涵盖 Seedance 1.0 的格式说明、样例及参数范围。 > **注意** > > 精调 JSONL 文件绝对路径不可包含以下特殊字符:`*`、`?`、`[`、`]`。 视频生成模型输入素材的图片、视频、音频要求,请参见[全模态输入](/docs/video-generation-tutorial#63a97f09)。 ## 支持模型 | 模型系列 | 精调方法 | 支持的数据场景 | | --- | --- | --- | | Doubao Seedance 1.0 | SFT | 文生视频、图生视频 | ## SFT 精调 ### Seedance 1.0 #### **格式示例** Seedance 1.0 与 Seedance 2.0 均采用 `messages` 格式,不支持旧版 `output.content.video_url` 顶层结构。每条样本必须包含 1 个 `user` 消息和 1 个 `assistant` 消息,并确保单个样本独占一行。 ```JSON {"messages":[{"role":"user","content":[{"type":"text","text":"生成一段小狗在草地上奔跑的视频"}]},{"role":"assistant","content":[{"type":"video_url","video_url":{"url":"tos://bucketname/video/dog_run.mp4"}}],"loss_weight":1.0}]} ``` #### **格式说明** 为便于展示各个字段关系,将 JSONL 格式文件的一条数据展开,如下: ```JSON { "messages": [ { "role": "user", "content": [ { "type": "text", "text": "生成一段小狗在草地上奔跑的视频" } ] }, { "role": "assistant", "content": [ { "type": "video_url", "video_url": { "url": "tos://bucketname/video/dog_run.mp4" } } ], "loss_weight": 1.0 } ] } ``` **字段说明** 每行一条JSON格式的样本数据: |字段名 |||类型 |是否必填 |说明 | |---|---|---|---|---|---| |`messages` | | |list |是 |对话列表,必须包含 1 个 `user` 和 1 个 `assistant`。 | | |`role` | |str |是 |角色类型:`user` / `assistant`。 | | |`content` | |list |是 |内容列表。`user` 传入模型输入,`assistant` 传入输出视频。 | | | |`type` |str |是 |内容类型。输入根据模型能力使用 `text` 或 `image_url`;输出必须为 `video_url`。 | | | |`text` |str |条件必填 |文本提示词。 | | | |`image_url` |dict |条件必填 |图片输入,包含 `url` 字段。 | | | |`video_url` |dict |条件必填 |视频输出,包含 `url` 字段。使用 TOS 地址时,视频需与 JSONL 文件处于同一个桶内。 | | |`loss_weight` | |float |否 |仅 `assistant` 角色支持配置,默认 1.0,取值范围 [0.0,1.0]。 | --- # 管理自定义模型 Source: https://ark.volcengine.com/region:cn-beijing/docs/manage-custom-models [模型仓库](https://ark.volcengine.com/region:cn-beijing/customModel) 用于集中管理您的自定义模型。您可以将精调后的模型导出至此进行统一管理,包括查看信息、体验、评测、推理和增量训练。此外,您也可以手动上传自己的模型,以满足不同的推理需求。 ## 查看自定义模型信息 访问 [模型仓库](https://ark.volcengine.com/region:cn-beijing/customModel) 页面,点击自定义模型列表中的模型名称,即可查看模型概览信息、接入点信息。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/16a921e22f0e430b856fc9c4d222e1da~tplv-goo7wpa0wc-image.image) ## 模型量化压缩 量化压缩是部分模型进行独立部署、推理调用的前置步骤,未压缩模型可能无法启用部分付费模式或部署能力。 > 量化压缩是将模型从较高精度(如 **BF16**)压缩为较低比特精度(如 **INT8 / FP8**)的一种推理优化技术。通过量化,可显著降低显存占用、提高吞吐,并获得更高的推理性能与性价比。 ### 操作入口 * 在模型详情页点击 **创建可部署版本** 按钮,可对自定义模型执行量化压缩操作。 * 用户上传模型,在上传流程中已支持量化配置(参见 [上传模型](/docs/manage-custom-models#00e0cbe3))。 * 不同量化方案会影响模型推理性能与效果,常见的量化方式包括W4A8_FP8、W8A8等。模型实际支持的量化方式可能有所不同,具体以控制台显示为准。 > **注意** > > 量化压缩可能导致模型效果存在轻微差异,压缩完成后请及时开展模型评测。 ## 上传模型 您可手动上传自定义模型至模型仓库,用于后续推理调用。 ### 前提条件 * 待上传模型须符合 **Hugging Face** 格式规范。 > 您可以提前将数据上传到 [对象存储 TOS](https://console.volcengine.com/tos) 中,以便后续上传自定义模型时能更便捷地使用这些数据。 ### 操作步骤 1. **发起模型上传**:访问方舟 [模型仓库](https://ark.volcengine.com/region:cn-beijing/customModel) 页面,点击左侧的 **+ 模型上传** 按钮。 2. **配置基础信息**:输入模型名称,选择对应的基础开源模型。 3. **上传模型文件至 TOS** (或 **选择 TOS 中的模型文件**):登录对象存储 TOS 控制台,上传以下文件(参考 [TOS 用户文档](https://docs.volcengine.com/docs/6349/75039?lang=zh)): * 配置文件:1 个 `config.json` 文件,描述模型基础配置。 * 模型权重文件:至少 1 个,格式需为 `*.safetensors` / `*.bin` / `*.ckpt`。 * Tokenizer 文件:至少 1 个,包括 `tokenizer.json`、`tokenizer_config.json`、`tokenizer.model` 等,用于文本编解码。 * 权重索引文件(可选,推荐):`*.index.json` 文件,优化权重加载效率。 4. **选择量化方式**:不同量化方案会影响模型推理性能与效果,选型参考[模型量化压缩](/docs/manage-custom-models#60b6d86d)。 5. **完成上传确认**:输入模型描述,勾选相关服务条款后,点击 **确认** 按钮。 > **注意** > > * 上传前系统会自动校验模型格式,您可在模型仓库中查看实时上传状态; > * 模型文件较大时,上传耗时较长,请耐心等待。 ## 体验模型 体验自定义模型支持以下两种方式: * 访问 [模型仓库](https://ark.volcengine.com/region:cn-beijing/customModel) 页面,点击自定义模型页签右侧的 **体验** 按钮。 * 也可通过 [体验中心](https://ark.volcengine.com/region:cn-beijing/experience) 体验自定义模型,点击 **创建新对话** 。注意模型选择时勾选 **模型仓库** ,并选择已经导出的自定义模型。 ## 在线推理 1. 创建推理接入点。 * 访问 [模型仓库](https://ark.volcengine.com/region:cn-beijing/customModel) 页面,点击自定义模型页签右侧的 **在线推理**。 * 访问 [在线推理](https://ark.volcengine.com/region:cn-beijing/endpoint) 页面创建推理接入点。模型选择时勾选 **模型仓库** ,并选择已经导出的自定义模型。 2. 创建完成后,可通过 **推理接入点 ID** 调用模型,支持 **按token付费** 及 **模型单元** 等服务模式(模型单元详情可参考[模型单元概述](/docs/model-unit-overview))。创建推理接入点详细见[在线推理(常规)](/docs/online-inference-standard)。 ## 批量推理 > **注意** > > 精调后模型支持情况请以 [批量推理](https://ark.volcengine.com/region:cn-beijing/batchInference/create) 可选模型为准 1. 创建批量推理任务。 访问 [批量推理](https://ark.volcengine.com/region:cn-beijing/batchInference/create) 控制台创建批量推理任务,注意模型选择时勾选“模型仓库”。 > **说明** > > 部分模型需要压缩后才可使用“按模型单元付费”,如果您的模型未压缩控制台会有模型压缩提示,请参考提示压缩后再创建批量推理任务。 2. 创建完成后,可以在详情页面参考“**具体接入流程**”获取相关的调用示例。 ## 评测自定义模型 您可在模型仓库中选中目标模型,发起评测任务,详细操作请参见[创建模型评测任务](/docs/manual-evaluation-create-model-evaluation-tasks)。 --- # 创建模型评测任务 Source: https://ark.volcengine.com/region:cn-beijing/docs/create-model-evaluation-tasks 模型评测是人工智能开发流程中的关键环节,对于保障模型性能、稳定性和应用效果具有重要意义。通过科学、系统的评测,能够全面了解模型在不同场景下的表现,验证其是否满足业务需求,同时为模型优化、选型和迭代提供可靠依据。火山方舟平台提供一套完整灵活的模型评测能力,帮助用户高效评估模型质量,提升模型落地效率与应用价值。 ## 发起评测 用户可从模型评测、模型广场、模型仓库/模型精调模块发起评测。 1. [模型评测](https://ark.volcengine.com/region:cn-beijing/eval) 页面。点击“创建评测任务”按钮。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/f8a506f53cc94f21a9648e440919bbb8~tplv-goo7wpa0wc-image.image) 2. 模型广场-模型详情页。点击“创建评测任务”按钮。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/8bac479b9c4d41e7a74d518fa6a20365~tplv-goo7wpa0wc-image.image) 3. 模型仓库-列表页/详情页。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/4b77b36a38b04c0b8e08ec0768208eaa~tplv-goo7wpa0wc-image.image) 4. 模型精调-列表页/详情页。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/0b00316f93b94edca9616bd3e1575257~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/43dc889ea4f945b1990d7b9a0e29c31e~tplv-goo7wpa0wc-image.image) ## 评测对象 您可以从「火山方舟」的「模型广场」「模型仓库」中选择评测对象,也能选用「机器学习平台」提供的在线服务接入点。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/7a8cec5d401c4683962022cc06c45d7b~tplv-goo7wpa0wc-image.image)
    ### 火山方舟模型 对「火山方舟」的模型进行评测时,**推理方式** 可选择「批量推理」或「在线推理」。 #### 批量推理 * 利用非高峰期计算资源提供更高性价比服务,适用于可接受离线延迟推理的大规模数据场景。 * 使用「批量推理」方式,提交「评测任务」后将在方舟「批量推理」模块同步创建「批量推理任务」,用户可从评测任务详情页点击推理任务ID跳转查看。 * 部分模型不支持「批量推理」方式;部分模型会弹出「模型压缩」提示,压缩成功,可用于批量推理,性能更好、承载力更高。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/7c3b9f76808b45b094abed064df15341~tplv-goo7wpa0wc-image.image)
    #### 在线推理 * 通过推理接入点灵活调整资源并访问模型,适用于需要实时处理、快速响应的小规模数据场景。 * 选择「在线推理」后,平台将筛选对应模型版本的自定义推理接入点;若不存在,用户可跳转至「在线推理」模块创建。提交「评测任务」后,可在「推理接入点」查看任务运行状况。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/ef2055a26d3044fc86751f7c694f0d10~tplv-goo7wpa0wc-image.image)
    ### 机器学习平台 若接入来源为「机器学习平台」,平台默认采用 **在线推理** 方式,筛选火山方舟平台上注册来源为机器学习平台的推理接入点。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/2a33891f1a5c43059f5a21962bffb072~tplv-goo7wpa0wc-image.image)
    ## 评测数据集 平台支持预置数据集与用户数据集(使用批量推理方式时,当前仅支持用户数据集)。 用户数据集可选择本地上传或TOS上传,会产生计费,具体可查看 [计费方式](https://docs.volcengine.com/docs/6349/78455?lang=zh)。 文件格式参考 [用户数据集](/docs/evaluation-dataset-format#aa78daa2)。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/cb7643dbc0594f5faee4584d05d91fae~tplv-goo7wpa0wc-image.image)
    ## 评测配置 在使用用户上传的数据集时,平台支持对「单轮任务」或「多轮任务」进行评测,提供「前缀匹配」「包含关键词匹配」「裁判员模型打分」三种方式。 若使用平台预置数据集,无需额外设置,将采用平台默认评测方式。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/27fdaa4e9bef41c6b275c7171121ae0c~tplv-goo7wpa0wc-image.image)
    ## 计费说明 评测流程不计费,以推理流程实际计费为准。平台将预估待评测数据集的 tokens数量,并结合历史数据估算输入输出的总 tokens数量,为用户提供参考。具体费用以账单为准。 火山方舟平台中,不同推理方式采用不同的计费方式。「在线推理」支持按 tokens 使用量后付费、TPM 保障包、模型单元等多种计费方式(参见 [在线推理计费](/docs/model-service-pricing#da01297e)),用户可查看推理接入点已开通的计费服务。「批量推理」的计费方式(参见 [批量推理计费](/docs/model-service-pricing#629aa744))为按tokens使用量后付费。使用从机器学习平台注册的接入点进行评测时,火山方舟将不会产生额外费用。 评测任务提交后,可在任务详情页点击推理 ID,前往查看推理运行详情。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/3add5fcb69544057a554ab2c30df4e95~tplv-goo7wpa0wc-image.image)
    --- # 查看并管理模型评测任务 Source: https://ark.volcengine.com/region:cn-beijing/docs/view-and-manage-model-evaluation-tasks ## 任务列表 评测任务创建完成后,可在任务列表页查看。列表页展示任务名称/ID、状态、模型服务、推理方式等信息,并支持对评测任务进行停止、删除和检索等操作。 点击任务名称,即可进入任务详情页。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/1965bd53e33447ea8047cc386f42919d~tplv-goo7wpa0wc-image.image)
    ## 任务详情页 ### 任务详情 任务详情中展示评测对象、评测配置及评测集等信息。用户点击ID,可跳转至对应「推理接入点」或「批量推理任务」的详情页查看。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/d28bd587c3d04ea3b84128570b3f2868~tplv-goo7wpa0wc-image.image)
    ### 评测报告 支持用户查看、下载评测得分与部分样本数据。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/e3434d38d08641198de123a5b20e9698~tplv-goo7wpa0wc-image.image)
    ### 日志 支持展示当前评测进度
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/095d3be11cca4341aab7ba9ace9d74f0~tplv-goo7wpa0wc-image.image)
    ## 任务对比 在评测任务列表页,支持对使用预置数据集的多个评测任务进行结果对比。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/cae5dd04064d47cabea065fe714f8281~tplv-goo7wpa0wc-image.image)
    --- # 评测数据集格式说明 Source: https://ark.volcengine.com/region:cn-beijing/docs/evaluation-dataset-format ## 预置数据集 ### 评测集 平台提供丰富的预置数据集,覆盖多个维度与领域,帮助用户高效全面评估模型性能。 | | | | |能力维度 ||评测数据 | |---|---|---| | | | | |综合能力 ||* MMLU: MMLU 是业界评测大模型最常用的综合数据集,由各种学科的多项选择题组成。其涵盖了人文学科、社会科学、自然科学和其他重要的学科领域。其中包括57个任务,包括初等数学、历史、计算机科学、法律等等。为了在这个测试中达到高准确度,模型必须具有广泛的世界知识和问题解决能力。 | |基础能力 |推理数学 |* BBH(Big-bench Hard): BBH从BIG-Bench数据集中选择了23个最难的任务,要求模型根据给定的问题,生成正确的回答。该数据集涉及不同的领域,主要涵盖数学,常识推理,软件开发等。 | \ | | |* GSM8K: GSM8K是由OpenAI发布的,包含1千多道需要2到8个步骤解决,主要涉及基本算术运算的小学数学题数据集。 | \ | | |* WinoGrande: WinoGrande是一个用于常识推理的大规模数据集,包含1千多个问题,每个问题都是由一个句子和一个代词组成,要求根据上下文判断代词指代的是哪个名词。 | \ | | |* LSAT分析推理: LSAT(Law School Admission Test),法学院入学考试,由阅读理解、逻辑推理、分析推理三个部分组成。该数据集是其中的分析推理部分,由230道需要模型根据给定条件和限制关系进行推理的选择题组成,主要测试模型理解复杂关系结构并推出结论的能力。 | \ | | |* LSAT逻辑推理: LSAT(Law School Admission Test),法学院入学考试,由阅读理解、逻辑推理、分析推理三个部分组成。该数据集是其中的逻辑推理部分,由510道包含短文或对话的选择题组成,主要测试模型从已知事实或前提推理得出合理结论的能力。 | | | | | |^^| | | \ | |语言创作 |* 高考语文: 高考是中国最具权威性和全面性的标准化考试之一,该数据集包含246道从2010年到2022年的高考语文试题。 | \ | | |* 高考英语: 高考是中国最具权威性和全面性的标准化考试之一,该数据集包含306道从2010年到2022年的高考英语试题。 | \ | | |* LSAT阅读理解: LSAT(Law School Admission Test),法学院入学考试,由阅读理解、逻辑推理、分析推理三个部分组成。该数据集是其中的阅读理解部分,由269道包含文章和问题的选择题组成,主要测试模型准确阅读并理解复杂文章,组织有关信息并得出合理结论的能力。 | \ | | |* Hellaswag: HellaSwag 是一个用于评估常识自然语言理解的挑战性数据集,它对于目前的最先进的模型来说非常困难,但是对于人类来说却很容易(>95%的准确率)。它包含了10042个多选问题,每个问题都有一个场景和四个可能的结局,要求模型选择最合理的结局。 | \ | | |* BoolQ: BoolQ 是一个阅读理解数据集,包含3千多个问题和相关的维基百科段落,模型需要依据维基百科段落中的信息针对问题回答是/否。 | | | | | |^^| | | \ | |知识能力 |* Natural Questions: Natural Questions是一个问答数据集,包含3600多个问题,每个问题都是从google查询而来。 | \ | | |* TriviaQA: TriviaQA 是一个现实的基于文本的问答数据集,内容主要来自维基百科。 | \ | | |* 高考文理综: 高考是中国最具权威性和全面性的标准化考试之一,该数据集包含1千多道从2010年到2022年的高考文综和理综试题。 | | | | | ### 评测方式 评测得分包括综合评分与能力维度评分。其中,综合评分是模型在所有能力维度评分的平均值,能力维度评分则是各能力维度下所有数据集评测得分的平均值。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/5af21f77ddc74299bdb7d054cf8c78de~tplv-goo7wpa0wc-image.image)
    平台预设了不同数据集的评测方式,无需用户操作。各数据集根据自身特性,采用不同的评测方式,主要依据评测集中提供的参考答案的类型选择相应的评测指标。例如: |评估指标 |适用评测题目类型 |预置数据集举例 | |---|---|---| |正确率(Accuracy) |常用于判断题(是/否)以及选择题(ABCD),这类问题的数据集占比最大,有MMLU, 高考数据集等。 |MMLU, 高考, LSAT, Hellaswag, BoolQ, AQUA-RAT, WinoGrande, BBH | |匹配率(Exact Match) |常用于问答题以及阅读理解任务,判断模型输出的文本与标准答案是否一致。这类数据集主要包括Natural Questions, TriviaQA等。 |GSM8K, Natural Questions, TriviaQA | ## 用户数据集 用户数据集格式支持 .jsonl, .xlsx, .xls。每次评测最多上传10个文件,每个文件最多1000行。 ### 通用参数说明 |字段 |类型 |备注 | |---|---|---| |session_id |int |对话标识符 | |endpoint_id |str |推理接入点ID | |system_prompt/system |str |系统提示 | |query/prompt |str |用户提示 | |reference_response/answer |str |参考回复 | |response |str |模型回答 | |analysis |str |ai裁判员回答 | |score |float |分数 | |parameters |dict |推理参数,包括logprobs、top_logprobs、frequency_penalty、temperature、top_p、max_tokens、stop等。具体参考 [请求参数](/docs/chat-api#request-parameters)。 | |usage |dict |tokens使用信息,包括prompt_tokens、completion_tokens、total_tokens等,具体参考 [请求参数Usage](/docs/chat-api#usage)。 | |error |str |推理无法完成时,将展示error信息 | ### Excel格式的参数 #### 单轮对话的输入参数 每一行代表一次单轮对话,session_id列可选择不填, 但不能重复。 若需要平台进行推理和评测,则reference_response必填。 |字段 |类型 |是否必填 |备注 | |---|---|---|---| |session_id |int |否。可不填,但不能填写重复值 |对话标识符 | |system_prompt |str |否 |系统提示 | |query |str |是 |用户提示 | |reference_response |str |否。若评测方式选择推理+自动评测,则必填 |参考回复 | |parameters |dict |否。支持对每次对话设置不同推理参数。若用户在评测集与方舟控制台中都设置了推理参数,以评测集为准。 |推理参数,包括logprobs、top_logprobs、frequency_penalty、temperature、top_p、max_tokens、stop等。具体参考 [请求参数](/docs/chat-api#request-parameters)。 | 选择「推理+自动评测」的示例: |session_id |system_prompt |query |reference_response |parameters |response | |---|---|---|---|---|---| |0 |你是一名精通各大中餐菜系的中餐传奇大厨 |家里有鸡蛋、西红柿 |那可以做一道经典的西红柿炒鸡蛋呀。以下是做法: |{'logprobs': False, 'top_logprobs': 10, 'frequency_penalty': 0.0, 'temperature': 1.0, 'top_p': 0.7, 'max_tokens': 4096, 'stop': []} |(留空,待被测模型推理) | \ | | | |所需材料:鸡蛋2 - 3个、西红柿2个、葱花适量、盐适量、白糖适量、食用油适量。 | | | \ | | | |步骤:把鸡蛋打入碗中,加入少量盐,用筷子搅拌均匀。西红柿洗净后在顶部划十字花刀,放入开水中烫一会儿,去皮后切成小块。锅中倒入适量食用油,油热后倒入蛋液,待蛋液凝固,用铲子快速翻炒成小块盛出。锅中再倒少许油,放入葱花爆香,然后加入西红柿块翻炒,炒出汁后加入适量盐和一小勺白糖提味。最后倒入炒好的鸡蛋,翻炒均匀,让鸡蛋裹满西红柿汁就可以出锅装盘了。 | | | \ | | | |这道菜色泽鲜艳,味道酸甜可口,非常下饭。 | | | |1 |你是一个精通中国历史和文化的段子手,擅长通过幽默的表达方式让人发笑。 |程序员写了个bug,把公司数据库给误删除了 |哎呀,这程序员可真是“威力巨大”啊!就像一个不小心的武林高手,一招“数据库消失术”就把公司的数据库给灭了。这大概就像是厨师做菜,本来想加点盐,结果把整锅菜都给倒掉了一样。估计公司老板当时脸都绿了,那表情可能就像吃了苦瓜还被人踩了一脚。这程序员啊,估计现在在公司里走路都得低着头,心里想着:“我这不是写代码,我这是给公司制造‘灾难大片’呢。” |{'logprobs': False, 'top_logprobs': 10, 'frequency_penalty': 0.0, 'temperature': 1.0, 'top_p': 0.7, 'max_tokens': 4096, 'stop': []} |(留空,待被测模型推理) | #### 多轮对话的输入参数 同一session_id代表一次多轮对话,对话顺序与表格从上至下顺序一致 | | | | | |字段 |类型 |是否必填 |备注 | |---|---|---|---| | | | | | |session_id |int |是。同一session_id代表一次多轮对话。 |对话标识符 | |system_prompt |str |否。但是相同session_id的system_prompt必须相同 |系统提示 | |query |str |是 |用户提示 | |response |str |若评测方式为推理+自动评测,则一次多轮对话(同一session_id)中,最后一行样本只填reference_response,response不填,其余样本reference_response不填,response选填(填写则代表这次多轮对话有上文)。 |模型回复 | \ | | |若评测方式选择仅推理,则一次多轮对话中,最后一行样本response和reference_response不填,其余样本reference_response不填,response选填(填写则代表这次多轮对话有上文)。 | | | | |^^| | \ |reference_response |str | |参考回复 | |parameters |dict |否。支持对每次对话设置不同推理参数。若用户在评测集与方舟控制台中都设置了推理参数,以评测集为准。 |推理参数,包括logprobs、top_logprobs、frequency_penalty、temperature、top_p、max_tokens、stop等。具体参考 [请求参数](/docs/chat-api#request-parameters)。 | 选择「推理+自动评测」的示例: |session_id |system_prompt |query |reference_response |parameters |response | |---|---|---|---|---|---| |0 |你是一名精通各大中餐菜系的中餐传奇大厨 |家里有鸡蛋、西红柿 | | |那可以做一道经典的西红柿炒鸡蛋呀。以下是做法: | \ | | | | | |所需材料:鸡蛋2 - 3个、西红柿2个、葱花适量、盐适量、白糖适量、食用油适量。 | \ | | | | | |步骤:把鸡蛋打入碗中,加入少量盐,用筷子搅拌均匀。西红柿洗净后在顶部划十字花刀,放入开水中烫一会儿,去皮后切成小块。锅中倒入适量食用油,油热后倒入蛋液,待蛋液凝固,用铲子快速翻炒成小块盛出。锅中再倒少许油,放入葱花爆香,然后加入西红柿块翻炒,炒出汁后加入适量盐和一小勺白糖提味。最后倒入炒好的鸡蛋,翻炒均匀,让鸡蛋裹满西红柿汁就可以出锅装盘了。 | \ | | | | | |这道菜色泽鲜艳,味道酸甜可口,非常下饭。 | |0 |你是一名精通各大中餐菜系的中餐传奇大厨 |家里还有排骨 | | |那还可以做一道西红柿炖排骨。 | \ | | | | | |食材准备 | \ | | | | | |排骨500克、西红柿3 - 4个、姜1块、葱1根、八角2个、桂皮1小块、香叶2片、料酒适量、生抽适量、盐适量、冰糖适量。 | \ | | | | | |制作步骤排骨洗净后剁成小段,冷水下锅,加入姜片、料酒,焯水去腥,水开后煮5分钟左右,捞出排骨用温水冲洗干净。西红柿顶部划十字,放入开水中烫一下去皮,切成小块。姜切片,葱切段。锅中倒油,油热后放入冰糖,小火炒出糖色,当冰糖变成焦糖色并冒小泡泡时,放入排骨翻炒上色。加入姜片、葱段、八角、桂皮、香叶继续翻炒出香味,再加入生抽翻炒均匀。倒入西红柿块,翻炒均匀后让西红柿出汁,加入适量清水,没过排骨。大火烧开后转小火慢炖约1 - 1.5小时,直到排骨软烂。根据口味加入适量盐调味,然后再大火收汁,使汤汁浓稠即可。这道菜既有排骨的肉香,又有西红柿的酸甜,营养丰富,味道独特。 | |0 |你是一名精通各大中餐菜系的中餐传奇大厨 |还有一条鱼 |那还可以做一道红烧鱼。准备食材和调料:鲜鱼(如鲤鱼、草鱼等)1 条、葱 2 根、姜 1 块、蒜 3 瓣、干辣椒 3 个、料酒 1 勺、生抽 2 勺、老抽 1 勺、白糖 1 勺、盐适量、鸡精适量、食用油适量。 |{'logprobs': False, 'top_logprobs': 10, 'frequency_penalty': 0.0, 'temperature': 1.0, 'top_p': 0.7, 'max_tokens': 4096, 'stop': []} |(留空,待被测模型推理) | \ | | | |处理鱼:将鱼处理干净,在鱼身上划几刀,方便入味。用厨房纸巾擦干鱼身水分,防止煎鱼时溅油。 | | | \ | | | |煎鱼:锅中倒入适量食用油,油热后放入鱼。用中小火煎鱼,避免火大导致鱼皮破裂。煎至两面金黄,盛出备用。 | | | \ | | | |炒香调料:锅中留少许底油,放入葱段、姜片、蒜粒、干辣椒炒香。 | | | \ | | | |调味:加入料酒、生抽、老抽、白糖,翻炒均匀,让调料混合出香味。 | | | \ | | | |加水煮鱼:锅中加入适量清水,没过鱼身。大火烧开后转小火,盖上锅盖煮 15-20 分钟,期间可将鱼翻面,使鱼充分吸收汤汁的味道。 | | | \ | | | |收汁调味:待鱼熟透,汤汁变浓稠时,根据个人口味加入适量盐和鸡精调味,然后大火收汁即可。 | | | |1 |你是一个精通中国历史和文化的段子手,擅长通过幽默的表达方式让人发笑。 |程序员写了个bug,把公司数据库给误删除了 | | |哎呀,这程序员可真是“威力巨大”啊!就像一个不小心的武林高手,一招“数据库消失术”就把公司的数据库给灭了。这大概就像是厨师做菜,本来想加点盐,结果把整锅菜都给倒掉了一样。估计公司老板当时脸都绿了,那表情可能就像吃了苦瓜还被人踩了一脚。这程序员啊,估计现在在公司里走路都得低着头,心里想着:“我这不是写代码,我这是给公司制造‘灾难大片’呢。” | |1 |你是一个精通中国历史和文化的段子手,擅长通过幽默的表达方式让人发笑。 |996福报 |老板在大会上激情演讲:“996 是福报啊,你们想想,别的公司下班早,员工回家就知道打游戏、刷剧、躺平浪费时间。咱们公司实行 996,大家在公司能不断成长,多学习知识,多积累经验,这多好!” |{'logprobs': False, 'top_logprobs': 10, 'frequency_penalty': 0.0, 'temperature': 1.0, 'top_p': 0.7, 'max_tokens': 4096, 'stop': []} |(留空,待被测模型推理) | \ | | | |员工小李小声嘀咕:“可不嘛,我现在回家倒头就睡,连打游戏、刷剧浪费时间的机会都没有,真是‘福报’,福都给我享尽了。” | | | ### Jsonl格式的参数 #### 单轮对话的输入参数 每一行代表一次单轮对话 |字段 |类型 |是否必填 |备注 | |---|---|---|---| |system |str |否 |系统提示 | |prompt |str |是 |用户提示 | |answer |str |否。若评测方式选择推理+自动评测,则必填 |参考回复 | |parameters |dict |否。支持对每次对话设置不同推理参数。若用户在评测集与方舟控制台中都设置了推理参数,以评测集为准。 |推理参数,包括logprobs、top_logprobs、frequency_penalty、temperature、top_p、max_tokens、stop等。具体参考 [请求参数](/docs/chat-api#request-parameters) | 选择「推理+自动评测」的示例: 输入数据集: ```JSONL {"system":"请完成下面的计算题","prompt":"0+1","answer":"1","parameters": {"logprobs": false, "top_logprobs": 10, "frequency_penalty": 0.0, "temperature": 1.0, "top_p": 0.7, "max_tokens": 4096, "stop": []}} {"system":"请完成下面的计算题","prompt":"0+2","answer":"2","parameters": {"logprobs": false, "top_logprobs": 10, "frequency_penalty": 0.0, "temperature": 1.0, "top_p": 0.7, "max_tokens": 4096, "stop": []}} ``` 输出数据集(参数解释详见下面 Jsonl 多轮对话的参数说明): ```JSONL {"session_id": 0, "messages": [{"role": "system", "content": "请完成下面的计算题"}, {"role": "user", "content": "0+1"}, {"role": "assistant", "reference_response": "1", "responses": [{"parameters": {"logprobs": false, "top_logprobs": 10, "frequency_penalty": 0.0, "temperature": 1.0, "top_p": 0.7, "max_tokens": 4096, "stop": []}, "usage": {"prompt_tokens": 13, "completion_tokens": 577, "total_tokens": 590}, "content": "\n\n0 + 1 的计算过程如下:\n\n1. **理解数字含义**: \n - 0 表示“没有数量”。\n - 1 表示“一个单位”。\n\n2. **加法定义**: \n 加法是将两个数合并,得到它们的总和。任何数加 0 都等于它本身(加法单位元性质)。\n\n3. **应用交换律**: \n 根据交换律,\\(0 + 1 = 1 + 0\\),而 \\(1 + 0 = 1\\),因此 \\(0 + 1 = 1\\)。\n\n4. **实际举例验证**: \n - 如果有 0 个苹果,再获得 1 个苹果,最终有 1 个苹果。\n - 数轴上从 0 向右移动 1 个单位,到达 1。\n\n**答案**:\\(0 + 1 = 1\\)", "score": 2.0, "analysis": "模型回复详细解释了0 + 1的计算过程,包括加法定义、交换律应用及实际举例验证,所有步骤均正确,最终答案与参考回复一致。虽然过程较为繁琐,但无任何错误,符合评估要求中的『完全正确』标准。"}]}]} {"session_id": 1, "messages": [{"role": "system", "content": "请完成下面的计算题"}, {"role": "user", "content": "0+2"}, {"role": "assistant", "reference_response": "2", "responses": [{"parameters": {"logprobs": false, "top_logprobs": 10, "frequency_penalty": 0.0, "temperature": 1.0, "top_p": 0.7, "max_tokens": 4096, "stop": []}, "usage": {"prompt_tokens": 13, "completion_tokens": 943, "total_tokens": 956}, "content": "\n\n0 + 2 的计算过程如下:\n\n1. **加法定义**:任何数与0相加,结果均为该数本身。即 \\( a + 0 = a \\)。 \n2. **应用交换律**:根据加法交换律,\\( 0 + 2 = 2 + 0 \\)。 \n3. **简化计算**:\\( 2 + 0 = 2 \\)。 \n\n**答案**:\\( 0 + 2 = 2 \\) \n\n通过数轴、集合论、公理体系或实际例子(如温度变化、物品数量)验证,结果一致。因此,0加2的最终结果为2。", "score": 2.0, "analysis": "模型回复详细解释了0+2的计算过程,尽管部分内容(如交换律应用、验证方法)对于简单加法问题可能显得冗余,但最终答案正确且与参考回复一致。回复中没有出现任何错误,符合评估要求中的完全正确标准。"}]}]} ``` #### 多轮对话的输入参数 每一行代表一次多轮对话 |字段 |类型 |是否必填 |备注 | |---|---|---|---| |session_id |str |否 |多轮对话标识符 | |messages |list |是 |代表一个多轮对话(系统、用户、模型助手),其中每一个字典元素的参数包括role(角色:system、user、assistant)和content(角色的输入)。messages必须以role为user的字典元素结尾。 | \ | | | |评测时,平台会在messages最后一个{role:"user","content":"xxx"}后插入{role:"assistant","content":"xxx"}作为模型的输出。 | |answer |str |否。若评测方式选择推理+自动评测,则必填 |针对messages中最后一个用户user提问的模型参考回复 | |parameters |dict |否。支持对每次对话设置不同推理参数。若用户在评测集与方舟控制台中都设置了推理参数,以评测集为准。 |推理参数,包括logprobs、top_logprobs、frequency_penalty、temperature、top_p、max_tokens、stop等。具体参考 [请求参数](/docs/chat-api#request-parameters)。 | 选择「推理+自动评测」的示例: 输入数据集: ```JSONL {"messages": [{"role": "user", "content": "1+1"}], "answer": "2","parameters": {"logprobs": false, "top_logprobs": 10, "frequency_penalty": 0.0, "temperature": 1.0, "top_p": 0.7, "max_tokens": 4096, "stop": []}} {"messages": [{"role": "system", "content": "请完成下面的计算题"}, {"role": "user", "content": "2+1"}], "answer": "3","parameters": {"logprobs": false, "top_logprobs": 10, "frequency_penalty": 0.0, "temperature": 1.0, "top_p": 0.7, "max_tokens": 4096, "stop": []}} {"messages": [{"role": "system", "content": "请完成下面的计算题"}, {"role": "user", "content": "3+1"}, {"role": "assistant", "content": "999"}, {"role": "user", "content": "3+2"}], "answer": "5","parameters": {"logprobs": false, "top_logprobs": 10, "frequency_penalty": 0.0, "temperature": 1.0, "top_p": 0.7, "max_tokens": 4096, "stop": []}} ``` 输出数据集: ```JSONL {"session_id": 0, "messages": [{"role": "user", "content": "1+1"}, {"role": "assistant", "reference_response": "2", "responses": [{"parameters": {"logprobs": false, "top_logprobs": 10, "frequency_penalty": 0.0, "temperature": 1.0, "top_p": 0.7, "max_tokens": 4096, "stop": []}, "usage": {"prompt_tokens": 11, "completion_tokens": 56, "total_tokens": 67}, "content": "按照基本的数学运算规则,在十进制中,1 + 1 = 2。但在二进制里,1 + 1 = 10 。如果没有特别说明,一般默认是十进制,所以通常1+1的结果为2。 ", "score": 2.0, "analysis": "问题仅要求计算1+1的值,参考回复为2,模型回复虽详细说明了不同进制下的情况,但最终得出通常1+1结果为2,与参考回复一致,满足评估要求。"}]}]} {"session_id": 1, "messages": [{"role": "system", "content": "请完成下面的计算题"}, {"role": "user", "content": "2+1"}, {"role": "assistant", "reference_response": "3", "responses": [{"parameters": {"logprobs": false, "top_logprobs": 10, "frequency_penalty": 0.0, "temperature": 1.0, "top_p": 0.7, "max_tokens": 4096, "stop": []}, "usage": {"prompt_tokens": 20, "completion_tokens": 16, "total_tokens": 36}, "content": "根据基本的数学加法运算,2 + 1 = 3。 ", "score": 2.0, "analysis": "问题要求完成计算题2 + 1,参考回复为3,模型回复准确计算出2 + 1 = 3,与参考回复一致,完全正确,符合评估要求。"}]}]} {"session_id": 2, "messages": [{"role": "system", "content": "请完成下面的计算题"}, {"role": "user", "content": "3+1"}, {"role": "assistant", "content": "999"}, {"role": "user", "content": "3+2"}, {"role": "assistant", "reference_response": "5", "responses": [{"parameters": {"logprobs": false, "top_logprobs": 10, "frequency_penalty": 0.0, "temperature": 1.0, "top_p": 0.7, "max_tokens": 4096, "stop": []}, "usage": {"prompt_tokens": 35, "completion_tokens": 13, "total_tokens": 48}, "content": "根据加法运算,3 + 2 = 5。 ", "score": 2.0, "analysis": "问题要求完成计算题3 + 2,参考回复为5,模型回复根据加法运算得出3 + 2 = 5,与参考回复一致,完全正确,符合评估要求。"}]}]} ``` --- # 人工评测作业 Source: https://ark.volcengine.com/region:cn-beijing/docs/manual-evaluation-tasks # 1. 上线任务 任务创建者在 **我创建的** tab下,找到待上线任务,点击 **是否上线** 按钮,将任务上线。 ![Image](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_5bdf5c9a9b448101dfec86cba8ab2102.png) # 2. 标注员身份任务作业 人工评测任务页面,切换至 **我评测的** tab, 可以查看以标注员身份需要作业的评测任务。 ![Image](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_be82b8fa61bcf24405d074d78c0b5a25.png) 点击待评测的任务名称,点击右上角 **开始答题** 按钮,进入到评测页面。 ![Image](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_e34b84e67865aa5f1d85e3d08385e461.png) 针对多模型或者单模型模式的模型效果进行评测标注。专业版模式下,可以评测GSB分数,Diff 问题类型,各个模型的有用性,真实性,安全性,自身文体类型等内容,点击右上角 **提交** 按钮,提交本题并且领取下一道题。 专业版多模型评测页面 ![Image](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_3afa7749281911bde301fe431f00cc1e.png) 专业版单模型评测页面 ![Image](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_c3759d47031beca88491d72a5ddbffa9.png) # 3. 审核员身份任务作业 人工评测任务页面,切换至 **我审核的** tab, 可以查看以审核员身份需要作业的评测任务。审核标注员标注的每一道题。 ![Image](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_b731ce1fddd128b66d985f9e47b7ef05.png) 点击待评测的任务名称,点击右上角 **开始答题** 按钮,进入到评测页面。 ![Image](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_447082cb59a930ac4233372e4041cf42.png) 评测页面与标注员的评测页面相同,可以在 **审核备注** 处填写审核意见。可以直接修改标注员标注的评测结果,也可以点击右上角的 **驳回** 按钮,将此题驳回给标注员进行重新标注。可以点击右上角的 **通过** 按钮,通过此题,同时自动领取下一道题。 ![Image](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_1e0e0ce4cb39f9ff390d0562946b3d9c.png) # 4. 质检员身份任务作业 人工评测任务页面,切换至 **我质检的** tab, 可以查看以质检员身份需要作业的评测任务。 ![Image](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_ec049aa48c92cb0876c1bba68ae135be.png) 点击待评测的任务名称,点击 **质检抽检** tab。 ![Image](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_5a6d4d71a6e5cfc015513e4fb42cd8bc.png) 点击左上角 **创建抽检包** 按钮。 ![Image](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_27d4bb206ed745afba845d35e5e3e21a.png) 可以选择优先抽检的模式,并且自定义抽检题目数量,点击 **确定** 按钮创建抽检包。 ![Image](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_d369951bc7dd0fe6cb5ecb7804a8c189.png) 在质检抽检列表页面,点击抽检包的 **开始抽检** 按钮,点击某一道试题的 **抽检** 按钮进行质检作业。作业页面与评测标注页面相同,可以填写 **质检备注** 内容对质检评论进行备注 ![Image](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_6067ab34fe0af975af68657367809c0f.png) 所有试题抽检完成后,点击抽检包的终止按钮,终止质检状态。 ![Image](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_4109c00b0ccd8e7f0018293447bfae5c.png) 点击 **批量操作** 按钮,选择是否将任务推送至验收状态,或者驳回所有试题。 ![Image](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_188215f8722dd12cde0c7983a2cf644a.png) # 5. 验收员身份作业任务 人工评测任务页面,切换至 **我验收的** tab, 可以查看以验收员身份需要作业的评测任务 ![Image](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_6ab457054751864542ea283a5c41059c.png) 点击待评测的任务名称,点击 **质检抽检** tab ![Image](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_5d0a925d46b536207f3a53a8ccf2698c.png) 点击左上角 **创建抽检包** 按钮,创建一个抽检包 ![Image](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_3e9dd944679bba26426b5285d57ebe54.png) 可以选择优先抽检的模式,并且自定义抽检题目数量。 ![Image](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_2c5f954b88f65976bc9503dfecdf502b.png) 在质检抽检列表页面,点击抽检包的 **开始抽检** 按钮,进行质检作业。作业页面与评测标注页面相同。 在 **我验收的** tab, 设置任务的合格状态或者不合格状态。 ![Image](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_7fba1770913a6dae405b0c74685df606.png) --- # 查看评测报告 Source: https://ark.volcengine.com/region:cn-beijing/docs/view-evaluation-reports 以管理者视角查看评测报告、导出结果数据。 # 1. 查看任务评测报告 人工评测任务页面,切换至 **我创建的** tab, 点击任务列表页中的 **查看评测报告** 按钮,打开在线评测报告 ![Image](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_57c54e2881bfca7661008a414b200471.png) ![Image](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_f0689d3f94655d8af39b17ded3c25027.png) 关键指标说明: * **基本信息** * 评测任务名称:评测任务的名称 * 评测报告生成时间:评测报告实际生成的时间 * 评测任务PM:评测任务的PM人名的列表 * 评测量级:评测任务数据集中的总题目数量 * **核心结论** * 优势占比 * 计算口径(分数为所有有标注结果的GSB分数):优势占比=(2\*2分个数+1\*1分个数+0\*0分个数-1\*负1分个数-2\*负2分个数)/2/评测题数 * 指标格式:转化为百分比 * GSB分数:分别展示有标注结果,每个分数的题目个数。无论题目处在标注过程中的什么状态 * 新模型 * 满分数量:有用性/安全性/真实性等配置的分数均为最高分的数量 * 满分比例:新模型满分数量/有标注结果的题目数量 * 旧模型 * 满分数量:有用性/安全性/真实性等配置的分数均为最高分的数量 * 满分比例:旧模型满分数量/有标注结果的题目数量 * **Prompt分类结论** 一级能力分类表格 * 能力分类:数据集中上传的一级能力分类去重后的列表(如果数据集中上传的内容为空,则没有"Prompt分类结论"这一类的统计) * 优势占比/GSB显著性:某一级能力分类下的优势占比(优势占比口径同上) * 新模型-满分数量:某一级能力分类下,新模型有用性/安全性/真实性等配置的分数均为最高分的数量 * 新模型-满分比例:某一级能力分类下,新模型满分数量/有标注结果的题目数量 * 旧模型-满分数量:某一级能力分类下,旧模型有用性/安全性/真实性等配置的分数均为最高分的数量 * 旧模型-满分比例:某一级能力分类下,旧模型满分数量/有标注结果的题目数量 二级能力分类表格 * 能力分类:数据集中上传的一级+二级能力分类去重后的列表(如果数据集中上传的内容为空,则没有"Prompt分类结论"这一类的统计) * 优势占比/GSB显著性:某二级能力分类下的优势占比(优势占比口径同上) * 新模型-满分数量:某一级+二级能力分类下,新模型有用性/安全性/真实性等配置的分数均为最高分的数量 * 新模型-满分比例:某一级+二级能力分类下,新模型满分数量/有标注结果的题目数量 * 旧模型-满分数量:某一级+二级能力分类下,旧模型有用性/安全性/真实性等配置的分数均为最高分的数量 * 旧模型-满分比例:某一级+二级能力分类下,旧模型满分数量/有标注结果的题目数量 * **各维度分数统计** * 划分维度:按照配置的维度"有用性","真实性","安全性"等 * 新模型-分数统计 * 均分:有标注结果的题目,新模型的GSB平均分 * 2分/1分/0分个数:有标注结果的题目,新模型的GSB分别的分数 * 旧模型-分数统计 * 均分:有标注结果的题目,旧模型的GSB平均分 * 2分/1分/0分个数:有标注结果的题目,新模型的GSB分别的分数 * **Diff 问题类型** * 问题类型:任务配置中的 Diff 问题类型(如果没有配置,则没有"Diff 问题类型"一类的统计) * 优势占比:已有标注结果的题目,在某问题类型下的优势占比(优势占比的指标口径同上) # 2. 查看任务详情 点击任务的 **数据详情** 标签页,查看任务中标注试题的状态。 ![Image](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_a31b6890f5c7fe1c66bcdbfb0898da2b.png) # 3. 查看任务统计 点击 **任务统计** 标签页,查看任务中标注员维度的作业统计,点击左上角 **数据导出** 按钮,可以导出页面数据。 ![Image](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_3ce0b7286039fff42c77a2862d9aa4f3.png) # 4. 导出标注结果数据 在结果导出标签页,选择数据范围、数据格式,点击左上角 **导出数据** 按钮,会生成一条标注结果导出记录,点击 **下载** 按钮,下载标注结果为csv文件 ![Image](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_247ef70555e34c7e6e67939a9dcd68f6.png) --- # 数据集介绍 Source: https://ark.volcengine.com/region:cn-beijing/docs/dataset-introduction 数据集(Dataset)用于统一管理数据集,支持数据集创建、多版本管理和共享功能,可在模型精调中使用。 # 前置条件 创建数据集之前,用户需确保账户已启用 [火山引擎对象存储 TOS 服务](https://docs.volcengine.com/docs/6349/74820?lang=zh)。 # 创建数据集 打开数据集页面后,进入数据集列表。点击数据集列表页面左上角的【**创建数据集**】按钮,进入创建数据集页面。 ![](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_d6f8d79272d7b70d7447bde2551d8b56.png) 填写创建数据集表单,包括数据集名称、数据集描述,选择数据用途、数据格式、上传文件等。具体填写说明见下表。 ![](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_e76b87a68e601b3b96d01e423b80d49f.png) 创建数据集表单配置字段填写说明 |**字段名** |**是否必填** |**描述及填写规范** | |---|---|---| |数据集名称 |是 |自定义数据集名称,方便记录检索;支持1~200位可见字符,且只包含大小写字母、中文、数字、中划线、下划线。 | |数据集描述 |否 |给数据集添加除名称以外的其他描述信息,方便多次迭代版本,重要信息记录;支持1~300位可见字符,且只包含大小写字母、中文、数字、中划线、下划线。 | |数据用途 |是 |目前平台仅支持数据集用于模型精调,其他用途敬请期待。 | |数据格式 |是 |数据格式可根据模态和场景分为以下类型: | \ | | | | \ | | |* 文本生成-SFT精调:对话角色和文本组成的单轮或多轮的对话数据。 | \ | | |* 文本生成-继续预训练:未标注的文本字符串数据,常用于继续预训练。 | \ | | |* 文本向量化-SFT精调:用户问题和正负例文本数据。详情可见[格式总览](/docs/fine-tuning-dataset-format)。 | |版本号 |是 |数据集版本号,从V1开始,每次新建版本自动递增。 | |文件上传 |是 |具体文件格式可参考页面说明,或按照页面提示下载样例文件到本地,填充信息后再上传;支持上传数据集、从TOS导入两种文件上传方式。 | > **注意** > > 1. 数据上传后将保存至用户账号下的 [火山引擎对象存储 TOS](https://docs.volcengine.com/docs/6349/74820?lang=zh) ,费用详情可见 [对象存储-计费概述](https://docs.volcengine.com/docs/6349/78455?lang=zh)。 > 2. 为保障您的数据安全, > > 1. 若您选择从本地上传数据集,平台会在您的账号下创建存储桶(Bucket)以存储上传数据,并为该存储桶开启TOS服务端加密,加密方式为 [SSE-TOS](https://docs.volcengine.com/docs/6349/105525?lang=zh); > > 2. 若您将本账号下TOS服务中存储桶内数据导入至火山方舟数据集内,建议您为数据所在的存储桶启用服务端加密,推荐使用SSE-TOS加密方式,详情可见 [TOS-服务端加密概述](https://docs.volcengine.com/docs/6349/105525?lang=zh)。 # 查看与管理数据集 通过数据集列表页,可以查看数据集的信息,包括数据集名称/ ID、数据格式、最新版本、状态、数据量等关键信息。 ![](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_ea4b0c22cbd549f275787a172ea3eedb.png) # 数据集版本管理 创建完成的数据集,可以在数据集列表中,选择希望查看的数据集,点击【**数据集名称**】进入该数据集的版本列表页。 ## 查看数据集版本 通过数据集版本列表,可以查看该数据集所有版本的信息,包括版本号、版本描述、状态、数据量、预估 Tokens等关键信息。 其中,预估Tokens表示精调时数据集预计消耗的 token 数,不同模型的实际消耗数可能存在一定偏差。 ![](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_d088eb4c9c00602dbd2cd1deb5aba181.png) ## 新建数据集版本 点击数据集列表的【**新建版本**】操作,或点击数据集详情页右上角【**新建版本**】按钮,可在当前数据集基础上新增版本。填写新增版本表单,包括版本描述和文件上传。 ![](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_df6c0784d9c581d24c339a4e04782b54.png) ## 删除数据集版本 用户可以删除不再需要的数据集版本,删除后不可恢复。 注意,删除操作可能带来不良影响,详见[删除数据集](/docs/dataset-introduction#dataset-delete)。 入口:在数据集详情页中,将鼠标悬停在数据集列表中需要删除的数据集版本记录操作中的【···】,点击【删除】操作,按照弹窗提示完成操作。 ![](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_577801a694972f223b45ff0a39df2c8e.png) # 删除数据集 删除数据集将删除该数据集下的所有数据集版本数据,删除后不可恢复。 > **注意** > > 1. 数据集或数据集的某个版本删除成功后: > > 1. 该条数据记录不可见且不可恢复,请谨慎操作。 > > 2. 该条数据记录被删除不影响 TOS 存储的数据文件。如需同步删除,可 [前往 TOS](https://console.volcengine.com/tos/bucket/setting?id=ark-auto-2100000825-cn-beijing-default®ion=cn-beijing&dirPrefix=ark/dataset/ds-20241012112019-dpwmm/dsv-20241012112020-tqphc/&type=objects)。 > 2. 请确保被删除数据集未被共享给其他用户,以避免影响其他用户使用。如该数据集为共享资源,请先 [前往资源管理-由我共享](https://console.volcengine.com/resourcemanager/region:resource-manager+cn-beijing/resource_share/owned) 删除共享单元。更多说明请参考:[资源共享-共享给我管理](https://docs.volcengine.com/docs/6649/1220178?lang=zh)。 入口1:在数据集列表页面,将鼠标悬停在需要删除数据集记录操作中的【···】,点击【删除】操作,按照弹窗提示完成操作。 ![](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_be78ea8a1eb102faa962f0ba64f8c868.png) 入口2:在数据集详情页中,将鼠标悬停在右上角的【···】,点击【删除】提示,同样可以触发删除弹窗。 ![](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_4de14def7bf60cb3b8ff2bb4c377cfe7.png) --- # 共享数据集 Source: https://ark.volcengine.com/region:cn-beijing/docs/shared-datasets 通过共享数据集功能,您可将您的数据集及所包含的所有数据集版本共享给其他用户使用 在获取 资源共享功能 的IAM权限后,您可至 [资源管理](https://console.volcengine.com/resourcemanager/region:resource-manager+cn-beijing/resource_share/owned) 共享您的数据集和接受其他用户的共享,流程如下。 ## 账号开通资源共享权限 没有资源共享权限的用户,无法查看接收到的共享数据集,需要先配置“资源共享”的IAM权限策略。 (1)由账号负责人(主账号或管理员)通过页面右上方头像点击「访问控制」,或点击跳转到控制台的 [策略管理](https://console.volcengine.com/iam/policymanage?scope=All&service=resource_share) 页。 ![](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_26f79611f2da0a658200f04c9a67810c.png) (2)在「策略管理」中,搜索“资源共享”产品,选择 [ResourceShareFullAccess](https://console.volcengine.com/iam/policymanage/System/ResourceShareFullAccess) 策略,点击“管理”操作。 ![](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_2191dc9825e2797172d1b98a437a1c31.png) (3)在策略详情中,点击“添加授权”,选择需要授予权限的用户、用户组或角色,确认后完成权限授权。 ![](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_17a9cea62d743e85a10abfa6c95594c4.png) ![](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_0f09d2de6237eb9693489543a676ada4.png) (4)修改共享权限:用户可以在策略详情中修改IAM身份的策略权限范围,或移除权限。 ![](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_c6ee013ba00671ce153e5ba251956359.png) ## 发起共享 ![](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_605788d0e9ed100c53573ce6f1f158f9.png) (1)获取资源共享权限后,进入「资源共享」控制台 ![](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_f8e1a18c7ca6b668d9cf2f5a1e66600f.png) (2)点击「创建共享单元」进入创建流程。 选择所需要共享的数据集资源,资源ID和数据集ID相同,可在「我的数据集」列表页查询到所需要共享的数据集ID。 ![](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_3da94175670bd6115db54767c1a9475b.png) (3)选择预置策略,填写被共享账号的ID,发起共享。 更多说明请参考:[由我共享管理--资源管理-火山引擎](https://docs.volcengine.com/docs/6649/1220179?lang=zh) ## 接受共享邀请 拥有共享权限的用户可以进入「资源共享」控制台,接受共享邀请。 (1)点击页面右上方头像,选择「资源管理」进入「资源共享」控制台,在左侧导航栏选择「[共享给我](https://console.volcengine.com/resourcemanager/region:resource-manager+cn-beijing/resource_share/shared)」,可查看收到的共享。 ![](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_2a2c501de949b004dd56e2065d1451d9.png) (2)收到的共享邀请会在左侧菜单栏显示,用户进入「共享给我」后可查看收到的全部共享单元。 ![](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_8dc99b3b49159e8f91d5cfa97b2bc618.png) (3)点击“接受”共享邀请后,就可以访问共享资源。您可以前往「火山方舟」[数据集-共享数据集](https://ark.volcengine.com/region:cn-beijing/dataset) 查看并使用接收的数据集。 更多说明请参考:[共享给我管理--资源管理-火山引擎](https://docs.volcengine.com/docs/6649/1220178?lang=zh) ## 使用共享数据集 ### 精调 ![](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_94a41e6aee26ea6b39a87820f57640a2.png) (1)在模型精调时,选择好训练类型和模型后进行数据配置。使用「从数据集选择」方式,添加训练集和验证集。 ![](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_3b8cbd9a3e04a72a50a4a65bd6f764c1.png) (2)点击「选择数据集」选择合适的共享数据集和数据集版本,添加为精调的训练集或验证集。每个精调任务可选择不超过10个数据集进行训练或验证。 (3)添加并通过格式校验后,提交精调任务进行精调。 --- # 概述 Source: https://ark.volcengine.com/region:cn-beijing/docs/overview 方舟 Managed Agents 是火山方舟提供的 **预构建、可配置的智能体框架**,运行在方舟托管的基础设施之上,最适合承载 **长时间运行、多轮工具调用、有状态的异步任务**。 基于模型 API 构建一个可用的 Agent,需要自行实现 AgentLoop、工具调用、上下文管理、沙箱调度、断点续跑与权限隔离等通用组件。建设周期通常需要 4 至 8 周,且需随模型迭代持续适配。方舟 Managed Agents 提供 Agent 层的完整基础设施,你只需定义 Agent 行为、发送用户事件并订阅结果流。 > 方舟目前提供两种基于豆包大模型的构建方式:需对 Agent 循环进行细粒度控制时,选用 **模型 API**;需将完整 Agent 交由平台托管、聚焦业务逻辑时,选用 **Managed Agents**。两者的详细差异参见下文 [与模型 API 对比](/docs/overview#vs_model_api)。 **[快速入门](/docs/quick-start-code)** 4 步跑通你的第一个方舟托管 Agent:创建 Agent、创建环境、开启会话、发送消息并接收流式响应。 **[启动 Session](/docs/start-session)** 基于 Agent 与 Environment 创建 Session,发送用户事件,让 Agent 开始执行任务。 # 基本概念 方舟 Managed Agents 围绕以下四个概念构建: | 概念 | 描述 | | --------------- | ------------------------------------------------------------------------------------------------------------------------ | | **Agent** | 可版本化、可复用的智能体配置资产,定义了一个智能体的角色、能力、行为边界和运行规则,是所有任务运行的模板和基准。创建一次,通过 `agent_id` 在多个 Session 中复用 | | **Environment** | Session 运行的环境配置,包含网络、预装依赖包、环境变量与产物存储。通过 `environment_id` 引用 | | **Session** | 在 Environment 中运行的 Agent 实例,用于执行一次具体任务。上下文、文件、状态相互隔离,同一 Agent 可发起多个并行 Session | | **Events** | 应用与 Agent 之间交换的原子消息,涵盖用户消息、思考、工具调用、工具结果与状态更新。以只增不删的方式在服务端持久化,支持实时订阅或事后回放 | # 核心优势 ## 与模型 API 对比 **模型 API** 是访问模型能力的最原子接口——需自行实现循环、解析工具调用、维护上下文,适用于需要 **细粒度控制** 的场景。**方舟 Managed Agents** 则是访问 Agent 能力的封装接口——将 Agent 层原本需自建的通用能力统一收敛至平台内部。 ### 不再需要自行实现的部分 | 之前(模型 API + 自建循环) | 之后(方舟 Managed Agents) | | ----------------------------------------------------------------------- | --------------------------------------------------------------------------- | | 维护对话历史数组,每一轮将完整历史传回模型 | Session 由服务端持久化历史,仅需发送 / 订阅事件 | | 手动循环调用:模型返回 → 解析 `tool_use` → 执行工具 → 追加 `tool_result` → 再次调用模型 | 平台内置 AgentLoop 自动驱动整个循环;Agent 结束时发出 `session.status_idle` | | 自建沙箱以执行 Agent 生成的代码,机器、容器、扩缩容与清理均需自行管理 | Session 自带沙箱,代码执行、文件读写、Bash 命令由平台代为承载,任务结束即释放 | | 自研上下文压缩策略以避免超出上下文窗口 | 上下文自动压缩,Event API 全量留存,不丢失内容 | | 自研长程任务的状态保存与恢复机制 | 自动保存沙箱状态,长程任务原生支持断点续跑 | | 自研 IAM、密钥注入与执行环境隔离 | 基于火山 IAM + 零信任凭证隔离,密钥不会进入沙箱进程 | ### 仍由你掌控的部分 - **模型与系统提示词**:字段保持不变,仅位置调整至 Agent 定义中。 - **自定义工具**:仍以 JSON Schema 声明 `input_schema`;执行方式调整为——由用户客户端订阅 `agent.custom_tool_use` 事件后自行执行。 - **上下文注入**:仍可通过系统提示词、Skills、上传文件等方式注入。 - **中断与引导**:可随时向 Session 发送额外用户事件以调整方向,或直接中断本轮执行。 ### 何时仍应选择模型 API 若目标 **恰在于自定义 Agent 循环本身**——例如探索新的推理策略、构建自研 Agent 框架、或需对每一步 `tool_use` 进行特殊改写——则模型 API 更为合适。Managed Agents 面向的是「直接获取可运行的 Agent」,而非「构建 Agent 引擎」。 ## 与开源 Agent 对比 主流开源 Agent Runtime(LangChain、OpenCode 等)解决了「能够运行」的问题,但要实现「稳定、高效、具备业务价值」的运行仍需大量投入。方舟并非「在开源框架之上叠加一层豆包适配」,而是 **自底向上自研 AgentLoop 调度内核,并与豆包大模型的原生能力进行深度双向优化**——相当于为模型配备一套量身定制的操作系统,而非在通用硬件上粗放运行。 | 对比维度 | 方舟 Managed Agents(原生 AgentLoop) | 开源 Agent Runtime | | ------------- | ---------------------------------- | ---------------------------- | | **模型适配方式** | 与豆包全系列原生双向优化 | 通用 prompt 模板适配所有模型 | | **推理完成率** | 思维链原生拆解、断点续跑、上下文自动压缩 | 长任务易偏离预期、中断后无法续跑、上下文丢失 | | **工具调用** | 协议级对齐,自动校验 / 重试 / 并行 | 通用 JSON 解析 | | **长程任务** | 原生支持长程任务运行,自动生成快照、按需拉起 | 固定模板适配所有场景,需自建沙箱调度 | | **接入成本** | 开箱即用,零适配成本 | 需 4–8 周自研适配,踩坑周期较长 | # 适用场景 方舟 Managed Agents 最适合具备以下特征的工作负载: - **长时间运行**:单次任务需运行数分钟至数小时,涉及多次工具调用与迭代思考。 - **有状态**:跨多轮交互持久保存文件系统、对话历史与执行状态,支持断点续跑。 - **异步执行**:任务发起后由 Agent 自主推进,客户端仅需订阅事件流即可获取结果。 - **最少的基础设施**:无需自建 Agent 循环、沙箱与工具执行层。 - **弹性调用**:调用量波峰波谷显著,期望按用量计费而非常驻资源。 在上述特征之上,以下为已验证 PMF 的典型业务场景: | 场景 | 重复度 | 风险 | 说明 | | ---------------------- | --- | -- | ---------------------------------------- | | **IT 工单处理** | 高 | 低 | 结构化强、模板化程度高,Agent 处理准确率高 | | **报表自动生成** | 高 | 低 | 数据抓取与汇总逻辑固定,易于 Agent 化 | | **供应商邮件处理** | 中 | 低 | 分类与回复流程明确,适合规则化自动化 | | **代码 Review 与文档** | 高 | 低 | 研发团队收益直观,ROI 显著 | | **销售线索初筛** | 中 | 低 | CRM 录入自动化,释放销售人力 | | **视觉内容创作** | 中 | 中 | 组合视觉搜索、图片生成、视频生成和视频合成工具,适合广告素材与短视频生产。 | 正在使用开源 Agent 自建业务、或通过脚本拼接 Agent 能力的团队,均可考虑迁移至方舟 Managed Agents 进行试点验证。 # 工作流程 方舟 Managed Agents 从创建到接入业务,通常经历以下 5 个步骤: 1. **创建 Agent**:在控制台或通过 API 定义模型、系统提示词与 Skills / Tools / MCPs,获得稳定的 `agent_id`,可在多个 Session 中通过 ID 复用。 2. **创建 Environment**:定义沙箱运行环境(网络、预装包、环境变量和产物存储),获得稳定的 `environment_id`。 3. **启动 Session**:基于 `agent_id` 与 `environment_id` 创建一次会话(Session)。 4. **发送事件并流式接收响应**:将用户消息作为事件发送至 Session,Agent 自主执行工具并通过 SSE(server-sent events)流式返回结果,事件历史由服务端持久化保存,支持完整获取。 5. **引导或中断**:Agent 执行过程中,可随时发送额外用户事件以引导其调整方向,或直接中断本轮执行。 上手方式提供以下两种路径: - 如需以 **可视化方式** 快速完成原型验证,参见 [快速入门(控制台)](/docs/quick-start-console)。 - 如需直接以 **代码 / API** 完成端到端接入,参见 [快速入门(代码)](/docs/quick-start-code)。 # 计费说明 Managed Agents 按照 Agent 运行过程中实际消耗的 Tokens、Agent 运行时时长和工具调用次数三项累加计费。详情参见 [Managed Agents 计费](/docs/model-pricing#ma_billing)。 --- # 快速入门(代码) Source: https://ark.volcengine.com/region:cn-beijing/docs/quick-start-code 4 步跑通你的第一个方舟托管 Agent:创建 Agent、创建环境、开启会话、发送消息并接收流式响应。 # 准备工作 ## 1. 获取并配置 API Key 1. 获取 API Key:访问 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey),创建你的 API Key。 2. 配置环境变量:在终端中运行下面命令(替换 `your_api_key_here` 为你的方舟 API Key),配置 API Key 到环境变量。 配置持久化环境变量方法参见 [环境变量配置指南](/docs/environment-variable-configuration-guide)。 **选项:macOS** ```Bash export ARK_API_KEY="your_api_key_here" ``` **选项:Linux** ```Bash export ARK_API_KEY="your_api_key_here" ``` **选项:Windows_CMD** ```Bash setx ARK_API_KEY "your_api_key_here" ``` **选项:Windows_PowerShell** ```PowerShell $env:ARK_API_KEY = "your_api_key_here" ``` ## 2. 开通 Managed Agents 服务 访问 [开通管理页面](https://ark.volcengine.com/region:cn-beijing/openManagement),切换到 **Managed Agents** 页签开通服务。 ## 3. 开通模型服务 访问 [开通管理页面](https://ark.volcengine.com/region:cn-beijing/openManagement) 开通模型服务。 # 1. 创建 Agent 创建一个Agent,定义其模型、系统提示和可用工具。 ```Bash agent=$( curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/agents" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d @- <<'EOF' { "name": "Quick Start Agent", "model": {"id": "doubao-seed-2-1-pro-260628"}, "system": "你是一个高效的编程助手,擅长代码编写和问题排查。", "tools": [ {"type": "agent_toolset_20260916"} ] } EOF ) AGENT_ID=$(jq -er '.id' <<<"$agent") echo "Agent ID: $AGENT_ID" ``` # 2. 创建环境 Environment 定义 Agent 执行代码和调用工具时使用的沙箱环境,可配置预装依赖、环境变量和产物存储。创建 Session 时,通过 `environment_id` 引用 Environment。 本示例使用 `config.type=cloud` 的云托管环境,由方舟按需启动和自动休眠沙箱,无需自行维护主机。 > `name` 在当前项目内必须唯一;与已有环境重名时,创建请求会失败。 ```Bash environment=$( curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/environments" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d @- <<'EOF' { "name": "demo-env", "config": { "type": "cloud", "networking": {"type": "unrestricted"} } } EOF ) ENVIRONMENT_ID=$(jq -er '.id' <<<"$environment") echo "Environment ID: $ENVIRONMENT_ID" ``` # 3. 开启会话 创建一个引用您的Agent和环境的会话。 ```Bash session=$( curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/sessions" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d @- < # 4. 发送消息并流式接收响应 获取 `session_id` 后,先通过 `SessionEvents_streamEvents` 建立 SSE 连接并等待服务端返回 `: ready`,再通过 `SessionEvents_send` 发送 `user.message` 事件。客户端通过已建立的连接接收 Agent 状态、工具调用和响应内容。 > **注意** > > SSE 只推送连接建立后产生的事件,不回放历史事件。如果先发送消息再建立连接,客户端会漏掉连接建立前已产生的事件。 ```Bash # Open the SSE stream and wait for the ready comment before sending the message STREAM_DIR=$(mktemp -d) STREAM_PIPE="$STREAM_DIR/events" mkfifo "$STREAM_PIPE" cleanup_stream() { exec 3<&- || true if kill -0 "$STREAM_PID" 2>/dev/null; then kill "$STREAM_PID" 2>/dev/null || true fi wait "$STREAM_PID" 2>/dev/null || true rm -f "$STREAM_PIPE" rmdir "$STREAM_DIR" 2>/dev/null || true } curl -sS -N --fail-with-body \ "https://ark.cn-beijing.volces.com/api/v3/sessions/$SESSION_ID/events/stream" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Accept: text/event-stream" >"$STREAM_PIPE" & STREAM_PID=$! exec 3<"$STREAM_PIPE" trap cleanup_stream EXIT stream_ready=false while IFS= read -r line <&3; do if [[ $line == ": ready" ]]; then stream_ready=true break fi done if [[ $stream_ready != true ]]; then printf 'SSE stream closed before it was ready.\n' >&2 exit 1 fi # Send the user message after the stream is ready curl -sS --fail-with-body \ "https://ark.cn-beijing.volces.com/api/v3/sessions/$SESSION_ID/events" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d @- >/dev/null <<'EOF' { "events": [ { "type": "user.message", "content": [ {"type": "text", "text": "用 Python 编写一个脚本,生成前 20 个斐波那契数,并将其保存到 fibonacci.txt。"} ] } ] } EOF # Process events from the established stream stream_finished=false while IFS= read -r line <&3; do [[ $line == data:* ]] || continue json=${line#data: } case $(jq -r '.type' <<<"$json") in agent.message) jq -j '.content[] | select(.type == "text") | .text' <<<"$json" ;; agent.tool_use) printf '\n[Using tool: %s]\n' "$(jq -r '.name' <<<"$json")" ;; session.status_idle) printf '\n\nAgent finished.\n' stream_finished=true break ;; esac done if [[ $stream_finished != true ]]; then printf 'SSE stream closed before the Agent finished.\n' >&2 exit 1 fi cleanup_stream trap - EXIT ``` **示例输出:** ``` [Using tool: write] [Using tool: bash] [Using tool: read] 已完成任务: 1. 编写了 Python 脚本 /workspace/generate_fibonacci.py,用于生成斐波那契数列 2. 成功运行脚本,生成的前 20 个斐波那契数为:[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181] 3. 结果已保存到 /workspace/fibonacci.txt 文件中,文件内按序号清晰列出了每一个斐波那契数,内容验证正确。 Agent finished. ``` # 完整脚本 将上面 4 步合并为一个可直接运行的脚本,开头加 `set -euo pipefail`,任一步失败立即终止。 **用法:** 1. 将下面代码保存为 `quickstart.sh`。 2. 确保已按「准备工作」配置好 `ARK_API_KEY` 环境变量,并已安装 `curl` 与 `jq`。 3. 执行: ```Bash bash quickstart.sh ``` ```Bash #!/usr/bin/env bash set -euo pipefail export ARK_API_KEY="${ARK_API_KEY:?请先 export ARK_API_KEY}" ARK_BASE_URL="https://ark.cn-beijing.volces.com" # Step 1: Create Agent agent=$( curl -sS --fail-with-body "$ARK_BASE_URL/api/v3/agents" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d @- <<'EOF' { "name": "Quick Start Agent", "model": {"id": "doubao-seed-2-1-pro-260628"}, "system": "你是一个高效的编程助手,擅长代码编写和问题排查。", "tools": [ {"type": "agent_toolset_20260916"} ] } EOF ) AGENT_ID=$(jq -er '.id' <<<"$agent") echo "Agent ID: $AGENT_ID" # Step 2: Create Environment environment=$( curl -sS --fail-with-body "$ARK_BASE_URL/api/v3/environments" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d @- <<'EOF' { "name": "demo-env", "config": { "type": "cloud", "networking": {"type": "unrestricted"} } } EOF ) ENVIRONMENT_ID=$(jq -er '.id' <<<"$environment") echo "Environment ID: $ENVIRONMENT_ID" # Step 3: Create Session session=$( curl -sS --fail-with-body "$ARK_BASE_URL/api/v3/sessions" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d @- </dev/null; then kill "$STREAM_PID" 2>/dev/null || true fi wait "$STREAM_PID" 2>/dev/null || true rm -f "$STREAM_PIPE" rmdir "$STREAM_DIR" 2>/dev/null || true } curl -sS -N --fail-with-body \ "$ARK_BASE_URL/api/v3/sessions/$SESSION_ID/events/stream" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Accept: text/event-stream" >"$STREAM_PIPE" & STREAM_PID=$! exec 3<"$STREAM_PIPE" trap cleanup_stream EXIT stream_ready=false while IFS= read -r line <&3; do if [[ $line == ": ready" ]]; then stream_ready=true break fi done if [[ $stream_ready != true ]]; then printf 'SSE stream closed before it was ready.\n' >&2 exit 1 fi # Send the user message after the stream is ready curl -sS --fail-with-body \ "$ARK_BASE_URL/api/v3/sessions/$SESSION_ID/events" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d @- >/dev/null <<'EOF' { "events": [ { "type": "user.message", "content": [ {"type": "text", "text": "用 Python 编写一个脚本,生成前 20 个斐波那契数,并将其保存到 fibonacci.txt。"} ] } ] } EOF stream_finished=false while IFS= read -r line <&3; do [[ $line == data:* ]] || continue json=${line:5} json=${json# } case $(jq -r '.type' <<<"$json") in agent.message) jq -j '.content[] | select(.type == "text") | .text' <<<"$json" ;; agent.tool_use) printf '\n[Using tool: %s]\n' "$(jq -r '.name' <<<"$json")" ;; session.status_idle) printf '\n\nAgent finished.\n' stream_finished=true break ;; esac done if [[ $stream_finished != true ]]; then printf 'SSE stream closed before the Agent finished.\n' >&2 exit 1 fi cleanup_stream trap - EXIT ``` ## SDK 完整示例 **选项:Python** ```Python import json import os import time import httpx from arkruntime import Ark client = Ark( api_key=os.environ["ARK_API_KEY"], base_url="https://ark.cn-beijing.volces.com/api/v3", ) suffix = str(int(time.time())) agent = client.agents.create( name=f"quick-start-agent-{suffix}", model={"id": "doubao-seed-2-1-pro-260915"}, system="你是一个高效的编程助手,擅长代码编写和问题排查。", tools=[{"type": "agent_toolset_20260916"}], ) environment = client.environments.create( name=f"quick-start-env-{suffix}", config={ "type": "cloud", "networking": {"type": "unrestricted"}, }, ) session = client.sessions.create( agent=agent.id, environment_id=environment.id, title="Quickstart session", ) try: stream_url = "https://ark.cn-beijing.volces.com/api/v3/sessions/{}/events/stream".format(session.id) stream_headers = { "Authorization": "Bearer {}".format(os.environ["ARK_API_KEY"]), "Accept": "text/event-stream", } with httpx.stream( "GET", stream_url, headers=stream_headers, timeout=None ) as response: response.raise_for_status() lines = response.iter_lines() for line in lines: if line == ": ready": break else: raise RuntimeError("SSE stream closed before it was ready.") client.sessions.events.send( session.id, events=[ { "type": "user.message", "content": [ { "type": "text", "text": "用 Python 输出前 20 个斐波那契数。", } ], } ], ) agent_finished = False for line in lines: if not line.startswith("data:"): continue data = line.removeprefix("data:").strip() if data == "[DONE]": break event = json.loads(data) print(event) if event["type"] in { "session.status_idle", "session.status_terminated", }: agent_finished = True break if not agent_finished: raise RuntimeError("SSE stream closed before the Agent finished.") finally: client.sessions.delete(session.id) client.environments.delete(environment.id) client.agents.delete(agent.id) ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "time" "github.com/volcengine/ark-runtime-go/arkruntime" agentmodel "github.com/volcengine/ark-runtime-go/arkruntime/model/agent" envmodel "github.com/volcengine/ark-runtime-go/arkruntime/model/environment" sessionmodel "github.com/volcengine/ark-runtime-go/arkruntime/model/session" ) func main() { ctx := context.Background() client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) suffix := fmt.Sprint(time.Now().Unix()) agent, err := client.CreateAgent(ctx, &agentmodel.CreateAgentRequest{ Name: "quick-start-agent-" + suffix, Model: agentmodel.ModelConfig{ID: "doubao-seed-2-1-pro-260915"}, System: agentmodel.NewOptString("你是一个高效的编程助手。"), Tools: []agentmodel.ToolItem{{Type: "agent_toolset_20260916"}}, }) if err != nil { panic(err) } environment, err := client.CreateEnvironment(ctx, &envmodel.CreateEnvironmentRequest{ Name: "quick-start-env-" + suffix, Config: envmodel.NewOptEnvConfig(envmodel.EnvConfig{ Type: envmodel.EnvConfigTypeCloud, Networking: envmodel.NewOptNetworkingConfig(envmodel.NetworkingConfig{ Type: envmodel.NetworkingTypeUnrestricted, }), }), }) if err != nil { panic(err) } session, err := client.CreateSession(ctx, &sessionmodel.CreateSessionRequest{ Agent: sessionmodel.NewStringAgentIdentifier(agent.ID), EnvironmentID: sessionmodel.NewOptString(environment.ID), Title: sessionmodel.NewOptString("Quickstart session"), }) if err != nil { panic(err) } defer client.DeleteAgent(ctx, agent.ID) defer client.DeleteEnvironment(ctx, environment.ID) defer client.DeleteSession(ctx, session.ID) content := sessionmodel.ManagedAgentsMessageContentBlock{ OneOf: sessionmodel.NewManagedAgentsTextBlockManagedAgentsMessageContentBlockSum( sessionmodel.ManagedAgentsTextBlock{Text: "用 Python 输出前 20 个斐波那契数。"}, ), } event := sessionmodel.ManagedAgentsEventParams{ OneOf: sessionmodel.NewManagedAgentsUserMessageEventParamsManagedAgentsEventParamsSum( sessionmodel.ManagedAgentsUserMessageEventParams{ Content: []sessionmodel.ManagedAgentsMessageContentBlock{content}, }, ), } stream, err := client.StreamSessionEvents(ctx, session.ID) if err != nil { panic(err) } defer stream.Close() _, err = client.SendSessionEvents(ctx, session.ID, &sessionmodel.SendSessionEventsRequest{ Events: []sessionmodel.ManagedAgentsEventParams{event}, }) if err != nil { panic(err) } agentFinished := false for stream.Next() { frame := stream.Event() fmt.Printf("%s: %s\n", frame.Type, frame.RawPayload) if frame.Type == "session.status_idle" || frame.Type == "session.status_terminated" { agentFinished = true break } } if err := stream.Err(); err != nil { panic(err) } if !agentFinished { panic("SSE stream closed before the Agent finished.") } } ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.agent.Agent; import com.volcengine.ark.runtime.models.agent.CreateAgentRequest; import com.volcengine.ark.runtime.models.agent.ModelConfig; import com.volcengine.ark.runtime.models.agent.ToolItem; import com.volcengine.ark.runtime.models.environment.CreateEnvironmentRequest; import com.volcengine.ark.runtime.models.environment.EnvConfig; import com.volcengine.ark.runtime.models.environment.EnvConfigType; import com.volcengine.ark.runtime.models.environment.Environment; import com.volcengine.ark.runtime.models.environment.NetworkingConfig; import com.volcengine.ark.runtime.models.environment.NetworkingType; import com.volcengine.ark.runtime.models.session.AgentIdentifier; import com.volcengine.ark.runtime.models.session.CreateSessionRequest; import com.volcengine.ark.runtime.models.session.ManagedAgentsMessageContentBlock; import com.volcengine.ark.runtime.models.session.ManagedAgentsTextBlock; import com.volcengine.ark.runtime.models.session.ManagedAgentsUserMessageEventParams; import com.volcengine.ark.runtime.models.session.SendSessionEventsRequest; import com.volcengine.ark.runtime.models.session.Session; import com.volcengine.ark.runtime.service.ArkService; import okhttp3.ResponseBody; import okio.BufferedSource; import retrofit2.Response; import java.util.Arrays; public class ManagedAgentsQuickStart { public static void main(String[] args) throws Exception { ArkService service = ArkService.builder() .apiKey(System.getenv("ARK_API_KEY")) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); String suffix = String.valueOf(System.currentTimeMillis()); Agent agent = service.createAgent( CreateAgentRequest.builder() .name("quick-start-agent-" + suffix) .model(ModelConfig.builder().id("doubao-seed-2-1-pro-260915").build()) .system("你是一个高效的编程助手。") .tools(Arrays.asList(ToolItem.builder().type("agent_toolset_20260916").build())) .build()); Environment environment = service.createEnvironment( CreateEnvironmentRequest.builder() .name("quick-start-env-" + suffix) .config(EnvConfig.builder() .type(EnvConfigType.CLOUD) .networking(NetworkingConfig.builder() .type(NetworkingType.UNRESTRICTED) .build()) .build()) .build()); Session session = service.createSession( CreateSessionRequest.builder() .agent(AgentIdentifier.ofString(agent.getId())) .environmentId(environment.getId()) .title("Quickstart session") .build()); try { ManagedAgentsTextBlock text = ManagedAgentsTextBlock.builder() .text("用 Python 输出前 20 个斐波那契数。") .build(); ManagedAgentsUserMessageEventParams event = ManagedAgentsUserMessageEventParams.builder() .content(Arrays.asList(text)) .build(); Response response = service.streamSessionEvents(session.getId()).execute(); if (!response.isSuccessful() || response.body() == null) { throw new IllegalStateException("Stream request failed: " + response.code()); } try (ResponseBody body = response.body()) { BufferedSource source = body.source(); service.sendSessionEvents( session.getId(), SendSessionEventsRequest.builder() .events(Arrays.asList(event)) .build()); String line; boolean agentFinished = false; while ((line = source.readUtf8Line()) != null) { if (line.startsWith("data:")) { System.out.println(line.substring(5).trim()); } if (line.contains("session.status_idle") || line.contains("session.status_terminated")) { agentFinished = true; break; } } if (!agentFinished) { throw new IllegalStateException( "SSE stream closed before the Agent finished."); } } } finally { service.deleteSession(session.getId()); service.deleteEnvironment(environment.getId()); service.deleteAgent(agent.getId()); service.shutdownExecutor(); } } } ``` # 运行说明 当您发送用户事件时,方舟托管 Agent 会: 1. **配置沙箱**:您的环境配置决定了沙箱的构建方式。 2. **运行Agent循环**:方舟根据您的消息确定要使用哪些工具。 3. **执行工具**:启动沙箱,在沙箱内运行文件写入、bash 命令和其他工具调用。 4. **流式传输事件**:您会在Agent工作时收到实时更新。 5. **进入空闲状态**:当Agent没有更多任务要执行时,会发出 `session.status_idle` 事件。 # 设计建议 配置 Agent 和 Session 时,按照配置的生命周期区分长期能力与单次任务: - **长期能力写入 Agent 定义**:通过 `Agents_create` 或 `Agents_update` 配置系统提示词、Skills、Tools 和 MCP Server,供多个 Session 复用。 - **单次任务通过 Session 事件传入**:通过 `SessionEvents_send` 发送 `user.message` 事件,不要将本次任务写入 Agent 的 `system` 字段。 将单次任务写入 `system` 会降低 Agent 定义的复用性;将长期规则放入 Session 事件则需要重复传输,也容易造成不同 Session 的配置不一致。 # 后续步骤 **[定义 Agent](/docs/define-agent)** 定义 Agent 的模型、系统提示词、工具集与运行行为。 **[配置环境](/docs/configure-cloud-environment)** 配置 Agent 运行所在的云端沙箱环境,包含网络、预装依赖包与环境变量。 **[Agent tools](/docs/tools)** 配置 Agent 在 Session 中可主动调用的工具集合。 **[Session 事件流](/docs/session-event-stream)** 通过 SSE 事件流实时接收 Agent 的消息、工具调用与状态更新。 --- # 快速入门(控制台) Source: https://ark.volcengine.com/region:cn-beijing/docs/quick-start-console 方舟 Managed Agents 控制台提供可视化界面,让你无需编写 API 代码即可创建、配置并测试 Agent。你可以在控制台里交互式地打磨 Agent 配置,验证行为符合预期后,再拿到对应的 ID 接入到自己的业务代码中。 > 首次访问需登录 [火山方舟控制台](https://ark.volcengine.com/region:cn-beijing/managed-agents/agents?projectName=default),进入 **Managed Agents** 模块。 # 准备工作 ## 1. 获取 API Key 访问 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey),单击 **创建 API Key**,作为后续接入业务代码的访问密钥。 ## 2. 开通 Managed Agents 服务 访问 [开通管理页面](https://ark.volcengine.com/region:cn-beijing/openManagement),切换到 **Managed Agents** 页签开通服务。 ## 3. 开通模型服务 访问 [开通管理页面](https://ark.volcengine.com/region:cn-beijing/openManagement) 开通模型服务。 创建 Seedance Managed Agent 前,根据控制台提示开通 Seedance Managed Agent 使用权限及所需的模型和工具服务。 # 构建 Agent ## 1. 创建 Agent Agent 是可版本化、可复用的智能体配置资产,定义角色、能力、行为边界和运行规则,是所有任务运行的模板和基准。 访问 [火山方舟控制台](https://ark.volcengine.com/region:cn-beijing/managed-agents/agents?projectName=default),进入 **Managed Agents** 模块。在 **Agents** 页面单击 **创建 Agent**,跟随界面引导填写: - **Agent 版本**:根据任务类型选择通用 Agent 或 Seedance Managed Agent。 - **模型和系统提示词**:选择一个 **模型**,并编写 **系统提示词**,为 Agent 设定角色、做事风格与工作原则。 - **Skills**:从 **火山 SkillHub** 中挂载预置 **Skill**,或本地上传自定义 **Skill**,扩展 Agent 的领域能力。 - **Tools**:勾选内置的 **Agent Toolset**(如 `bash`、`edit`、`read`、`write` 等基础工具),让 Agent 能够读写文件、执行命令。 - **MCPs**:以 URL 形式接入远程 **MCP Server**,把外部系统能力接入 Agent。 - **Multi Agents**:将多个 Agent 组合成协同工作流,一个 Agent 可以调用另一个 Agent 完成子任务。 保存后,控制台会为该 Agent 生成一个稳定的 `agent_id`。每次修改配置都会自动生成新版本,支持版本对比、回滚和灰度发布。 ## 2. 创建 Environment 定义 Agent 的运行环境模板,预置依赖、环境变量和产物存储等。创建 Session 时绑定 Environment,确保代码在一致环境中执行。 在 [Environments 页面](https://ark.volcengine.com/region:cn-beijing/managed-agents/environments?projectName=default) 单击 **创建 Environment**,跟随界面引导填写: - **类型**:当前仅支持 **云托管**——沙箱由方舟按需拉起、自动休眠。 - **预装包**:按需添加 `pip`、`apt` 依赖(如 `numpy`、`pandas`),沙箱首次启动时安装。 - **环境变量**:以键值对形式注入到沙箱进程,沙箱启动时自动加载,供 Agent 执行的代码和命令直接读取。常用于配置业务侧的非敏感参数,例如设置时区 `TZ=Asia/Shanghai`。 - **产物存储**:可选。需要长期保留 Agent 写入 `/mnt/session/outputs/` 的最终产物时,选择已授权的自有 TOS 目录;不选择时使用方舟公共 TOS,你需要在平台 TTL 到期前下载所需文件。 保存后得到一个稳定的 `environment_id`。 > **说明** > > 你的 TOS Bucket 必须与 Managed Agents 服务部署在同一地域。首次选择 TOS 目录时,如果控制台提示未授权,先按页面引导完成项目授权。 # 调试 Agent 在控制台里以交互方式测试 Agent。每次调试创建一个 Session,展示事件流、工具调用、输入输出完整记录,可随时回放。 Session 是一次独立的 Agent 任务运行会话,包含从发起、执行到结束的完整生命周期: 1. 在 [Sessions 页面](https://ark.volcengine.com/region:cn-beijing/managed-agents/sessions?projectName=default) 单击 **创建 Session**,选择要绑定的 **Agent** 和 **Environment**。Session 默认继承该 Environment 的产物存储配置。 2. 在 **Session 详情** 页面调试会话: - **发起**:在 **会话面板** 输入自然语言指令,或上传附件(表格、文档、代码、图片等)作为任务输入。 - **观察**:**事件时间轴(Trace)** 实时呈现 Agent 的思考过程、工具调用、代码执行、错误重试等全链路节点。 - **验证**:Session 结束后可查看 **最终交付产物**、**总耗时**、**Token 消耗**、**工具调用次数** 等运行统计,判断 Agent 行为是否符合预期。 反复调整 **系统提示词**、**Tools**、**Skills**,直到 Session 试跑结果符合预期。 # 从原型到代码 Agent 配置验证通过后,把它接入到业务代码中只需两步。 ## 1. 从控制台复制 ID - 从 **Agent 详情页** 复制 `agent_id`。 - 从 **Environment 详情页** 复制 `environment_id`。 - 前往 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 单击 **创建 API Key**,作为访问密钥。 ## 2. 在代码中引用它们创建 Session 将 `agent_id`、`environment_id` 和 API Key 填入下面的请求,创建一个绑定该 Agent 与环境的 Session: ```Bash curl https://ark.cn-beijing.volces.com/api/v3/sessions \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "agent": "agent-xxxxxxxxxxxxxx-xxxxx", "environment_id": "env-xxxxxxxxxxxxxx-xxxxx", "title": "My first session" }' ``` 拿到返回的 `session_id` 后,即可通过 Events API 向 Session 发送消息,并通过 SSE 流式接收 Agent 的响应事件。详情请参见 [Session 事件流](/docs/session-event-stream)。 --- # Agent Source: https://ark.volcengine.com/region:cn-beijing/docs/define-agent 方舟 Managed Agents 是火山方舟平台推出的全托管 Agent 服务,给您带来开箱即用的 Agent 体验。Agent 是方舟 Managed Agents 的基础元件,是一套包含基本信息、System Prompt、扩展能力(Skills、Tools、MCP 等)的配置模板,可以被任意 Session 复用,并支持版本化管理。本文介绍如何定义一个 Agent。 ## Agent 版本 创建 Agent 时,先根据任务选择 Agent 版本: - 通用 Agent:适用于代码执行、内容检索和文档处理等通用任务。 - Seedance Managed Agent:适用于图片生成、视频生成、视觉搜索和视频合成等任务。 ## Agent 定义字段 Agent 的完整字段定义(包括名称、模型、System Prompt、Skills、Tools、MCP、多智能体协作、元数据等),请参见[创建智能体](/docs/create-agent-api)。 ## 准备工作 1. 获取 API Key。API Key 是调用方舟平台模型和服务的鉴权信息。 访问 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,创建你的 API Key。 2. 安装 `curl` 和 `jq`,并配置环境变量。API Key 是敏感信息,一旦意外泄露,可能会造成资金损失或安全风险,因此不要在代码中明文写入 API Key,应将其配置到环境变量中。 将以下命令中的 `your_api_key_here` 替换为你的 API Key,并在终端中运行命令,即可将 API Key 配置到环境变量中。详见[环境变量配置指南](/docs/environment-variable-configuration-guide)。 **选项:macOS** ```Bash export ARK_API_KEY="your_api_key_here" ``` **选项:Linux** ```Bash export ARK_API_KEY="your_api_key_here" ``` **选项:Windows_CMD** ```CMD setx ARK_API_KEY "your_api_key_here" ``` **选项:Windows_PowerShell** ```PowerShell $env:ARK_API_KEY = "your_api_key_here" ``` 3. 开通 Managed Agents 服务。 访问 [开通管理页面](https://ark.volcengine.com/region:cn-beijing/openManagement),切换到 **Managed Agents** 页签开通服务。 4. 开通模型服务。 访问 [开通管理](https://ark.volcengine.com/region:cn-beijing/openManagement) 页面,开通模型服务。 ## 创建 Agent 创建 Agent 后,接口会返回一个稳定的 Agent ID 和初始版本号 `1`。后续创建 Session 时,可以直接引用这个 Agent ID。 单个账号最多可创建 1000 个 Agent。 下面的示例创建一个带内置工具集和自定义 Skill 的热点新闻 Agent。示例显式配置内置工具的启用状态和权限策略,并将响应中的 Agent ID 与当前版本保存到环境变量: ```Bash AGENT_RESPONSE=$(curl -sS --fail-with-body https://ark.cn-beijing.volces.com/api/v3/agents \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "name": "NewsAgent01", "model": { "id": "doubao-seed-2-1-pro-260628", "speed": "standard" }, "description": "将热点新闻总结为图片的小助手。", "system": "你是一名热点新闻查询总结小助手,可将每天的前 10 条热点新闻以摘要图片的方式总结出来。", "skills": [ { "type": "custom", "skill_id": "skill-20260812080348-****" } ], "tools": [ { "type": "agent_toolset_20260916", "default_config": { "enabled": true, "permission_policy": { "type": "always_allow" } } } ] }') || exit 1 jq . <<<"$AGENT_RESPONSE" || exit 1 AGENT_ID=$(jq -er '.id' <<<"$AGENT_RESPONSE") || exit 1 AGENT_VERSION=$(jq -er '.version' <<<"$AGENT_RESPONSE") || exit 1 export AGENT_ID AGENT_VERSION printf 'Agent ID: %s\nAgent version: %s\n' "$AGENT_ID" "$AGENT_VERSION" ``` 其中 `skill-20260812080348-****` 表示你上传自定义 Skill 后获得的 `skill_id`。 示例响应如下: ``` { "id": "agent-20260812081435-*****", "type": "agent", "name": "NewsAgent01", "description": "将热点新闻总结为图片的小助手。", "version": 1, "model": { "id": "doubao-seed-2-1-pro-260628", "speed": "standard" }, "system": "你是一名热点新闻查询总结小助手,可将每天的前 10 条热点新闻以摘要图片的方式总结出来。", "tools": [ { "type": "agent_toolset_20260916", "default_config": { "enabled": true, "permission_policy": { "type": "always_allow" } } } ], "skills": [ { "type": "custom", "skill_id": "skill-20260812080348-****" } ], "created_at": "2026-08-12T08:14:35Z", "updated_at": "2026-08-12T08:14:35Z" } ``` ## 更新 Agent 与版本 Agent 是版本化资源。每次更新配置时,都需要显式传入当前版本号;如果版本号不匹配,更新会失败。更新成功后,系统会生成一个新版本。 以下示例先查询 Agent 的当前版本,再提交更新。运行本页的创建示例后,可以直接复用 `AGENT_ID`;更新其他 Agent 时,先将其 ID 写入该环境变量。 ```Bash : "${AGENT_ID:?Run the create example first or set AGENT_ID}" CURRENT_AGENT=$(curl -sS --fail-with-body \ "https://ark.cn-beijing.volces.com/api/v3/agents/$AGENT_ID" \ -H "Authorization: Bearer $ARK_API_KEY") || exit 1 AGENT_VERSION=$(jq -er '.version' <<<"$CURRENT_AGENT") || exit 1 UPDATE_RESPONSE=$(curl -sS --fail-with-body -X PUT \ "https://ark.cn-beijing.volces.com/api/v3/agents/$AGENT_ID" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d @- < **注意** > > 如需限制主 Agent 的内置工具范围,请显式配置内置工具集并关闭默认范围,不要通过清空 `tools` 实现。详情请参见 [核对默认工具范围](/docs/tools#tool-defaults-and-boundaries)。 ## 设计建议 - 把稳定能力放进 Agent,把一次性任务放进 Session 事件。 - `system` 只定义角色、约束和长期规则,不要把当前任务直接写进 `system`。 - 需要外部系统能力时,优先使用 MCP。 - 需要复用领域知识或执行规范时,优先挂载 Skills,而不是把大段操作手册直接塞进 `system`。 ## 相关文档 **[Skills](/docs/skills)** Skills 用于给 Agent 补充领域知识、操作流程和最佳实践。 **[MCP](/docs/mcp)** MCP(Model Context Protocol)用于把第三方系统的工具与数据源接入 Agent。 **[Tools](/docs/tools)** Tools 决定 Agent 在 Session 中能主动调用哪些执行能力。 **[工具权限策略](/docs/tool-permission-policy)** 工具权限策略用于控制 Agent 发起工具调用时,是自动执行,还是暂停等待确认。 --- # Skills Source: https://ark.volcengine.com/region:cn-beijing/docs/skills Skills 是可复用的能力包,用于给 Agent 补充领域知识、操作流程和最佳实践。与直接把大量规则写进 `system` 不同,Skills 更适合承载可复用、可维护的专业能力。 # 获取 Skills 方舟 Managed Agents 支持两类 Skills 来源: - 预置 Skills:从 SkillHub 选择。 - 自定义 Skills:通过 `CreateSkill` 接口上传本地 Skills。 ## 方式 1:从 SkillHub 选择预置 Skills 如果你使用的是平台预置 Skills,可以直接在 Agent 的 `skills` 配置中引用对应 Skill。预置 Skills 适合通用场景,例如文档处理、结构化内容生成或固定工作流编排。 由于预置 Skills 由平台统一维护,你不需要自己上传文件,也不需要关心版本包结构。选择完成后,把对应 Skill ID 写入 Agent 的 `skills` 数组即可。 如果你需要查询预置 Skill 的 ID,请前往 [SkillHub 页面](https://console.volcengine.com/skillhub) 查看。 ## 方式 2:上传自定义 Skills 如果预置 Skills 无法覆盖你的场景,可以先通过 `CreateSkill` 接口上传本地 Skills,再在 Agent 中引用返回的 `skill_id`。 当前支持两种上传方式: - 按文件上传:逐个上传同一个 Skill 目录中的文件,并保留目录结构。 - ZIP 上传:将一个完整 Skill 目录打包成 ZIP 文件后上传。 > **说明** > > 每次请求只能创建一个 Skill,且技能文件中必须包含且仅包含一个 `SKILL.md`。 ### 上传限制与目录建议 按以下约束组织自定义 Skills: - 每次请求上传的原始文件总大小不超过 **30 MiB**。 - 单个版本最多包含 **500** 个文件。 - ZIP 解压后单个文件不超过 **30 MiB**,全部文件总大小不超过 **120 MiB**。 - 所有文件必须位于同一个顶层目录,且该目录下必须直接包含且仅包含 **1 个** `SKILL.md`。 ZIP 包推荐使用统一顶层目录,`SKILL.md` 放在顶层目录的直接子级: ```text basic_math.zip └── basic_math/ ├── SKILL.md └── meta.json ``` ### 按文件上传 按文件上传适合在构建流程中逐个组织文件。重复传入 `files[]`,并在每个字段的 `filename=` 中填写文件上传后在 Skill 中的路径。 ```Bash curl https://ark.cn-beijing.volces.com/api/v3/skills \ -H "Authorization: Bearer $ARK_API_KEY" \ -F "display_title=Web Artifacts Builder" \ -F "files[]=@./basic_math/SKILL.md;filename=basic_math/SKILL.md;type=text/markdown" \ -F "files[]=@./basic_math/scripts/init.sh;filename=basic_math/scripts/init.sh;type=text/plain" ``` 其中: - `files[]` 是按文件上传使用的字段名。 - `@` 后面是本地真实路径。 - `filename=` 指定文件上传后在 Skill 中的路径,例如 `basic_math/SKILL.md`。 - 所有 `filename=` 必须使用同一个顶层目录,例如 `basic_math/`。 - `type=` 是 MIME 类型,可以省略。 ### ZIP 上传 ZIP 方式更适合把整个 Skill 目录一次性打包上传: ```Bash curl https://ark.cn-beijing.volces.com/api/v3/skills \ -H "Authorization: Bearer $ARK_API_KEY" \ -F "files=@./basic_math.zip;type=application/zip" ``` 成功上传后,接口会返回 Skill 记录,重点关注 `id`、`latest_version`、`display_title` 和 `source`: ```json { "id": "skill-20260926143025-a1b2c", "object": "skill", "created_at": 1790433025, "description": "Perform basic arithmetic operations.", "latest_version": "1", "display_title": "basic-math", "source": "custom", "updated_at": 1790433025, "name": "basic-math" } ``` 其中 `id` 就是后续挂载到 Agent 时要引用的 `skill_id`。 # 在 Agent 上引用 Skills 获取 Skills 后,你需要在 `CreateAgent` 或 `UpdateAgent` 的 `skills` 字段中引用 Skill。 - 预置 Skills:从 SkillHub 选择后,把对应 Skill ID 写入 `skills`。 - 自定义 Skills:先调用 `CreateSkill` 上传,拿到 `skill_id` 后再写入 `skills`。如果需要指定自定义 Skill 的版本,请显式传入 `version`,否则通常使用默认版本。 > **说明** > > 单个 Agent 最多可配置 50 个 Skills。 ## `skills` 字段结构 在 `CreateAgent` 或 `UpdateAgent` 请求中,每个 Skill 条目都通过 `skills` 数组声明。关于字段结构的详细信息,请参见[创建智能体](/docs/create-agent-api)。 ## 示例代码 示例如下: ```Bash curl https://ark.cn-beijing.volces.com/api/v3/agents \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "name": "数据处理 Agent", "model": { "id": "doubao-seed-2-1-pro-260628" }, "skills": [ { "type": "skill_hub", "skill_id": "s-yepozmp9tsf2adf*****" }, { "type": "custom", "skill_id": "skill-20260812080348-****", "version": "1" } ] }' ``` 其中: - `s-yepozmp9tsf2adf*****` 表示你从 [SkillHub 页面](https://console.volcengine.com/skillhub) 查到的预置 Skill ID。 - `skill-20260812080348-****` 表示 `CreateSkill` 返回的自定义 Skill ID。 # 使用建议 - 对稳定、通用的能力,优先选择 SkillHub 中的预置 Skills。 - 对团队私有流程、内部规范或自定义操作手册,使用自定义 Skills。 - 不要把一次性任务描述写进 Skill;Skill 负责定义能力,具体任务应通过 Session 事件传入。 - 上传前建议在本地先确认 `SKILL.md`、脚本和依赖文件路径关系,避免上传后引用失败。 # 相关文档 **[Agent](/docs/define-agent)** Agent 是包含基本信息、System Prompt、扩展能力的配置模板。 **[MCP](/docs/mcp)** MCP(Model Context Protocol)用于把第三方系统的工具与数据源接入 Agent。 **[Tools](/docs/tools)** Tools 决定 Agent 在 Session 中能主动调用哪些执行能力。 **[工具权限策略](/docs/tool-permission-policy)** 工具权限策略用于控制 Agent 发起工具调用时,是自动执行,还是暂停等待确认。 --- # MCP Source: https://ark.volcengine.com/region:cn-beijing/docs/mcp MCP(Model Context Protocol)用于把第三方系统的工具与数据源接入 Agent。通过 MCP,Agent 可以访问外部服务暴露出来的标准化工具,例如代码托管、项目协作、知识库或内部业务系统。 在方舟 Managed Agents 中,MCP 配置分成两层: * Agent 定义层:声明要连接哪些 MCP Server。 * Session 运行层:通过 Vaults 注入对应凭据,完成鉴权。 这种拆分让 Agent 定义保持可复用,同时避免把终端用户密钥固定地写在 Agent 资源里。 # 在 Agent 上声明 MCP Server 创建 Agent 时,通过 `mcp_servers` 数组声明 MCP Server。每个 Server 需要三个字段: | 字段 | 说明 | | --- | --- | | `type` | MCP Server 的声明方式。当前统一使用 URL 方式声明,值为 `url`。 | | `name` | MCP Server 名称,最长 255 个字符。省略名称或名称不符合命名规则时,服务端会根据 `url` 生成名称;多个名称冲突时,服务端会为后续名称添加数字后缀,调用方无需保证名称唯一。为保证后续引用稳定,建议主动填写归一化后仍唯一的 `[a-z0-9_-]{1,64}` 小写名称,不依赖服务端生成。 | | `url` | MCP Server 的访问地址。同一 Agent 中不能配置重复的地址。 | 每个 `mcp_toolset` 都必须通过 `mcp_server_name` 引用一个已声明的 MCP Server。你也可以只声明 MCP Server,暂不添加对应的 `mcp_toolset`;此时该 Server 的工具不会启用。 下面的示例把一个 GitHub MCP Server 挂到 Agent: **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/agents \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "name": "GitHub 助理", "model": { "id": "doubao-seed-2-1-pro-260628" }, "mcp_servers": [ { "type": "url", "name": "github", "url": "https://mcp.example.com/github" } ], "tools": [ { "type": "agent_toolset_20260916" }, { "type": "mcp_toolset", "mcp_server_name": "github" } ] }' ``` # 控制哪些 MCP 工具可用 `mcp_toolset` 的配置方式与内置工具集一致,也支持 `default_config` 和 `configs`。两类工具在显式提供 `default_config` 但省略 `permission_policy` 时采用不同的运行时默认值:内置工具使用 `always_allow`,MCP 工具使用 `always_ask`。为避免执行行为随工具类型变化,示例应同时显式配置 `enabled` 和 `permission_policy`。 如果某个 MCP Server 暴露的工具很多,建议先整体关闭,再按白名单开启: **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/agents \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "name": "精简 GitHub 助理", "model": { "id": "doubao-seed-2-1-pro-260628" }, "mcp_servers": [ { "type": "url", "name": "github", "url": "https://mcp.example.com/github" } ], "tools": [ { "type": "mcp_toolset", "mcp_server_name": "github", "default_config": { "enabled": false, "permission_policy": { "type": "always_ask" } }, "configs": [ { "name": "list_issues", "enabled": true }, { "name": "get_issue", "enabled": true }, { "name": "add_issue_comment", "enabled": true } ] } ] }' ``` 如果只需关闭少量 MCP 工具,将 `default_config.enabled` 设为 `true`,显式配置 `default_config.permission_policy`,再在 `configs` 中把对应工具设为 `enabled: false`。完整默认矩阵请参见 [工具权限策略](/docs/tool-permission-policy)。 # 在 Session 中注入 MCP 凭据 MCP Server 的认证不在 Agent 定义阶段传入,而是在创建 Session 时通过 `vault_ids` 引用 Vaults 中的凭据。这样你可以让同一个 Agent 在不同 Session 中代表不同终端用户访问外部系统。 最简示例如下: **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/sessions \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "agent": "agent-...", "environment_id": "env-...", "vault_ids": ["vlt-..."] }' ``` Vaults 的创建方法、`mcp_oauth` / `static_bearer` 等凭据类型,以及多 Vaults 匹配规则,详情请参见 [使用 Vaults 认证](/docs/use-vaults-authentication)。 # 约束与建议 - 同一个 Agent 中,`mcp_servers.url` 不能重复;`mcp_servers.name` 冲突时,服务端会自动追加数字后缀。 - 每个 `mcp_toolset` 必须引用一个已声明的 MCP Server;只声明 MCP Server 不会启用其工具。 - 不要把终端用户 token 直接写进 Agent 定义;应通过 Vaults 在 Session 级注入。 - 对高风险 MCP 工具,建议配合 [工具权限策略](/docs/tool-permission-policy) 使用 `always_ask`。 # 相关文档 **[Agent](/docs/define-agent)** Agent 是包含基本信息、System Prompt、扩展能力的配置模板。 **[Skills](/docs/skills)** Skills 用于给 Agent 补充领域知识、操作流程和最佳实践。 **[Tools](/docs/tools)** Tools 决定 Agent 在 Session 中能主动调用哪些执行能力。 **[工具权限策略](/docs/tool-permission-policy)** 工具权限策略用于控制 Agent 发起工具调用时,是自动执行,还是暂停等待确认。 --- # Tools Source: https://ark.volcengine.com/region:cn-beijing/docs/tools 模型可以理解任务并生成内容,但无法仅靠推理直接操作文件、执行命令或访问业务系统。为 Agent 配置 Tools 后,Agent 可以调用相应的执行能力,并根据工具结果继续处理任务,完成从理解需求到执行操作的闭环。 ## 选择工具 根据任务需要访问的资源和工具执行方,选择对应的工具类型。 - 任务需要在云环境中操作文件、执行命令或获取网页信息时,使用内置工具。 - 任务需要生成图片、视频或组合视觉素材时,使用多模态工具。 - 任务需要访问已经接入 MCP Server 的外部系统时,使用 MCP 工具。 - 任务只需调用少量自有业务操作,且由业务应用执行时,使用自定义工具。 ### 使用内置工具 当任务需要在方舟提供的云环境中处理文件、运行命令或获取网页信息时,新建 Agent 使用当前内置工具集 `agent_toolset_20260916`。典型场景包括整理上传的文件、生成并运行代码,以及检索和汇总公开信息。 把 `agent_toolset_20260916` 加到 Agent 后,以下工具默认全部启用。 | 工具 | 配置名 | 说明 | | --- | --- | --- | | Bash | `bash` | 在沙箱中执行 Bash 命令。 | | Read | `read` | 读取沙箱内文件。 | | Write | `write` | 写入或覆盖沙箱内文件。 | | Edit | `edit` | 对文件执行字符串替换。 | | Glob | `glob` | 按名称查找文件。 | | Grep | `grep` | 按正则搜索文本内容。 | | Web Fetch | `web_fetch` | 抓取指定 URL 内容。 | | Web Search | `web_search` | 发起联网搜索。 | 不同版本的基础工具集包含相同的工具。历史取值仅用于兼容已有 Agent 配置,新建 Agent 使用 `agent_toolset_20260916`。 > **注意** > > Web Search 按实际调用次数计费。 ### 使用多模态工具 Seedance Managed Agent 使用 `agent_toolset_multimodal_20260825` 提供图片生成、视频生成、视觉搜索、通用搜索、视频合成和任务进度管理能力。创建 Seedance Managed Agent 时,还必须同时配置 `agent_toolset_20260916`。 | 配置名 | 事件中的工具名 | 是否必须启用 | 说明 | | --- | --- | --- | --- | | `image_generate` | `GenImage` | 是 | 生成图片。通过 `configs[].models` 绑定已开通的图片生成模型。 | | `video_generate` | `GenVideo` | 否 | 生成视频。启用时,通过 `configs[].models` 绑定已开通的视频生成模型。 | | `visual_search` | `VisualSearch` | 是 | 检索与创作任务相关的视觉素材。 | | `general_search` | `GeneralSearch` | 是 | 检索创作任务需要的通用信息。 | | `compose_video` | `ComposeVideo` | 是 | 将视频、图片和音频素材合成为视频。 | | `todo_write` | `TodoWrite` | 默认启用,可关闭 | 为复杂、长耗时任务维护待办和进度。将 `default_config.enabled` 设置为 `false` 时,需要在 `configs[]` 中显式启用该工具。 | 事件流还可能出现 `ViewMedia` 和 `record_search_quality`。这两个工具由平台自动提供,不能通过 `configs[]` 配置。工具调用的顺序和次数由任务内容决定。 多模态工具产生的模型调用费用和工具调用费用,详情请参见 [Managed Agents 计费说明](/docs/model-pricing#ma_billing)。 在请求的 `configs[].models[]` 中,每项只需填写模型 ID 或推理接入点 ID(`id`)和是否为默认模型(`default`)。每个生成工具最多配置 10 项,ID 不能重复;配置多项时,必须且只能将一项的 `default` 设置为 `true`。省略已启用生成工具的 `models` 时,服务端绑定平台默认模型,并在响应中返回实际绑定结果。响应中的模型名称(`name`)和版本(`version`)由服务端返回,不需要在请求中填写。 > **注意** > > 启用 `general_search` 时,必须在基础工具集中关闭 `web_search`。两个搜索工具同时启用时,服务端返回 400 `InvalidParameter`。 Seedance Managed Agent 的完整工具配置和执行流程,详情请参见 [[基础] 使用 Seedance Managed Agent 生成图片和视频](/docs/visual-creation-agent)。 ### 接入 MCP 工具 当任务需要访问已经通过 MCP Server 接入的外部系统,或需要复用一组标准化外部工具时,使用 MCP 工具集 `mcp_toolset`。典型场景包括查询项目数据、读取业务信息和触发外部工作流。 MCP 工具集通过 `type: "mcp_toolset"` 将一个 MCP Server 暴露的工具提供给 Agent。`mcp_server_name` 必须与 `mcp_servers[].name` 一致;只声明 MCP Server 而不添加对应的 `mcp_toolset` 时,Agent 无法调用该 Server 的工具。 可以通过 `default_config` 设置该 Server 下工具的默认状态,再通过 `configs` 按工具名称覆盖。完整配置和鉴权方式请参见 [MCP](/docs/mcp)。 显式提供 `default_config` 但省略 `permission_policy` 时,MCP 工具运行时使用 `always_ask`,内置工具使用 `always_allow`。为避免 MCP 调用意外暂停,建议显式配置权限策略。 ### 接入自定义工具 当任务只需要调用少量自有业务操作,且无需为这些操作单独部署 MCP Server 时,使用自定义工具 `custom`。典型场景包括查询订单、提交工单和触发审批。业务应用负责执行实际操作,再把结果回传给 Agent。 自定义工具通过 `type: "custom"` 声明。每个工具需要配置名称、用途描述和输入参数 Schema。以下示例使用 `curl` 创建 Agent,并使用 `jq` 保存返回的 Agent ID。示例同时显式关闭内置工具集,避免主 Agent 回退启用全部内置工具: **选项:Curl** ```Bash AGENT_RESPONSE=$(curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/agents" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "name": "CustomToolDemo", "model": { "id": "doubao-seed-2-1-pro-260915" }, "system": "你是一个可以调用业务工具的助手。需要外部业务能力时,调用已声明的自定义工具。不要编造工具结果。", "tools": [ { "type": "agent_toolset_20260916", "default_config": { "enabled": false, "permission_policy": { "type": "always_allow" } } }, { "type": "custom", "name": "query_order", "description": "根据订单 ID 查询订单状态。仅当用户要求查询订单信息时使用。", "input_schema": { "type": "object", "properties": { "order_id": { "type": "string", "description": "订单 ID。" } }, "required": ["order_id"], "additionalProperties": false } } ] }') || exit 1 jq . <<<"$AGENT_RESPONSE" || exit 1 AGENT_ID=$(jq -er '.id' <<<"$AGENT_RESPONSE") || exit 1 export AGENT_ID printf 'Agent ID: %s\n' "$AGENT_ID" ``` 配置后,Agent 需要查询订单时会发送 `agent.custom_tool_use`。业务应用读取工具名称和输入参数,执行查询,再通过 `user.custom_tool_result` 回传结果。完整接入流程和多媒体场景示例请参见 [[基础] Custom Tool 使用教程](/docs/managed-agent-custom-tool-tutorial)。 ## 配置内置工具 创建 Agent 前,先确定任务必须使用哪些工具、哪些工具可以修改数据,以及哪些调用需要业务应用确认。显式配置 `default_config.enabled` 和 `permission_policy`,再通过 `configs` 覆盖单个工具,可以避免不同工具类型的默认行为造成权限范围偏差。 > **注意** > > 不要通过省略 `tools`、传入空数组 `[]`,或只配置 MCP、自定义工具等其他工具来关闭主 Agent 的内置工具。主 Agent 在未找到内置工具集配置时会回退为启用全部内置工具,并使用 `always_allow`;如需限制工具范围,请显式配置 `agent_toolset_20260916`,将 `default_config.enabled` 设为 `false`,再逐项启用必要工具。详细行为请参见 [核对默认工具范围](/docs/tools#tool-defaults-and-boundaries)。 ### 启用全部内置工具 如果 Agent 需要使用全部基础执行能力,挂载 `agent_toolset_20260916`,并显式启用工具集和权限策略: **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/agents \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "name": "代码助理", "model": { "id": "doubao-seed-2-1-pro-260628" }, "tools": [ { "type": "agent_toolset_20260916", "default_config": { "enabled": true, "permission_policy": { "type": "always_allow" } } } ] }' ``` ### 关闭部分工具 如果 Agent 不应访问网页,可以保持工具集启用,再通过 `configs` 关闭 `web_fetch` 和 `web_search`: **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/agents \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "name": "离线文档助理", "model": { "id": "doubao-seed-2-1-pro-260628" }, "tools": [ { "type": "agent_toolset_20260916", "default_config": { "enabled": true, "permission_policy": { "type": "always_allow" } }, "configs": [ { "name": "web_fetch", "enabled": false }, { "name": "web_search", "enabled": false } ] } ] }' ``` ### 只启用必要工具 如果 Agent 只需要读取和检索沙箱文件,先将工具集整体关闭,再显式启用 `read`、`glob` 和 `grep`: **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/agents \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "name": "只读审查 Agent", "model": { "id": "doubao-seed-2-1-pro-260628" }, "tools": [ { "type": "agent_toolset_20260916", "default_config": { "enabled": false, "permission_policy": { "type": "always_ask" } }, "configs": [ { "name": "read", "enabled": true, "permission_policy": { "type": "always_allow" } }, { "name": "glob", "enabled": true, "permission_policy": { "type": "always_allow" } }, { "name": "grep", "enabled": true, "permission_policy": { "type": "always_allow" } } ] } ] }' ``` 这种配置适合代码审查和资料检索等只读任务。 ### 设置权限策略 `always_allow` 表示平台直接执行工具,`always_ask` 表示平台在执行前暂停 Session,等待业务应用确认。建议在请求中显式配置工具集的默认策略,并通过 `configs[].permission_policy` 覆盖风险更高的单个工具。 权限策略的完整配置方式请参见 [工具权限策略](/docs/tool-permission-policy)。 ## 验证和处理工具调用 创建或更新 Agent 后,按以下顺序验证配置是否生效: 1. 调用[查询智能体详情](/docs/get-agent-api),检查响应中的 `tools` 是否符合预期;使用 MCP 工具时,同时检查 `mcp_servers`。 2. 创建新 Session,或调用[升级会话](/docs/upgrade-session-api)升级现有 Session。已创建的 Session 不会自动使用 Agent 的新版本。 3. 发送一条能够触发目标工具的测试任务。 4. 检查 Session 事件,确认工具调用、执行结果和最终回复已经形成闭环。 以下以查询订单状态并整理结果为例说明主要事件流。具体事件取决于工具的执行方和权限策略。 ### 处理云环境工具调用 云环境中,方舟服务端负责执行内置工具和 MCP 工具。下图展示 Agent 发起调用、按需等待确认并返回结果的过程。`always_allow` 会直接执行工具;`always_ask` 会先暂停 Session,等待业务应用批准或拒绝。 ![托管环境中工具自动执行和按需确认的事件顺序](https://arkdocs.tos-cn-beijing.volces.com/flowcharts/managed-agent/managed-tool-event-sequence.svg) #### 自动执行 使用 `always_allow` 时,平台直接执行工具并返回结果: - 内置工具:`agent.tool_use` → `agent.tool_result` - MCP 工具:`agent.mcp_tool_use` → `agent.mcp_tool_result` 同一轮可能调用多个工具。使用 `tool_use_id` 或 `mcp_tool_use_id` 将每个结果与对应调用配对,不要只依赖事件到达顺序。 #### 确认后执行 内置工具或 MCP 工具使用 `always_ask` 时,Session 会暂停并等待确认: 1. Session 返回 `agent.tool_use` 或 `agent.mcp_tool_use`。 2. Session 返回 `session.status_idle`,其中 `stop_reason.type=requires_action`,`stop_reason.event_ids` 列出待确认的调用事件。 3. 客户端发送 `user.tool_confirmation`,通过 `tool_use_id` 指定调用事件,并将 `result` 设置为 `allow` 或 `deny`。 4. 所有待确认事件处理完成后,Session 返回 `session.status_running`。批准的工具继续执行,拒绝结果交给 Agent 调整后续处理。 > **注意:处理确认结果** > > 拒绝调用时,可以通过 `deny_message` 把原因回传给 Agent。Agent 会根据拒绝原因选择其他工具、降级处理,或向最终用户说明无法继续执行。 > > 在 `requires_action` 阶段,先处理 `stop_reason.event_ids` 中的全部确认事件,不要用新的 `user.message` 替代确认。`always_allow`、`always_ask` 及覆盖规则请参见 [工具权限策略](/docs/tool-permission-policy)。 ### 处理自托管工具调用 自托管 Environment 中的 Worker 完成内置工具后,通过 `user.tool_result` 回传结果: ![自托管环境中业务应用、Session、Worker 和企业 Sandbox 的工具交互顺序](https://arkdocs.tos-cn-beijing.volces.com/flowcharts/managed-agent/self-hosted-tool-event-sequence.svg) 1. Session 返回 `agent.tool_use`,下发内置工具调用。 2. Session 返回 `session.status_idle`,其中 `stop_reason.type=requires_action`。 3. Worker 获取对应的 Work,并在企业 Sandbox 中执行工具。 4. Worker 通过 `user.tool_result` 回传结果。`tool_use_id` 必须填写对应的 `agent.tool_use.id`;工具执行失败时,将 `is_error` 设为 `true`,并在 `content` 中返回失败说明。 5. 所有待处理结果回传后,Session 返回 `session.status_running`,Agent 根据工具结果继续处理任务。 Worker 执行期间持续调用 Heartbeat 维持 Work 租约;完整的 Poll、Acknowledge、Heartbeat 和执行环境配置流程请参见 [配置并运行自托管环境](/docs/configure-self-hosted-environment)。 ### 处理自定义工具调用 自定义工具由业务应用执行,事件闭环如下: ![Custom Tool 调用、Session 等待结果并恢复运行的完整事件顺序](https://arkdocs.tos-cn-beijing.volces.com/flowcharts/managed-agent/custom-tool-event-sequence.svg) 1. Session 返回 `agent.custom_tool_use`,其中包含工具名称、输入参数和调用事件 ID。 2. Session 返回 `session.status_idle`,其中 `stop_reason.type=requires_action`,`stop_reason.event_ids` 列出待处理的调用事件。 3. 业务应用根据工具名称和输入参数执行对应操作。 4. 业务应用发送 `user.custom_tool_result`,并将调用事件 ID 原样填入 `custom_tool_use_id`。如果同一轮存在多个待处理调用,需要分别回传结果。 5. 所有待处理结果回传后,Session 返回 `session.status_running`,Agent 根据工具结果继续处理任务。 完整接入示例请参见 [[基础] Custom Tool 使用教程](/docs/managed-agent-custom-tool-tutorial)。所有工具事件的字段结构请参见 [会话事件结构参考](/docs/sessions-events-reference-v2)。 ## 更新工具配置 更新 Agent 可以使用的工具时,`tools` 使用整体替换语义。为避免误取消其他可用工具,按照以下步骤读取、合并并写回完整 `tools` 数组: 1. 调用[查询智能体详情](/docs/get-agent-api),获取最新 `version` 和完整 `tools` 数组。 2. 在本地副本中保留不需要修改的工具,只调整目标工具。 3. 调用[更新智能体](/docs/update-agent-api),同时提交当前 `version` 和合并后的完整 `tools` 数组。 4. 再次查询 Agent,确认版本号和工具配置已经更新。 5. 创建新 Session,或升级现有 Session 后验证工具调用。 更新请求中 `tools` 的取值语义如下: | 取值 | 配置结果 | 使用建议 | | --- | --- | --- | | 省略或 `null` | 保留当前 `tools` 配置。 | 只修改其他 Agent 字段时使用。 | | 空数组 `[]` | 只清空已保存的 `tools` 配置,不会关闭主 Agent 的内置工具。主 Agent 运行时仍会回退为启用全部内置工具,并使用 `always_allow`。 | 如需限制内置工具,改用显式工具集配置。 | | 非空数组 | 使用请求中的数组整体替换当前配置。 | 先读取并合并所有需要保留的工具。 | ## 排查工具问题 先根据 Session 事件流定位中断点,再执行对应检查: - 未出现目标工具的调用事件:核对 Agent 配置、Session 版本和任务触发条件。 - 出现 `stop_reason.type=requires_action`:根据阻塞事件类型回传确认或工具结果。 - 工具结果包含错误:根据调用 ID 定位输入、权限或执行环境。 - 出现 `session.error`:根据错误类型和重试状态决定等待、修正后重试或创建新 Session。 - 工具可以执行但权限范围过大:核对文件、网络和凭据隔离边界。 ### 核对配置、版本和触发条件 如果事件流中没有出现 `agent.tool_use`、`agent.mcp_tool_use` 或 `agent.custom_tool_use`,按以下顺序检查: 1. 查询 Agent,确认目标工具或工具集已经保存。MCP 工具还需要检查 `mcp_servers`。 2. 确认当前 Session 使用的 Agent 版本;Agent 更新不会自动影响已创建的 Session。 3. 按工具类型核对配置与触发条件。 4. 使用相同的明确测试任务比较新旧 Session,避免把任务差异误判为版本问题。 | 工具类型 | 配置检查 | 任务触发条件 | | --- | --- | --- | | 内置工具 | `tools` 中包含 `type: "agent_toolset_20260916"`;根据 `default_config.enabled` 和 `configs` 的覆盖结果确认目标工具已启用。 | 测试任务明确要求读取实际文件、执行命令或访问网页,并提供文件路径、命令目标或检索主题。纯文本问答不要求调用工具。 | | MCP 工具 | `mcp_servers[].name` 与 `tools[].mcp_server_name` 一致;根据 `default_config` 和 `configs` 确认目标 MCP 工具已启用。 | 测试任务明确要求访问对应外部系统,并提供项目、记录或其他业务标识。 | | 自定义工具 | `tools` 中包含 `type: "custom"`,并保存了正确的 `name`、`description` 和 `input_schema`。`description` 需要说明适用条件。 | 测试任务明确要求执行该业务操作,并提供 `input_schema` 中的必需信息。 | Agent 会根据任务内容和工具说明判断是否调用工具。单次未调用不能直接证明配置无效;应先使用明确要求目标能力的测试任务复现。 #### 核对默认工具范围 主 Agent 与子 Agent 在未配置内置工具集时采用不同的运行时行为: | 配置 | 主 Agent | 子 Agent | 建议 | | --- | --- | --- | --- | | 省略 `tools`、传 `[]`,或只配置其他工具类型 | 回退为启用全部内置工具,权限策略为 `always_allow`。 | 不提供内置工具;Session 启用的 Memory 工具不受此规则影响。 | 不依赖省略行为,显式配置内置工具集。 | | 配置 `agent_toolset_20260916`,省略 `default_config` | 服务端保存 `enabled=true` 和 `always_allow`。 | 按相同配置提供内置工具。 | 在请求中显式写出启用状态和权限策略。 | | 配置 `default_config.enabled=false`,再逐项启用 | 只提供 `configs` 中显式启用的工具。 | 只提供 `configs` 中显式启用的工具。 | 需要最小工具集时使用。 | 判断子 Agent 是否实际执行工具时,以子线程中的 `agent.tool_use` 和 `agent.tool_result` 为准。System Prompt 或最终回复中声称已执行工具,不代表运行环境实际提供或执行了该工具。 #### 核对默认权限策略 权限策略存在以下默认分支: | 配置 | 内置工具 | MCP 工具 | | --- | --- | --- | | 整个 `default_config` 省略 | 服务端保存 `always_allow`。 | 服务端保存 `always_allow`。 | | 已提供 `default_config`,但省略 `permission_policy` | 运行时使用 `always_allow`。 | 运行时使用 `always_ask`。 | | 显式配置 `permission_policy` | 使用配置的 `always_allow` 或 `always_ask`。 | 使用配置的 `always_allow` 或 `always_ask`。 | ### 处理 requires_action Session 返回 `stop_reason.type=requires_action` 时,先读取 `stop_reason.event_ids`,再根据每个阻塞事件的类型执行对应操作: | 阻塞事件 | 场景 | 处理方式 | | --- | --- | --- | | `agent.tool_use` 或 `agent.mcp_tool_use` | 云环境中的工具使用 `always_ask`。 | 发送 `user.tool_confirmation`,将阻塞事件 ID 填入 `tool_use_id`,并设置 `allow` 或 `deny`。确认 MCP 调用时也使用 `tool_use_id`;`mcp_tool_use_id` 仅用于关联 `agent.mcp_tool_result`。 | | `agent.tool_use` | 自托管 Environment 中的 Worker 执行内置工具。 | Worker 完成执行后发送 `user.tool_result`,使用 `tool_use_id` 关联调用;失败时设置 `is_error: true` 并返回错误说明。 | | `agent.custom_tool_use` | 业务应用执行自定义工具。 | 发送 `user.custom_tool_result`,使用 `custom_tool_use_id` 关联调用;失败时设置 `is_error: true` 并返回错误说明。 | 同一轮可能包含多个阻塞事件。处理 `stop_reason.event_ids` 中的全部事件后,Session 才会恢复运行。不要用新的 `user.message` 代替确认或工具结果。 ### 排查工具结果错误 工具结果包含错误时,先关联对应的调用事件,再定位执行方: - `agent.tool_result`:通过 `tool_use_id` 检查原始工具输入,再核对文件路径、Environment 权限、网络策略和执行日志。 - `agent.mcp_tool_result`:通过 `mcp_tool_use_id` 检查原始工具输入,再核对 MCP 工具启用状态、凭据和 Server 返回信息。 - `user.tool_result` 或 `user.custom_tool_result`:检查业务应用或 Worker 的执行日志,确认 `is_error`、`content` 和调用 ID 与实际结果一致。 工具结果尚未处理完成时,不要重复发送原始任务,否则同一工具可能重复执行。 ### 处理 Session 错误 `session.error` 不一定由工具配置引起。先读取 `error.type`、`error.message` 和 `error.retry_status.type`,并结合错误前的最后一个事件定位问题。 | 重试状态 | 处理方式 | | --- | --- | | `retrying` | 服务端正在自动重试。继续消费事件,不要重复发送任务。 | | `exhausted` | 当前轮次的重试次数已用尽。等待 Session 恢复为 `idle`,修正输入或配置后再发送任务。 | | `terminal` | Session 将进入 `terminated`,不能继续发送事件。修正配置后创建新 Session。 | 如果错误发生在 MCP 调用阶段,按错误类型继续检查: - `mcp_authentication_failed_error`:检查 MCP Server 的鉴权配置、Session 引用的 Vaults 和凭据有效性。 - `mcp_connection_failed_error`:检查 MCP Server URL、网络连通性和服务状态。 修正 MCP 配置后,更新 Agent,并创建新 Session 或升级现有 Session。如果 `error.type` 不是 MCP 相关类型,且错误前没有工具调用事件,优先排查模型调用或 Session 运行问题,不要把所有 `session.error` 都归因于工具。事件字段和其他错误类型请参见 [会话事件结构参考](/docs/sessions-events-reference-v2)。 ### 核对文件和网络隔离 > **注意** > > 关闭 `write`、`edit`、`web_fetch` 或 `web_search` 不等于完成强隔离。`read`、`glob` 和 `grep` 仍可能访问敏感文件;如果 Agent 仍可使用 `bash`,或者 Environment 允许不受限联网,命令仍可能读取或修改文件并访问网络。需要强隔离时,同时收敛内置工具、Environment 文件和网络策略,以及外部凭据权限。 ## 相关文档 **[Agent](/docs/define-agent)** Agent 是包含基本信息、System Prompt、扩展能力的配置模板。 **[Skills](/docs/skills)** Skills 用于给 Agent 补充领域知识、操作流程和最佳实践。 **[MCP](/docs/mcp)** MCP(Model Context Protocol)用于把第三方系统的工具与数据源接入 Agent。 **[工具权限策略](/docs/tool-permission-policy)** 工具权限策略用于控制 Agent 发起工具调用时,是自动执行,还是暂停等待确认。 --- # 工具权限策略 Source: https://ark.volcengine.com/region:cn-beijing/docs/tool-permission-policy 工具权限策略用于控制 Agent 发起工具调用时,是自动执行,还是暂停等待确认。 当前权限策略只作用于服务端执行的工具: - 内置工具集 `agent_toolset_20260916` - 多模态工具集 `agent_toolset_multimodal_20260825` - MCP 工具集 `mcp_toolset` ## 权限策略类型 | 策略 | 说明 | | --- | --- | | `always_allow` | 工具调用自动执行,不需要人工确认。 | | `always_ask` | 工具调用前暂停,等待确认后再继续。 | 权限策略的默认值取决于是否提供整个 `default_config`: | 配置 | 内置工具集 | MCP 工具集 | | --- | --- | --- | | 省略整个 `default_config` | 服务端保存 `enabled=true` 和 `always_allow`。 | 服务端保存 `enabled=true` 和 `always_allow`。 | | 提供 `default_config`,但省略 `permission_policy` | 运行时使用 `always_allow`。 | 运行时使用 `always_ask`。 | | 显式配置 `permission_policy` | 使用配置的策略。 | 使用配置的策略。 | 为了让 Agent 回显和运行时行为可直接核对,建议始终显式配置 `default_config.enabled` 和 `default_config.permission_policy`。 ## 为整个工具集设置权限策略 你可以在 `default_config.permission_policy` 中为整个工具集配置统一策略。 下面的示例把内置工具集的默认策略改成 `always_ask`: **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/agents \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "name": "谨慎执行 Agent", "model": { "id": "doubao-seed-2-1-pro-260628" }, "tools": [ { "type": "agent_toolset_20260916", "default_config": { "enabled": true, "permission_policy": { "type": "always_ask" } } } ] }' ``` 不要只传 `default_config.enabled` 而省略 `permission_policy`。内置工具和 MCP 工具对空策略采用不同的运行时默认值。 ## 为单个工具覆盖权限策略 除了为整个工具集设置默认策略外,你还可以在 `configs` 中对单个工具做更细粒度的覆盖。 下面的示例保留内置工具集默认自动执行,但要求 `bash` 每次执行前都先确认: **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/agents \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "name": "命令审慎 Agent", "model": { "id": "doubao-seed-2-1-pro-260628" }, "tools": [ { "type": "agent_toolset_20260916", "default_config": { "enabled": true, "permission_policy": { "type": "always_allow" } }, "configs": [ { "name": "bash", "enabled": true, "permission_policy": { "type": "always_ask" } } ] } ] }' ``` 这种覆盖关系适合把大部分低风险工具保持自动执行,只对高风险工具额外加一道确认。 ## 为 MCP 工具集设置权限策略 下面的示例将可信 MCP Server 的工具集显式设置为 `always_allow`,便于直接核对自动执行范围: **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/agents \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "name": "GitHub 协作 Agent", "model": { "id": "doubao-seed-2-1-pro-260628" }, "mcp_servers": [ { "type": "url", "name": "github", "url": "https://mcp.example.com/github" } ], "tools": [ { "type": "agent_toolset_20260916", "default_config": { "enabled": true, "permission_policy": { "type": "always_allow" } } }, { "type": "mcp_toolset", "mcp_server_name": "github", "default_config": { "enabled": true, "permission_policy": { "type": "always_allow" } } } ] }' ``` > **注意** > > 只有在确认 MCP Server 及其暴露工具都可信时,才将策略显式设置为 `always_allow`。如果 MCP Server 后续新增工具,工具集级的自动放行策略也会作用于新增工具。 ## 使用建议 - 对只读工具,可以优先考虑 `always_allow`。 - 对会修改文件、执行命令或访问外部系统的工具,建议优先考虑 `always_ask`。 - 对 MCP 工具,建议先按最小权限原则收敛 `configs`,再决定是否自动放行。 工具集配置以及 `user.tool_confirmation` 对应的运行时事件流,详见 [Tools](/docs/tools)。如果你要管理 MCP Server 及其工具,详情请参见 [MCP](/docs/mcp)。 ## 相关文档 **[Agent](/docs/define-agent)** Agent 是包含基本信息、System Prompt、扩展能力的配置模板。 **[Skills](/docs/skills)** Skills 用于给 Agent 补充领域知识、操作流程和最佳实践。 **[MCP](/docs/mcp)** MCP(Model Context Protocol)用于把第三方系统的工具与数据源接入 Agent。 **[Tools](/docs/tools)** Tools 决定 Agent 在 Session 中能主动调用哪些执行能力。 --- # 模型支持的参数列表 Source: https://ark.volcengine.com/region:cn-beijing/docs/model-parameter-support 本文介绍方舟 Managed Agents 在定义 Agent 或创建 Session 时可配置的 `thinking`、`reasoning_effort` 和 `service_tier` 参数,并列出当前各模型对思考与服务档位参数的支持情况。 Managed Agents 会根据目标模型版本分别校验 `thinking`、`reasoning_effort` 和 `service_tier`。在创建 Agent、更新 Agent 或临时覆写 Session 模型参数前,应先确认目标模型版本是否支持对应取值。 > **注意** > > 模型支持范围可能随模型版本发布而变化,各字段实际支持的取值和默认值以目标模型版本为准。调用时,如果传入当前模型不支持的取值,Managed Agents 会返回 400 `InvalidParameter`。 # 模型参数字段 | 字段 | 可选取值 | 说明 | | ------------------------ | ---------------------------------------------------- | ----------------------------------------------------------- | | `model.id` | 模型 ID 或推理接入点 ID | Agent 使用的模型或推理接入点。使用推理接入点 ID 时,Managed Agents 根据接入点关联的模型校验运行参数。 | | `model.thinking` | `enabled`、`disabled`、`auto` | 思考开关,对应底层模型调用的 `thinking.type` 字段。`auto` 表示由模型判断是否思考,不表示继承。 | | `model.reasoning_effort` | `none`、`minimal`、`low`、`medium`、`high`、`xhigh`、`max` | 推理投入档位,对应底层模型调用的 `reasoning_effort` 字段。不同模型支持的档位不同。 | | `model.service_tier` | `auto`、`default`、`fast` | 推理服务档位,对应底层模型调用的 `service_tier` 字段。只有部分模型版本支持 `fast` 快速档位。 | > **说明** > > 创建或更新 Agent 时,`model.id` 支持模型 ID 和推理接入点 ID。创建 Session 时,`agent_with_overrides.model.id` 仅支持模型 ID;Dream 的 `model` 字段也仅支持模型 ID。如果基础 Agent 使用推理接入点,Session 响应中的模型快照仍会返回该推理接入点 ID。 # 默认值与校验规则 - 不设置 `thinking`、`reasoning_effort` 或 `service_tier`,或在 Agent 定义中传空字符串时,Managed Agents 会优先使用模型元数据中的默认值。 - 如果模型元数据未配置默认值,Managed Agents 不会向底层模型调用传递对应字段,由底层模型服务按默认策略处理。 > **注意** > > Seedance Managed Agent 不使用 `reasoning_effort` 的模型默认值。创建 Seedance Managed Agent 时,省略 `reasoning_effort` 会由服务端补齐为 `high`;显式填写时只能设置为 `high`,其他值会返回 400 `InvalidParameter`。从控制台的 Seedance Managed Agent 创建页面展示的模型中选择,并确认该模型支持 `high`。 # 支持模型与参数列表 表中取值后标注“默认”的值,表示该模型版本的默认值。 | 模型 ID | `thinking` | `reasoning_effort` | `service_tier` | | ------------------------------ | -------------------- | ----------------------------- | --------------------- | | `doubao-seed-evolving` | enabled(默认)、disabled | low、medium、high(默认)、minimal | auto、default(默认) | | `doubao-seed-2-1-pro-260915` | enabled(默认)、disabled | low、medium、high(默认)、minimal | auto、default(默认) | | `doubao-seed-2-1-lite-260915` | enabled(默认)、disabled | low、medium、high(默认)、minimal | auto、default(默认) | | `doubao-seed-2-1-pro-260628` | enabled(默认)、disabled | low、medium、high(默认)、minimal | auto、default(默认) | | `doubao-seed-2-1-turbo-260628` | enabled(默认)、disabled | low、medium、high(默认)、minimal | auto、default(默认)、fast | | `doubao-seed-2-0-lite-260428` | enabled(默认)、disabled | low、medium(默认)、high、minimal | auto、default(默认)、fast | | `deepseek-v4-pro-260425` | enabled(默认)、disabled | low、high(默认)、max、minimal | auto、default(默认) | | `deepseek-v4-pro-ga-260813` | enabled(默认)、disabled | none、low、high(默认)、max、minimal | auto、default(默认) | | `deepseek-v4-flash-ga-260731` | enabled(默认)、disabled | none、low、high(默认)、max、minimal | auto、default(默认) | | `glm-5-2-260617` | enabled(默认)、disabled | none、minimal、high、max(默认) | auto、default(默认) | # 支持快速服务档位的模型 以下模型版本支持 `service_tier: "fast"`: - `doubao-seed-2-1-turbo-260628` - `doubao-seed-2-0-lite-260428` 其他模型版本当前支持 `auto` 和 `default`,默认值为 `default`。 > **注意** > > `service_tier: "fast"` 只表示请求快速服务档位,不改变模型本身的能力边界。配置快速档位前,应确认业务能够接受对应模型版本的能力边界和推理参数限制。 # 配置示例 创建 Agent 时,可以在 `model` 对象中显式配置支持的运行参数: ```json { "model": { "id": "doubao-seed-2-1-turbo-260628", "thinking": "enabled", "reasoning_effort": "high", "service_tier": "fast" } } ``` 如果只希望使用模型默认策略,可以只设置 `model.id`。`model.id` 的取值可以是模型 ID 或推理接入点 ID;以下示例使用模型 ID: ```json { "model": { "id": "doubao-seed-2-1-turbo-260628" } } ``` --- # 配置云环境 Source: https://ark.volcengine.com/region:cn-beijing/docs/configure-cloud-environment 本文介绍如何为方舟 Managed Agents 创建和管理云端沙箱环境,包括预装依赖包、环境变量、启动脚本和产物存储。 **Environment** 描述 Agent 运行时使用的沙箱模板。一个 Environment 可以被多个 Session 复用,但每个 Session 会启动独立的沙箱实例,文件系统状态彼此隔离。 Managed Agents 同时支持云环境和自托管环境。本页只介绍由方舟管理沙箱的云环境。如果你需要在企业基础设施中执行工具或访问内网资源,选择自托管环境,详情请参见 [自托管环境概述](/docs/self-hosted-environment-overview)。 ## 创建环境 你可以在控制台的 [Environments](https://ark.volcengine.com/region:cn-beijing/managed-agents/environments?projectName=default) 页面创建 Environment,也可以使用 API 创建。 在控制台单击 **创建 Environment**,按需配置以下内容: - 类型:选择云托管环境。 - 预装包:配置沙箱启动前安装的系统包和语言依赖。 - 环境变量:配置注入沙箱进程的非敏感键值对。 - 初始化脚本:配置沙箱启动阶段执行的脚本。 - 产物存储:可选。需要长期保留 Agent 产物时,选择自己的 TOS 目录;不选择时使用方舟公共 TOS。 > **说明** > > 创建 Environment 时使用清晰且唯一的名称,便于区分开发、测试和生产等不同用途。 参考以下示例代码,使用 API 创建环境: ```bash environment=$( curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/environments" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d @- <<'EOF' { "name": "", "config": { "type": "cloud", "networking": { "type": "unrestricted" }, "packages": { "pip": ["pandas"], "apt": ["curl"] }, "env": { "MY_KEY_0": "value_0", "MY_KEY_1": "value_1" } } } EOF ) ENVIRONMENT_ID=$(jq -er '.id' <<<"$environment") echo "Environment ID: $ENVIRONMENT_ID" ``` 主要配置项: - `name`:Environment 名称,在当前项目内需要唯一。 - `description`:Environment 的说明信息。 - `config.type`:运行环境类型,云托管环境取值为 `cloud`。 - `config.networking.type`:沙箱的出站网络访问策略。`unrestricted` 允许完整出站网络访问,但仍受通用安全拦截列表限制。 - `config.packages`:沙箱启动前预安装的依赖包。依赖会在使用同一 Environment 的 Session 之间缓存。若同时配置多个包管理器,系统按 `apt`、`cargo`、`gem`、`go`、`npm`、`pip` 的顺序执行。依赖版本可以显式锁定,未指定版本时安装最新版本。 | 字段 | 包管理器 | 示例 | |------|----------|------| | `apt` | 系统包(apt-get) | `"ffmpeg"` | | `cargo` | Rust(cargo) | `"ripgrep@14.0.0"` | | `gem` | Ruby(gem) | `"rails:7.1.0"` | | `go` | Go modules | `"golang.org/x/tools/cmd/goimports@latest"` | | `npm` | Node.js(npm) | `"express@4.18.0"` | | `pip` | Python(pip) | `"pandas==2.2.0"` | - `config.env`:注入沙箱进程的环境变量。需要让 Agent 读取非敏感业务参数时配置,例如时区或服务地址。 - `config.setup_script`:沙箱启动阶段执行的初始化脚本。需要在每次启动沙箱时准备目录、下载资源或执行自定义初始化命令时配置。 - `config.tos`:Agent 最终产物的 TOS 存储位置。需要长期保留 Agent 生成的报告、文件或代码时配置;不配置时产物使用方舟公共 TOS。 ## 配置产物存储 需要将产物长期保存在自己的 TOS Bucket 时,为 Environment 配置 `config.tos`;继续使用方舟公共 TOS 时,省略该字段。`config.tos` 控制平台将 outputs 产物注册到 Files API 时使用的持久化位置,不等同于 `resources` 中 `type: tos` 的沙箱挂载目录。 | 你的配置 | 产物位置 | 你需要做什么 | | --- | --- | --- | | 不配置 `config.tos` | 方舟公共 TOS | 在平台 TTL 到期前下载所需文件。删除 Session 时,平台会清理默认存储中的关联产物。 | | 配置 `config.tos` | 你的 TOS Bucket。平台从 outputs 目录注册产物时,Files API 写入前缀为 `{prefix}outputs/{env-id}/{session-id}/`;最终对象路径以响应中的 `tos.object_key` 为准 | 在 TOS 中管理对象生命周期。删除 Session 不会删除 Bucket 中的对象。 | 将产物写入自己的 TOS Bucket 时,需要满足以下条件: - 目标 Bucket 已在方舟项目中完成授权,详情请参见 [用户对象存储(TOS)授权](/docs/project-configuration#4eb1b277)。 - Bucket 与 Managed Agents 服务须部署在同一地域,跨地域 Bucket 会在预检查阶段被拒绝。 - `bucket` 和 `prefix` 必须同时提供,不能只配置其中一个字段。 - `prefix` 使用相对路径,例如 `ark-files/`。 - 平台从 outputs 目录注册产物时,会在该前缀后追加 `outputs/{env-id}/{session-id}/` 作为 Files API 写入前缀。最终对象路径以响应中的 `tos.object_key` 为准,通常还会包含 `ark_processed/{file_id}/{file_type}/{filename}`。 - 直接调用 Files API 并传入 `tos[prefix]` 时,不会追加 Environment ID 或 Session ID,但 Files API 仍会在该前缀下生成服务侧处理目录。 以下示例演示创建带产物存储的 Environment、更新存储位置,以及清空配置,使后续 Session 改用方舟公共 TOS: ```Bash # Create an environment that stores outputs in your TOS bucket. environment=$( curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/environments" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d @- <<'EOF' { "name": "", "config": { "type": "cloud", "networking": { "type": "unrestricted" }, "tos": { "bucket": "", "prefix": "ark-files/" } } } EOF ) ENVIRONMENT_ID=$(jq -er '.id' <<<"$environment") echo "Environment ID: $ENVIRONMENT_ID" # Example output: Environment ID: env-20260723142038-xxxxx # Replace the output storage configuration for future sessions. updated_environment=$( curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/environments/$ENVIRONMENT_ID" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d @- <<'EOF' { "config": { "tos": { "bucket": "", "prefix": "new-prefix/" } } } EOF ) jq '{id, tos: .config.tos}' <<<"$updated_environment" # Example output: # { # "id": "env-20260723142038-xxxxx", # "tos": {"bucket": "", "prefix": "new-prefix/"} # } # Clear the configuration so future sessions use the default storage. cleared_environment=$( curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/environments/$ENVIRONMENT_ID" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "config": { "tos": {} } }' ) jq '{id, tos: (.config.tos // null)}' <<<"$cleared_environment" # Example output: # { # "id": "env-20260723142038-xxxxx", # "tos": null # } ``` > **注意** > > 先更新 Environment,再创建需要使用新存储配置的 Session。已有 Session 使用创建时冻结的配置快照,不会自动切换到新的 Bucket 或 `prefix`。 ## 在 Session 中使用环境 创建 Environment 后,在创建 Session 时传入 `environment_id`,即可复用该 Environment 的运行配置和产物存储配置。 ```bash session=$( curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/sessions" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d @- < ## 环境生命周期 - 多个 Session 可以引用同一个环境,但每个 Session 都会获得独立的沙箱实例。 - Session 之间不共享文件系统状态。 - 环境本身不做版本化管理。如果你频繁更新环境配置,建议在业务侧记录变更,以便追溯某个 Session 使用的是哪一版环境。 - Environment 被 `idle` 或 `running` 状态的 Session 引用时不能删除。删除前,先终止或删除这些 Session;其他状态的 Session 不会阻止删除 Environment。 ## 管理环境 你可以列出、查看、更新或删除 Environment。 ```bash # List environments environments=$( curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/environments" \ -H "Authorization: Bearer $ARK_API_KEY" ) # Retrieve a specific environment environment=$( curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/environments/$ENVIRONMENT_ID" \ -H "Authorization: Bearer $ARK_API_KEY" ) # Update environment description environment=$( curl -sS --fail-with-body -X POST "https://ark.cn-beijing.volces.com/api/v3/environments/$ENVIRONMENT_ID" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d @- <<'EOF' { "description": "" } EOF ) # Delete an environment (only if no sessions reference it) curl -sS --fail-with-body -X DELETE \ "https://ark.cn-beijing.volces.com/api/v3/environments/$ENVIRONMENT_ID" \ -H "Authorization: Bearer $ARK_API_KEY" ``` ## 预置运行时 云沙箱默认包含常见语言运行时、数据库和工具。需要确认具体内置版本、目录用途或完整清单时,详情请参见 [云沙箱参考](/docs/cloud-sandbox-reference)。 --- # 云沙箱参考 Source: https://ark.volcengine.com/region:cn-beijing/docs/cloud-sandbox-reference 本文介绍 Managed Agents 云端沙箱预安装的编程语言、数据库、常用工具(Utilities)和基础资源规格,便于在配置环境或评估任务依赖时快速参考。 云端沙箱运行在方舟提供的隔离 Linux 容器中。运行时、数据库客户端和常用命令行工具已预安装,Agent 可以直接使用。 > 本文中规格描述适用于 `cloud` 类型的 Environments。 ## 编程语言 预装常见编程语言及其对应的包管理工具,可直接用于脚本执行、项目构建和依赖安装。 | 编程语言 | 版本 | 包管理工具 | | --- | --- | --- | | Python | 3.12+ | pip, uv | | Node.js | 20+ | npm, yarn, pnpm | | Go | 1.25+ | go modules | | Rust | 1.77+ | cargo | | Java | 21+ | maven, gradle | | Ruby | 3.3+ | bundler, gem | | PHP | 8.3+ | composer | | C/C++ | GCC 13+ | make, cmake | ## 数据库 默认提供轻量数据库和数据库客户端,适合本地数据处理,或连接外部数据库/实例。 | 数据库 | 描述 | | --- | --- | | SQLite | 已预安装,可立即使用 | | PostgreSQL 客户端 | 用于连接外部数据库的 `psql` 客户端。 | | Redis 客户端 | 用于连接外部 Redis 实例的 `redis-cli`。 | - SQLite 可在本地使用。 - 数据库服务器,例如 PostgreSQL 和 Redis,默认不在沙箱环境中运行。沙箱提供用于连接的客户端工具。 ## Utilities 工具 内置多类常用工具,覆盖系统操作、开发构建、文件搜索、进程查看和文本处理等场景。 ### 系统工具 | 工具 | 描述 | | --- | --- | | `git` | 版本控制。 | | `curl`, `wget` | HTTP 客户端。 | | `jq` | JSON 处理。 | | `tar`, `zip`, `unzip` | 归档、压缩与解压工具。 | | `ssh`, `scp` | 远程访问与文件传输工具(需要启用网络)。 | | `tmux`, `screen` | 终端多路复用工具。 | ### 开发工具 | 工具 | 描述 | | --- | --- | | `make`, `cmake` | 构建系统。 | | `ripgrep` (`rg`) | 快速文件搜索。 | | `tree` | 目录结构可视化。 | | `htop` | 进程监控。 | ### 文本处理 | 工具 | 描述 | | --- | --- | | `sed`, `awk`, `grep` | 流式文本处理工具。 | | `vim`, `nano` | 文本编辑器。 | | `diff`, `patch` | 文件比较与补丁工具。 | ## 沙箱规格 以下为云端沙箱的基础资源规格,可用于评估运行时资源和网络能力。 | 属性 | 具体配置 | | --- | --- | | 操作系统 | Ubuntu 22.04 LTS | | 架构 | x86_64 (amd64) | | 内存 | 4 GB | | 磁盘空间 | 10 GB | | 网络 | 默认开启 | ## 关键目录及 Agent 权限 云端沙箱的文件系统按用途划分为**工作区**、**挂载目录**和**临时目录**三类。挂载目录 `/mnt` 下进一步区分只读的知识与资源(Memory、Skills、上传文件)和读写的产出与存储(Outputs、Storage)。Agent 通过标准文件工具访问这些目录,权限由平台强制约束。 ### 目录布局 ```text / ├── workspace/ # 工作区,读写,Agent 的主要工作目录 │ └── AGENTS.md # System Prompt,只读 ├── mnt/ # 挂载目录 │ ├── memory/ # Agent Memory,只读,见 persistent-memory │ ├── skills/ # Agent Skills,只读,见 skills │ └── session/ │ ├── uploads/ # 用户上传文件挂载目录,只读,见 upload-and-mount-files │ ├── outputs/ # Agent 产出目录,读写,通过 Files API 注册和下载 │ └── storage/ # 通过 Session resources 挂载的 TOS 目录,读写 └── tmp/ # 临时目录,读写 ``` ### 目录权限 | 目录 | 用途 | Agent 读权限 | Agent 写权限 | | --- | --- | --- | --- | | `$HOME` | 用户 Home | ✓ | ✓ | | `/workspace` | 工作区,Agent 的主要工作目录 | ✓ | ✓ | \ | | | | | \ | | **注意**:`/workspace/AGENTS.md`(System Prompt)为 read-only 权限。 | | | | `/mnt` | 挂载目录 | ✓ | ✓ | | `/mnt/memory` | Agent Memory 目录,参见 [Memory](/docs/persistent-memory) | ✓ | ✗ | | `/mnt/skills` | Agent Skills 目录,参见 [Skills](/docs/skills) | ✓ | ✗ | | `/mnt/session/uploads` | Files API 上传文件挂载目录,参见 [上传并挂载文件](/docs/upload-and-mount-files) | ✓ | ✗ | | `/mnt/session/outputs` | Agent 产出目录。写入这里的文件会注册到 Files API;需要将产物写入自己的 TOS Bucket 时,为 Environment 配置 `config.tos` | ✓ | ✓ | | `/mnt/session/storage` | Session 的 TOS 资源挂载目录,详情请参见 [上传与挂载文件](/docs/upload-and-mount-files) | ✓ | ✓ | | `/tmp` | 临时目录 | ✓ | ✓ | | 其它任意路径 | - | ✗ | ✗ | ### 区分产物存储与 TOS 资源挂载 `/mnt/session/outputs` 和 `/mnt/session/storage` 都可能关联 TOS,但用途不同: | 能力 | 沙箱路径 | 用途 | | --- | --- | --- | | Environment 产物存储 | `/mnt/session/outputs` | Agent 写入最终交付物。不配置 `config.tos` 时使用方舟公共 TOS;需要写入自己的 TOS Bucket 时配置该字段。Agent 使用的沙箱路径不变。 | | Session TOS 资源 | `/mnt/session/storage` | 将已有 TOS 对象作为 Session 输入或共享数据挂载到沙箱,通过 `resources` 配置。 | Environment 产物存储的配置方法,详情请参见 [配置产物存储](/docs/configure-cloud-environment#configure-output-storage)。 ### 使用规则 Agent 在沙箱中读写文件时应遵循以下规则,避免误改只读资源或将中间产物遗留到用户可见目录: - **主要工作目录**:使用 `/workspace` 存放项目文件、中间构建产物、脚本执行结果等 Agent 的主要工作内容。 - **读取用户输入**:从 `/mnt/session/uploads` 读取用户通过 Files API 上传的文件;该目录只读,如需修改,请在 `/workspace` 或 `/mnt/session/outputs` 下创建派生文件。 - **写入最终产物**:将需要回传给用户的最终交付物写入 `/mnt/session/outputs`;写入此目录的文件会注册到 Files API,并按 Environment 或 Session 覆写指定的位置存储。 - **跨 Session 复用数据**:需要让多个 Session 读写同一批业务文件时,通过 Session `resources` 将 TOS 目录挂载到 `/mnt/session/storage`。 - **临时文件**:使用 `/tmp` 存放临时缓存和命令中间结果;生命周期随 Session。 - **只读挂载**:不要修改 `/mnt/memory`、`/mnt/skills`、`/mnt/session/uploads`;这些目录承载 Agent 的记忆、能力和用户输入资源。 - **产物路径回报**:如生成了最终交付文件,在最终响应中告知用户对应的文件路径。 --- # 自托管环境概述 Source: https://ark.volcengine.com/region:cn-beijing/docs/self-hosted-environment-overview 本文介绍方舟 Managed Agents 自托管环境(Self-hosted Environment)的适用场景、工作原理和能力边界,帮助你判断是否应该选择自托管环境。 ## 什么是自托管环境 自托管环境将 Agent 的工具执行、文件系统和网络放在企业自己的基础设施,而方舟继续托管模型推理、Agent 编排、Session 管理与事件流。 **方舟负责**: - 模型推理与 Agent 编排 - Session 生命周期管理 - 事件流持久化与实时推送 - Work Queue 的生成与调度 **企业负责**: - 部署 Worker 进程,轮询并执行 Work Item - 提供 Sandbox 执行环境(容器、VM 或物理机) - 管理文件系统、网络策略和内部工具访问 - 控制镜像、计算资源和审计 自托管环境继续使用方舟托管的 Agent 编排、Session 生命周期和事件协议,但执行面能力与云环境不同。自托管 Session 不支持通过 `resources` 挂载 Files、Memory Store 或 TOS 对象,也不能通过 Environment 配置依赖包、环境变量、网络策略和产物存储。相关输入、运行时配置与产物转存需要由企业在 Worker 与 Sandbox 中自行准备和管理。 ## 适用场景 以下场景适合使用自托管环境: - **敏感代码或文件不能进入平台云沙箱**:数据合规要求企业代码、密钥或内部文件不离开企业控制范围。 - **Agent 需要访问企业内网 API、数据库或代码仓库**:工具调用需要访问仅在企业内网可达的服务,无法通过公网暴露。 - **企业需要控制镜像、网络策略和计算资源**:对 Agent 执行环境有定制化要求,需要指定操作系统、预装工具或网络白名单。 - **企业已有容器、Kubernetes 或 MicroVM 基础设施**:希望复用现有集群调度、监控和日志体系。 ## 不适用场景 以下场景不建议使用自托管环境: - **希望零运维、按需自动拉起 Sandbox**:云环境由方舟全托管,无需企业部署和维护 Worker。 - **不具备安全隔离工具执行的能力**:自托管环境要求企业自行实现 Sandbox 隔离,否则 Agent 可能越权访问主机资源。 - **仅需调用少量外部业务函数**:如果工具只是调用企业已有的 HTTP API,优先考虑 [Custom Tool](/docs/tools) 或 [MCP](/docs/mcp),无需部署 Worker。 ## 与云环境的区别 | 维度 | 云环境 | 自托管环境 | | --- | --- | --- | | 执行位置 | 方舟云沙箱 | 企业基础设施 | | Sandbox 生命周期 | 方舟管理 | 企业管理 | | 文件与网络 | 方舟环境策略 | 企业策略 | | 依赖包与环境变量 | 通过 Environment 配置 | 企业自行管理 | | Session 资源 | 可以通过 `resources` 挂载 Files、Memory Store 或 TOS 对象 | 不支持通过 `resources` 挂载;输入文件由企业执行面准备 | | 产物存储 | 可以通过 `config.tos` 配置 | 不支持通过 `config.tos` 配置;产物持久化与转存由企业执行面负责 | | Worker | 不需要 | 需要部署 | | 工具调用结果 | 进入方舟控制面 | 进入方舟控制面 | | 运维责任 | 方舟为主 | 企业负责执行面 | ## 工作原理 方舟控制面与企业执行面的协作流程如下: 1. 业务应用通过 Session API 创建 Session 并发送用户消息。 2. 方舟控制面完成模型推理,生成 Tool Call 并写入 Work Queue。 3. 企业 Worker 轮询 Environment 的 Work Queue,领取 Work Item。 4. Worker 在企业 Sandbox 中执行工具调用(Bash、文件读写、自定义工具)。 5. Tool Result 通过 Session Events API 回传方舟控制面,驱动下一轮推理。 6. 任务结束后,Worker 清理执行环境,继续轮询下一个 Work Item。 > **说明** > > Tool Call 和 Tool Result 会经过方舟控制面,Agent 编排和模型推理仍在方舟侧完成。自托管改变的是工具执行位置,不是数据流向。详细的数据边界见 [自托管环境安全说明](/docs/self-hosted-environment-security)。 ## 核心对象 | 对象 | 说明 | | --- | --- | | **Environment** | Agent 运行时配置,`type` 为 `self_hosted` 时表示自托管环境。定义执行位置,不包含依赖包、环境变量和网络策略配置 | | **Worker** | 企业部署的进程,负责轮询 Work Queue、维持心跳、执行工具调用并回传结果 | | **Work Item** | 方舟为每个需要工具执行的 Session 生成的任务项,包含 Session 执行所需信息 | | **Session** | 在 Environment 中运行的 Agent 实例,用于执行具体任务。Work ID 与 Session ID 一致 | | **Events** | 应用与 Agent 之间交换的原子消息,涵盖用户消息、工具调用、工具结果与状态更新 | ## 一次任务如何运行 以下是一次完整自托管任务的执行流程: 1. 业务应用创建绑定自托管 Environment 的 Session。 2. 业务应用发送 `user.message` 事件。 3. 方舟控制面为本次执行生成 Work Item,写入 Environment 的 Work Queue。 4. Worker 通过长轮询(Poll)领取 Work Item 并 Ack 确认。 5. Worker 维持心跳(Heartbeat),保持租约有效。 6. Worker 订阅 Session Events,消费 Tool Call 并在企业 Sandbox 中执行。 7. Worker 将 Tool Result 回传方舟,驱动下一轮推理。 8. 重复步骤 6-7,直到 Session 进入 `idle` 或终态。 9. Worker 完成 Work Item,清理执行环境。 ## 数据与责任边界 自托管环境改变了工具执行位置,但模型推理和事件处理仍在方舟控制面。以下是关键数据流向: | 数据 | 是否进入方舟控制面 | 是否留在企业环境 | | --- | --- | --- | | 用户消息 | 是 | 可选保留 | | Tool Call 参数 | 是 | Worker 接收 | | Tool Result | 是 | 可保留 | | 企业文件内容 | 默认不上传 | 是 | | 命令执行进程 | 否 | 是 | | 网络请求 | 取决于工具实现 | 企业控制 | > **注意** > > 自托管不等于"所有业务数据均不出域"。Tool Call 和 Tool Result 作为 Agent 推理的必要输入,会经过方舟控制面。如果你需要确保特定数据不进入方舟,应在工具实现中过滤敏感信息,或在 Worker 侧对 Tool Result 进行脱敏处理。详细安全说明见 [自托管环境安全说明](/docs/self-hosted-environment-security)。 ## 支持的 Worker 能力 - Ark Runtime SDK(Go、Python、Java),支持出站长轮询(Poll)领取 Work Item - 常驻 Worker 模式(`EnvironmentWorker`),适用于长期运行的 Worker 主机 - 每 Session 独立 Sandbox 模式(`HandleItem`),适用于 Kubernetes 每 Session 一个 Pod - 心跳续租(Heartbeat),默认 TTL 300 秒 - 未认领 Work 回收(Reclaim):`reclaim_older_than_ms` 是认领超时阈值,单位为毫秒。Worker 拉取 Work 后超过该时间仍未认领时,其他 Worker 可再次获取该 Work。 > **注意** > > 该参数只用于设置未认领 Work 的认领超时阈值。Work 被认领后,不受该参数影响。Worker 心跳中断时,服务端会在租约到期并经过 60 秒宽限期后将 Work 状态更新为 `stopped`,当前不会将该 Work 自动分配给其他 Worker。 ## 下一步 - [配置并运行自托管环境](/docs/configure-self-hosted-environment):选择 Go、Python 或 Java SDK 启动 Worker,并完成一次 Session 工具执行 - [自托管环境安全说明](/docs/self-hosted-environment-security):了解信任边界、凭证管理和 Sandbox 隔离 --- # 配置并运行自托管环境 Source: https://ark.volcengine.com/region:cn-beijing/docs/configure-self-hosted-environment 本文介绍如何从零配置自托管环境(Self-hosted Environment),选择 Go、Python 或 Java SDK 启动 Worker,并完成一次完整的 Session 工具执行。 ## 你将完成什么 - 在控制台创建 `self_hosted` 类型的环境 - 为 Worker 配置并安全保存 API Key - 选择 Go、Python 或 Java SDK,在企业主机启动 Worker - 创建绑定自托管环境的 Session - 发送用户消息,让 Agent 在企业主机执行工具 - 验证工具执行结果、Session 终态和 Worker 状态 ## 核心概念 | 概念 | 说明 | | --- | --- | | **Environment** | Agent 运行时配置,`type` 为 `self_hosted` 时表示自托管环境 | | **Worker** | 企业部署的进程,轮询 Work Queue 并在企业 Sandbox 中执行工具调用 | | **Work Item** | 方舟为需要工具执行的 Session 生成的任务项,Work ID 与 Session ID 一致 | | **API Key** | Worker 和业务应用调用方舟接口时使用的鉴权凭证。Worker 使用的 API Key 权限取决于所属账号、项目和凭证策略,不会自动限制为只能访问某个 Environment | ## 工作流程 以下是自托管环境端到端的工作流程: 1. 企业管理员创建自托管 Environment,并为 Worker 准备 API Key。 2. 企业运维人员在企业主机启动 Worker,Worker 开始轮询 Work Queue。 3. 业务应用使用业务 API Key 创建 Session,建立事件流后发送用户消息。 4. 方舟控制面生成 Work Item,Worker 领取并 Ack。 5. Worker 在企业 Sandbox 中执行工具调用(Bash、文件读写、自定义工具)。 6. Worker 将 Tool Result 回传方舟,驱动下一轮推理。 7. 重复步骤 5-6,直到 Session 进入 `idle` 或终态。 8. Worker 完成 Work Item,继续轮询。 ## 前置条件 开始前,请确认以下条件已满足: - 已开通 Managed Agents 服务,并已创建 Agent(参见 [快速入门](/docs/quick-start-code)) - 准备一台企业管理的 Linux 主机或隔离容器,具备以下条件: - `/bin/bash` 可用 - `/workspace` 目录可写 - 已选择一种 Ark Runtime SDK,并按对应仓库 README 准备运行环境:[Go](https://github.com/volcengine/ark-runtime-go)、[Python](https://github.com/volcengine/ark-runtime-python) 或 [Java](https://github.com/volcengine/ark-runtime-java) - Worker 主机能够通过出站 HTTPS 访问方舟 API(`https://ark.cn-beijing.volces.com/api/v3`),无需开放入站端口 - 业务应用所在主机已安装 `curl` 和 `jq` - 准备业务 API Key(用于创建 Session,由业务应用持有) - 准备 Worker 使用的方舟 API Key,由 Worker 主机持有 > **注意** > > 当前没有仅能访问指定 Environment 的独立 Worker 凭证。Worker 使用标准方舟 API Key 访问 Work Queue,实际权限取决于该 API Key 所属账号、项目和凭证策略。不要把 `MA_ENVIRONMENT_ID` 误认为鉴权范围限制。 > > 建议为业务应用和 Worker 分配不同的 API Key,并分别保存在 Secret Manager 中。Worker API Key 的权限不会自动限制为单个 Environment。独立凭证便于单独轮换和吊销,但不能替代账号和项目级权限控制。 ## 第 1 步:创建自托管环境 在控制台的 [Environments](https://ark.volcengine.com/region:cn-beijing/managed-agents/environments) 页面或使用 API 创建自托管环境。 使用 API 创建环境: ```Bash curl -sS https://ark.cn-beijing.volces.com/api/v3/environments \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "name": "my-self-hosted-env", "description": "自托管环境,用于执行企业内部工具", "config": { "type": "self_hosted" } }' ``` > **说明** > > 自托管环境的 `config` 仅需指定 `type` 为 `self_hosted`。依赖包(`packages`)、环境变量(`env`)、启动脚本(`setup_script`)和网络策略(`networking`)由企业自行管理,不在 Environment 配置中定义。 响应示例: ``` { "id": "env-20260822120000-xxxxx", "type": "environment", "name": "my-self-hosted-env", "config": { "type": "self_hosted" }, "created_at": "2026-08-22T04:00:00Z" } ``` 将返回的 `id` 记录为 `ENVIRONMENT_ID`,后续步骤会用到。 ## 第 2 步:配置 Worker API Key 为 Worker 准备一个可访问当前账号和项目中 Managed Agents 资源的方舟 API Key。API Key 的创建方法,详情请参见 [API Key 管理](/docs/manage-api-keys)。 > **注意** > > Worker 使用的是标准方舟 API Key,不是 Environment 专用凭证。不要假设该 Key 只能 Poll 或 Ack 当前 Environment 的 Work Item。应通过独立项目、独立 API Key、Secret Manager 和 Worker 侧网络策略限制风险范围。 配置 Worker 主机的环境变量: ```bash export MA_ENVIRONMENT_ID="env-20260822120000-xxxxx" export MA_WORKDIR="/workspace" export ARK_API_KEY="" # Optional: set ARK_BASE_URL only when overriding the SDK default endpoint. export ARK_BASE_URL="https://ark.cn-beijing.volces.com/api/v3" ``` 将 `ARK_API_KEY` 设置为 Worker 使用的方舟 API Key。SDK 会同时使用 `MA_ENVIRONMENT_ID` 定位 Work Queue,但该 ID 不会改变 API Key 的权限范围。 ## 第 3 步:准备 Worker 主机 在企业 Linux 主机上创建工作目录,并选择一种 SDK 安装。各 SDK 的运行环境和安装方式以官方仓库 README 为准: - [Ark Runtime Go SDK](https://github.com/volcengine/ark-runtime-go) - [Ark Runtime Python SDK](https://github.com/volcengine/ark-runtime-python) - [Ark Runtime Java SDK](https://github.com/volcengine/ark-runtime-java) ```bash mkdir -p /workspace cd /workspace cat > /workspace/input.csv <<'CSV' department,requests,resolved sales,120,114 support,95,91 operations,80,79 CSV test -s /workspace/input.csv ``` 该固定输入用于步骤 5 的首次工具调用。`test` 返回状态码 `0`,表示文件已创建且内容非空。 **选项:Go** 按照 Go SDK 仓库 README 安装: ```bash go mod init self-hosted-worker go get github.com/volcengine/ark-runtime-go@latest ``` > **说明** > > Self-hosted Worker 从 Ark Runtime Go SDK v0.5.0 开始提供。如果提示 `arkruntime/lib/environments` 包不存在,请升级到最新稳定版。 **选项:Python** 按照 Python SDK 仓库 README 安装: ```bash python -m venv .venv source .venv/bin/activate python -m pip install -U pip python -m pip install --upgrade arkruntime ``` > **说明** > > Self-hosted Worker 从 Ark Runtime Python SDK 0.5.0 开始提供。如果提示 `No module named 'arkruntime.selfhosted'`,请升级到最新稳定版。 **选项:Java** 按照 Java SDK 仓库 README,在 Maven 项目的 `pom.xml` 中添加依赖: ```xml com.volcengine ark-runtime ``` > **说明** > > 从 [Maven Central](https://central.sonatype.com/artifact/com.volcengine/ark-runtime) > 获取最新稳定版本,并将 `` 替换为该版本号。Self-hosted Worker 从 > Ark Runtime Java SDK 0.5.0 开始提供;如果提示 > `package com.volcengine.ark.runtime.selfhosted does not exist`,请确认版本不低于 > 0.5.0。 检查以下条件: - `/bin/bash` 可用且 Worker 进程有执行权限 - `/workspace` 目录可读写 - 出站 HTTPS 可达 `https://ark.cn-beijing.volces.com/api/v3` - 准备 Agent 需要访问的企业文件或内部服务 ## 第 4 步:启动常驻 Worker 使用 SDK 启动 `EnvironmentWorker`。以下示例会持续 Poll Work Queue,领取 Work Item 后在 `MA_WORKDIR` 下为每个 Session 创建独立工作目录。 **选项:Go** 创建 `main.go`: ```go package main import ( "context" "log" "os" "os/signal" "syscall" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/lib/environments" ) func main() { apiKey := os.Getenv("ARK_API_KEY") baseURL := os.Getenv("ARK_BASE_URL") envID := os.Getenv("MA_ENVIRONMENT_ID") workdir := os.Getenv("MA_WORKDIR") if apiKey == "" || envID == "" { log.Fatal("ARK_API_KEY and MA_ENVIRONMENT_ID are required") } if workdir == "" { workdir = "/workspace" } clientOptions := make([]arkruntime.ConfigOption, 0, 1) if baseURL != "" { clientOptions = append(clientOptions, arkruntime.WithBaseUrl(baseURL)) } client := arkruntime.NewClientWithApiKey(apiKey, clientOptions...) worker := environments.NewEnvironmentWorkerForClient(client, environments.EnvironmentWorkerOptions{ EnvironmentID: envID, WorkerID: os.Getenv("MA_WORKER_ID"), Workdir: workdir, }) log.Printf("worker starting for environment %s", envID) ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM) defer stop() if err := worker.Run(ctx); err != nil { log.Fatalf("worker exited with error: %v", err) } } ``` **选项:Python** 创建 `worker.py`: ```python import os import signal import sys from arkruntime import Ark from arkruntime.selfhosted import ClientAPI, EnvironmentWorker, EnvironmentWorkerOptions def required_env(name): value = os.environ.get(name, "") if not value: raise RuntimeError(f"{name} is required") return value client_options = {"api_key": required_env("ARK_API_KEY")} if os.environ.get("ARK_BASE_URL"): client_options["base_url"] = os.environ["ARK_BASE_URL"] client = Ark(**client_options) worker = EnvironmentWorker( ClientAPI(client), EnvironmentWorkerOptions( environment_id=required_env("MA_ENVIRONMENT_ID"), worker_id=os.environ.get("MA_WORKER_ID", ""), workdir=os.environ.get("MA_WORKDIR", "/workspace"), ), ) print(f"worker starting for environment {os.environ['MA_ENVIRONMENT_ID']}", file=sys.stderr) for sig in (signal.SIGINT, signal.SIGTERM): signal.signal(sig, lambda _signum, _frame: worker.close()) try: worker.run() finally: worker.close() client.close() ``` **选项:Java** 在 Maven 项目的 `src/main/java/` 目录下创建 `SelfHostedWorkerExample.java`: ```java import com.volcengine.ark.runtime.selfhosted.EnvironmentWorker; import com.volcengine.ark.runtime.selfhosted.SelfHostedClient; public class SelfHostedWorkerExample { public static void main(String[] args) { String environmentId = requiredEnv("MA_ENVIRONMENT_ID"); String workerId = System.getenv("MA_WORKER_ID"); String workdir = envOrDefault("MA_WORKDIR", "/workspace"); SelfHostedClient.Builder clientBuilder = new SelfHostedClient.Builder() .apiKey(requiredEnv("ARK_API_KEY")); String baseUrl = System.getenv("ARK_BASE_URL"); if (baseUrl != null && !baseUrl.isEmpty()) { clientBuilder.baseUrl(baseUrl); } SelfHostedClient client = clientBuilder.build(); EnvironmentWorker worker = new EnvironmentWorker( client, new EnvironmentWorker.Options() .environmentId(environmentId) .workerId(workerId) .workdir(workdir)); System.out.printf("worker starting for environment %s%n", environmentId); Runtime.getRuntime().addShutdownHook(new Thread(worker::close, "ark-self-hosted-worker-shutdown")); try { worker.run(); } finally { worker.close(); } } private static String requiredEnv(String name) { String value = System.getenv(name); if (value == null || value.isEmpty()) { throw new IllegalArgumentException(name + " is required"); } return value; } private static String envOrDefault(String name, String defaultValue) { String value = System.getenv(name); return value == null || value.isEmpty() ? defaultValue : value; } } ``` 启动 Worker: **选项:Go** ```bash go mod tidy go run main.go ``` **选项:Python** ```bash python worker.py ``` **选项:Java** ```bash mvn -q exec:java -Dexec.mainClass=SelfHostedWorkerExample ``` 期望日志输出: ``` worker starting for environment env-20260822120000-xxxxx polling work queue... ``` `EnvironmentWorker` 会持续 Poll Work Queue,队列为空时保持等待,不产生 Session。回到控制台 Environment 详情页,Worker 连接状态应显示为"在线"。 > **注意** > > 如果 Worker 仍显示"未连接",优先检查: > - `MA_ENVIRONMENT_ID` 是否正确 > - Worker 主机上的 `ARK_API_KEY` 是否为当前账号和项目下有效的方舟 API Key > - 如设置了 `ARK_BASE_URL`,确认地址与当前方舟地域一致 > - Worker 主机系统时间是否准确(偏差过大导致签名失败) > - 出站 HTTPS 是否可达 `https://ark.cn-beijing.volces.com/api/v3` ## 第 5 步:创建 Session,建立事件流并发送任务 ### 5.1 创建 Session 业务应用使用自己的 API Key 创建 Session。生产环境中,建议不要复用 Worker 使用的 API Key: ```bash export ARK_API_KEY="" export ARK_BASE_URL="https://ark.cn-beijing.volces.com/api/v3" export SESSION_RESPONSE=$(curl -sS https://ark.cn-beijing.volces.com/api/v3/sessions \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "agent": "agent-20260729160000-xxxxx", "environment_id": "env-20260822120000-xxxxx" }') export SESSION_ID=$(echo $SESSION_RESPONSE | jq -r '.id') echo "Session ID: $SESSION_ID" ``` 响应示例: ``` { "id": "sesn-20260822120100-xxxxx", "status": "idle", "environment_id": "env-20260822120000-xxxxx" } ``` ### 5.2 订阅 Session 事件流 在另一个终端中,通过 [流式获取会话事件](/docs/stream-events-api) 建立 SSE 连接: ```Bash curl -N "https://ark.cn-beijing.volces.com/api/v3/sessions/$SESSION_ID/events/stream" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Accept: text/event-stream" ``` 等待服务端返回 `: ready` 后,再发送用户消息。SSE 只推送连接建立后产生的事件;如果先发送消息,业务应用会遗漏已产生的事件。 ### 5.3 发送首个事件启动 Agent 仅创建 Session 不会触发任务。通过 [发送会话事件](/docs/send-event-api) 提交第一条 `user.message` 事件后,方舟才会生成 Work Item 并将其写入自托管 Environment 的 Work Queue: ```Bash curl -sS "https://ark.cn-beijing.volces.com/api/v3/sessions/$SESSION_ID/events" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "events": [{ "type": "user.message", "content": [{ "type": "text", "text": "读取 /workspace/input.csv,生成汇总报告并写入 /workspace/output.md" }] }] }' ``` > **说明** > > 发送消息后,Session 从 `idle` 进入 `running`,方舟为本轮执行生成 Work Item 并写入 Environment 的 Work Queue。业务应用不直接创建 Work Item,也不调用 Work API。 ## 第 6 步:验证执行结果 ### 6.1 Worker 侧 Worker 日志中应看到以下关键事件: ```text work claimed: work_id=sesn-20260822120100-xxxxx session started: session_id=sesn-20260822120100-xxxxx tool call: bash, command=cat /workspace/input.csv tool call: write, path=/workspace/output.md session completed: session_id=sesn-20260822120100-xxxxx work completed: work_id=sesn-20260822120100-xxxxx ``` 确认 `/workspace/output.md` 已生成,内容符合预期。 ### 6.2 业务应用侧 在步骤 5.2 建立的 SSE 连接中,确认收到以下事件: ```text user.message 读取 /workspace/input.csv,生成汇总报告 agent.tool_use bash: cat /workspace/input.csv agent.tool_result (bash 执行结果) agent.tool_use write: /workspace/output.md agent.tool_result (write 执行结果) agent.message 已完成,汇总报告保存至 /workspace/output.md session.status_idle ``` ### 6.3 控制台侧 在 Environment 详情页确认: | 页面 | 预期结果 | | --- | --- | | 概览 | Worker 在线,执行期间 `running` 数量增加,结束后回落 | | Work Items | 可按 Session ID 找到本轮 Work Item,状态流转为 `queued → starting → active → stopped` | ## 生产部署方式 ### 常驻 Worker 适用于 VM、独立容器或已有隔离节点直接执行。`EnvironmentWorker.run()` / `EnvironmentWorker.Run()` 管理完整生命周期:Poll、Ack、Heartbeat、工具执行、结果回传和 Work Complete。 需要扩容时,优先启动多个 Worker 进程或 Pod,并为每个实例设置独立的 `MA_WORKER_ID`。不要让多个 Worker 共享同一个 Session 工作目录。 ### 每 Session 独立 Sandbox 适用于 Kubernetes 每 Session 一个 Pod。Poller 负责领取 Work Item 并创建 Pod,Pod 内调用 SDK 的 `HandleItem` / `handle_item` 负责该 Work Item 的完整生命周期。 ```go poller := environments.NewWorkPollerForClient(ctx, client, environments.WorkPollerOptions{ EnvironmentID: envID, }) for poller.Next() { work := poller.Current() createPod(work) } worker := environments.NewEnvironmentWorkerForClient(client, environments.EnvironmentWorkerOptions{ Workdir: "/workspace", }) worker.HandleItem(ctx, environments.HandleItemOptions{ WorkID: os.Getenv("MA_WORK_ID"), EnvironmentID: os.Getenv("MA_ENVIRONMENT_ID"), SessionID: os.Getenv("MA_SESSION_ID"), }) ``` > **注意** > > Worker 使用的 API Key 应通过 Kubernetes Secret、Secret Manager 或等价机制挂载,不能明文写入 Pod Spec、镜像、工作目录或日志。Worker 在执行 `bash` 等 Agent 工具前,应清除包含凭证的环境变量。 ## 运行与排障 | 现象 | 检查项 | 处理方式 | | --- | --- | --- | | Worker 未连接 | API Key、Environment ID、网络 | 检查 Worker 主机上的 `ARK_API_KEY` 是否有效且能访问当前账号和项目,确认出站 HTTPS 可达 | | Work 长时间排队 | Worker 在线状态、Worker 实例数量 | 确认 Worker 在线,必要时增加 Worker 实例 | | Heartbeat 失败 | 租约已过期、系统时间偏差 | Worker 会自动退出,可重新 Poll 领取 | | 重复工具调用 | Tool Call ID 幂等 | 服务端以 Tool Call ID 为幂等键,重复回传不会重复执行 | | Session 无结果 | Work 与 Session Events 分别检查 | 确认 Work 已被领取且处于 `active`,同时检查 Events 是否有错误事件 | ## 清理资源 确认产物已转存后,按依赖顺序清理: ```Bash # 1. 停止 Worker(Ctrl+C 或 kill) # 2. 确认没有运行中的 Work # 3. 删除测试 Session curl -sS -X DELETE "https://ark.cn-beijing.volces.com/api/v3/sessions/$SESSION_ID" \ -H "Authorization: Bearer $ARK_API_KEY" # 4. 删除测试 Environment curl -sS -X DELETE "https://ark.cn-beijing.volces.com/api/v3/environments/$ENVIRONMENT_ID" \ -H "Authorization: Bearer $ARK_API_KEY" ``` > **警告** > > 只删除本次创建、且记录了精确 ID 的资源。切勿按名称模糊匹配批量删除——企业账号下资源可能被多人共享,误删不可恢复。 --- # 自托管环境安全说明 Source: https://ark.volcengine.com/region:cn-beijing/docs/self-hosted-environment-security 本文介绍自托管环境(Self-hosted Environment)的安全责任模型、数据边界和最佳实践,帮助企业安全、平台和运维人员完成部署前安全评审。 ## 安全责任模型 自托管环境采用**共享责任模型**:方舟负责控制面安全,企业负责执行面安全。 | 范围 | 方舟责任 | 企业责任 | | --- | --- | --- | | 模型推理与 Agent 编排 | 提供平台能力,保障推理链路安全 | 配置和使用 | | Work Queue 与事件流 | 服务端鉴权、传输加密、持久化 | 安全保存凭证 | | Worker 与 Sandbox | 不负责企业侧运行环境 | 部署、隔离、监控和运维 | | 企业网络与内部系统 | 不管理 | 配置访问权限,实施最小权限 | | 工具权限 | 提供协议与事件 | 在 Worker 侧实施实际执行限制 | | 凭证管理 | 校验调用方提供的方舟 API Key | 为业务应用和 Worker 分配、保存、轮换和吊销 API Key | ## 信任边界 自托管环境的信任边界位于方舟控制面与企业执行面之间: - **方舟控制面**:托管模型推理、Agent 编排、Session 管理和事件流。Tool Call 和 Tool Result 会经过控制面。 - **企业 Worker**:部署在企业基础设施,轮询 Work Queue 并在企业 Sandbox 中执行工具。 - **企业 Sandbox**:每个 Session 应使用独立的执行环境(容器、VM 或物理机上的隔离目录)。 > **注意** > > 自托管不等于"所有业务数据均不出域"。Tool Call 和 Tool Result 作为 Agent 推理的必要输入,会经过方舟控制面。如果你需要确保特定数据不进入方舟,应在工具实现中过滤敏感信息,或在 Worker 侧对 Tool Result 进行脱敏处理。 ## 数据如何流动 | 数据 | 是否进入方舟控制面 | 是否留在企业环境 | 说明 | | --- | --- | --- | --- | | 用户消息 | 是 | 可选保留 | 业务应用发送的消息会持久化在方舟事件流中 | | Tool Call 参数 | 是 | Worker 接收 | 模型生成的工具调用指令,包含参数 | | Tool Result | 是 | 可保留 | 工具执行结果回传方舟以驱动下一轮推理 | | 企业文件内容 | 默认不上传 | 是 | 文件读写在企业 Sandbox 本地完成 | | 命令执行进程 | 否 | 是 | Bash 等命令由企业主机执行 | | 网络请求 | 取决于工具实现 | 企业控制 | 工具发起的网络请求受企业网络策略约束 | ## 凭证安全 ### 凭证分离 业务应用和 Worker 当前都使用标准方舟 API Key。为缩小单个凭证的暴露面,建议分别分配独立 API Key: | 凭证类型 | 用途 | 持有者 | 权限范围 | | --- | --- | --- | --- | | 业务应用 API Key | 创建 Session、发送消息、订阅事件 | 业务应用 | 取决于 API Key 所属账号、项目和凭证策略 | | Worker API Key | 轮询和处理 Work Item | Worker 主机 | 取决于 API Key 所属账号、项目和凭证策略,不会自动限制为单个 Environment | > **警告** > > Worker API Key 不是 Environment 专用凭证。`MA_ENVIRONMENT_ID` 只用于定位 Work Queue,不会缩小 API Key 的授权范围。API Key 泄露后,攻击者可能访问该凭证有权操作的其他方舟资源。不要把任何 API Key 放入 Agent 工作目录、工具进程环境或日志。 ### 凭证保存 - 将业务应用和 Worker 使用的 API Key 分别保存到企业 Secret Manager(如 Kubernetes Secret、HashiCorp Vault 或等效服务) - 不将 API Key 写入代码仓库、Docker 镜像、启动脚本正文、`/workspace` 目录或日志文件 - 为不同部署环境或 Worker 集群分配独立 API Key,便于单独轮换、吊销和审计 - 日志中只保留凭证尾号(如 `...a1b2`),不输出完整凭证 ### 凭证轮换与吊销 - 按企业凭证策略定期轮换 Worker API Key - 凭证泄露或人员离职时,立即吊销已有 API Key 并生成新 Key - 轮换时先使用新 API Key 启动 Worker,确认在线后再吊销旧 Key 并停止旧 Worker ## Sandbox 隔离 每个 Session 应使用独立的执行环境,防止跨 Session 数据泄露和权限越界。 ### 基本要求 - 每个 Session 使用独立的工作目录或 Sandbox - 使用非 root 用户运行 Worker 和 Agent 工具 - 限制 CPU、内存、进程数和执行时间 - 不挂载以下目录到 Sandbox: - Docker Socket(`/var/run/docker.sock`) - 宿主机根目录(`/`) - 凭证目录(如 `/etc/ark/`、`~/.aws/`) - 其他 Session 的工作目录 ### 常驻 Worker 模式 如果使用常驻 Worker(`EnvironmentWorker`),确保 Worker 的根工作目录只用于 Agent 执行,并让 SDK 为每个 Session 创建独立子目录。需要扩容时,优先启动多个 Worker 进程或 Pod,并为每个实例设置独立的 `MA_WORKER_ID`。 不要让多个 Worker 共享同一个 Session 工作目录,也不要把凭证目录、宿主机系统目录或其他业务目录作为 Worker 工作目录。 ### 每 Session 独立 Sandbox 模式 推荐使用 Kubernetes 每 Session 一个 Pod,每个 Pod 拥有独立的文件系统、网络命名空间和资源限制。 ## 文件系统安全 Agent 通过 Bash 和文件工具访问企业文件系统,必须限制其可访问范围: - 限制 Agent 可读写的根目录(如 `/workspace`),禁止访问 `/etc`、`/proc`、`/sys` 等系统目录 - 防止路径穿越:校验文件路径不包含 `..` 或符号链接逃逸 - 限制文件类型和数量,防止 Agent 写入大量文件耗尽磁盘 - 自定义文件工具应重复执行路径校验,确保路径在允许范围内 - 任务结束后清理 Session 的临时数据 ## 网络安全 自托管 Worker 仅需主动出站访问方舟 API,无需开放入站端口: - Worker 主机只需出站 HTTPS 访问 `https://ark.cn-beijing.volces.com/api/v3` - 如果 Agent 需要访问企业内网服务,配置最小权限的域名或地址白名单 - 防止 Agent 通过代理或隧道访问未授权网络 - 不把数据库管理凭证直接暴露给 Agent 的工具调用 ## 工具执行安全 Worker 在企业侧执行 Agent 的工具调用,建议实施以下控制: - 校验工具名称和输入参数 Schema,拒绝未定义的 Tool Call - 对高风险工具(如数据库写入、生产环境部署)增加人工审批或二次确认 - 使用 Tool Call ID 保证幂等:服务端以 Tool Call ID 为幂等键,同一 Tool Call 的重复回传不会重复执行 - 区分只读操作与写操作,对写操作实施更严格的权限控制 - 限制 Shell 命令:禁止 `sudo`、`chmod 777`、`rm -rf /` 等危险命令 - 清除包含凭证的环境变量后再执行 Agent 工具 > **注意** > > Tool Call ID 幂等由服务端保证,但 Worker 侧不应依赖此机制。如果 Worker 已经执行了有副作用的操作(如发送邮件、写入数据库),重复回传 Tool Result 不会撤销已有副作用。建议 Worker 侧在本地记录已执行的 Tool Call ID,避免重复执行有副作用操作。 ## 日志与审计 ### 建议记录 - Worker 启动、停止、异常退出 - Work Item 的 Poll、Ack、Heartbeat、Complete - Tool Call 的名称、参数、执行时间和结果状态 - 鉴权失败事件 - 凭证轮换和吊销操作 日志中应关联以下标识,便于跨系统追踪: - `session_id`:Session 标识 - `work_id`:Work Item 标识(与 Session ID 一致) - `environment_id`:Environment 标识 - `request_id`:方舟 API 请求标识 ### 禁止记录 - 完整凭证内容(只记录尾号) - 用户消息的完整文本(如包含敏感信息) - Tool Result 中的敏感数据(如数据库查询结果、内部 API 响应) ## Worker 失联与 Work 回收 ### Heartbeat 机制 Worker 通过 Heartbeat 维持已认领 Work Item 的租约。默认 TTL 为 300 秒,Worker 应在 TTL 过期前续租。心跳中断时,Work 会在最近一次成功心跳的租约到期并经过 60 秒宽限期后进入 `stopped`。 Work 进入 `stopped` 后,服务端当前不会自动将该 Work 分配给其他 Worker。原 Worker 恢复后,应先查询 Work 状态。Work 已停止时,应终止本地任务并释放资源。 ### 回收未认领 Work `reclaim_older_than_ms` 是 Work 的认领超时阈值,单位为毫秒。调用 Poll 接口时,使用该参数设置 Work 被拉取后等待认领的时间。Worker 需要在该时间内调用认领 Work 接口;超时仍未认领时,该 Work 保持 `queued`,其他 Worker 可以再次获取。 > **注意** > > 已认领的 Work 不受 `reclaim_older_than_ms` 影响。Worker 心跳中断后,服务端不会根据该参数将 Work 分配给其他 Worker。Worker 应检查每次 Heartbeat 响应中的 `lease_extended`;该字段为 `false` 时,立即停止执行。 ### 迟到 Tool Result Work Item 进入 `stopped` 状态后,发送新的 Tool Result 会使 Work Item 重新进入 `queued` 状态,并继续驱动 Session。该行为由新的 Session 事件触发,不属于 Reclaim,也不是 Worker 失联后的自动接管。Session 进入 `terminated` 状态后不再接受 Tool Result,请求返回 403 `OperationDenied.SessionTerminated`。 ## 上线前安全检查 部署自托管环境前,对照下表确认安全控制,并根据原因评估不满足项的风险。 | 检查项 | 原因 | | --- | --- | | 业务应用与 Worker 分别使用独立 API Key | 支持独立轮换、吊销和审计,避免 Worker 凭据变更同时影响业务应用。 | | 将 Worker API Key 的账号和项目权限纳入安全评审 | `MA_ENVIRONMENT_ID` 只定位 Work Queue,不会把 API Key 的权限限制到单个 Environment。 | | 将 API Key 保存在 Secret Manager | 防止凭证进入代码仓库、镜像、工作目录或日志。 | | 每个 Session 使用独立的工作目录或 Sandbox | 防止不同 Session 读取或覆盖彼此的数据。 | | 使用非 root 用户运行 Worker 和 Agent 工具 | 降低工具进程访问宿主机系统资源的风险。 | | 将文件系统访问限制在允许范围内,并校验路径 | 防止路径穿越或符号链接逃逸导致 Agent 访问工作目录之外的文件。 | | 为网络访问配置最小权限,且不开放入站端口 | 限制 Agent 访问未授权网络,并减少 Worker 主机的暴露面。 | | 按工具 Schema 校验名称和输入参数 | 防止未定义或格式异常的 Tool Call 进入企业执行环境。 | | 为高风险工具增加审批或二次确认 | 防止 Agent 未经确认执行数据库写入、生产部署等高风险操作。 | | 根据 Tool Call ID 实施幂等控制 | Worker 重试或重复收到调用时,避免重复执行发送消息、写入数据库等有副作用的操作。 | | 对日志进行脱敏 | 防止日志泄露完整凭证、用户消息或 Tool Result 中的敏感数据。 | | Worker 收到停止信号后优雅退出并清理资源 | 避免本地任务在 Work 已停止后继续运行,并及时释放进程、文件和网络资源。 | | 演练 Worker 失联停止和未认领 Work 回收 | 验证异常情况下的 Work 状态与文档描述一致,避免误将已认领 Work 当作可自动接管的任务。 | ## 安全边界 使用自托管环境时,需要明确以下安全边界: - 方舟控制面不校验企业 Sandbox 的隔离程度,隔离责任完全在企业侧 - 方舟不监控企业 Worker 主机的安全状态(如系统漏洞、异常进程) - Tool Permission 等待期间,Worker 需持续维持 Heartbeat 等待用户审批 - 不支持企业自定义的审计日志格式和投递目标 --- # 启动 Session Source: https://ark.volcengine.com/region:cn-beijing/docs/start-session Session 是托管 Agent 在某个 Environment 中跑某个 Agent 的一次实例。一个 Session 在多次交互中维护对话历史、保留沙箱状态,允许 Agent 跨轮次记住之前做过的事情。 启动一个 Session 分两步: 1. 创建 Session:配置沙箱、绑定 Agent 与 Environment,此时 Agent **不**开始任何工作。 2. 发送首个事件:通过 `user.message` 事件把任务交给 Agent,Session 进入 `running` 状态开始执行。 ## 准备工作 开始前你需要: - 已创建的 API Key:配置为环境变量 `ARK_API_KEY`,详情请参见 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey)。 - 已创建的 Agent:详情请参见 [定义 Agent](/docs/define-agent)。 - 已创建的 Environment:详情请参见 [配置云环境](/docs/configure-cloud-environment)。 本章节示例的 Base URL 与鉴权方式详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 ## 创建 Session 创建 Session 必需两个上游资源 ID: - Agent ID:由 [定义 Agent](/docs/define-agent) 创建后获得,形如 `agent-20260701120000-xxxxx`。 - Environment ID:由 [配置云环境](/docs/configure-cloud-environment) 创建后获得,形如 `env-20260701120000-xxxxx`。 ### 使用 Agent 最新版本(推荐入门) Agent 是带版本的资源,以字符串形式传入 `agent` ID 时,Session 会用该 Agent 的**最新版本**启动。 **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/sessions \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "agent": "agent-20260701120000-abcde", "environment_id": "env-20260701120000-fghij" }' ``` 响应返回完整的 Session 记录,其中 `id` 字段(形如 `sesn-20260701120100-xxxxx`)是后续所有操作的入口: ```json { "id": "sesn-20260701120100-xxxxx", "type": "session", "status": "idle", "environment_id": "env-20260701120000-xxxxx", "agent": { "id": "agent-20260701120000-xxxxx", "type": "agent", "version": 3 }, "created_at": "2026-06-29T10:00:00Z", "updated_at": "2026-06-29T10:00:00Z", "resources": [], "vault_ids": null } ``` 响应中 `status` 为 `idle`,表示 Session 已就绪等待首个事件。完整状态包括 `initializing`、`idle`、`running`、`rescheduling`、`upgrading`、`failed` 和 `terminated`。正常轮次结束后,Session 回到 `idle`;进入 `idle` 时,平台会保存沙箱状态快照,便于后续恢复。状态机与沙箱状态保留期详情请参见 [数据保留与删除影响](/docs/manage-session#checkpoint-retention)。 ### 固定 Agent 版本(灰度发布场景) 当你需要把 Session 锁定到 Agent 的某个具体版本(用于回滚、灰度对比、产品定版)时,以对象形式传入 `agent`,显式指定 `version`: **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/sessions \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "agent": {"type": "agent", "id": "agent-20260701120000-abcde", "version": 1}, "environment_id": "env-20260701120000-fghij" }' ``` 固定版本后,即使该 Agent 后续发布了新版本,本 Session 仍按 `version: 1` 的行为运行。这让你可以分阶段灰度推出新版本,而不影响存量 Session 的行为一致性。 ## 覆写 Agent 配置(可选) 大多数 Session 直接传入 Agent ID 或版本引用,沿用该版本的完整配置。只有当前任务需要不同的系统提示词、模型、工具、MCP 服务、技能或多智能体协作配置时,才传入 `agent_with_overrides` 对象。 以下示例在本次 Session 中替换系统提示词和模型,将工具列表替换为内置工具集,并清空基础 Agent 的技能与 MCP 服务: **选项:Curl** ```Bash session=$( curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/sessions" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d @- < **注意** > > 不要为了表示“不修改”而给 `tools`、`mcp_servers`、`skills` 或 `multiagent.agents` 传 `[]`。空数组会清空基础 Agent 的对应列表;不需要覆写时应省略该字段。 ## 覆写 Environment 配置(可选) 大多数 Session 直接传入 `environment_id`,沿用 Environment 的完整运行配置。只有当前任务需要不同的依赖包、环境变量、初始化脚本或产物存储位置时,改用 `environment` 对象。 Environment 覆写遵循以下规则: - `environment.id` 指向作为基础配置的 Environment。 - `environment.config.type` 必须与基础 Environment 的类型相同。 - `environment_id` 与 `environment` 允许同时提供,但同时提供时,`environment.id` 必须与 `environment_id` 相同,否则请求会被拒绝。 - 省略的 `config` 子字段沿用基础 Environment 的配置。提供的子字段只写入当前 Session 的环境快照,不修改原 Environment,也不影响之后创建的其他 Session。 ### 覆写依赖包、环境变量和初始化脚本 需要为单个 Session 增加依赖、注入任务专用变量或执行初始化命令时,覆写 `config.packages`、`config.env` 和 `config.setup_script`: **选项:Curl** ```Bash session=$( curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/sessions" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d @- < /workspace/bootstrap/status.txt" } }, "title": "Session with runtime configuration overrides" } EOF ) SESSION_ID=$(jq -er '.id' <<<"$session") echo "Session ID: $SESSION_ID" ``` - `config.packages`:配置当前 Session 启动时预装的 `pip`、`apt`、`npm`、`cargo`、`gem` 或 `go` 依赖。传入对象时整体替换基础 Environment 的依赖包配置;传入空对象 `{}` 时清空全部依赖。 - `config.env`:以字符串键值对配置当前 Session 的环境变量。传入对象时整体替换基础 Environment 的环境变量;传入空对象 `{}` 时清空全部环境变量。 - `config.setup_script`:配置当前 Session 启动时执行的 Bash 初始化脚本。传入非空字符串时替换基础 Environment 的脚本;传入空字符串 `""` 时清空。脚本在 `/workspace` 目录中运行,内容不能超过 256 KiB(262144 字节)。 > **注意** > > `setup_script` 超过大小限制时不会执行,脚本以非零状态码退出时也不会回滚退出前已完成的操作;这两种情况下,Session 仍可能创建成功并继续运行。让脚本写入可检查的标记文件,并在发送任务前确认依赖、目录或文件已经准备完成。 > **说明** > > 这些字段用于覆写 `cloud` Environment 的托管运行环境。`self_hosted` Environment 的依赖、环境变量和初始化过程由企业 Worker 管理。 创建成功后,响应中的 `environment.type` 为 `environment_with_overrides`,`environment.overridden_fields` 列出本次实际覆写的 `config` 子字段。未使用覆写对象时,`environment.type` 为 `environment`,响应不返回 `overridden_fields`。 ### 覆写产物存储 需要沿用 Environment 的产物存储配置时,在创建 Session 时传入 `environment_id`: - Environment 未配置 `config.tos`:产物使用方舟公共 TOS。你需要在平台 TTL 到期前下载所需文件。 - Environment 已配置 `config.tos`:平台从 outputs 目录注册到 Files API 的产物,会写入你配置的 TOS Bucket。Files API 写入前缀为 `{prefix}outputs/{env-id}/{session-id}/`,最终对象路径以响应中的 `tos.object_key` 为准。 只有当前任务需要使用不同的 Bucket 或 `prefix` 时,改用 `environment` 对象创建 Session,并通过 `environment_with_overrides` 临时覆写 `config.tos`: **选项:Curl** ```Bash session=$( curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/sessions" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d @- <", "prefix": "session-outputs/" } } }, "title": "Session with output storage override" } EOF ) SESSION_ID=$(jq -er '.id' <<<"$session") echo "Session ID: $SESSION_ID" ``` 产物存储覆写遵循以下规则: - `config.tos` 是原子配置。传非空对象时,`bucket` 和 `prefix` 必须同时提供。 - 省略 `config.tos` 时,产物使用 Environment 中配置的存储位置;传空对象 `{}` 时,本次 Session 的产物存入方舟公共 TOS。 > **注意** > > 无论沿用还是覆写存储配置,都让 Agent 将交付物写入 outputs 目录,例如 `/workspace/outputs/` 或 `/mnt/session/outputs/`。`config.tos` 覆写只影响 Files API 登记后的产物存储位置,不改变 `resources` 中 `type: tos` 的沙箱挂载目录。 ## 通过 Vaults 注入终端用户凭据(可选) 如果 Agent 需要在 MCP 工具、CLI、SDK 等第三方调用中使用鉴权信息(详情请参见 [使用 Vaults 认证](/docs/use-vaults-authentication)),创建 Session 时通过 `vault_ids` 引用预存凭据。方舟会按凭据类型注入密钥。OAuth 凭据启用自动刷新后,方舟会在访问令牌临近过期时换取新令牌。 最简示例,把 Vaults(凭据保管库)挂到 Session: **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/sessions \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "agent": "agent-20260701120000-abcde", "environment_id": "env-20260701120000-fghij", "vault_ids": ["vlt-20260701120000-pqrst"] }' ``` 多个 Vaults 匹配规则、无匹配时的运行时行为、轮换与诊断,详情请参见 [使用 Vaults 认证](/docs/use-vaults-authentication)。 ## 启动 Session:先订阅事件流,再发送第一个事件 > **注意** > > **创建 Session 仅完成沙箱配置,不会启动任何工作。** 必须发送 `user.message` 事件,Agent 才会开始执行。 这种解耦设计让客户端可以先注入 Vaults 凭据、检查沙箱环境,再发送首个事件启动 Agent。需要实时接收本轮事件时,按以下顺序执行: 1. 打开 `GET /sessions/{session_id}/events/stream` 事件流。 2. 等待服务端返回 `: ready`,确认订阅已经建立。 3. 向 `POST /sessions/{session_id}/events` 提交一条 `user.message`。 4. 继续读取同一条事件流,直到收到 `session.status_idle` 或 `session.status_terminated`。 > **注意** > > SSE 只推送连接建立后产生的事件,不回放历史事件。如果先发送消息再建立连接,客户端可能漏掉已经产生的消息、工具调用或状态事件。 以下示例需要本地已安装 `curl` 和 `jq`: **选项:Curl** ```Bash run_session_turn() ( local session_id="$1" local user_text="$2" local stream_dir local stream_pipe="" local stream_error local stream_pid="" local stream_number=0 local stream_ready=false local seen_ids_file local events_payload local turn_done=false local result_code=1 local message_count=0 local reconnect_count=0 local max_reconnects="${ARK_MAX_SSE_RECONNECTS:-3}" local max_history_pages="${ARK_MAX_HISTORY_PAGES:-100}" local line local data : "${ARK_BASE_URL:?Set ARK_BASE_URL before calling run_session_turn}" : "${ARK_API_KEY:?Set ARK_API_KEY before calling run_session_turn}" : "${session_id:?Pass a Session ID as the first argument}" : "${user_text:?Pass a user message as the second argument}" command -v curl >/dev/null || { printf 'curl is required.\n' >&2 return 1 } command -v jq >/dev/null || { printf 'jq is required.\n' >&2 return 1 } [[ $max_reconnects =~ ^[0-9]+$ ]] || { printf 'ARK_MAX_SSE_RECONNECTS must be a non-negative integer.\n' >&2 return 1 } [[ $max_history_pages =~ ^[1-9][0-9]*$ ]] || { printf 'ARK_MAX_HISTORY_PAGES must be a positive integer.\n' >&2 return 1 } stream_dir=$(mktemp -d) || { printf 'Failed to create a temporary directory for the SSE stream.\n' >&2 return 1 } stream_error="$stream_dir/stream-error.log" seen_ids_file="$stream_dir/seen-event-ids" : >"$stream_error" : >"$seen_ids_file" stop_stream() { exec 3<&- || true if [[ -n $stream_pid ]] && kill -0 "$stream_pid" 2>/dev/null; then kill "$stream_pid" 2>/dev/null || true fi if [[ -n $stream_pid ]]; then wait "$stream_pid" 2>/dev/null || true fi if [[ -n $stream_pipe ]]; then rm -f "$stream_pipe" fi stream_pid="" stream_pipe="" } cleanup_stream() { stop_stream rm -rf "$stream_dir" } trap cleanup_stream EXIT start_stream() { stop_stream stream_number=$((stream_number + 1)) stream_pipe="$stream_dir/events-$stream_number" stream_ready=false if ! mkfifo "$stream_pipe"; then printf 'Failed to create the SSE pipe at %s.\n' "$stream_pipe" >&2 return 1 fi curl -sS -N --fail-with-body --max-time 600 \ "$ARK_BASE_URL/sessions/$session_id/events/stream" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Accept: text/event-stream" >"$stream_pipe" 2>>"$stream_error" & stream_pid=$! exec 3<"$stream_pipe" while IFS= read -r line <&3; do line=${line%$'\r'} if [[ $line == ": ready" ]]; then stream_ready=true break fi done if [[ $stream_ready != true ]]; then printf 'SSE stream closed before it was ready.\n' >&2 if [[ -s $stream_error ]]; then tail -n 1 "$stream_error" >&2 fi return 1 fi } event_seen() { local event_id="$1" [[ -n $event_id ]] && grep -Fqx -- "$event_id" "$seen_ids_file" } remember_event() { local event_id="$1" if [[ -n $event_id ]] && ! event_seen "$event_id"; then printf '%s\n' "$event_id" >>"$seen_ids_file" fi } process_event() { local event_json="$1" local event_id local event_type local stop_reason local retry_status local pending_ids event_id=$(jq -r '.id // empty' <<<"$event_json" 2>/dev/null || true) if event_seen "$event_id"; then return 0 fi remember_event "$event_id" event_type=$(jq -r '.type // empty' <<<"$event_json" 2>/dev/null || true) case "$event_type" in agent.message) jq -r '.content[]? | select(.type == "text") | .text' <<<"$event_json" message_count=$((message_count + 1)) ;; agent.tool_use | agent.mcp_tool_use | agent.custom_tool_use) printf '[tool] %s\n' "$(jq -r '.name // .type' <<<"$event_json")" ;; session.error) retry_status=$(jq -r '.error.retry_status.type // empty' <<<"$event_json") printf '[error] %s: %s\n' \ "$(jq -r '.error.type // "unknown_error"' <<<"$event_json")" \ "$(jq -r '.error.message // "No error message returned."' <<<"$event_json")" >&2 case "$retry_status" in retrying) printf '[session] The service is retrying automatically.\n' >&2 ;; exhausted) printf '[session] Retries were exhausted for this turn.\n' >&2 ;; terminal) printf '[session] The Session cannot continue after this error.\n' >&2 ;; *) printf '[session] Unknown error retry status: %s\n' "$retry_status" >&2 result_code=4 turn_done=true ;; esac ;; session.status_rescheduled) printf '[session] The Session was rescheduled; continue waiting.\n' >&2 ;; session.status_idle) stop_reason=$(jq -r '.stop_reason.type // empty' <<<"$event_json") case "$stop_reason" in end_turn) if ((message_count == 0)); then printf 'The turn ended without an agent.message event.\n' >&2 result_code=5 else printf '[session] end_turn\n' >&2 result_code=0 fi turn_done=true ;; requires_action) pending_ids=$(jq -r '.stop_reason.event_ids // [] | join(",")' <<<"$event_json") printf '[session] requires_action: %s\n' "$pending_ids" >&2 result_code=2 turn_done=true ;; retries_exhausted) printf '[session] retries_exhausted\n' >&2 result_code=3 turn_done=true ;; *) printf 'Unknown session.status_idle stop_reason: %s\n' "$stop_reason" >&2 result_code=5 turn_done=true ;; esac ;; session.status_terminated) printf '[session] terminated\n' >&2 result_code=4 turn_done=true ;; esac } read_history() { local mode="$1" local page="" local page_count=0 local response local event_json while :; do page_count=$((page_count + 1)) if ((page_count > max_history_pages)); then printf 'History recovery exceeded %s pages.\n' "$max_history_pages" >&2 return 1 fi if [[ -n $page ]]; then response=$(curl -sS --fail-with-body --get \ "$ARK_BASE_URL/sessions/$session_id/events" \ -H "Authorization: Bearer $ARK_API_KEY" \ --data-urlencode "limit=200" \ --data-urlencode "order=asc" \ --data-urlencode "page=$page") || return 1 else response=$(curl -sS --fail-with-body --get \ "$ARK_BASE_URL/sessions/$session_id/events" \ -H "Authorization: Bearer $ARK_API_KEY" \ --data-urlencode "limit=200" \ --data-urlencode "order=asc") || return 1 fi while IFS= read -r event_json; do [[ -n $event_json ]] || continue if [[ $mode == "seed" ]]; then remember_event "$(jq -r '.id // empty' <<<"$event_json")" else process_event "$event_json" [[ $turn_done == true ]] && break fi done < <(jq -c '.data[]?' <<<"$response") [[ $turn_done == true ]] && return 0 page=$(jq -r '.next_page // empty' <<<"$response") [[ -n $page ]] || return 0 done } if ! start_stream; then return 1 fi # Mark existing history so reconnect recovery only emits this turn. if ! read_history seed; then printf 'Failed to read the Session history before sending the message.\n' >&2 return 1 fi events_payload=$(jq -n --arg text "$user_text" \ '{events: [{type: "user.message", content: [{type: "text", text: $text}]}]}') curl -sS --fail-with-body \ "$ARK_BASE_URL/sessions/$session_id/events" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d "$events_payload" >/dev/null || return 1 while [[ $turn_done != true ]]; do while IFS= read -r line <&3; do line=${line%$'\r'} if [[ $line == ": server draining, reconnect" ]]; then break fi [[ $line == data:* ]] || continue data=${line#data:} data=${data# } process_event "$data" [[ $turn_done == true ]] && break done [[ $turn_done == true ]] && break if ((reconnect_count >= max_reconnects)); then printf 'SSE reconnect limit reached before the turn finished.\n' >&2 return 1 fi reconnect_count=$((reconnect_count + 1)) printf '[session] Reconnecting SSE and recovering history (%s/%s).\n' \ "$reconnect_count" "$max_reconnects" >&2 # Open the replacement stream first, then recover the disconnect window. if ! start_stream; then return 1 fi if ! read_history recover; then printf 'Failed to recover Session history after reconnecting.\n' >&2 return 1 fi done return "$result_code" ) ``` ```bash export ARK_API_KEY="" export ARK_BASE_URL="https://ark.cn-beijing.volces.com/api/v3" run_session_turn \ "sesn-20260701120100-xxxxx" \ "列出当前工作目录中的文件。" ``` ### 响应模型与下一步 发送事件后,Session 进入 `running` 状态。上面的示例会通过已建立的 SSE 流接收消息、工具调用和状态事件,并在会话进入 `idle` 或 `terminated` 后结束监听。事件字段与断线续传方式请参见 [Session 事件流](/docs/session-event-stream);若仅需轮询状态,可周期性 GET Session 详情,详情请参见 [管理 Session](/docs/manage-session)。 --- # 管理 Session Source: https://ark.volcengine.com/region:cn-beijing/docs/manage-session Session 创建后,你可以查询状态、列出 Session、更新标题和标签、升级运行配置,以及永久删除 Session。 ::: tip 创建 Session 与发送首个事件的方法,详情请参见 [启动 Session](/docs/start-session)。 ::: ## 准备工作 开始前你需要: - 已创建的 API Key:配置为环境变量 `ARK_API_KEY`,详情请参见 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey)。 - 已创建的 Agent:详情请参见 [定义 Agent](/docs/define-agent)。 - 已创建的 Environment:详情请参见 [配置云环境](/docs/configure-cloud-environment)。 本章节示例的 Base URL 与鉴权方式详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 ## Session 状态机 | 状态 | 说明 | | -------------- | --------------------------------------------- | | `idle` | Agent 正在等待输入,例如用户消息或工具确认。普通新建的 Session 以该状态启动 | | `running` | Agent 正在执行任务 | | `terminated` | Session 已终止,不再接收新事件 | | `rescheduling` | 发生暂时性错误后,系统正在重新调度 Session | | `initializing` | Session 正在初始化运行环境或恢复资源 | | `failed` | Session 初始化或运行失败 | | `upgrading` | Session 正在升级 Agent 或 Environment 运行配置 | 这些状态及主要迁移关系如下: ![Session 资源在 initializing、idle、running、upgrading、rescheduling、failed 和 terminated 之间的迁移关系](https://arkdocs.tos-cn-beijing.volces.com/flowcharts/managed-agent/session-resource-state-machine.svg) 状态迁移规律: - `initializing` → `idle`:Session 初始化或资源恢复完成。 - `initializing` → `failed`:Session 初始化或资源恢复失败。 - `idle` → `running`:收到 `user.message` 或 `user.tool_confirmation` 等用户事件。 - `running` → `idle`:Agent 一轮工作结束(`end_turn`)或需要等用户输入(`requires_action`,详情请参见 [Session 事件流](/docs/session-event-stream))。 - `running` → `rescheduling` → `running`:框架遇到暂时性错误后自动重试,你无需介入。 - `idle` → `upgrading` → `idle`:服务端受理运行配置升级,升级完成或回滚后恢复为空闲状态。 - 任意状态 → `terminated`:Session 终止。终止后不再接收事件,但记录与事件历史保留。 > **说明** > > Session 资源的状态值是 `rescheduling`;对应的 SSE 状态事件名是 `session.status_rescheduled`。调用查询接口或使用 `status` 参数过滤时,应传 `rescheduling`,不要传事件名中的 `rescheduled`。 ## 选择获取方式 Session 详情接口只返回资源的最新状态、用量统计和配置快照。实时回复和历史事件由 Session Events API 承载: | 需要获取的内容 | 使用接口 | 返回内容和限制 | | -------------------- | ------------------------------------------ | ------------------------------------------------------------------------- | | 实时接收 Agent 回复和状态 | `GET /sessions/{session_id}/events/stream` | 通过 SSE(Server-Sent Events)协议订阅会话主线程收到的实时事件。请建立 SSE 并等待 `: ready` 后,再发送事件。 | | 已持久化的完整事件 | `GET /sessions/{session_id}/events` | 用于查询会话主线程中已经产生的事件,主要用于历史事件查询和断线补查,返回信息不包含预览帧。 | | 最新状态、累计用量和配置快照 | `GET /sessions/{session_id}` | 查询指定会话的详细信息,包括智能体、会话运行环境、资源、状态和标签等,不返回 Agent 回复或完整事件历史 | 正常交互时,通过 SSE 实时接收 Agent 回复和状态。`GET /sessions/{session_id}/events` 仅用于历史事件查询和断线补查。不要只根据 `status=idle` 判断本轮成功。发送任务、接收回复和判断 `stop_reason` 的完整流程,详情请参见 [Session 事件流](/docs/session-event-stream)。 ## 检索 Session 通过 `GET /sessions/{session_id}` 查询 Session 的详细信息,包括智能体、会话运行环境、资源、状态和标签等: **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/sessions/sesn-20260701120100-klmno \ -H "Authorization: Bearer $ARK_API_KEY" ``` 响应主要字段: - `id`:Session ID。 - `status`:当前状态(见上表)。 - `usage`:累计 token 用量(详情请参见 [Session 事件流 § 跟踪用量](/docs/session-event-stream))。 - `agent`:绑定的 Agent 对象,内含 `id`、`version` 等字段。 - `environment_id`:绑定的云环境。 ## 列出 Session `GET /sessions` 支持按 `agent_id` 过滤、按创建时间倒序分页,响应以 `data` 数组形式返回 Session 列表: **选项:Curl** ```Bash curl "https://ark.cn-beijing.volces.com/api/v3/sessions?agent_id=agent-20260701120000-abcde&limit=20" \ -H "Authorization: Bearer $ARK_API_KEY" ``` ## 更新与升级 Session | 需求 | 接口 | 状态变化 | | --------------------------- | -------------------------------------------------------------------------------- | ----------------------------- | | 修改标题或标签 | [更新 Session 标题和标签](/docs/update-session-api) | 不改变 Session 的运行状态 | | 修改 Agent 或 Environment 运行配置 | [升级会话](/docs/upgrade-session-api) | `idle` → `upgrading` → `idle` | 升级接口保持原 `session_id` 不变,也不支持换绑其他 Agent 或 Environment。发起升级前,Session 必须处于 `idle`,并且上一轮任务以 `end_turn` 结束。接口返回 `upgrading` 后,轮询 `GET /sessions/{session_id}`;状态恢复为 `idle` 表示升级流程已结束。 > **注意** > > 不要通过更新会话接口修改 Agent、Environment、`tools` 或 `mcp_servers`。该接口只更新标题和标签,运行配置变更必须调用升级会话接口。 ## 删除 Session > **注意** > > **删除 Session 操作不可逆。** 删除会永久移除 Session 记录、所有事件和关联沙箱。Session 必须处于 `idle` 或 `terminated` 状态才能删除,其他状态会返回 `InvalidAction`。如果 Session 正在 `running`,先发送 [中断事件](/docs/session-event-stream),等待状态回到 `idle` 后再删除。 **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/sessions/sesn-20260701120100-klmno \ -X DELETE \ -H "Authorization: Bearer $ARK_API_KEY" ``` ## 数据保留与删除影响 Session 资源记录、完整事件、沙箱状态和 Agent 产物使用独立的保留策略: | 对象 | 默认保留与恢复规则 | 删除 Session 后 | | ------------ | --------------------------------------------------------------------------------------------- | ------------------------------------ | | Session 资源记录 | 除非显式删除,否则持续保留 | 资源记录不可再查询 | | Session 事件历史 | 每条已持久化的完整事件默认保留 6 个月;`event_start` 和 `event_delta` 预览帧不写入历史 | 该 Session 的事件全部删除 | | 沙箱状态 | Session 处于 `idle` 且尚未终止时,可以恢复文件系统、已安装软件包和沙箱中的临时文件。Session 连续处于 `idle` 达到 14 天后进入 `terminated` | 关联沙箱及其中的临时状态被清理 | | Agent 产物 | 方舟默认存储只用于临时保存关联产物;写入自有 TOS Bucket 的对象遵循你配置的 Bucket 生命周期 | 默认存储中的关联产物被清理;自有 TOS Bucket 中的对象不受影响 | > **说明** > > Agent、Environment、Memory、Vaults、技能,以及通过 Files API 独立上传的输入文件,都是独立资源,不受 Session 删除影响。 > > 需要长期保留时,在事件到期前将必要记录保存到自己的存储,并将 Agent 产物写入自有 TOS Bucket。产物存储的配置方法,详情请参见 [配置产物存储](/docs/configure-cloud-environment#configure-output-storage)。 > **说明:延长沙箱状态保留期** > > 如果需要继续保留沙箱状态,在当前期限到期前发送一条 `content` 非空的 `user.message`。Session 完成本轮任务并再次进入 `idle` 后,平台重新计算 14 天保留期。省略 `content` 或传入空数组不会刷新保留期。 --- # Session 事件流 Source: https://ark.volcengine.com/region:cn-beijing/docs/session-event-stream 与 Managed Agents 的通信基于事件。接入时应固定遵循“建立 SSE 并等待 `: ready` → 发送事件 → 接收完整事件 → 根据 `stop_reason` 判断结果”的顺序。连接中断后,先建立新流,再通过历史事件接口补齐中断窗口。 ## 准备工作 开始前你需要: - 已创建的 API Key:配置为环境变量 `ARK_API_KEY`,详情请参见 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey)。 - 已创建的 Agent:详情请参见 [定义 Agent](/docs/define-agent)。 - 已创建的 Environment:详情请参见 [配置云环境](/docs/configure-cloud-environment)。 本章节示例的 Base URL 与鉴权方式详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 本地需要安装 `curl` 和 `jq`。 ## 核心交互流程 以下流程适用于云端环境和自托管环境中的业务应用: 1. 通过 `GET /sessions/{session_id}/events/stream` 建立 SSE。 2. 等待服务端返回 `: ready`。 3. 通过 `POST /sessions/{session_id}/events` 发送 `user.message`。 4. 持续接收 `agent.*`、`session.*` 和 `span.*` 事件。 5. 仅在收到 `session.status_idle` 且 `stop_reason.type=end_turn` 时,将本轮判定为正常结束。 > **注意** > > **不要先发送消息再建立 SSE。** SSE 只推送连接建立后产生的事件。先发送消息再建立 SSE,会漏掉连接建立前产生的实时事件,客户端还需要查询历史事件补齐。 正常完成一轮任务时,事件按以下顺序流转: ![业务应用建立 SSE、发送消息并以 session.status_idle 和 end_turn 判断本轮正常结束的顺序](https://arkdocs.tos-cn-beijing.volces.com/flowcharts/managed-agent/session-turn-event-sequence.svg) - 客户端先建立 SSE 并等待 `: ready`,再发送 `user.message`,避免漏掉连接建立前已经产生的事件。 - `session.status_running` 表示 Agent 已开始处理任务;`span.*` 和 `agent.thinking` 按任务执行过程产生,完整回复由 `agent.message` 返回。 - 收到 `agent.message` 不代表本轮结束。客户端继续读取事件,只有 `session.status_idle` 且 `stop_reason.type=end_turn` 表示正常结束。 如需直接复用完整实现,请参见 [运行完整示例](/docs/session-event-stream#complete-example)。 ## 理解事件通信 ### 接口职责 根据不同用途选择对应接口: | 接口 | 客户端动作 | 返回内容和限制 | | --- | --- | --- | | `GET /sessions/{session_id}/events/stream` | 建立 SSE 并等待 `: ready`,实时接收事件 | 只推送连接建立后产生的事件,不回放历史事件 | | `POST /sessions/{session_id}/events` | 发送 `user.*` 或 `system.message` 事件 | HTTP 200 只表示事件已受理,不表示 Agent 已处理或本轮已结束 | | `GET /sessions/{session_id}/events` | 分页查询已持久化的完整事件,用于历史查看和断线补查 | 不包含 `event_start`、`event_delta` 预览帧,也不提供实时推送 | | `GET /sessions/{session_id}` | 查询 Session 最新状态、累计用量和配置快照 | 不返回完整事件历史或 Agent 回复内容 | ### 事件模型 事件类型遵循 `{domain}.{action}` 命名约定。先根据事件域判断方向和职责,再根据完整的 `type` 读取对应结构。 | 事件域 | 方向 | 说明 | | --- | --- | --- | | `user.*`、`system.message` | 客户端 → Session | 提交用户消息、动态系统提示词、中断、工具确认或工具结果 | | `agent.*` | Session → 客户端 | 返回消息、思考过程、工具调用和主子线程通信事件 | | `session.*` | Session → 客户端 | 返回 Session 或子线程的运行、等待、重调度、终止和错误状态 | | `span.*` | Session → 客户端 | 返回模型调用的过程和结果 | 每个完整事件都包含 `id`、`type` 和 `processed_at`。`processed_at` 为 `null` 时,表示事件已进入队列但尚未完成处理。完整事件类型、字段、取值和嵌套结构,详情请参见 [会话事件结构参考](/docs/sessions-events-reference-v2)。 ### 运行环境差异 两种环境中的业务应用共用 Session Events API。差异主要在内置工具的执行责任: | 对比项 | 云端环境 | 自托管环境 | | --- | --- | --- | | Session 事件 | 业务应用建立 Session SSE 并发送事件 | 业务应用建立 Session SSE 并发送事件 | | 内置工具执行方 | 方舟服务端和云端执行环境 | 自托管 Worker 和企业 Sandbox | | 额外链路 | 无 | Worker Poll/Ack Work、建立 Worker SSE 并维持 Heartbeat | | 工具结果 | 方舟完成执行并推送结果 | Worker 回传结果后,方舟继续运行 Session | 自托管环境中,业务应用不直接调用 Work API。Worker 的部署与运行机制,详情请参见 [配置并运行自托管环境](/docs/configure-self-hosted-environment)。 ## 发送事件 客户端通过 `POST /sessions/{session_id}/events` 向 Session 发送 `user.message` 事件,`content` 是一个块数组,可混合文本(`text`)、图片(`image`)、文档(`document`)、视频(`video`)四类块。 - 图片 `image` 的 `source.type` 支持三种:`base64`(内联 base64,需带 `media_type`)、`url`(公网可访问 URL)、`file`(已上传文件 ID,字段为 `file_id`)。 - 文档 `document` 的 `source.type` 支持四种:`file`(已上传文件 ID)、`url`(公网可访问 URL)、`base64`(内联 base64,需带 `media_type`)、`text`(直接内联纯文本,`media_type: text/plain` + `data` 字段);可选 `title` 与 `context` 字段为文档附加标题与背景说明。 - 视频 `video` 的 `source.type` 支持三种:`base64`(内联 Base64,需带 `media_type` 和 `data`)、`url`(公网可访问 URL)、`file`(已上传视频文件 ID,字段为 `file_id`)。三种来源均可通过 `fps` 设置抽帧频率,取值范围为 0.2~5。 - 同一请求的 `content` 数组可混合多个图片、文档或视频块。 - 如需为当前轮次动态追加系统提示词,可在 `events` 数组里 `user.message` 后紧跟一个 `system.message`,详情请参见 [动态系统提示词](/docs/session-event-stream#dynamic-system-prompt)。 ### 常见内容组合示例 **选项:纯文本** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/sessions/sesn-20260701120100-klmno/events \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "events": [{ "type": "user.message", "content": [{"type": "text", "text": "帮我分析这份销售数据,找出 Q2 异常"}] }] }' ``` **选项:文本 + 图片(URL)** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/sessions/sesn-20260701120100-klmno/events \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "events": [{ "type": "user.message", "content": [ {"type": "text", "text": "看下这张趋势图哪里不对"}, {"type": "image", "source": {"type": "url", "url": "https://cdn.example.com/q2-trend.png"}} ] }] }' ``` **选项:文本 + 图片(base64)** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/sessions/sesn-20260701120100-klmno/events \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "events": [{ "type": "user.message", "content": [ {"type": "text", "text": "看下这张趋势图哪里不对"}, {"type": "image", "source": {"type": "base64", "media_type": "image/png", "data": "iVBORw0KGgoAAAANSUhEUgAA..."}} ] }] }' ``` **选项:文本 + 图片(file_id)** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/sessions/sesn-20260701120100-klmno/events \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "events": [{ "type": "user.message", "content": [ {"type": "text", "text": "看下这张趋势图哪里不对"}, {"type": "image", "source": {"type": "file", "file_id": "file_img_abc123"}} ] }] }' ``` **选项:文本 + 文档(file_id)** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/sessions/sesn-20260701120100-klmno/events \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "events": [{ "type": "user.message", "content": [ {"type": "text", "text": "总结这份审计报告的关键风险"}, {"type": "document", "title": "Q2 审计报告.pdf", "context": "Big4 出具的内部审计稿件", "source": {"type": "file", "file_id": "file_pdf_xxx"}} ] }] }' ``` **选项:文本 + 文档(内联纯文本)** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/sessions/sesn-20260701120100-klmno/events \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "events": [{ "type": "user.message", "content": [ {"type": "text", "text": "帮我重写下面这段说明,更技术化一点"}, {"type": "document", "title": "原稿", "source": {"type": "text", "media_type": "text/plain", "data": "本系统提供数据分析能力,包括但不限于报表生成、异常检测..."}} ] }] }' ``` **选项:文本 + 文档(base64 PDF)** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/sessions/sesn-20260701120100-klmno/events \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "events": [{ "type": "user.message", "content": [ {"type": "text", "text": "提取这份合同里的关键条款"}, {"type": "document", "title": "framework-agreement.pdf", "source": {"type": "base64", "media_type": "application/pdf", "data": "JVBERi0xLjQKJaqr..."}} ] }] }' ``` **选项:文本 + 文档(URL)** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/sessions/sesn-20260701120100-klmno/events \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "events": [{ "type": "user.message", "content": [ {"type": "text", "text": "把这份文档总结成 5 点"}, {"type": "document", "title": "公司年报", "source": {"type": "url", "url": "https://investor.example.com/annual-2025.pdf"}} ] }] }' ``` **选项:文本 + 多附件混合** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/sessions/sesn-20260701120100-klmno/events \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "events": [{ "type": "user.message", "content": [ {"type": "text", "text": "结合这份文字稿和两张图给我一份完整分析"}, {"type": "document", "source": {"type": "file", "file_id": "file_doc_01"}}, {"type": "image", "source": {"type": "file", "file_id": "file_img_01"}}, {"type": "image", "source": {"type": "file", "file_id": "file_img_02"}} ] }] }' ``` 请求体的 `events` 字段是事件数组,服务端按入队顺序串行处理。 ### 运行中继续发送消息 Session 处于 `running` 状态时,你仍可以继续发送 `user.message`。服务端会先接收事件并写入待处理队列,等当前 Agent 执行到可调度边界后再把队列中的消息送入后续模型请求。常见边界包括当前模型请求结束、工具执行结果返回、当前回合结束等。 这种设计适合连续对话、实时追加约束、长任务中补充材料等场景。客户端不需要为了发送下一条消息轮询等待 `idle`,但仍需要通过 SSE 观察事件处理进度: - HTTP 响应成功只表示事件已被服务端接收,不表示 Agent 已经处理完这条消息。 - 返回事件的 `processed_at` 为 `null` 时,表示该事件仍在队列中,等待前序事件处理完成。 - 多条排队消息可能在后续一次模型请求中合并处理,Agent 不一定为每条消息生成一条独立回复。 - 如果待处理队列已满,接口会返回 HTTP 409。此时不要快速重试,应等待 Agent 消费队列,或按业务需要发送 `user.interrupt` 中断当前执行。 ### 动态系统提示词 除了在 [定义 Agent](/docs/define-agent) 时配置的固定系统提示词,客户端还可以在发送 `user.message` 的同一请求末尾追加一个 `system.message`,为当前轮次动态注入额外指令;固定系统提示词、运行时 `system.message` 与用户消息拼接后一起送入模型。 | 对比项 | Agent 定义的系统提示词 | 运行时 `system.message` 事件 | | --- | --- | --- | | 位置 | 创建 Agent 时设置 | 发 Events 时传入 | | 生效 | 创建 Session 时拼入,整个 Session 生命周期内固定 | 每次发送后追加到 Session 的系统角色上下文 | 同一请求需要区分 API 提交顺序和模型上下文顺序: | 阶段 | 顺序 | 说明 | | --- | --- | --- | | API 请求中的 `events` 数组 | `user.message` → `system.message` | `system.message` 必须紧跟在 `user.message` 后面,并且是数组的最后一个元素 | | 进入模型前的上下文 | Agent 系统提示词 → 历史 `system.message` → 本轮 `system.message` → 本轮 `user.message` | 服务端先将本轮 `system.message` 追加到系统角色上下文,再发起本轮模型调用 | 模型上下文实际展开如下,省略普通会话历史: - 首轮:`[Agent 系统提示词] [首轮 system.message] [首轮 user.message]`。 - 次轮:`[Agent 系统提示词] [首轮 system.message] [次轮 system.message] [次轮 user.message]`。 `system.message` 按追加(append-only)语义写入 Session 的系统角色上下文,不支持替换或清空。后续每次模型调用都会携带该 Session 内全部历史 `system.message` 内容。需要重置系统提示词时,必须新建 Session。 单独发送 `system.message`、未紧跟 `user.message` 或未放在 `events` 数组末尾,都会返回 HTTP 400 `InvalidPayload`。 **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/sessions/sesn-20260701120100-klmno/events \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "events": [ {"type": "user.message", "content": [{"type": "text", "text": "我的订单 #1234 到哪了?"}]}, {"type": "system.message", "content": [{"type": "text", "text": "你是 ACME 的客服助手,必须使用可用工具查询订单;绝对不能泄露内部客户 ID。"}]} ] }' ``` 请求成功返回 HTTP 200,响应 `data` 数组按入参顺序包含服务端已受理的事件。 ## 接收并处理事件 业务应用通过已经建立的 SSE 连接接收完整事件,并根据 `type` 更新状态、展示回复或进入对应分支。`agent.message`、`agent.thinking` 和 `agent.tool_result` 等完整事件会写入事件历史;客户端应记录事件 ID,用于断线补查时去重。 ### 展示预览内容 需要在完整消息生成前更新界面时,通过 `event_deltas` 指定要预览的事件类型。当前支持 `agent.message` 和 `agent.thinking`: 多值可以重复传入,例如 `?event_deltas=agent.message&event_deltas=agent.thinking`;也可以使用逗号分隔,例如 `?event_deltas=agent.message,agent.thinking`。 > **注意** > > 参数名必须写为 `event_deltas`,不要写成 `event_deltas[]`。服务端会忽略未知参数名和不支持的事件类型,并继续返回 HTTP 200;客户端应根据是否收到对应的 `event_start` 和 `event_delta` 判断预览订阅是否生效。 ![预览内容从 event_start、重复 event_delta 到完整 agent.message 或 agent.thinking 事件的顺序](https://arkdocs.tos-cn-beijing.volces.com/flowcharts/managed-agent/event-preview-assembly-sequence.svg) - `event_start`:标识一个预览事件开始,并给出完整事件将使用的 ID。 - `event_delta`:按 `event_id` 和内容块 `index` 追加增量内容,同一事件可以返回多次。 - 每个预览帧的顶层 `id` 和 `processed_at` 标识该帧自身;使用 `event_start.event.id` 或 `event_delta.event_id` 关联最终完整事件。 - `agent.message` 或 `agent.thinking`:返回最终完整内容。 预览帧不写入事件历史,也可能在连接中断时不完整。界面可以使用预览帧实时更新,持久化和业务判断应以完整事件为准。参数写法和响应格式,详情请参见 [流式获取会话事件](/docs/stream-events-api)。 ### 判断本轮结果 不要使用 HTTP 响应成功、`agent.message` 或 SSE 连接关闭作为本轮结束条件。客户端应继续读取状态事件,并根据以下结果处理: | 状态事件 | 停止原因 | 客户端动作 | | --- | --- | --- | | `session.status_idle` | `end_turn` | 本轮正常结束,可以发送下一条消息 | | `session.status_idle` | `requires_action` | 本轮尚未结束,根据 `event_ids` 回传工具确认或工具结果 | | `session.status_idle` | `retries_exhausted` | 当前轮次重试次数已用尽;本轮结束,但仍可发送新的输入 | | `session.status_rescheduled` | 不适用 | 方舟正在自动恢复,继续监听,不要重复发送原事件 | | `session.status_terminated` | 不适用 | Session 已进入终态,停止发送事件 | 收到 `session.error` 时,还需要检查 `error.retry_status.type`: - `retrying`:服务端正在自动重试,继续监听。 - `exhausted`:当前轮次重试耗尽,等待对应的 `session.status_idle`。 - `terminal`:Session 将进入终止状态,停止发送新事件。 完整状态迁移,详情请参见 [管理 Session](/docs/manage-session)。 ### 处理工具确认 当工具权限策略要求执行前确认时,按以下步骤解除 `requires_action`: 1. 接收 `agent.tool_use` 或 `agent.mcp_tool_use` 事件。 2. 接收 `session.status_idle`,确认 `stop_reason.type=requires_action`。 3. 遍历 `stop_reason.event_ids`,为每个待处理事件发送一条 `user.tool_confirmation`。将事件 ID 原样填入 `tool_use_id`,并将 `result` 设置为 `allow` 或 `deny`。 4. 所有待确认事件处理完成后,Session 返回 `session.status_running` 并继续当前任务。 拒绝工具调用时,可以通过 `deny_message` 返回具体原因。Agent 会据此选择其他工具、降级处理,或说明无法继续执行。此阶段不要发送新的 `user.message` 替代确认。 工具权限策略的配置方法,详情请参见 [工具权限策略](/docs/tool-permission-policy)。 ## 断线重连与历史补查 SSE 接口不支持从断点自动续传。要补齐中断期间产生的事件,按以下顺序处理: 1. 调用 `GET /sessions/{session_id}/events/stream` 打开新的事件流,并等待 `: ready`。 2. 调用 `GET /sessions/{session_id}/events` 查询历史事件。首次请求省略 `page`。 3. 响应包含 `next_page` 时,将该值原样作为下一次请求的 `page`,直到不再返回 `next_page`。 4. 按事件 ID 合并历史事件和新事件流中的实时事件,跳过已经处理的事件。 必须先建立新流再查询历史。如果先查历史再重连,历史查询结束到新流建立之间仍会留下新的监听空窗。本页的 [完整示例](/docs/session-event-stream#complete-example) 实现了该顺序和事件去重。 ## 运行完整示例 以下 `run_session_turn` 函数串联 SSE 建连、事件发送、结果判断和断线补查。SSE 意外断开时,函数先建立新流,再分页查询历史事件,并按事件 ID 去重。 完整 cURL 函数 ```Bash run_session_turn() ( local session_id="$1" local user_text="$2" local stream_dir local stream_pipe="" local stream_error local stream_pid="" local stream_number=0 local stream_ready=false local seen_ids_file local events_payload local turn_done=false local result_code=1 local message_count=0 local reconnect_count=0 local max_reconnects="${ARK_MAX_SSE_RECONNECTS:-3}" local max_history_pages="${ARK_MAX_HISTORY_PAGES:-100}" local line local data : "${ARK_BASE_URL:?Set ARK_BASE_URL before calling run_session_turn}" : "${ARK_API_KEY:?Set ARK_API_KEY before calling run_session_turn}" : "${session_id:?Pass a Session ID as the first argument}" : "${user_text:?Pass a user message as the second argument}" command -v curl >/dev/null || { printf 'curl is required.\n' >&2 return 1 } command -v jq >/dev/null || { printf 'jq is required.\n' >&2 return 1 } [[ $max_reconnects =~ ^[0-9]+$ ]] || { printf 'ARK_MAX_SSE_RECONNECTS must be a non-negative integer.\n' >&2 return 1 } [[ $max_history_pages =~ ^[1-9][0-9]*$ ]] || { printf 'ARK_MAX_HISTORY_PAGES must be a positive integer.\n' >&2 return 1 } stream_dir=$(mktemp -d) || { printf 'Failed to create a temporary directory for the SSE stream.\n' >&2 return 1 } stream_error="$stream_dir/stream-error.log" seen_ids_file="$stream_dir/seen-event-ids" : >"$stream_error" : >"$seen_ids_file" stop_stream() { exec 3<&- || true if [[ -n $stream_pid ]] && kill -0 "$stream_pid" 2>/dev/null; then kill "$stream_pid" 2>/dev/null || true fi if [[ -n $stream_pid ]]; then wait "$stream_pid" 2>/dev/null || true fi if [[ -n $stream_pipe ]]; then rm -f "$stream_pipe" fi stream_pid="" stream_pipe="" } cleanup_stream() { stop_stream rm -rf "$stream_dir" } trap cleanup_stream EXIT start_stream() { stop_stream stream_number=$((stream_number + 1)) stream_pipe="$stream_dir/events-$stream_number" stream_ready=false if ! mkfifo "$stream_pipe"; then printf 'Failed to create the SSE pipe at %s.\n' "$stream_pipe" >&2 return 1 fi curl -sS -N --fail-with-body --max-time 600 \ "$ARK_BASE_URL/sessions/$session_id/events/stream" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Accept: text/event-stream" >"$stream_pipe" 2>>"$stream_error" & stream_pid=$! exec 3<"$stream_pipe" while IFS= read -r line <&3; do line=${line%$'\r'} if [[ $line == ": ready" ]]; then stream_ready=true break fi done if [[ $stream_ready != true ]]; then printf 'SSE stream closed before it was ready.\n' >&2 if [[ -s $stream_error ]]; then tail -n 1 "$stream_error" >&2 fi return 1 fi } event_seen() { local event_id="$1" [[ -n $event_id ]] && grep -Fqx -- "$event_id" "$seen_ids_file" } remember_event() { local event_id="$1" if [[ -n $event_id ]] && ! event_seen "$event_id"; then printf '%s\n' "$event_id" >>"$seen_ids_file" fi } process_event() { local event_json="$1" local event_id local event_type local stop_reason local retry_status local pending_ids event_id=$(jq -r '.id // empty' <<<"$event_json" 2>/dev/null || true) if event_seen "$event_id"; then return 0 fi remember_event "$event_id" event_type=$(jq -r '.type // empty' <<<"$event_json" 2>/dev/null || true) case "$event_type" in agent.message) jq -r '.content[]? | select(.type == "text") | .text' <<<"$event_json" message_count=$((message_count + 1)) ;; agent.tool_use | agent.mcp_tool_use | agent.custom_tool_use) printf '[tool] %s\n' "$(jq -r '.name // .type' <<<"$event_json")" ;; session.error) retry_status=$(jq -r '.error.retry_status.type // empty' <<<"$event_json") printf '[error] %s: %s\n' \ "$(jq -r '.error.type // "unknown_error"' <<<"$event_json")" \ "$(jq -r '.error.message // "No error message returned."' <<<"$event_json")" >&2 case "$retry_status" in retrying) printf '[session] The service is retrying automatically.\n' >&2 ;; exhausted) printf '[session] Retries were exhausted for this turn.\n' >&2 ;; terminal) printf '[session] The Session cannot continue after this error.\n' >&2 ;; *) printf '[session] Unknown error retry status: %s\n' "$retry_status" >&2 result_code=4 turn_done=true ;; esac ;; session.status_rescheduled) printf '[session] The Session was rescheduled; continue waiting.\n' >&2 ;; session.status_idle) stop_reason=$(jq -r '.stop_reason.type // empty' <<<"$event_json") case "$stop_reason" in end_turn) if ((message_count == 0)); then printf 'The turn ended without an agent.message event.\n' >&2 result_code=5 else printf '[session] end_turn\n' >&2 result_code=0 fi turn_done=true ;; requires_action) pending_ids=$(jq -r '.stop_reason.event_ids // [] | join(",")' <<<"$event_json") printf '[session] requires_action: %s\n' "$pending_ids" >&2 result_code=2 turn_done=true ;; retries_exhausted) printf '[session] retries_exhausted\n' >&2 result_code=3 turn_done=true ;; *) printf 'Unknown session.status_idle stop_reason: %s\n' "$stop_reason" >&2 result_code=5 turn_done=true ;; esac ;; session.status_terminated) printf '[session] terminated\n' >&2 result_code=4 turn_done=true ;; esac } read_history() { local mode="$1" local page="" local page_count=0 local response local event_json while :; do page_count=$((page_count + 1)) if ((page_count > max_history_pages)); then printf 'History recovery exceeded %s pages.\n' "$max_history_pages" >&2 return 1 fi if [[ -n $page ]]; then response=$(curl -sS --fail-with-body --get \ "$ARK_BASE_URL/sessions/$session_id/events" \ -H "Authorization: Bearer $ARK_API_KEY" \ --data-urlencode "limit=200" \ --data-urlencode "order=asc" \ --data-urlencode "page=$page") || return 1 else response=$(curl -sS --fail-with-body --get \ "$ARK_BASE_URL/sessions/$session_id/events" \ -H "Authorization: Bearer $ARK_API_KEY" \ --data-urlencode "limit=200" \ --data-urlencode "order=asc") || return 1 fi while IFS= read -r event_json; do [[ -n $event_json ]] || continue if [[ $mode == "seed" ]]; then remember_event "$(jq -r '.id // empty' <<<"$event_json")" else process_event "$event_json" [[ $turn_done == true ]] && break fi done < <(jq -c '.data[]?' <<<"$response") [[ $turn_done == true ]] && return 0 page=$(jq -r '.next_page // empty' <<<"$response") [[ -n $page ]] || return 0 done } if ! start_stream; then return 1 fi # Mark existing history so reconnect recovery only emits this turn. if ! read_history seed; then printf 'Failed to read the Session history before sending the message.\n' >&2 return 1 fi events_payload=$(jq -n --arg text "$user_text" \ '{events: [{type: "user.message", content: [{type: "text", text: $text}]}]}') curl -sS --fail-with-body \ "$ARK_BASE_URL/sessions/$session_id/events" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d "$events_payload" >/dev/null || return 1 while [[ $turn_done != true ]]; do while IFS= read -r line <&3; do line=${line%$'\r'} if [[ $line == ": server draining, reconnect" ]]; then break fi [[ $line == data:* ]] || continue data=${line#data:} data=${data# } process_event "$data" [[ $turn_done == true ]] && break done [[ $turn_done == true ]] && break if ((reconnect_count >= max_reconnects)); then printf 'SSE reconnect limit reached before the turn finished.\n' >&2 return 1 fi reconnect_count=$((reconnect_count + 1)) printf '[session] Reconnecting SSE and recovering history (%s/%s).\n' \ "$reconnect_count" "$max_reconnects" >&2 # Open the replacement stream first, then recover the disconnect window. if ! start_stream; then return 1 fi if ! read_history recover; then printf 'Failed to recover Session history after reconnecting.\n' >&2 return 1 fi done return "$result_code" ) ``` 配置鉴权信息和已有 Session ID,然后调用函数: ```bash export ARK_API_KEY="" export ARK_BASE_URL="https://ark.cn-beijing.volces.com/api/v3" export SESSION_ID="" run_session_turn \ "$SESSION_ID" \ "总结当前工作目录中的 README,并列出三个要点。" ``` 正常完成时,函数输出完整的 `agent.message`,并以状态码 `0` 退出。其他结果使用非零状态码: | 状态码 | 结果 | 处理方式 | | --- | --- | --- | | `0` | `end_turn`,且已收到 `agent.message` | 本轮正常结束 | | `2` | `requires_action` | 根据输出的事件 ID 回传工具确认或工具结果 | | `3` | `retries_exhausted` | 当前轮次失败,可以修正输入后重新发送 | | `4` | Session 终止或发生不可恢复错误 | 停止向当前 Session 发送事件 | | `5` | 状态事件缺少有效停止原因,或正常结束前未收到完整回复 | 查询历史事件和错误信息后再决定是否重试 | ## 中断和继续使用 Session ### 中断 Session 客户端发送 `user.interrupt` 事件可中断 Agent 当前执行。中断会清空尚未被调度的待处理消息,避免旧消息在中断后继续触发模型调用。 如果你只是补充当前任务的信息,直接继续发送 `user.message` 即可,消息会按队列顺序处理;如果你要放弃当前执行并切换到新任务,先发送 `user.interrupt`,等 Session 回到 `idle` 后再发送新的 `user.message`: **选项:Curl** ```Bash # 第一步:发送中断事件 curl https://ark.cn-beijing.volces.com/api/v3/sessions/sesn-20260701120100-klmno/events \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{"events": [{"type": "user.interrupt"}]}' # 第二步:等 Session 回到 idle 后(收到 session.status_idle 事件),发送新消息 curl https://ark.cn-beijing.volces.com/api/v3/sessions/sesn-20260701120100-klmno/events \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "events": [{ "type": "user.message", "content": [{"type": "text", "text": "Instead, focus on fixing the bug in line 42."}] }] }' ``` ### 继续使用空闲 Session 在 Session 仍处于 `idle` 且尚未终止时,按 [发送消息](/docs/session-event-stream#send-message) 流程发送包含真实任务内容的 `user.message`,Session 会从 `idle` 变为 `running`。 如果需要继续保留沙箱状态,在当前期限到期前发送一条 `content` 非空的 `user.message`。Session 完成本轮任务并再次进入 `idle` 后,平台重新计算 14 天保留期。省略 `content` 或传入空数组不会刷新保留期。 需要长期保留事件和 Agent 产物时,将必要数据保存到自己的存储。保留与删除影响,详情请参见 [数据保留与删除影响](/docs/manage-session#checkpoint-retention)。 ## 观测与排查 ### 跟踪用量 客户端通过 `span.model_request_end` 事件获取本次模型请求的 token 用量。事件携带 `model_usage` 字段,记录本次请求的用量明细: ```json { "id": "sevt-mre-01", "type": "span.model_request_end", "processed_at": "2026-05-31T16:00:02.100Z", "model_request_start_id": "sevt-mrs-01", "is_error": false, "model_usage": { "input_tokens": 1820, "output_tokens": 42, "cache_creation_input_tokens": 1500, "cache_read_input_tokens": 0, "speed": "standard" } } ``` 字段含义: - `input_tokens`:未缓存输入 token。 - `output_tokens`:全部输出 token。 - `cache_creation_input_tokens`:本次请求写入提示词缓存的输入 token 数。 - `cache_read_input_tokens`:本次请求从提示词缓存读取的输入 token 数。 - `speed`:本次请求速度档位。 如果需要通过事件流实时统计 Session 级累计用量,客户端需要聚合 `span.model_request_end` 事件的 `model_usage`。如果只需查询服务端记录的最新累计用量,调用 `GET /sessions/{session_id}` 读取 `usage`。 ### 控制台可观测性 控制台 [Managed Agents](https://ark.volcengine.com/region:cn-beijing/managedAgents) 提供 Session 的可视化时间线视图: - Session 列表:全部 Session 及其状态、创建时间、模型。 - 追踪视图:Session 内事件按时间排序展示,仅对开发者与管理员可见。 - 工具执行:每次工具调用及其结果。 ### 调试技巧 - 关注 `session.error`:根据 `error.retry_status.type` 判断服务端会重试、结束当前轮次还是终止 Session。 - 检查工具结果:失败的工具调用通常解释了 Agent 异常行为的原因。 - 跟踪 token 用量:监控消耗以优化提示并降低成本。 ## 相关文档 - 配置内置工具、MCP 工具和自定义工具,详情请参见 [Tools](/docs/tools)。 - 观察主线程与子线程之间的任务委派,详情请参见 [编排 Multi Agent](/docs/multi-agent)。 - 查询、更新、升级或删除 Session,详情请参见 [管理 Session](/docs/manage-session)。 --- # 使用 Vaults 认证 Source: https://ark.volcengine.com/region:cn-beijing/docs/use-vaults-authentication 当你使用 Managed Agents 构建需要访问第三方服务的应用时,可以通过 Vaults(凭据保管库)保存并隔离每个应用用户的凭据。你的服务端只需为每个用户创建 Vault、写入 Credential,并保存用户与 `vault_id` 的映射,无需自行维护密钥存储,也无需在每次调用中重复传递 token。 创建 Session 时,通过 `vault_ids` 传入当前用户的 Vault ID;Agent 调用 MCP 服务时会自动使用对应的 Credential 完成鉴权。这样,同一个 Agent 可以安全地服务多个用户,并分别访问各自有权限的第三方资源。 > **说明:示例** > > 你使用 Managed Agents 构建了一个 GitHub 代码助手。Alice 发起任务时,服务端创建 Session 并绑定 Alice 的 Vault,Agent 使用 Alice 的 GitHub 权限;Bob 发起任务时,服务端绑定 Bob 的 Vault,Agent 使用 Bob 的 GitHub 权限。 ## 准备工作 开始前你需要: - 已创建的 API Key:配置为环境变量 `ARK_API_KEY`,详情请参见 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey)。 - 已创建的 Agent:详情请参见 [定义 Agent](/docs/define-agent)。 - 已创建的 Environment:详情请参见 [配置云环境](/docs/configure-cloud-environment)。 本章节示例的 Base URL 与鉴权方式详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 ## 创建 Vault > **注意:权限边界** > > Vault 和凭据在工作空间内共享,不按 API Key 单独隔离。持有同一工作空间任一 API Key 的服务,都可以通过 Vault ID 在 Session 中引用其中的凭据。仅向受信任的服务开放工作空间 API Key。 Vault 是绑定到某个终端用户的凭据集合。给它一个 `display_name`,可选用 `metadata` 标记以便映射回你自己的用户记录: **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/vaults \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "display_name": "Alice", "metadata": {"external_user_id": "usr_abc123"} }' ``` 响应是完整的 Vault 记录: ```json { "type": "vault", "id": "vlt-20260701120000-pqrst", "display_name": "Alice", "metadata": {"external_user_id": "usr_abc123"}, "created_at": "2026-06-29T10:00:00Z", "updated_at": "2026-06-29T10:00:00Z" } ``` ## 添加凭据 | 类型 | 适用场景 | 注入方式 | | --- | --- | --- | | `mcp_oauth` | MCP 服务器用 OAuth 2.0 | Session 连接 MCP URL 时注入访问令牌;启用自动刷新后,平台在令牌临近过期时换取新令牌 | | `static_bearer` | MCP 用固定 Bearer token(API Key、个人访问令牌) | 无刷新流程,直接注入 | | `mcp_static` | MCP 使用固定密钥,需要以 Bearer、自定义 Header 或 URL 查询参数注入 | 通过 `injection_type` 选择注入位置 | | `environment_variable` | 通过环境变量鉴权的命令行、SDK、直接 API 调用 | 沙箱内是不透明占位符,**出口处**替换为真实值,Agent 永远看不到密钥 | | `env_oauth` | CLI 或 SDK 使用短效 OAuth 访问令牌 | 按 `secret_name` 注入;启用自动刷新后,在 Session 使用凭据时换取新令牌 | 你提供的实际密钥(`token`、`access_token`、`refresh_token`、`client_secret`、`secret_value`)是敏感的**只写**字段,API 响应不会返回这些字段。 ### MCP OAuth 凭据 当 MCP 服务器使用 OAuth 2.0 时,使用 `mcp_oauth`。创建凭据时,配置 MCP 服务地址和当前访问令牌。 如需启用自动刷新,创建或更新凭据时同时提供 `expires_at` 和完整的 `refresh` 对象。Session 连接 MCP 服务时,平台读取该凭据。访问令牌进入 `expires_at` 前 5 分钟刷新窗口时,平台自动换取并注入新令牌。该机制由读取操作触发,不在后台定时刷新。 `refresh.token_endpoint_auth.type` 三选一: - `none`:公共客户端,不提供 `client_secret`。 - `client_secret_basic`:使用 `client_secret` 的 HTTP Basic 鉴权,同时提供 `client_secret`。 - `client_secret_post`:把 `client_secret` 放在 POST 请求体里,同时提供 `client_secret`。 **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/vaults/vlt-20260701120000-pqrst/credentials \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "display_name": "Alice Slack", "auth": { "type": "mcp_oauth", "mcp_server_url": "https://mcp.slack.com/mcp", "access_token": "xoxp-...", "expires_at": "2099-12-31T23:59:59Z", "refresh": { "token_endpoint": "https://slack.com/api/oauth.v2.access", "client_id": "1234567890.0987654321", "scope": "channels:read chat:write", "refresh_token": "xoxe-1-...", "token_endpoint_auth": { "type": "client_secret_post", "client_secret": "abc123..." } } } }' ``` ### MCP 静态 Bearer 凭据 当 MCP 服务器接受固定 Bearer token(API Key、个人访问令牌) 时,用 `static_bearer`。无需刷新流程: **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/vaults/vlt-20260701120000-pqrst/credentials \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "display_name": "Linear API key", "auth": { "type": "static_bearer", "mcp_server_url": "https://mcp.linear.app/mcp", "token": "lin_api_your_linear_key" } }' ``` ### MCP 静态凭据 当 MCP 服务器使用固定密钥,但不一定采用 Bearer 鉴权时,使用 `mcp_static`。通过 `injection_type` 选择注入方式: - `bearer`:以 `Authorization: Bearer ` 请求头注入。不要传 `injection_name`,`token` 中也不要包含 `Bearer ` 前缀。 - `header`:以自定义请求头注入,必须通过 `injection_name` 指定请求头名称。 - `query`:以 URL 查询参数注入,必须通过 `injection_name` 指定参数名。 以下示例将密钥注入 `X-API-Key` 请求头: ```json { "auth": { "type": "mcp_static", "mcp_server_url": "https://mcp.example.com/mcp", "token": "", "injection_type": "header", "injection_name": "X-API-Key" } } ``` > **说明** > > **最小权限原则。** 把固定密钥的权限范围限定为 Agent 所需的最小集合。Agent 可以执行该密钥允许的任何操作,过大的权限范围会在 Agent 异常时扩大影响。 ### 环境变量凭据 用 `environment_variable` 通过环境变量对外部服务鉴权,适用于命令行、SDK 或直接 API 调用。 `networking.allowed_hosts` 控制密钥可以被替换到哪些出站主机: - `"type": "limited"` + 显式主机列表(**推荐**)。 - `"type": "unrestricted"`(仅当调用方访问的域名无法提前枚举时使用)。 **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/vaults/vlt-20260701120000-pqrst/credentials \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "display_name": "Notion API key for sandbox", "auth": { "type": "environment_variable", "secret_name": "NOTION_API_KEY", "secret_value": "sk-your-secret-here", "networking": { "type": "limited", "allowed_hosts": ["api.notion.com"] } } }' ``` > **说明** > > **替换仅发生在出站方向。** 如果客户端使用存储的密钥交换临时访问令牌,返回的令牌会以未脱敏形式进入运行环境。此类流程应由业务侧管理令牌交换和存储。 ### 环境 OAuth 凭据 当 CLI 或 SDK 需要从环境变量读取 OAuth 访问令牌时,使用 `env_oauth`。创建凭据时,先配置当前访问令牌(`access_token`)、注入令牌的环境变量名(`secret_name`),以及允许携带该令牌的目标主机(`networking`)。 对于会过期的访问令牌,可以启用自动刷新。创建或更新凭据时,提供以下信息: - 刷新时机:通过 `expires_at` 提供当前访问令牌的过期时间。 - 令牌端点:通过 `refresh.token_endpoint` 提供第三方 OAuth 服务的令牌端点。 - 刷新令牌:通过 `refresh.refresh_token` 提供换取新访问令牌的凭据。 - 客户端身份:通过 `refresh.client_id` 和 `refresh.token_endpoint_auth` 提供 OAuth 客户端身份及鉴权方式。鉴权方式需要客户端密钥时,还需提供 `refresh.token_endpoint_auth.client_secret`。 Session 访问 `networking` 允许的目标主机时,平台读取该凭据。访问令牌进入 `expires_at` 前 5 分钟刷新窗口时,平台调用 `refresh.token_endpoint` 获取新令牌、更新凭据,再把新令牌注入出站请求。该机制由读取操作触发,不在后台定时刷新。 **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/vaults/vlt-20260701120000-pqrst/credentials \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "display_name": "GitHub CLI OAuth", "auth": { "type": "env_oauth", "access_token": "", "expires_at": "", "refresh": { "token_endpoint": "https://github.com/login/oauth/access_token", "client_id": "", "refresh_token": "", "token_endpoint_auth": { "type": "client_secret_post", "client_secret": "" } }, "secret_name": "GITHUB_TOKEN", "networking": { "type": "limited", "allowed_hosts": ["api.github.com"] } } }' ``` > **注意** > > - **启用自动刷新时,同时提供 `expires_at` 和完整的 `refresh` 对象。** 缺少 `expires_at` 时,平台无法判断刷新时机;缺少 `refresh` 时,平台不会调用 OAuth 令牌端点。 > - **OAuth 令牌端点必须返回 JSON。** `access_token` 必须是字符串;如果返回 `expires_in`,该字段必须是整数秒数。`expires_in` 返回 `"3600"` 等字符串值时,刷新失败。平台会保留当前访问令牌,本次出站请求可能因令牌过期返回 401。检查 `refresh.token_endpoint` 返回字段的类型和 `refresh.token_endpoint_auth` 配置;刷新令牌失效时,重新授权并更新凭据。 > - **替换发生在沙箱出口处,不在沙箱内。** 沙箱里的进程看到的是不透明占位符,而不是真实值。具体影响如下: > - 启动时校验凭据格式的客户端可能拒绝占位符。 > - 用密钥做请求签名的客户端(例如 AWS SigV4)会生成无效签名。 > - 环境变量注入只适合把密钥值原样写入出站请求头的客户端。 > - **通过凭据限制注入目标。** 在凭据的 `networking` 中设置 `type: limited`,并通过 `allowed_hosts` 显式列出允许注入的出站主机。 ### 凭据约束 - **每个 Vault 内的匹配键必须唯一。** `mcp_server_url`(`mcp_oauth`、`static_bearer`、`mcp_static`)和 `secret_name`(`environment_variable`、`env_oauth`)在同一 Vault 的有效凭据中不能重复。重复创建返回 409。 - **匹配键不可变。** 要修改 `mcp_server_url` 或 `secret_name`,需要删除旧凭据,再创建新凭据。 - **每个 Vault 最多包含 100 个凭据。** 超出限制时返回 409。 MCP 类型凭据(`mcp_oauth`、`static_bearer`、`mcp_static`)在创建时会立即连接目标 MCP 服务器探测握手。无法完成握手时,创建请求返回 4xx 错误。`environment_variable` 和 `env_oauth` 不在创建时验证密钥或访问令牌是否有效;无效值会在 Session 访问对应主机时表现为鉴权错误或下游服务错误,但不会阻止 Session 继续运行。 ## 在创建 Session 时引用 Vaults 创建 Session 时传 `vault_ids` 数组,把一个或多个 Vaults 挂到 Session: **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/sessions \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "agent": "agent-20260701120000-abcde", "environment_id": "env-20260701120000-fghij", "vault_ids": ["vlt-20260701120000-pqrst"], "title": "Alice Slack digest" }' ``` **运行时行为**: - 当 Agent 连接到某 MCP URL 时,**没有任何凭据匹配** `mcp_server_url` → 尝试匿名连接;若服务器要求鉴权则报错。 - **多个 Vaults 都包含匹配凭据** → **第一个匹配的 Vaults 优先**。 - 在 [多 Agent](/docs/multi-agent) 中,Vaults 凭据**按线程**生效;若某 Agent 自身定义里声明了匹配的 MCP 服务器,该 Agent 用这些凭据鉴权。 ## 轮换凭据 密钥值和 `display_name` 可以更新。结构性字段(`mcp_server_url`、`secret_name`、`token_endpoint`、`client_id`) 在创建后即被锁定。要修改结构性字段,删除旧凭据再创建新的: **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/v3/vaults/vlt-20260701120000-pqrst/credentials/vcrd-20260701120500-uvwxy \ -X POST \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "auth": { "type": "mcp_oauth", "access_token": "xoxp-new-...", "expires_at": "2099-12-31T23:59:59Z", "refresh": {"refresh_token": "xoxe-1-new-..."} } }' ``` OAuth 凭据的自动刷新信息可按以下方式更新: - 启用自动刷新:在 `auth` 中同时提供 `expires_at` 和完整的 `refresh` 对象。`token_endpoint_auth.type` 为 `client_secret_basic` 或 `client_secret_post` 时,同时提供 `client_secret`;为 `none` 时,省略 `client_secret`。 - 更新自动刷新信息:只提供需要变更的字段,未提供的字段保留原值。可以更新 `refresh_token`、`token_endpoint_auth`、`resource` 和 `scope`,不能修改 `token_endpoint` 和 `client_id`。 ## 凭据生命周期 Session 运行期间,平台在使用凭据时重新解析当前值。更新或删除凭据后,后续请求会读取新的凭据状态,无需重启 Session。 对于已启用自动刷新的 `mcp_oauth`、`env_oauth` 凭据,读取操作会在访问令牌进入 5 分钟刷新窗口时触发自动刷新。刷新成功后,平台持久化新的访问令牌和过期时间;OAuth 服务同时轮换 `refresh_token` 时,平台也会保存新的 `refresh_token`。 ## 其他操作 - 列出 Vault、凭据:`GET /vaults` 或 `GET /vaults/{vault_id}/credentials`;分页返回,按最新优先排序。 - 如需停用单个凭据,删除对应凭据;如需停用某个终端用户的全部凭据,删除对应 Vault。删除操作不可恢复。 --- # 上传与挂载文件 Source: https://ark.volcengine.com/region:cn-beijing/docs/upload-and-mount-files 本文介绍如何在方舟 Managed Agents 中上传和挂载输入文件、在 Session 运行时管理文件资源,以及查询 Agent 生成的产物。 Managed Agents 支持挂载通过 [文件输入(Files API)](/docs/file-api) 或 [TOS 对象存储](https://docs.volcengine.com/docs/6349/74820?lang=zh) 上传的文件,再将文件作为 Session 资源挂载到沙箱环境目录中。Agent 可以读取这些输入文件,并将最终产物写入 `/mnt/session/outputs/`。 > **注意** > > 挂载 TOS 文件前,需要确保 TOS 和 Managed Agents 在同一火山账号中。 ## 上传文件 你可以使用 Files API 或 TOS 上传需要被 Agent 读取的文件。 - 使用 Files API: 先将本地文件上传到 Files API。上传成功后,平台会返回 `file_id`,后续创建 Session 或向运行中的 Session 追加文件资源时都需要使用该 ID。 > **说明** > > 设置 `purpose=agent`,指定该文件供 Agent 使用。 ```Bash file=$( curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/files" \ -H "Authorization: Bearer $ARK_API_KEY" \ -F 'purpose=agent' \ -F 'file=@path/of/your/file' ) FILE_ID=$(jq -er '.id' <<<"$file") echo "File ID: $FILE_ID" ``` - 使用 TOS 上传: 以下示例使用 TOS Python SDK 上传本地文件,更多使用方式,请参考 [TOS 官方文档](https://docs.volcengine.com/docs/6349/74820?lang=zh)。 ```python import os import tos ak = os.getenv("TOS_ACCESS_KEY") sk = os.getenv("TOS_SECRET_KEY") endpoint = "tos-cn-beijing.volces.com" region = "cn-beijing" bucket_name = "" object_key = "" # The path of the uploaded file. For example: agent-files/skill.md file_name = "/path/of/your/file" # Local file path try: client = tos.TosClientV2(ak, sk, endpoint, region) result = client.put_object_from_file( bucket_name, object_key, file_name, ) print("upload success") print("request_id:", result.request_id) print("etag:", result.etag) except tos.exceptions.TosClientError as e: print("client error:", e.message) print("cause:", e.cause) except tos.exceptions.TosServerError as e: print("server error code:", e.code) print("request_id:", e.request_id) print("message:", e.message) print("status_code:", e.status_code) print("request_url:", e.request_url) except Exception as e: print("unknown error:", str(e)) ``` ## 在创建 Session 时挂载文件 创建 Session 时,在 `resources` 数组中声明需要挂载的文件。 > **说明** > > 你也可以在 [Sessions 页面](https://ark.volcengine.com/region:cn-beijing/managed-agents/sessions?projectName=default) 创建 Session。 - 通过 Files ID 挂载: 每个文件资源至少需要包含 `type` 和 `file_id`。 `mount_path` 可选。建议设置 `mount_path`,让 Agent 可以从稳定、可读的路径访问文件。如果不显式指定路径,请确保上传文件名足够清晰,便于 Agent 识别文件用途。 ```bash session=$( curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/sessions" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d @- < **说明** > > `mount_path` 为云端沙箱中的目标挂载路径,通过 `file_id` 传入的文件将按照指定路径挂载到 `/mnt/session/uploads/` 目录中。 > 挂载时如指定 `my-skills/skill-1.md` 路径,挂载文件路径为 `/mnt/session/uploads/my-skills/skill-1.md`。 挂载后,平台会为该 Session 内的文件实例生成新的 `file_id`。这些 Session 内副本不计入用户的文件存储额度。 - 从 TOS 挂载: ```bash session=$( curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/sessions" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d @- <", "tos_key": "path/of/the/tos/directory/" } ] } EOF ) SESSION_ID=$(jq -er '.id' <<<"$session") echo "Session ID: $SESSION_ID" ``` > **说明** > > - `tos_key` 需为 TOS 桶中的一个目录,且必须以 `/` 结尾。例如 `project-resources/`。 > - 文件将被挂载至云端沙箱的 `/mnt/session/storage/` 目录中。 ## 挂载多个文件 如果一次任务需要多个输入文件,可以在 `resources` 中添加多个条目。单个 Session 最多支持挂载 100 个文件。 以 Files ID 为例: ```json "resources": [ { "type": "file", "file_id": "" }, { "type": "file", "file_id": "" }, { "type": "file", "file_id": "" } ] ``` ## 在 Session 运行时管理文件 Session 创建后,可以通过 Session Resources API 继续添加文件,并查询当前已挂载的资源。 以下示例沿用前面创建 Session 后写入的 `$SESSION_ID`;添加 Files API 文件时也沿用上传步骤写入的 `$FILE_ID`。 ### 添加文件资源 ```bash resource=$( curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/sessions/$SESSION_ID/resources" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d @- < ## 获取 Session 运行时产物 Agent 将需要交付的文件写入 `/mnt/session/outputs/` 后,平台会将这些文件注册为当前 Session 下 `purpose=agent` 的文件。需要在你的服务中展示或下载报告、图片、视频、文档或代码等产物时,通过 Files API 获取: 1. 调用 `GET /files?scope_id=&purpose=agent`,分页查询该 Session 的 Agent 产物。 2. 从列表响应中获取文件 ID、文件名、文件大小、MIME 类型和 `download_url`。 3. 使用 `download_url` 下载文件内容。 Seedance Managed Agent 生成的图片和视频也遵循相同规则。生成工具会将最终产物写入 `/mnt/session/outputs/` 并注册到 Files API,业务系统通过 Session ID 查询和下载产物。 ```Bash # List files associated with a session. curl -sS --fail-with-body \ "https://ark.cn-beijing.volces.com/api/v3/files?scope_id=$SESSION_ID&purpose=agent" \ -H "Authorization: Bearer $ARK_API_KEY" ``` > **说明** > > `scope_id` 只筛选当前 Session 下已注册为 `purpose=agent` 的输出产物,不包含通过 `resources` 挂载到 `/mnt/session/uploads/` 的输入文件副本,也不按 `/mnt/session/storage/` 中的用户 TOS 对象做目录扫描。查询挂载输入文件,调用 [查询会话资源列表](/docs/list-resources-api)。 列表响应中的 `download_url` 是服务端签发的预签名下载地址,具有时效性。 创建 Session 前,按产物的保留要求选择存储方式: | 你的配置 | 产物位置 | 你需要做什么 | | --- | --- | --- | | 不配置 `config.tos` | 方舟公共 TOS | 在平台 TTL 到期前下载所需文件。删除 Session 时,平台会清理默认存储中的关联产物。 | | 在 Environment 或 Session 覆写中配置 `config.tos` | 你的 TOS Bucket。平台从 outputs 目录注册产物时,Files API 写入前缀为 `{prefix}outputs/{env-id}/{session-id}/`;最终对象路径以响应中的 `tos.object_key` 为准 | 在 TOS 中管理对象生命周期。删除 Session 不会删除 Bucket 中的对象。 | 配置 Environment 产物存储及按 Session 临时覆写的方法,详情请参见 [配置产物存储](/docs/configure-cloud-environment#configure-output-storage) 和 [覆写产物存储](/docs/start-session#override-output-storage)。 > **说明** > > 需要保存 Agent 产物时配置 `config.tos`,对应 Files API 登记的输出产物存储位置。需要挂载输入或共享数据时配置 `resources` 中的 `type: tos`,对应沙箱内的 `/mnt/session/storage/`。 ## 支持的文件类型 Agent 可以处理多种文件类型。常见类型包括: - 源代码文件,例如 `.py`、`.js`、`.ts`、`.go`、`.rs` 等。 - 数据文件,例如 `.csv`、`.json`、`.xml`、`.yaml`。 - 文本文档,例如 `.txt`、`.md`。 - 归档文件,例如 `.zip`、`.tar.gz`;Agent 可以在沙箱中使用 bash 解压后处理。 - 二进制文件;是否能正确处理取决于沙箱内是否具备相应工具。 ## 使用建议 - 挂载到沙箱中的文件是只读副本。Agent 可以读取这些文件,但不能直接修改原始上传文件。 - 如果任务需要产出修改后的版本,应将结果写入沙箱中的新路径。 - 需要回传的输出文件,应在任务说明中要求 Agent 写入 `/mnt/session/outputs/`。需要长期保存时,为 Environment 配置自己的 TOS Bucket,并在 TOS 中管理对象生命周期。 - 如果运行中的 Session 不再需要某个大文件,及时移除对应资源,减少后续工具调用的上下文干扰。 --- # 持久化记忆 Source: https://ark.volcengine.com/region:cn-beijing/docs/persistent-memory 本文介绍如何在方舟 Managed Agents 中使用记忆存储(Memory Store),为 Agent 提供可跨 Session 保留的长期记忆。 默认情况下,每个 Session 都从新的上下文开始。Session 结束后,Agent 在本次运行中积累的偏好、约定、排障经验或业务背景不会自动带到下一次任务中。Memory Store 用于保存这些可复用信息,并在后续 Session 中重新挂载给 Agent 使用。 ## 基本概念 将 Memory Store 挂载到 Session 后,Agent 可以根据挂载时配置的访问权限读取或修改记忆内容。 每条 Memory 都有独立路径,您可以通过 API 或控制台直接读取、创建、更新和删除。 使用 Memory Store 时,需要在创建 Agent 时启用 Agent Toolset。可执行的操作由挂载时的 `access` 决定。 ## 创建 Memory Store 创建 Memory Store 时必须提供 `name`;`description` 可选。提供 `description` 时,该字段会展示给 Agent,用于说明这个 Store 中保存的内容和使用场景。 ```bash store=$( curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/memory_stores" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "name": "", "description": "" }' ) STORE_ID=$(jq -er '.id' <<<"$store") echo "Memory Store ID: $STORE_ID" ``` 返回的 Memory Store ID 通常形如 `memstore-...`。创建 Session 并挂载记忆时,需要传入该 ID。 ## 预置 Memory 内容 在 Agent 开始运行前,可以先向 Store 中写入参考资料,例如项目规范、用户偏好、输出格式、术语表等。 根据写入数量选择接口: - 调用 [创建记忆](/docs/create-memory-api) 写入单条 Memory,适合补充零散内容。 - 调用 [批量创建记忆](/docs/batch-create-memories-api) 批量写入多条 Memory,适合初始化术语表、用户偏好或输出模板。 ```Bash curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/memory_stores/$STORE_ID/memories" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "path": "/.md", "content": "" }' ``` 单条 Memory 的内容上限为 100 KiB(102400 字节),约 25k tokens。单个 Store 最多保存 2,000 条 Memory。建议将记忆拆成多个小而聚焦的文件,避免使用长文档。 ## 挂载 Memory Store 到 Session Memory Store 需要在创建 Session 时通过 `resources` 数组挂载。与文件和代码仓库资源不同,Memory Store 只能在 Session 创建时挂载,不支持在运行中的 Session 中追加或移除。 以下示例将访问权限显式设置为 `read_only`,使 Agent 可以读取 Memory Store,但不能修改其中的内容。 ```bash session=$( curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/sessions" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d @- <" }' ) MEMORY_ID=$(jq -r '.id' <<<"$memory") MEMORY_SHA=$(jq -r '.content_sha256' <<<"$memory") ``` ### 更新 Memory 更新接口可修改内容、路径,或同时修改二者。修改路径可用于重命名或归档。 ```Bash curl -sS --fail-with-body -X POST "https://ark.cn-beijing.volces.com/api/v3/memory_stores/$STORE_ID/memories/$MEMORY_ID" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "path": "/new/path" }' ``` ### 删除 Memory ```Bash curl -sS --fail-with-body -X DELETE "https://ark.cn-beijing.volces.com/api/v3/memory_stores/$STORE_ID/memories/$MEMORY_ID" \ -H "Authorization: Bearer $ARK_API_KEY" ``` ## 管理 Memory Store 除创建外,Memory Store 还支持查询、删除等操作。 ### 查询 Store 列表 ```Bash curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/memory_stores" \ -H "Authorization: Bearer $ARK_API_KEY" ``` ### 删除 Store ```Bash curl -sS --fail-with-body -X DELETE "https://ark.cn-beijing.volces.com/api/v3/memory_stores/$STORE_ID" \ -H "Authorization: Bearer $ARK_API_KEY" ``` ## 最佳实践 当 Store 达到 2,000 条 Memory 上限后,新 Memory 写入会失败。已有 Memory 仍可读取和更新。建议按以下方式管理长期记忆: - **按用途拆分 Store**:不要把所有内容放进一个通用 Store。可以按用户、团队共享知识、项目上下文分别建 Store。 - **在接近上限前整理内容**:定期删除过期或重复 Memory,或将碎片化内容整理成更稳定的摘要 Store。 --- # 使用 Dream 整理长期记忆 Source: https://ark.volcengine.com/region:cn-beijing/docs/dream-overview 当 Agent 在多个 Session 中积累了重复、过期或相互冲突的记忆时,逐条人工整理会越来越慢,也容易遗漏历史任务中的稳定规律。**Dream** 可以按照指定规则整理已有记忆和相关 Session,在后台生成一份独立的新 Memory Store,供后续任务复用。 ## 场景说明 根据需要解决的问题选择 Dream 的使用方式: | 场景 | 何时使用 | 带来的价值 | | --- | --- | --- | | 定期整理 | Memory Store 已积累重复、过期或冲突的内容。 | 减少记忆噪声,为后续 Session 保留稳定结论。 | | 冷启动记忆库 | 尚未建立长期记忆,但已有可复用的历史 Session。 | 将历史对话转化为第一份记忆库,避免重新整理和录入。 | | 提炼特定主题 | 主 Memory Store 包含多个主题,需要为特定任务准备专用记忆。 | 隔离相关知识,减少无关内容对 Agent 检索和判断的干扰。 | | 跨用户沉淀 | 多个用户反复遇到相似问题,并形成了可复用的解决方法。 | 剥离身份信息后,将个人经验转化为团队可复用的问题模式和解决步骤。 | 以下任务不适合使用 Dream: - 修改某条 Memory 的一个字段或一句话:直接调用 Memory 更新接口。 - 在 Session 运行过程中立即记录新信息:创建 Session 时以 `read_write` 挂载 Memory Store,并在系统提示词或任务指令中明确要求 Agent 写入需要长期保留的信息。 ## 核心概念 - **输入 Memory Store**:提供整理前的长期记忆。只从历史对话冷启动时,可以使用空 Store。 - **历史 Session**:提供本次整理的对话素材。每个 Dream 需要选择 1~100 个相关 Session。 - **Instructions**:定义保留范围、隐私剥离、冲突处理和输出结构。 - **Dream**:在后台执行记忆筛选、合并、去重和归档。 - **输出 Memory Store**:保存整理结果,与输入 Memory Store 相互独立。 ## 工作机制 Dream 按以下顺序处理记忆: ![Dream 记忆整理流程:准备 Memory Store、历史 Session 和 Instructions,Dream 在后台整理记忆并输出新的 Memory Store。验收通过后挂载到新 Session,未通过时删除输出。](https://arkdocs.tos-cn-beijing.volces.com/flowcharts/managed-agent/dream-memory-consolidation-flow.svg) ## 整理并挂载长期记忆 以下步骤从准备输入开始,依次创建 Dream、等待任务结束、检查输出,并在结果符合预期后挂载到新的 Session。 ### 1. 准备输入 Dream 读取一个 Memory Store 和 1~100 个历史 Session。输入范围直接影响整理质量: - 整理已有记忆:选择需要去重、更新或重新组织的 Store。 - 从历史 Session 冷启动:先创建一个空 Store,再将它作为输入。 - 提炼特定主题:选择包含通用背景的主 Store。 - 只选择与本次整理目标相关的 Session,排除测试会话、无效对话和不应长期保存的临时信息。 - 检查敏感信息,确保后续 Instructions 包含对应的剥离规则。 执行示例前,完成以下准备: - 本地已安装 cURL 和 `jq`。 - `MODEL_ID` 对应的模型已在当前项目中开通。 - 输入 Memory Store 和历史 Session 属于当前账号和项目。 记录输入资源和执行模型,后续示例继续使用这些环境变量: ```bash export ARK_API_KEY="" export MODEL_ID="" export INPUT_MEMORY_STORE_ID="" export SESSION_ID_1="" export SESSION_ID_2="" ``` > **注意** > > 不要把包含未脱敏个人信息的 Session 直接用于团队级整理。如果 Instructions 没有明确要求剥离姓名、邮箱、URL、订单号等身份信息,输出可能继续保留这些内容。 ### 2. 创建 Dream 使用示例中的 Instructions 创建 Dream;需要调整整理规则时,参见 [编写 Instructions 的最佳实践](/docs/dream-overview#instructions)。 ```bash dream=$( curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/dreams" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d @- < **注意** > > 创建响应返回 `OUTPUT_MEMORY_STORE_ID`,只表示服务端已经为本次任务分配输出 Memory Store。Dream 处于 `pending` 或 `running` 状态时,不能读取、修改或挂载该 Store。等待任务结束后,按 [检查输出](/docs/dream-overview#verify-output) 处理。 ### 3. 跟踪任务 通过 [查询 Dream](/docs/get-dream-api) 接口轮询任务,直到状态变为 `completed`、`failed` 或 `canceled`。 | 状态 | 说明 | | --- | --- | | `pending` | 任务已受理,正在等待执行。 | | `running` | 任务正在读取输入并整理记忆。 | | `completed` | 任务已完成,输出 Memory Store 可以挂载、读取和修改。 | | `failed` | 任务执行失败。通过 `error.type` 和 `error.message` 定位原因;输出 Memory Store 可能保留部分结果。 | | `canceled` | 任务已取消;输出 Memory Store 可能为空,也可能保留取消前生成的部分结果。 | `pending` 和 `running` 不是失败状态,客户端应继续查询。Dream 最长执行 48 小时;任务超过该时限后进入 `failed` 状态,`error.type` 为 `timeout`。 以下脚本每 30 秒查询一次,最多等待 48 小时。任务结束后,脚本更新 `OUTPUT_MEMORY_STORE_ID`;如果任务失败或取消,还会输出错误信息并提示检查部分结果: ```bash MAX_ATTEMPTS=5760 POLL_INTERVAL_SECONDS=30 status="" for ((attempt = 1; attempt <= MAX_ATTEMPTS; attempt++)); do dream=$( curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/dreams/$DREAM_ID" \ -H "Authorization: Bearer $ARK_API_KEY" ) status=$(jq -er '.status' <<<"$dream") printf 'Dream status: %s (%d/%d)\n' "$status" "$attempt" "$MAX_ATTEMPTS" case "$status" in completed | failed | canceled) break ;; esac if ((attempt < MAX_ATTEMPTS)); then sleep "$POLL_INTERVAL_SECONDS" fi done if [[ "$status" != "completed" && "$status" != "failed" && "$status" != "canceled" ]]; then printf 'Dream did not reach a terminal state within 48 hours.\n' >&2 exit 1 fi OUTPUT_MEMORY_STORE_ID=$( jq -er '.outputs[] | select(.type == "memory_store") | .memory_store_id' <<<"$dream" ) export OUTPUT_MEMORY_STORE_ID printf 'Output Memory Store ID: %s\n' "$OUTPUT_MEMORY_STORE_ID" if [[ "$status" == "failed" || "$status" == "canceled" ]]; then jq -r '.error.message // ("Dream ended with status: " + .status)' <<<"$dream" >&2 printf 'Inspect the output Memory Store before deciding whether to use it.\n' >&2 fi ``` > **说明:任务跟踪说明** > > - 取消任务:取消 `pending` 或 `running` 状态的任务时,[取消 Dream](/docs/cancel-dream-api) 接口先记录取消意图。接口响应仍可能返回 `pending` 或 `running`,需要继续查询,直到任务结束。 > - 查看用量:`usage` 提供任务实际消耗的输入、输出和缓存 token 数。`usage=null` 表示当前响应暂未提供用量数据。 > - 查看运行时长:`running_time` 表示 Dream 排除空闲间隔后的累计运行时长,单位为秒。暂未获得该值时返回 `null`。 > - 查询历史任务:通过 [查询 Dream 列表](/docs/list-dreams-api) 接口按状态或输入 Memory Store 筛选任务,并按创建时间排序。响应包含 `next_page` 时,将该值原样传入下一次请求。 > - 定位错误:HTTP 请求失败时,详情请参见 [错误码](/docs/error-codes)。Dream 已受理后发生的异步错误通过 `error.type` 和 `error.message` 返回。 ### 4. 检查输出 状态为 `completed` 时,验收输出 Memory Store。状态为 `failed` 或 `canceled` 时,只检查是否残留部分结果,并结合 `error.type` 和 `error.message` 排查原因;不要将该 Store 直接投入后续 Session。 以下脚本列出第一页中的 Memory,并读取第一条 Memory 的完整内容: ```bash memories=$( curl -sS --fail-with-body \ "https://ark.cn-beijing.volces.com/api/v3/memory_stores/$OUTPUT_MEMORY_STORE_ID/memories?limit=100&path_prefix=/&order_by=path&depth=2" \ -H "Authorization: Bearer $ARK_API_KEY" ) jq -r '.data[] | select(.type == "memory") | [.id, .path] | @tsv' <<<"$memories" MEMORY_ID=$( jq -r '[.data[] | select(.type == "memory")][0].id // empty' <<<"$memories" ) if [[ -z "$MEMORY_ID" ]]; then printf 'No Memory is available in the output store.\n' >&2 exit 1 fi curl -sS --fail-with-body \ "https://ark.cn-beijing.volces.com/api/v3/memory_stores/$OUTPUT_MEMORY_STORE_ID/memories/$MEMORY_ID" \ -H "Authorization: Bearer $ARK_API_KEY" \ | jq '{path, content}' NEXT_PAGE=$(jq -r '.next_page // empty' <<<"$memories") if [[ -n "$NEXT_PAGE" ]]; then printf 'More Memories are available. Continue with page=%s.\n' "$NEXT_PAGE" fi ``` 响应包含 `next_page` 时,将该值作为下一页标识继续查询,直到检查完全部 Memory。状态为 `completed` 时,重点验收以下内容: 1. 主题范围是否符合 Instructions。 2. 重复和冲突内容是否已经合并。 3. 目录路径是否方便 Agent 检索。 4. 隐私信息和过期内容是否已经移除。 根据任务状态和检查结果选择后续动作: | 任务状态 | 输出检查结果 | 后续动作 | | --- | --- | --- | | `completed` | 全部验收项通过。 | 以 `read_only` 方式挂载到新的 Session。 | | `completed` | 只有少量内容或路径不正确。 | 更新、移动或删除对应 Memory,再重新验收。 | | `completed` | 整体范围、冲突处理或目录结构不正确。 | 调整输入或 Instructions 后重新创建 Dream。 | | `failed` 或 `canceled` | Store 为空或只包含部分结果。 | 仅检查已有结果,不直接投入后续 Session;确认无用后删除输出 Store。 | ### 5. 使用或删除输出 状态为 `completed` 且验收通过后,创建新的 Session 并挂载输出 Memory Store: ```bash export AGENT_ID="" export ENVIRONMENT_ID="" ``` ```bash session=$( curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/sessions" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d @- < ## 计费说明 Dream 任务包含以下两项费用: - 记忆整理模型调用费用:按照任务实际消耗的输入、输出和缓存 token 计费。通过 `usage` 查看本次任务的 token 用量。 - Agent 运行时费用:Dream 在后台执行记忆整理时会使用 Agent 运行时,按照实际运行时长计费。通过 `running_time` 查看排除空闲间隔后的累计运行时长。 计费公式:`Dream 费用 = 记忆整理模型调用费用 + Agent 运行时费用`。模型单价、Agent 运行时单价和账单结算规则,详情请参见 [Managed Agents 计费说明](/docs/model-pricing#ma_billing)。 ## 编写 Instructions 的最佳实践 Instructions 用于描述整理目标、保留与排除范围、冲突处理方式和输出结构,不适合指定单条 Memory 的精确修改。 一份可执行的 Instructions 通常包含以下信息: - 整理目标:说明输出 Memory Store 服务于什么任务。 - 保留范围:说明需要保留的主题、事实和稳定偏好。 - 排除范围:说明需要忽略的噪声、过期内容和隐私信息。 - 合并规则:说明如何处理重复、冲突或时间不同的记录。 - 组织方式:说明期望的主题分组和路径结构。 可以从以下模板开始: ```text 整理目标:<输出 Memory Store 服务的任务> 保留范围:<需要保留的主题、事实和稳定偏好> 排除范围:<需要移除的噪声、过期内容和隐私信息> 冲突处理:<冲突信息的选择依据和适用条件> 输出结构:<期望的主题分组和路径> ``` 例如,整理代码审查记忆: ```text 整理目标:生成供后续代码审查 Session 使用的长期记忆。 保留范围:代码风格偏好、项目约定和已验证的排障方法。 排除范围:一次性调试记录、姓名、邮箱、URL 和账号标识。 冲突处理:保留时间较新的结论,并记录结论的适用条件。 输出结构:按 topics/code-review、topics/project-rules 和 topics/troubleshooting 分类。 ``` Dream 适合批量筛选、合并和重组信息,不保证按文件路径或段落位置完成定点修改。只需调整某条 Memory 时,直接调用 Memory 更新接口。 ## API 参考 - [创建 Dream](/docs/create-dream-api) - [查询 Dream](/docs/get-dream-api) - [查询 Dream 列表](/docs/list-dreams-api) - [取消 Dream](/docs/cancel-dream-api) - [删除 Memory Store](/docs/delete-memory-store-api) --- # 编排 Multi Agent Source: https://ark.volcengine.com/region:cn-beijing/docs/multi-agent Multi Agent(多智能体协作)允许协调器 Agent 将任务委派给多个子智能体。子智能体使用各自的模型、系统提示词、技能和工具完成任务。协调器负责拆分任务并汇总结果。 本页从已有子智能体和 Environment 开始,演示如何创建协调器、运行任务、验证结果和处理异常。 ## 选择并准备 Multi Agent 适合需要角色分工或并行处理的复杂任务。如果任务不需要独立上下文或角色边界,优先使用更简单的方式。 | 任务特征 | 推荐方式 | 适用场景 | | --- | --- | --- | | 多个角色需要使用不同提示词、模型或工具 | Multi Agent | 代码审查、测试设计等多角色任务 | | 单个 Agent 按固定步骤调用工具 | Agent + 工具(Tools) | 流程固定,不需要独立角色上下文 | | 单个 Agent 复用操作说明 | Agent + 技能(Skills) | 需要沉淀流程,但不需要角色协作 | 开始前,完成以下准备: - 创建 API Key,并配置为 `ARK_API_KEY`。详情请参见 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey)。 - 创建两个子智能体,并记录 Agent ID 和版本号。详情请参见 [Agent](/docs/define-agent)。 - 创建或复用云环境,并记录 Environment ID。详情请参见 [配置云环境](/docs/configure-cloud-environment)。 - 选择协调器模型,并确认本地已安装 `curl` 和 `jq`。 配置环境变量: ```Bash export ARK_API_KEY="" export ARK_BASE_URL="https://ark.cn-beijing.volces.com/api/v3" export COORDINATOR_MODEL_ID="" export REVIEWER_AGENT_ID="" export REVIEWER_AGENT_VERSION="" export TESTER_AGENT_ID="" export TESTER_AGENT_VERSION="" export ENVIRONMENT_ID="" ``` ## 配置协调器 ### 定义角色和委派规则 协调器的系统提示词需要说明每个子智能体的职责和输出。角色边界越明确,协调器越容易正确分配任务。 | 角色 | 职责 | | --- | --- | | 代码审查员 | 检查代码质量、架构和安全风险,输出问题与修改建议 | | 测试工程师 | 设计测试用例,说明覆盖范围和未覆盖风险 | 系统提示词还需要要求协调器先拆分和委派任务,收到全部结果后再汇总。下方 cURL 包含完整提示词。 ### 创建协调器 在 `multiagent.agents` 中传入子智能体 ID 和版本号。显式填写版本后,子智能体发布新版本不会改变当前协调器。 **选项:cURL** ```Bash : "${ARK_BASE_URL:?Set ARK_BASE_URL}" : "${ARK_API_KEY:?Set ARK_API_KEY}" : "${COORDINATOR_MODEL_ID:?Set COORDINATOR_MODEL_ID}" : "${REVIEWER_AGENT_ID:?Set REVIEWER_AGENT_ID}" : "${REVIEWER_AGENT_VERSION:?Set REVIEWER_AGENT_VERSION}" : "${TESTER_AGENT_ID:?Set TESTER_AGENT_ID}" : "${TESTER_AGENT_VERSION:?Set TESTER_AGENT_VERSION}" COORDINATOR_SYSTEM='你有以下团队成员: 【代码审查员】 - 检查代码质量、架构和安全风险。 - 输出问题列表、严重程度和修改建议。 - 不负责编写新功能。 【测试工程师】 - 设计测试用例并检查覆盖范围。 - 输出测试用例、覆盖范围和未覆盖风险。 - 不修改产品需求。 先拆分任务,再分别委派。收到全部结果后,汇总为最终结论。' export COORDINATOR_SYSTEM coordinator_payload=$( jq -n \ --arg model_id "$COORDINATOR_MODEL_ID" \ --arg system "$COORDINATOR_SYSTEM" \ --arg reviewer_id "$REVIEWER_AGENT_ID" \ --argjson reviewer_version "$REVIEWER_AGENT_VERSION" \ --arg tester_id "$TESTER_AGENT_ID" \ --argjson tester_version "$TESTER_AGENT_VERSION" \ '{ name: "engineering-lead", model: {id: $model_id}, system: $system, multiagent: { type: "coordinator", agents: [ {type: "agent", id: $reviewer_id, version: $reviewer_version}, {type: "agent", id: $tester_id, version: $tester_version} ] } }' ) coordinator=$( curl -sS --fail-with-body "$ARK_BASE_URL/agents" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d "$coordinator_payload" ) export COORDINATOR_AGENT_ID export COORDINATOR_AGENT_VERSION COORDINATOR_AGENT_ID=$(jq -er '.id' <<<"$coordinator") COORDINATOR_AGENT_VERSION=$(jq -er '.version' <<<"$coordinator") printf 'Coordinator Agent ID: %s\n' "$COORDINATOR_AGENT_ID" printf 'Coordinator Agent version: %s\n' "$COORDINATOR_AGENT_VERSION" ``` 脚本将协调器 ID 和版本号写入 `COORDINATOR_AGENT_ID` 和 `COORDINATOR_AGENT_VERSION`。字段说明请参见 [创建智能体](/docs/create-agent-api)。 也可以通过控制台配置: 1. 进入 [Agent 管理页面](https://ark.volcengine.com/region:cn-beijing/managed-agent/agents)。 2. 创建或编辑 Agent,在 **04 能力扩展** 区域添加 **Multi Agents**。 3. 选择子智能体,填写前面的系统提示词并保存。 4. 记录协调器 Agent ID 和版本号。 ## 运行任务 主流程使用两个终端。终端 A 接收主事件流,终端 B 创建 Session、发送任务和查询结果。需要实时观察子线程时,再打开终端 C。 ### 1. 创建 Session 在终端 B 创建 Session: **选项:cURL** ```Bash : "${ARK_BASE_URL:?Set ARK_BASE_URL}" : "${ARK_API_KEY:?Set ARK_API_KEY}" : "${COORDINATOR_AGENT_ID:?Set COORDINATOR_AGENT_ID}" : "${ENVIRONMENT_ID:?Set ENVIRONMENT_ID}" payload=$( jq -n \ --arg agent_id "$COORDINATOR_AGENT_ID" \ --arg environment_id "$ENVIRONMENT_ID" \ '{ agent: $agent_id, environment_id: $environment_id, title: "Multi Agent task" }' ) session=$( curl -sS --fail-with-body "$ARK_BASE_URL/sessions" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d "$payload" ) export SESSION_ID SESSION_ID=$(jq -er '.id' <<<"$session") printf 'Session ID: %s\n' "$SESSION_ID" ``` 脚本将 Session ID 写入 `SESSION_ID`: ```Text Session ID: sesn-20261005121000-xxxxx ``` ### 2. 订阅主事件流 在终端 A 配置同一个 Session ID: ```Bash export ARK_API_KEY="" export ARK_BASE_URL="https://ark.cn-beijing.volces.com/api/v3" export SESSION_ID="" ``` 建立主事件流: **选项:cURL** ```Bash : "${ARK_BASE_URL:?Set ARK_BASE_URL}" : "${ARK_API_KEY:?Set ARK_API_KEY}" : "${SESSION_ID:?Set SESSION_ID}" curl -sS -N --fail-with-body --max-time 600 \ "$ARK_BASE_URL/sessions/$SESSION_ID/events/stream" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Accept: text/event-stream" ``` 终端 A 输出 `: ready` 后保持连接。先建连再发送任务,可以避免遗漏实时事件。 ### 3. 发送任务 回到终端 B,配置任务内容: ```Bash TASK_TEXT=$(cat <<'EOF' 评审以下 Python 登录接口实现。代码审查员分析代码质量、架构和安全风险,测试工程师设计测试用例并说明覆盖范围,最后汇总结论。 def login(username, password): key = f"login_failures:{username}" failures = int(redis.get(key) or 0) if failures >= 5: return {"ok": False, "reason": "locked"} if not verify_password(username, password): redis.incr(key) redis.expire(key, 1800) return {"ok": False, "reason": "denied"} redis.delete(key) return {"ok": True} EOF ) export TASK_TEXT ``` 发送任务: **选项:cURL** ```Bash : "${ARK_BASE_URL:?Set ARK_BASE_URL}" : "${ARK_API_KEY:?Set ARK_API_KEY}" : "${SESSION_ID:?Set SESSION_ID}" : "${TASK_TEXT:?Set TASK_TEXT}" payload=$( jq -n --arg text "$TASK_TEXT" \ '{events: [{type: "user.message", content: [{type: "text", text: $text}]}]}' ) curl -sS --fail-with-body \ "$ARK_BASE_URL/sessions/$SESSION_ID/events" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d "$payload" ``` #### 实时观察子线程(可选) 只在需要实时观察子智能体时执行以下步骤: 1. 终端 A 收到 `session.thread_created` 后,记录 `session_thread_id`。 2. 在终端 C 配置鉴权信息、Session ID 和子线程 ID: ```Bash export ARK_API_KEY="" export ARK_BASE_URL="https://ark.cn-beijing.volces.com/api/v3" export SESSION_ID="" export SESSION_THREAD_ID="" ``` 3. 建立子线程事件流: **选项:cURL** ```Bash : "${ARK_BASE_URL:?Set ARK_BASE_URL}" : "${ARK_API_KEY:?Set ARK_API_KEY}" : "${SESSION_ID:?Set SESSION_ID}" : "${SESSION_THREAD_ID:?Set SESSION_THREAD_ID}" curl -sS -N --fail-with-body --max-time 600 \ "$ARK_BASE_URL/sessions/$SESSION_ID/threads/$SESSION_THREAD_ID/stream" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Accept: text/event-stream" ``` 4. 终端 C 输出 `: ready` 后,在终端 B 按“验证结果”中的方式补查该子线程历史。 5. 按事件 `id` 合并实时和历史事件,忽略重复 ID。 每个子线程使用独立事件流。出现多个 `session_thread_id` 时,分别重复以上步骤。 ### 4. 等待本轮结束 继续观察终端 A。正常事件轨迹如下: ```Text session.thread_created agent.thread_message_sent session.thread_status_idle agent.message session.status_idle ``` 收到 `session.status_idle` 后检查 `stop_reason.type`: - `end_turn`:本轮执行结束,按下一节验证结果。 - `requires_action`:保持连接,处理全部待操作事件后继续观察。 - `retries_exhausted`:调整输入后可以发送新任务;如果修改 Agent 配置,请创建新 Session。 ## 验证结果 在终端 B 列出全部线程: **选项:cURL** ```Bash : "${ARK_BASE_URL:?Set ARK_BASE_URL}" : "${ARK_API_KEY:?Set ARK_API_KEY}" : "${SESSION_ID:?Set SESSION_ID}" threads=$( curl -sS --fail-with-body \ "$ARK_BASE_URL/sessions/$SESSION_ID/threads?limit=100" \ -H "Authorization: Bearer $ARK_API_KEY" ) printf 'Agent\tThread ID\tStatus\n' jq -r '.data[] | [.agent_name, .id, .status] | @tsv' <<<"$threads" export SESSION_THREAD_ID if ! SESSION_THREAD_ID=$(jq -er '.data[1].id' <<<"$threads"); then printf 'No child thread is available yet.\n' >&2 return 1 2>/dev/null || exit 1 fi printf 'Selected child thread ID: %s\n' "$SESSION_THREAD_ID" ``` 命令将第一个子线程 ID 写入 `SESSION_THREAD_ID`。检查其他子线程时,更新该变量并清空分页标识: ```Bash unset THREAD_EVENTS_PAGE ``` 查询该子线程的完整历史: **选项:cURL** ```Bash : "${ARK_BASE_URL:?Set ARK_BASE_URL}" : "${ARK_API_KEY:?Set ARK_API_KEY}" : "${SESSION_ID:?Set SESSION_ID}" : "${SESSION_THREAD_ID:?Set SESSION_THREAD_ID}" request_args=( --get "$ARK_BASE_URL/sessions/$SESSION_ID/threads/$SESSION_THREAD_ID/events" --data-urlencode "limit=100" --data-urlencode "order=asc" ) if [[ -n ${THREAD_EVENTS_PAGE:-} ]]; then request_args+=(--data-urlencode "page=$THREAD_EVENTS_PAGE") fi if ! events=$( curl -sS --fail-with-body \ "${request_args[@]}" \ -H "Authorization: Bearer $ARK_API_KEY" ); then return 1 2>/dev/null || exit 1 fi printf 'Events:\n' jq -c '.data[]' <<<"$events" export THREAD_EVENTS_PAGE THREAD_EVENTS_PAGE=$(jq -r '.next_page // empty' <<<"$events") printf 'Next page: %s\n' "$THREAD_EVENTS_PAGE" ``` 如果 `Next page` 不为空,保持 `THREAD_EVENTS_PAGE` 并重复执行,直到下一页标识为空。切换子线程前必须再次清空该变量。 主线程和各子线程使用独立事件流,不能根据跨流到达顺序判断执行顺序。使用 `session_thread_id`、`from_session_thread_id` 和 `to_session_thread_id` 关联委派与返回消息。 只有同时满足以下条件,本轮任务才成功: - 主线程产生最终 `agent.message`。 - Session 以 `stop_reason.type=end_turn` 进入 `idle`。 - 没有子线程停留在 `running` 或 `rescheduling`。 - 本轮没有出现 `session.thread_status_terminated`。 > **注意** > > HTTP 200 只表示服务端已受理事件。`session.status_idle` 不一定表示任务成功。 ## 处理异常状态 | 信号 | 含义 | 处理动作 | | --- | --- | --- | | SSE 连接中断 | 中断期间的事件不会自动回放 | 先重建连接,再查询历史并按事件 ID 去重 | | `requires_action` | 等待工具确认或外部工具结果 | 处理全部 `stop_reason.event_ids` | | `session.thread_status_rescheduled` | 子线程正在自动重新调度 | 保持监听,不要并行手动重试 | | `session.thread_status_terminated` | 子线程已终止 | 查询历史和错误事件,Session 空闲后重新分配任务 | | 子线程长时间保持 `running` | 子任务未结束 | 携带 `session_thread_id` 发送 `user.interrupt` | | `retries_exhausted` | 当前轮次重试次数已用尽 | 调整输入后重试;修改 Agent 配置后创建新 Session | ### 处理等待操作 子线程以 `requires_action` 进入 `idle` 后,按以下步骤处理: 1. 保持主事件流和目标子线程事件流连接。如果连接已关闭,先重新建连并等待 `: ready`,再补查历史。补查主线程前清空分页标识: ```Bash unset SESSION_EVENTS_PAGE ``` **选项:cURL** ```Bash : "${ARK_BASE_URL:?Set ARK_BASE_URL}" : "${ARK_API_KEY:?Set ARK_API_KEY}" : "${SESSION_ID:?Set SESSION_ID}" request_args=( --get "$ARK_BASE_URL/sessions/$SESSION_ID/events" --data-urlencode "limit=100" --data-urlencode "order=asc" ) if [[ -n ${SESSION_EVENTS_PAGE:-} ]]; then request_args+=(--data-urlencode "page=$SESSION_EVENTS_PAGE") fi if ! events=$( curl -sS --fail-with-body \ "${request_args[@]}" \ -H "Authorization: Bearer $ARK_API_KEY" ); then return 1 2>/dev/null || exit 1 fi printf 'Events:\n' jq -c '.data[]' <<<"$events" export SESSION_EVENTS_PAGE SESSION_EVENTS_PAGE=$(jq -r '.next_page // empty' <<<"$events") printf 'Next page: %s\n' "$SESSION_EVENTS_PAGE" ``` 2. 从 `session.thread_status_idle` 中记录 `session_thread_id` 和全部 `stop_reason.event_ids`。按“验证结果”中的方式补查子线程,并逐一找到这些事件。 3. 对 `agent.tool_use` 或 `agent.mcp_tool_use`,配置关联 ID 并发送确认: ```Bash export SESSION_THREAD_ID="" export TOOL_USE_ID="" ``` **选项:cURL** ```Bash : "${ARK_BASE_URL:?Set ARK_BASE_URL}" : "${ARK_API_KEY:?Set ARK_API_KEY}" : "${SESSION_ID:?Set SESSION_ID}" : "${SESSION_THREAD_ID:?Set SESSION_THREAD_ID}" : "${TOOL_USE_ID:?Set TOOL_USE_ID}" payload=$( jq -n \ --arg thread_id "$SESSION_THREAD_ID" \ --arg tool_use_id "$TOOL_USE_ID" \ '{ events: [{ type: "user.tool_confirmation", session_thread_id: $thread_id, tool_use_id: $tool_use_id, result: "allow" }] }' ) curl -sS --fail-with-body \ "$ARK_BASE_URL/sessions/$SESSION_ID/events" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d "$payload" ``` 4. 对 `agent.custom_tool_use`,执行自定义工具并发送 `user.custom_tool_result`。请求需要携带当前 `session_thread_id` 和 `custom_tool_use_id`。详情请参见 [Tools](/docs/tools)。 5. 处理全部 `event_ids` 后继续观察。任务可能再次进入 `requires_action`;只有 Session 最终以 `end_turn` 结束,本轮任务才完成。 本页主流程使用云环境,不覆盖自托管 Environment 的 `user.tool_result` 流程。自托管流程请参见 [Tools](/docs/tools)。 ### 中断线程 只停止一个子线程时,运行 `export SESSION_THREAD_ID=""`。停止全部活跃线程时,运行 `unset SESSION_THREAD_ID`。 **选项:cURL** ```Bash : "${ARK_BASE_URL:?Set ARK_BASE_URL}" : "${ARK_API_KEY:?Set ARK_API_KEY}" : "${SESSION_ID:?Set SESSION_ID}" if [[ -n ${SESSION_THREAD_ID:-} ]]; then payload=$( jq -n --arg thread_id "$SESSION_THREAD_ID" \ '{events: [{type: "user.interrupt", session_thread_id: $thread_id}]}' ) else payload=$(jq -n '{events: [{type: "user.interrupt"}]}') fi curl -sS --fail-with-body \ "$ARK_BASE_URL/sessions/$SESSION_ID/events" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d "$payload" ``` 中断指定子线程后等待该线程进入 `idle`;中断全部线程后等待 Session 进入 `idle`。 ## 更新协作配置 新增、移除子智能体或切换版本时,先调用 [查询智能体详情](/docs/get-agent-api) 查询协调器最新配置。更新请求需要携带当前 `version`,并整体提交匹配的系统提示词和 `multiagent.agents`。 ```Bash export COORDINATOR_AGENT_VERSION="" COORDINATOR_AGENTS_JSON=$( jq -n \ --arg reviewer_id "$REVIEWER_AGENT_ID" \ --argjson reviewer_version "$REVIEWER_AGENT_VERSION" \ --arg tester_id "$TESTER_AGENT_ID" \ --argjson tester_version "$TESTER_AGENT_VERSION" \ '[ {type: "agent", id: $reviewer_id, version: $reviewer_version}, {type: "agent", id: $tester_id, version: $tester_version} ]' ) export COORDINATOR_AGENTS_JSON ``` 通过 API 创建协调器时,创建脚本已导出 `COORDINATOR_SYSTEM`。如果通过控制台创建,请先将控制台使用的完整系统提示词配置到该变量。提示词必须与成员列表保持一致。 **选项:cURL** ```Bash : "${ARK_BASE_URL:?Set ARK_BASE_URL}" : "${ARK_API_KEY:?Set ARK_API_KEY}" : "${COORDINATOR_AGENT_ID:?Set COORDINATOR_AGENT_ID}" : "${COORDINATOR_AGENT_VERSION:?Set COORDINATOR_AGENT_VERSION}" : "${COORDINATOR_SYSTEM:?Set COORDINATOR_SYSTEM}" : "${COORDINATOR_AGENTS_JSON:?Set COORDINATOR_AGENTS_JSON}" update_payload=$( jq -n \ --argjson version "$COORDINATOR_AGENT_VERSION" \ --arg system "$COORDINATOR_SYSTEM" \ --argjson agents "$COORDINATOR_AGENTS_JSON" \ '{ version: $version, system: $system, multiagent: { type: "coordinator", agents: $agents } }' ) coordinator=$( curl -sS --fail-with-body \ "$ARK_BASE_URL/agents/$COORDINATOR_AGENT_ID" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d "$update_payload" ) export COORDINATOR_AGENT_VERSION COORDINATOR_AGENT_VERSION=$(jq -er '.version' <<<"$coordinator") printf 'Coordinator Agent version: %s\n' "$COORDINATOR_AGENT_VERSION" ``` 脚本将新版本号写入 `COORDINATOR_AGENT_VERSION`。如果返回 `version: conflict`,重新查询并合并最新配置后再提交。 现有 Session 不会自动切换版本。只有 Session 处于 `idle`、上一轮以 `end_turn` 结束且没有其他升级请求时,才可以升级: **选项:cURL** ```Bash : "${ARK_BASE_URL:?Set ARK_BASE_URL}" : "${ARK_API_KEY:?Set ARK_API_KEY}" : "${SESSION_ID:?Set SESSION_ID}" : "${COORDINATOR_AGENT_ID:?Set COORDINATOR_AGENT_ID}" : "${COORDINATOR_AGENT_VERSION:?Set COORDINATOR_AGENT_VERSION}" payload=$( jq -n \ --arg agent_id "$COORDINATOR_AGENT_ID" \ --argjson version "$COORDINATOR_AGENT_VERSION" \ '{agent: {type: "agent_with_upgrades", id: $agent_id, version: $version}}' ) curl -sS --fail-with-body \ "$ARK_BASE_URL/sessions/$SESSION_ID/upgrades" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d "$payload" ``` 等待 Session 使用目标版本恢复为 `idle`: **选项:cURL** ```Bash : "${ARK_BASE_URL:?Set ARK_BASE_URL}" : "${ARK_API_KEY:?Set ARK_API_KEY}" : "${SESSION_ID:?Set SESSION_ID}" : "${COORDINATOR_AGENT_ID:?Set COORDINATOR_AGENT_ID}" : "${COORDINATOR_AGENT_VERSION:?Set COORDINATOR_AGENT_VERSION}" : "${SESSION_UPGRADE_MAX_ATTEMPTS:=60}" : "${SESSION_UPGRADE_INTERVAL_SECONDS:=2}" upgrade_result="timeout" for ((attempt = 1; attempt <= SESSION_UPGRADE_MAX_ATTEMPTS; attempt++)); do session=$( curl -sS --fail-with-body \ "$ARK_BASE_URL/sessions/$SESSION_ID" \ -H "Authorization: Bearer $ARK_API_KEY" ) || { upgrade_result="request_failed" break } session_status=$(jq -er '.status' <<<"$session") || { upgrade_result="invalid_response" break } session_agent_id=$(jq -r '.agent.id // empty' <<<"$session") session_agent_version=$(jq -r '.agent.version // empty' <<<"$session") printf 'Attempt %s: status=%s, agent=%s, version=%s\n' \ "$attempt" \ "$session_status" \ "$session_agent_id" \ "$session_agent_version" if [[ $session_status == "idle" && $session_agent_id == "$COORDINATOR_AGENT_ID" && $session_agent_version == "$COORDINATOR_AGENT_VERSION" ]]; then upgrade_result="completed" break fi case "$session_status" in terminated | failed) upgrade_result="$session_status" break ;; esac sleep "$SESSION_UPGRADE_INTERVAL_SECONDS" done if [[ $upgrade_result != "completed" ]]; then printf 'Session upgrade did not complete: %s\n' "$upgrade_result" >&2 false fi ``` 脚本默认每 2 秒查询一次,最多 60 次。只有状态为 `idle`,且 `agent.id` 和 `agent.version` 与目标一致时才返回成功;超时或进入失败状态时,请检查 Session 或创建新 Session。 ## 使用限制 - 子智能体数量:单个协调器最多配置 20 个子智能体,详情请参见 [创建智能体](/docs/create-agent-api)。 - 委派层级:Multi Agent 只展开一层。`multiagent.agents[].type` 为 `self` 时复用协调器配置创建子线程,但不会继续复用协调器的 `multiagent` 列表。 - 版本快照:更新协调器不会修改已有 Session 的 Agent 快照。 - 资源消耗:协调器和子智能体分别产生模型与运行资源用量,详情请参见 [模型价格](/docs/model-pricing#ma_billing)。 ## 清理资源 确认产物已转存后,使用精确 ID 删除本页创建的 Session。Session 仍在运行时,先中断全部线程并等待 `idle`。默认保留协调器: ```Bash export CONFIRM_DELETE="yes" export DELETE_COORDINATOR="no" ``` 仅当协调器不再被任何 Session 使用时,才将 `DELETE_COORDINATOR` 改为 `yes`。执行删除: **选项:cURL** ```Bash : "${ARK_BASE_URL:?Set ARK_BASE_URL}" : "${ARK_API_KEY:?Set ARK_API_KEY}" : "${SESSION_ID:?Set SESSION_ID}" : "${CONFIRM_DELETE:?Set CONFIRM_DELETE to yes}" : "${DELETE_COORDINATOR:=no}" if [[ $CONFIRM_DELETE != "yes" ]]; then printf 'Set CONFIRM_DELETE=yes to delete the recorded resources.\n' >&2 return 1 2>/dev/null || exit 1 fi curl -sS --fail-with-body \ "$ARK_BASE_URL/sessions/$SESSION_ID" \ -X DELETE \ -H "Authorization: Bearer $ARK_API_KEY" if [[ $DELETE_COORDINATOR == "yes" ]]; then : "${COORDINATOR_AGENT_ID:?Set COORDINATOR_AGENT_ID}" curl -sS --fail-with-body \ "$ARK_BASE_URL/agents/$COORDINATOR_AGENT_ID" \ -X DELETE \ -H "Authorization: Bearer $ARK_API_KEY" fi ``` 命令不会删除子智能体或 Environment。 > **警告** > > 删除 Session 或 Agent 后无法恢复。只使用本页记录的精确 ID,不要按名称模糊匹配或批量删除共享资源。 ## 相关文档 - [Agent](/docs/define-agent) - [Session 事件流](/docs/session-event-stream) - [Tools](/docs/tools) - [管理 Session](/docs/manage-session) --- # 将零代码应用迁移至 Managed Agents Source: https://ark.volcengine.com/region:cn-beijing/docs/migrate-from-bot-api 本文介绍如何将应用实验室中通过 Bot API 调用的零代码应用迁移至 **方舟 Managed Agents**。内容覆盖迁移判断、配置映射、资源创建和结果验证,帮助你基于原零代码应用配置重建 Agent 和调用链路。 本文仅适用于已发布、通过 Bot API 调用的零代码应用。其中,单聊应用可以按本文步骤迁移;群聊应用需要先重新设计角色和编排方式,不能直接复用单聊迁移方案。 迁移的核心不是替换一个接口地址,而是把原应用中可复用的配置映射到 Agent,再创建新的 Environment 和 Session 运行资源。 ## 场景说明 在存量业务中,你可能已经在应用实验室中创建并发布零代码应用,再通过 Bot API 调用它,完成客服问答、运营助手或内部知识查询等任务。 已发布的存量零代码应用仍可继续通过 Bot API 调用。应用实验室后续会下线新建零代码应用入口,具体时间以后续公告为准;入口下线后,将无法再创建新的零代码应用。存量业务可以根据能力需求安排迁移,无需因新建入口下线立即切换调用链路。 > **注意:迁移限制** > > 应用实验室中的存量零代码应用无法自动转换为 Managed Agents。你需要根据原应用的配置重新创建 Agent,并完成调试验证。 随着业务复杂度提升,单次对话接口也会逐渐遇到边界:应用能力类型有限、上下文需要自己维护,复杂任务也缺少沙箱执行环境。 Managed Agents 将 Agent 运行所需的通用能力拆成平台资源。你定义 Agent 行为,选择 Environment 提供执行环境,再通过 Session 发送事件并订阅结果流。这样可以把“调用一个应用”升级为“托管一个可执行、可观测、可扩展的 Agent”。 本文会帮助你完成以下动作: - 判断一个存量零代码应用适合迁移到 Managed Agents,还是应改用模型 API。 - 将零代码应用中可复用的配置映射为 Agent 配置。 - 创建 Agent 运行所需的 Environment 和 Session。 - 选择控制台或 API 路径重建 Agent。 - 记录 `agent_id`、`environment_id` 和 `session_id`,供业务服务后续调用。 - 用原零代码应用的真实问题集验证迁移后的回答结果和工具调用。 | 环节 | 内容 | |-|-| | 输入 | 原零代码应用的名称、描述、模型、系统提示词、能力配置,以及 5 到 10 个真实问题。 | | 过程 | 将可复用的应用配置映射为 Agent 配置,新建 Environment 和 Session,再发送测试问题并观察事件流。 | | 输出 | 一个可调试的 Agent,以及业务侧后续调用所需的 `agent_id`、`environment_id` 和 `session_id`。 | | 观测 | 通过控制台事件时间轴或 Session 事件流查看消息、工具调用、工具结果和 Session 状态。 | ## 判断是否需要迁移 先根据应用类型、调用方式和目标能力判断迁移优先级,再准备迁移材料。 | 场景 | 建议 | 原因 | |-|-|-| | 只维护已发布零代码应用 | 继续通过 Bot API 调用 | 新建零代码应用入口下线后,已发布的存量应用仍可继续使用。 | | 简单问答,以及客服、车载助手等多轮对话场景 | 迁移到 Managed Agents | Agent 支持读取和写入 Memory,可以在多轮及跨 Session 对话中持续使用用户偏好和历史信息,更准确地理解用户。 | | 需要自行控制调用链 | 改用模型 API(Responses API 或 Chat API) | 业务可以自行管理提示词、上下文、工具调用和运行状态。 | | 需要沙箱执行 | 迁移到 Managed Agents | Environment 可以提供云沙箱或自托管环境,用于执行命令、读写文件和处理数据。 | | 需要长期记忆 | 迁移到 Managed Agents | 记忆存储(Memory Store)可以保存跨 Session 可复用的偏好、知识和业务上下文。 | | 需要外部工具或 MCP | 迁移到 Managed Agents | Agent 可以通过内置工具集、MCP、自定义工具或技能扩展能力。 | | 需要按职责委派复杂任务 | 迁移到 Managed Agents | 多智能体协作(Multi Agent)可以把不同职责拆给多个 Agent,由协调器 Agent 分配任务并汇总结果。 | 判断迁移优先级时,同时对照原零代码应用能力和 Managed Agents 能力。两者并非一一对应,迁移前需要明确哪些配置可以复用,哪些能力需要重新设计。 | 应用能力 | Managed Agents 对应能力 | 迁移建议 | |-|-|-| | 应用 ID(Bot ID) | 无直接对应关系 | Bot API 将应用 ID 作为请求体中的 `model`。迁移后不能直接替换该字段:先使用 `agent_id` 和 `environment_id` 创建 Session,再使用 `session_id` 发送和订阅事件。 | | 应用名称和描述 | Agent 的 `name` 和 `description` | 直接复用,名称需要在当前项目内唯一。 | | 系统提示词 | Agent 的 `system` | 直接迁移,同时补充 Agent 可使用的工具、数据来源和输出要求。 | | 推理接入点 | Agent 的 `model.id` 和 `model.speed` | 原推理接入点不能直接复用。选择 Managed Agents 支持的 Model ID,并重新验证模型效果和参数。 | | 联网内容插件(仅单聊) | 内置 `web_search` 和 `web_fetch` 工具 | 可以迁移联网搜索与网页抓取能力,但内容源、问题改写、引用条数和来源展示等配置不会自动迁移,需要重新配置和验证。 | | 知识库插件(仅单聊) | 记忆存储、MCP 或自定义工具 | 不支持直接迁移。少量静态参考内容可以整理到记忆存储;需要检索、重排或来源引用时,通过 MCP 或自定义工具接入原知识服务。 | | 计算器、网页解析插件(仅单聊) | 内置工具、MCP 或自定义工具 | 计算任务可以评估 `bash` 或自定义工具;普通网页抓取可以评估 `web_fetch`。PDF、视频及其他特定解析能力需要单独验证,必要时使用 MCP 或自定义工具。 | | 群聊场景和角色配置 | 无对应能力 | 应用实验室群聊与 Managed Agents 的多智能体协作能力不对应。Bot API 通过 `metadata.group_chat_config` 等字段传递的群聊配置不能直接迁移;只有业务目标属于任务分工时,才重新设计为多智能体协作。 | | **Trace 服务** | 控制台事件时间轴与 Session 事件流 | Managed Agents 无需开启应用实验室的 **Trace 服务**。控制台用于可视化调试,Session 事件流用于业务侧订阅消息、工具调用和状态变化。 | > **注意:群聊迁移限制** > > 应用实验室群聊中的角色用于多角色对话,Managed Agents 的多智能体协作能力用于任务委派,两者不对应,不能直接映射。需要保留多角色对话时,重新设计角色选择和消息编排;只有业务目标可以拆分为多个职责明确的任务时,才使用多智能体协作能力。 ## 准备迁移材料 确认适合迁移到 Managed Agents 后,再准备以下信息和资源。不要在没有完成能力映射前直接创建 Agent,否则后续容易反复修改模型、工具和知识来源。 - 准备一个已发布、可通过 Bot API 调用的零代码应用,或导出该应用的名称、描述、推理接入点和系统提示词。 - 导出应用的能力配置。 - 准备 5 到 10 个真实问题,用于迁移后的回归测试。 - 开通方舟,并准备可调用 Managed Agents 的 API Key。 - 确认目标 Model ID。本文示例使用 `doubao-seed-2-1-pro-260915`,实际迁移时替换为你的 Model ID。 - 选择知识来源。原应用使用知识库插件时,确认知识内容适合整理为记忆存储中的静态参考资料,还是需要通过 MCP 或自定义工具接入原知识服务。 迁移时会用到以下核心对象: | 概念 | 说明 | |-|-| | **零代码应用** | 本文特指在应用实验室中创建并发布、通过 Bot API 调用的应用。Bot API 请求体中的 `model` 字段填写该应用的 ID(Bot ID)。 | | **Agent** | Managed Agents 中的行为定义,包含模型、系统提示词、工具、技能、MCP 和多智能体协作配置。 | | **Environment** | Agent 执行任务时使用的运行环境,可以是云沙箱,也可以是自托管环境。 | | **Session** | Agent 在指定 Environment 中运行的一次会话,负责保存事件历史、沙箱状态和运行状态。 | | **Event** | Session 中的输入、输出和状态变化,例如 `user.message`、工具调用事件和 `session.status_idle`。 | | **记忆存储** | Managed Agents 的文件式长期记忆资源,用来保存跨 Session 可复用的偏好、规范和静态参考内容,不等同于带检索与重排能力的知识库。 | > **注意:保护 API Key** > > 不要把 API Key 写进代码仓库、日志或前端页面。这些位置会扩大明文密钥的可见范围,导致凭据泄露和未授权调用。迁移过程中如果需要多人协作,只共享应用配置和测试问题,不共享明文 API Key。 ## 迁移操作流程 迁移操作分为控制台和 API 两条路径。先人工验证配置时,选择控制台路径。已经在业务代码中调用 Bot API 时,选择 API 路径。 整体执行顺序如下: 1. 梳理原零代码应用的配置和真实问题集。 2. 判断要继续维护应用、改用模型 API,还是迁移到 Managed Agents。 3. 按能力映射表重建 Agent 配置。 4. 根据运行需求创建或选择一个 Environment。 5. 创建 Session,并把一次输入消息发送为 `user.message` 事件。 6. 订阅事件流,检查 Agent 回复、工具调用和最终状态。 7. 对比原零代码应用和新 Agent 的输出,调整提示词、工具和知识来源。 8. 小流量切换业务调用,确认稳定后再扩大迁移范围。 ### 路径一:通过控制台迁移 如果你希望先用可视化方式验证迁移效果,使用 Managed Agents 控制台更合适。 1. 打开 [**Agents** 页面](https://ark.volcengine.com/region:cn-beijing/managed-agents/agents?projectName=default),创建 Agent。 2. 将原应用的名称、描述和系统提示词填写到 Agent 的对应配置中。 3. 选择 Managed Agents 支持的模型,并按能力映射表重新配置工具、技能、MCP 和知识来源。 4. 创建 Environment,配置 Agent 运行所需的网络、依赖包、环境变量和产物存储。 5. 创建绑定 Agent 与 Environment 的 Session,使用原应用的典型问题完成回归测试。 6. 记录 `agent_id` 和 `environment_id`。业务服务使用这两个 ID 创建 Session,再通过 Session 事件接口发送消息和订阅事件。 > **说明** > > 迁移时,先选择 5 到 10 个真实问题做回归集。每次调整系统提示词或工具配置后,用同一批问题测试,能更快判断迁移后的 Agent 是否覆盖原能力。 > **注意:知识库迁移边界** > > 不要把应用中依赖检索、重排或来源引用的完整知识库直接写入记忆存储。记忆存储适合保存整理后的静态参考内容;需要保留原知识库检索能力时,通过 MCP 或自定义工具接入知识服务。完成知识问答回归验证前,保留原应用作为兜底。 ### 路径二:通过 API 迁移 如果你已经在业务代码中调用 Bot API,建议用 API 方式完成迁移。新的调用链路不是把 Bot ID 替换为 Agent ID,而是从一次 `POST /bots/chat/completions` 调用,改为先创建 Agent 和 Environment,再创建 Session、发送事件并订阅事件流。 | 步骤 | 说明 | |-|-| | 1. 创建 Agent | 定义模型、系统提示词以及迁移后需要的工具、技能和 MCP,获得 `agent_id`。 | | 2. 创建 Environment | 定义云沙箱网络、依赖包和环境变量,获得 `environment_id`。 | | 3. 创建 Session | 绑定 `agent_id` 与 `environment_id`,获得 `session_id`。 | | 4. 发送输入事件 | 将原 Bot API 中的输入消息转换为 `user.message` 事件。 | | 5. 订阅事件流 | 使用 SSE 接收 Agent 回复、工具调用和状态事件。 | API 迁移时,三个 ID 的传递关系如下: ```text agent_id + environment_id -> 创建 session -> session_id session_id + user.message -> 触发 Agent 执行 -> Session 事件流 ``` 创建 Agent 后,记录返回的 `agent_id`。创建 Environment 后,记录返回的 `environment_id`。创建 Session 后,记录返回的 `session_id`。业务服务后续发送消息和订阅事件,都围绕 `session_id` 执行。 你可以直接复用 [快速入门(代码)](/docs/quick-start-code) 中的端到端示例: - 创建 Agent:参考 [创建 Agent](/docs/quick-start-code#create_agent)。 - 创建环境:参考 [创建环境](/docs/quick-start-code#create_environment)。 - 创建 Session:参考 [创建 Session](/docs/quick-start-code#create_session)。 - 发送消息并接收流式响应:参考 [发送消息并接收流式响应](/docs/quick-start-code#send_message_stream)。 > **注意:上下文迁移限制** > > Bot API 的 `messages` 数组不能原样作为 Managed Agents 的长期上下文迁移。Managed Agents 的上下文由 Session 事件维护。迁移时应把固定角色设定写入 Agent 的 `system`,把每次输入作为新的 `user.message` 事件发送。 > > 不要把 Bot API 中的一轮多消息历史直接拼进 Agent 的系统提示词。这样会把临时对话变成永久规则,后续 Session 可能持续继承错误背景。固定角色、输出格式和工具使用规则写入 `system`;每次真实问题通过 `user.message` 发送。 ## 验证迁移结果 迁移后,用原应用的真实用例验证以下结果: - Agent 能按原系统提示词完成基础问答。 - 开启联网能力后,事件流中能看到 `web_search` 或 `web_fetch` 相关工具调用。 - 需要读写文件或运行脚本时,事件流中能看到 `bash`、`read`、`write` 等工具调用。 - 需要知识库能力时,答案能使用记忆存储、MCP 或自定义工具提供的信息。 - 业务侧收到完整的 `agent.message`,随后收到 `stop_reason.type = "end_turn"` 的 `session.status_idle`。 期望看到的事件轨迹如下: ```text user.message 发送原零代码应用回归问题 agent.message_delta Agent 开始生成回复 agent.tool_use 调用 web_search、web_fetch、bash、read 或 write agent.tool_result 返回工具执行结果 agent.message 输出完整回复 session.status_idle stop_reason.type = end_turn ``` 如果 `session.status_idle` 的 `stop_reason.type` 为 `requires_action`,表示 Session 正在等待工具确认或结果,并不表示迁移用例已经执行完成。先处理对应的阻塞事件,再继续等待最终回复。 如果事件流里没有出现预期工具调用,先检查 Agent 的工具配置,再检查系统提示词中是否明确说明了何时调用工具。 ## 常见问题 ### 新建零代码应用入口下线时间 当前尚未公布新建零代码应用入口的下线时间,具体时间以后续公告为准。入口下线后将无法再创建新的零代码应用,已发布的存量应用仍可继续通过 Bot API 调用。 ### 继续使用现有零代码应用 可以。已发布的存量零代码应用仍可继续通过 Bot API 调用。对于简单问答,特别是客服、车载助手等多轮对话场景,建议迁移到 Managed Agents,通过 Memory 读写持续使用用户偏好和历史信息;需要自行控制调用链时,可以改用模型 API。 ### 迁移后的计费 Managed Agents 与 Bot API 使用同一套方舟账号和 API Key 体系。Managed Agents 会按 Agent 运行过程中的模型 token、Agent 运行时长和工具调用次数计费,详情参见 [Managed Agents 计费](/docs/model-pricing#ma_billing)。 ### 迁移知识库插件 记忆存储不等同于带检索和重排能力的知识库。应用中的少量静态参考内容可以整理到记忆存储;已有外部知识服务可以通过 MCP 或自定义工具接入。需要保留检索、重排或来源引用能力时,不要直接使用记忆存储替代原知识库插件。 ### 迁移联网搜索能力 在 Managed Agents 中,联网搜索是 Agent 可主动调用的工具。迁移时,你需要在 Agent 工具集中启用 `web_search` 和 `web_fetch`,并在系统提示词中说明何时联网、如何使用搜索结果、是否需要标注来源。原联网内容插件中的内容源、问题改写、引用条数和来源展示配置不会自动迁移,需要逐项重新验证。 ## 相关文档 - 通过 [快速入门(控制台)](/docs/quick-start-console) 创建和调试 Agent。 - 通过 [快速入门(代码)](/docs/quick-start-code) 将 Agent 接入业务代码。 - 通过 [Tools](/docs/tools) 配置内置工具集。 - 通过 [持久化记忆](/docs/persistent-memory) 为 Agent 挂载长期记忆。 - 通过 [编排 Multi Agent](/docs/multi-agent) 将复杂任务按职责委派给多个 Agent。 --- # 知识库 Source: https://ark.volcengine.com/region:cn-beijing/docs/knowledge-base-index 知识库是火山引擎提供的一款检索增强生成(RAG)服务,能够智能解析结构化和非结构化文档,并进行分段处理,通过向量检索实现精准的语义匹配,结合大模型推理能力,为企业客户提供更准确、专业的问答效果。 ## 控制台入口 打开 [知识库](https://console.volcengine.com/vikingdb/knowledge/region:vdb-knowledge+cn-beijing/collection/list?projectName=default) 页面,即可创建和管理知识库。 ## 文档索引 * [知识库产品简介](https://docs.volcengine.com/docs/84313/2117716?lang=zh) * [知识库计费](https://docs.volcengine.com/docs/84313/1414457?lang=zh) * [操作指南](https://docs.volcengine.com/docs/84313/1254440?lang=zh) * [API 参考](https://docs.volcengine.com/docs/84313/1254464?lang=zh) * [SDK 参考](https://docs.volcengine.com/docs/84313/1269143?lang=zh) --- # 套餐概览 Source: https://ark.volcengine.com/region:cn-beijing/docs/agent-plan-personal-plan-overview 方舟 Agent Plan 是面向个人用户推出的订阅式大模型服务套餐包,新增支持全模态模型及专属 Harness,采用精细化积分计费模式,助力开启 Agent 场景的全新体验。 # 核心优势 * **全模态模型及 Harness 升级**:提供文本生成、图像生成、视频生成、向量化等能力模型,新增豆包搜索等专属 Harness。 * **量大管饱性价比高**:灵活提供 Small、Medium、Large、Max 四档套餐,兼顾大容量与高性价比,相较于后付费模式,享受更高折扣。 * **兼容主流编程与Agent工具**:多生态兼容,无缝接入 OpenClaw、Hermes Agent、Claude Code、OpenCode 等主流编程及 Agent 工具。 * **包月省心管理**:包月形式订阅,减少预算管理负担。 * **用量清晰可查**:采用 Agent 燃料值(Agent Fuel Point,后简称 AFP)作为统一用量单位,额度用量清晰可查。 > **说明** > > * 已购买套餐用户?参考[快速开始](/docs/agent-plan-personal-get-started) 开启 AI 工具使用之旅。 > * 2026年6月10日18:00:00至2026年11月8日23:59:59活动期间,Auto 模式在 Agent Plan 中抵扣系数为 0.5,支持路由到 kimi-k3,夜间 00:00-8:00,kimi-k3 的路由比例会大幅度提升。详情参见[Agent/Coding Plan 指定模型抵扣系数限时折扣活动](/docs/agent-plan-personal-model-discount)。 > * 2026年9月15日00:00:00至2026年12月30日23:59:59活动期间,deepseek-v4.1-flash 模型在 Agent Plan 中抵扣系数在现有抵扣系数基础上享 5 折优惠。详情参见[Agent/Coding Plan 指定模型抵扣系数限时折扣活动](/docs/agent-plan-personal-model-discount)。 > * 2026年10月20日00:00:00至2026年12月30日23:59:59活动期间,deepseek-v4.1-flash-economy 模型在 Agent Plan 中抵扣系数在现有抵扣系数基础上享 5 折优惠。详情参见[Agent/Coding Plan 指定模型抵扣系数限时折扣活动](/docs/agent-plan-personal-model-discount)。 > * 2026年9月17日00:00:00至2026年12月14日23:59:59活动期间,kimi-k2.8-preview 模型在 Agent Plan 中抵扣系数在现有抵扣系数基础上享 6 折优惠。详情参见[Agent/Coding Plan 指定模型抵扣系数限时折扣活动](/docs/agent-plan-personal-model-discount)。 > * 2026年10月12日00:00:00至2026年10月25日23:59:59活动期间,kimi-k3 模型在 Agent Plan 中抵扣系数在现有抵扣系数基础上享 5 折优惠。详情参见[Agent/Coding Plan 指定模型抵扣系数限时折扣活动](/docs/agent-plan-personal-model-discount)。 方舟 Coding 开发者交流群 飞书扫码进群,交流 AI Coding 实践与心得 ![20260706-141656.jpeg](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/20260706-141656.jpeg) 方舟 Agent 开发者交流群 飞书扫码进群,交流 Agent 开发与应用(如 OpenClaw) ![image-20260611-103021-273.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260611-103021-273.png) # 套餐权益 > **注意** > > Small 、Medium 套餐仅供轻量化体验,不支持视频生成,建议选购 Large 和 Max 这两种支持视频生成套餐。 ## 支持模型及 Harness > **注意** > > `glm-5.3`、`glm-5.3-flash`、`deepseek-v4.1-flash`、`deepseek-v4.1-flash-economy`、`deepseek-v4-flash`、`deepseek-v4-pro`、`kimi-k3`、`kimi-k2.8-preview` 支持 1M 上下文窗口用于包含大型代码库的长会话。在工具中开启 1M 上下文的方案可参见 [Claude Code](/docs/agent-plan-personal-claude-code#5f3c8a1d)、[OpenCode](/docs/agent-plan-personal-opencode#7cfb68d3)、[OpenClaw](/docs/agent-plan-personal-openclaw#e878d189)。 不同套餐支持的模型及 Harness 不同,详细信息如下: |分类 |领域 |模型名称 |长度限制(token) |Small |Medium |Large |Max | |---|---|---|---|---|---|---|---| |模型 |文本生成(极速) |doubao-seed-2.0-mini |* 上下文窗口:256k |✓ |✓ |✓ |✓ | \ | | | |* 最大输出:128k | | | | | \ | | |:::warning | | | | | | \ | | |doubao-seed-2-0-mini 已更新至最新版本。 | | | | | | \ | | |::: | | | | | | |^^|文本生成(标准) |doubao-seed-2.1-lite |* 上下文窗口:1024k |✓ |✓ |✓ |✓ | \ | | | |* 最大输出:256k | | | | | |^^|文本生成(标准) |deepseek-v4-flash |* 上下文窗口:1024k |✓ |✓ |✓ |✓ | \ | | | |* 最大输出:384k | | | | | |^^|文本生成(标准) |glm-5.3-flash |* 上下文窗口:1024k |✓ |✓ |✓ |✓ | \ | | | |* 最大输出:128k | | | | | \ | | |:::warning | | | | | | \ | | |glm-5.3-flash 为原生多模态模型,支持图片输入。 | | | | | | \ | | |::: | | | | | | |^^|文本生成(进阶) |doubao-seed-2.1-pro |* 上下文窗口:1024k |✓ |✓ |✓ |✓ | \ | | | |* 最大输出:256k | | | | | |^^|文本生成(进阶) |doubao-seed-evolving |* 上下文窗口:1024k |✓ |✓ |✓ |✓ | \ | | | |* 最大输出:256k | | | | | |^^|文本生成(进阶) |minimax-m3 `即将下线` |* 上下文窗口:1024k |✓ |✓ |✓ |✓ | \ | | | |* 最大输出:128k | | | | | |^^|文本生成(进阶) |glm-5.3 (glm-latest) |* 上下文窗口:1024k |✓ |✓ |✓ |✓ | \ | | | |* 最大输出:128k | | | | | \ | | |:::warning | | | | | | \ | | |glm-5.3 默认开启思考,不支持关闭思考。 | | | | | | \ | | |::: | | | | | | |^^|文本生成(进阶) |kimi-k2.7-code `即将下线` |* 上下文窗口:256k |✓ |✓ |✓ |✓ | \ | | | |* 最大输出:32k | | | | | |^^|文本生成(进阶) |kimi-k2.8-preview |* 上下文窗口:1024k |✓ |✓ |✓ |✓ | \ | | | |* 最大输出:1024k | | | | | |^^|文本生成(进阶) |deepseek-v4-pro |* 上下文窗口:1024k |✓ |✓ |✓ |✓ | \ | | | |* 最大输出:384k | | | | | \ | | |:::warning | | | | | | \ | | |deepseek-v4-pro 正式版已上线,Agent 能力全面跃升,支持通过 model name 及控制台选择进行访问。 | | | | | | \ | | |::: | | | | | | |^^|文本生成(进阶) |kimi-k3 |* 上下文窗口:1024k |✗ |✓ |✓ |✓ | \ | | | |* 最大输出:128k | | | | | \ | | |:::warning | | | | | | \ | | |kimi-k3 默认开启思考,不支持关闭思考。 | | | | | | \ | | |::: | | | | | | |^^|文本生成(进阶) |deepseek-v4.1-flash |* 上下文窗口:1024k |✓ |✓ |✓ |✓ | \ | | | |* 最大输出:384k | | | | | \ | | |:::warning | | | | | | \ | | |DeepSeek-V4.1-Flash 原生具备多模态视觉理解能力。 | | | | | | \ | | |::: | | | | | | |^^|文本生成(进阶) |deepseek-v4.1-flash-economy |* 上下文窗口:1049k |✓ |✓ |✓ |✓ | \ | | | |* 最大输出:384k | | | | | \ | | |:::warning | | | | | | \ | | |DeepSeek-V4.1-Flash-Economy 支持多模态输入,与标准版采用完全相同的模型权重,能力与效果完全一致。经济版价格更低,回答生成速度略慢,适合注重成本、对生成速度要求不高的场景。 | | | | | | \ | | |::: | | | | | | |^^|向量化 |doubao-embedding-vision |* 上下文窗口:128k |✓ |✓ |✓ |✓ | |^^|图片生成 |doubao-seedream-5-0-pro |\- |✓ |✓ |✓ |✓ | |^^|视频生成 |doubao-seedance-2.0 |\- |✗ |✗ |✓ |✓ | |^^|视频生成 |doubao-seedance-2.0-fast |\- |✗ |✗ |✓ |✓ | |^^|视频生成 |doubao-seedance-2.0-mini |\- |✗ |✗ |✓ |✓ | |^^|视频生成 |doubao-seedance-2.5 |\- |✗ |✗ |✓ |✓ | |^^|语音模型 |doubao-seed-tts-2.0 |\- |✓ |✓ |✓ |✓ | |^^|语音模型 |doubao-seed-asr-2.0 |\- |✓ |✓ |✓ |✓ | |Harness|专业数据集 |\- |\- |✓ |✓ |✓ |✓ | |^^ |豆包搜索 |\- |\- |✓ |✓ |✓ |✓ | \ | | | | |每月500次免费额度 |每月500次免费额度 |每月500次免费额度 |每月500次免费额度 | |^^ |Agent 记忆 |\- |\- |✓ |✓ |✓ |✓ | |^^ |AI Native 应用开发底座 |\- |\- |✓ |✓ |✓ |✓ | |^^ |Agent 进化 |\- |\- |✓ |✓ |✓ |✓ | \ | | | | |前 50 个文件免费 |前 50 个文件免费 |前 50 个文件免费 |前 50 个文件免费 | |^^ |Computer Use Agent |\- |\- |✗ |✓ |✓ |✓ | ## 用量说明 采用积分(AFP)抵扣模式,详细抵扣规则请参见[套餐内 AFP 抵扣规则](/docs/agent-plan-personal-afp-credits-billing-rules)。 > **注意** > > * 图片生成模型、视频生成模型、语音模型、Harness 没有5小时、周额度限制,仅受模型日额度、套餐月额度限制。 > * 日额度限制统一都是套餐月额度的一半。 |套餐 |Small |Medium |Large |Max | |---|---|---|---|---| |价格 |40 元/月 |200 元/月 |500 元/月 |1000 元/月 | |月额度(AFP) |20,000 |100,000 |250,000 |500,000 | |周额度(AFP) |7,000 |35,000 |87,500 |175,000 | |5小时额度(AFP) |2,000 |10,000 |25,000 |50,000 | |日额度(AFP) |10,000 |50,000 |125,000 |250,000 | \ | > 仅部分模型、Harness 支持 | | | | | 您可以在 [Agent Plan 控制台](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=agentPlan) 查看模型调用明细、Harness用量明细信息。模型调用明细数据存在 0.5 - 1天的延迟。超额后付费部分用量仅作预估,实际以账单为准。 ## 有效期 套餐有效期以自然月为单位,自购买成功当日开始计算。1 个月套餐有效期示例:01.31日订购成功,02.28日 23:59 到期(非闰年)。 ## 额度刷新规则 * **未开启超额后付费**:套餐额度在时间周期内耗尽后,需要等待下一个周期自动恢复额度,不会消耗其他资源包或账户余额。抵扣规则参见[套餐内 AFP 抵扣规则](/docs/agent-plan-personal-afp-credits-billing-rules)。 * 5小时限额:根据首次请求发生时间,以 5 小时为周期定时刷新限额。 * 周限额:每周一 00:00:00 重置周限额。 * 日限额:每日 00:00:00 重置日限额(仅限视觉模型、语音模型、Harness)。 * 月限额:每订阅月第 1 日 00:00:00 重置月限额。 * **开启超额后付费**:在套餐周期内额度未用尽时优先抵扣套餐额度;当套餐周期内额度用尽时,无需修改任何配置信息(如 Base URL、API Key、模型名称),系统将自动切换至超额后付费模式继续使用,并产生后付费账单。具体规则与操作参见[超额后付费规则](/docs/agent-plan-personal-over-quota-postpaid-rules)和[超额后付费管理](/docs/agent-plan-personal-over-quota-postpaid-management)。 > **注意** > > * 文本生成模型、向量化模型:开启超额后付费后,当触达5小时限额、周限额或月限额时,将自动切换至超额后付费模式。套餐周期额度刷新后,会自动切换至套餐内抵扣。 > * 语音模型、Harness:没有5小时限额与周限额;开启超额后付费后,仅在触达月限额时才会自动切换至超额后付费模式。 ## TPM 限制 Agent Plan 套餐满足正常开发需求的 TPM,超高 TPM 建议使用后付费 API。推荐的使用项目数量如下: * Small:建议同时进行单个项目的开发 * Medium:建议同时进行 1-2 个项目的开发 * Large、Max:建议同时进行 2+ 个项目的开发 ## 额度使用限制 * 同一订阅套餐可在所有支持的工具中使用,额度共享。 * 文本生成模型及向量化模型不可用于 API 调用,在非 AI 工具中使用 Agent Plan 权益对应的 Base URL 和 API Key 有可能被识别为滥用/违规,会导致订阅停用或账号封禁。 # 订阅规则 ## **购买限制** 单次下单套餐时长不能超过12个月,存量套餐时长 + 新购套餐时长不能超过24个月。 ## **续费规则** * 自动续费:若您在下单时勾选自动续费,即连续包月,每次默认续费 1 个月,到期会自动扣除下一个月的套餐费用。 * 手动续费:若您在下单时没有勾选自动续费,可在 [开通管理](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=agentPlan) 进行续费操作。 ## **升配规则** 套餐有效期不变,补齐升配套餐的差价,即可升配,可在 [开通管理](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=agentPlan) 进行升配操作。**套餐仅支持升配,不支持降配**。 > **注意** > > 升配完成后,当月的 5 小时限额、周限额、月限额将按升配规则调整。当月套餐的已用额度不变,不会清零。 * **差价计算公式** `升配需补差价金额 = (升配套餐月价 - 原套餐月价) / 30 天 * 套餐剩余时长` > **说明** > > 升配套餐月价以升配后套餐的应付金额为准,原套餐月价以升配前套餐的实付金额为准。 * **额度折算规则** * 月限额:`升配后当月可用额度 = 升配套餐月额度 * 当月剩余时长占比 + 原套餐月额度 * 当月已用时长占比` * 5小时限额与周限额:升配完成后,5小时限额、周限额均直接为升配套餐对应的限额。 ## **退订规则** * 支持**非七天无理由退订**:会退订已购买的订单,退订说明及退款计算公式可详见 [非七天无理由退订说明](https://docs.volcengine.com/docs/6269/81013?lang=zh#.5pSv5oyB6Z2e5LiD5aSp5peg55CG55Sx6YCA5qy-5Lqn5ZOB)。 * 支持**退订未生效续费订单**:退订通过点击续费购买且未生效的订单,不会退订当前生效中的订单。例如,首次购买的订单包含5个月时长,但不是续费订单,所以无法通过退订未生效续费订单的方式退订。 **操作步骤**如下: 1. 进入火山引擎 [费用中心-退订管理](https://console.volcengine.com/finance/unsubscribe)。 2. 支持非七天无理由退订、退订未生效续费订单,具体如下: * **非七天无理由退订**:在**退订资源**页签,单击**非七天无理由退订**,在**产品**列过滤**火山方舟订阅套餐**,找到要退订的套餐,在操作列单击**退订**,根据界面提示完成套餐退订。 ![image-20260923-153708-728.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260923-153708-728.png) * **退订未生效续费订单**:在**退订未生效续费周期**页签,找到商品名称为**火山方舟订阅套餐**的待生效的续费订单,在操作列单击**退订**,根据界面提示完成退订。 ![image-20260923-153450-972.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260923-153450-972.png) # 接入 AI 工具 **[Claude Code](/docs/agent-plan-personal-claude-code)** AI 终端编程助手,自然语言编程 **[TraeCode](/docs/agent-plan-personal-trae)** 智能 IDE,构建新一代编程工作流 **[Roo Code](https://ark.volcengine.com/region:cn-beijing/docs/agent-plan-personal-other-tools#e60a76e3)** 轻量级编程助手 **[Codex CLI](/docs/agent-plan-personal-codex)** OpenAI 推出的命令行编程工具 **[Pi](/docs/agent-plan-personal-pi)** 开源终端编程 Agent **[OpenCode](/docs/agent-plan-personal-opencode)** 开源 AI 编程代理工具 **[Cline](/docs/agent-plan-personal-other-tools)** VSCode 扩展,代码补全和调试 **[Kilo Code](/docs/agent-plan-personal-other-tools)** 轻量高性能编程工具 **[WorkBuddy](/docs/agent-plan-personal-workbuddy)** 腾讯桌面 AI 智能体客户端 **[ZCode](/docs/agent-plan-personal-zcode)** 智谱推出的 AI 编程助手 **[OpenClaw](/docs/agent-plan-personal-openclaw)** 开源、自托管个人 AI 助手 **[Cursor](/docs/agent-plan-personal-other-tools)** AI 原生代码编辑器 **[Hermes Agent](/docs/agent-plan-personal-hermes-agent)** 开源自主 AI 智能体 **[DeepSeek Harness](/docs/agent-plan-personal-deepseek-harness)** 一切皆插件的智能体框架 **[OpenAI4S](/docs/agent-plan-personal-openai4s)** 开源科学研究 Agent # 常见问题 [常见问题](/docs/agent-plan-personal-faq) # 数据授权使用协议 [火山引擎数据授权使用协议](/docs/volcengine-data-authorization-agreement) --- # 套餐内 AFP 抵扣规则 Source: https://ark.volcengine.com/region:cn-beijing/docs/agent-plan-personal-afp-credits-billing-rules 方舟 Agent Plan 套餐内用量采用 AFP 作为统一用量单位,本文帮助您快速了解套餐内用量抵扣规则。 # AFP 定义 Agent 燃料值(Agent Fuel Point,简称 AFP)是 Agent Plan 套餐的统一用量计费单位,用于量化智能体(Agent)资源的消耗。 # 抵扣公式 单次请求 AFP 消耗: * 文本生成模型、向量化模型:`(输入 token * 输入抵扣系数 + 输出 token * 输出抵扣系数) / 10,000` * 视频生成模型:` 消耗的 token / 10,000 * 抵扣系数` * 图片生成模型:` 成功生成的图片张数 * 抵扣系数` * 语音模型: * doubao-seed-tts-2.0:`文本字符数 / 10,000 * 抵扣系数` * doubao-seed-asr-2.0:`语音文件时长(小时) * 抵扣系数` * 专业数据集:`调用次数 * 抵扣系数` > **注意** > > 生成视频预估消耗的 token 可参见[价格示例](/docs/model-pricing#2653dbb3)中 token 用量估算公式。 # 抵扣系数 根据模型及 Harness 的层级不同,AFP 的抵扣系数也不同。 ## 模型 ### 文本生成模型与向量化模型 > 文本生成模型与向量化模型的输入抵扣系数、输出抵扣系数均由模型决定,不随输入长度变化。 > **说明** > > - 2026年6月10日18:00:00至2026年11月8日23:59:59活动期间,Auto 模式在 Agent Plan 中抵扣系数为 0.5,支持路由到 kimi-k3,夜间 00:00-8:00,kimi-k3 的路由比例会大幅度提升。详情参见[Agent/Coding Plan 指定模型抵扣系数限时折扣活动](/docs/agent-plan-personal-model-discount)。 > - 2026年9月15日00:00:00至2026年12月30日23:59:59活动期间,deepseek-v4.1-flash 模型在 Agent Plan 中抵扣系数在现有抵扣系数基础上享 5 折优惠。详情参见[Agent/Coding Plan 指定模型抵扣系数限时折扣活动](/docs/agent-plan-personal-model-discount)。 > - 2026年10月20日00:00:00至2026年12月30日23:59:59活动期间,deepseek-v4.1-flash-economy 模型在 Agent Plan 中抵扣系数在现有抵扣系数基础上享 5 折优惠。详情参见[Agent/Coding Plan 指定模型抵扣系数限时折扣活动](/docs/agent-plan-personal-model-discount)。 > - 2026年9月17日00:00:00至2026年12月14日23:59:59活动期间,kimi-k2.8-preview 模型在 Agent Plan 中抵扣系数在现有抵扣系数基础上享 6 折优惠。详情参见[Agent/Coding Plan 指定模型抵扣系数限时折扣活动](/docs/agent-plan-personal-model-discount)。 > - 2026年10月12日00:00:00至2026年10月25日23:59:59活动期间,kimi-k3 模型在 Agent Plan 中抵扣系数在现有抵扣系数基础上享 5 折优惠。详情参见[Agent/Coding Plan 指定模型抵扣系数限时折扣活动](/docs/agent-plan-personal-model-discount)。 |模型类别 |模型 |输入抵扣系数 |输出抵扣系数 | |---|---|---|---| |文本生成(极速) |doubao-seed-2.0-mini |* 输入不含音频:0.25 |* 输入不含音频:0.25 | \ | | |* 输入包含音频:2.5 |* 输入包含音频:2.5 | |文本生成(标准) |deepseek-v4-flash |0.5 |0.5 | |文本生成(标准) |doubao-seed-2.1-lite |* 输入不含音频:0.5 |* 输入不含音频:0.5 | \ | | |* 输入包含音频:4.5 |* 输入包含音频:4.5 | |文本生成(标准) |glm-5.3-flash |0.5 |0.5 | |文本生成(进阶) |doubao-seed-evolving
    minimax-m3 `即将下线` |2.5 |2.5 | |文本生成(进阶) |doubao-seed-2.1-pro |2.5 |2.5 | |文本生成(进阶) |kimi-k2.7-code `即将下线` |4.5 |4.5 | |文本生成(进阶) |kimi-k2.8-preview |8 |8 | \ | | |(4.8`限时折扣`) |(4.8`限时折扣`) | |文本生成(进阶) |glm-5.3 (glm-latest) |4.5 |4.5 | |文本生成(进阶) |deepseek-v4-pro |5.5 |5.5 | |文本生成(进阶) |deepseek-v4.1-flash |2.5 |2.5 | \ | | |(1.25`限时折扣`) |(1.25`限时折扣`) | |文本生成(进阶) |deepseek-v4.1-flash-economy |2 |2 | \ | | |(1`限时折扣`) |(1`限时折扣`) | |文本生成(进阶) |kimi-k3 |10 |10 | \ | | |(5`限时折扣`) |(5`限时折扣`) | |向量化 |doubao-embedding-vision |0.5 |0.5 | ### 视觉模型 > 模型决定抵扣系数。 - 视频生成模型 |模型类别 |模型 |抵扣系数 |单位 | |---|---|---|---| |视频生成 |doubao-seedance-2.0 |* 输出视频分辨率为 480p,720p |token | \ | | | * 输入包含视频:140 | | \ | | | * 输入不含视频:230 | | \ | | |* 输出视频分辨率为 1080p | | \ | | | * 输入包含视频:155 | | \ | | | * 输入不含视频:255 | | \ | | |* 输出视频分辨率为 4k | | \ | | | * 输入包含视频:80 | | \ | | | * 输入不含视频:130 | | |视频生成 |doubao-seedance-2.0-fast |> **输入**是否包含视频 |token | \ | | | | | \ | | |* 输入包含视频:110 | | \ | | |* 输入不含视频:185 | | |视频生成 |doubao-seedance-2.0-mini |> **输入**是否包含视频 |token | \ | | | | | \ | | |* 输入包含视频:70 | | \ | | |* 输入不含视频:115 | | |视频生成 |doubao-seedance-2.5 |* 输出视频分辨率为 480p,720p |token | \ | | | * 输入包含视频:210 | | \ | | | * 输入不含视频:350 | | \ | | |* 输出视频分辨率为 1080p | | \ | | | * 输入包含视频:230 | | \ | | | * 输入不含视频:385 | | - 图片生成模型 |模型类别 |模型 |输入图抵扣系数(AFP/张) |输出图抵扣系数(AFP/张) | |---|---|---|---| |图片生成 |doubao-seedream-5-0-pro |* 第一张:免费 |* 单图生成场景: | \ | | |* 第二张起:10 | * ≤ 261 万像素(分辨率 1.5K 及以下):150 | \ | | | | * \> 261 万像素(分辨率 1.5K 以上):300 | \ | | | |* 图层拆分场景: | \ | | | | * ≤ 261 万像素(分辨率 1.5K 及以下):75 | \ | | | | * \> 261 万像素(分辨率 1.5K 以上):150 | ### 语音模型 > 模型决定抵扣系数。 |模型类别 |模型 |抵扣系数 |单位 | |---|---|---|---| |语音模型 |doubao-seed-tts-2.0 |1350 | 万字符 | |语音模型 |doubao-seed-asr-2.0 |450 |小时 | ## Harness ### 专业数据集 |Harness | 数据类型 |抵扣系数 |单位 | |---|---|---|---| |专业数据集 |中国金融数据库 |12 | 次 | |专业数据集 |企业工商数据库 |12 | 次 | |专业数据集 |企业风险数据库 |12 | 次 | |专业数据集 |科研学术数据搜索服务 |24 | 次 | |专业数据集 |中国汽车车型配置库 |12 | 次 | |专业数据集 |中国汽车品牌销量数据 |12 | 次 | |专业数据集 |宏观经济数据库 |12 | 次 | |专业数据集 |元典法律法规数据库 |60 | 次 | |专业数据集 |元典司法案例数据库 |48 | 次 | |专业数据集 |法律幻觉校验服务 |240 | 次 | |专业数据集 |其他专业数据搜索服务 |12 | 次 | ### 豆包搜索 豆包搜索支持使用 Agent Plan 套餐内 AFP 进行抵扣,抵扣系数如下: |Harness |抵扣系数 |单位 | |---|---|---| |豆包搜索 |5 |次 | ### Agent 记忆 每个数据库独立计费,每个库抵扣情况如下: |文件情况 |抵扣系数 |单位 | |---|---|---| |前50个文件 |免费 |\- | |50 < 文件数 ≤ 4 万 |5 |小时 | |文件数 > 4万 |1.5 |万个文件/小时 | > **注意** > > - 一旦开通抵扣,该账号下 OpenViking 所有数据库均从 Agent Plan 抵扣,不支持部分抵扣。 > - 关闭 Agent Plan 抵扣会立即自动关停 OpenViking 商品,并不定期清理数据,请谨慎操作。 > - 请确保您的官网账户余额 ≥ 0,避免由于欠费导致数据回收。 ### AI Native 应用开发底座 AI Native 应用开发底座采用按量付费模式,各计费项按标准换算为 AFP,由方舟 Agent Plan 统一抵扣。数据库引擎与AI Gateway 服务模型抵扣系数如下所示。 #### 数据库引擎 数据库引擎抵扣系数如下: |计费项 |说明 |抵扣系数 |单位 | |---|---|---|---| |数据库算力 |Workspace 计算资源的费用,以 CU 作为计费单元。1 个 CU 等价于 1 核 CPU 4 GiB 内存的计算资源。 |250 |元/CU/小时 | |Supabase 通用组件算力 |Supabase 服务通用组件计算资源的费用。 |250 |元/CU/小时 | |Edge Function 执行次数 |Supabase 服务调用 Edge Function 产生的费用。 |70 |元/万次 | |对象存储容量 |Supabase 服务使用的对象存储容量的费用。 |0.125 |元/GiB/小时 | |数据库存储容量 |Workspace 的数据存储空间的费用。 |0.625 |元/GiB/小时 | |Storage Vector Bucket存储容量 |Supabase 中 Storage 服务的 Vector Bucket 存储容量 |0.575 |元/GiB/小时 | |Storage Vector Bucket数据查询 |Supabase 中 Storage 服务的 Vector Bucket 数据查询 |0.045 |元/vCU/小时 | |Storage Vector Bucket数据更新 |Supabase 中 Storage 服务的 Vector Bucket 数据更新 |0.045 |元/vCU/小时 | > **说明** > > 计费项对应的规格非 Supabase 的最小可用规格,若采用最小规格(数据库算力 0.5 CU、Supabase 通用组件算力 0.25 CU),每小时仅需消耗 187.5 AFP 及少量存储相关 AFP。 #### AI Gateway 服务模型 AI Gateway 服务模型的计费项与抵扣系数如下: > **注意** > > 此服务使用模型非 Agent Plan 套餐里的模型,使用的相关模型是服务账号购买模型。 |模型 |计费项 |抵扣系数 |单位 | |---|---|---|---| |doubao-seedance-2.0 |分辨率:480p/720p 输入包含视频 |21 |token | |^^|分辨率:480p/720p 输入不含视频 |34.5 |token | |^^|分辨率:1080p 输入包含视频 |23.25 |token | |^^|分辨率:1080p 输入不含视频 |38.25 |token | |^^|分辨率:4k 输入包含视频 |12 |token | |^^|分辨率:4k 输入不含视频 |19.5 |token | |doubao-seedance-2.0-fast |输入包含视频 |16.5 |token | |^^|输入不含视频 |27.75 |token | |doubao-seedance-2.0-mini |输入包含视频 |10.5 |token | |^^|输入不含视频 |17.25 |token | |doubao-seedream-5.0-lite |文生图张数 |165 |元/张/小时 | |^^|图像编辑张数 |165 |元/张/小时 | |doubao-seedream-5.0-pro |多于1张的输入图张数 |15 |元/张/小时 | |^^|少于或等于236万像素输出图 |225 |元/张/小时 | |^^|多于236万像素输出图 |450 |元/张/小时 | |doubao-seed-2.1-pro |缓存-存储 |0.01275 |元/千tokens/小时 | |^^|输入 |4.5 |元/千tokens/小时 | |^^|输出 |22.5 |元/千tokens/小时 | |doubao-seed-2.1-turbo |缓存-存储 |0.01275 |元/千tokens/小时 | |^^|输入 |2.25 |元/千tokens/小时 | |^^|输出 |11.25 |元/千tokens/小时 | |doubao-seed-2.0-code |输入长度≤32k:缓存-存储 |0.01275 |元/千tokens/小时 | |^^|输入长度≤32k:输入 |2.4 |元/千tokens/小时 | |^^|输入长度≤32k:输出 |12 |元/千tokens/小时 | |^^|32k<输入长度≤128k:缓存-存储 |0.01275 |元/千tokens/小时 | |^^|32k<输入长度≤128k:输入 |3.6 |元/千tokens/小时 | |^^|32k<输入长度≤128k:输出 |18 |元/千tokens/小时 | |^^|128k<输入长度≤256k:缓存-存储 |0.01275 |元/千tokens/小时 | |^^|128k<输入长度≤256k:输入 |7.2 |元/千tokens/小时 | |^^|128k<输入长度≤256k:输出 |36 |元/千tokens/小时 | |doubao-seed-2.0-lite |输入长度≤32k:缓存-存储 |0.01275 |元/千tokens/小时 | |^^|输入长度≤32k:输入 |0.45 |元/千tokens/小时 | |^^|输入长度≤32k:输出 |2.7 |元/千tokens/小时 | |^^|32k<输入长度≤128k:缓存-存储 |0.01275 |元/千tokens/小时 | |^^|32k<输入长度≤128k:输入 |0.675 |元/千tokens/小时 | |^^|32k<输入长度≤128k:输出 |4.05 |元/千tokens/小时 | |^^|128k<输入长度≤256k:缓存-存储 |0.01275 |元/千tokens/小时 | |^^|128k<输入长度≤256k:输入 |1.35 |元/千tokens/小时 | |^^|128k<输入长度≤256k:输出 |8.1 |元/千tokens/小时 | |doubao-seed-2.0-mini |输入长度≤32k:缓存-存储 |0.01275 |元/千tokens/小时 | |^^|输入长度≤32k:输入 |0.15 |元/千tokens/小时 | |^^|输入长度≤32k:输出 |1.5 |元/千tokens/小时 | |^^|32k<输入长度≤128k:缓存-存储 |0.01275 |元/千tokens/小时 | |^^|32k<输入长度≤128k:输入 |0.3 |元/千tokens/小时 | |^^|32k<输入长度≤128k:输出 |3 |元/千tokens/小时 | |^^|128k<输入长度≤256k:缓存-存储 |0.01275 |元/千tokens/小时 | |^^|128k<输入长度≤256k:输入 |0.6 |元/千tokens/小时 | |^^|128k<输入长度≤256k:输出 |6 |元/千tokens/小时 | |doubao-seed-2.0-pro |输入长度≤32k:缓存-存储 |0.01275 |元/千tokens/小时 | |^^|输入长度≤32k:输入 |2.4 |元/千tokens/小时 | |^^|输入长度≤32k:输出 |12 |元/千tokens/小时 | |^^|32k<输入长度≤128k:缓存-存储 |0.01275 |元/千tokens/小时 | |^^|32k<输入长度≤128k:输入 |3.6 |元/千tokens/小时 | |^^|32k<输入长度≤128k:输出 |18 |元/千tokens/小时 | |^^|128k<输入长度≤256k:缓存-存储 |0.01275 |元/千tokens/小时 | |^^|128k<输入长度≤256k:输入 |7.2 |元/千tokens/小时 | |^^|128k<输入长度≤256k:输出 |36 |元/千tokens/小时 | ### Agent 进化 套餐内250AFP/百万token,暂不支持超额后付费 |Harness |抵扣系数 |单位 | |---|---|---| |Agent 进化 |250 |百万 token | ### Computer Use Agent 按小时计费,套餐内 312.5 AFP/CU/小时;活动期内限时 2 折优惠,费率低至 62.5 AFP/CU/小时。 |Harness |抵扣系数 |单位 | |---|---|---| |Computer Use Agent |312.5(限时 2 折 62.5) |CU/小时 | ## 抵扣示例 * 文本生成模型示例:当模型设置为 doubao-seed-evolving ,某次请求输入为 50k token,输出为 0.5k token。 ```Plain Text 本次 AFP 消耗 = (输入 token * 输入抵扣系数 + 输出 token * 输出抵扣系数) / 10,000 = (50000 * 2.5 + 500 * 2.5) / 10000 = 12.625 AFP ``` * 视频生成模型示例:当模型设置为 doubao-seedance-2.0-fast,某次视频任务输入包含视频,成功生成视频,消耗 150k token。 ```Plain Text 本次 AFP 消耗 = 消耗的 token / 10000 * 抵扣系数 = 150000 / 10000 * 110 = 1650 AFP ``` * 语音模型示例:当模型设置为 doubao-seed-tts-2.0,某次请求文本为 2000 字符数,消耗 270 AFP。 ```Plain Text 本次 AFP 消耗 = 文本字符数 / 10,000 * 抵扣系数 = 2000 / 10000 * 1350 = 270 AFP ``` * 专业数据集:成功调用一次中国金融数据库,消耗 12 AFP。 --- # 超额后付费规则 Source: https://ark.volcengine.com/region:cn-beijing/docs/agent-plan-personal-over-quota-postpaid-rules 开启超额后付费后,系统将在套餐周期内(5小时、周或月)额度未用尽时优先抵扣套餐额度;当套餐周期内额度用尽时,不需要修改任何配置信息(如 Base URL、API Key、模型名称),将自动切换至超额后付费模式继续使用支持的模型或 Harness,相关调用将产生后付费账单;对应周期额度更新后,系统会自动恢复优先消耗套餐内额度。 > **注意** > > 语音模型、Harness:没有5小时限额与周限额;开启超额后付费后,仅在触达月限额时才会自动切换至超额后付费模式。 # 模型超额后付费规则 如果需要在套餐额度耗尽后继续使用模型,可开启模型超额后付费,具体操作参见[管理模型超额后付费](/docs/agent-plan-personal-over-quota-postpaid-management#a1b2c3d4)。 支持开启超额后付费的模型及具体的后付费规则见下表。 > **说明** > > auto 模式不支持超额后付费使用。 |模型类别 |模型名称 |是否支持开启超额后付费 | 后付费模型价格 | 后付费计费说明 | |---|---|---|---|---| |文本生成(极速) |doubao-seed-2.0-mini |✓ |[模型价格](/docs/model-pricing#aa1874cf) |[模型后付费计费说明](/docs/model-service-pricing#9be44658) | |文本生成(标准) |doubao-seed-2.1-lite |✓ |[模型价格](/docs/model-pricing#aa1874cf) |[模型后付费计费说明](/docs/model-service-pricing#9be44658) | |文本生成(标准) |deepseek-v4-flash |✓ |[模型价格](/docs/model-pricing#aa1874cf) |[模型后付费计费说明](/docs/model-service-pricing#9be44658) | |文本生成(标准) |glm-5.3-flash |✓ |[模型价格](/docs/model-pricing#aa1874cf) |[模型后付费计费说明](/docs/model-service-pricing#9be44658) | |文本生成(进阶) |doubao-seed-2.1-pro |✓ |[模型价格](/docs/model-pricing#aa1874cf) |[模型后付费计费说明](/docs/model-service-pricing#9be44658) | |文本生成(进阶) |doubao-seed-evolving |✓ |[模型价格](/docs/model-pricing#aa1874cf) |[模型后付费计费说明](/docs/model-service-pricing#9be44658) | |文本生成(进阶) |minimax-m3 `即将下线` |✗ |\- |\- | |文本生成(进阶) |glm-5.3 (glm-latest) | ✗ |\- | \- | |文本生成(进阶) |kimi-k3 |✗ |\- |\- | |文本生成(进阶) |kimi-k2.8-preview |✗ |\- |\- | |文本生成(进阶) |deepseek-v4.1-flash |✓ |[模型价格](/docs/model-pricing#aa1874cf) |[模型后付费计费说明](/docs/model-service-pricing#9be44658) | |文本生成(进阶) |deepseek-v4.1-flash-economy |✓ |[模型价格](/docs/model-pricing#aa1874cf) |[模型后付费计费说明](/docs/model-service-pricing#9be44658) | |文本生成(进阶) |deepseek-v4-pro |✓ |[模型价格](/docs/model-pricing#aa1874cf) |[模型后付费计费说明](/docs/model-service-pricing#9be44658) | |向量化 |doubao-embedding-vision |✓ |[模型价格](/docs/model-pricing#e68ea83c) |[模型后付费计费说明](/docs/model-service-pricing#9be44658) | |图片生成 |doubao-seedream-5-0-pro |✗ |\- |\- | |视频生成 |doubao-seedance-2.0 |✗ |\- |\- | |视频生成 |doubao-seedance-2.0-fast |✗ | \-| \-| |视频生成 |doubao-seedance-2.0-mini |✗ | \-| \-| |视频生成 |doubao-seedance-2.5 |✗ |\- |\- | |语音模型 |doubao-seed-tts-2.0 |✓ | 3元/万字符 |[按调用后付费](https://docs.volcengine.com/docs/6561/1359370?lang=zh#tCYty9Zx) | |语音模型 |doubao-seed-asr-2.0 |✓ | 1元/小时 | [按调用后付费](https://docs.volcengine.com/docs/6561/1359370?lang=zh#tCYty9Zx) | # Harness 超额后付费规则 如果需要在套餐额度耗尽后继续使用 Harness,可开启 Harness 超额后付费,具体操作参见[管理 Harness 超额后付费](/docs/agent-plan-personal-over-quota-postpaid-management#f5e6d7c8)。 ## 专业数据集 单次调用超额后付费的费用如下,具体的后付费规则参见:[高质量数据集计费](https://docs.volcengine.com/docs/87646/2222218?lang=zh)。 | 数据类型 | 超额后付费费用 | |---|---| | 中国金融数据库 | 0.024 元/次 | | 企业工商数据库 | 0.024 元/次 | | 企业风险数据库 | 0.024 元/次 | | 中国汽车车型配置库 | 0.024 元/次 | | 中国汽车品牌销量数据 | 0.024 元/次 | | 宏观经济数据库 | 0.024 元/次 | | 科研学术数据搜索服务 | 0.048 元/次 | | 其他专业数据搜索服务 | 0.024 元/次 | ## 豆包搜索 单次调用超额后付费的费用如下,具体后付费规则参见:[web信息搜索](https://docs.volcengine.com/docs/87772/2272951?lang=zh#yQ0Kqmsy)。 |Harness |超额后付费费用 | |---|---| |豆包搜索 |0.020元/次 | ## Agent 记忆 Agent 记忆支持开启超额后付费,具体的后付费规则参见:[计费说明](https://docs.volcengine.com/docs/84313/2485124?lang=zh)。 ## AI Native 应用开发底座 AI Native 应用开发底座支持开启超额后付费,具体的后付费规则参见:[计费项与价格](https://docs.volcengine.com/docs/87275/2105766?lang=zh)。 ## Agent 进化 Agent 进化暂不支持超额后付费。 ## Computer Use Agent Computer Use Agent 暂不支持超额后付费。 --- # 超额后付费管理 Source: https://ark.volcengine.com/region:cn-beijing/docs/agent-plan-personal-over-quota-postpaid-management 当套餐额度不足但仍需在当前套餐继续使用支持的模型或 Harness 时,可开启超额后付费。本文介绍 Agent Plan 个人版中模型和 Harness 超额后付费的开启/关闭方式及相关说明。 > **注意** > > 开启超额后付费前需要进行账号实名认证,具体操作参见 [基本介绍](https://docs.volcengine.com/docs/6261/64935?lang=zh)。 # 管理模型超额后付费 前提条件:已在 [开通管理页面](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=model) 开通模型服务。 1. 在 [Agent Plan](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=agentPlan) 套餐信息区域,单击**超额后付费管理**。 ![1.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/1.png) 2. 在超额后付费管理的**模型**页签中,按需开启或关闭模型的超额后付费开关。 ![2.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/2.png) > **注意** > > * 如果在 [开通管理页面](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=model) 关闭模型服务,则不能继续使用 Agent Plan 的模型超额后付费。 > * 支持开启超额后付费的模型及后付费规则,参见[模型超额后付费规则](/docs/agent-plan-personal-over-quota-postpaid-rules#b1c2d3e4)。 # 管理 Harness 超额后付费 ## 开启/关闭抵扣 * 开启抵扣:开启后,对应 Harness 在套餐额度充足时会优先消耗套餐内 AFP。开启抵扣的方式如下: * 在购买套餐时,选中相关协议,支持的 Harness 会开启抵扣。 * 在 [Agent Plan](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=agentPlan) **Harness** 区域,在对应 Harness 卡片开启抵扣。 ![3.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/3.png) * 关闭抵扣:关闭后,不能使用套餐内该 Harness 服务,即对应 Harness 不再消耗套餐内 AFP 额度,同时其超额后付费也会关闭。关闭抵扣的方式如下: 在Harness区域,在对应 Harness 卡片关闭抵扣。 ## 开启/关闭超额后付费 开启超额后付费后,在套餐周期内额度未用尽时优先抵扣套餐额度;当套餐周期内额度用尽时,无需修改任何配置信息(如 Base URL、API Key、模型名称),系统将自动切换至超额后付费模式继续使用对应 Harness,并产生后付费账单;关闭后,在套餐周期内额度用尽时不再支持通过当前调用方式继续使用对应 Harness。 可通过以下方式开启或关闭 Harness 超额后付费: * 在 [Agent Plan](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=agentPlan) 套餐信息区域,单击**超额后付费管理**,并在 **Harness** 页签中按需开启或关闭对应的超额后付费开关。 ![4.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/4.png) * 在**Harness**区域,按需开启或关闭对应 Harness 卡片的超额后付费开关。 ![5.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/5.png) > **注意** > > 支持开启超额后付费的 Harness 及后付费规则,参见[Harness 超额后付费规则](/docs/agent-plan-personal-over-quota-postpaid-rules#f5e6d7c8)。 --- # 快速开始 Source: https://ark.volcengine.com/region:cn-beijing/docs/agent-plan-personal-get-started 本文介绍如何在 AI 工具中快速配置和使用 Agent Plan。 # 一、购买 Agent Plan 进入 [Agent Plan 控制台](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=agentPlan),按需购买套餐。套餐介绍参见[套餐概览](/docs/agent-plan-personal-plan-overview)。 # 二、选择 AI 工具 Agent Plan 支持主流的 AI 工具,可按需选择。 **[Claude Code](/docs/agent-plan-personal-claude-code)** AI 终端编程助手,自然语言编程 **[TraeCode](/docs/agent-plan-personal-trae)** 智能 IDE,构建新一代编程工作流 **[Roo Code](https://ark.volcengine.com/region:cn-beijing/docs/agent-plan-personal-other-tools#e60a76e3)** 轻量级编程助手 **[Codex CLI](/docs/agent-plan-personal-codex)** OpenAI 推出的命令行编程工具 **[Pi](/docs/agent-plan-personal-pi)** 开源终端编程 Agent **[OpenCode](/docs/agent-plan-personal-opencode)** 开源 AI 编程代理工具 **[Cline](/docs/agent-plan-personal-other-tools)** VSCode 扩展,代码补全和调试 **[Kilo Code](/docs/agent-plan-personal-other-tools)** 轻量高性能编程工具 **[WorkBuddy](/docs/agent-plan-personal-workbuddy)** 腾讯桌面 AI 智能体客户端 **[ZCode](/docs/agent-plan-personal-zcode)** 智谱推出的 AI 编程助手 **[OpenClaw](/docs/agent-plan-personal-openclaw)** 开源、自托管个人 AI 助手 **[Cursor](/docs/agent-plan-personal-other-tools)** AI 原生代码编辑器 **[Hermes Agent](/docs/agent-plan-personal-hermes-agent)** 开源自主 AI 智能体 **[DeepSeek Harness](/docs/agent-plan-personal-deepseek-harness)** 一切皆插件的智能体框架 **[OpenAI4S](/docs/agent-plan-personal-openai4s)** 开源科学研究 Agent # 三、配置 AI 工具 下面以 Claude Code 为例介绍如何使用 Agent Plan。 ## 1.安装 Claude Code 请参考 [官方文档的安装章节](https://code.claude.com/docs/zh-CN/quickstart#步骤-1:安装-claude-code) 完成 Claude Code 安装 。 ## 2. 配置 Claude Code ### 需配置的信息 如您对 Claude Code 熟悉 / 使用 cc-switch 等配置工具 / 本地已有配置 / 已有本地 Agent等,可获取下列信息直接配置/让本地 Agent 帮您配置。 * **ANTHROPIC_BASE_URL**:`https://ark.cn-beijing.volces.com/api/plan`,为专属 Base URL,其他 Base URL 无法在 Agent Plan 中使用。 * **ANTHROPIC_AUTH_TOKEN**:[获取 Agent Plan API Key](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&OpenModelVisible=false&advancedActiveKey=agentPlan),为专属 API Key,其他方舟 API Key 如Coding Plan API Key 无法在 Agent Plan 中使用。 ![image-20260908-203322-616.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260908-203322-616.png) * **ANTHROPIC_MODEL**:见 [支持模型及 Harness](/docs/agent-plan-personal-plan-overview#3d801f5f),不同 Agent Plan 套餐支持的模型不同。请先配置文本生成模型,后续图片生成模型、视频生成模型等可在 Claude Code 中使用自然语言/Skill 等方式完成配置。 > **注意** > > 若您本地已有Claude Code配置(如终端启动命令`.bashrc`/`.zshrc`等),可能因为配置冲突导致 Claude Code 不生效,可以尝试备份并清理本地配置后再次运行。 ### 方式 1:自动化助手(推荐) ArkCLI Helper 是一个编码工具助手,支持快速配置选择的工具接入 Agent Plan。安装并运行该助手,根据界面提示操作可自动完成工具配置,降低手动配置的时间成本和出错风险。 > **注意** > > * ArkCLI Helper 是基于 Ark Helper 升级演进的工具配置服务,相关能力将持续在 ArkCLI Helper 上迭代更新。建议优先使用 ArkCLI Helper 完成工具配置。 > * ArkCLI Helper 支持 macOS、Linux、Windows 系统。 1. 安装 Ark CLI。 ```Bash # 1. 通过 NPM 安装 npm install -g @volcengine/ark-cli@latest # 2. 验证安装 arkcli --version ``` 2. 登录 Ark CLI。 ```Bash arkcli auth login ``` ![image-20260624-144256-509.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-144256-509.png) 根据界面提示选择登录方式。若之前已登录过 arkcli,会沿用上次选择的配置;如需重新选择,请先执行 `arkcli config reset` 后再运行 `arkcli auth login`。首次登录时,按提示完成以下配置: 1. **选择项目(Project)**:可按需选择,或默认选择**账号全部资源**。 2. **选择消费模式(Type)**:选择 `agent-plan`。 ![image-20260624-145424-871.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-145424-871.png) 3. 运行 ArkCLI Helper,根据界面提示完成 Claude Code 的配置。 1. 在命令行界面输入 `arkcli helper` 命令,启动 ArkCLI Helper。 2. **选择要配置的 Plan profile**:`agent-plan_cn-beijing_personal (Agent Plan)`。 ![image-20260624-162749-221.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-162749-221.png) 3. **选择默认 model**:按需选择。 4. **选择要配置的 AI Agent**:`Claude Code`。 当前支持的 Harness 包括:豆包搜索、专业数据集、Agent 记忆(OpenViking)、AI Native 应用开发底座,根据界面提示按需选择`配置`或者`跳过`。 ![image-20260624-151002-667.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-151002-667.png) 完成上述操作后,将自动完成 Claude Code 的基础配置,并按选择结果自动安装对应的 Harness 工具,无需手动安装。 > **说明** > > Claude Code 的原生搜索工具仅支持 Claude 系列模型,第三方模型(如 Doubao、GPT 等)无法直接调用。但通过 [豆包搜索](/docs/agent-plan-personal-search) 可在第三方模型上同样可以正常使用搜索能力。 ### 方式 2:手动配置 下面详细介绍如何手动完成上述信息配置。 1. 创建并打开 `settings.json` 配置文件。文件路径因系统而异,具体操作如下: **选项:macOS/Linux** macOS/Linux 系统 Claude Code 配置文件路径:`~/.claude/settings.json`。 1. 如果在主目录下没有`.claude`目录,执行以下命令创建目录。 ```Bash mkdir -p ~/.claude ``` 2. 创建并打开配置文件。 ```Bash nano ~/.claude/settings.json ``` **选项:Windows** Windows 系统 Claude Code 配置文件路径:`C:\Users\<用户名>\.claude\settings.json`。以 CMD 命令行方式为例,操作如下。 1. 如果当前用户目录下没有`.claude`目录,执行以下命令创建目录。 ```Bash if not exist "%USERPROFILE%\.claude" mkdir "%USERPROFILE%\.claude" ``` 2. 创建并打开配置文件。 ```Bash notepad "%USERPROFILE%\.claude\settings.json" ``` 2. 编辑`settings.json`,需修改的配置信息如下: * ``:替换为您的 [ARK Agent Plan API Key](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&OpenModelVisible=false&advancedActiveKey=agentPlan) * ``:结合套餐及您的需求,更新**文本生成模型**的名称,如 `ark-code-latest`,详细模型名称参见 [支持模型及 Harness](/docs/agent-plan-personal-plan-overview#3d801f5f)。 ```JSON { "env": { "ANTHROPIC_AUTH_TOKEN": "", "ANTHROPIC_BASE_URL": "https://ark.cn-beijing.volces.com/api/plan", "ANTHROPIC_MODEL": "", "ANTHROPIC_DEFAULT_HAIKU_MODEL": "", "ANTHROPIC_DEFAULT_SONNET_MODEL": "", "ANTHROPIC_DEFAULT_OPUS_MODEL": "", "CLAUDE_CODE_SUBAGENT_MODEL": "", "CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": "1" } } ``` > **说明** > > * 要开启 1M 上下文窗口,配置参见[扩展上下文](/docs/agent-plan-personal-claude-code#5f3c8a1d)。 > * 推荐使用完整模型配置,并按任务复杂度选择模型:Haiku(轻量)、Sonnet(日常)、Opus(复杂)。 > * `CLAUDE_CODE_SUBAGENT_MODEL` 建议与主模型保持一致。 > * `ANTHROPIC_DEFAULT_HAIKU_MODEL` 建议设置为小尺寸模型,通常不会影响整体使用效果。 > * `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC` 用于关闭 Claude Code 后台匿名遥测请求。遥测请求默认会走 `ANTHROPIC_BASE_URL` 并占用 Agent Plan 配额,设为 `"1"` 可避免额度被静默消耗(方式 1 的 ArkCLI Helper 会自动配置此项)。 3. 编辑或新增 `.claude.json` 文件,修改或新增 **hasCompletedOnboarding** 字段值为 `true`,设置状态为完成入门引导。 **选项:macOS/Linux** 1. 创建并打开配置文件。 ```Bash nano ~/.claude.json ``` 2. 修改或新增的字段信息如下: ```JSON { "hasCompletedOnboarding": true } ``` **选项:Windows** 1. 创建并打开配置文件。 ```Bash notepad "%USERPROFILE%\.claude.json" ``` 2. 修改或新增的字段信息如下: ```JSON { "hasCompletedOnboarding": true } ``` ## 3.启动并使用 Claude Code 1. 启动Claude Code:进入项目目录,执行`claude`命令,即可开始使用 Claude Code。 ```Bash cd claude ``` 启动后,选择信任此文件夹,允许 Claude Code 访问该文件夹中的文件。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/f621624ffa07485ea37f49ea96c8e8f4~tplv-goo7wpa0wc-image.image) 2. 模型状态验证:输入`/model`确认使用的模型指定正确。 3. 在 Claude Code 中对话。 > 更多使用教程请参见 [Claude Code 官网](https://code.claude.com/docs/zh-CN/quickstart#%E6%AD%A5%E9%AA%A4-4%EF%BC%9A%E6%8F%90%E5%87%BA%E6%82%A8%E7%9A%84%E7%AC%AC%E4%B8%80%E4%B8%AA%E9%97%AE%E9%A2%98)。 ## 其他操作 ### 添加图片生成/视频生成能力 方舟 Agent Plan Medium 及以上套餐提供图片生成模型配额,Large 及以上套餐提供视频生成模型配额。方舟提供 Skill 帮助 AI 工具快速接入并使用。具体配置方法请参见: * [方式 2:手动配置](/docs/agent-plan-personal-visual-models#72de147a) * [配置图片生成模型](/docs/agent-plan-personal-visual-models#aef48a5c) > **注意** > > * 不同的套餐支持的视觉模型有所不同,具体参见[支持模型及 Harness](/docs/agent-plan-personal-plan-overview#3d801f5f)。 > * 视觉模型不支持通过 Auto 及控制台切换使用。 ### 切换模型 你可以随时根据需求切换**文本生成模型**。方舟支持多种方式切换模型。 |配置方式 |通过控制台 |通过命令参数 |修改配置文件 | |---|---|---|---| |切换模型操作 |1. 参考[2. 配置 Claude Code](/docs/agent-plan-personal-get-started#2bfb05a3)配置模型名称为`ark-code-latest`。 |* 启动时:执行`claude --model `,可指定本次对话使用的文本生成模型。 |参考[2. 配置 Claude Code](/docs/agent-plan-personal-get-started#2bfb05a3)配置模型名称为您需要的模型。 | \ | |2. 在 [开通管理页面](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=agentPlan) 选择要使用的模型,切换后3-5分钟即可生效。 |* 对话期间:执行`/model `切换模型。 | | \ | |3. 在命令行窗口,启动 Claude Code 后,输入`/model`确认模型状态。 | | | ## --- # Codex Source: https://ark.volcengine.com/region:cn-beijing/docs/agent-plan-personal-codex 本文介绍如何配置方舟 Agent Plan 到 Codex 中使用。 # 前提条件 您已按需订阅 Agent Plan 套餐。如未,请访问 [开通管理-Agent Plan](https://ark.volcengine.com/region:cn-beijing/openManagement?advancedActiveKey=agentPlan) 页面订阅套餐。 # Codex CLI ## 一、安装 Codex CLI > **说明** > > Agent Plan 支持 Responses API,可以使用最新版 Codex CLI。 前提条件:安装 [Node.js 18 或更新版本](https://nodejs.org/en/download/)。 在命令行界面,执行以下命令安装 Codex CLI。 ```Bash npm i -g @openai/codex ``` 安装结束后,执行以下命令检查版本。 ```Bash codex --version ``` ## 二、配置 Codex CLI ### 方式 1:自动化助手(推荐) ArkCLI Helper 是一个编码工具助手,支持快速配置选择的工具接入 Agent Plan。安装并运行该助手,根据界面提示操作可自动完成工具配置,降低手动配置的时间成本和出错风险。 > **注意** > > * ArkCLI Helper 是基于 Ark Helper 升级演进的工具配置服务,相关能力将持续在 ArkCLI Helper 上迭代更新。建议优先使用 ArkCLI Helper 完成工具配置。 > * ArkCLI Helper 支持 macOS、Linux、Windows 系统。 1. 安装 Ark CLI。 ```Bash # 1. 通过 NPM 安装 npm install -g @volcengine/ark-cli@latest # 2. 验证安装 arkcli --version ``` 2. 登录 Ark CLI。 ```Bash arkcli auth login ``` ![image-20260624-144256-509.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-144256-509.png) 根据界面提示选择登录方式。若之前已登录过 arkcli,会沿用上次选择的配置;如需重新选择,请先执行 `arkcli config reset` 后再运行 `arkcli auth login`。首次登录时,按提示完成以下配置: 1. **选择项目(Project)**:可按需选择,或默认选择**账号全部资源**。 2. **选择消费模式(Type)**:选择 `agent-plan`。 ![image-20260624-145424-871.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-145424-871.png) 3. 运行 ArkCLI Helper,根据界面提示完成 Codex 的配置。 1. 在命令行界面输入 `arkcli helper` 命令,启动 ArkCLI Helper。 2. **选择要配置的 Plan profile**:`agent-plan_cn-beijing_personal (Agent Plan)`。 ![image-20260624-162749-221.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-162749-221.png) 3. **选择默认 model**:按需选择。 4. **选择要配置的 AI Agent**:`Codex`。 当前支持的 Harness 包括:豆包搜索、专业数据集、Agent 记忆(OpenViking)、AI Native 应用开发底座,根据界面提示按需选择`配置`或者`跳过`。 ![](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/arkcli-codex.png) 完成上述操作后,将自动完成 Codex 的基础配置,并按选择结果自动安装对应的 Harness 工具,无需手动安装。 ### 方式 2:手动配置 1. 创建并打开 Codex 的配置文件。文件路径因系统而异,具体操作如下: **选项:macOS/Linux** macOS/Linux 系统 Codex 配置文件路径:`~/.codex/config.toml`。 1. 如果在主目录下没有`.codex`目录,执行以下命令创建目录。 ```Bash mkdir -p ~/.codex ``` 2. 创建并打开配置文件。 ```Bash nano ~/.codex/config.toml ``` **选项:Windows** Windows 系统 Codex 配置文件路径:`%USERPROFILE%\.codex\config.toml`。以 CMD 命令行方式为例,操作如下。 1. 如果当前用户目录下没有`.codex`目录,执行以下命令创建目录。 ```Bash if not exist "%USERPROFILE%\.codex" mkdir "%USERPROFILE%\.codex" ``` 2. 创建并打开配置文件。 ```Bash notepad "%USERPROFILE%\.codex\config.toml" ``` 2. 编辑 `config.toml`,需关注的配置信息如下: * `model`:需配置文本生成模型。支持配置 `ark-code-latest`、配置 Model Name。模型信息见[支持模型及 Harness](/docs/agent-plan-personal-plan-overview#3d801f5f)。 * `env_key`:设置的是环境变量名称,请不要直接修改 `ARK_API_KEY`,您需要在下一步设置该环境变量的值。 ```Plain Text model = "" model_provider = "volcengine-agent-plan" model_supports_reasoning_summaries = true [model_providers.volcengine-agent-plan] name = "volcengine-agent-plan" base_url = "https://ark.cn-beijing.volces.com/api/plan/v3" env_key = "ARK_API_KEY" wire_api = "responses" ``` > **注意** > > * `model_supports_reasoning_summaries = true`:开启推理能力。 > * `model_reasoning_effort`:控制思考长度,可以设置为 `low`、`medium`、`high`。 > * kimi-k2.7-code 不支持设置 `model_supports_reasoning_summaries = true`。 3. 配置环境变量,需要将 `ARK_API_KEY` 环境变量设置为 [专属 API Key](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&OpenModelVisible=false&advancedActiveKey=agentPlan)。 **选项:macOS / Linux** 1. 查看 Shell 类型。 ```Bash echo $SHELL ``` 2. 将环境变量写入 Shell 配置文件,使其在新开终端时自动生效。 * Zsh ```Bash # 需要将 YOUR_API_KEY 替换为专属 API Key。 echo 'export ARK_API_KEY="YOUR_API_KEY"' >> ~/.zshrc source ~/.zshrc ``` * Bash ```Bash # 需要将 YOUR_API_KEY 替换为专属 API Key。 echo 'export ARK_API_KEY="YOUR_API_KEY"' >> ~/.bashrc source ~/.bashrc ``` **选项:Windows** * CMD:环境变量设置完成后,新开 CMD 窗口生效。 ```Bash # 需要将 YOUR_API_KEY 替换为专属 API Key。 setx ARK_API_KEY "YOUR_API_KEY" # 新开窗口,检查环境变量是否生效 echo %ARK_API_KEY% ``` * PowerShell:环境变量设置完成后,新开 PowerShell 窗口生效。 ```Bash # 需要将 YOUR_API_KEY 替换为专属 API Key。 [Environment]::SetEnvironmentVariable("ARK_API_KEY", "YOUR_API_KEY", [EnvironmentVariableTarget]::User) # 新开窗口,检查环境变量是否生效 echo $env:ARK_API_KEY ``` ## 三、开始使用 执行以下命令启动 Codex CLI。 ```Bash codex ``` # Codex 桌面客户端 OpenAI 更新后已取消 Codex 的独立应用,将其融入了 ChatGPT Desktop App 作为其中的一个模式。 ## 一、安装 ChatGPT 桌面客户端 从 [OpenAI 官网](https://openai.com/chatgpt/download/) 下载并安装 ChatGPT 桌面客户端。 ## 二、配置桌面客户端 登录 ChatGPT 桌面客户端后,通过左上角的选项切换 ChatGPT Work 和 Codex,切换到 Codex 模式后,根据以下步骤进行配置。 1. 单击左下角的**设置**。 ![image-20260630-172328-897.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260630-172328-897.png) 2. 在**配置**页面单击**打开 config.toml**。 ![image-20260630-172525-618.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260630-172525-618.png) 3. 编辑 `config.toml`,需关注的配置信息如下。 * `model`:需配置文本生成模型。支持配置 `ark-code-latest`、配置 Model Name。模型信息见[支持模型及 Harness](/docs/agent-plan-personal-plan-overview#3d801f5f)。 * `env_key`:设置的是环境变量名称,请不要直接修改 `ARK_API_KEY`,您需要在下一步设置该环境变量的值。 ```Plain Text model = "" model_provider = "volcengine-agent-plan" model_supports_reasoning_summaries = true [model_providers.volcengine-agent-plan] name = "volcengine-agent-plan" base_url = "https://ark.cn-beijing.volces.com/api/plan/v3" env_key = "ARK_API_KEY" wire_api = "responses" ``` > **注意** > > * `model_supports_reasoning_summaries = true`:开启推理能力。 > * `model_reasoning_effort`:控制思考长度,可以设置为 `low`、`medium`、`high`。 4. 配置环境变量,需要将 `ARK_API_KEY` 环境变量设置为 [专属 API Key](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&OpenModelVisible=false&advancedActiveKey=agentPlan)。 **选项:macOS / Linux** 1. 查看 Shell 类型。 ```Bash echo $SHELL ``` 2. 将环境变量写入 Shell 配置文件,使其在新开终端时自动生效。 * Zsh ```Bash # 需要将 YOUR_API_KEY 替换为专属 API Key。 echo 'export ARK_API_KEY="YOUR_API_KEY"' >> ~/.zshrc source ~/.zshrc ``` * Bash ```Bash # 需要将 YOUR_API_KEY 替换为专属 API Key。 echo 'export ARK_API_KEY="YOUR_API_KEY"' >> ~/.bashrc source ~/.bashrc ``` **选项:Windows** * CMD:环境变量设置完成后,新开 CMD 窗口生效。 ```Bash # 需要将 YOUR_API_KEY 替换为专属 API Key。 setx ARK_API_KEY "YOUR_API_KEY" # 新开窗口,检查环境变量是否生效 echo %ARK_API_KEY% ``` * PowerShell:环境变量设置完成后,新开 PowerShell 窗口生效。 ```Bash # 需要将 YOUR_API_KEY 替换为专属 API Key。 [Environment]::SetEnvironmentVariable("ARK_API_KEY", "YOUR_API_KEY", [EnvironmentVariableTarget]::User) # 新开窗口,检查环境变量是否生效 echo $env:ARK_API_KEY ``` ## 三、开始使用 配置完成后,需要退出 ChatGPT 桌面客户端并重新打开让配置生效。重新启动后,即可在对话界面中使用。 # 使用 Codex 的 Web Search 功能 > **说明** > > - 除了通过配置 MCP 或 Skill 使用豆包搜索能力外,在 Agent Plan 场景下,通过 Responses API 接入的 Codex 也可原生使用 Web Search 功能。 > - 使用豆包搜索承接的 Web Search 会额外发起大模型 API 请求,对搜索结果进行总结。使用前需前往控制台开启豆包搜索抵扣,否则将无法使用 Web Search 功能。 > - 更多说明参见 [豆包搜索](/docs/agent-plan-personal-search)。 完成配置后,按以下步骤在 Codex 使用 Web Search 功能。 1. 在控制台开启豆包搜索抵扣。 ![image-20260909-115856-806.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260909-115856-806.png) 2. 在 Codex 中直接提问,例如"GitHub 最近有哪些热门开源项目"。 --- # Claude Code Source: https://ark.volcengine.com/region:cn-beijing/docs/agent-plan-personal-claude-code 本文介绍如何配置方舟 Agent Plan 到 Claude Code 中使用。 # 一、前提条件 * 您已按需订阅 Agent Plan 套餐。如未,请访问 [开通管理-Agent Plan](https://ark.volcengine.com/region:cn-beijing/subscription/agent-plan?agentMode=close) 页面订阅套餐。 * 您已正确安装 Claude Code,如未,请参考 [官方文档的安装章节](https://code.claude.com/docs/zh-CN/quickstart#步骤-1:安装-claude-code) 完成软件安装 。 # 二、配置 Claude Code ## 需配置的信息 如您对 Claude Code 熟悉 / 使用 cc-switch 等配置工具 / 本地已有配置 / 已有本地 Agent等,可获取下列信息直接配置/让本地 Agent 帮您配置。 * **ANTHROPIC_BASE_URL**:`https://ark.cn-beijing.volces.com/api/plan`,为专属 Base URL,其他 Base URL 无法在 Agent Plan 中使用。 * **ANTHROPIC_AUTH_TOKEN**:[获取 Agent Plan API Key](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&OpenModelVisible=false&advancedActiveKey=agentPlan),为专属 API Key,其他方舟 API Key 如Coding Plan API Key 无法在 Agent Plan 中使用。 ![image-20260908-203322-616.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260908-203322-616.png) * **ANTHROPIC_MODEL**:见 [支持模型及 Harness](/docs/agent-plan-personal-plan-overview#3d801f5f),不同 Agent Plan 套餐支持的模型不同。请先配置文本生成模型,后续图片生成模型、视频生成模型等可在 Claude Code 中使用自然语言/Skill 等方式完成配置。 > **注意** > > 配置前注意清除以下环境变量,避免与旧配置冲突: > > ```Bash > unset ANTHROPIC_AUTH_TOKEN > unset ANTHROPIC_BASE_URL > ``` > > 若变量在 `~/.bashrc` / `~/.zshrc` 中,可以备份并同步删除对应变量。 ## 方式 1:自动化助手(推荐) ArkCLI Helper 是一个编码工具助手,支持快速配置选择的工具接入 Agent Plan。安装并运行该助手,根据界面提示操作可自动完成工具配置,降低手动配置的时间成本和出错风险。 > **注意** > > * ArkCLI Helper 是基于 Ark Helper 升级演进的工具配置服务,相关能力将持续在 ArkCLI Helper 上迭代更新。建议优先使用 ArkCLI Helper 完成工具配置。 > * ArkCLI Helper 支持 macOS、Linux、Windows 系统。 1. 安装 Ark CLI。 ```Bash # 1. 通过 NPM 安装 npm install -g @volcengine/ark-cli@latest # 2. 验证安装 arkcli --version ``` 2. 登录 Ark CLI。 ```Bash arkcli auth login ``` ![image-20260624-144256-509.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-144256-509.png) 根据界面提示选择登录方式。若之前已登录过 arkcli,会沿用上次选择的配置;如需重新选择,请先执行 `arkcli config reset` 后再运行 `arkcli auth login`。首次登录时,按提示完成以下配置: 1. **选择项目(Project)**:可按需选择,或默认选择**账号全部资源**。 2. **选择消费模式(Type)**:选择 `agent-plan`。 ![image-20260624-145424-871.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-145424-871.png) 3. 运行 ArkCLI Helper,根据界面提示完成 Claude Code 的配置。 1. 在命令行界面输入 `arkcli helper` 命令,启动 ArkCLI Helper。 2. **选择要配置的 Plan profile**:`agent-plan_cn-beijing_personal (Agent Plan)`。 ![image-20260624-162749-221.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-162749-221.png) 3. **选择默认 model**:按需选择。 4. **选择要配置的 AI Agent**:`Claude Code`。 当前支持的 Harness 包括:豆包搜索、专业数据集、Agent 记忆(OpenViking)、AI Native 应用开发底座,根据界面提示按需选择`配置`或者`跳过`。 ![image-20260624-151002-667.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-151002-667.png) 完成上述操作后,将自动完成 Claude Code 的基础配置;若选择了相关 Harness 能力,也会自动完成对应工具安装。 ## 方式 2:手动配置 下面详细介绍如何手动完成上述信息配置。 1. 创建并打开 `settings.json` 配置文件。文件路径因系统而异,具体操作如下: **选项:macOS/Linux** macOS/Linux 系统 Claude Code 配置文件路径:`~/.claude/settings.json`。 1. 如果在主目录下没有`.claude`目录,执行以下命令创建目录。 ```Bash mkdir -p ~/.claude ``` 2. 创建并打开配置文件。 ```Bash nano ~/.claude/settings.json ``` **选项:Windows** Windows 系统 Claude Code 配置文件路径:`C:\Users\<用户名>\.claude\settings.json`。以 CMD 命令行方式为例,操作如下。 1. 如果当前用户目录下没有`.claude`目录,执行以下命令创建目录。 ```Bash if not exist "%USERPROFILE%\.claude" mkdir "%USERPROFILE%\.claude" ``` 2. 创建并打开配置文件。 ```Bash notepad "%USERPROFILE%\.claude\settings.json" ``` 2. 编辑`settings.json`,需修改的配置信息如下: * ``:替换为您的 [ARK Agent Plan API Key](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&OpenModelVisible=false&advancedActiveKey=agentPlan) * ``:结合套餐及您的需求,更新**文本生成模型**的名称,如 `ark-code-latest`,详细模型名称参见 [支持模型及 Harness](/docs/agent-plan-personal-plan-overview#3d801f5f)。 ```JSON { "env": { "ANTHROPIC_AUTH_TOKEN": "", "ANTHROPIC_BASE_URL": "https://ark.cn-beijing.volces.com/api/plan", "ANTHROPIC_MODEL": "", "ANTHROPIC_DEFAULT_HAIKU_MODEL": "", "ANTHROPIC_DEFAULT_SONNET_MODEL": "", "ANTHROPIC_DEFAULT_OPUS_MODEL": "", "CLAUDE_CODE_SUBAGENT_MODEL": "", "CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": "1" } } ``` > **说明** > > * 要开启 1M 上下文窗口,配置参见[扩展上下文](/docs/agent-plan-personal-claude-code#5f3c8a1d)。 > * 推荐使用完整模型配置,并按任务复杂度选择模型:Haiku(轻量)、Sonnet(日常)、Opus(复杂)。 > * `CLAUDE_CODE_SUBAGENT_MODEL` 建议与主模型保持一致。 > * `ANTHROPIC_DEFAULT_HAIKU_MODEL` 建议设置为小尺寸模型,通常不会影响整体使用效果。 > * `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC` 用于关闭 Claude Code 后台匿名遥测请求。遥测请求默认会走 `ANTHROPIC_BASE_URL` 并占用 Agent Plan 配额,设为 `"1"` 可避免额度被静默消耗(方式 1 的 ArkCLI Helper 会自动配置此项)。 > * 如需关闭思考(thinking)模式,需要在 `env` 中添加 `"CLAUDE_CODE_EXTRA_BODY": "{\"thinking\":{\"type\":\"disabled\"}}"`。 3. 编辑或新增 `.claude.json` 文件,修改或新增 **hasCompletedOnboarding** 字段值为 `true`,设置状态为完成入门引导。 **选项:macOS/Linux** 1. 创建并打开配置文件。 ```Bash nano ~/.claude.json ``` 1. 修改或新增的字段信息如下: ```JSON { "hasCompletedOnboarding": true } ``` **选项:Windows** 1. 创建并打开配置文件。 ```Bash notepad "%USERPROFILE%\.claude.json" ``` 2. 修改或新增的字段信息如下: ```JSON { "hasCompletedOnboarding": true } ``` # 三、启动并使用 Claude Code 1. 启动Claude Code:进入项目目录,执行`claude`命令,即可开始使用 Claude Code。 ```Bash cd my-project claude ``` 启动后,选择信任此文件夹,允许 Claude Code 访问该文件夹中的文件。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/f621624ffa07485ea37f49ea96c8e8f4~tplv-goo7wpa0wc-image.image) 2. 模型状态验证:输入`/status`确认模型状态。 3. 在 Claude Code 中对话。 > 更多使用教程请参见 [Claude Code 官网](https://code.claude.com/docs/zh-CN/quickstart#%E6%AD%A5%E9%AA%A4-4%EF%BC%9A%E6%8F%90%E5%87%BA%E6%82%A8%E7%9A%84%E7%AC%AC%E4%B8%80%E4%B8%AA%E9%97%AE%E9%A2%98)。 # 其他操作 ## 使用 Claude Code 的 Web Search 功能 > **说明** > > - 除了通过配置 MCP 或 Skill 使用豆包搜索能力外,在 Agent Plan 场景下,通过 Messages API 接入的 Claude Code 也可原生使用 Web Search 功能。 > - 使用豆包搜索承接的 Web Search 会额外发起大模型 API 请求,对搜索结果进行总结。使用前需前往控制台开启豆包搜索抵扣,否则将无法使用 Web Search 功能。 > - 更多说明参见 [豆包搜索](/docs/agent-plan-personal-search)。 完成配置后,可按以下顺序验证 Claude Code 联网搜索能力: 1. 在控制台开启豆包搜索抵扣。 ![image-20260909-115856-806.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260909-115856-806.png) 2. 在 Claude Code 中直接提问,例如“GitHub 最近有哪些热门开源项目”。 ![claude-web-search.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/claude-web-search.png) ## 添加图片生成/视频生成能力 方舟 Agent Plan Medium 及以上套餐提供图片生成模型配额,Large 及以上套餐提供视频生成模型配额。方舟提供 Skill 帮助 AI 工具快速接入并使用。具体配置方法请参见:[配置视觉模型](/docs/agent-plan-personal-visual-models)。 > **注意** > > * 不同的套餐支持的视觉模型有所不同,具体参见[支持模型及 Harness](/docs/agent-plan-personal-plan-overview#3d801f5f)。 > * 视觉模型不支持通过 Auto 及控制台切换使用。 ## 切换模型 你可以随时根据需求切换**文本生成模型**。方舟支持多种方式切换模型。 |配置方式 |通过控制台 |通过命令参数 |修改配置文件 | |---|---|---|---| |切换模型操作 |1. 参考[二、配置 Claude Code](/docs/agent-plan-personal-claude-code#92b07719)配置模型名称为`ark-code-latest`。 |* 启动时:执行`claude --model `,可指定本次对话使用的文本生成模型。 |参考[二、配置 Claude Code](/docs/agent-plan-personal-claude-code#92b07719)配置模型名称为您需要的模型。 | \ | |2. 在 [开通管理页面](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=agentPlan) 选择要使用的模型,切换后3-5分钟即可生效。 |* 对话期间:执行`/model `切换模型。 | | \ | |3. 在命令行窗口,启动 Claude Code 后,输入`/status`确认模型状态。 | | | ## 扩展上下文 `glm-5.3`、`deepseek-v4.1-flash`、`deepseek-v4.1-flash-economy`、`deepseek-v4-flash`、`deepseek-v4-pro` 支持 1M 上下文窗口,可用于包含大型代码库的长会话。以 `glm-5.3` 模型为例,配置信息如下: ```JSON { "env": { "ANTHROPIC_AUTH_TOKEN": "", "ANTHROPIC_BASE_URL": "https://ark.cn-beijing.volces.com/api/plan", "CLAUDE_CODE_AUTO_COMPACT_WINDOW": "1000000", "ANTHROPIC_MODEL": "glm-5.3[1m]", "ANTHROPIC_DEFAULT_HAIKU_MODEL": "glm-5.3[1m]", "ANTHROPIC_DEFAULT_SONNET_MODEL": "glm-5.3[1m]", "ANTHROPIC_DEFAULT_OPUS_MODEL": "glm-5.3[1m]" } } ``` > **注意** > > * 开启 1M 上下文时,需要在模型名称后增加 `[1m]` 后缀,如 `glm-5.3[1m]`,同时配置压缩窗口大小参数 `"CLAUDE_CODE_AUTO_COMPACT_WINDOW": "1000000"`。 > * 若模型参数加上 `[1m]` 后缀后,Claude Code 识别模型不存在,需升级 Claude Code 到最新版本后重试。 ## 使用 CC Switch CC Switch 是一款跨平台桌面应用,专为使用 AI 编程工具的开发者设计。它帮助你统一管理 Claude Code、Claude Desktop、Codex、Gemini CLI、OpenCode、OpenClaw 和 Hermes 等受管应用的配置。 ### 支持的平台 - Windows 10 及以上 - macOS 12 (Monterey) 及以上 - Linux Ubuntu 22.04+ / Debian 11+ / Fedora 34+(x64 / ARM64) ### 安装 > 更多安装方式和详细说明请参考 [CC Switch 官方文档](https://github.com/farion1231/cc-switch)。 **选项:macOS** - **Homebrew(推荐)**: ```Bash brew tap farion1231/ccswitch brew install --cask cc-switch ``` - **手动下载**:从 [Releases 页面](https://github.com/farion1231/cc-switch/releases) 下载 `.dmg`。 **选项:Linux** - **Arch 发行版**: ```Bash paru -S cc-switch-bin ``` - **其他发行版**:根据架构(Debian / Ubuntu)从 [Releases 页面](https://github.com/farion1231/cc-switch/releases) 下载 `.deb` / `.rpm`,或者下载 `.AppImage`(通用)。 **选项:Windows** - 从 [Releases 页面](https://github.com/farion1231/cc-switch/releases) 下载 `.msi` 安装包或 `.zip` 绿色版。 ### 添加供应商 1. 在 CC Switch 中添加供应商: 1. 在主界面顶部图标栏选中 Claude Code 图标,点击右上角 **+** 进入添加新供应商。 2. 选择 **火山 Agentplan** 供应商,填写以下信息: - **API Key**:替换为您的 [ARK Agent Plan API Key](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&OpenModelVisible=false&advancedActiveKey=agentPlan) - **请求地址**:已自动填写为 `https://ark.cn-beijing.volces.com/api/plan` 3. 展开高级选项,根据当前套餐支持的模型范围,分别配置 Sonnet、Opus、Fable、Haiku 模型,可配置的模型见[支持模型及 Harness](/docs/agent-plan-personal-plan-overview#3d801f5f)。 > **注意** > > 建议 Haiku 设置为小尺寸模型。 4. 选择右下角 **添加**,完成供应商配置。 3. 回到首页,点击右侧 **启用** 按钮,新开一个 Claude Code 会话使配置生效。 ## 安装使用 Claude Code IDE 插件 1. 安装 Claude Code 并配置好环境变量,具体参考[Claude Code](/docs/agent-plan-personal-claude-code)。 Claude Code IDE 插件依赖 Claude Code CLI 工具,需先完成 Claude Code的安装及配置。 2. 安装并使用 IDE 插件。 > 因 IDE 插件会迭代演进,以下内容仅供参考,具体的安装及使用可参考 [Visual Studio Code](https://code.claude.com/docs/en/vs-code)、[JetBrains IDEs](https://code.claude.com/docs/en/jetbrains)。 **选项:Claude Code VSCode 插件** > **说明** > > Claude Code VSCode 插件支持在 VSCode 及基于 VSCode 的 IDE(如 Cursor、TraeCode 等)中使用。 ### 安装插件 打开 VSCode,在扩展市场搜索`claude code`进行安装。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/6c39c8cb4ec84f03bb0ca2444804eac7~tplv-goo7wpa0wc-image.image) ### 配置环境变量 1. 打开 VS Code 左下角打开设置,打开**Etensions** - **Claude Code**。 ![claude-code-setings-json.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/claude-code-setings-json.png) 2. 在 **Claude Code: Environment Variables** 区域单击 **Edit in settings.json**,修改`claudeCode.environmentVariables`、`claudeCode.selectedModel`。 > **说明** > > 需要修改的配置信息如下: > * ``:替换为您自己的 [Agent Plan API Key](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&OpenModelVisible=false&advancedActiveKey=agentPlan) > * ``:更新为需要使用的模型信息,如` ark-code-latest`。支持的模型信息参见 [支持模型及Harness](/docs/agent-plan-personal-plan-overview#3d801f5f) 中**文本生成模型**。 > > 若在 Claude Code 对话框中输入 `/config`,插件仅返回可配置项的用法说明,不提供交互式编辑界面,请走步骤 2 的设置入口。 ```JSON ... "claudeCode.environmentVariables": [ { "name": "ANTHROPIC_BASE_URL", "value": "https://ark.cn-beijing.volces.com/api/plan" }, { "name": "ANTHROPIC_AUTH_TOKEN", "value": "" }, { "name": "ANTHROPIC_MODEL", "value": "" } ], "claudeCode.selectedModel": "", ... ``` 保存配置后,新开一个窗口开始使用 Claude Code。 **选项:Claude Code JetBrains 插件** > **说明** > > Claude Code JetBrains 插件支持 Jetbrains 的系列 IDE 如 IntelliJ IDEA、PyCharm、WebStorm 等。 ### 安装插件 打开 JetBrains IDE,在插件市场搜索`claude code`进行安装。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/5859916985a34036bb41f5097ba58f6c~tplv-goo7wpa0wc-image.image) ### 开始使用 安装完成后,重启IDE后,单击Claude Code 图标,进入 Claude Code 页面开始使用。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/78fae54038524ffbbb0f9d0e677de393~tplv-goo7wpa0wc-image.image) --- # OpenCode Source: https://ark.volcengine.com/region:cn-beijing/docs/agent-plan-personal-opencode 本文介绍如何配置方舟 Agent Plan 到 OpenCode 中使用。 # 一、前提条件 * 您已按需订阅 Agent Plan 套餐。如未,请访问 [开通管理-Agent Plan](https://ark.volcengine.com/region:cn-beijing/subscription/agent-plan?agentMode=close) 页面订阅套餐。 * 您已正确安装 OpenCode,如未,请参见以下操作完成软件安装。 前提条件:安装 [Node.js 18 或更新版本](https://nodejs.org/en/download/)。 在命令行界面,执行以下命令安装 OpenCode。 ```Bash npm install -g opencode-ai ``` 安装结束后,执行以下命令查看安装结果,若显示版本号则安装成功。 ```Bash opencode --version ``` # 二、配置 OpenCode ## 方式 1:自动化助手(推荐) ArkCLI Helper 是一个编码工具助手,支持快速配置选择的工具接入 Agent Plan。安装并运行该助手,根据界面提示操作可自动完成工具配置,降低手动配置的时间成本和出错风险。 > **注意** > > * ArkCLI Helper 是基于 Ark Helper 升级演进的工具配置服务,相关能力将持续在 ArkCLI Helper 上迭代更新。建议优先使用 ArkCLI Helper 完成工具配置。 > * ArkCLI Helper 支持 macOS、Linux、Windows 系统。 1. 安装 Ark CLI。 ```Bash # 1. 通过 NPM 安装 npm install -g @volcengine/ark-cli@latest # 2. 验证安装 arkcli --version ``` 2. 登录 Ark CLI。 ```Bash arkcli auth login ``` ![image-20260624-144256-509.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-144256-509.png) 根据界面提示选择登录方式。若之前已登录过 arkcli,会沿用上次选择的配置;如需重新选择,请先执行 `arkcli config reset` 后再运行 `arkcli auth login`。首次登录时,按提示完成以下配置: 1. **选择项目(Project)**:可按需选择,或默认选择**账号全部资源**。 2. **选择消费模式(Type)**:选择 `agent-plan`。 ![image-20260624-145424-871.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-145424-871.png) 3. 运行 ArkCLI Helper,根据界面提示完成 OpenCode 的配置。 1. 在命令行界面输入 `arkcli helper` 命令,启动 ArkCLI Helper。 2. **选择要配置的 Plan profile**:`agent-plan_cn-beijing_personal (Agent Plan)`。 ![image-20260624-162749-221.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-162749-221.png) 3. **选择默认 model**:按需选择。 4. **选择要配置的 AI Agent**:`OpenCode`。 当前支持的 Harness 包括:豆包搜索、专业数据集、Agent 记忆(OpenViking)、AI Native 应用开发底座,根据界面提示按需选择`配置`或者`跳过`。 ![image-20260624-163041-690.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-163041-690.png) 完成上述操作后,将自动完成 OpenCode 的基础配置,并按选择结果自动安装对应的 Harness 工具,无需手动安装。 ## 方式 2:手动配置 1. 创建并打开 OpenCode 的配置文件。文件路径因系统而异,具体操作如下: **选项:macOS/Linux** macOS/Linux 系统 OpenCode 配置文件路径:`~/.config/opencode/opencode.json`。 1. 如果在主目录下没有`.config/opencode`目录,执行以下命令创建目录。 ```Bash mkdir -p ~/.config/opencode ``` 2. 创建并打开配置文件。 ```Bash nano ~/.config/opencode/opencode.json ``` **选项:Windows** Windows 系统 OpenCode 配置文件路径:`%USERPROFILE%\.config\opencode\opencode.json`。以 CMD 命令行方式为例,操作如下。 1. 如果当前用户目录下没有`.config\opencode`目录,执行以下命令创建目录。 ```Bash if not exist "%USERPROFILE%\.config\opencode" mkdir "%USERPROFILE%\.config\opencode" ``` 2. 创建并打开配置文件。 ```Bash notepad "%USERPROFILE%\.config\opencode\opencode.json" ``` 2. 编辑 `opencode.json`,需关注的配置信息如下: * ``:替换为您自己的 [专属 API Key](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&OpenModelVisible=false&advancedActiveKey=agentPlan)。 ![image-20260908-203322-616.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260908-203322-616.png) * `model`:见[支持模型及 Harness](/docs/agent-plan-personal-plan-overview#3d801f5f),需配置文本生成模型。 Agent Plan 兼容 OpenAI 接口协议,支持 Responses API、Chat API。推荐使用 Responses API 的配置,推理效果更好。 支持的两类 API 仅在 npm 配置上不同: * Responses API 配置:`"npm": "@ai-sdk/openai"` * Chat API 配置:`"npm": "@ai-sdk/openai-compatible"` 以配置`ark-code-latest`为例,具体信息如下。 > **注意** > > * `glm-5.3`、`deepseek-v4-flash`、`deepseek-v4-pro`、`kimi-k3`、`kimi-k2.8-preview` 支持 1M 上下文窗口用于包含大型代码库的长会话,可以通过 `limit.context` 字段显式指定窗口大小。 > * `provider.volcengine-agent-plan.models` 节点下有**两处**(对象键、`name`字段)需**替换为同一 Model Name**,切勿遗漏。 > * 若需开启模型图片理解能力,需在模型配置节点下新增如下配置项:`"modalities": {"input": ["text", "image"], "output": ["text"]}` **选项:Responses API** > **说明** > > npm 必须使用 `@ai-sdk/openai`,模型才会使用 Responses API,在 `baseURL` 的基础上自动拼接 `/responses`。 ```JSON { "$schema": "https://opencode.ai/config.json", "model": "volcengine-agent-plan/ark-code-latest", "provider": { "volcengine-agent-plan": { "npm": "@ai-sdk/openai", "name": "Volcano Engine(Responses API)", "options": { "baseURL": "https://ark.cn-beijing.volces.com/api/plan/v3", "apiKey": "" }, "models": { "ark-code-latest": { "name": "ark-code-latest", "limit": { "context": 256000, "output": 32000 }, "modalities": { "input": [ "text", "image" ], "output": [ "text" ] } }, "doubao-seed-2.1-pro": { "name": "doubao-seed-2.1-pro", "limit": { "context": 1024000, "output": 65536 }, "modalities": { "input": [ "text", "image" ], "output": [ "text" ] } }, "doubao-seed-evolving": { "name": "doubao-seed-evolving", "limit": { "context": 1024000, "output": 65536 }, "modalities": { "input": [ "text", "image" ], "output": [ "text" ] } }, "glm-5.3": { "name": "glm-5.3", "limit": { "context": 1024000, "output": 65536 }, "modalities": { "input": [ "text" ], "output": [ "text" ] } }, "glm-5.3-flash": { "name": "glm-5.3-flash", "limit": { "context": 1024000, "output": 65536 }, "modalities": { "input": [ "text", "image" ], "output": [ "text" ] } }, "glm-latest": { "name": "glm-latest", "limit": { "context": 1024000, "output": 65536 }, "modalities": { "input": [ "text" ], "output": [ "text" ] } }, "deepseek-v4.1-flash": { "name": "deepseek-v4.1-flash", "limit": { "context": 1024000, "output": 65536 }, "modalities": { "input": [ "text", "image" ], "output": [ "text" ] } }, "deepseek-v4.1-flash-economy": { "name": "deepseek-v4.1-flash-economy", "limit": { "context": 1049000, "output": 65536 }, "modalities": { "input": [ "text", "image" ], "output": [ "text" ] } }, "deepseek-v4-flash": { "name": "deepseek-v4-flash", "limit": { "context": 1024000, "output": 65536 }, "modalities": { "input": [ "text" ], "output": [ "text" ] } }, "deepseek-v4-pro": { "name": "deepseek-v4-pro", "limit": { "context": 1024000, "output": 65536 }, "modalities": { "input": [ "text" ], "output": [ "text" ] } }, "doubao-seed-2.1-lite": { "name": "doubao-seed-2.1-lite", "limit": { "context": 1024000, "output": 65536 }, "modalities": { "input": [ "text", "image" ], "output": [ "text" ] } }, "doubao-seed-2.0-mini": { "name": "doubao-seed-2.0-mini", "limit": { "context": 256000, "output": 65536 }, "modalities": { "input": [ "text", "image" ], "output": [ "text" ] } }, "kimi-k3": { "name": "kimi-k3", "limit": { "context": 1024000, "output": 65536 }, "modalities": { "input": [ "text", "image" ], "output": [ "text" ] } }, "kimi-k2.8-preview": { "name": "kimi-k2.8-preview", "limit": { "context": 1024000, "output": 65536 }, "modalities": { "input": [ "text", "image" ], "output": [ "text" ] } } } } } } ``` **选项:Chat API** > **说明** > > npm 必须使用 `@ai-sdk/openai-compatible`,模型才会使用 Chat API,在 `baseURL` 的基础上自动拼接 `/chat/completions`。 ```JSON { "$schema": "https://opencode.ai/config.json", "model": "volcengine-agent-plan/ark-code-latest", "provider": { "volcengine-agent-plan": { "npm": "@ai-sdk/openai-compatible", "name": "Volcano Engine(Chat API)", "options": { "baseURL": "https://ark.cn-beijing.volces.com/api/plan/v3", "apiKey": "" }, "models": { "ark-code-latest": { "name": "ark-code-latest", "limit": { "context": 256000, "output": 32000 }, "modalities": { "input": [ "text", "image" ], "output": [ "text" ] } }, "doubao-seed-2.1-pro": { "name": "doubao-seed-2.1-pro", "limit": { "context": 1024000, "output": 65536 }, "modalities": { "input": [ "text", "image" ], "output": [ "text" ] } }, "doubao-seed-evolving": { "name": "doubao-seed-evolving", "limit": { "context": 1024000, "output": 65536 }, "modalities": { "input": [ "text", "image" ], "output": [ "text" ] } }, "glm-5.3": { "name": "glm-5.3", "limit": { "context": 1024000, "output": 65536 }, "modalities": { "input": [ "text" ], "output": [ "text" ] } }, "glm-5.3-flash": { "name": "glm-5.3-flash", "limit": { "context": 1024000, "output": 65536 }, "modalities": { "input": [ "text", "image" ], "output": [ "text" ] } }, "glm-latest": { "name": "glm-latest", "limit": { "context": 1024000, "output": 65536 }, "modalities": { "input": [ "text" ], "output": [ "text" ] } }, "deepseek-v4.1-flash": { "name": "deepseek-v4.1-flash", "limit": { "context": 1024000, "output": 65536 }, "modalities": { "input": [ "text", "image" ], "output": [ "text" ] } }, "deepseek-v4.1-flash-economy": { "name": "deepseek-v4.1-flash-economy", "limit": { "context": 1049000, "output": 65536 }, "modalities": { "input": [ "text", "image" ], "output": [ "text" ] } }, "deepseek-v4-flash": { "name": "deepseek-v4-flash", "limit": { "context": 1024000, "output": 65536 }, "modalities": { "input": [ "text" ], "output": [ "text" ] } }, "deepseek-v4-pro": { "name": "deepseek-v4-pro", "limit": { "context": 1024000, "output": 65536 }, "modalities": { "input": [ "text" ], "output": [ "text" ] } }, "doubao-seed-2.1-lite": { "name": "doubao-seed-2.1-lite", "limit": { "context": 1024000, "output": 65536 }, "modalities": { "input": [ "text", "image" ], "output": [ "text" ] } }, "doubao-seed-2.0-mini": { "name": "doubao-seed-2.0-mini", "limit": { "context": 256000, "output": 65536 }, "modalities": { "input": [ "text", "image" ], "output": [ "text" ] } }, "kimi-k3": { "name": "kimi-k3", "limit": { "context": 1024000, "output": 65536 }, "modalities": { "input": [ "text", "image" ], "output": [ "text" ] } }, "kimi-k2.8-preview": { "name": "kimi-k2.8-preview", "limit": { "context": 1024000, "output": 65536 }, "modalities": { "input": [ "text", "image" ], "output": [ "text" ] } } } } } } ``` # 三、启动并使用 OpenCode 1. 启动OpenCode: ```Bash opencode ``` 2. 输入`/models`,选择配置的模型并在 OpenCode 中使用。 # 其他操作 ## 添加图片生成/视频生成能力 方舟 Agent Plan Medium 及以上套餐提供图片生成模型配额,Large 及以上套餐提供视频生成模型配额。方舟提供 Skill 帮助 AI 工具快速接入并使用。具体配置方法请参见:[配置视觉模型](/docs/agent-plan-personal-visual-models)。 > **注意** > > * 不同的套餐支持的视觉模型有所不同,具体参见[支持模型及 Harness](/docs/agent-plan-personal-plan-overview#3d801f5f)。 > * 视觉模型不支持通过 Auto 及控制台切换使用。 ## 切换模型 你可以随时根据需求切换**文本生成模型**。方舟支持多种方式切换模型。 |配置方式 |通过控制台 |通过命令参数 |修改配置文件 | |---|---|---|---| |切换模型操作 |1. 参考[二、配置 OpenCode](/docs/agent-plan-personal-opencode#c807cb71)配置模型名称为`ark-code-latest`。 |启动 OpenCode后,执行`/models`切换模型。 |参考[二、配置 OpenCode](/docs/agent-plan-personal-opencode#c807cb71)配置模型名称为您需要的模型。 | \ | |2. 在 [开通管理页面](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=agentPlan) 选择要使用的模型,切换后3-5分钟即可生效。 | | | --- # OpenClaw Source: https://ark.volcengine.com/region:cn-beijing/docs/agent-plan-personal-openclaw 本文介绍如何配置方舟 Agent Plan 到 OpenClaw 中使用。 # 一、前提条件 * 您已按需订阅 Agent Plan 套餐。如未,请访问 [开通管理-Agent Plan](https://ark.volcengine.com/region:cn-beijing/subscription/agent-plan?agentMode=close) 页面订阅套餐。 # 二、安装 OpenClaw 前提条件:安装 [Node.js 22 或更新版本](https://nodejs.org/en/download/)。 1. 执行以下命令安装 OpenClaw。 **选项:macOS / Linux** ```Bash curl -fsSL https://openclaw.ai/install.sh | bash ``` **选项:Windows** Windows PowerShell 环境下安装命令如下: ```Bash iwr -useb https://openclaw.ai/install.ps1 | iex ``` 2. 根据提示信息完成 OpenClaw 配置,配置信息如下。 > **注意** > > OpenClaw 在不断迭代,如果实际使用与以下配置存在差异,可以选择 "Skip" 或默认选项完成配置流程,后续可以参考文档配置并使用 Agent Plan。 |提示信息 |配置 | |---|---| |I understand this is personal-by-default and shared/multi-user use requires lock-down. Continue? |选择 "Yes" | |Setup mode |选择 “QuickStart” | |Model/auth provider |选择 "Skip for now",后续可以配置。 | |Default model |选择 "Keep current" | |Select channel (QuickStart) |选择 “Skip for now”,后续可以配置。 | |Search provider |选择 “Skip for now” | |Configure skills now? (recommended) |选择 “No”,后续可以配置。 | | Enable hooks? |选择 "Skip for now"。选择方式:按空格键选中选项,按回车键进入下一步。 | |How do you want to hatch your bot? |选择 "Hatch in Terminal"。 | # 三、配置 OpenClaw ## 方式 1:自动化助手(推荐) ArkCLI Helper 是一个编码工具助手,支持快速配置选择的工具接入 Agent Plan。安装并运行该助手,根据界面提示操作可自动完成工具配置,降低手动配置的时间成本和出错风险。 > **注意** > > * ArkCLI Helper 是基于 Ark Helper 升级演进的工具配置服务,相关能力将持续在 ArkCLI Helper 上迭代更新。建议优先使用 ArkCLI Helper 完成工具配置。 > * ArkCLI Helper 支持 macOS、Linux、Windows 系统。 1. 安装 Ark CLI。 ```Bash # 1. 通过 NPM 安装 npm install -g @volcengine/ark-cli@latest # 2. 验证安装 arkcli --version ``` 2. 登录 Ark CLI。 ```Bash arkcli auth login ``` ![image-20260624-144256-509.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-144256-509.png) 根据界面提示选择登录方式。若之前已登录过 arkcli,会沿用上次选择的配置;如需重新选择,请先执行 `arkcli config reset` 后再运行 `arkcli auth login`。首次登录时,按提示完成以下配置: 1. **选择项目(Project)**:可按需选择,或默认选择**账号全部资源**。 2. **选择消费模式(Type)**:选择 `agent-plan`。 ![image-20260624-145424-871.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-145424-871.png) 3. 运行 ArkCLI Helper,根据界面提示完成 OpenClaw 的配置。 1. 在命令行界面输入 `arkcli helper` 命令,启动 ArkCLI Helper。 2. **选择要配置的 Plan profile**:`agent-plan_cn-beijing_personal (Agent Plan)`。 3. **选择默认 model**:按需选择。 4. **选择要配置的 AI Agent**:`OpenClaw`。 当前支持的 Harness 包括:豆包搜索、专业数据集、Agent 记忆(OpenViking)、AI Native 应用开发底座,根据界面提示按需选择`配置`或者`跳过`。 ![image-20260624-165137-225.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-165137-225.png) 完成上述操作后,将自动完成 OpenClaw 的基础配置,并按选择结果自动安装对应的 Harness 工具,无需手动安装。 ## 方式 2:手动配置 Agent Plan 兼容 OpenAI 接口协议,支持 Responses API、Chat API。推荐使用 Responses API 的配置,推理效果更好。 两类 API 的配置方式基本一致,只需在 `models.providers` 中指定对应的 API 适配器: - Responses API 配置:`"api": "openai-responses"` - Chat API 配置:`"api": "openai-completions"` > **注意** > > `glm-5.3`、`deepseek-v4-flash`、`deepseek-v4-pro`、`kimi-k3`、`kimi-k2.8-preview` 支持 1M 上下文窗口用于包含大型代码库的长会话,可以通过 `contextWindow` 字段显式指定窗口大小。 **选项:Web UI 方式** 1. 执行以下命令打开 Web UI。 ```Bash openclaw dashboard ``` 2. 在左侧菜单栏选择**配置** - **Settings** - **Advanced**,单击 **Open** 查看并修改配置信息。具体配置信息如下,其中需要将``替换为您自己的 [专属 API Key](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&OpenModelVisible=false&advancedActiveKey=agentPlan)。 > **注意** > > 如果已经配置过 OpenClaw,请勿直接覆盖原有配置,建议根据提供的配置更新`models`、`agents` 和 `gateway` 节点信息。其中`models`节点包含支持的模型列表。 ![image-20260908-203322-616.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260908-203322-616.png) 以下是 Responses API 的配置示例。 ```JSON { "models": { "providers": { "volcengine-agent-plan": { "baseUrl": "https://ark.cn-beijing.volces.com/api/plan/v3", "apiKey": "", "api": "openai-responses", "models": [ { "id": "ark-code-latest", "name": "ark-code-latest", "contextWindow": 256000, "maxTokens": 32000, "input": [ "text", "image" ] }, { "id": "doubao-seed-2.1-pro", "name": "doubao-seed-2.1-pro", "contextWindow": 1024000, "maxTokens": 65536, "input": [ "text", "image" ] }, { "id": "doubao-seed-2.1-lite", "name": "doubao-seed-2.1-lite", "contextWindow": 1024000, "maxTokens": 65536, "input": [ "text", "image" ] }, { "id": "doubao-seed-evolving", "name": "doubao-seed-evolving", "contextWindow": 1024000, "maxTokens": 65536, "input": [ "text", "image" ] }, { "id": "glm-5.3", "name": "glm-5.3", "contextWindow": 1024000, "maxTokens": 65536, "input": [ "text" ] }, { "id": "glm-5.3-flash", "name": "glm-5.3-flash", "contextWindow": 1024000, "maxTokens": 65536, "input": [ "text", "image" ] }, { "id": "glm-latest", "name": "glm-latest", "contextWindow": 1024000, "maxTokens": 65536, "input": [ "text" ] }, { "id": "deepseek-v4.1-flash", "name": "deepseek-v4.1-flash", "contextWindow": 1024000, "maxTokens": 65536, "input": [ "text", "image" ] }, { "id": "deepseek-v4.1-flash-economy", "name": "deepseek-v4.1-flash-economy", "contextWindow": 1049000, "maxTokens": 65536, "input": [ "text", "image" ] }, { "id": "deepseek-v4-flash", "name": "deepseek-v4-flash", "contextWindow": 1024000, "maxTokens": 65536, "input": [ "text" ] }, { "id": "deepseek-v4-pro", "name": "deepseek-v4-pro", "contextWindow": 1024000, "maxTokens": 65536, "input": [ "text" ] }, { "id": "doubao-seed-2.0-mini", "name": "doubao-seed-2.0-mini", "contextWindow": 256000, "maxTokens": 65536, "input": [ "text", "image" ] }, { "id": "kimi-k3", "name": "kimi-k3", "contextWindow": 1024000, "maxTokens": 65536, "input": [ "text", "image" ] }, { "id": "kimi-k2.8-preview", "name": "kimi-k2.8-preview", "contextWindow": 1024000, "maxTokens": 65536, "input": [ "text", "image" ] } ] } } }, "agents": { "defaults": { "model": { "primary": "volcengine-agent-plan/ark-code-latest" }, "models": { "volcengine-agent-plan/ark-code-latest": {}, "volcengine-agent-plan/doubao-seed-2.1-pro": {}, "volcengine-agent-plan/doubao-seed-2.1-lite": {}, "volcengine-agent-plan/doubao-seed-2.0-mini": {}, "volcengine-agent-plan/glm-5.3": {}, "volcengine-agent-plan/glm-5.3-flash": {}, "volcengine-agent-plan/glm-latest": {}, "volcengine-agent-plan/kimi-k3": {}, "volcengine-agent-plan/kimi-k2.8-preview": {}, "volcengine-agent-plan/deepseek-v4.1-flash": {}, "volcengine-agent-plan/deepseek-v4.1-flash-economy": {}, "volcengine-agent-plan/deepseek-v4-flash": {}, "volcengine-agent-plan/deepseek-v4-pro": {} } } }, "gateway": { "mode": "local" } } ``` 3. 配置完成后,先保存配置文件,然后单击 **Update** 更新配置,配置更新完成后需要重新连接服务进入 Web UI。 ![Image](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/be24b57cff314b749016abd2fd3ada7a~tplv-goo7wpa0wc-image.image) **选项:终端方式** 1. 在终端执行以下命令打开 OpenClaw 配置文件。 ```Bash nano ~/.openclaw/openclaw.json ``` 2. 修改配置信息,完成 Agent Plan 对接。将``替换为您自己的 [专属 API Key](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&OpenModelVisible=false&advancedActiveKey=agentPlan)。 > **注意** > > 如果已经配置过 OpenClaw,请勿直接覆盖原有配置,建议根据提供的配置更新`models`、`agents` 和 `gateway` 节点信息。其中`models`节点包含支持的模型列表。 ![image-20260908-203322-616.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260908-203322-616.png) 以下是 Responses API 的配置示例。 ```JSON { "models": { "providers": { "volcengine-agent-plan": { "baseUrl": "https://ark.cn-beijing.volces.com/api/plan/v3", "apiKey": "", "api": "openai-responses", "models": [ { "id": "ark-code-latest", "name": "ark-code-latest", "contextWindow": 256000, "maxTokens": 32000, "input": [ "text", "image" ] }, { "id": "doubao-seed-2.1-pro", "name": "doubao-seed-2.1-pro", "contextWindow": 1024000, "maxTokens": 65536, "input": [ "text", "image" ] }, { "id": "doubao-seed-2.1-lite", "name": "doubao-seed-2.1-lite", "contextWindow": 1024000, "maxTokens": 65536, "input": [ "text", "image" ] }, { "id": "doubao-seed-evolving", "name": "doubao-seed-evolving", "contextWindow": 1024000, "maxTokens": 65536, "input": [ "text", "image" ] }, { "id": "glm-5.3", "name": "glm-5.3", "contextWindow": 1024000, "maxTokens": 65536, "input": [ "text" ] }, { "id": "glm-5.3-flash", "name": "glm-5.3-flash", "contextWindow": 1024000, "maxTokens": 65536, "input": [ "text", "image" ] }, { "id": "glm-latest", "name": "glm-latest", "contextWindow": 1024000, "maxTokens": 65536, "input": [ "text" ] }, { "id": "deepseek-v4.1-flash", "name": "deepseek-v4.1-flash", "contextWindow": 1024000, "maxTokens": 65536, "input": [ "text", "image" ] }, { "id": "deepseek-v4.1-flash-economy", "name": "deepseek-v4.1-flash-economy", "contextWindow": 1049000, "maxTokens": 65536, "input": [ "text", "image" ] }, { "id": "deepseek-v4-flash", "name": "deepseek-v4-flash", "contextWindow": 1024000, "maxTokens": 65536, "input": [ "text" ] }, { "id": "deepseek-v4-pro", "name": "deepseek-v4-pro", "contextWindow": 1024000, "maxTokens": 65536, "input": [ "text" ] }, { "id": "doubao-seed-2.0-mini", "name": "doubao-seed-2.0-mini", "contextWindow": 256000, "maxTokens": 65536, "input": [ "text", "image" ] }, { "id": "kimi-k3", "name": "kimi-k3", "contextWindow": 1024000, "maxTokens": 65536, "input": [ "text", "image" ] }, { "id": "kimi-k2.8-preview", "name": "kimi-k2.8-preview", "contextWindow": 1024000, "maxTokens": 65536, "input": [ "text", "image" ] } ] } } }, "agents": { "defaults": { "model": { "primary": "volcengine-agent-plan/ark-code-latest" }, "models": { "volcengine-agent-plan/ark-code-latest": {}, "volcengine-agent-plan/doubao-seed-2.1-pro": {}, "volcengine-agent-plan/doubao-seed-2.1-lite": {}, "volcengine-agent-plan/doubao-seed-2.0-mini": {}, "volcengine-agent-plan/glm-5.3": {}, "volcengine-agent-plan/glm-5.3-flash": {}, "volcengine-agent-plan/glm-latest": {}, "volcengine-agent-plan/kimi-k3": {}, "volcengine-agent-plan/kimi-k2.8-preview": {}, "volcengine-agent-plan/deepseek-v4.1-flash": {}, "volcengine-agent-plan/deepseek-v4.1-flash-economy": {}, "volcengine-agent-plan/deepseek-v4-flash": {}, "volcengine-agent-plan/deepseek-v4-pro": {} } } }, "gateway": { "mode": "local" } } ``` 3. 配置完成后保存文件,并在终端执行以下命令重启服务使更改生效。 ```Bash openclaw gateway restart ``` # 四、使用 OpenClaw * 打开 Web UI,在 Chat 页面进行交互。 ```Bash openclaw dashboard ``` * 打开 TUI,并查看 Gateway 状态。 ```Bash openclaw tui /status ``` # 其他操作 ## 配置向量模型 方舟 Agent Plan 提供的 `doubao-embedding-vision` 模型(向量模型)可以为 OpenClaw 提供语义向量能力,将对话、文档与任务信息转换为高维向量表示,实现基于语义相似度的高效检索。 相比传统关键词匹配,Embedding 检索在信息量大、对话长、资料分散的场景下,能够更准确地召回相关内容,显著降低遗漏与误判。同时,Embedding 为记忆检索、知识库问答与工具调用提供统一的语义索引层,帮助 OpenClaw 在不增加主模型推理成本的前提下,提升跨轮次上下文追踪能力与整体效果。 选择以下任一方式配置向量模型。 **选项:Web UI 方式** 1. 执行以下命令打开 Web UI。 ```Bash openclaw dashboard ``` 2. 在左侧菜单栏选择**配置** - **Settings** - **Advanced**,单击 **Open** 查看并修改配置信息,在`agents.defaults`节点下增加 `memorySearch`相关配置信息,增加的配置信息如下。其中需要将``替换为您自己的 [专属 API Key](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&OpenModelVisible=false&advancedActiveKey=agentPlan)。 ```JSON { ... "agents": { "defaults": { ... "memorySearch": { "provider": "openai", "model": "doubao-embedding-vision", "remote": { "baseUrl": "https://ark.cn-beijing.volces.com/api/plan/v3", "apiKey": "" } } ... } } ... } ``` 3. 配置完成后,先保存配置文件,然后单击 **Update** 更新配置,配置更新完成后需要重新连接服务进入 Web UI。 **选项:终端方式** 1. 在终端执行以下命令打开 OpenClaw 配置文件。 ```Bash nano ~/.openclaw/openclaw.json ``` 2. 在`agents.defaults`节点下增加 `memorySearch`相关配置信息,增加的配置信息如下。其中需要将``替换为您自己的 [专属 API Key](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&OpenModelVisible=false&advancedActiveKey=agentPlan)。 ```JSON { ... "agents": { "defaults": { ... "memorySearch": { "provider": "openai", "model": "doubao-embedding-vision", "remote": { "baseUrl": "https://ark.cn-beijing.volces.com/api/plan/v3", "apiKey": "" } } ... } } ... } ``` 3. 配置完成后,重启网关使配置生效。 ```Bash openclaw gateway restart ``` ## 配置视觉模型 方舟 Agent Plan 提供生图、生视频模型,支持通过 AI 工具的 Skill 接入并使用。具体配置方法请参见 [配置视觉模型](/docs/agent-plan-personal-visual-models)。 > **注意** > > * 不同的套餐支持的视觉模型有所不同,具体参见[支持模型及 Harness](/docs/agent-plan-personal-plan-overview#3d801f5f)。 > * 视觉模型不支持通过 Auto 及控制台切换使用。 ## 切换模型 请根据语言模型配置方式,选择对应的语言模型切换方案。 * 模型配置:Model Name,支持以下两种方式切换模型。 前提条件:根据[三、配置 OpenClaw](/docs/agent-plan-personal-openclaw#48c0b1ea)步骤完成文件配置,其中`agents.defaults.models`包含支持的模型列表。 * 方式 1:全局配置(永久有效) 在配置文件中直接修改`agents.defaults.model.primary`为目标模型,修改完成后需要重新启动服务。 ```JSON { "agents": { "defaults": { "model": { "primary": "volcengine-agent-plan/doubao-seed-2.1-pro" } } } } ``` * 方式 2:在当前会话切换模型(临时有效) 在终端执行`openclaw tui`后,通过`/models`切换模型,当界面返回 "model set to " 时,表示配置生效。 * 模型配置:`volcengine-agent-plan/ark-code-latest`,通过控制台切换模型。 配置文件中`agents.defaults.model.primary`为`volcengine-agent-plan/ark-code-latest`。 模型切换操作:在 [开通管理页面](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=agentPlan) 选择要使用的模型,切换后3-5分钟即可生效。 ## 接入飞书机器人 ### 前置准备 安装并配置 OpenClaw,参见[二、安装 OpenClaw](/docs/agent-plan-personal-openclaw#b51c87f8)、[三、配置 OpenClaw](/docs/agent-plan-personal-openclaw#48c0b1ea)。 > **注意** > > 飞书插件处于快速迭代阶段,本文使用的插件版本为 **2026.3.10**,如果实际使用与以下步骤存在差异,可参见 [OpenClaw 飞书官网插件](https://bytedance.larkoffice.com/docx/MFK7dDFLFoVlOGxWCv5cTXKmnMh)。 ### 安装飞书插件 1. 执行以下命令安装飞书插件。 ```Bash npx -y @larksuite/openclaw-lark-tools install ``` 如果执行命令时报错,可在命令行前增加`sudo`重新执行。 2. 根据界面提示信息,选择**新建机器人**。 ![Image](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/9af37555c38f4ffb858932eab3ed05c5~tplv-goo7wpa0wc-image.image) 3. 通过飞书客户端扫描二维码,选择**一键创建飞书机器人**。 ![Image](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/71401f60297543279b95f1c764991f99~tplv-goo7wpa0wc-image.image) 4. 在飞书中向机器人发送`/feishu start`,若返回版本号信息,代表安装成功。 5. 在飞书中向机器人发送消息,开始对话。 --- # Hermes Agent Source: https://ark.volcengine.com/region:cn-beijing/docs/agent-plan-personal-hermes-agent 本文介绍如何配置方舟 Agent Plan 到 Hermes Agent 中使用。 # 一、前提条件 * 您已按需订阅 Agent Plan 套餐。如未,请访问 [开通管理-Agent Plan](https://ark.volcengine.com/region:cn-beijing/subscription/agent-plan?agentMode=close) 页面订阅套餐。 - 支持在 macOS、Linux 和 Windows 系统中安装 Hermes Agent # 二、安装 Hermes Agent 根据操作系统执行以下命令安装 Hermes Agent,安装过程中会检测并安装 uv、Python、Node.js、ripgrep、ffmpeg 等依赖,安装完成后重新加载 Shell 或终端。更多安装说明参见 [Hermes Agent 官方文档](https://hermes-agent.nousresearch.com/docs/getting-started/installation)。 **选项:macOS / Linux** 1. 执行以下 cURL 命令安装: ```Bash curl -fsSL https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash ``` 2. 安装完成后重新加载 Shell。 ```Bash source ~/.bashrc # or: source ~/.zshrc ``` **选项:Windows** 1. 在 PowerShell 中执行以下命令安装: ```PowerShell iex (irm https://hermes-agent.nousresearch.com/install.ps1) ``` 2. 安装完成后重新打开 PowerShell 窗口,或执行 `. $PROFILE` 刷新环境变量。 # 三、配置 Hermes Agent ## 方式 1:自动化助手(推荐) ArkCLI Helper 是一个编码工具助手,支持快速配置选择的工具接入 Agent Plan。安装并运行该助手,根据界面提示操作可自动完成工具配置,降低手动配置的时间成本和出错风险。 > **注意** > > * ArkCLI Helper 是基于 Ark Helper 升级演进的工具配置服务,相关能力将持续在 ArkCLI Helper 上迭代更新。建议优先使用 ArkCLI Helper 完成工具配置。 > * ArkCLI Helper 支持 macOS、Linux、Windows 系统。 1. 安装 Ark CLI。 ```Bash # 1. 通过 NPM 安装 npm install -g @volcengine/ark-cli@latest # 2. 验证安装 arkcli --version ``` 2. 登录 Ark CLI。 ```Bash arkcli auth login ``` ![image-20260624-144256-509.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-144256-509.png) 根据界面提示选择登录方式。若之前已登录过 arkcli,会沿用上次选择的配置;如需重新选择,请先执行 `arkcli config reset` 后再运行 `arkcli auth login`。首次登录时,按提示完成以下配置: 1. **选择项目(Project)**:可按需选择,或默认选择**账号全部资源**。 2. **选择消费模式(Type)**:选择 `agent-plan`。 ![image-20260624-145424-871.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-145424-871.png) 3. 运行 ArkCLI Helper,根据界面提示完成 Hermes Agent 的配置。 1. 在命令行界面输入 `arkcli helper` 命令,启动 ArkCLI Helper。 2. **选择要配置的 Plan profile**:`agent-plan_cn-beijing_personal (Agent Plan)`。 ![image-20260624-162749-221.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-162749-221.png) 3. **选择默认 model**:按需选择。 4. **选择要配置的 AI Agent**:`Hermes Agent`。 当前支持的 Harness 包括:豆包搜索、专业数据集、Agent 记忆(OpenViking)、AI Native 应用开发底座,根据界面提示按需选择`配置`或者`跳过`。 ![image-20260624-163403-111.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-163403-111.png) 完成上述操作后,将自动完成 Hermes Agent 的基础配置,并按选择结果自动安装对应的 Harness 工具,无需手动安装。 ## 方式 2:手动配置 Agent Plan 兼容 OpenAI 接口协议,支持 Responses API、Chat API。推荐使用 Responses API 的配置,推理效果更好。 **选项:Responses API** > **注意** > > 使用 Responses API,需要配置 `api_mode: codex_responses`。 执行以下命令配置 Hermes Agent,其中需要将 `` 替换为您自己的 [专属 API Key](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&OpenModelVisible=false&advancedActiveKey=agentPlan),可用的模型参见 [支持模型及 Harness](/docs/agent-plan-personal-plan-overview#3d801f5f)。 ![image-20260908-203322-616.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260908-203322-616.png) ```Bash hermes config set model.provider custom hermes config set model.base_url https://ark.cn-beijing.volces.com/api/plan/v3 hermes config set model.api_key hermes config set model.default ark-code-latest hermes config set model.api_mode codex_responses ``` 配置完成后,配置文件 `~/.hermes/config.yaml` 内容如下。您也可以直接编辑该配置文件。 ```YAML model: default: ark-code-latest provider: custom base_url: https://ark.cn-beijing.volces.com/api/plan/v3 api_key: api_mode: codex_responses ``` **选项:Chat API** > **注意** > > 使用 Chat API,需要配置 `api_mode: chat_completions`。 执行以下命令配置 Hermes Agent,其中需要将 `` 替换为您自己的 [专属 API Key](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&OpenModelVisible=false&advancedActiveKey=agentPlan),可用的模型参见 [支持模型及 Harness](/docs/agent-plan-personal-plan-overview#3d801f5f)。 ![image-20260908-203322-616.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260908-203322-616.png) ```Bash hermes config set model.provider custom hermes config set model.base_url https://ark.cn-beijing.volces.com/api/plan/v3 hermes config set model.api_key hermes config set model.default ark-code-latest hermes config set model.api_mode chat_completions ``` 配置完成后,配置文件 `~/.hermes/config.yaml` 内容如下。您也可以直接编辑该配置文件。 ```YAML model: default: ark-code-latest provider: custom base_url: https://ark.cn-beijing.volces.com/api/plan/v3 api_key: api_mode: chat_completions ``` > **说明** > > * 如需使用 1MB 上下文,直接选择支持 1M 上下文的模型,Hermes Agent 会自动完成调整,无需手动配置。 > * 若模型本身支持 1M 上下文,但 Hermes Agent 未正确识别,可在 `~/.hermes/config.yaml` 中手动添加或修改相应模型的 `context_length` 字段:`context_length: 1048576`。 # 四、启动并使用 Hermes Agent 1. 执行以下命令开启 Hermes Agent。 ```Bash hermes ``` 2. 开始使用 Hermes Agent,支持的 CLI Interface 参见 [官方文档](https://hermes-agent.nousresearch.com/docs/user-guide/cli)。 # 其他操作 ## 添加图片生成/视频生成能力 方舟 Agent Plan Medium 及以上套餐提供图片生成模型配额,Large 及以上套餐提供视频生成模型配额。方舟提供 Skill 帮助 AI 工具快速接入并使用。具体配置方法请参见:[配置视觉模型](/docs/agent-plan-personal-visual-models)。 > **注意** > > * 不同的套餐支持的视觉模型有所不同,具体参见[支持模型及 Harness](/docs/agent-plan-personal-plan-overview#3d801f5f)。 > * 视觉模型不支持通过 Auto 及控制台切换使用。 ## 切换模型 你可以随时根据需求切换**文本生成模型**。 |配置方式 |通过控制台 |修改配置文件 | |---|---|---| |切换模型操作 |1. 参考[三、配置 Hermes Agent](/docs/agent-plan-personal-hermes-agent#14207659)配置模型名称为`ark-code-latest`。 |参考[三、配置 Hermes Agent](/docs/agent-plan-personal-hermes-agent#14207659)配置模型名称为您需要的模型。 | \ | |2. 在 [开通管理页面](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=agentPlan) 选择要使用的模型,切换后3-5分钟即可生效。 | | ## 接入飞书机器人 > **注意** > > 本文档基于 Hermes Agent v0.8.0(2026.4.8)编写,工具迭代演进过程配置步骤可能会有差异,可参考以下内容配置关键信息。 1. 单击 [链接](https://open.larkoffice.com/page/openclaw?form=multiAgent) 快速创建飞书机器人。 2. 在终端执行以下命令配置信息平台。 ```Bash hermes gateway setup ``` * **Select a platform to configure**:选择 `Feishu / Lark` * **How would you like to set up Feishu / Lark**:选择 `Scan QR code to create a new bot automatically (recommended)`,通过飞书客户端扫描二维码后,创建飞书机器人。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/6bf7f9e558ac46a1a6e17c855ae37487~tplv-goo7wpa0wc-image.image) * **How should direct messages be authorized**:选择 `Use DM pairing approval` * **How should group chats be handled**:选择`Respond only when @mentioned in groups` * **Home chat ID**:暂不配置 * 选择 **done** 后, **Install the gateway as a launchd service**:选择 `Y` * **Start the service now**:选择 `Y` 3. 在飞书打开刚创建的飞书机器人,发送任意消息获取配对码。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/c2011e63fa4f4be8af7b0a56c3ea1301~tplv-goo7wpa0wc-image.image) 4. 在终端执行以下命令对飞书进行配置,其中``需替换为获取的配对码。 ```Bash hermes pairing approve feishu ``` ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/016ab535150a4301b82d03cbeb3681db~tplv-goo7wpa0wc-image.image) 5. 在飞书中发送`/sethome`命令将飞书会话设置为主会话,然后即可正常在飞书中使用 Hermes Agent。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/474f623625654ef594c530f2946034f6~tplv-goo7wpa0wc-image.image) --- # TRAE Source: https://ark.volcengine.com/region:cn-beijing/docs/agent-plan-personal-trae 本文介绍如何配置方舟 Agent Plan 到 TraeCode 中使用。 # 一、前提条件 * 您已按需订阅 Agent Plan 套餐。如未,请访问 [开通管理-Agent Plan](https://ark.volcengine.com/region:cn-beijing/subscription/agent-plan?agentMode=close) 页面订阅套餐。 * 您已正确安装 TraeCode,如未,请访问 [TraeCode 官网](https://www.trae.cn/) 下载并安装对应操作系统的版本。 # 二、配置 TraeCode > **说明** > > 请先将 TraeCode IDE 升级至 3.3.57 及以上版本,再进行 Agent Plan 配置。 1. 根据个人用户入口登录后,进入设置中心添加模型。 1. 选择**个人用户**入口登录后,点击界面右上角的 **设置** 图标,进入设置中心。 2. 在左侧导航栏中,选择 **模型**,在模型管理页面进行配置。 3. 点击 **+ 添加模型** 按钮,界面上显示 **添加模型** 窗口。 2. 在**添加模型**窗口中,配置模型信息。 1. 选择服务商:**火山引擎** 2. 配置方式:**Agent Plan** 3. 选择模型。 * 直接从列表中选择提供的模型。 * 若希望使用 Agent Plan 支持的其他模型,单击**使用其他模型**,**模型 ID** 需使用**文本生成模型**的名称,详细模型名称参见 [支持模型及 Harness](/docs/agent-plan-personal-plan-overview#3d801f5f)。 4. 填写 API 密钥:[获取专属 API Key](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=agentPlan) ![image-20260908-203322-616.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260908-203322-616.png) 5. 单击**添加模型**,完成模型的配置。 # 三、使用 TraeCode 在 AI 对话输入框的右下角,单击当前模型名称,在模型列表中,选择配置的模型。 选定模型后,即可使用 TraeCode 进行开发任务了。 # 其他操作 ## 添加图片生成/视频生成能力 方舟 Agent Plan Medium 及以上套餐提供图片生成模型配额,Large 及以上套餐提供视频生成模型配额。方舟提供 Skill 帮助 AI 工具快速接入并使用。具体配置方法请参见:[配置视觉模型](/docs/agent-plan-personal-visual-models)。 > **注意** > > * 不同的套餐支持的视觉模型有所不同,具体参见[支持模型及 Harness](/docs/agent-plan-personal-plan-overview#3d801f5f)。 > * 视觉模型不支持通过 Auto 及控制台切换使用。 ## 切换模型 你可以随时根据需求切换**文本生成模型**。 |配置方式 |通过控制台 |通过TraeCode | |---|---|---| |切换模型操作 |1. 参考[二、配置 TraeCode](/docs/agent-plan-personal-trae#3ef00eb4),配置模型名称为`ark-code-latest`。 |1. 参考[二、配置 TraeCode](/docs/agent-plan-personal-trae#3ef00eb4),添加模型信息。 | \ | |2. 在 [开通管理页面](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=agentPlan) 选择要使用的模型,切换后3-5分钟即可生效。 |2. 在 AI 对话输入框的右下角,单击当前模型名称,在模型列表中,选择配置的模型。 | --- # WorkBuddy Source: https://ark.volcengine.com/region:cn-beijing/docs/agent-plan-personal-workbuddy WorkBuddy 是腾讯云推出的桌面 AI 智能体客户端,适配 QQ / 企微生态。本文介绍如何在 WorkBuddy 中接入方舟 Agent Plan 使用。 # 一、前提条件 * 您已按需订阅 Agent Plan 套餐。如未,请访问 [开通管理-Agent Plan](https://ark.volcengine.com/region:cn-beijing/subscription/agent-plan?agentMode=close) 页面订阅套餐。 - 访问 [WorkBuddy 官网](https://www.workbuddy.ai/),下载并安装适合您操作系统的版本。安装完成后按提示登录。 # 二、配置 WorkBuddy ## 方式 1:自动化助手(推荐) ArkCLI Helper 是一个编码工具助手,支持快速配置选择的工具接入 Agent Plan。安装并运行该助手,根据界面提示操作可自动完成工具配置,降低手动配置的时间成本和出错风险。 > **注意** > > * ArkCLI Helper 是基于 Ark Helper 升级演进的工具配置服务,相关能力将持续在 ArkCLI Helper 上迭代更新。建议优先使用 ArkCLI Helper 完成工具配置。 > * ArkCLI Helper 支持 macOS、Linux、Windows 系统。 1. 安装 Ark CLI。 ```Bash # 1. 通过 NPM 安装 npm install -g @volcengine/ark-cli@latest # 2. 验证安装 arkcli --version ``` 2. 登录 Ark CLI。 ```Bash arkcli auth login ``` ![image-20260624-144256-509.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-144256-509.png) 根据界面提示选择登录方式。若之前已登录过 arkcli,会沿用上次选择的配置;如需重新选择,请先执行 `arkcli config reset` 后再运行 `arkcli auth login`。首次登录时,按提示完成以下配置: 1. **选择项目(Project)**:可按需选择,或默认选择**账号全部资源**。 2. **选择消费模式(Type)**:选择 `agent-plan`。 ![image-20260624-145424-871.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-145424-871.png) 其中: * ``:运行 ArkCLI Helper 时填写的 Agent Plan 专属 API Key。 3. 运行 ArkCLI Helper,根据界面提示完成 WorkBuddy 的配置。 1. 在命令行界面输入 `arkcli helper` 命令,启动 ArkCLI Helper。 运行过程中会提示填写 Agent Plan 专属 API Key;如需在本地环境变量中管理,可使用 `ARK_API_KEY` 作为变量名。 2. **选择要配置的 Plan profile**:`agent-plan_cn-beijing_personal (Agent Plan)`。 ![image-20260624-162749-221.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-162749-221.png) 3. **选择默认 model**:按需选择。 4. **选择要配置的 AI Agent**:`WorkBuddy`。 当前支持的 Harness 包括:豆包搜索、专业数据集、Agent 记忆(OpenViking)、AI Native 应用开发底座,根据界面提示按需选择`配置`或者`跳过`。 ![](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/workbuddy-arkcli.png) 完成上述操作后,将自动完成 WorkBuddy 的基础配置,并按选择结果自动安装对应的 Harness 工具,无需手动安装。 ## 方式 2:手动配置 1. 启动 WorkBuddy,单击左下角账户头像,选择 **设置**。 ![](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/workbuddy-login.png) 2. 在左侧导航中选择 **模型**,在自定义模型区域单击 **添加模型**。 ![workbuddy-setting.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/workbuddy-setting.png) 3. 在提供商中选择 **自定义 / Custom**,填写以下字段并保存: * **接口地址**:`https://ark.cn-beijing.volces.com/api/plan/v3` * **API Key**:请在 [Agent Plan 页面](https://ark.volcengine.com/region:cn-beijing/subscription/agent-plan) 使用 **Agent Plan 专属 API Key**。 ![image-20260908-203322-616.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260908-203322-616.png) * **模型名称**:填写所选套餐支持的 Model Name,模型信息见 [支持模型及 Harness](/docs/agent-plan-personal-plan-overview#3d801f5f),需配置文本生成模型。 * **高级工具**:非必填,按需勾选。建议开启 **工具调用**、**图片输入**、**思考模式**。 * **自定义协议**:当模型服务使用非标准 URL 路径(如经过网关或代理层封装)时,可在高级配置中开启自定义协议开关。开启后 Tencent WorkBuddy 将直接按填写的 URL 发起请求,跳过路径校验与自动补全。关闭(默认):使用标准 `/chat/completions` 路径,自动校验并补全接口地址。开启:直接使用用户填写的接口地址发起请求,跳过路径校验与自动补全逻辑。 ![workbuddy-add-model.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/workbuddy-add-model.png) 除了在客户端 UI 中添加自定义模型,也可以直接编辑本地配置文件 `~/.workbuddy/models.json` 来接入 Agent,保存后,WorkBuddy 会自动监听并热加载新配置(**无需重启**)。返回主界面的模型下拉列表中显示的即为 `name` 字段。 `~/.workbuddy/models.json` 示例 ```JSON [ { "id": "doubao-seed-evolving", "name": "Doubao Seed Evolving", "vendor": "Custom", "url": "https://ark.cn-beijing.volces.com/api/plan/v3", "apiKey": "", "supportsToolCall": true, "supportsImages": false, "supportsReasoning": false, "useCustomProtocol": false } ] ``` 4. 保存后返回 WorkBuddy 主界面。 # 三、使用 WorkBuddy 1. 在主界面顶部的模型下拉中,选中刚添加的模型。 2. 在输入框用一句话描述你的任务(如生成周报、数据分析、整理文件、代码生成 / 重构 / 修 Bug),回车即可启动,WorkBuddy 会自主规划执行并产出文档、表格、代码文件等结果,在右侧结果区可查看生成内容与文件变更。 > 更多使用技巧和场景参见 [WorkBuddy 官方文档](https://www.workbuddy.ai/docs/zh/workbuddy/Quickstart)。 --- # ZCode Source: https://ark.volcengine.com/region:cn-beijing/docs/agent-plan-personal-zcode ZCode 是智谱推出的桌面 AI 编程客户端(macOS / Windows / Linux),深度集成 GLM 系列模型,同时兼容自定义 OpenAI / Anthropic 协议供应商。本文介绍如何在 ZCode 中接入方舟 Agent Plan。 # 一、前提条件 * 您已按需订阅 Agent Plan 套餐。如未,请访问 [开通管理-Agent Plan](https://ark.volcengine.com/region:cn-beijing/subscription/agent-plan?agentMode=close) 页面订阅套餐。 - 访问 [ZCode 官网](https://zcode.z.ai/cn#all-downloads),下载并安装适合您操作系统的版本。安装步骤可参考 [ZCode 官方安装教程](https://zcode.net.cn/en/docs/install#setup-guide),安装完成后按提示登录。 # 二、配置 ZCode Agent Plan 同时兼容 OpenAI 与 Anthropic 接口协议,ZCode 均支持。 ## 方式 1:自动化助手(推荐) ArkCLI Helper 是一个编码工具助手,支持快速配置选择的工具接入 Agent Plan。安装并运行该助手,根据界面提示操作可自动完成工具配置,降低手动配置的时间成本和出错风险。 > **注意** > > * ArkCLI Helper 是基于 Ark Helper 升级演进的工具配置服务,相关能力将持续在 ArkCLI Helper 上迭代更新。建议优先使用 ArkCLI Helper 完成工具配置。 > * ArkCLI Helper 支持 macOS、Linux、Windows 系统。 1. 安装 Ark CLI。 ```Bash # 1. 通过 NPM 安装 npm install -g @volcengine/ark-cli@latest # 2. 验证安装 arkcli --version ``` 2. 登录 Ark CLI。 ```Bash arkcli auth login ``` ![image-20260624-144256-509.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-144256-509.png) 根据界面提示选择登录方式。若之前已登录过 arkcli,会沿用上次选择的配置;如需重新选择,请先执行 `arkcli config reset` 后再运行 `arkcli auth login`。首次登录时,按提示完成以下配置: 1. **选择项目(Project)**:可按需选择,或默认选择**账号全部资源**。 2. **选择消费模式(Type)**:选择 `agent-plan`。 ![image-20260624-145424-871.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-145424-871.png) 其中: * ``:运行 ArkCLI Helper 时填写的 Agent Plan 专属 API Key。 3. 运行 ArkCLI Helper,根据界面提示完成 ZCode 的配置。 1. 在命令行界面输入 `arkcli helper` 命令,启动 ArkCLI Helper。 运行过程中会提示填写 Agent Plan 专属 API Key;如需在本地环境变量中管理,可使用 `ARK_API_KEY` 作为变量名。 2. **选择要配置的 Plan profile**:`agent-plan_cn-beijing_personal (Agent Plan)`。 ![image-20260624-162749-221.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-162749-221.png) 3. **选择默认 model**:按需选择。 4. **选择要配置的 AI Agent**:`ZCode`。 当前支持的 Harness 包括:豆包搜索、专业数据集、Agent 记忆(OpenViking)、AI Native 应用开发底座,根据界面提示按需选择`配置`或者`跳过`。 ![](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/zcode-arkcli.png) 完成上述操作后,将自动完成 ZCode 的基础配置,并按选择结果自动安装对应的 Harness 工具,无需手动安装。 ## 方式 2:手动配置 1. 打开 ZCode 客户端,单击左下角 **设置** 图标,进入 **模型设置**,单击 **添加供应商**。 ![zcode-setting.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/zcode-setting.png) 2. 在弹出的表单中填写以下字段,保存供应商。 * **名称**:自定义,便于识别,例如 `Ark Agent Plan`。 * **Base URL**:`https://ark.cn-beijing.volces.com/api/plan/v3`(OpenAI 协议);若使用 Anthropic 协议,填 `https://ark.cn-beijing.volces.com/api/plan`。 * **API Key**:填写 Agent Plan [专属 API Key](https://ark.volcengine.com/region:cn-beijing/subscription/agent-plan?agentMode=close)。请勿混用方舟平台的普通 API Key。 ![image-20260908-203322-616.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260908-203322-616.png) * **API 格式**:取决于选择的 Base URL。 |API 格式 |Base URL | |---|---| |Anthropic Messages |`https://ark.cn-beijing.volces.com/api/plan` | |Chat Completions |`https://ark.cn-beijing.volces.com/api/plan/v3` | |Responses |`https://ark.cn-beijing.volces.com/api/plan/v3` | ![zcode-setting2.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/zcode-setting2.png) 3. 单击 **添加模型**,在表单中填写以下字段,保存模型。可以多次点击 **添加模型**,为一个供应商添加多个模型。 * **模型 ID**:填入所选套餐支持的 Model Name,详见 [支持模型及 Harness](/docs/agent-plan-personal-plan-overview#3d801f5f),需配置文本生成模型。 * **上下文窗口**:按所选模型的最大上下文长度填写,取值参见 [支持模型及 Harness](/docs/agent-plan-personal-plan-overview#3d801f5f)。 * **最大输出 Token**(可选):按需填写,默认可留空跟随模型上限。 除了在客户端 UI 中添加供应商,也可以直接编辑本地配置文件 `~/.zcode/v2/config.json`(Windows 系统为 `%USERPROFILE%\.zcode\v2\config.json`)。首次通过 UI 完成任意配置后该文件会自动生成,已有内容时在 `provider` 对象中追加一条即可。 API 格式为**Anthropic Messages**时,`~/.zcode/v2/config.json` 示例 ```JSON { "provider": { ... "ark-agent-plan": { "name": "Ark Agent Plan", "kind": "anthropic", "options": { "apiKey": "", "baseURL": "https://ark.cn-beijing.volces.com/api/plan", "apiKeyRequired": true }, "enabled": true, "source": "custom", "models": { "ark-code-latest": { "limit": { "context": 256000, "output": 32768 }, "modalities": { "input": ["text", "image"], "output": ["text"] } }, "doubao-seed-evolving": { "limit": { "context": 1024000, "output": 262144 }, "modalities": { "input": ["text", "image"], "output": ["text"] } }, "doubao-seed-2.1-pro": { "limit": { "context": 1024000, "output": 256000 }, "modalities": { "input": ["text", "image"], "output": ["text"] } }, "doubao-seed-2.1-lite": { "limit": { "context": 1024000, "output": 256000 }, "modalities": { "input": ["text", "image"], "output": ["text"] } }, "doubao-seed-2.0-mini": { "limit": { "context": 256000, "output": 128000 }, "modalities": { "input": ["text", "image"], "output": ["text"] } }, "deepseek-v4.1-flash": { "limit": { "context": 1024000, "output": 393216 }, "modalities": { "input": ["text", "image"], "output": ["text"] } }, "deepseek-v4.1-flash-economy": { "limit": { "context": 1049000, "output": 393216 }, "modalities": { "input": ["text", "image"], "output": ["text"] } }, "deepseek-v4-flash": { "limit": { "context": 1024000, "output": 393216 }, "modalities": { "input": ["text"], "output": ["text"] } }, "deepseek-v4-pro": { "limit": { "context": 1024000, "output": 393216 }, "modalities": { "input": ["text"], "output": ["text"] } }, "glm-5.3": { "limit": { "context": 1024000, "output": 131072 }, "modalities": { "input": ["text"], "output": ["text"] } }, "glm-5.3-flash": { "limit": { "context": 1024000, "output": 131072 }, "modalities": { "input": ["text", "image"], "output": ["text"] } }, "glm-latest": { "limit": { "context": 1024000, "output": 131072 }, "modalities": { "input": ["text"], "output": ["text"] } }, "kimi-k3": { "limit": { "context": 1024000, "output": 131072 }, "modalities": { "input": ["text", "image"], "output": ["text"] } }, "kimi-k2.8-preview": { "limit": { "context": 1024000, "output": 1024000 }, "modalities": { "input": ["text", "image"], "output": ["text"] } } } } ... } } ``` API 格式为**Chat Completions**时,`~/.zcode/v2/config.json` 示例 ```JSON { "provider": { ... "ark-agent-plan": { "name": "Ark Agent Plan", "kind": "openai-compatible", "options": { "apiKey": "", "baseURL": "https://ark.cn-beijing.volces.com/api/plan/v3", "apiKeyRequired": true }, "enabled": true, "source": "custom", "models": { "ark-code-latest": { "limit": { "context": 256000, "output": 32768 }, "modalities": { "input": ["text", "image"], "output": ["text"] } }, "doubao-seed-evolving": { "limit": { "context": 1024000, "output": 262144 }, "modalities": { "input": ["text", "image"], "output": ["text"] } }, "doubao-seed-2.1-pro": { "limit": { "context": 1024000, "output": 256000 }, "modalities": { "input": ["text", "image"], "output": ["text"] } }, "doubao-seed-2.1-lite": { "limit": { "context": 1024000, "output": 256000 }, "modalities": { "input": ["text", "image"], "output": ["text"] } }, "doubao-seed-2.0-mini": { "limit": { "context": 256000, "output": 128000 }, "modalities": { "input": ["text", "image"], "output": ["text"] } }, "deepseek-v4.1-flash": { "limit": { "context": 1024000, "output": 393216 }, "modalities": { "input": ["text", "image"], "output": ["text"] } }, "deepseek-v4.1-flash-economy": { "limit": { "context": 1049000, "output": 393216 }, "modalities": { "input": ["text", "image"], "output": ["text"] } }, "deepseek-v4-flash": { "limit": { "context": 1024000, "output": 393216 }, "modalities": { "input": ["text"], "output": ["text"] } }, "deepseek-v4-pro": { "limit": { "context": 1024000, "output": 393216 }, "modalities": { "input": ["text"], "output": ["text"] } }, "glm-5.3": { "limit": { "context": 1024000, "output": 131072 }, "modalities": { "input": ["text"], "output": ["text"] } }, "glm-5.3-flash": { "limit": { "context": 1024000, "output": 131072 }, "modalities": { "input": ["text", "image"], "output": ["text"] } }, "glm-latest": { "limit": { "context": 1024000, "output": 131072 }, "modalities": { "input": ["text"], "output": ["text"] } }, "kimi-k3": { "limit": { "context": 1024000, "output": 131072 }, "modalities": { "input": ["text", "image"], "output": ["text"] } }, "kimi-k2.8-preview": { "limit": { "context": 1024000, "output": 1024000 }, "modalities": { "input": ["text", "image"], "output": ["text"] } } } } ... } } ``` API 格式为**Responses**时,`~/.zcode/v2/config.json` 示例 ```JSON { "provider": { ... "ark-agent-plan": { "name": "Ark Agent Plan", "kind": "openai", "options": { "apiKey": "", "baseURL": "https://ark.cn-beijing.volces.com/api/plan/v3", "apiKeyRequired": true }, "enabled": true, "source": "custom", "models": { "ark-code-latest": { "limit": { "context": 256000, "output": 32768 }, "modalities": { "input": ["text", "image"], "output": ["text"] } }, "doubao-seed-evolving": { "limit": { "context": 1024000, "output": 262144 }, "modalities": { "input": ["text", "image"], "output": ["text"] } }, "doubao-seed-2.1-pro": { "limit": { "context": 1024000, "output": 256000 }, "modalities": { "input": ["text", "image"], "output": ["text"] } }, "doubao-seed-2.1-lite": { "limit": { "context": 1024000, "output": 256000 }, "modalities": { "input": ["text", "image"], "output": ["text"] } }, "doubao-seed-2.0-mini": { "limit": { "context": 256000, "output": 128000 }, "modalities": { "input": ["text", "image"], "output": ["text"] } }, "deepseek-v4.1-flash": { "limit": { "context": 1024000, "output": 393216 }, "modalities": { "input": ["text", "image"], "output": ["text"] } }, "deepseek-v4.1-flash-economy": { "limit": { "context": 1049000, "output": 393216 }, "modalities": { "input": ["text", "image"], "output": ["text"] } }, "deepseek-v4-flash": { "limit": { "context": 1024000, "output": 393216 }, "modalities": { "input": ["text"], "output": ["text"] } }, "deepseek-v4-pro": { "limit": { "context": 1024000, "output": 393216 }, "modalities": { "input": ["text"], "output": ["text"] } }, "glm-5.3": { "limit": { "context": 1024000, "output": 131072 }, "modalities": { "input": ["text"], "output": ["text"] } }, "glm-5.3-flash": { "limit": { "context": 1024000, "output": 131072 }, "modalities": { "input": ["text", "image"], "output": ["text"] } }, "glm-latest": { "limit": { "context": 1024000, "output": 131072 }, "modalities": { "input": ["text"], "output": ["text"] } }, "kimi-k3": { "limit": { "context": 1024000, "output": 131072 }, "modalities": { "input": ["text", "image"], "output": ["text"] } }, "kimi-k2.8-preview": { "limit": { "context": 1024000, "output": 1024000 }, "modalities": { "input": ["text", "image"], "output": ["text"] } } } } ... } } ``` > **注意** > > * `` 替换为您的 Agent Plan [专属 API Key](https://ark.volcengine.com/region:cn-beijing/subscription/agent-plan?agentMode=close),请勿混用方舟平台的普通 API Key。 > * 上述示例列出的是 Agent Plan 目前在售的文本生成模型全集。不同套餐(Small / Medium / Large / Max)支持的模型不同,请以 [支持模型及 Harness](/docs/agent-plan-personal-plan-overview#3d801f5f) 中的支持矩阵为准,删除您所选套餐不支持的条目,避免调用时收到 model not found 错误。 ![zcode-setting-ready.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/zcode-setting-ready.png) 4. 保存完成后,回到 ZCode 主界面。 ![zcode-start-to-work.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/zcode-start-to-work.png) # 三、使用 ZCode 1. 在 ZCode 主界面顶部的模型下拉中,选中刚添加的模型。 2. 在对话框输入你的需求(如生成代码、修复 bug、重构、写单元测试),回车即可开始对话开发。ZCode 支持规划、编码、评审与上线等全流程研发场景。 > 更多使用技巧和高级功能参见 [ZCode 官方文档](https://zcode.net.cn/en/docs)。 --- # DeepSeek Harness Source: https://ark.volcengine.com/region:cn-beijing/docs/agent-plan-personal-deepseek-harness DeepSeek Harness 是 DeepSeek AI 开发的一套用来构建、运行和扩展智能体的应用框架,采用**一切皆插件**的架构。本文介绍如何配置方舟 Agent Plan 到 DeepSeek Harness 中使用。 > **注意** > > DeepSeek Harness 目前处于**开发者预览**阶段,正在快速迭代,后续可能会出现破坏兼容性的变更。 # 一、前提条件 * 您已按需订阅 Agent Plan 套餐。如未,请访问 [开通管理-Agent Plan](https://ark.volcengine.com/region:cn-beijing/subscription/agent-plan?agentMode=close) 页面订阅套餐。 * 您已安装 Node.js(建议使用 LTS 版本)。 # 二、配置 DeepSeek Harness 您可以按下面任一方式在 DeepSeek Harness 中接入方舟 Agent Plan。**自动化助手** 通过 ArkCLI Helper 引导完成工具配置;**通过 Web UI 手动配置** 通过 DeepSeek Harness Web UI 逐项填写;**通过 Ark 插件配置** 借助方舟官方插件自动完成 provider 添加,只需填入 API Key。 ## 方式 1:自动化助手(推荐) ArkCLI Helper 是一个编码工具助手,支持快速配置选择的工具接入 Agent Plan。安装并运行该助手,根据界面提示操作可自动完成工具配置,降低手动配置的时间成本和出错风险。 > **注意** > > * ArkCLI Helper 是基于 Ark Helper 升级演进的工具配置服务,相关能力将持续在 ArkCLI Helper 上迭代更新。建议优先使用 ArkCLI Helper 完成工具配置。 > * ArkCLI Helper 支持 macOS、Linux、Windows 系统。 1. 安装 Ark CLI。 ```Bash # 1. 通过 NPM 安装 npm install -g @volcengine/ark-cli@latest # 2. 验证安装 arkcli --version ``` 2. 登录 Ark CLI。 ```Bash arkcli auth login ``` ![image-20260624-144256-509.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-144256-509.png) 根据界面提示选择登录方式。若之前已登录过 arkcli,会沿用上次选择的配置;如需重新选择,请先执行 `arkcli config reset` 后再运行 `arkcli auth login`。首次登录时,按提示完成以下配置: 1. **选择项目(Project)**:可按需选择,或默认选择**账号全部资源**。 2. **选择消费模式(Type)**:选择 `agent-plan`。 ![image-20260624-145424-871.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-145424-871.png) 其中: * ``:运行 ArkCLI Helper 时填写的 Agent Plan 专属 API Key。 3. 运行 ArkCLI Helper,根据界面提示完成 DeepSeek Harness 的配置。 1. 在命令行界面输入 `arkcli helper` 命令,启动 ArkCLI Helper。 运行过程中会提示填写 Agent Plan 专属 API Key;如需在本地环境变量中管理,可使用 `ARK_API_KEY` 作为变量名。 2. **选择要配置的 Plan profile**:`agent-plan_cn-beijing_personal (Agent Plan)`。 ![image-20260624-162749-221.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-162749-221.png) 3. **选择默认 model**:按需选择。 4. **选择要配置的 AI Agent**:`DeepSeek Harness`。 当前支持的 Harness 包括:豆包搜索、专业数据集、Agent 记忆(OpenViking)、AI Native 应用开发底座,根据界面提示按需选择`配置`或者`跳过`。 ![](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/dsh-arkcli.png) 完成上述操作后,将自动完成 DeepSeek Harness 的基础配置,并按选择结果自动安装对应的 Harness 工具,无需手动安装。 ## 方式 2:通过 Web UI 手动配置 1. 启动 DeepSeek Harness。 1. 在终端执行以下命令启动 DeepSeek Harness 的 Web UI。 ```bash npx @deepseek-ai/dsh web ``` 2. 在浏览器打开命令输出的访问地址。默认地址为 `http://127.0.0.1:3080/`。 2. 在 DeepSeek Harness Web UI 中,单击左下角**设置**。 ![image-20260814-001513-207.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260814-001513-207.png) 3. 在左侧导航栏单击**模型**,根据界面信息进行配置。 - 方式一:配置 DeepSeek 卡片 在 DeepSeek 卡片,选择**自定义设置**,按下面信息填写并保存。 - **API 密钥**:填写 Agent Plan [专属 API Key](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&OpenModelVisible=false&advancedActiveKey=agentPlan)。 ![image-20260908-203322-616.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260908-203322-616.png) - **API 地址**:`https://ark.cn-beijing.volces.com/api/plan/v3` - **添加模型**:按需添加套餐支持的**文本生成模型**,模型列表参见 [支持模型及 Harness](/docs/agent-plan-personal-plan-overview#3d801f5f)。 ![image-20260814-001035-757.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260814-001035-757.png) - 方式二:添加自定义提供方 单击**添加自定义提供方**,按下面信息填写完成提供方的创建。 - **Provider ID**:自定义设置,后续如需重命名则需要添加新的提供方,并删除旧的提供方。 - **显式名称**:自定义设置。 - **API 地址**、**API 协议**:支持的 API 地址、API 协议及对应关系如下,不要配置错误。 |API 协议 | API 地址 | |---|---| |openai-completions |`https://ark.cn-beijing.volces.com/api/plan/v3` | |openai-responses |`https://ark.cn-beijing.volces.com/api/plan/v3` | |anthropic-messages |`https://ark.cn-beijing.volces.com/api/plan` | - **API 密钥**:填写 Agent Plan [专属 API Key](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&OpenModelVisible=false&advancedActiveKey=agentPlan)。 - **添加模型**:按需添加套餐支持的**文本生成模型**,模型列表参见 [支持模型及 Harness](/docs/agent-plan-personal-plan-overview#3d801f5f)。 4. (可选) 如果需要给模型配置支持图片输入,则需要在配置文件中进行配置。 1. 在模型配置页面,单击**打开配置文件**,路径`$DSH_HOME/settings.yaml`。 2. 在支持的模型配置部分加上 `input: [text, image]`,配置示例如下。 ```Yaml llm-pi-ai: providers: ark-plan: displayName: ark-plan apiKeyEnv: ARK_PLAN_API_KEY api: openai-responses baseURL: https://ark.cn-beijing.volces.com/api/plan/v3 models: - id: doubao-seed-2.1-pro name: doubao-seed-2.1-pro input: [text, image] ``` ## 方式 3:通过 Ark 插件配置 方舟提供以下官方 Ark Plan 和后付费模型插件,自动为 DeepSeek Harness 配置方舟 Agent Plan、Harness(专业数据集、豆包搜索、Agent 记忆等)与后付费模型 provider,安装后可以自动完成 DeepSeek Harness 与方舟服务的对接,免去手动填写 API 地址、API Key 等步骤: 1. 启动 DeepSeek Harness。 1. 在终端执行以下命令启动 DeepSeek Harness 的 Web UI。 ```bash npx @deepseek-ai/dsh web ``` 2. 在浏览器打开命令输出的访问地址。默认地址为 `http://127.0.0.1:3080/`。 2. 在对话框中输入以下 Prompt,让 Agent 帮你完成安装`ark-plan-api` 插件。 ```bash 帮我安装下面的插件:curl -fsSL -o dsh-ark-plugin-install.sh "https://lf3-static.bytednsdoc.com/obj/eden-cn/ylwslo-yrh/ljhwZthlaukjlkulzlp/ark-cli-outer-resource/dsh-ark-plugin-install.sh" && bash dsh-ark-plugin-install.sh --plugin-name ark-plan-api ``` ![deepseek-harness-install1.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/deepseek-harness-install1.png) 3. `ark-plan-api` 插件安装后会在 **设置 > 模型** 页面自动添加 Agent Plan、Coding Plan 以及后付费的模型 provider,用户可输入自己的 Agent Plan [专属 API Key](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&OpenModelVisible=false&advancedActiveKey=agentPlan)。回到对话页,在输入框右下角的模型下拉菜单中选择 **Ark Agent Plan** 下的模型即可开始使用。 ![ark-plan-plugin1.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/ark-plan-plugin1.png) 4. (可选) 安装插件市场,方便后续查看和管理已装插件。 ```bash 帮我安装下面插件:dsh plugin --profile web add dshmarket ``` 安装完成后,**设置** 侧边栏会新增 **插件市场** 页。 ![plugin-market.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/plugin-market.png) # 三、使用 DeepSeek Harness 1. 在页面中点击 **选择工作区**,添加你启动 `dsh` 时所在的项目目录。选中工作区后,会话输入框才可用。 2. 在输入框右下角的模型下拉菜单中选择 **Ark Agent Plan** 下的模型即可开始使用。可用模型列表参见 [支持模型及 Harness](/docs/agent-plan-personal-plan-overview#3d801f5f)。 ![ark-plan-plugin2.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/ark-plan-plugin2.png) 3. 在输入框输入需求即可开始使用 DeepSeek Harness。 Agent 可以读取和编辑工作区文件、运行命令、委派工作并维护计划。当操作在当前权限策略下需要审批时,Web UI 会先询问你。 --- # OpenAI4S Source: https://ark.volcengine.com/region:cn-beijing/docs/agent-plan-personal-openai4s OpenAI4S(Open AI for Scientist)是由北京大学-元空 AI 联合实验室推出、对标 Claude Science 的开源科学研究 Agent,专为复杂、长时间运行的科学探索任务设计。与传统对话大模型不同,OpenAI4S 将大模型与持久化 Python / R 科学计算内核结合:Agent 不仅能够自主规划任务、检索信息,还可以直接编写并运行代码,调用 AlphaFold2、scGPT、ESM-2 等多种前沿科研 Skills,以及 UniProt、RCSB PDB、PubChem、arXiv、OpenAlex 等科学数据源完成实际计算与分析。从文献研究、单细胞分析、分子结构预测,到大规模数据处理与可视化,OpenAI4S 能够在持续保留计算状态的环境中执行多步骤科研任务,并生成可追溯的分析结果与产物。OpenAI4S 可用于文献研究、科研数据分析、科学计算与建模、专业领域分析及科研可视化等场景。 方舟 Agent Plan 支持在 OpenAI4S 中使用,可参考本文进行配置及使用。 > **注意** > > OpenAI4S 工具处于快速迭代阶段,本文使用的版本为 0.2.0,如实际使用与以下步骤存在差异,可参见 [OpenAI4S GitHub](https://github.com/PKU-YuanGroup/OpenAI4S)。 # 一、前提条件 * 您已按需订阅 Agent Plan 套餐。如未,请访问 [开通管理-Agent Plan](https://ark.volcengine.com/region:cn-beijing/subscription/agent-plan?agentMode=close) 页面订阅套餐。 # 二、安装 OpenAI4S OpenAI4S 支持通过 安装包或 PyPI 安装,不同安装方式的环境要求不同,请根据设备类型选择对应方式。 ## 方式一:安装包安装 **选项:macOS** > **说明** > > * 适用于搭载 Apple Silicon 芯片(M1/M2/M3/M4 等)的 Mac,推荐使用该方式。 > * 安装包已内置 Python 及默认科学计算环境,无需额外安装 Python 或其他开发工具。 1. 从 [最新 Release](https://github.com/PKU-YuanGroup/OpenAI4S/releases/latest) 下载 `OpenAI4S--macos-arm64.dmg`。`` 为 OpenAI4S 版本号,如本教程使用 `0.2.0` 版本。 > **注意** > > `.dmg` 安装包仅支持 Apple Silicon 架构。 2. 安装 `.dmg` 后,在首次启动前,在终端执行以下命令。 ```Bash xattr -dr com.apple.quarantine /Applications/OpenAI4S.app ``` 3. 点击 OpenAI4S 应用图标启动。若未正常启动,可手动访问 `http://127.0.0.1:8760/`。 **选项:Linux** > **说明** > > * 适用于 Linux x86_64 设备,推荐使用该方式。 > * 安装包已内置 Python 及默认科学计算环境,无需额外安装 Python 或其他开发工具。 1. 从 [最新 Release](https://github.com/PKU-YuanGroup/OpenAI4S/releases/latest) 下载 `OpenAI4S--linux-x86_64.tar.gz`。`` 为 OpenAI4S 版本号,如本教程使用 `0.2.0` 版本。 > **注意** > > `.tar.gz` 安装包仅支持 Linux x86_64 架构。 2. 解压安装包。 ```Bash tar -xzf OpenAI4S--linux-x86_64.tar.gz # 将 替换为实际 OpenAI4S 版本号,例如本教程使用 0.2.0,则执行: # tar -xzf OpenAI4S-0.2.0-linux-x86_64.tar.gz ``` 3. 进入解压后的目录并启动 OpenAI4S。若未正常启动,可手动访问 `http://127.0.0.1:8760/`。 ```Bash ./OpenAI4S ``` ## 方式二:PyPI 安装 > **说明** > > * 适用于 Intel Mac、Linux,或希望通过 Python 环境安装 OpenAI4S 的用户。 > * 环境要求:需要 Python 3.10 或更高版本。 1. 在终端中执行以下命令安装。 ```Bash pip install openai4s ``` 2. 安装完成后启动 OpenAI4S。若未正常启动,可手动访问 `http://127.0.0.1:8760/`。 ```Bash openai4s serve ``` # 三、配置 OpenAI4S ## 配置 Agent Plan 1. 进入 OpenAI4S,点击设置图标,进入 **设置** - **通用** - **模型与 API Key**。 ![1.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/openai4s-step-1.png) ![2.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/openai4s-step-2.png) 2. 点击 **配置**,按以下信息填写: * **名称**:自定义配置名称,如 `方舟 AgentPlan`。 * **兼容协议**:选择 `ark 兼容协议`。 * **Base URL**:`https://ark.cn-beijing.volces.com/api/plan/v3` * **模型 id**:替换为实际模型 ID,模型信息见 [支持模型及 Harness](/docs/agent-plan-personal-plan-overview#3d801f5f),需配置文本生成模型。 * **API Key**:[获取专属 API Key](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=agentPlan)。 ![image-20260908-203322-616.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260908-203322-616.png) 3. 保存该配置后,选择需要的配置,点击 **设为当前**,完成配置。 ![3.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/openai4s-step-3.png) ## 配置豆包搜索(可选) OpenAI4S 支持通过豆包搜索获取实时网页、文献及数据库信息。使用方舟 Agent Plan 时,可直接通过 Agent Plan 专属 API Key 完成联网搜索授权。 1. 进入 OpenAI4S,点击 **设置** - **网络**。 2. 开启 **允许联网** 开关。 3. 在 **豆包搜索 Custom 版** 卡片中配置 Agent Plan 专属 API Key。 * 若当前使用的 Ark 模型已配置相同的 Agent Plan Key,OpenAI4S 会自动复用该 Key,无需重复填写。 * 若未自动获取,可手动粘贴 Agent Plan [专属 API Key](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=agentPlan),并点击 **保存凭证**。 > **说明** > > 保存后的 API Key 不会在 OpenAI4S 界面中回显。 4. 真实调用豆包搜索,成功返回搜索结果后,即表示联网搜索配置完成。 ![5.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/openai4s-step-5.png) ## 配置专业数据集 DataPro(可选) OpenAI4S 支持通过 Agent Plan 的专业数据集 Harness 获取专业科研数据。使用方舟 Agent Plan 时,可直接通过 Agent Plan 专属 API Key 完成专业数据集授权。 1. 进入 OpenAI4S,点击 **设置** - **连接器**。 2. 在 **火山方舟专业数据集 DataPro** 卡片中配置 Agent Plan 专属 API Key。 * 若当前使用的 Ark 模型已配置相同的 Agent Plan Key,OpenAI4S 会自动复用该 Key,无需重复填写。 * 若未自动获取,可手动粘贴 Agent Plan [专属 API Key](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=agentPlan),并点击 **保存凭证**。 > **说明** > > 保存后的 API Key 不会在 OpenAI4S 界面中回显。 3. 真实调用专业数据集,成功返回查询结果后,即表示专业数据集配置完成。 ![4.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/openai4s-step-4.png) > **注意** > > 如返回 `4011`,可能为 API Key 无效、额度不足,或当前 Agent Plan 未开启专业数据集 Harness。 ## 配置 R 内核(可选) OpenAI4S 安装包默认已内置 Python 科学计算环境,无需额外配置。若需要使用 R 执行数据分析等科研任务,可额外配置 R 内核。 > **注意** > > 配置 R 内核前,需确保设备已安装以下任一 Conda 环境管理工具:Micromamba / mamba / conda。可通过对应命令确认是否已安装。 > > ```Bash > conda --version > micromamba --version > mamba --version > ``` 1. 将 OpenAI4S CLI 添加到系统命令路径。 * 若通过 PyPI 安装,则可跳过本步骤。 * 若通过 `.dmg` 安装包安装,则需在终端内执行以下命令。 ```Bash sudo ln -sf /Applications/OpenAI4S.app/Contents/Resources/runtime/bin/openai4s /usr/local/bin/openai4s ``` 2. 初始化 R 核心环境。 ```Bash openai4s setup ``` 3. 配置完成后,重新启动 OpenAI4S 即可使用 R 内核。 # 四、使用 OpenAI4S OpenAI4S 主要面向复杂科研场景,覆盖生命科学、生物医药、化学材料、计算机与人工智能、机械自动化等多学科领域。OpenAI4S 结合大模型、专业科研数据源及 Skill、持久化 Python / R 科学计算环境,完成文献研究、数据分析、算法设计与建模、参数优化、仿真辅助、可视化等多步骤研究任务。 ## 核心科研能力 |能力 |说明 | |---|---| |文献研究 |检索、分析和比较科研资料,完成跨论文比较、证据整理与引用回溯。 | |数据分析 |对实验及科研数据进行检查、清洗、统计分析和结果验证。 | |科学计算与建模 |通过持久化 Python / R 内核执行代码,完成数值计算、建模及参数分析。 | |专业领域分析 |调用蛋白质、基因组、单细胞、化学与材料等专业科研 Skill 完成领域任务。 | |科研可视化 |根据分析结果生成图表,并支持进一步调整和迭代。 | |成果整理 |整理研究过程中的数据、代码、图表及分析结果,生成可追溯的科研产物。 | ## 使用方法 完成配置后,即可通过自然语言向 OpenAI4S 提交科研任务。 例如,新建对话并输入以下研究任务: > 获取人胰岛素(UniProt P01308)的蛋白质信息,概括其各条链及主要结构特征,并绘制残基疏水性分布图。 OpenAI4S 可根据研究目标自主完成蛋白质数据获取、链信息整理、残基特征分析及可视化,并将任务过程中生成的代码、图表及分析结果整理为可查看的科研产物。 ## 效果演示 | **Live API 工作流**
    从 UniProt / RCSB 到 3D 结构和报告的端到端演示。
    ![demo-01-hd.gif](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/demo-01-hd.gif) | **真实数据分析**
    以人胰岛素 INS 为例,从 UniProt / RCSB 到生成可复现分析报告。
    ![demo-05-hd.gif](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/demo-05-hd.gif) | |---|---| | **可视化 Artifact 编辑**
    一句话把 confidence 阈值线抬到 75,直接在图表上迭代。
    ![demo-02-hd.gif](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/demo-02-hd.gif) | **注释驱动图表编辑**
    在图表上圈选目标区域,OpenAI4S 自动重绘图例配色。
    ![demo-06-hd.gif](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/demo-06-hd.gif) | | **计划模式科研分析**
    以青蒿素与紫杉醇为例,进行溶解度预测的多步骤计划模式分析。
    ![demo-03-hd.gif](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/demo-03-hd.gif) | **蛋白质工程**
    从序列到突变候选与结构解释的蛋白质工程流程演示。
    ![demo-04-hd.gif](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/demo-04-hd.gif) | --- # Pi Source: https://ark.volcengine.com/region:cn-beijing/docs/agent-plan-personal-pi 本文介绍如何配置方舟 Agent Plan 到 Pi 中使用。Pi 是一款开源终端编程 Agent,通过统一 LLM API 兼容 OpenAI、Anthropic、Google 等多家协议。更多详情请参见 [Pi 官方文档](https://pi.dev/docs/latest)。 # 一、前提条件 * 您已按需订阅 Agent Plan 套餐。如未,请访问 [开通管理-Agent Plan](https://ark.volcengine.com/region:cn-beijing/subscription/agent-plan?agentMode=close) 页面订阅套餐。 * 您已正确安装 Pi,如未,请参见以下操作完成软件安装。 前提条件:安装 [Node.js 20 或更新版本](https://nodejs.org/en/download/)。 **选项:macOS/Linux** 在命令行界面,执行以下命令安装 Pi。 ```Bash # 方式 1:npm 全局安装 npm install -g @earendil-works/pi-coding-agent # 方式 2:官方一键脚本 curl -fsSL https://pi.dev/install.sh | sh ``` 安装结束后,执行以下命令查看安装结果,若显示版本号则安装成功。 ```Bash pi --version ``` **选项:Windows** 需先额外安装 [Git for Windows](https://git-scm.com/download/win),Pi 依赖其提供的 `bash.exe` 执行 `!` / `!!` shell 命令;官方 curl 一键脚本在 Windows 上不支持。 通过 npm 全局安装: ```Bash npm install -g @earendil-works/pi-coding-agent ``` 安装结束后,执行以下命令查看安装结果,若显示版本号则安装成功。 ```Bash pi --version ``` # 二、配置 Pi ## 方式 1:自动化助手(推荐) ArkCLI Helper 是一个编码工具助手,支持快速配置选择的工具接入 Agent Plan。安装并运行该助手,根据界面提示操作可自动完成工具配置,降低手动配置的时间成本和出错风险。 > **注意** > > * ArkCLI Helper 是基于 Ark Helper 升级演进的工具配置服务,相关能力将持续在 ArkCLI Helper 上迭代更新。建议优先使用 ArkCLI Helper 完成工具配置。 > * ArkCLI Helper 支持 macOS、Linux、Windows 系统。 1. 安装 Ark CLI。 ```Bash # 1. 通过 NPM 安装 npm install -g @volcengine/ark-cli@latest # 2. 验证安装 arkcli --version ``` 2. 登录 Ark CLI。 ```Bash arkcli auth login ``` ![image-20260624-144256-509.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-144256-509.png) 根据界面提示选择登录方式。若之前已登录过 arkcli,会沿用上次选择的配置;如需重新选择,请先执行 `arkcli config reset` 后再运行 `arkcli auth login`。首次登录时,按提示完成以下配置: 1. **选择项目(Project)**:可按需选择,或默认选择**账号全部资源**。 2. **选择消费模式(Type)**:选择 `agent-plan`。 ![image-20260624-145424-871.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-145424-871.png) 3. 运行 ArkCLI Helper,根据界面提示完成 Pi 的配置。 1. 在命令行界面输入 `arkcli helper` 命令,启动 ArkCLI Helper。 2. **选择要配置的 Plan profile**:`agent-plan_cn-beijing_personal (Agent Plan)`。 ![image-20260624-162749-221.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-162749-221.png) 3. **选择默认 model**:按需选择。 4. **选择要配置的 AI Agent**:`Pi`。 当前支持的 Harness 包括:AI Native 应用开发底座和Computer Use Agent,根据界面提示按需选择`配置`或者`跳过`。 ![pi-ark-cli.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/pi-ark-cli.png) 完成上述操作后,将自动完成 Pi 的基础配置,并按选择结果自动安装对应的 Harness 工具,无需手动安装。 ## 方式 2:手动配置 下面详细介绍如何手动完成配置。 1. 关注的配置信息如下: * ``:替换为您自己的 [专属 API Key](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&OpenModelVisible=false&advancedActiveKey=agentPlan)。 ![image-20260908-203322-616.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260908-203322-616.png) * `model`:见[支持模型及 Harness](/docs/agent-plan-personal-plan-overview#3d801f5f),需配置文本生成模型。 2. 创建并编辑 `~/.pi/agent/models.json` 文件。如目录不存在,先创建后再编辑。 ```JSON { "providers": { "agent-plan": { "api": "openai-completions", "apiKey": "", "baseUrl": "https://ark.cn-beijing.volces.com/api/plan/v3", "models": [ { "id": "ark-code-latest" }, { "contextWindow": 1048576, "id": "doubao-seed-evolving", "input": ["text", "image"], "maxTokens": 256000 }, { "contextWindow": 1048576, "id": "doubao-seed-2.1-pro", "input": ["text", "image"], "maxTokens": 256000 }, { "contextWindow": 1048576, "id": "doubao-seed-2.1-lite", "input": ["text", "image"], "maxTokens": 256000 }, { "contextWindow": 262144, "id": "doubao-seed-2.0-mini", "input": ["text", "image"], "maxTokens": 128000 }, { "contextWindow": 1048576, "id": "glm-5.3", "input": ["text"], "maxTokens": 128000 }, { "contextWindow": 1048576, "id": "glm-5.3-flash", "input": ["text", "image"], "maxTokens": 128000 }, { "contextWindow": 1048576, "id": "deepseek-v4.1-flash", "input": ["text", "image"], "maxTokens": 393216 }, { "contextWindow": 1049000, "id": "deepseek-v4.1-flash-economy", "input": ["text", "image"], "maxTokens": 393216 }, { "contextWindow": 1048576, "id": "deepseek-v4-pro", "input": ["text"], "maxTokens": 393216 }, { "contextWindow": 1048576, "id": "deepseek-v4-flash", "input": ["text"], "maxTokens": 393216 }, { "contextWindow": 1048576, "id": "kimi-k3", "input": ["text", "image"], "maxTokens": 128000 }, { "contextWindow": 1048576, "id": "kimi-k2.8-preview", "input": ["text", "image"], "maxTokens": 1048576 }, { "contextWindow": 1048576, "id": "glm-latest", "input": ["text"], "maxTokens": 128000 } ] } } } ``` > **说明** > > 修改 `models.json` 后无需重启 Pi,在对话中执行 `/model` 会自动重新加载。 # 三、启动并使用 Pi 1. 进入项目目录并启动 Pi: ```Bash pi ``` 2. 在 Pi 交互界面执行 `/model`,可选择切换刚才配置的 provider 和模型。支持的模型可见 [支持模型及 Harness](/docs/agent-plan-personal-plan-overview#3d801f5f)。 ![ap-personal-pi-choose-model.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/ap-personal-pi-choose-model.png) 3. 发送任意问题验证连通性,例如: ``` 简单介绍一下当前目录的文件结构。 ``` 若返回内容正常,说明 Agent Plan 已成功接入。 > 更多 Pi 使用教程请参见 [Pi 官方文档](https://pi.dev/docs/latest)。 # 其他操作 ## 切换模型 Pi 支持两种切换方式: |配置方式 |操作 | |---|---| |交互切换 |在 Pi 对话界面执行 `/model`,从下拉列表选择目标模型。 | |修改配置 |编辑 `~/.pi/agent/models.json`,在对应 provider 的 `models` 数组中新增或调整模型条目,保存后执行 `/model` 触发重载。 | ## 添加图片生成/视频生成能力 方舟 Agent Plan Medium 及以上套餐提供图片生成模型配额,Large 及以上套餐提供视频生成模型配额。Pi 的 `models[].input` 只声明**输入**模态(`text` / `image`),图片/视频生成需要通过工具调用或 MCP 接入。具体配置方法请参见 [接入视觉模型](/docs/agent-plan-personal-visual-models)。 > **注意** > > * 不同的套餐支持的视觉模型有所不同,具体参见[支持模型及 Harness](/docs/agent-plan-personal-plan-overview#3d801f5f)。 > * 视觉模型不支持通过 Auto 及控制台切换使用。 --- # OpenViking Source: https://ark.volcengine.com/region:cn-beijing/docs/agent-plan-personal-openviking **OpenViking** 是专为 AI 智能体(Agent)打造的上下文数据库,主要适用于多 Agent 协同、长期记忆管理、复杂任务执行等场景。该数据库采用 `viking:// `文件系统范式,将智能体的**记忆、资源与技能**进行统一组织管理,依托分层加载机制按需供给上下文,在减少 Token 消耗的同时提升运行效率,结合目录式检索优化信息召回效果。功能上,OpenViking 支持**多租户、多用户及多 Agent 隔离**,且能在会话结束后自动沉淀长期记忆,实现智能体能力的持续积累与自我优化,既有效降低开发者的上下文管理成本,也能显著提升 OpenClaw 等智能体的整体运行表现。 方舟 Agent Plan 支持在 OpenViking 中使用,可参考本文进行配置及使用。 > **注意** > > OpenViking 工具处于快速迭代阶段,本文使用的版本为 **0.4.15**,如果实际使用与以下步骤存在差异,可参见 [OpenViking:AI 智能体的上下文数据库](https://github.com/volcengine/OpenViking/blob/main/docs/repository/README_CN.md)。 # 一、前提条件 * 您已按需订阅 Agent Plan 套餐。如未,请访问 [开通管理-Agent Plan](https://ark.volcengine.com/region:cn-beijing/subscription/agent-plan?agentMode=close) 页面订阅套餐。 # 二、安装 OpenViking ## 前提条件 * 已安装 [Python 3.10 或更高版本](https://wiki.python.org/moin/BeginnersGuide/Download)。 * 已安装 [Go 1.22 或更高版本](https://golang.google.cn/dl/)。 * 已安装 C++ 编译器,且 GCC 9+ 或 Clang 11+。 > **说明** > > 通过命令`clang++ --version`和`clang++ -std=c++17 -E -x c++ - < /dev/null`检查 C++编译器支持情况。 > **说明** > > 如果执行 `pip install openviking` 时提示 `No matching distribution found`,请先运行 `python3 --version` 确认 Python 版本不低于 3.10。 ## 安装步骤 执行以下命令安装 OpenViking。 ```Bash pip install openviking --upgrade --force-reinstall ``` 安装结束后,执行以下命令查看安装结果,若显示版本号则安装成功。 ```Bash openviking --version ``` # 三、配置 OpenViking 1. 创建配置文件`~/.openviking/ov.conf`,配置信息如下。需要修改的配置信息如下: * `storage.workspace`:替换为实际的工作空间路径。 * `embedding`:配置向量化模型,用于向量化和语义检索。 * `embedding.dense.model`:支持的 Embedding 模型 `doubao-embedding-vision`。 * `embedding.dense.api_key`:替换为您自己的 [专属 API Key](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&OpenModelVisible=false&advancedActiveKey=agentPlan)。 ![image-20260908-203322-616.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260908-203322-616.png) * `vlm`:配置语言模型,用于图像和内容理解。 * `vlm.model`:支持的语言模型,具体参见[支持模型及 Harness](/docs/agent-plan-personal-plan-overview#3d801f5f)。 * `vlm.api_key`:替换为您自己的 [专属 API Key](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&OpenModelVisible=false&advancedActiveKey=agentPlan)。 ```JSON { "storage": { "workspace": "/home/your-name/openviking_workspace" }, "log": { "level": "INFO", "output": "stdout" }, "embedding": { "dense": { "backend": "volcengine", "api_key": "", "model": "doubao-embedding-vision", "api_base": "https://ark.cn-beijing.volces.com/api/plan/v3", "dimension": 1024, "input": "multimodal" } }, "vlm": { "backend": "volcengine", "api_key": "", "model": "doubao-seed-2.1-pro", "api_base": "https://ark.cn-beijing.volces.com/api/plan/v3", "temperature": 0.1, "max_retries": 3 } } ``` 2. 设置服务器配置环境变量。 根据系统环境选择对应的方式设置环境变量。 > **说明** > > 如果配置文件放在其他位置,需要在环境变量中指定对应的文件路径。 **选项:macOS/Linux** 执行以下命令,设置环境变量指向对应的配置文件。 ```Bash export OPENVIKING_CONFIG_FILE=~/.openviking/ov.conf ``` **选项:Windows** 选择以下任一方式,设置环境变量指向对应的配置文件。 * **PowerShell** ```Bash $env:OPENVIKING_CONFIG_FILE = "$HOME/.openviking/ov.conf" ``` * **CMD** ```Bash set "OPENVIKING_CONFIG_FILE=%USERPROFILE%\.openviking\ov.conf" ``` # 四、开始使用 OpenViking > **说明** > > 需要先在另一个终端执行 `openviking-server` 启动服务,再运行下面的 Python 示例。 1. 创建 Python 文件`example.py`,代码内容如下。 ```Python from openviking_sdk import SyncHTTPClient # Initialize OpenViking HTTP client client = SyncHTTPClient(url="http://localhost:1933", api_key="") try: # Initialize the client client.initialize() # Add resource (supports URL, file, or directory) add_result = client.add_resource( path="https://raw.githubusercontent.com/volcengine/OpenViking/refs/heads/main/README.md" ) root_uri = add_result['root_uri'] # Explore the resource tree structure ls_result = client.ls(root_uri) print(f"Directory structure:\n{ls_result}\n") # Use glob to find markdown files glob_result = client.glob(pattern="**/*.md", uri=root_uri) if glob_result['matches']: content = client.read(glob_result['matches'][0]) print(f"Content preview: {content[:200]}...\n") # Wait for semantic processing to complete print("Wait for semantic processing...") client.wait_processed(timeout=120) # Get abstract and overview of the resource abstract = client.abstract(root_uri) overview = client.overview(root_uri) print(f"Abstract:\n{abstract}\n\nOverview:\n{overview}\n") # Perform semantic search results = client.find("what is openviking", target_uri=root_uri) print("Search results:") for r in results.get("resources", []): print(f" {r['uri']} (score: {r['score']:.4f})") # Close the client client.close() except Exception as e: print(f"Error: {e}") ``` 2. 执行命令 `python example.py`,输出如下内容则说明 OpenViking 已成功运行。 ``` Directory structure: ... Content preview: ... Wait for semantic processing... Abstract: ... Overview: ... Search results: viking://resources/... (score: 0.8523) ... ``` # 其他操作 ## CLI 服务端配置并使用 OpenViking 如果需要将 OpenViking 作为独立的 HTTP 服务运行,然后从任意客户端连接,请参考以下步骤进行配置。 ### 前提条件 已安装并完成配置 OpenViking,具体参见 [安装 OpenViking](/docs/agent-plan-personal-openviking#4cc843e2)、[配置 OpenViking](/docs/agent-plan-personal-openviking#ceac2da4)。 ### 启动服务 执行以下命令启动服务。 ```Bash openviking-server ``` 启动完成后,在新的命令行界面执行以下命令验证服务启动是否成功,若返回`"status":"ok"`则表示启动成功。 ```Bash curl http://localhost:1933/health ``` ### 使用 CLI 连接 1. 创建 CLI 连接配置文件 `~/.openviking/ovcli.conf`,配置信息如下。其中``需替换为您自己的 [API Key](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&OpenModelVisible=false&advancedActiveKey=agentPlan)。 ```JSON { "url": "http://localhost:1933", "api_key": "", "output": "table" } ``` 2. 在新的命令行界面执行以下 CLI 命令。 ```Bash # Check system health openviking observer system # Add a resource to memory openviking add-resource https://raw.githubusercontent.com/volcengine/OpenViking/refs/heads/main/README.md # List all synchronized resources openviking ls viking://resources # Query openviking find "what is openviking" ``` ### 使用 curl 连接 启动服务后,也可以在命令行界面使用 curl 命令连接 OpenViking。 ```Bash # Add a resource curl -X POST http://localhost:1933/api/v1/resources \ -H "Content-Type: application/json" \ -d '{"path": "https://raw.githubusercontent.com/volcengine/OpenViking/refs/heads/main/README.md"}' # List resources curl "http://localhost:1933/api/v1/fs/ls?uri=viking://resources/" # Semantic search curl -X POST http://localhost:1933/api/v1/search/find \ -H "Content-Type: application/json" \ -d '{"query": "what is openviking"}' ``` ## 在 OpenClaw 配置 OpenViking 记忆功能 通过 OpenViking 为 OpenClaw 提供长效记忆能力,配置完成后,OpenClaw 将自动记住对话中的重要信息,并在回复前回忆相关内容。 ### 前提条件 已完成 OpenClaw 的安装与配置,具体参见 [安装 OpenClaw](/docs/agent-plan-personal-openclaw#b51c87f8)、[配置 OpenClaw](/docs/agent-plan-personal-openclaw#48c0b1ea)。 ### 安装及配置 具体步骤参见 [为 OpenClaw 安装 OpenViking 记忆功能](https://github.com/volcengine/OpenViking/blob/main/examples/openclaw-plugin/INSTALL-ZH.md)。 安装完成后,编辑配置文件`~/.openviking/ov.conf`,使用 Agent Plan 支持的模型。配置信息可参见 [配置 OpenViking](/docs/agent-plan-personal-openviking#ceac2da4)。 --- # 其他工具 Source: https://ark.volcengine.com/region:cn-beijing/docs/agent-plan-personal-other-tools 方舟 Agent Plan 已适配 Anthropic、OpenAI 接口协议,可兼容对应工具生态。开发者通过配置 Agent Plan 专用的 Base URL并指定支持模型,可快速接入并使用相关工具。 > **注意** > > [获取专属 API Key](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=agentPlan):Agent Plan 专属 API Key 与火山方舟平台的 API Key 不同,请勿混用。 > ![image-20260908-203322-616.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260908-203322-616.png) # 适用工具 |接口协议 |Base URL |适用工具 | |---|---|---| |兼容 Anthropic 接口协议 |`https://ark.cn-beijing.volces.com/api/plan` |Claude Code | |兼容 OpenAI 接口协议 |`https://ark.cn-beijing.volces.com/api/plan/v3` |OpenCode、OpenClaw、TraeCode、Hermes Agent、Codex CLI、Cline、Cursor、Kilo Code、Roo Code 等 | # 接入Cline ## 安装步骤 打开 VSCode,在扩展市场搜索`Cline`安装。 ## 配置工具 Cline插件安装完成后,您需要配置以下信息。 * **API Provider**:`OpenAI Compatible`(Agent Plan 接口兼容 OpenAI 标准) * **Base URL**:`https://ark.cn-beijing.volces.com/api/plan/v3` * **API Key**:[获取API Key](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&OpenModelVisible=false&advancedActiveKey=agentPlan) * **Model ID**:支持配置`ark-code-latest`、配置 Model Name 两种方式。模型信息见[支持模型及 Harness](/docs/agent-plan-personal-plan-overview#3d801f5f),需配置文本生成模型。 配置完成后,就可以在输入框中输入需求,与模型进行交互。 # 接入Cursor ## 安装步骤 官网下载安装包:通过 [Cursor官网](https://cursor.com/) 下载并安装Cursor。 ## 配置工具 > **说明** > > 由于 Cursor 的限制,只有订阅了 Cursor Pro 及以上套餐的用户才支持自定义配置模型。 Cursor 安装完成后,Models 模块的具体配置如下: * OpenAI API Key:[获取API Key](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&OpenModelVisible=false&advancedActiveKey=agentPlan) * Override OpenAI Base URL:`https://ark.cn-beijing.volces.com/api/plan/v3` * Add Custom Model:支持配置`ark-code-latest`、配置 Model Name 两种方式。模型信息见[支持模型及 Harness](/docs/agent-plan-personal-plan-overview#3d801f5f),需配置文本生成模型。 > **注意** > > 在 Cursor 中配置 `minimax-m2.7`、`glm-5.3`、`glm-5.3-flash`、`kimi-k2.6` 模型时若遇到名称冲突问题,建议改用`minimax-m2-7`、`glm-5-3`、`glm-5-3-flash`、`kimi-k2-6` 配置。 配置完成后,即可在聊天面板中选择配置的模型进行交互。 # 接入Roo Code ## 安装步骤 > **说明** > > 若模型表现异常,建议将插件更新到最新版本(3.43.0 及后续版本)。 打开 VSCode,在扩展市场搜索`Roo Code`进行安装,安装完成后选择信任发布者。 ![Image](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/dd47c5150044469cb4e95b8de067d817~tplv-goo7wpa0wc-image.image) ## 配置工具 安装完成后,配置以下信息。 * **API Provider**:`OpenAI Compatible`(Agent Plan 接口兼容 OpenAI 标准) * **Base URL**:`https://ark.cn-beijing.volces.com/api/plan/v3` * **API Key**:[获取API Key](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&OpenModelVisible=false&advancedActiveKey=agentPlan) * **Model**:支持配置`ark-code-latest`、配置 Model Name 两种方式。模型信息见[支持模型及 Harness](/docs/agent-plan-personal-plan-overview#3d801f5f),需配置文本生成模型。 配置完成后,就可以在输入框中输入需求,与模型进行交互。 # 接入Kilo Code ## 安装步骤 打开 VSCode,在扩展市场搜索`kilo code`进行安装,安装完成后选择信任发布者。 ![Image](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/3e991c168c0c49bc9449f6f6efc29bd7~tplv-goo7wpa0wc-image.image) ## 配置工具 选择**Settings** - **Providers** - **Custom provider**,然后配置以下信息。 * **Provider ID**:Provider 的唯一标识,按需填写。 * **Display Name**:Provider 的显示名称,按需填写。 * **API Provider**:`OpenAI Compatible`(Agent Plan 接口兼容 OpenAI 标准) * **Base URL**:`https://ark.cn-beijing.volces.com/api/plan/v3` * **API Key**:[获取API Key](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&OpenModelVisible=false&advancedActiveKey=agentPlan) * **Model ID**:即要配置的模型名称,如 `ark-code-latest`。可选值见[支持模型及 Harness](/docs/agent-plan-personal-plan-overview#3d801f5f),需配置文本生成模型。 * **Model Name**:模型的显示名称,按需填写。 > **注意** > > Kilo Code 客户端 UI 迭代较为频繁,字段名称、顺序或数量可能随版本变化,本文内容以近期版本为准,仅供参考。若与您本地界面存在差异,请以客户端实际提示为准。 配置完成后,就可以在输入框中输入需求,与模型进行交互。 --- # 接入向量化模型 Source: https://ark.volcengine.com/region:cn-beijing/docs/agent-plan-personal-vectorized-models 方舟 Agent Plan 提供向量化模型,可以为工具提供语义向量能力,将对话、文档与任务信息等转换为高维向量表示,实现基于语义相似度的高效检索。 相比传统关键词匹配,Embedding 检索在信息量大、对话长、资料分散的场景下,能够更准确地召回相关内容,显著降低遗漏与误判。同时,Embedding 为记忆检索、知识库问答与工具调用提供统一的语义检索层,帮助工具在不增加主模型推理成本的前提下,提升跨轮次上下文追踪能力与整体效果。 # 核心配置信息 在 Agent Plan 中使用向量模型时,需要的核心配置如下: * **专属 Base URL**:https://ark.cn-beijing.volces.com/api/plan/v3,Agent Plan 专属 Base URL 中包含`/plan`,请勿混用其他 Base URL。 * **专属 API Key**:[获取专属 API Key](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&OpenModelVisible=false&advancedActiveKey=agentPlan),其他方舟 API Key 如 Coding Plan API Key 无法在 Agent Plan 中使用。 ![image-20260908-203322-616.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260908-203322-616.png) * **支持的模型**:`doubao-embedding-vision`(对应模型 [doubao-embedding-vision-251215](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-embedding-vision)) > **注意** > > * 建议固定使用同一版本的向量化模型,请勿混用不同版本。 > * 向量化模型只支持在配置文件中指定 Model Name,不支持通过 Auto 及控制台切换使用。 # 接入向量化模型 ## OpenClaw OpenClaw 支持配置向量模型,解决大模型原生记忆有限、易产生幻觉、无法适配私有数据的问题,从而提升模型在处理复杂任务时的准确性和可靠性。 1. 前提条件:已完成 OpenClaw 的安装与配置,步骤参见[二、安装 OpenClaw](/docs/agent-plan-personal-openclaw#b51c87f8)、[三、配置 OpenClaw](/docs/agent-plan-personal-openclaw#48c0b1ea)。 2. 选择以下任一方式配置向量模型。 **选项:Web UI 方式** 1. 执行以下命令打开 Web UI。 ```Bash openclaw dashboard ``` 2. 在左侧菜单栏选择**配置** - **Settings** - **Advanced**,单击 **Open** 查看并修改配置信息,在`agents.defaults`节点下增加 `memorySearch`相关配置信息,增加的配置信息如下。其中需要将``替换为您自己的 [专属 API Key](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&OpenModelVisible=false&advancedActiveKey=agentPlan)。 ```JSON { ... "agents": { "defaults": { ... "memorySearch": { "provider": "openai", "model": "doubao-embedding-vision", "remote": { "baseUrl": "https://ark.cn-beijing.volces.com/api/plan/v3", "apiKey": "" } } ... } } ... } ``` 3. 配置完成后,先保存配置文件,然后单击 **Update** 更新配置,配置更新完成后需要重新连接服务进入 Web UI。 **选项:终端方式** 1. 在终端执行以下命令打开 OpenClaw 配置文件。 ```Bash nano ~/.openclaw/openclaw.json ``` 2. 在`agents.defaults`节点下增加 `memorySearch`相关配置信息,增加的配置信息如下。其中需要将``替换为您自己的 [专属API Key](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&OpenModelVisible=false&advancedActiveKey=agentPlan)。 ```JSON { ... "agents": { "defaults": { ... "memorySearch": { "provider": "openai", "model": "doubao-embedding-vision", "remote": { "baseUrl": "https://ark.cn-beijing.volces.com/api/plan/v3", "apiKey": "" } } ... } } ... } ``` 3. 配置完成后,重启网关使配置生效。 ```Bash openclaw gateway restart ``` ## OpenViking OpenViking 是专为 AI 智能体设计的开源上下文数据库,支持多模态 Embedding 模型的集成与接入,实现非结构化数据的向量化转换,并提供高效的语义相似度检索能力。 1. 前提条件:已完成 OpenViking 的安装与基础配置,步骤参见 [安装 OpenViking](/docs/agent-plan-personal-openviking#4cc843e2)、[配置 OpenViking](/docs/agent-plan-personal-openviking#ceac2da4)。 2. 在配置文件 `~/.openviking/ov.conf`中新增`embedding`相关配置。其中需要将``替换为您自己的 [专属 API Key](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&OpenModelVisible=false&advancedActiveKey=agentPlan)。 ```JSON { ... "embedding": { "dense": { "api_base" : "https://ark.cn-beijing.volces.com/api/plan/v3", "api_key" : "", "provider" : "volcengine", "dimension": 1024, "model" : "doubao-embedding-vision" }, "max_concurrent": 10 } ... } ``` --- # 接入视觉模型 Source: https://ark.volcengine.com/region:cn-beijing/docs/agent-plan-personal-visual-models 方舟 Agent Plan 提供图片生成、视频生成模型,支持通过 Skill、ArkCLI、API 接口调用方式接入并使用生图、生视频能力。 # 通过 Skill 接入 在 AI 工具中使用图片生成、视频生成能力,建议使用 Skill 方式接入。 ## 安装视频生成 Skill 通过 Skill 方式,可以快速为 AI 工具安装并接入视频生成能力,目前支持的 AI 工具:OpenClaw、Hermes Agent、Claude Code。视频生成 Skill 信息参见 [byted-ark-seedance-skill](https://findskill.com/volcengine/agentplan/byted-ark-seedance-skill)。 **选项:OpenClaw** 1. 已完成 OpenClaw 的安装及语言模型的配置,具体步骤见 [OpenClaw](/docs/agent-plan-personal-openclaw)。 2. 在终端执行以下命令为 OpenClaw 安装并接入视频生成 Skill `byted-ark-seedance-skill`。 ```Bash npx skills add https://skills.volces.com/skills/volcengine/agentplan -s byted-ark-seedance-skill --agent openclaw ``` 3. 安装完成后,可以在 OpenClaw 发送视频生成的提示词,触发并使用生成视频能力。 **选项:Hermes Agent** 1. 已完成 Hermes Agent 的安装及语言模型的配置,具体步骤见 [Hermes Agent](/docs/coding-plan-personal-ai-hermes-agent)。 2. 进入 [byted-ark-seedance-skill](https://findskill.com/volcengine/agentplan/byted-ark-seedance-skill) 页面下载 ZIP 压缩包,将解压后的文件粘贴至`~/.hermes/skills/`目录下。 3. 配置完成后,可以在 Hermes Agent 发送视频生成的提示词,触发并使用生成视频能力。 **选项:Claude Code** 1. 已完成 Claude Code 的安装及语言模型的配置,具体步骤见 [Claude Code](/docs/agent-plan-personal-claude-code)。 2. 在终端执行以下命令为 Claude Code 安装并接入视频生成 Skill `byted-ark-seedance-skill`。 ```Bash npx skills add https://skills.volces.com/skills/volcengine/agentplan -s byted-ark-seedance-skill --agent claude-code ``` 3. 配置完成后,可以在 Claude Code 发送视频生成的提示词,触发并使用生成视频能力。 **选项:TraeCode** 1. 已完成 TraeCode 的安装及语言模型的配置,具体步骤见 [TraeCode](/docs/agent-plan-personal-trae)。 2. 在终端执行以下命令下载 `byted-ark-seedance-skill`。 ```Bash npx skills add https://skills.volces.com/skills/volcengine/agentplan -s byted-ark-seedance-skill --agent trae ``` 3. 安装完成后,可以在 TraeCode 发送视频生成的提示词,触发并使用生成视频能力。 ## 安装图片生成 Skill 通过 Skill 方式,可以快速为 AI 工具安装并接入图片生成能力,目前支持的 AI 工具:OpenClaw、Hermes Agent、Claude Code。图片生成 Skill 信息参见 [byted-ark-seedream-skill](https://findskill.com/volcengine/agentplan/byted-ark-seedream-skill)。 **选项:OpenClaw** 1. 已完成 OpenClaw 的安装及语言模型的配置,具体步骤见 [OpenClaw](/docs/agent-plan-personal-openclaw)。 2. 在终端执行以下命令为 OpenClaw 安装并接入图片生成 Skill `byted-ark-seedream-skill`。 ```Bash npx skills add https://skills.volces.com/skills/volcengine/agentplan -s byted-ark-seedream-skill --agent openclaw ``` 3. 安装完成后,可以在 OpenClaw 发送图片生成的提示词,触发并使用生成图片能力。 **选项:Hermes Agent** 1. 已完成 Hermes Agent 的安装及语言模型的配置,具体步骤见 [Hermes Agent](/docs/coding-plan-personal-ai-hermes-agent)。 2. 进入 [byted-ark-seedream-skill](https://findskill.com/volcengine/agentplan/byted-ark-seedream-skill) 页面下载 ZIP 压缩包,将解压后的文件粘贴至`~/.hermes/skills/`目录下。 3. 安装完成后,可以在 Hermes Agent 发送图片生成的提示词,触发并使用生成图片能力。 **选项:Claude Code** 1. 已完成 Claude Code 的安装及语言模型的配置,具体步骤见 [Claude Code](/docs/agent-plan-personal-claude-code)。 2. 在终端执行以下命令为 Claude Code 安装并接入图片生成 Skill `byted-ark-seedream-skill`。 ```Bash npx skills add https://skills.volces.com/skills/volcengine/agentplan -s byted-ark-seedream-skill --agent claude-code ``` 3. 安装完成后,可以在 Claude Code 发送图片生成的提示词,触发并使用生成图片能力。 **选项:TraeCode** 1. 已完成 TraeCode 的安装及语言模型的配置,具体步骤见 [TraeCode](/docs/agent-plan-personal-trae)。 2. 在终端执行以下命令下载 `byted-ark-seedream-skill`。 ```Bash npx skills add https://skills.volces.com/skills/volcengine/agentplan -s byted-ark-seedream-skill --agent trae ``` 3. 安装完成后,可以在 TraeCode 发送图片生成的提示词,触发并使用生成图片能力。 # 通过 ArkCLI 接入 通过 ArkCLI(命令行工具)同样可以接入图片生成、视频生成能力,支持通过 **Agent 调用**或**终端调用**两种方式使用。 ## 安装与配置 请确保已购买 [Agent Plan 套餐](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=agentPlan)。安装、登录及配置步骤,参见 [ArkCLI:Agent Plan 个人版使用指南](/docs/agent-plan-personal-ark-cli)。 > **注意**:登录 ArkCLI 时需要选择消费模式为 `agent-plan`。 配好 Agent 工具后即可开始使用。 ## 使用示例 **选项:通过 Agent 调用** 在 Agent 对话中直接说明生图、生视频要求即可调用,建议**在提示词中注明“不要使用后付费”**。 * **生图** ```text 请使用 Agent Plan 的 doubao-seedream-5.0-pro 模型生成一张图片:一只赛博朋克风格的猫咪坐在东京街头,霓虹灯反射,不要使用后付费 ``` * **生视频** ```text 请使用 Agent Plan 的 doubao-seedance-2.5 模型生成一段 5 秒 16:9 视频:无人机航拍雪山日出,缓慢右移,同步等结果,不要使用后付费 ``` **选项:通过终端调用** **1. 生图** ```Bash arkcli +gen "赛博朋克风格的猫咪坐在东京街头,霓虹灯反射" ``` **2. 生视频** ```Bash arkcli +gen "无人机航拍雪山日出,缓慢平移" --modality video --duration 5 --ratio 16:9 ``` # 通过 API 接入 如果使用的 AI 工具不支持接入 Skill,或者无需在 AI 工具中使用,可通过 API 接入的方式使用图片生成、视频生成能力。 ## 核心配置信息 在使用 Agent Plan 时,需要使用专属 API Key、专属 Base URL、支持的模型来调用视频生成、图片生成 API,否则可能会调用失败或产生额外费用。 * **专属 API Key**:[获取专属 API Key](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&OpenModelVisible=false&advancedActiveKey=agentPlan),其他方舟 API Key 如 Coding Plan API Key 无法在 Agent Plan 中使用。 ![image-20260908-203322-616.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260908-203322-616.png) * **支持的模型**:见[支持模型及 Harness](/docs/agent-plan-personal-plan-overview#3d801f5f)。 * **专属 Base URL**:Agent Plan 对应的 API 接口信息中包含`/plan`,请勿混用其他 API 接口。 * Curl 方式:支持的 API 参数可查看对应的 API 文档。 |视频生成 API |图片生成 API | |---|---| |* [创建视频生成任务](/docs/create-video-generation-task-api):`https://ark.cn-beijing.volces.com/api/plan/v3/contents/generations/tasks` |[图片生成](/docs/image-generation-api):`https://ark.cn-beijing.volces.com/api/plan/v3/images/generations` | \ |* [查询视频生成任务](/docs/get-video-generation-task-api):`https://ark.cn-beijing.volces.com/api/plan/v3/contents/generations/tasks/{id}` | | \ |* [查询视频生成任务列表](/docs/list-video-generation-tasks-api):`https://ark.cn-beijing.volces.com/api/plan/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}` | | \ |* [取消或删除视频生成任务](/docs/cancel-or-delete-video-generation-tasks-api):`https://ark.cn-beijing.volces.com/api/plan/v3/contents/generations/tasks/{id}` | | * SDK 方式: 专属 Base URL:`https://ark.cn-beijing.volces.com/api/plan/v3` ## 调用视频生成 API 参见[视频生成教程](/docs/video-generation-tutorial)、[Doubao Seedance 2.5 教程](/docs/seedance-2-5)、[Doubao Seedance 2.0 系列教程](/docs/seedance-2-0)完成视频生成任务,需注意必须使用 Agent Plan 专属 API Key、专属 Base URL 及支持的模型,否则可能会调用失败或产生额外费用。具体参见[核心配置信息](/docs/agent-plan-personal-visual-models#8d00fec2)。 通过 Agent Plan 创建视频生成任务的示例如下: **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/plan/v3/contents/generations/tasks \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $AGENT_API_KEY" \ -d '{ "model": "doubao-seedance-2.0", "content": [ { "type": "text", "text": "女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动,可以听到风声" }, { "type": "image_url", "image_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/i2v_foxrgirl.png" } } ], "generate_audio": true, "ratio": "adaptive", "duration": 5, "watermark": true }' ``` **选项:Python** ```Python import os from arkruntime import Ark client = Ark( # Agent Plan 专属 Base URL base_url="https://ark.cn-beijing.volces.com/api/plan/v3", # Agent Plan 专属 API Key:https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&OpenModelVisible=false&advancedActiveKey=agentPlan api_key=os.environ.get("AGENT_API_KEY") ) if __name__ == "__main__": print("----- create request -----") resp = client.content_generation.tasks.create( model="doubao-seedance-2.0", content=[ { "text": ( "女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动" ), "type": "text" }, { "image_url": { "url": ( "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/i2v_foxrgirl.png" ) }, "type": "image_url" } ], generate_audio=True, ratio="adaptive", duration=5, watermark=True, ) print(resp) ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.content_generation.*; import com.volcengine.ark.runtime.service.ArkService; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; public class ContentGenerationTaskExample { // Agent Plan 专属 API Key:https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&OpenModelVisible=false&advancedActiveKey=agentPlan static String apiKey = System.getenv("AGENT_API_KEY"); static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); static Dispatcher dispatcher = new Dispatcher(); static ArkService service = ArkService.builder() .baseUrl("https://ark.cn-beijing.volces.com/api/plan/v3") // Agent Plan 专属 Base URL .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .build(); public static void main(String[] args) { String model = "doubao-seedance-2.0"; Boolean generateAudio = true; String ratio = "adaptive"; Long duration = 5L; Boolean watermark = true; System.out.println("----- create request -----"); List contents = new ArrayList<>(); // Combination of text prompt and parameters contents.add(ContentItem.builder() .type(ContentType.TEXT) .text("女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动,可以听到风声") .build()); // The URL of the first frame image contents.add(ContentItem.builder() .type(ContentType.IMAGE_URL) .imageUrl(ImageURL.builder() .url("https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/i2v_foxrgirl.png") .build()) .build()); // Create a video generation task CreateContentGenerationTaskRequest createRequest = CreateContentGenerationTaskRequest.builder() .model(model) .content(contents) .generateAudio(generateAudio) .ratio(ratio) .duration(duration) .watermark(watermark) .build(); CreateContentGenerationTaskResponse createResult = service.createContentGenerationTask(createRequest); System.out.println(createResult); service.shutdownExecutor(); } } ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" model "github.com/volcengine/ark-runtime-go/arkruntime/model/contentgeneration" ) func main() { client := arkruntime.NewClientWithApiKey( // Agent Plan 专属 API Key:https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&OpenModelVisible=false&advancedActiveKey=agentPlan os.Getenv("AGENT_API_KEY"), // Agent Plan 专属 Base URL arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/plan/v3"), ) ctx := context.Background() modelEp := "doubao-seedance-2.0" // Generate a task fmt.Println("----- create request -----") createReq := &model.CreateContentGenerationTaskRequest{ Model: modelEp, GenerateAudio: model.NewOptBool(true), Ratio: model.NewOptString("adaptive"), Duration: model.NewOptInt64(5), Watermark: model.NewOptBool(true), Content: []model.ContentItem{ { // Combination of text prompt and parameters Type: model.ContentTypeText, Text: model.NewOptString("女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动,可以听到风声"), }, { // The URL of the first frame image Type: model.ContentTypeImageURL, ImageURL: model.NewOptImageURL(model.ImageURL{ URL: "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/i2v_foxrgirl.png", }), }, }, } createResp, err := client.CreateContentGenerationTask(ctx, createReq) if err != nil { fmt.Printf("create content generation error: %v", err) return } taskID := createResp.ID fmt.Printf("Task Created with ID: %s", taskID) } ``` ## 调用图片生成 API 参见 [Seedream 5.0 Pro 教程](/docs/seedream-5-0-pro)、[图片生成教程](/docs/seedream-4-0-5-0) 完成图片生成任务,需注意必须使用 Agent Plan 专属 API Key、专属 Base URL 及支持的模型,否则可能会调用失败或产生额外费用。具体参见[核心配置信息](/docs/agent-plan-personal-visual-models#8d00fec2)。 通过 Agent Plan 实现文生图的示例如下: **选项:Curl** ```Bash curl https://ark.cn-beijing.volces.com/api/plan/v3/images/generations \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $AGENT_API_KEY" \ -d '{ "model": "doubao-seedream-5.0-lite", "prompt": "充满活力的特写编辑肖像,模特眼神犀利,头戴雕塑感帽子,色彩拼接丰富,眼部焦点锐利,景深较浅,具有Vogue杂志封面的美学风格,采用中画幅拍摄,工作室灯光效果强烈。", "size": "2K", "output_format":"png", "watermark": true }' ``` **选项:Python** ```Python import os # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark client = Ark( # Agent Plan 专属 Base URL base_url="https://ark.cn-beijing.volces.com/api/plan/v3", # Agent Plan 专属 API Key:https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&OpenModelVisible=false&advancedActiveKey=agentPlan api_key=os.getenv('AGENT_API_KEY'), ) imagesResponse = client.images.generate( model="doubao-seedream-5.0-lite", prompt="充满活力的特写编辑肖像,模特眼神犀利,头戴雕塑感帽子,色彩拼接丰富,眼部焦点锐利,景深较浅,具有Vogue杂志封面的美学风格,采用中画幅拍摄,工作室灯光效果强烈。", size="2K", output_format="png", response_format="url", watermark=True ) print(imagesResponse.data[0].url) ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.images.*; import com.volcengine.ark.runtime.service.ArkService; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; import java.util.Arrays; import java.util.List; import java.util.concurrent.TimeUnit; public class ImageGenerationsExample { public static void main(String[] args) { // Agent Plan 专属 API Key:https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&OpenModelVisible=false&advancedActiveKey=agentPlan String apiKey = System.getenv("AGENT_API_KEY"); ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); Dispatcher dispatcher = new Dispatcher(); ArkService service = ArkService.builder() .baseUrl("https://ark.cn-beijing.volces.com/api/plan/v3") // Agent Plan 专属 Base URL .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .build(); CreateImageGenerationRequest generateRequest = CreateImageGenerationRequest.builder() .model("doubao-seedream-5.0-lite") .prompt("充满活力的特写编辑肖像,模特眼神犀利,头戴雕塑感帽子,色彩拼接丰富,眼部焦点锐利,景深较浅,具有Vogue杂志封面的美学风格,采用中画幅拍摄,工作室灯光效果强烈。") .size("2K") .sequentialImageGeneration(SequentialImageGenerationMode.DISABLED) .outputFormat(OutputFormat.PNG) .responseFormat(ResponseFormat.URL) .stream(false) .watermark(true) .build(); ImageGenerationResponse imagesResponse = service.generateImages(generateRequest); System.out.println(imagesResponse.getData().get(0).getUrl()); service.shutdownExecutor(); } } ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" model "github.com/volcengine/ark-runtime-go/arkruntime/model/images" ) func main() { client := arkruntime.NewClientWithApiKey( // Agent Plan 专属 API Key:https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&OpenModelVisible=false&advancedActiveKey=agentPlan os.Getenv("AGENT_API_KEY"), // // Agent Plan 专属 Base URL arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/plan/v3"), ) ctx := context.Background() outputFormat := model.OutputFormatPNG generateReq := &model.CreateImageGenerationRequest{ Model: "doubao-seedream-5.0-lite", Prompt: model.NewOptString("充满活力的特写编辑肖像,模特眼神犀利,头戴雕塑感帽子,色彩拼接丰富,眼部焦点锐利,景深较浅,具有Vogue杂志封面的美学风格,采用中画幅拍摄,工作室灯光效果强烈。"), Size: model.NewOptString("2K"), OutputFormat: model.NewOptOutputFormat(outputFormat), ResponseFormat: model.NewOptResponseFormat(model.ResponseFormatURL), Watermark: model.NewOptBool(true), } imagesResponse, err := client.GenerateImages(ctx, generateReq) if err != nil { fmt.Printf("generate images error: %v\n", err) return } fmt.Printf("%s\n", imagesResponse.Data[0].URL.Or("")) } ``` **选项:OpenAI** ```Python import os from openai import OpenAI client = OpenAI( # Agent Plan 专属 Base URL base_url="https://ark.cn-beijing.volces.com/api/plan/v3", # Agent Plan 专属 API Key:https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&OpenModelVisible=false&advancedActiveKey=agentPlan api_key=os.getenv('AGENT_API_KEY'), ) imagesResponse = client.images.generate( model="doubao-seedream-5.0-lite", prompt="充满活力的特写编辑肖像,模特眼神犀利,头戴雕塑感帽子,色彩拼接丰富,眼部焦点锐利,景深较浅,具有Vogue杂志封面的美学风格,采用中画幅拍摄,工作室灯光效果强烈。", size="2K", output_format="png", response_format="url", extra_body={ "watermark": True, }, ) print(imagesResponse.data[0].url) ``` # 支持模型及能力 > **注意** > > Agent Plan 的套餐支持的模型不同,具体参见[支持模型及 Harness](/docs/agent-plan-personal-plan-overview#3d801f5f)。 ## 生视频模型 |模型 | |doubao-seedance-2.5【New】 |doubao-seedance-2.0 |doubao-seedance-2.0-fast |doubao-seedance-2.0-mini | |---|---|---|---|---|---| |文生视频 | |✓ |✓ |✓ |✓ | |图生视频-首帧 | |✓ |✓ |✓ |✓ | |图生视频-首尾帧 | |✓ |✓ |✓ |✓ | |多模态参考 |图片参考 |✓ |✓ |✓ |✓ | |^^ |视频参考 |✓ |✓ |✓ |✓ | |^^ |音频参考 |✓ |✗(需搭配图片/视频) |✗(需搭配图片/视频) |✗(需搭配图片/视频) | |^^ |组合参考 |✓ |✓ |✓ |✓ | \ | |* 图片 + 音频 | | | | \ | |* 图片 + 视频 | | | | \ | |* 视频 + 音频 | | | | \ | |* 图片 + 视频 + 音频 | | | | |编辑视频 | |✓ |✓ |✓ |✓ | |延长视频 | |✓ |✓ |✓ |✓ | |生成有声视频 | |✓ |✓ |✓ |✓ | |参考素材数量上限 | |50(30张图+10个视频+10个音频) |15(9张图+3个视频+3个音频) |15(9张图+3个视频+3个音频) |15(9张图+3个视频+3个音频) | |联网搜索工具 | |✓ |✓ |✓ |✓ | |样片模式 | |✗ |✗ |✗ |✗ | |返回视频产物对应的尾帧图 | |✓ |✓ |✓ |✓ | |输出视频规格 |输出分辨率 |* 480p(8bit 位深) |* 480p(8bit 位深) |* 480p(8bit 位深) |* 480p(8bit 位深) | \ | | |* 720p(8bit 位深) |* 720p(8bit 位深) |* 720p(8bit 位深) |* 720p(8bit 位深) | \ | | |* 1080p(10bit 位深) |* 1080p(8bit 位深) | | | \ | | | |* 4k(10bit 位深) | | | |^^ |输出宽高比 |21:9, 16:9, 4:3, |21:9, 16:9, 4:3, |21:9, 16:9, 4:3, |21:9, 16:9, 4:3, | \ | | | 1:1, 3:4, 9:16, adaptive | 1:1, 3:4, 9:16, adaptive | 1:1, 3:4, 9:16, adaptive | 1:1, 3:4, 9:16, adaptive | |^^ |输出时长 |4~30 秒;-1(在有效时长内由模型自动选择最佳时长) |4~15 秒;-1(在有效时长内由模型自动选择最佳时长) |4~15 秒;-1(在有效时长内由模型自动选择最佳时长) |4~15 秒;-1(在有效时长内由模型自动选择最佳时长) | |^^ |输出视频格式 |mp4, mov |mp4 |mp4 |mp4 | |抵扣系数 | |* 输出视频分辨率为 480p,720p |* 输出视频分辨率为 480p,720p |* 输入包含视频:110 |* 输入包含视频:70 | \ | | | * 输入包含视频:210 | * 输入包含视频:140 |* 输入不含视频:185 |* 输入不含视频:115 | \ | | | * 输入不含视频:350 | * 输入不含视频:230 | | | \ | | |* 输出视频分辨率为 1080p |* 输出视频分辨率为 1080p | | | \ | | | * 输入包含视频:230 | * 输入包含视频:155 | | | \ | | | * 输入不含视频:385 | * 输入不含视频:255 | | | \ | | | |* 输出视频分辨率为 4k | | | \ | | | | * 输入包含视频:80 | | | \ | | | | * 输入不含视频:130 | | | ## 生图模型 |模型 | |doubao-seedream-5-0-pro | |---|---|---| |文生图 | |✓ | |文生组图 | |暂不支持 | |单 / 多图生图 | |✓ | |单 / 多图生组图 | |暂不支持 | |交互编辑 | | ✓ | | 图层拆分 | | ✓ | |流式输出 | |暂不支持 | |联网搜索 | |暂不支持 | |模型参数 |分辨率 |1K, 1.5K, 2K | |^^ |输出格式 |png, jpeg | |^^ |提示词优化模式 |标准模式, 极速模式 | |^^ |生成数量 |支持生成单图/多张图层( 1张底图+16张图层) | |抵扣系数 |输入图 |* 第一张:免费 | \ | | |* 第二张起:10 | |^^ |输出图 |* 单图生成场景: | \ | | | * ≤ 261 万像素(分辨率 1.5K 及以下):150 | \ | | | * \> 261 万像素(分辨率 1.5K 以上):300 | \ | | |* 图层拆分场景: | \ | | | * ≤ 261 万像素(分辨率 1.5K 及以下):75 | \ | | | * \> 261 万像素(分辨率 1.5K 以上):150 | --- # 接入语音模型 Source: https://ark.volcengine.com/region:cn-beijing/docs/agent-plan-personal-voice-model 方舟 Agent Plan 提供的语音模型支持**语音合成**(TTS)和**语音识别**(ASR)两大能力,可以通过 WebSocket 和 HTTP 协议接入使用语音服务。 # 核心配置 在接入语音模型前,需要准备以下信息: * **专属 API Key**:[获取专属 API Key](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&OpenModelVisible=false&advancedActiveKey=agentPlan) ![image-20260908-203322-616.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260908-203322-616.png) * **支持的模型**: * 豆包语音合成模型2.0(doubao-seed-tts-2.0):接口中参数 `X-Api-Resource-Id` 需配置为 `seed-tts-2.0` * 豆包流式语音识别模型2.0(doubao-seed-asr-2.0):接口中参数 `X-Api-Resource-Id` 需配置为 `volc.seedasr.sauc.duration` * **接口信息**:[流式语音合成(Streaming TTS)](/docs/agent-plan-personal-voice-model#a4e97d10)、[流式语音识别(ASR Streaming)](/docs/agent-plan-personal-voice-model#f0b1ad3c) # 流式语音合成(Streaming TTS) 流式语音合成支持将文本实时转换为语音,适用于实时文本流输入、音频内容生成场景。 ## 接口信息 根据具体场景选择合适的语音合成 API,对应的参数及细节可参见对应的 API 文档。 |接口类型 |接口协议 |接口地址 |推荐场景 |API 文档 | |---|---|---|---|---| |双流接口 |WebSocket |`wss://openspeech.bytedance.com/api/v3/plan/tts/bidirection` |支持流式发送文本、流式接收音频,适合实时对话等低延迟场景。 |[WebSocket 双向流式文档](https://docs.volcengine.com/docs/6561/1329505?lang=zh) | |单流接口 |WebSocket |`wss://openspeech.bytedance.com/api/v3/plan/tts/unidirectional/stream` |一次性发送全部文本,流式接收音频片段,适合长文本播报。 |[WebSocket 单向流式文档](https://docs.volcengine.com/docs/6561/1719100?lang=zh) | |HTTP 接口 |HTTP POST |`https://openspeech.bytedance.com/api/v3/plan/tts/unidirectional` |一次性发送文本,一次性返回完整音频,适合简单场景或非实时调用。 |[HTTP Chunked 单向流式文档](https://docs.volcengine.com/docs/6561/1598757?lang=zh) | ## 代码示例 > **注意** > > * 代码示例中 `X-Api-Key` 需要设置为 [专属 API Key](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&OpenModelVisible=false&advancedActiveKey=agentPlan)。 > > * 在运行**双流接口**、**单流接口**的代码示例前,请先创建 `protocols.py` 文件。该文件封装了与语音合成服务端进行 WebSocket 通信的协议与消息处理逻辑,代码如下: > > [protocols.py](https://arkdocs.tos-cn-beijing.volces.com/files/CodingPlan/protocols.py) **选项:双流接口** ```Python import copy import json import logging import uuid import asyncio import websockets from protocols import ( EventType, MsgType, finish_connection, finish_session, receive_message, start_connection, start_session, task_request, wait_for_event, ) logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) logging.getLogger('protocols').setLevel(logging.WARNING) URL = "wss://openspeech.bytedance.com/api/v3/plan/tts/bidirection" async def main(): # 要合成的文本 text = "你好,欢迎使用语音合成服务。" # 连接服务器 headers = { "X-Api-Key": "your_api_key", "X-Api-Resource-Id": "seed-tts-2.0", "X-Api-Connect-Id": str(uuid.uuid4()), "X-Control-Require-Usage-Tokens-Return": "*" } logger.info(f"Connecting to {URL}") websocket = await websockets.connect( URL, additional_headers=headers, max_size=10 * 1024 * 1024 ) logger.info( f"Connected to WebSocket server, Logid: {websocket.response.headers['x-tt-logid']}", ) try: # 开始连接 await start_connection(websocket) await wait_for_event( websocket, MsgType.FullServerResponse, EventType.ConnectionStarted ) # 按句子分割处理 sentences = text.split("。") audio_received = False for i, sentence in enumerate(sentences): if not sentence: continue # 每次会话可以有不同的参数 base_request = { "req_params": { "text": sentence, "speaker": "zh_female_gaolengyujie_uranus_bigtts", "audio_params": { "format": "mp3", "sample_rate": 24000, "enable_timestamp": False, } }, } # 开始会话 start_session_request = copy.deepcopy(base_request) start_session_request["event"] = EventType.StartSession session_id = str(uuid.uuid4()) await start_session( websocket, json.dumps(start_session_request).encode(), session_id ) await wait_for_event( websocket, MsgType.FullServerResponse, EventType.SessionStarted ) # 逐字发送 async def send_chars(): for char in sentence: synthesis_request = copy.deepcopy(base_request) synthesis_request["event"] = EventType.TaskRequest synthesis_request["req_params"]["text"] = char await task_request( websocket, json.dumps(synthesis_request).encode(), session_id ) await asyncio.sleep(0.005) # 每个字符间隔5ms await finish_session(websocket, session_id) # 在后台开始发送字符 send_task = asyncio.create_task(send_chars()) # 接收音频数据 audio_data = bytearray() while True: msg = await receive_message(websocket) if msg.type == MsgType.FullServerResponse: if msg.event == EventType.SessionFinished: break if msg.payload: payload = json.loads(msg.payload) logger.info(f"Server response: {payload}") elif msg.type == MsgType.AudioOnlyServer: if not audio_received and len(audio_data) > 0: audio_received = True audio_data.extend(msg.payload) else: raise RuntimeError(f"TTS conversion failed: {msg}") # 等待 send_chars 完成 await send_task # 保存音频文件 if audio_data: filename = f"bidirectional_session_{i}.mp3" with open(filename, "wb") as f: f.write(audio_data) logger.info(f"Audio received: {len(audio_data)}, saved to {filename}") if not audio_received: raise RuntimeError("No audio data received") finally: # 结束连接 await finish_connection(websocket) msg = await wait_for_event( websocket, MsgType.FullServerResponse, EventType.ConnectionFinished ) if msg.payload: payload = json.loads(msg.payload) if "usage" in payload: logger.info(f"Usage: {payload['usage']}") await websocket.close() logger.info("Connection closed") if __name__ == "__main__": asyncio.run(main()) ``` **选项:单流接口** ```Python import asyncio import json import logging import uuid import websockets from protocols import EventType, MsgType, full_client_request, receive_message logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) async def main() -> None: headers = { "X-Api-Key": "your_api_key", "X-Api-Resource-Id": "seed-tts-2.0", "X-Control-Require-Usage-Tokens-Return": "*" } body = { "req_params": { "speaker": "zh_female_gaolengyujie_uranus_bigtts", "text": "这是一段较长的文本内容,单向流式会一次发送全部文本,然后流式返回音频片段。", "audio_params": { "format": "mp3", "sample_rate": 24000, } } } websocket = await websockets.connect( "wss://openspeech.bytedance.com/api/v3/plan/tts/unidirectional/stream", additional_headers=headers, max_size=10 * 1024 * 1024, ) logger.info( f"Connected to WebSocket server, Logid: {websocket.response.headers.get('x-tt-logid', '')}" ) try: await full_client_request(websocket, json.dumps(body).encode()) audio_data = bytearray() while True: msg = await receive_message(websocket) if msg.type == MsgType.FullServerResponse and msg.event == EventType.SessionFinished: break if msg.type == MsgType.AudioOnlyServer and msg.payload: audio_data.extend(msg.payload) elif msg.type == MsgType.Error: raise RuntimeError(f"TTS conversion failed: {msg}") if not audio_data: raise RuntimeError("No audio data received") with open("unidirectional_stream.mp3", "wb") as f: f.write(audio_data) logger.info(f"Audio received: {len(audio_data)}, saved to unidirectional_stream.mp3") finally: await websocket.close() logger.info("Connection closed") if __name__ == "__main__": asyncio.run(main()) ``` **选项:HTTP 接口** ```Python import requests import json import base64 import os url = "https://openspeech.bytedance.com/api/v3/plan/tts/unidirectional" def tts_http_stream(): headers = { "X-Api-Key": "your_api_key", "X-Api-Resource-Id": "seed-tts-2.0", "Content-Type": "application/json", "Connection": "keep-alive", "X-Control-Require-Usage-Tokens-Return": "*" } payload = { "req_params": { "text": "你好,这是通过 HTTP 接口合成的语音。", "speaker": "zh_female_vv_uranus_bigtts", "audio_params": { "format": "mp3", "sample_rate": 24000, } } } session = requests.Session() response = None try: response = session.post(url, headers=headers, json=payload, stream=True) audio_data = bytearray() total_audio_size = 0 for chunk in response.iter_lines(decode_unicode=True): if not chunk: continue data = json.loads(chunk) print(f"json data:{data}") if data.get("code", 0) == 0 and "data" in data and data["data"]: chunk_audio = base64.b64decode(data["data"]) audio_size = len(chunk_audio) total_audio_size += audio_size audio_data.extend(chunk_audio) if data.get("code", 0) == 20000000: break if data.get("code", 0) > 0: print(f"error response:{data}") break if audio_data: if not os.path.exists("tts"): os.makedirs("tts") output_file = os.path.join("tts/", f"tts_test.mp3") with open(output_file, "wb") as f: f.write(audio_data) print(f"file size: {len(audio_data) / 1024:.2f} KB") os.chmod(output_file, 0o644) except Exception as e: print(f"request error: {e}") finally: if response: response.close() session.close() if __name__ == "__main__": tts_http_stream() ``` # 流式语音识别(ASR Streaming) 流式语音识别支持通过 WebSocket 将实时语音流转写为文本,适用于实时转写、语音助手等场景。 ## 接口信息 根据推荐场景选择对应的模式,对应的参数及交互流程可参见对应的 API 文档。 |接口类型 |接口协议 |接口地址 |推荐场景 |API 文档 | |---|---|---|---|---| |双流接口 |WebSocket |`wss://openspeech.bytedance.com/api/v3/plan/sauc/bigmodel_async` |边发送音频边实时返回识别结果,适合实时转写、语音助手等低延迟场景。 |[大模型流式语音识别 API](https://docs.volcengine.com/docs/6561/1354869?lang=zh) | |单流接口 |WebSocket |`wss://openspeech.bytedance.com/api/v3/plan/sauc/bigmodel_nostream` |流式发送音频,待全部发送完成或超过 15s 后统一返回高精度结果,适合准确率优先的场景。 |[大模型流式语音识别 API](https://docs.volcengine.com/docs/6561/1354869?lang=zh) | ## 代码示例 > **注意** > > 代码示例中 `X-Api-Key` 需要设置为 [专属 API Key](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&OpenModelVisible=false&advancedActiveKey=agentPlan)。 **选项:双流接口** ```Python import asyncio import aiohttp import json import struct import gzip import uuid import logging import os import subprocess from typing import Optional, List, Dict, Any, Tuple, AsyncGenerator # 配置日志 logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s', handlers=[ logging.FileHandler('run.log'), logging.StreamHandler() ] ) logger = logging.getLogger(__name__) # 常量定义 DEFAULT_SAMPLE_RATE = 16000 class ProtocolVersion: V1 = 0b0001 class MessageType: CLIENT_FULL_REQUEST = 0b0001 CLIENT_AUDIO_ONLY_REQUEST = 0b0010 SERVER_FULL_RESPONSE = 0b1001 SERVER_ERROR_RESPONSE = 0b1111 class MessageTypeSpecificFlags: NO_SEQUENCE = 0b0000 POS_SEQUENCE = 0b0001 NEG_SEQUENCE = 0b0010 NEG_WITH_SEQUENCE = 0b0011 class SerializationType: NO_SERIALIZATION = 0b0000 JSON = 0b0001 class CompressionType: GZIP = 0b0001 class Config: def __init__(self): # 填入新版控制台获取的 API Key 和 Resource ID self.api_key = "your_api_key" self.resource_id = "volc.seedasr.sauc.duration" config = Config() class CommonUtils: @staticmethod def gzip_compress(data: bytes) -> bytes: return gzip.compress(data) @staticmethod def gzip_decompress(data: bytes) -> bytes: return gzip.decompress(data) @staticmethod def judge_wav(data: bytes) -> bool: if len(data) < 44: return False return data[:4] == b'RIFF' and data[8:12] == b'WAVE' @staticmethod def convert_wav_with_path(audio_path: str, sample_rate: int = DEFAULT_SAMPLE_RATE) -> bytes: try: cmd = [ "ffmpeg", "-v", "quiet", "-y", "-i", audio_path, "-acodec", "pcm_s16le", "-ac", "1", "-ar", str(sample_rate), "-f", "wav", "-" ] result = subprocess.run(cmd, check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) return result.stdout except subprocess.CalledProcessError as e: logger.error(f"FFmpeg conversion failed: {e.stderr.decode()}") raise RuntimeError(f"Audio conversion failed: {e.stderr.decode()}") @staticmethod def read_wav_info(data: bytes) -> Tuple[int, int, int, int, bytes]: if len(data) < 44: raise ValueError("Invalid WAV file: too short") # 解析WAV头 chunk_id = data[:4] if chunk_id != b'RIFF': raise ValueError("Invalid WAV file: not RIFF format") format_ = data[8:12] if format_ != b'WAVE': raise ValueError("Invalid WAV file: not WAVE format") # 解析fmt子块 audio_format = struct.unpack(' 'AsrRequestHeader': self.message_type = message_type return self def with_message_type_specific_flags(self, flags: int) -> 'AsrRequestHeader': self.message_type_specific_flags = flags return self def with_serialization_type(self, serialization_type: int) -> 'AsrRequestHeader': self.serialization_type = serialization_type return self def with_compression_type(self, compression_type: int) -> 'AsrRequestHeader': self.compression_type = compression_type return self def with_reserved_data(self, reserved_data: bytes) -> 'AsrRequestHeader': self.reserved_data = reserved_data return self def to_bytes(self) -> bytes: header = bytearray() header.append((ProtocolVersion.V1 << 4) | 1) header.append((self.message_type << 4) | self.message_type_specific_flags) header.append((self.serialization_type << 4) | self.compression_type) header.extend(self.reserved_data) return bytes(header) @staticmethod def default_header() -> 'AsrRequestHeader': return AsrRequestHeader() class RequestBuilder: @staticmethod def new_auth_headers() -> Dict[str, str]: reqid = str(uuid.uuid4()) return { "X-Api-Key": config.api_key, "X-Api-Resource-Id": config.resource_id, "X-Api-Request-Id": reqid, "X-Api-Connect-Id": reqid, "X-Api-Sequence": "-1", } @staticmethod def new_full_client_request(seq: int) -> bytes: # 添加seq参数 header = AsrRequestHeader.default_header() \ .with_message_type_specific_flags(MessageTypeSpecificFlags.POS_SEQUENCE) payload = { "user": { "uid": "demo_uid" }, "audio": { "format": "wav", "codec": "raw", "rate": 16000, "bits": 16, "channel": 1 }, "request": { "model_name": "bigmodel", "enable_itn": True, "enable_punc": True, "enable_ddc": True, "show_utterances": True, "enable_nonstream": False } } payload_bytes = json.dumps(payload).encode('utf-8') compressed_payload = CommonUtils.gzip_compress(payload_bytes) payload_size = len(compressed_payload) request = bytearray() request.extend(header.to_bytes()) request.extend(struct.pack('>i', seq)) # 使用传入的seq request.extend(struct.pack('>I', payload_size)) request.extend(compressed_payload) return bytes(request) @staticmethod def new_audio_only_request(seq: int, segment: bytes, is_last: bool = False) -> bytes: header = AsrRequestHeader.default_header() if is_last: # 最后一个包特殊处理 header.with_message_type_specific_flags(MessageTypeSpecificFlags.NEG_WITH_SEQUENCE) seq = -seq # 设为负值 else: header.with_message_type_specific_flags(MessageTypeSpecificFlags.POS_SEQUENCE) header.with_message_type(MessageType.CLIENT_AUDIO_ONLY_REQUEST) request = bytearray() request.extend(header.to_bytes()) request.extend(struct.pack('>i', seq)) compressed_segment = CommonUtils.gzip_compress(segment) request.extend(struct.pack('>I', len(compressed_segment))) request.extend(compressed_segment) return bytes(request) class AsrResponse: def __init__(self): self.code = 0 self.event = 0 self.is_last_package = False self.payload_sequence = 0 self.payload_size = 0 self.payload_msg = None def to_dict(self) -> Dict[str, Any]: return { "code": self.code, "event": self.event, "is_last_package": self.is_last_package, "payload_sequence": self.payload_sequence, "payload_size": self.payload_size, "payload_msg": self.payload_msg } class ResponseParser: @staticmethod def parse_response(msg: bytes) -> AsrResponse: response = AsrResponse() header_size = msg[0] & 0x0f message_type = msg[1] >> 4 message_type_specific_flags = msg[1] & 0x0f serialization_method = msg[2] >> 4 message_compression = msg[2] & 0x0f payload = msg[header_size*4:] # 解析message_type_specific_flags if message_type_specific_flags & 0x01: response.payload_sequence = struct.unpack('>i', payload[:4])[0] payload = payload[4:] if message_type_specific_flags & 0x02: response.is_last_package = True if message_type_specific_flags & 0x04: response.event = struct.unpack('>i', payload[:4])[0] payload = payload[4:] # 解析message_type if message_type == MessageType.SERVER_FULL_RESPONSE: response.payload_size = struct.unpack('>I', payload[:4])[0] payload = payload[4:] elif message_type == MessageType.SERVER_ERROR_RESPONSE: response.code = struct.unpack('>i', payload[:4])[0] response.payload_size = struct.unpack('>I', payload[4:8])[0] payload = payload[8:] if not payload: return response # 解压缩 if message_compression == CompressionType.GZIP: try: payload = CommonUtils.gzip_decompress(payload) except Exception as e: logger.error(f"Failed to decompress payload: {e}") return response # 解析payload try: if serialization_method == SerializationType.JSON: response.payload_msg = json.loads(payload.decode('utf-8')) except Exception as e: logger.error(f"Failed to parse payload: {e}") return response class AsrWsClient: def __init__(self, url: str, segment_duration: int = 200): self.seq = 1 self.url = url self.segment_duration = segment_duration self.conn = None self.session = None # 添加session引用 async def __aenter__(self): self.session = aiohttp.ClientSession() return self async def __aexit__(self, exc_type, exc, tb): if self.conn and not self.conn.closed: await self.conn.close() if self.session and not self.session.closed: await self.session.close() async def read_audio_data(self, file_path: str) -> bytes: try: with open(file_path, 'rb') as f: content = f.read() if not CommonUtils.judge_wav(content): logger.info("Converting audio to WAV format...") content = CommonUtils.convert_wav_with_path(file_path, DEFAULT_SAMPLE_RATE) return content except Exception as e: logger.error(f"Failed to read audio data: {e}") raise def get_segment_size(self, content: bytes) -> int: try: channel_num, samp_width, frame_rate, _, _ = CommonUtils.read_wav_info(content)[:5] size_per_sec = channel_num * samp_width * frame_rate segment_size = size_per_sec * self.segment_duration // 1000 return segment_size except Exception as e: logger.error(f"Failed to calculate segment size: {e}") raise async def create_connection(self) -> None: headers = RequestBuilder.new_auth_headers() try: self.conn = await self.session.ws_connect( # 使用self.session self.url, headers=headers ) logger.info(f"Connected to {self.url}") except Exception as e: logger.error(f"Failed to connect to WebSocket: {e}") raise async def send_full_client_request(self) -> None: request = RequestBuilder.new_full_client_request(self.seq) self.seq += 1 # 发送后递增 try: await self.conn.send_bytes(request) logger.info(f"Sent full client request with seq: {self.seq-1}") msg = await self.conn.receive() if msg.type == aiohttp.WSMsgType.BINARY: response = ResponseParser.parse_response(msg.data) logger.info(f"Received response: {response.to_dict()}") else: logger.error(f"Unexpected message type: {msg.type}") except Exception as e: logger.error(f"Failed to send full client request: {e}") raise async def send_messages(self, segment_size: int, content: bytes) -> AsyncGenerator[None, None]: audio_segments = self.split_audio(content, segment_size) total_segments = len(audio_segments) for i, segment in enumerate(audio_segments): is_last = (i == total_segments - 1) request = RequestBuilder.new_audio_only_request( self.seq, segment, is_last=is_last ) await self.conn.send_bytes(request) logger.info(f"Sent audio segment with seq: {self.seq} (last: {is_last})") if not is_last: self.seq += 1 await asyncio.sleep(self.segment_duration / 1000) # 逐个发送,间隔时间模拟实时流 # 让出控制权,允许接收消息 yield async def recv_messages(self) -> AsyncGenerator[AsrResponse, None]: try: async for msg in self.conn: if msg.type == aiohttp.WSMsgType.BINARY: response = ResponseParser.parse_response(msg.data) yield response if response.is_last_package or response.code != 0: break elif msg.type == aiohttp.WSMsgType.ERROR: logger.error(f"WebSocket error: {msg.data}") break elif msg.type == aiohttp.WSMsgType.CLOSED: logger.info("WebSocket connection closed") break except Exception as e: logger.error(f"Error receiving messages: {e}") raise async def start_audio_stream(self, segment_size: int, content: bytes) -> AsyncGenerator[AsrResponse, None]: async def sender(): async for _ in self.send_messages(segment_size, content): pass # 启动发送和接收任务 sender_task = asyncio.create_task(sender()) try: async for response in self.recv_messages(): yield response finally: sender_task.cancel() try: await sender_task except asyncio.CancelledError: pass @staticmethod def split_audio(data: bytes, segment_size: int) -> List[bytes]: if segment_size <= 0: return [] segments = [] for i in range(0, len(data), segment_size): end = i + segment_size if end > len(data): end = len(data) segments.append(data[i:end]) return segments async def execute(self, file_path: str) -> AsyncGenerator[AsrResponse, None]: if not file_path: raise ValueError("File path is empty") if not self.url: raise ValueError("URL is empty") self.seq = 1 try: # 1. 读取音频文件 content = await self.read_audio_data(file_path) # 2. 计算分段大小 segment_size = self.get_segment_size(content) # 3. 创建WebSocket连接 await self.create_connection() # 4. 发送完整客户端请求 await self.send_full_client_request() # 5. 启动音频流处理 async for response in self.start_audio_stream(segment_size, content): yield response except Exception as e: logger.error(f"Error in ASR execution: {e}") raise finally: if self.conn: await self.conn.close() async def main(): # 配置信息 audio_file_path = "your_file_path" # 替换为你的音频文件路径 ws_url = "wss://openspeech.bytedance.com/api/v3/plan/sauc/bigmodel_async" seg_duration = 200 # 每次发送的音频片段时长(ms) async with AsrWsClient(ws_url, seg_duration) as client: try: async for response in client.execute(audio_file_path): logger.info(f"Received response: {json.dumps(response.to_dict(), indent=2, ensure_ascii=False)}") except Exception as e: logger.error(f"ASR processing failed: {e}") if __name__ == "__main__": asyncio.run(main()) ``` **选项:单流接口** ```Python import asyncio import aiohttp import json import struct import gzip import uuid import logging import os import subprocess from typing import Optional, List, Dict, Any, Tuple, AsyncGenerator # 配置日志 logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s', handlers=[ logging.FileHandler('run.log'), logging.StreamHandler() ] ) logger = logging.getLogger(__name__) # 常量定义 DEFAULT_SAMPLE_RATE = 16000 class ProtocolVersion: V1 = 0b0001 class MessageType: CLIENT_FULL_REQUEST = 0b0001 CLIENT_AUDIO_ONLY_REQUEST = 0b0010 SERVER_FULL_RESPONSE = 0b1001 SERVER_ERROR_RESPONSE = 0b1111 class MessageTypeSpecificFlags: NO_SEQUENCE = 0b0000 POS_SEQUENCE = 0b0001 NEG_SEQUENCE = 0b0010 NEG_WITH_SEQUENCE = 0b0011 class SerializationType: NO_SERIALIZATION = 0b0000 JSON = 0b0001 class CompressionType: GZIP = 0b0001 class Config: def __init__(self): # 填入新版控制台获取的 API Key 和 Resource ID self.api_key = "your_api_key" self.resource_id = "volc.seedasr.sauc.duration" config = Config() class CommonUtils: @staticmethod def gzip_compress(data: bytes) -> bytes: return gzip.compress(data) @staticmethod def gzip_decompress(data: bytes) -> bytes: return gzip.decompress(data) @staticmethod def judge_wav(data: bytes) -> bool: if len(data) < 44: return False return data[:4] == b'RIFF' and data[8:12] == b'WAVE' @staticmethod def convert_wav_with_path(audio_path: str, sample_rate: int = DEFAULT_SAMPLE_RATE) -> bytes: try: cmd = [ "ffmpeg", "-v", "quiet", "-y", "-i", audio_path, "-acodec", "pcm_s16le", "-ac", "1", "-ar", str(sample_rate), "-f", "wav", "-" ] result = subprocess.run(cmd, check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) return result.stdout except subprocess.CalledProcessError as e: logger.error(f"FFmpeg conversion failed: {e.stderr.decode()}") raise RuntimeError(f"Audio conversion failed: {e.stderr.decode()}") @staticmethod def read_wav_info(data: bytes) -> Tuple[int, int, int, int, bytes]: if len(data) < 44: raise ValueError("Invalid WAV file: too short") # 解析WAV头 chunk_id = data[:4] if chunk_id != b'RIFF': raise ValueError("Invalid WAV file: not RIFF format") format_ = data[8:12] if format_ != b'WAVE': raise ValueError("Invalid WAV file: not WAVE format") # 解析fmt子块 audio_format = struct.unpack(' 'AsrRequestHeader': self.message_type = message_type return self def with_message_type_specific_flags(self, flags: int) -> 'AsrRequestHeader': self.message_type_specific_flags = flags return self def with_serialization_type(self, serialization_type: int) -> 'AsrRequestHeader': self.serialization_type = serialization_type return self def with_compression_type(self, compression_type: int) -> 'AsrRequestHeader': self.compression_type = compression_type return self def with_reserved_data(self, reserved_data: bytes) -> 'AsrRequestHeader': self.reserved_data = reserved_data return self def to_bytes(self) -> bytes: header = bytearray() header.append((ProtocolVersion.V1 << 4) | 1) header.append((self.message_type << 4) | self.message_type_specific_flags) header.append((self.serialization_type << 4) | self.compression_type) header.extend(self.reserved_data) return bytes(header) @staticmethod def default_header() -> 'AsrRequestHeader': return AsrRequestHeader() class RequestBuilder: @staticmethod def new_auth_headers() -> Dict[str, str]: reqid = str(uuid.uuid4()) return { "X-Api-Key": config.api_key, "X-Api-Resource-Id": config.resource_id, "X-Api-Request-Id": reqid, "X-Api-Connect-Id": reqid, "X-Api-Sequence": "-1", } @staticmethod def new_full_client_request(seq: int) -> bytes: # 添加seq参数 header = AsrRequestHeader.default_header() \ .with_message_type_specific_flags(MessageTypeSpecificFlags.POS_SEQUENCE) payload = { "user": { "uid": "demo_uid" }, "audio": { "format": "wav", "codec": "raw", "rate": 16000, "bits": 16, "channel": 1 }, "request": { "model_name": "bigmodel", "enable_itn": True, "enable_punc": True, "enable_ddc": True, "show_utterances": True, "enable_nonstream": False } } payload_bytes = json.dumps(payload).encode('utf-8') compressed_payload = CommonUtils.gzip_compress(payload_bytes) payload_size = len(compressed_payload) request = bytearray() request.extend(header.to_bytes()) request.extend(struct.pack('>i', seq)) # 使用传入的seq request.extend(struct.pack('>I', payload_size)) request.extend(compressed_payload) return bytes(request) @staticmethod def new_audio_only_request(seq: int, segment: bytes, is_last: bool = False) -> bytes: header = AsrRequestHeader.default_header() if is_last: # 最后一个包特殊处理 header.with_message_type_specific_flags(MessageTypeSpecificFlags.NEG_WITH_SEQUENCE) seq = -seq # 设为负值 else: header.with_message_type_specific_flags(MessageTypeSpecificFlags.POS_SEQUENCE) header.with_message_type(MessageType.CLIENT_AUDIO_ONLY_REQUEST) request = bytearray() request.extend(header.to_bytes()) request.extend(struct.pack('>i', seq)) compressed_segment = CommonUtils.gzip_compress(segment) request.extend(struct.pack('>I', len(compressed_segment))) request.extend(compressed_segment) return bytes(request) class AsrResponse: def __init__(self): self.code = 0 self.event = 0 self.is_last_package = False self.payload_sequence = 0 self.payload_size = 0 self.payload_msg = None def to_dict(self) -> Dict[str, Any]: return { "code": self.code, "event": self.event, "is_last_package": self.is_last_package, "payload_sequence": self.payload_sequence, "payload_size": self.payload_size, "payload_msg": self.payload_msg } class ResponseParser: @staticmethod def parse_response(msg: bytes) -> AsrResponse: response = AsrResponse() header_size = msg[0] & 0x0f message_type = msg[1] >> 4 message_type_specific_flags = msg[1] & 0x0f serialization_method = msg[2] >> 4 message_compression = msg[2] & 0x0f payload = msg[header_size*4:] # 解析message_type_specific_flags if message_type_specific_flags & 0x01: response.payload_sequence = struct.unpack('>i', payload[:4])[0] payload = payload[4:] if message_type_specific_flags & 0x02: response.is_last_package = True if message_type_specific_flags & 0x04: response.event = struct.unpack('>i', payload[:4])[0] payload = payload[4:] # 解析message_type if message_type == MessageType.SERVER_FULL_RESPONSE: response.payload_size = struct.unpack('>I', payload[:4])[0] payload = payload[4:] elif message_type == MessageType.SERVER_ERROR_RESPONSE: response.code = struct.unpack('>i', payload[:4])[0] response.payload_size = struct.unpack('>I', payload[4:8])[0] payload = payload[8:] if not payload: return response # 解压缩 if message_compression == CompressionType.GZIP: try: payload = CommonUtils.gzip_decompress(payload) except Exception as e: logger.error(f"Failed to decompress payload: {e}") return response # 解析payload try: if serialization_method == SerializationType.JSON: response.payload_msg = json.loads(payload.decode('utf-8')) except Exception as e: logger.error(f"Failed to parse payload: {e}") return response class AsrWsClient: def __init__(self, url: str, segment_duration: int = 200): self.seq = 1 self.url = url self.segment_duration = segment_duration self.conn = None self.session = None # 添加session引用 async def __aenter__(self): self.session = aiohttp.ClientSession() return self async def __aexit__(self, exc_type, exc, tb): if self.conn and not self.conn.closed: await self.conn.close() if self.session and not self.session.closed: await self.session.close() async def read_audio_data(self, file_path: str) -> bytes: try: with open(file_path, 'rb') as f: content = f.read() if not CommonUtils.judge_wav(content): logger.info("Converting audio to WAV format...") content = CommonUtils.convert_wav_with_path(file_path, DEFAULT_SAMPLE_RATE) return content except Exception as e: logger.error(f"Failed to read audio data: {e}") raise def get_segment_size(self, content: bytes) -> int: try: channel_num, samp_width, frame_rate, _, _ = CommonUtils.read_wav_info(content)[:5] size_per_sec = channel_num * samp_width * frame_rate segment_size = size_per_sec * self.segment_duration // 1000 return segment_size except Exception as e: logger.error(f"Failed to calculate segment size: {e}") raise async def create_connection(self) -> None: headers = RequestBuilder.new_auth_headers() try: self.conn = await self.session.ws_connect( # 使用self.session self.url, headers=headers ) logger.info(f"Connected to {self.url}") except Exception as e: logger.error(f"Failed to connect to WebSocket: {e}") raise async def send_full_client_request(self) -> None: request = RequestBuilder.new_full_client_request(self.seq) self.seq += 1 # 发送后递增 try: await self.conn.send_bytes(request) logger.info(f"Sent full client request with seq: {self.seq-1}") msg = await self.conn.receive() if msg.type == aiohttp.WSMsgType.BINARY: response = ResponseParser.parse_response(msg.data) logger.info(f"Received response: {response.to_dict()}") else: logger.error(f"Unexpected message type: {msg.type}") except Exception as e: logger.error(f"Failed to send full client request: {e}") raise async def send_messages(self, segment_size: int, content: bytes) -> AsyncGenerator[None, None]: audio_segments = self.split_audio(content, segment_size) total_segments = len(audio_segments) for i, segment in enumerate(audio_segments): is_last = (i == total_segments - 1) request = RequestBuilder.new_audio_only_request( self.seq, segment, is_last=is_last ) await self.conn.send_bytes(request) logger.info(f"Sent audio segment with seq: {self.seq} (last: {is_last})") if not is_last: self.seq += 1 await asyncio.sleep(self.segment_duration / 1000) # 逐个发送,间隔时间模拟实时流 # 让出控制权,允许接收消息 yield async def recv_messages(self) -> AsyncGenerator[AsrResponse, None]: try: async for msg in self.conn: if msg.type == aiohttp.WSMsgType.BINARY: response = ResponseParser.parse_response(msg.data) yield response if response.is_last_package or response.code != 0: break elif msg.type == aiohttp.WSMsgType.ERROR: logger.error(f"WebSocket error: {msg.data}") break elif msg.type == aiohttp.WSMsgType.CLOSED: logger.info("WebSocket connection closed") break except Exception as e: logger.error(f"Error receiving messages: {e}") raise async def start_audio_stream(self, segment_size: int, content: bytes) -> AsyncGenerator[AsrResponse, None]: async def sender(): async for _ in self.send_messages(segment_size, content): pass # 启动发送和接收任务 sender_task = asyncio.create_task(sender()) try: async for response in self.recv_messages(): yield response finally: sender_task.cancel() try: await sender_task except asyncio.CancelledError: pass @staticmethod def split_audio(data: bytes, segment_size: int) -> List[bytes]: if segment_size <= 0: return [] segments = [] for i in range(0, len(data), segment_size): end = i + segment_size if end > len(data): end = len(data) segments.append(data[i:end]) return segments async def execute(self, file_path: str) -> AsyncGenerator[AsrResponse, None]: if not file_path: raise ValueError("File path is empty") if not self.url: raise ValueError("URL is empty") self.seq = 1 try: # 1. 读取音频文件 content = await self.read_audio_data(file_path) # 2. 计算分段大小 segment_size = self.get_segment_size(content) # 3. 创建WebSocket连接 await self.create_connection() # 4. 发送完整客户端请求 await self.send_full_client_request() # 5. 启动音频流处理 async for response in self.start_audio_stream(segment_size, content): yield response except Exception as e: logger.error(f"Error in ASR execution: {e}") raise finally: if self.conn: await self.conn.close() async def main(): # 配置信息 audio_file_path = "your_file_path" # 替换为你的音频文件路径 ws_url = "wss://openspeech.bytedance.com/api/v3/plan/sauc/bigmodel_nostream" seg_duration = 200 # 每次发送的音频片段时长(ms) async with AsrWsClient(ws_url, seg_duration) as client: try: async for response in client.execute(audio_file_path): logger.info(f"Received response: {json.dumps(response.to_dict(), indent=2, ensure_ascii=False)}") except Exception as e: logger.error(f"ASR processing failed: {e}") if __name__ == "__main__": asyncio.run(main()) ``` # 接口接入建议 请求和响应参数: * 始终记录 Response Header 中的 `X-Tt-Logid`,便于问题排查。 * 为每次连接/请求生成唯一的 UUID 作为 `X-Api-Connect-Id` 或 `X-Api-Request-Id`。 # 计费说明 * **未开启超额后付费**:语音模型调用产生的费用使用套餐内 AFP 进行抵扣,不消耗其他资源包或账户余额。抵扣规则参见 [套餐内 AFP 抵扣规则](/docs/agent-plan-personal-afp-credits-billing-rules#3f4e5d6c)。 * **开启超额后付费**:在套餐周期内额度未用尽时优先抵扣套餐额度;当套餐周期内额度用尽时,无需修改任何配置信息(如 Base URL、API Key、模型名称),系统将自动切换至超额后付费模式继续使用,并产生后付费账单。具体规则与操作参见 [超额后付费规则](/docs/agent-plan-personal-over-quota-postpaid-rules#b1c2d3e4) 和 [超额后付费管理](/docs/agent-plan-personal-over-quota-postpaid-management#a1b2c3d4)。 --- # 豆包搜索 Source: https://ark.volcengine.com/region:cn-beijing/docs/agent-plan-personal-search 豆包搜索是面向大模型构建的搜索服务,通过灵活 API 形式提供多垂类、多信源搜索能力,用于补充模型训练数据截止后的最新事实、核验信息出处、获取时效性内容,提升大模型回答的知识面和可信度。 > **注意** > > 2026年6月22日,Agent Plan 产品中的联网搜索(Beta版)服务正式升级为豆包搜索服务。建议已接入联网搜索(Beta版)的用户迁移至豆包搜索。 # 能力介绍 豆包搜索支持的核心能力如下,详情参见 [豆包搜索 API 文档](https://docs.volcengine.com/docs/87772/2272953?lang=zh)。 - **网页搜索**:返回标题、来源站点、URL、摘要、正文等结构化字段,单次最多 50 条。 - **多模态搜索**:对文本 query 返回图片内容(包括图片标题、URL、尺寸与形状)。 - **权威来源过滤**:可限定返回可信度高的各类官方站点内容。 - **时间范围筛选**:支持近一天/周/月/年的快捷枚举,或自定义日期区间。 - **Query 改写**:对口语化长问题自动改写为搜索式 query,提升召回。 # 使用豆包搜索 > **注意** > > * 使用联网搜索(Beta版)的用户:可继续使用原 API Key 进行接入鉴权,但无法使用套餐内 AFP 进行抵扣。建议迁移至豆包搜索。 > * 使用豆包搜索的用户:使用 Agent Plan 专属 API Key 调用搜索服务,支持使用套餐内 AFP 进行抵扣。 ## 步骤一:订阅套餐并开通豆包搜索 1. 在 [开通管理-Agent Plan](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=agentPlan) 页面购买 Agent Plan 个人版套餐。套餐说明参见[套餐概览](/docs/agent-plan-personal-plan-overview)。 2. 在控制台单击**Harness**,开启豆包搜索的抵扣开关。 ![image-20260908-205106-259.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260908-205106-259.png) 3. 获取 Agent Plan 的专属 API Key,用于在工具中完成 Skill 或 MCP 的配置。 ![image-20260908-203322-616.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260908-203322-616.png) ## 步骤二:在工具中使用豆包搜索 目前支持通过 MCP Server 或 Skill 两种方式在工具中使用豆包搜索。具体接入方式参见 [AI 工具接入指南](https://docs.volcengine.com/docs/87772/2297384?lang=zh)。 **前置准备**:已安装 Python 3.12+、uv。其中 uv 安装命令如下: * macOS / Linux ```Bash curl -LsSf https://astral.sh/uv/install.sh | sh ``` * Windows ```Bash powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex" ``` ### Skill 接入方式 通过 Skill 方式为 AI 工具快速安装并接入豆包搜索能力。以下为常用 AI 工具的配置方案,其他工具可按需选择通过命令安装或通过对话安装方式完成豆包搜索 Skill 的安装并使用。 **选项:Claude Code** 1. 安装并配置 Claude Code,具体步骤见 [Claude Code](/docs/agent-plan-personal-claude-code)。 2. 在终端执行以下命令为 Claude Code 安装并接入豆包搜索 Skill `byted-web-search`。 ```Bash npx skills add https://skills.volces.com/skills/bytedance/agentkit-samples -s byted-web-search --agent claude-code ``` 3. 安装完成后,执行`claude`命令启动 Claude Code。 4. 通过对话方式提供 [Agent Plan 的 API Key](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=agentPlan) 完成 Skill 的配置。 5. 配置完成后,可以在 Claude Code 中使用豆包搜索能力。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/611ce1c992e94311b8bf81238199348f~tplv-goo7wpa0wc-image.image) **选项:OpenCode** 1. 安装并配置 OpenCode,具体步骤见 [OpenCode](/docs/agent-plan-personal-opencode)。 2. 在终端执行以下命令为 OpenCode 安装并接入豆包搜索 Skill `byted-web-search`。 ```Bash npx skills add https://skills.volces.com/skills/bytedance/agentkit-samples -s byted-web-search --agent opencode ``` 3. 安装完成后,执行`opencode`命令启动 OpenCode。 4. 通过对话方式提供 [Agent Plan 的 API Key](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=agentPlan) 完成 Skill 的配置。 5. 配置完成后,可以在 OpenCode 中使用豆包搜索能力。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/ffc1a572aca94751b2e930eca2e6fc7f~tplv-goo7wpa0wc-image.image) **选项:OpenClaw** 1. 安装并配置 OpenClaw,具体步骤见 [OpenClaw](/docs/agent-plan-personal-openclaw)。 2. 在终端执行以下命令为 OpenClaw 安装并接入豆包搜索 Skill `byted-web-search`。 ```Bash npx skills add https://skills.volces.com/skills/bytedance/agentkit-samples -s byted-web-search --agent openclaw ``` 3. 安装完成后,执行以下命令启动 OpenClaw。 ```Bash openclaw tui ``` 4. 在对话框中输入 [Agent Plan 的 API Key](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=agentPlan) ,完成 Skill 配置。 5. Skill 配置完成后可以在 OpenClaw 中使用豆包搜索能力。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/e4639c0deaf9464d9cefd607bb3c546c~tplv-goo7wpa0wc-image.image) **选项:Hermes Agent** 1. 安装并配置 Hermes Agent,具体步骤见 [Hermes Agent](/docs/agent-plan-personal-hermes-agent)。 2. 在终端执行以下命令为 Hermes Agent 安装并接入豆包搜索 Skill `byted-web-search`。 ```Bash npx skills add https://skills.volces.com/skills/bytedance/agentkit-samples -s byted-web-search --agent hermes-agent ``` 3. 安装完成后,启动 Hermes Agent。 4. 在对话框中输入 [Agent Plan 的 API Key](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=agentPlan) 完成 Skill 的配置。 5. 配置完成后,可以在 Hermes Agent 中使用豆包搜索能力。 ![hermes-searching.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/hermes-searching.png) ### MCP 接入方式 以下为常用 AI 工具的 MCP 接入方案,其他工具可通过对话方式让模型完成 MCP 的接入。 **选项:Claude Code** 1. 安装并配置 Claude Code,具体步骤见 [Claude Code](/docs/agent-plan-personal-claude-code)。 2. 编辑配置文件`~/.claude.json`,添加 MCP 配置。其中 `` 需替换为 [Agent Plan 的 API Key](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=agentPlan)。 ```JSON { ... "mcpServers": { "mcp-server-askecho-search-infinity": { "command": "uvx", "args": [ "--from", "git+https://github.com/volcengine/mcp-server#subdirectory=server/mcp_server_askecho_search_infinity", "mcp-server-askecho-search-infinity" ], "env": { "ASK_ECHO_SEARCH_INFINITY_API_KEY": "" } } } ... } ``` > **说明** > > 配置保存后,建议使用在线 JSON 验证工具或本地命令检查 JSON 格式是否合法。 3. 在终端执行`claude`命令启动 Claude 服务后,输入`/mcp`后看到`mcp-server-askecho-search-infinity`,说明配置成功。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/fe05e350de7743f7be11077cb906d6a3~tplv-goo7wpa0wc-image.image) 4. MCP 安装完成后即可使用豆包搜索能力。 **选项:OpenCode** 1. 安装并配置 OpenCode,具体步骤见 [OpenCode](/docs/agent-plan-personal-opencode)。 2. 编辑配置文件`~/.config/opencode/opencode.json`,添加 MCP 配置。其中 `` 需替换为 [Agent Plan 的 API Key](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=agentPlan)。 ```JSON { ... "mcp": { "mcp-server-askecho-search-infinity": { "type": "local", "enabled": true, "command": ["uvx", "--from", "git+https://github.com/volcengine/mcp-server#subdirectory=server/mcp_server_askecho_search_infinity", "mcp-server-askecho-search-infinity"], "environment": { "ASK_ECHO_SEARCH_INFINITY_API_KEY": "" } } } ... } ``` > **说明** > > 配置保存后,建议使用在线 JSON 验证工具或本地命令检查 JSON 格式是否合法。 3. 在终端执行`opencode`命令启动 OpenCode 服务后,输入`/mcp`后看到`mcp-server-askecho-search-infinity`状态为 Enabled,说明配置成功。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/2aaee036e20b472bb5ad01e426d407d0~tplv-goo7wpa0wc-image.image) 4. MCP 安装完成后即可使用豆包搜索能力。 **选项:OpenClaw** 1. 安装并配置 OpenClaw,具体步骤见 [OpenClaw](/docs/agent-plan-personal-openclaw)。 2. 在终端执行如下命令安装 MCPorter。 ```Bash npm install -g mcporter ``` 3. 编辑配置文件`~/.openclaw/openclaw.json`,添加 MCP 配置。其中 `` 需替换为 [Agent Plan 的 API Key](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=agentPlan)。 ```JSON { ... "mcp": { "servers": { "mcp-server-askecho-search-infinity": { "command": "uvx", "args": [ "--from", "git+https://github.com/volcengine/mcp-server#subdirectory=server/mcp_server_askecho_search_infinity", "mcp-server-askecho-search-infinity" ], "env": { "ASK_ECHO_SEARCH_INFINITY_API_KEY": "" } } } }, "skills": { "entries": { "mcporter": { "enabled": true } } } ... } ``` > **说明** > > 配置保存后,建议使用在线 JSON 验证工具或本地命令检查 JSON 格式是否合法。 4. 在终端执行如下命令使配置生效。 ```Bash openclaw gateway restart ``` 5. 在项目目录下,执行如下命令查看已安装的 `mcp-server-askecho-search-infinity` MCP。 ```Bash mcporter list ``` 6. 启动 OpenClaw 后,即可使用豆包搜索能力。 # 用户权益 ## 使用联网搜索(Beta版)的用户权益 2026年7月1日起,联网搜索(Beta版)的限时免费权益活动结束,每月免费额度发生变更。 - 变更前:根据下单的 Agent Plan 套餐类型发放每月免费额度,该额度专属于 Agent Plan 获取的搜索 API Key 调用。套餐到期时,下单附赠的免费搜索额度也将回收。 - Small:每月赠送 50 次免费搜索额度。 - Medium:每月赠送 150 次免费搜索额度。 - Large:每月赠送 400 次免费搜索额度。 - Max:每月赠送 800 次免费搜索额度。 - 变更后:以火山引擎主账号 ID 维度,每月发放 500 次免费额度(每月1日重置),免费额度不专属于 Agent Plan 获取的搜索 API Key 调用,在火山引擎的所有开通方式下都会被优先消耗。 ## 使用豆包搜索的用户权益 以火山引擎主账号 ID 维度,每月发放 500 次免费额度(每月1日重置),免费额度不专属于 Agent Plan 获取的 API Key 调用,在火山引擎的所有开通方式下都会被优先消耗。 # 实践教程 **[搭建个人投资助手网站](https://bytedance.larkoffice.com/wiki/CmTHwndaGi6Uask3bvRcyDYInhf)** 基于 Agent Plan + 豆包搜索 + 专业数据集,搭建一个面向普通投资者的个人投资助手网站。 **[搭建短视频网站](/docs/agent-plan-personal-practice-short-video)** 基于 Agent Plan + 豆包搜索,搭建一个抖音同款短视频网站。 **[搭建学习教育网站](/docs/agent-plan-personal-practice-education)** 基于 Agent Plan + 豆包搜索,搭建一个绘声绘色学古诗-教育网站。 # 常见问题 * 如何关闭豆包搜索服务? 豆包搜索是按量后付费型产品,当前官网无法主动关停服务。如有关停需求可提交 [工单申请](https://console.volcengine.com/workorder/create?step=1&SubProductID=P00001696)。 * 如何查看豆包搜索付费用量统计? 可以在 [豆包搜索控制台数据管理](https://console.volcengine.com/search-infinity/web-search-interface) 查看豆包搜索付费用量信息。 * 豆包搜索和联网内容插件有什么区别? 豆包搜索和联网内容插件的区别请参见 [豆包搜索产品简介](https://docs.volcengine.com/docs/87772/2272949?lang=zh)。 # 服务协议 * [豆包搜索专用条款](https://docs.volcengine.com/docs/87772/2272947?lang=zh) * [豆包搜索服务等级协议](https://docs.volcengine.com/docs/87772/2272948?lang=zh) * [Harness 能力说明和产品专用条款](/docs/harness-rules) --- # 专业数据集 Source: https://ark.volcengine.com/region:cn-beijing/docs/agent-plan-personal-datapro 专业数据集是面向 AI Agent 场景的专业搜索基础设施,通过聚合多个垂直专业领域的数据源,为 Agent 提供结构化、高质量、高可信度的专业领域的数据检索能力,有效降低 Agent 执行过程中出现幻觉、数据来源不明确等风险。 本文将介绍购买 Agent Plan 套餐后,如何在 AI 工具中通过 MCP Server 接入并使用专业数据集。 # 能力介绍 专业数据集适用于 Agent 在专业垂类场景下进行数据查询与补充。服务提供了 Query 的解析与路由能力,可根据 Agent 传入的 Query 判断适用的专业数据类型并进行智能调用,减少用户自行处理与判断需要调用数据类型的操作行为,提高数据调用的准确性。 目前,专业数据集支持以下数据类型: | 数据类型 | 能力说明 | 使用场景 | 调用限制 | |---|---|---|---| | 金融数据库 | 涵盖全球股票、期货,国内期权、债券、基金等各类上市品种基本资料、财务数据、日频行情信息、盈利预测、技术形态等各类分析指标等数据。 | 使用场景:Query 中包含股票代码或上市公司名称,以及金融指标相关描述时,专业数据集会主动路由调用金融数据库服务查询数据。 | 单次查询最多可查 3 只股票/标的/实体。 | \ | | | 推荐用法:在 Query 中明确调用或提及金融数据库、明确具体股票信息与指标,避免使用模糊描述或条件描述式查询。 | | | 企业工商数据库 | 覆盖国内全量企业,可提供基本信息、经营状况、知识产权等维度的企业工商数据。 | 使用场景:Query 中包含明确的公司名称,以及基本信息/经营情况/知识产权等描述时,专业数据集会主动路由调用企业工商数据。 | 单次查询最多可查 5 家公司的详细工商信息。 | \ | | | 推荐用法:在 Query 中明确调用或提及企业工商数据,明确的公司名称或统一信用代码,避免使用简称查询。 | | | 企业风险数据库 | 覆盖国内全量企业,可提供企业相关的司法诉讼、行政处罚等企业异常与风险相关信息数据。 | 使用场景:Query 中包含明确的公司名称,以及经营风险/司法案件/行政处罚等描述时,专业数据集会主动路由调用企业风险数据库。 | 单次查询最多可查 5 家公司的风险信息情况。 | \ | | | 推荐用法:在 Query 中明确调用或提及企业风险数据(司法诉讼/行政处罚等),明确的完整公司名称或统一信用代码,避免使用简称查询。 | | | 科研学术数据搜索服务 | 提供海外英文学术论文的全网搜索服务,覆盖主流学术论文、科研期刊相关网站,基于关键词提供搜索命中的论文标题、论文所在链接、链接摘要、发表时间、作者等丰富的数据字段。 | 使用场景:Query 中包含论文、文献、期刊、学科等与学术载体有关名词时,专业数据集会主动路由调用科研学术数据搜索服务。 | 单次查询最多返回 49 篇相关内容与文章。 | \ | | | 推荐用法:在 Query 中明确调用或提及科研学术数据搜索、想要搜索的学科或方向。 | | | 中国汽车车型配置库 | 覆盖国内全量除平行进口车以外的全部在售车型,提供基本参数、车身、发动机、电机、底盘、安全、功能、灯光、互联、座舱等一系列车辆配置字段 400 余个,可用于汽车领域的车型比对、选车参考、行业调研等场景。 | 使用场景:Query 中包含车辆配置/汽车配置/车型配置/汽车参数/汽车品牌+型号+配置等有关名词或描述时,专业数据集会主动路由调用中国汽车车型配置库。 | 单次查询可支持跨品牌、车系,查询最多 5 款车型的详细配置信息。 | \ | | | 推荐用法:在 Query 中明确调用或提及汽车车型配置库,或具体某个品牌的车系车型详细配置与情况。 | | | 中国汽车品牌销量数据 | 提供 23 年至今全国在售品牌的车辆销量数据,区域最细颗粒度可到地级市,提供具体品牌车系的当月销售量数据,以及对应的车辆使用性质、所有权等信息,可用于汽车领域的市场调研与分析场景。 | 使用场景:Query 中包含汽车品牌+销量/汽车车型+销量等有关名词时,专业数据集会主动路由调用中国汽车品牌销量数据服务。 | 单次查询可支持 3 个车系/车型指定区域的 6 个月的数据。 | \ | | | 推荐用法:在 Query 中明确调用或提及汽车品牌销量数据,想要查询具体汽车品牌+车系+区域+时间范围的明确条件。 | | | 宏观经济数据库 | 融合国家与各省市统计局公开数据、国内各协会公开数据、世界银行公开数据集、IMF 公开数据集等宏观经济类型数据,支持时序筛选、类型筛选、地域筛选等多种形式,可用于国内外宏观经济分析、产业领域市场调研等场景。 | 使用场景:Query 中包含宏观/经济/市场/各类产业与产业链等有关名词时,专业数据集会主动路由调用宏观经济数据库。 | 单次查询最多返回 10 个指标的多区域多时序数据。 | \ | | | 推荐用法:在 Query 中明确调用或提及宏观经济数据库,想要查询与使用的产业链、产业、国家宏观指标。 | | | 元典法律法规数据集 | 覆盖从中央到地方的法律法规、司法解释、行政法规、监察法规、部门规章、地方性法规等各级各类规范性文件600多万条。提供法条级语义检索与法条、法规双层详情,含时效性、效力级别、发布/实施日期、发文字号、发布部门等字段;可用于合规要求核查、法律依据检索、法条原文引用等场景。 | 使用场景:Query 中包含法源实体词(法条、法规、条例、办法、规定、细则、司法解释、部门规章、地方性法规,或具体法律名称)/条号引用(「第X条」「第X款」「第X项」等条文定位表达)/规范性问句(「……是否合法」「……的法律依据是什么」「……应当如何处罚」)/时效性追问(「XX法现在还有效吗」「XX条例什么时候实施」「XX规定最新版本」)有关内容时,专业数据集会主动路由调用元典法律法规数据集。 | 单次查询最多返回10条法条检索结果,其中1条补充法条详情;明确查询法规全文或完整内容时,最多返回1部法规详情,若返回内容超出3万字符时,会提供附有完整内容的url链接方便模型阅读与处理。 | \ | | | 推荐用法:在 Query 中明确调用或提及法律法规数据库、想要查询的具体法规名称、法条名称等内容。 | | | 元典司法案例数据集 | 收录全国各级人民法院公开裁判文书 1.8 亿余篇,覆盖民事、刑事、行政等全案件类别,并独家收录最高人民法院发布的指导性案例、典型/参考案例等权威案例。提供案例级语义检索与案例全文详情,含案号、法院、案由、审判程序、结案日期、争议焦点、裁判分析过程、判决结果、援引法条等字段;可用于类案检索、裁判倾向参考、争议焦点归纳等场景。 | 使用场景:Query 中包含案例实体词(案例、判例、判决、裁定、案号、裁判文书、指导性案例、典型案例、公报案例、类案)/案号格式/裁判尺度类问句(「法院一般怎么判」「判赔金额一般多少」「类似案件的裁判观点」「有没有支持这个诉求的判例」)/审判要素组合(法院名称 / 案由 / 审级 + 检索动词,如「北京三中院 知识产权 二审 判决」)有关内容时,专业数据集会主动路由调用元典司法案例数据集。 | 单次查询支持最多返回10个案例基本信息与3个案例详情全文。 | \ | | | 推荐用法:在 Query 中明确调用或提及司法案例数据集、提到具体场景下的司法判断参考与建议,或提及司法案例数据以及列出想要查询的司法案例相关关键词或明确案号。 | | | 法律幻觉校验服务 | 针对模型应用生成的法律文书进行综合性检测,或人工文书的复核环节,自动抽取文本中引用的法规、法条、案号,逐条与元典权威库原文比对,核验真实性(是否存在)、时效性(是否现行有效)、语义一致性(条文内容是否引准),输出「一致 / 不一致 / 未命中」判定及可点击溯源的权威原文。事前可嵌入 AI 生成流程做输出前拦截,事后可一键复核人写的文书。 | 使用场景:Query 中包含校验动词与法律引用文本(核实 / 校验 / 核查 / 复核 / 查证 / check / 「引用对不对」「有没有编错法条」「是不是幻觉」,且 query 中携带待校验正文)、文书审阅意图(「帮我看看这份法律意见书里的引用」「检查合同审查意见中的法条依据」「这段是 AI 写的,验证一下引用」)等有关内容时,专业数据集会主动路由调用法律幻觉校验服务。 | 单次支持校验最多2万字符,最少50字符,传入字符数越多时,返回的时间会越长。 | \ | | | 推荐用法:在 Query 中明确调用或提及法律幻觉校验服务,并且需要在校验的文本内容中有明确的法规、法条、司法案例的引用描述。 | | \ | | | | 该专业数据服务因单次调用价格较高,所以默认关闭,若明确需要使用,请进入 [专业数据集管理后台](https://console.volcengine.com/high-quality-dataset/management/data-pro) 进行开启。 | \ | | | | | | 其他专业数据搜索服务 | 当 Query 解析后不属于平台内其他垂类专业数据集时,提供兜底的数据检索服务。 | 使用场景:当 Query 无明显意图可以匹配上述垂类专业数据集时,专业数据集才会路由到其他专业数据搜索服务。 | 单次查询最多返回 20 条相关内容。 | \ | | | 推荐用法:若 Query 或目标不在垂类专业数据集列表中,建议优先调用其他 Harness 服务而非本专业数据集。 | | 针对不同数据类型的 Query 及返回结果示例如下: **选项:金融数据库** * Query示例:002594 股票 K 线形态分析 返回结果: ``` { "code": 0, "msg": "success", "trace_id": "ac3e8789a5884d0e859ccd40134cdd8c", "tool": "dataPro_search", "query": "002594 股票 K 线形态分析", "total": 1, "items": [ { "查询代码": "002594.SZ", "table": { "连涨天数": [2], "连跌天数": [0], "创历史新高": [false], "创历史新低": [false], ... } } ] } ``` * Query示例:比亚迪 ROE 盈利水平 返回结果: ``` { "code": 0, "msg": "success", "trace_id": "d4bd28f151f64e7f83d7ae4381c3b5a9", "tool": "dataPro_search", "query": "比亚迪 ROE 盈利水平", "total": 1, "items": [ { "查询代码": "002594.SZ", "table": { "净资产收益率ROE(平均,同花顺计算)": [1.6464], "净资产收益率ROE(加权,公布值)": [1.65], "净资产收益率ROE(摊薄,公布值)": [1.6344], ... } } ] } ``` * Query示例:五粮液季度业绩季报数据 返回结果: ``` { "code": 0, "msg": "success", "trace_id": "16a4b22217814c4a8b9ac9ed5e225465", "tool": "dataPro_search", "query": "五粮液季度业绩季报数据", "total": 1, "items": [ { "查询代码": "000858.SZ", "table": { "定期报告实际披露日期": ["20260430"], "定期报告预计披露日期": ["20260430"], "定期报告最新报告期": ["20260331"], ... } } ] } ``` **选项:科研学术数据搜索服务** * Query示例:碳中和 课题 返回结果: ``` { "code": 0, "msg": "success", "trace_id": "c4e123cc1fed406297b721aefba08b8d", "tool": "dataPro_search", "query": "碳中和 课题 学位论文 硕士 博士 研究资料 双碳 碳达峰 碳排放 绿色低碳 能源转型 综述", "total": 5, "items": [ { "name": "Continuous extraction and continuous backfill for gaseous and mineralized dual CO2 sequestration and water-preserving coal mining", "url": "https://link.springer.com/content/pdf/10.1007/s40948-025-00957-z.pdf", "date_published": "2025-01-01T08:00:00.0000000", "snippet": "… carbon emissions. FA require less energy to process compared to cement. FA-based backfills exhibit 30–50% lower embodied energy than ordinary Portland cement systems (Zhang et …", "abstract": "Abstract This study presents an innovative dual CO2 sequestration (DCS) method by ….", "extra_data": { "authors": "Y Xu, L Ma, L Wang, I Ngo, Y Wang", "cite_by": 6, ... } }, ... ] } ``` * Query示例:自动驾驶技术 返回结果: ``` { "code": 0, "msg": "success", "trace_id": "7010deba04d04801a456499501eeeec2", "tool": "dataPro_search", "query": "自动驾驶技术 发表文献 综述 研究论文 感知 规划 控制 多传感器融合 端到端驾驶 2024 2025", "total": 5, "items": [ { "name": "Multimodal End-to-End Autonomous Driving", "url": "https://arxiv.org/pdf/1906.03199", "date_published": "2020-08-11T00:00:00.0000000", "snippet": ", J. Yu, J. Cai, and J. Luo, “End-to-end multi- modal multi-task vehicle control for self-driving cars with visual per- ceptions,” in Proc", "abstract": "A crucial component of an autonomous vehicle (AV) is the artificial\\nintelligence (AI) is able to drive …", "extra_data": { "authors": "Yi Xiao,Felipe Codevilla,Akhil Gurram,Onay Urfalioglu,Antonio M. Lopez,Yi Xiao,Felipe Codevilla,Akhil Gurram,Onay Urfalioglu,Antonio M. Lopez", "cite_by": 254, ... } }, ... ] } ``` **选项:中国汽车车型配置库** * Query示例:理想 L9 Ultra 版车身尺寸、发动机、底盘完整配置详情调取 返回结果: ``` { "code": 0, "msg": "success", "trace_id": "491a0591a5464e1b8f510be35de10aa5", "dataset_type": "vehicle_config", "items": [ { "车型信息": { "品牌": "理想汽车", "车系": "理想L9", "版本": "Ultra版", "车身结构": "5门6座SUV", "座位布局": "2+2+2六座布局", "定位": "大型增程式SUV", "指导价区间": "43.00-50.98万元", "2026款Ultra指导价": "45.98万元" }, "配置参数": { "动力系统": { "发动机/增程器": "1.5T四缸增程器,采用缸内直喷技术,需加注95号燃油", "驱动形式": "双电机四驱,前感应异步电机、后永磁同步电机", ... }, "底盘配置": { "悬挂结构": "前双叉臂独立悬架、后多连杆/五连杆独立悬架", "悬挂配置": "全系标配双腔双阀空气悬架+CDC可变阻尼减震器,搭载第三代魔毯智能悬挂系统" }, ... } } ], "hint": "" } ``` **选项:中国汽车品牌销量数据** * Query示例:2022 年 12 月比亚迪汉 EV 全国销量 返回结果: ``` { "code": 0, "msg": "success", "trace_id": "f455b82aa1ea4fc480677107138ffa5c", "dataset_type": "vehicle_sales", "items": [ { "查询条件": { "统计时间": "2022年12月", "车型": "比亚迪汉EV", "地域": "全国" }, "销售数据": [ { "销量数值": "13438辆", "统计口径": "厂家零售/交付", "环比变化": "0.4%", "上月销量": "13383辆", "2022年累计销量": "144665辆" }, { "其他参考数据": "2022年12月比亚迪汉家族总销量30043辆,其中汉DM销量16605辆" } ] } ], "hint": "" } ``` **选项:宏观经济数据库** * Query示例:2018 年第 1 季度全球玉米的美元/吨单位价格指数百分比变化 返回结果: ``` { "code": 0, "msg": "success", "trace_id": "e0a47644cda24df8871fdce330df927b", "dataset_type": "macro", "items": [ { "series_key": "PCPS|IMF.RES|G001|PMAIZMT|INDEX_PCH|q", "series_name": "全球玉米-美元/吨单位价格指数百分比变化(PCPS,IMF.RES,季度)", "source_system": "IMF", "dataset_id": "PCPS", "dataset_name": "Primary Commodity Price System", "entity_code": "G001", "entity_name": "World", "indicator_code": "PMAIZMT|INDEX_PCH", "indicator_name": "Corn, US dollars per metric tonne, Unit prices / Index, percent change", "time_raw": "2018-Q1", "time_grain": "quarter", "year": 2018, "quarter": 1, "value": 10.043051, "p_date": "20260805" }, { "series_key": "PCPS|IMF.RES|G001|PMAIZMT|INDEX_PCH|q", "series_name": "全球玉米-美元/吨单位价格指数百分比变化(PCPS,IMF.RES,季度)", "source_system": "IMF", "dataset_id": "PCPS", "dataset_name": "Primary Commodity Price System", "entity_code": "G001", "entity_name": "World", "indicator_code": "PMAIZMT|INDEX_PCH", "indicator_name": "Corn, US dollars per metric tonne, Unit prices / Index, percent change", "time_raw": "2018-Q2", "time_grain": "quarter", "year": 2018, "quarter": 2, "value": 5.792173, "p_date": "20260805" } ], "hint": "" } ``` **选项:元典法律法规数据集** * Query示例:《中华人民共和国民法典》第一千零四十三条如何规定 返回结果: ``` { "code": 0, "msg": "success", "trace_id": "0f00126c1b764ab49bcf6d9891a01acb", "dataset_type": "legal_regulation", "items": [ { "article_id": "55dceb7d83a1c90e3fe9c141b1118193_1043", "regulation_id": "55dceb7d83a1c90e3fe9c141b1118193", "regulation_name": "中华人民共和国民法典", "article_number": "第一千零四十三条", "validity": "现行有效", "publication_date": "2020-05-28", "effective_date": "2021-01-01", "detail_level": "article", "article_detail": { "article_id": "55dceb7d83a1c90e3fe9c141b1118193_1043", "regulation_id": "55dceb7d83a1c90e3fe9c141b1118193", "article_sequence": "1043", "article_number": "第一千零四十三条", "article_name": "中华人民共和国民法典第一千零四十三条", "regulation_name": "中华人民共和国民法典", "content": "家庭应当树立优良家风,弘扬家庭美德,重视家庭文明建设。 \\n  夫妻应当互相忠实,互相尊重,互相关爱;家庭成员应当敬老爱幼,互相帮助,维护平等、和睦、文明的婚姻家庭关系。", "content_type": "法条", "validity": "现行有效", "effect_level": "法律", "effect_sublevel": "法律", "publication_date": "2020-05-28", "effective_date": "2021-01-01", "extensions": { "_score": 1.0 } }, "regulation_detail": { "regulation_id": "55dceb7d83a1c90e3fe9c141b1118193", "regulation_name": "中华人民共和国民法典", "document_type": "法规", "validity": "现行有效", "effect_level": "法律", "effect_sublevel": "法律", "publication_date": "2020-05-28", "effective_date": "2021-01-01", "document_number": "中华人民共和国主席令第45号", "issuing_authorities": [ "全国人民代表大会" ] }, "effect_level": "法律", "effect_sublevel": "法律" } ], "hint": "", "requested_count": 1, "returned_count": 1, "query_info": { "detail_status": "available" } } ``` * Query示例:请查询《最高人民法院关于审理道路交通事故损害赔偿案件适用法律若干问题的解释》的法规全文内容 返回结果: ``` { "code": 0, "msg": "success", "trace_id": "6c26e57e887a4d019335feeea9132bc2", "dataset_type": "legal_regulation", "items": [ { "regulation_id": "3c3027d48164a02684cfffdb8cdb05a3", "regulation_name": "最高人民法院关于审理道路交通事故损害赔偿案件适用法律若干问题的解释(2020修正)", "validity": "现行有效", "publication_date": "2020-12-29", "effective_date": "2021-01-01", "detail_level": "regulation_full", "regulation_detail": { "regulation_id": "3c3027d48164a02684cfffdb8cdb05a3", "regulation_name": "最高人民法院关于审理道路交通事故损害赔偿案件适用法律若干问题的解释(2020修正)", "document_type": "法规", "validity": "现行有效", "effect_level": "司法解释", "effect_sublevel": "高法司法解释", "publication_date": "2020-12-29", "effective_date": "2021-01-01", "document_number": "法释〔2020〕17号", "issuing_authorities": [ "最高人民法院" ], "content": "最高人民法院关于审理道路交通事故损害赔偿案件适用法律若干问题的解释 \\n  (2012年9月17日由最高人民法院审判委员会第1556次会议通过,..." }, "effect_level": "司法解释", "effect_sublevel": "高法司法解释" } ], "hint": "", "requested_count": 1, "returned_count": 1, "query_info": { "detail_status": "available" } } ``` **选项:元典司法案例数据集** * Query示例:交通事故中车辆贬值损失法院一般怎么判 返回结果: ``` { "code": 0, "msg": "success", "trace_id": "a1b9b15657b84f8389046eb15cf16fda", "dataset_type": "legal_case", "items": [ { "case_id": "d11876668e907b33a058e4665ca5af03", "case_number": "(2024)粤17民终689号", "title": "谭某军、中国某某财产保险股份有限公司阳江中心支公司等机动车交通事故责任纠纷民事二审民事判决书", "court": "广东省阳江市中级人民法院", "decision_date": "2024-05-28", "detail_level": "case", "case_detail": { "case_id": "d11876668e907b33a058e4665ca5af03", "case_number": "(2024)粤17民终689号", "title": "谭某军、中国某某财产保险股份有限公司阳江中心支公司等机动车交通事故责任纠纷民事二审民事判决书", "detail_type": "普通案例", "court": "广东省阳江市中级人民法院", "case_category": "民事案件", "case_type": "民事二审案件", "trial_procedure": "二审案件", "document_type": "判决书", "causes": [ "机动车交通事故责任纠纷" ], "decision_date": "2024-05-28", "province": "广东", "city": "阳江市", "cited_laws": [ "《中华人民共和国民事诉讼法》第一百七十七条第一款第(一)项" ], "content": "广东省阳江市中级人民法院\\n民事判决书\\n(2024)粤17民终689号\\n上诉人(原审原告):谭某军,男,1972年2月25日出生,...", "dispute_focus": "争议焦点1:谭某军请求赔偿事故车辆的贬值损失是否有法律依据。", "parties": "上诉人(原审原告):谭某军,男,1972年2月25日出生,汉族,住广东省阳江市阳东区。\\n委托诉讼代理人:刘常斌,广东众君法律师事务所律师。\\n委托诉讼代理人:郑某铭,广东众君法律师事务所实习人员。\\n被上诉人(原审被告):中国某某财产保险股份有限公司阳江中心支公司。住所地:广东省阳江市江城区\\n负责人:谢某桂。\\n委托诉讼代理人:李某君。\\n被上诉人(原审被告):陆某徐,男,1986年12月18日出生,汉族,户籍所在地:广东省阳江市江城区。", "litigation_record": "上诉人谭某军因与被上诉人中国某某财产保险股份有限公司阳江中心支公司(以下简称某某保险阳江支公司)、陆某徐机动车交通事故责任纠纷一案,不服广东省阳江市阳东区人民法院(2023)粤1704民初3005号民事判决,向本院提起上诉,本院于2024年2月29日立案受理后,依法组成合议庭审理了本案。本案现已审理终结。", "basic_facts": "谭某军向一审法院提出诉讼请求:1.判令某某保险阳江支公司赔偿谭某军的汽车维修费41740元,陆某徐承担连带责任;2.案件诉讼费用由某某保险阳江支公司、陆某徐共同承担。诉讼过程中,谭某军变更其第1项诉讼请求为:判令某某保险阳江支公司赔偿谭某军的汽车贬值损失(暂定为25000元,具体以评估为准),陆某徐承担连带责任。...", "evidence": "二审期间,双方当事人均未向本院提交新证据。", "defense": "某某保险阳江支公司答辩称:根据第三者保险条款,谭某军请求的车辆贬值损失属于保险条款免赔内容,某某保险阳江支公司不承担赔偿责任。\\n陆某徐答辩称,对一审判决没有意见,请求驳回谭某军的上诉请求。", "accusation": "谭某军不服一审判决,提出上诉请求:1.撤销一审判决,判令某某保险阳江支公司、陆某徐赔偿谭某军粤QF1****的车辆贬值损失25000元(具体以评估为准);2.本案一审、二审诉讼费用...", "trial_findings": "本院经审理查明,一审查明的基本事实属实,本院予以确认。", "reasoning": "本院认为:本案是机动车交通事故责任纠纷,综合双方的诉辩意见,本案二审双方争议焦点是:谭某军请求赔偿事故车辆的贬值损失是否有法律依据。\\n车辆贬值损失一般指机动车发生交通事故造成损毁,虽经修理恢复了原有的使用功能,但车辆仍存在因隐蔽技术瑕疵或交换价值降低而造成的损失。涉案车辆的贬值损失并不属于《最高人民法院关于审理道路交通事故损害赔偿案件适用法律若干问题的解释》第十二条所明确列明的赔偿范围,实践中,受损车辆事发前的使用年限、事发后的修理费用、修理后的组成部件更新和车辆性能恢复等情况,均是判断车辆贬值损失应否赔偿的重要参考因素。本案中,案涉车辆粤QF1****小型汽车系谭某军自有车辆,而非待售的新车或明确用于交易目的的车辆。该车辆在事故中受损,但已维修完毕,且维修完成后未对车辆的使用寿命、车辆结构稳定、驾驶安全等涉及重要性能或重要部件造成影响,故一审判决对涉案车辆贬值损失不予支持,并无不妥,本院应予维持。\\n综上所述,谭某军上诉理据不充分,上诉请求不能成立,本院不予支持。一审判决认定事实清楚,适用法律和处理正确,本院予以维持。依照《中华人民共和国民事诉讼法》第一百七十七条第一款第一项的规定,判决如下:", "judgment_result": "驳回上诉,维持原判。\\n二审案件受理费425元,由谭某军负担。\\n本判决为终审判决。", "document_end": "审判长李桥 审判员张振雄 审判员阮超颖 二〇二四年五月二十八日 法官助理陈肖玲 书记员陈秋瑜", "judges": [ { "name": "张振雄", "role": "审判员" }, { "name": "阮超颖", "role": "审判员" }, { "name": "李桥", "role": "审判长" } ], "lawyers": [ { "name": "刘常斌", "law_firm": "广东众君法律师事务所" } ], "extensions": { "ahs": [ "(2023)粤1704民初3005号" ], "jafs": "维持" } } } ], "hint": "", "requested_count": 1, "returned_count": 1, "query_info": { "detail_status": "available" }, "data_notice": "返回内容为上游整理后的结构化案例内容,不等同于原始裁判文书逐字全文,请勿逐字引用。" } ``` **选项:法律幻觉校验服务** * Query示例:请进行法律幻觉校验,待校验正文:《中华人民共和国劳动合同法》第三十九条规定劳动者严重违反规章制度时,用人单位可以解除劳动合同。本意见认为公司可以据此立即解除劳动关系,并且无需支付经济补偿,请逐项核对法规名称、条号和结论。 返回结果: ``` { "code": 0, "msg": "success", "trace_id": "bbae5084d47a41cda953f303dc0a538a", "dataset_type": "legal_hallucination", "items": [ { "summary": { "status": "no_issues_found", "reference_count": 1, "regulation_count": 1, "case_count": 0, "issue_count": 0 }, "regulations": [ { "regulation_name": "《中华人民共和国劳动合同法》", "article_number": "第三十九条", "content": "《中华人民共和国劳动合同法》第三十九条规定劳动者严重违反规章制度时,用人单位可以解除劳动合同。", "regulation_id": "8dbe9848-c854-4eb5-8016-de68d1f82cc4", "think_tank_content": "【用人单位单方解除劳动合同(过失性辞退)】劳动者有下列情形之一的,用人单位可以解除劳动合同: \\n(一)在试用期间被证明不符合录用条件的; \\n(二)严重违反用人单位的规章制度的; \\n(三)严重失职,营私舞弊,给用人单位造成重大损害的; \\n(四)劳动者同时与其他用人单位建立劳动关系,对完成本单位的工作任务造成严重影响,或者经用人单位提出,拒不改正的; \\n(五)因本法第二十六条第一款第一项规定的情形致使劳动合同无效的; \\n(六)被依法追究刑事责任的。", "validity_status": "现行有效", "semantic_compare": { "conclusion": "一致", "similarity": 95, "explanation": "侧A仅概括了第三十九条中‘严重违反用人单位的规章制度’这一项情形,并表述用人单位可以解除劳动合同;该要点在侧B第(二)项中有明确对应,且未引入冲突或额外要件。", "key_points": [ "劳动者严重违反规章制度", "用人单位可以解除劳动合同" ] }, "extensions": { "article_nums": [ 39 ], "think_tank_name": "《中华人民共和国劳动合同法(2012修正)》", "publish_date": "2012-12-28", "implement_date": "2013-07-01" } } ], "cases": [], "highlighted_text": "请进行法律幻觉校验,待校验正文:《中华人民共和国劳动合同法》第三十九条规定劳动者严重违反规章制度时,用人单位可以解除劳动合同。本意见认为公司可以据此立即解除劳动关系,并且无需支付经济补偿,请逐项核对法规名称、条号和结论。" } ], "hint": "", "requested_count": 1, "returned_count": 1 } ``` # 使用专业数据集 ## 步骤一:订阅套餐并开通专业数据集 1. 在 [开通管理-Agent Plan](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=agentPlan) 页面购买 Agent Plan 个人版套餐。套餐说明参见[套餐概览](/docs/agent-plan-personal-plan-overview)。 2. 在 Agent Plan 控制台单击 **Harness**,开启专业数据集的抵扣开关。 ![image-20260908-205547-387.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260908-205547-387.png) 3. 获取用于接入专业数据集的专属 API Key,供步骤二配置使用。 ![image-20260908-203322-616.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260908-203322-616.png) ## 步骤二:在工具中使用专业数据集 目前支持通过 MCP Server 方式在工具中配置与使用专业数据集。 > **注意** > > 如果需要避免调用某个类型数据集,可以进入 [高质量数据集管理控制台](https://console.volcengine.com/high-quality-dataset/management/data-pro) 进行数据集的开关管理。 **选项:Claude Code** 1. 安装并配置 Claude Code,具体参见 [Claude Code](/docs/agent-plan-personal-claude-code)。 2. 执行以下命令添加 MCP Server。其中 `` 需替换为 [专属API Key](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=agentPlan)。 ```Bash claude mcp add --transport http datapro https://datapro.hqd.cn-beijing.volces.com/mcp \ --header "X-Agent-Plan-Key: " ``` 3. 在终端执行以下命令启动 Claude Code,然后使用专业数据集。 ```Bash claude ``` **选项:OpenClaw** 1. 安装并配置 OpenClaw,具体参见 [OpenClaw](/docs/agent-plan-personal-openclaw)。 2. 执行以下命令添加 MCP Server。其中 `` 需替换为 [专属API Key](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=agentPlan)。 ```Bash openclaw mcp set datapro '{ "url": "https://datapro.hqd.cn-beijing.volces.com/mcp", "transport": "streamable-http", "headers": { "X-Agent-Plan-Key": "" } }' ``` 3. 在终端执行以下命令使配置生效。 ```Bash openclaw gateway restart ``` 4. 在项目目录下,执行如下命令查看已安装的 `datapro` MCP。 ```Bash mcporter list ``` 5. 启动 OpenClaw 后,即可使用专业数据集。 **选项:TraeCode** 1. 安装并配置 TraeCode,具体参见 [TraeCode](/docs/agent-plan-personal-trae)。 2. 启动 TraeCode 并打开对应项目。 3. 在设置页面,选择左侧菜单 **MCP**,在 MCP 页面右上角选择**添加-手动配置**。 4. 在手动配置弹窗添加以下 MCP 配置。其中 `` 需替换为 [专属API Key](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=agentPlan)。 ```JSON { "mcpServers": { "https://datapro.hqd.cn-beijing.volces.com/mcp": { "url": "https://datapro.hqd.cn-beijing.volces.com/mcp", "headers": { "X-Agent-Plan-Key": "" } } } } ``` 5. MCP 安装完成后,在 AI 对话框选择 **Builder with MCP** 模式使用专业数据集。 **选项:Hermes Agent** 1. 安装并配置 Hermes Agent,具体参见 [Hermes Agent](/docs/agent-plan-personal-hermes-agent)。 2. 启动 Hermes Agent。 3. 通过对话形式安装 MCP 配置。其中 `` 需替换为 [专属API Key](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=agentPlan)。 ```YAML 帮我安装下面这个专业数据库MCP: mcp_servers: datapro: url: "https://datapro.hqd.cn-beijing.volces.com/mcp" transport: "http" headers: X-Agent-Plan-Key: "" ``` 4. 安装完成后,即可使用专业数据集。 **选项:OpenCode** 1. 安装并配置 OpenCode,具体参见 [OpenCode](/docs/agent-plan-personal-opencode)。 2. 配置环境变量 `AGENT_PLAN_KEY`,并将其值替换为 [专属API Key](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=agentPlan)。 ```Bash export AGENT_PLAN_KEY="" ``` 3. 编辑配置文件 `~/.config/opencode/opencode.json`,新增以下 MCP 配置。 ```JSON { "$schema": "https://opencode.ai/config.json", "mcp": { "datapro": { "type": "remote", "url": "https://datapro.hqd.cn-beijing.volces.com/mcp", "enabled": true, "headers": { "X-Agent-Plan-Key": "{env:AGENT_PLAN_KEY}" } } } } ``` 4. 启动 OpenCode 后,即可使用专业数据集。 **选项:Codex** 1. 安装并配置 Codex,具体参见 [Codex CLI](/docs/agent-plan-personal-codex)。 2. 编辑配置文件 `~/.codex/config.toml`,新增以下 MCP 配置。其中 `` 需替换为 [专属API Key](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=agentPlan)。 ```TOML [mcp_servers.datapro] url = "https://datapro.hqd.cn-beijing.volces.com/mcp" transport = "http" http_headers = { "X-Agent-Plan-Key" = "" } ``` 3. 启动 Codex 后,输入`/mcp`命令验证MCP被识别成功后,即可使用专业数据集。 # 计费说明 * **未开启超额后付费**:请求调用产生的费用使用套餐内 AFP 进行抵扣,不消耗其他资源包或账户余额。抵扣规则参见 [套餐内 AFP 抵扣规则](/docs/agent-plan-personal-afp-credits-billing-rules#e5f6a7b8)。 * **开启超额后付费**:在套餐周期内额度未用尽时优先抵扣套餐额度;当套餐周期内额度用尽时,无需修改任何配置信息(如 Base URL、API Key、模型名称),系统将自动切换至超额后付费模式继续使用,并产生后付费账单。具体规则与操作参见 [超额后付费规则](/docs/agent-plan-personal-over-quota-postpaid-rules#1a2b3c4d) 和[超额后付费管理](/docs/agent-plan-personal-over-quota-postpaid-management)。 # 实践教程 **[搭建销售团队工作台](https://bytedance.larkoffice.com/wiki/WpXuw57E0i69sHkK9DNcraEPn1c)** 基于 Agent Plan + Codex + AI Native 应用开发底座 + 豆包搜索 + 专业数据集 + Agent 记忆,把散落在飞书会话、云文档里的私域销售资料和外部专业信息,搭成一个能查公司、看档案、问历史的销售团队定制工作台。 ‌ # 服务协议 * [高质量数据集服务专用条款](https://docs.volcengine.com/docs/87646/2222216?lang=zh) * [高质量数据集服务等级协议](https://docs.volcengine.com/docs/87646/2222217?lang=zh) --- # Agent 记忆 Source: https://ark.volcengine.com/region:cn-beijing/docs/agent-plan-personal-openviking-memory 火山引擎 OpenViking Context 为 Agent Plan Harness 层提供 Agent 记忆服务。OpenViking Context 是基于 [开源 OpenViking](https://github.com/volcengine/OpenViking) 内核构建的全托管云服务,是一款面向 AI Agents 的上下文数据库,以“虚拟文件系统 + 分层上下文 + 目录递归检索 + 可观测与自迭代”为核心思想,通过将 Memory、Resource、Skill 统一抽象为文件的理念,解决 AI Agent 在执行对话和长周期任务时的复杂上下文管理难题,为 AI Agent 开发者提供结构化、可追溯且低成本的上下文工程解决方案。 # 能力介绍 OpenViking Context 适用于需要长程记忆、复杂知识管理和多 Agent 协作的各类 AI 应用场景,核心价值在于提供结构化、可迭代的上下文管理能力。 - **Agent 长期记忆升级**:作为 Agent 产品的记忆插件,为 Agent 提供记忆沉淀、检索和自进化能力,解决长周期任务中常见的遗忘和高昂成本问题。 - **全局知识资产沉淀**:支持将多个代码仓库、文档库等知识源统一导入 OpenViking Context,构建可语义检索的知识库,赋能代码助手与研发场景。 - **多 Agent 协作共享**:多个独立 Agent 可共享同一个 OpenViking Context 实例作为记忆与知识中枢,实现高效协同。 - **多租户安全隔离**:利用多租户共享与隔离能力,为团队或企业构建安全可控的知识与记忆中心,让智能体在可控的上下文环境中执行任务。 # 使用限制 - 仅支持完成了实名认证的企业用户和个人用户使用。 - 仅支持在北京地域使用 Agent Plan 套餐的 AFP 额度抵扣火山引擎 OpenViking Context 资源的使用费用。 - 仅支持 Agent Plan 个人版、OpenViking Context 个人版。 - 如果您是子账号,首次使用时需联系主账号授权 [VikingdbFullAccess](https://console.volcengine.com/iam/policymanage/System/VikingdbFullAccess) 策略。 - 火山引擎官网账号未欠费(账户余额 ≥ 0)。 # 使用 OpenViking Context ## 步骤一:订阅套餐并开通 Agent 记忆 1. 在 [开通管理-Agent Plan](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=agentPlan) 页面购买 Agent Plan 个人版套餐。套餐说明参见[套餐概览](/docs/agent-plan-personal-plan-overview)。 2. 在控制台单击**Harness**,开启 Agent 记忆的抵扣开关。 ![memory1.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/memory1.png) ## 步骤二:创建数据库 在**Harness**区域,找到 Agent 记忆卡片,单击**配置使用**进入 OpenViking Context 页面,根据页面提示开通服务并创建数据库。 > **说明** > > 创建数据库的页面左下角会展示 AFP 抵扣信息。 ![memory2.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/memory2.png) ## 步骤三:接入 Agent OpenViking Context 支持 MCP、CLI、API、SDK 接入您的自研 Agent 框架,同时对主流 Agent 框架进行生态适配。 > **说明** > > 当前文档仅展示了常用 Agent 接入步骤,更多 Agent 的接入步骤可在 [OpenViking Context 控制台](https://console.volcengine.com/vikingdb/openviking/region:openviking+cn-beijing/) 页面单击**接入 Agent**查看。 > ![image-20260619-205438-901.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260619-205438-901.png) ### 认证说明 Agent 接入 OpenViking 时,必须使用 OpenViking 的 API Key 作为唯一认证,并关联到对应的数据。 OpenViking API Key 可在 [OpenViking Context 控制台](https://console.volcengine.com/vikingdb/openviking/region:openviking+cn-beijing/) 的**用户管理**页面查看与复制。 ![image-20260619-205141-807.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260619-205141-807.png) ### 主流 Agent 集成 **选项:Claude Code** > **说明** > > **集成方式**:Plugin 接入,为 Claude Code 添加跨项目、跨会话(session)的长期记忆功能。安装完成后,每轮对话均会自动召回相关记忆并捕获新内容,无需模型主动调用任何工具。 **步骤 1:安装** ```Bash bash <(curl -fsSL https://raw.githubusercontent.com/volcengine/OpenViking/main/examples/claude-code-memory-plugin/setup-helper/install.sh) ``` 该脚本将自动检查依赖项、配置 OpenViking 连接并完成插件安装,支持重复运行(幂等操作)。 安装完成后,需在当前终端激活 claude 的封装函数(wrapper),或者直接打开一个新的终端窗口: ```Bash source ~/.openviking/openviking-repo/examples/claude-code-memory-plugin/setup-helper/wrapper.sh ``` > **说明** > > 通过自定义命令启动 Claude Code?例如包装脚本 cc-custom,或“基础命令 + 子命令”形式的多词启动器——在安装时的“Extra launch commands”一步填入(或运行脚本时传入 `OPENVIKING_CC_WRAP_EXTRA='cc-custom'`),即可让它们一并注入凭据。 使用一段时间后,即便在全新的对话中提及过往的话题,Claude Code 也能准确回忆起来。 **步骤 2:验证** ```Bash type claude ``` > **说明** > > 若输出的是一个路径而非 shell function,说明 wrapper 尚未生效,请先 `source` 那行 wrapper(或新开一个终端)再启动;否则 `claude` 会静默连到本地 127.0.0.1 且不带鉴权。 在 type claude 显示为 shell function 的终端中运行 `claude` 启动,随后: * 输入 `/plugins`:在 Installed 列表中应能找到 openviking-memory(其子项openviking MCP 应显示为已连接状态)。 * 输入`/mcp`:OpenViking 对应的条目应显示您的服务器 URL 及有效的认证信息。 * 输入 `/openviking-memory:ov`:查看服务器状态、身份信息、召回/注入的统计数据以及功能开关状态。 若插件未正常工作,可设置环境变量 `OPENVIKING_DEBUG=1`,并查看日志文件 `~/.openviking/logs/cc-hooks.log` 以排查问题。 **选项:OpenClaw** > **说明** > > **集成方式**:Plugin 接入,作为 OpenClaw 的 context engine,支持多 Agent 跨会话记忆与自迭代,通过 npm 安装助手工具一键完成配置。 **前提条件**:您已经在本地或云服务器上部署了 OpenClaw 2026.5.2 或更新版本。 **步骤 1:安装 OpenViking** 在你的 OpenClaw 的机器终端,执行以下命令以安装 OpenViking Plugin。 ```Bash openclaw plugins install clawhub:@openviking/openclaw-plugin && openclaw openviking setup ``` **步骤 2:配置信息** 根据提示配置以下信息: * Base URL:`https://api.vikingdb.cn-beijing.volces.com/openviking` * API Key:在 OpenViking Context 控制台的**用户管理**页面复制 API Key,具体参见 [认证说明](/docs/agent-plan-personal-openviking-memory#81a0c3e9)。 **步骤 3:重启 OpenClaw** 复制以下指令到 Agent 终端以重启 OpenClaw,重启后控制台将自动判断 Agent 接入状态。 ```Bash openclaw gateway restart ``` **选项:Hermes Agent** > **说明** > > **集成方式**:Hermes 官方内置 OpenViking 作为记忆提供方。无需安装插件,直接把 Hermes 指向您的 OpenViking 服务即可,记忆存储、召回和抽取均原生支持。 **步骤1:配置** 运行 Hermes 记忆配置向导: ```Bash hermes memory setup ``` 配置以下信息: * OpenViking 服务 URL: 自托管服务器 或 火山引擎 OpenViking Context * API Key: 火山引擎 OpenViking Context 时填 API Key,具体参见 [认证说明](/docs/agent-plan-personal-openviking-memory#81a0c3e9)。 * 租户 account / user / agent ID:多租户部署时使用 配置保存在 Hermes 的 `config.yaml` 和 `.env` 文件中。 **步骤2:验证** ```Bash hermes memory status ``` 配置完成后,Hermes 自动使用 OpenViking 作为长期记忆——`viking_remember`、`viking_recall` 等记忆工具即刻可用。 **选项:Codex** > **说明** > > **集成方式**:Plugin 接入,为 Codex 提供持久化的跨会话(session)记忆。一次安装即可实现:每次输入前自动召回记忆、每轮对话结束后增量捕获,并在上下文压缩前将记忆提交给抽取器。 **步骤 1:安装** ```Bash bash <(curl -fsSL https://raw.githubusercontent.com/volcengine/OpenViking/main/examples/codex-memory-plugin/setup-helper/install.sh) ``` 该脚本会自动检查依赖、配置 OpenViking 连接并注册插件。所有步骤均具有幂等性,可安全地重复执行。 安装完成后,在当前终端激活 codex 封装函数,或重新打开一个终端窗口。 ```Bash source ~/.openviking/openviking-repo/examples/codex-memory-plugin/setup-helper/wrapper.sh # 首次启动需执行 /hooks 进行一次安全审批 codex ``` > **说明** > > 通过自定义命令启动 Codex?例如包装脚本 `codex-custom`,或“基础命令 + 子命令”形式的多词启动器——在安装时的“Extra launch commands”一步填入(或运行脚本时传入 `OPENVIKING_CODEX_WRAP_EXTRA='codex-custom'`),即可让它们一并注入凭据。 **步骤 2:验证** ```Bash type codex ``` > **说明** > > 若上一步输出的是一个路径而非 `shell function`,说明 wrapper 尚未生效,请先 `source` 那行 wrapper(或新开一个终端)再启动;否则 codex 启动时拿不到 `OPENVIKING_API_KEY`,会报 `MCP server is not logged in`。 进入 Codex 后,插件将在每次输入前自动召回记忆。将环境变量 `OPENVIKING_DEBUG` 设置为 1,可将事件日志输出至 `~/.openviking/logs/codex-hooks.log。` ### CLI 接入 **选项:手动终端安装** **步骤1**:安装 OpenViking CLI 并进入配置流程 ```Bash npm i -g @openviking/cli && ov config ``` **步骤2**: 配置信息 按提示填写以下信息: - Base URL:`https://api.vikingdb.cn-beijing.volces.com/openviking` - API Key:在 OpenViking Context 控制台的**用户管理**页面复制 API Key,具体参见 [认证说明](/docs/agent-plan-personal-openviking-memory#81a0c3e9)。 **步骤3**:查看 CLI 用法 ```Bash ov --help ``` **选项:通过 AI Agent 安装** 将下方提示词复制给您的 AI 助手(Claude Code、Codex、Cursor、TraeCode 等),它会自动完成 OpenViking CLI 安装、配置和用法学习: > **说明** > > `` 需替换为 OpenViking Context 控制台的**用户管理**页面的 API Key,具体参见 [认证说明](/docs/agent-plan-personal-openviking-memory#81a0c3e9)。 ```Plain Text 请先向用户询问 OpenViking API Key,并记为 OPENVIKING_API_KEY。 请在 ~/.openviking/ovcli.conf 写入以下内容: { "url": "https://api.vikingdb.cn-beijing.volces.com/openviking", "api_key": "" } 如发现 ~/.openviking/ovcli.conf 已存在且内容冲突,请先询问用户是否备份原文件,并在得到确认后再覆盖。 请安装 OpenViking CLI: npm i -g @openviking/cli 安装完成后,请运行: ov --help 请探索 CLI 用法,并把 OpenViking CLI 的使用方式写入你的长期记忆。 ``` ### MCP 接入 **步骤1:MCP 配置** 以下为 MCP 配置示例,将 `` 替换为 OpenViking API Key,具体参见[认证说明](/docs/agent-plan-personal-openviking-memory#81a0c3e9)。 ```JSON { "mcpServers": { "ov-mcp-server": { "url": "https://api.vikingdb.cn-beijing.volces.com/openviking/mcp", "headers": { "Authorization": "Bearer " } } } } ``` **步骤2:测试 MCP 工具连通性** ```Bash ov health ``` ### SDK 接入 **步骤1:安装 OpenViking** ```Bash pip install openviking --upgrade --force-reinstall ``` **步骤2:初始化客户端** 将控制台用户管理页面中展示的 API Key 复制到你的 Agent 运行环境中,建议通过环境变量或安全配置中心进行注入,而不要直接硬编码在代码里。具体参见[认证说明](/docs/agent-plan-personal-openviking-memory#81a0c3e9)。 ```Bash export OPENVIKING_API_KEY="your-api-key" ``` ```Python import os import openviking as ov client = ov.SyncHTTPClient( url="https://api.vikingdb.cn-beijing.volces.com/openviking", api_key=os.environ["OPENVIKING_API_KEY"], agent_id="your-agent-id", # 自定义 agent_id,用于隔离 Agent 侧上下文 timeout=120.0, ) client.initialize() ``` **步骤3:写入资源** 资源写入用于把外部知识导入 OpenViking Context。SDK 可以直接接收本地文件路径、目录路径或远端 URL,并自动处理上传细节。 ```Python file_path = "your-file-path" resource_to = "your-resource-path" # e.g. viking://resources/demo/api.md reason = "your-reason" # e.g. External API documentation result = client.add_resource( path=file_path, to=resource_to, reason=reason, wait=True, ) print(result) ``` > **说明** > > * to 必须位于 viking://resources/... 作用域下。 > * 如果 path 是本地文件,SDK 会自动先上传再调用服务端接口。 > * 如果 `wait=True`,接口会等待资源处理完成后再返回,更适合导入后马上检索的场景。 > * 如果不希望阻塞,也可以使用默认异步模式,然后显式调用 `client.wait_processed()`。 **步骤4:写入记忆** 记忆写入建议通过会话方式完成。下面示例演示如何将一条用户消息写入会话,并通过提交触发后续记忆提取。 ```Python text = "your-message-text" # e.g. I am a developer session = client.create_session() session_id = session["result"]["session_id"] if "result" in session else session["session_id"] client.add_message( session_id, "user", parts=[{"type": "text", "text": text}], ) result = client.commit_session(session_id) print(result) ``` ### API 接入 如果您希望通过平台网关、工作流引擎、低代码平台直接调用接口,推荐使用 HTTP API 接入。 **步骤1:写入资源** 对于 HTTP 接口,本地文件不能直接作为path传给 `/api/v1/resouces`,需先上传本地文件获取temp_file_id,再调用 `/api/v1/resouces`。 ```Python import json from pathlib import Path import requests url = "https://api.vikingdb.cn-beijing.volces.com/openviking" api_key = "your-api-key" #可在用户管理页面复制 agent_id = "your-agent-id" #自定义agent-id file_path = Path("your-file-path") # e.g. test.txt resource_to = "your-resource-path" # e.g. viking://resources/demo/test.txt reason = "your-reason" # e.g. External API documentation headers = { "Content-Type": "application/json", "Authorization": "Bearer " + api_key, "X-OpenViking-Agent": agent_id, } def post_json(path: str, payload: dict, timeout: float): response = requests.post( f"{url}{path}", headers=headers, json=payload, timeout=timeout, ) response.raise_for_status() return response.json() with file_path.open("rb") as file: result = requests.post( f"{url}/api/v1/resources/temp_upload", headers={ "Authorization": "Bearer " + api_key, "X-OpenViking-Agent": agent_id, }, files={"file": (file_path.name, file, "application/octet-stream")}, timeout=120.0, ) result.raise_for_status() result = result.json() print(json.dumps(result, ensure_ascii=False, indent=2)) temp_file_id = result["result"]["temp_file_id"] result = post_json( "/api/v1/resources", { "temp_file_id": temp_file_id, "source_name": file_path.name, "to": resource_to, "reason": reason, }, 120.0, ) print(json.dumps(result, ensure_ascii=False, indent=2)) ``` **步骤2:写入记忆** 通过 API 写入记忆时,同样遵循“创建会话 - 添加消息 - 提交会话”的流程。 ```Python import json import requests url = "https://api.vikingdb.cn-beijing.volces.com/openviking" api_key = "your-api-key" #可在【用户管理页面】复制 agent_id = "your-agent-id" #自定义agent-id text = "your-message-text" # e.g. I am a developer headers = { "Content-Type": "application/json", "Authorization": "Bearer " + api_key, "X-OpenViking-Agent": agent_id, } def post_json(path: str, payload: dict, timeout: float): response = requests.post( f"{url}{path}", headers=headers, json=payload, timeout=timeout, ) response.raise_for_status() return response.json() session = post_json("/api/v1/sessions", {}, 360.0) session_id = session["result"]["session_id"] post_json( f"/api/v1/sessions/{session_id}/messages", { "role": "user", "parts": [{"type": "text", "text": text}], }, 360.0, ) result = post_json( f"/api/v1/sessions/{session_id}/commit", {"telemetry": False}, 360.0, ) print(json.dumps(result, ensure_ascii=False, indent=2)) ``` # 计费说明 - **未开启超额后付费**:请求调用产生的费用使用套餐内 AFP 进行抵扣,不消耗其他资源包或账户余额。抵扣规则参见 [套餐内 AFP 抵扣规则](/docs/agent-plan-personal-afp-credits-billing-rules#9d6f1c2a)。 - **开启超额后付费**:在套餐周期内额度未用尽时优先抵扣套餐额度;当套餐周期内额度用尽时,无需修改任何配置信息,系统将自动切换至超额后付费模式继续使用,并产生后付费账单。具体规则与操作参见 [超额后付费规则](/docs/agent-plan-personal-over-quota-postpaid-rules#6f4a2d1c) 和 [超额后付费管理](/docs/agent-plan-personal-over-quota-postpaid-management#1a2b3c4d)。 # 实践教程 **[搭建销售团队工作台](https://bytedance.larkoffice.com/wiki/WpXuw57E0i69sHkK9DNcraEPn1c)** 基于 Agent Plan + Codex + AI Native 应用开发底座 + 豆包搜索 + 专业数据集 + Agent 记忆,把散落在飞书会话、云文档里的私域销售资料和外部专业信息,搭成一个能查公司、看档案、问历史的销售团队定制工作台。 ‌ # 常见问题 * 我想保留 OpenViking 服务,仅想从 Agent Plan 抵扣切换到官网付费,要如何操作? 在 Agent Plan 页面关闭抵扣后,立即进入 [OpenViking Context 控制台](https://console.volcengine.com/vikingdb/openviking/region:openviking+cn-beijing/) 重新开通 OpenViking 商品即可。 * 我想保留 OpenViking 服务,仅想从官网付费切换到 Agent Plan 抵扣,要如何操作? 下单个人版 Agent Plan 套餐,并在 Agent Plan 页面开启抵扣即可。 * Agent Plan 额度不足且未开通超额后付费,导致服务无法使用,如何恢复? 开启超额后付费立即恢复,通过官网出账;或升级 Agent Plan 套餐扩充 AFP 额度,待下一个扣费周期扣减成功即可恢复,最长 1 小时;或升级后 oncall 客服人工恢复。 # 服务协议 - [OpenViking Context 专用条款](https://docs.volcengine.com/docs/84313/2485137?lang=zh) - [Harness 能力说明和产品专用条款](/docs/harness-rules) --- # AI Native 应用开发底座 Source: https://ark.volcengine.com/region:cn-beijing/docs/agent-plan-personal-supabase AI Native 应用开发底座基于火山引擎 Supabase 实现,作为 Agent Plan 的 Harness 为 AI 工具(Claude Code、OpenClaw、TraeCode 等)提供云端数据库与后端基础设施,使 Agent 在开发应用时可直接通过 MCP Server 或 Skill 方式调用数据库、认证、存储、边缘函数等能力,无需手动搭建后端环境。 # 能力介绍 火山引擎 Supabase,全称是 AI 原生 BaaS 平台 Supabase 版,是基于开源 Supabase 打造,100% 兼容 Supabase 开源用法,包括 PostgreSQL Database、Authentication、Storage、Edge Function、Realtime、AI 助手、API Docs 等,具备云原生服务特有的高弹性低价格等特点。基于火山引擎数据库 Serverless 架构,实现了更好可用性、性能和成本优势,可以高性价比一站式地满足用户在 AI Agent 开发构建、SaaS 服务开发、原型系统快速构建等场景的诉求。 支持的核心能力如下: * **Database**:基于 Serverless 的 PostgreSQL,支持秒级扩缩容(Scale to Zero)、数据分支管理及丰富插件。 * **Authentication**:提供完整的认证体系,支持短信/邮箱、各类第三方授权、单点登录,并允许自定义逻辑。 * **Storage**:提供对象存储服务,用于轻松管理文件的上传、下载及精细的权限控制。 * **Edge Function**:边缘函数服务,支持在靠近用户的边缘节点快速执行各类自定义服务端逻辑。 * **Realtime**:提供实时数据同步功能,支持将数据库变更结果进行实时推送与广播。 * **MCP Server**:基于 MCP 协议的专属服务,支持通过自然语言直接输入与管理各类数据库资源。 * **前端部署**:对接火山引擎 Pages,支持“推送即发布”(Push-to-Deploy)的一站式发布能力。开发者将代码推送至 Git 仓库后,平台可自动完成构建、部署和线上预览,打通"自然语言生成代码"到"应用发布"的最后一环,帮助用户降低部署运维成本,快速验证和交付应用。 # 使用限制 * 仅支持完成了实名认证的企业用户和个人用户使用。 * 仅支持在北京地域使用 Agent Plan 套餐的 AFP 额度抵扣火山引擎 Supabase 资源的使用费用。 * 首次使用时,请注意: * 如您是主账号:请为账号授权 **ServiceRoleForAIDAP** 角色。 * 如您是子账号:请联系主账号授权 **ServiceRoleForAIDAP** 角色,并为您再授予 IAM 的 **AIDAPFullAccess** 预设策略或包含 AIDAP 权限点的自定义策略。 # 使用火山引擎 Supabase ## 步骤一:订阅套餐 1. 在 [开通管理-Agent Plan](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=agentPlan) 页面购买 Agent Plan 个人版套餐。套餐说明参见[套餐概览](/docs/agent-plan-personal-plan-overview)。 2. 在控制台单击**Harness**,开启AI Native 应用开发底座的抵扣开关。 ![native.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/native.png) ## 步骤二:安装与更新 CLI - **安装** 执行以下命令,即可完成在 MCP Server、Skill 和 CLI 三种方式下的安装。 ```Bash npx @byted-supabase/cli@latest install ``` - **更新** 如安装过程中收到“A new version of Byted Supabase CLI is available”的提示,按照指引或执行以下命令即可完成更新。 ```Bash byted-supabase-cli update ``` ## 步骤三:登录 CLI ### 登录 / 初始配置 - **方式 1**:浏览器 OAuth 登录(推荐) ```Bash byted-supabase-cli login --is-agent-plan ``` - **方式 2**:用 AK/SK 配置默认 profile ```Bash byted-supabase-cli configure set --ak --sk --is-agent-plan ``` ### 企业版切换为个人版 如需从企业切换成个人版,只设置 `--is-agent-plan` 即可。 ```Bash byted-supabase-cli configure agent-plan --profile --is-agent-plan ``` > `--profile ` 用于指定已有的 profile 名称。profile 由 `configure set` 或 `login` 命令创建,直接传入名称即可。 ### 关闭 AgentPlan 默认设置 ```Bash byted-supabase-cli configure agent-plan --profile --is-agent-plan=false ``` > > `--profile ` 用于指定已有的 profile 名称。profile 由 `configure set` 或 `login` 命令创建,直接传入名称即可。 ## 步骤四:在工具中使用火山引擎 Supabase 目前支持通过 Skill、CLI、MCP Server 三种方式使用火山引擎 Supabase。 ### Skill 接入方式 通过 Skill 方式为 AI 工具快速安装并接入火山引擎 Supabase。 **选项:Claude Code** 1. 安装并配置 Claude Code,具体步骤见 [Claude Code](/docs/agent-plan-personal-claude-code)。 2. 在终端执行以下命令为 Claude Code 安装并接入火山引擎 Supabase Skill。 ```Bash npx skills add https://skills.volces.com/skills/bytedance/agentkit-samples -s byted-supabase --agent claude-code ``` 3. 安装完成后,执行 `claude` 命令启动 Claude Code。 4. 在 Claude Code 中通过自然语言使用火山引擎 Supabase 能力,具体参见 [使用自然语言管理资源](https://docs.volcengine.com/docs/87275/2105771?lang=zh)。 **选项:OpenCode** 1. 安装并配置 OpenCode,具体步骤见 [OpenCode](/docs/agent-plan-personal-opencode)。 2. 在终端执行以下命令为 OpenCode 安装并接入火山引擎 Supabase Skill。 ```Bash npx skills add https://skills.volces.com/skills/bytedance/agentkit-samples -s byted-supabase --agent opencode ``` 3. 安装完成后,执行 `opencode` 命令启动 OpenCode。 4. 在 OpenCode 中通过自然语言使用火山引擎 Supabase 能力,具体参见 [使用自然语言管理资源](https://docs.volcengine.com/docs/87275/2105771?lang=zh)。 **选项:OpenClaw** 1. 安装并配置 OpenClaw,具体步骤见 [OpenClaw](/docs/agent-plan-personal-openclaw)。 2. 在终端执行以下命令为 OpenClaw 安装并接入火山引擎 Supabase Skill。 ```Bash npx skills add https://skills.volces.com/skills/bytedance/agentkit-samples -s byted-supabase --agent openclaw ``` 3. 安装完成后,执行以下命令启动 OpenClaw。 ```Bash openclaw tui ``` 4. 在 OpenClaw 中通过自然语言使用火山引擎 Supabase 能力,具体参见 [使用自然语言管理资源](https://docs.volcengine.com/docs/87275/2105771?lang=zh)。 **选项:TraeCode** 1. 安装并配置 TraeCode,具体步骤见 [TraeCode](/docs/agent-plan-personal-trae)。 2. 在终端执行以下命令安装 `byted-supabase` Skill,安装过程中按需选择 agent。 ```Bash npx skills add https://skills.volces.com/skills/bytedance/agentkit-samples -s byted-supabase ``` 3. 安装完成后,通过 TraeCode 打开对应的项目,在**设置-技能与命令**页面确认已安装 `byted-supabase` Skill。 4. 在 TraeCode 中通过自然语言使用火山引擎 Supabase 能力,具体参见 [使用自然语言管理资源](https://docs.volcengine.com/docs/87275/2105771?lang=zh)。 ### CLI 接入方式 通过 CLI 方式可在终端直接管理 Workspace 等资源,常用命令如下: - 创建 Workspace ```Bash byted-supabase-cli projects create --is-agent-plan ``` - 查询 Workspace 列表 ```Bash byted-supabase-cli projects list ``` - 查询某个 Workspace 的详细信息 ```Bash byted-supabase-cli projects list --workspace-id ``` ### MCP 接入方式 以下为常用 AI 工具的 MCP 接入方案,其他工具可按需调整配置文件格式。 **选项:Claude Code** 1. 安装并配置 Claude Code,具体步骤见 [Claude Code](/docs/agent-plan-personal-claude-code)。 2. 编辑配置文件 `~/.claude.json`,添加 MCP 配置。 ```JSON { ... "mcpServers": { "byted-supabase-mcp": { "command": "byted-supabase-cli", "args": [ "mcp", "serve", "--agent-plan" ] } } ... } ``` > **说明** > > 配置保存后,建议使用在线 JSON 验证工具或本地命令检查 JSON 格式是否合法。 3. 在终端执行`claude`命令启动 Claude 服务后,输入`/mcp`后看到`byted-supabase-mcp`,说明配置成功。 4. MCP 安装完成后即可使用火山引擎 Supabase 能力。 **选项:OpenCode** 1. 安装并配置 OpenCode,具体步骤见 [OpenCode](/docs/agent-plan-personal-opencode)。 2. 编辑配置文件 `~/.config/opencode/opencode.json`,添加 MCP 配置。 ```JSON { ... "mcp": { "byted-supabase-mcp": { "command": "byted-supabase-cli", "args": [ "mcp", "serve", "--agent-plan" ] } } ... } ``` > **说明** > > 配置保存后,建议使用在线 JSON 验证工具或本地命令检查 JSON 格式是否合法。 3. 在终端执行`opencode`命令启动 OpenCode 服务后,输入`/mcp`后看到`byted-supabase-mcp`状态为 Enabled,说明配置成功。 4. MCP 安装完成后即可使用火山引擎 Supabase 能力。 **选项:OpenClaw** 1. 安装并配置 OpenClaw,具体步骤见 [OpenClaw](/docs/agent-plan-personal-openclaw)。 2. 在终端执行如下命令安装 MCPorter。 ```Bash npm install -g mcporter ``` 3. 编辑配置文件 `~/.openclaw/openclaw.json`,添加 MCP 配置。 ```JSON { ... "mcp": { "servers": { "byted-supabase-mcp": { "command": "byted-supabase-cli", "args": [ "mcp", "serve", "--agent-plan" ] } } }, "skills": { "entries": { "mcporter": { "enabled": true } } } ... } ``` > **说明** > > 配置保存后,建议使用在线 JSON 验证工具或本地命令检查 JSON 格式是否合法。 4. 在终端执行如下命令使配置生效。 ```Bash openclaw gateway restart ``` 5. 在项目目录下,执行如下命令查看已安装的 `byted-supabase-mcp` MCP。 ```Bash mcporter list ``` 6. 启动 OpenClaw,随后即可使用火山引擎 Supabase 能力。 **选项:TraeCode** 1. 安装并配置 TraeCode,具体步骤见 [TraeCode](/docs/agent-plan-personal-trae)。 2. 在设置页面,选择左侧菜单 **MCP**,在 MCP 页面右上角选择**添加-手动配置**。 3. 在手动配置弹窗添加 MCP 配置信息。 ```JSON { "mcpServers": { "byted-supabase-mcp": { "command": "byted-supabase-cli", "args": [ "mcp", "serve", "--agent-plan" ] } } } ``` 4. MCP 安装完成后,在 AI 对话框选择 **Agent** 模式使用火山引擎Supabase。 # 计费说明 - **未开启超额后付费**:请求调用产生的费用使用套餐内 AFP 进行抵扣,不消耗其他资源包或账户余额。抵扣规则参见 [套餐内 AFP 抵扣规则](/docs/agent-plan-personal-afp-credits-billing-rules#c8d3b9a1)。 - **开启超额后付费**:在套餐周期内额度未用尽时优先抵扣套餐额度;当套餐周期内额度用尽时,无需修改任何配置信息,系统将自动切换至超额后付费模式继续使用,并产生后付费账单。具体规则与操作参见 [超额后付费规则](/docs/agent-plan-personal-over-quota-postpaid-rules#8b7e0f2a) 和 [超额后付费管理](/docs/agent-plan-personal-over-quota-postpaid-management#1a2b3c4d)。 # 实践教程 **[搭建销售团队工作台](https://bytedance.larkoffice.com/wiki/WpXuw57E0i69sHkK9DNcraEPn1c)** 基于 Agent Plan + Codex + AI Native 应用开发底座 + 豆包搜索 + 专业数据集 + Agent 记忆,把散落在飞书会话、云文档里的私域销售资料和外部专业信息,搭成一个能查公司、看档案、问历史的销售团队定制工作台。 **[搭建资料管理与AI 问答工具](https://bytedance.larkoffice.com/docx/Qs00dZCoTod1FtxKTQScgKHKnjh)** 基于 Agent Plan + AI Native 应用开发底座,搭建一个面向个人和小团队的轻量资料管理与 AI 问答工具。该工具支持文件上传、共享协作、通知提醒,帮助用户存储资料、发现资料,是一个全栈 App。 # 常见问题 * 如何获取 Workspace 的连接信息? 在 [AI 原生 BaaS 平台 Supabase 版](https://console.volcengine.com/aidap) 的 Workspace 详情页,可查看 Supabase URL、API Key 及数据库连接串。 * Workspace 暂停后数据会丢失吗? 不会。暂停仅停止算力计费,数据存储空间仍会保留。恢复 Workspace 后可继续使用。 # 服务协议 - [产品和服务测试协议](https://docs.volcengine.com/docs/87275/2105928?lang=zh) - [Harness 能力说明和产品专用条款](/docs/harness-rules) --- # Agent 进化 Source: https://ark.volcengine.com/region:cn-beijing/docs/agent-plan-personal-evolve Agent 进化(Agent Evolve,以下简称 Evolve)是面向 Claude Code、OpenClaw、TraeCode 等 AI 工具的持续进化能力。Evolve 学习 Agent 的近期会话,识别当前运行时中可优化的指令文件,并生成改进建议。建议经您确认后,Evolve 会将其写入 CLAUDE.md、AGENTS.md 等运行时文件,帮助 Agent 在后续任务中持续改进。 # 能力介绍 Evolve 以 Agent 的会话日志为学习来源,从真实会话中提取优化证据(evidence),在云端生成可直接落地的优化建议(proposal),形成“会话学习—生成建议—确认应用”的进化闭环;通过连接器(connector)机制适配 Claude Code、OpenClaw、TraeCode 等 Agent,帮助您降低手动维护指令文件的成本。 支持的核心能力如下: - **能力面发现**:自动扫描运行时根目录,将 CLAUDE.md、AGENTS.md 等指令文件及 Skills 识别为可进化的能力面(capability),各 Agent 运行时的支持范围见下表。 - **会话学习**:读取近期 Agent 会话日志(JSONL 格式),将其中的有效经验和问题提取为优化证据(evidence),支持指定会话范围与导入数量。 - **优化建议**:基于优化证据结合云端基因库生成优化建议(proposal),每条附带修改原因、来源会话证据、风险值(risk)与置信度(confidence),支持按 `not_applied`、`applied` 等状态筛选。 - **云端基因库**:根据不同模型(model)在不同 Agent 上的运行效果,通过大数据提取出云端基因库,用于指导 Agent 的优化方向,更准确地生成优化建议(proposal)。 - **受控应用**:应用前渲染 unified diff 预览,默认仅在您确认后写入运行时文件;支持按能力面(capability)开启自动应用(Auto Apply),无需逐条确认。 当前支持的 Agent 运行时如下: | 运行时 | Connector | 可优化的指令文件 | | --- | --- | --- | | Claude Code | `claude_code` | 项目级 CLAUDE.md、CLAUDE.local.md,用户级 ~/.claude/CLAUDE.md | | OpenClaw | `openclaw` | AGENTS.md、SOUL.md、IDENTITY.md、USER.md、TOOLS.md、BOOTSTRAP.md、HEARTBEAT.md、MEMORY.md 及 skills/ 目录 | | TraeCode | `trae` | 项目级 AGENTS.md | # 使用限制 - 当前环境需安装 Python 3.9 及以上版本和 pip,使用 conda、venv、uv 等环境均可。 - 开发机需可访问公网,以连接 Evolve 后端服务。 - 使用 Evolve 需要有效的方舟 API Key。Evolve 通过 API Key 识别当前账号,无需额外配置账号 ID 或用户名。 - 当前不提供独立的回滚命令。已应用变更的撤销方式参见 [常见问题](/docs/agent-plan-personal-evolve#0d9a5f27)。 # 使用 Evolve Skill ## 步骤一:订阅套餐并开通 Agent 进化 1. 在 [开通管理-Agent Plan](https://ark.volcengine.com/region:cn-beijing/subscription/agent-plan?agentMode=close) 页面购买 Agent Plan 个人版套餐。套餐说明参见 [套餐概览](/docs/agent-plan-personal-plan-overview)。 2. 在控制台单击**Harness**,开启 Agent 进化 的抵扣开关。 ![agent-envolve.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/agent-envolve.png) 3. 获取 Agent Plan 的专属 API Key,用于在工具中完成 Skill 或 MCP 的配置。 ![image-20260908-203322-616.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260908-203322-616.png) ## 步骤二:安装 Evolve Skill 可将以下命令交给 Agent 执行,由 Agent 自动完成 Evolve Skill 和 CLI 的配置。 ```Bash curl -fsSL "https://ark-self-evolve.tos-cn-beijing.volces.com/evolve_skill/latest/install.sh" | bash ``` 也可以按不同运行时手动安装对应的 Skill 包。每个安装包均包含对应运行时的 SKILL.md、预构建的 Evolve CLI,以及 Agent 使用的共享指令文件。 **选项:Claude Code** 1. 安装并配置 Claude Code,具体步骤见 [Claude Code](/docs/agent-plan-personal-claude-code)。 2. 在此链接下载Evolve Skill包:[evolve-setup-claude_code.zip](https://ark-self-evolve.tos-cn-beijing.volces.com/evolve_skill/latest/evolve-setup-claude_code.zip),解压后放入 ~/.claude/skills/ 即可完成配置。 3. 安装完成后,执行`claude`命令启动 Claude Code,即可继续配置方舟 API Key 并使用 Evolve。 **选项:OpenClaw** 1. 安装并配置 OpenClaw,具体步骤见 [OpenClaw](/docs/agent-plan-personal-openclaw)。 2. 在此链接下载Evolve Skill包:[evolve-setup-openclaw.zip](https://ark-self-evolve.tos-cn-beijing.volces.com/evolve_skill/latest/evolve-setup-openclaw.zip),解压后放入 ~/.openclaw/workspace/skills/ 即可完成配置。 3. 安装完成后,执行`openclaw tui`命令启动 OpenClaw,即可继续配置方舟 API Key 并使用 Evolve。 **选项:TraeCode** 1. 安装并配置 TraeCode,具体步骤见 [TraeCode](/docs/agent-plan-personal-trae)。 2. 在此链接下载Evolve Skill包:[evolve-setup-trae.zip](https://ark-self-evolve.tos-cn-beijing.volces.com/evolve_skill/latest/evolve-setup-trae.zip),解压后放入 ~/.trae/skills/ 即可完成配置。 3. 安装完成后,通过 TraeCode 打开对应的项目,即可继续配置方舟 API Key 并使用 Evolve。 > **说明** > > 首次运行时,Agent 会自动安装所需 CLI,无需单独执行 `pip install`。 ## 步骤三:配置 Agent Plan 专属 API Key 在终端执行以下命令,也可以将命令交给 Agent 完成配置。其中 `` 需替换为您的 [Agent Plan 专属 API Key](https://ark.volcengine.com/region:cn-beijing/subscription/agent-plan?agentMode=close),非方舟统一API Key。 ```Bash export EVOLVE_API_KEY= ``` ## 步骤四:完成首次设置 安装完成后,启动对应的 AI 工具,并对 Agent 说: ```Text Set me up for evolve ``` Agent 会检查 Evolve 是否已完成设置。若尚未初始化,Agent 会识别当前运行时中的可优化文件,并在获得您的确认后完成初始化。 初始化后,Evolve 会保存当前运行时与可优化目标的绑定关系,后续使用时通常无需重复设置。可执行以下命令查看当前设置,返回结果中 `capability_synced` 为 `True` 即表示初始化成功。 ```Bash python3 -m evolve_cli status ``` ## 步骤五:在工具中使用 Evolve 完成初始化后,直接通过自然语言与 Agent 对话即可使用 Evolve。常见的对话指令如下: | 对话示例 | Evolve会做什么 | | --- | --- | | Is evolve set up? | 检查 Evolve 是否已设置,以及是否存在待处理建议 | | Learn from my recent sessions | 导入近期会话并生成优化建议 | | What suggestions are there? | 查看当前可用建议 | | Explain that proposal | 解释建议的目标文件、修改原因、证据、风险和 diff | | Show me the diff | 预览某项建议将带来的文件变更 | | Apply this proposal | 先展示 diff;在你明确确认后应用变更 | | Which surfaces are evolvable? | 查看当前哪些运行时文件可以被 Evolve 优化 | > **注意** > > Evolve 在执行初始化、导入会话和应用建议前,都会请求确认。应用建议时,Evolve 会先展示 diff,仅在您明确确认后才将内容写入运行时文件。 # CLI 接入方式 除通过 Skill 使用外,也可以直接调用 Evolve CLI,适用于脚本化调用、CI 流程或需要检查底层执行结果的场景。CLI 已包含在 Skill 安装包中。 ```Bash # 查看完整帮助 python3 -m evolve_cli --help ``` 常用命令如下: ```Bash # 查看当前设置和待处理建议 python3 -m evolve_cli status # 导入近期会话 python3 -m evolve_cli import --limit 5 # 查看建议 python3 -m evolve_cli proposals # 查看某项建议 python3 -m evolve_cli proposal # 预览变更 python3 -m evolve_cli apply --dry-run # 应用变更 python3 -m evolve_cli apply ``` > **说明** > > 初始化命令 `init` 通常由 Agent 在首次设置流程中代为执行,无需手动运行。应用建议前,建议先使用 `--dry-run` 查看 diff,确认无误后再执行实际应用。 # 常见问题 * **初始化后暂时没有建议,是否正常?** 正常。刚部署的环境、会话样本较少,或云端尚未积累足够经验时,导入会话后可能暂时没有可用建议。完成更多实际任务后,可再次让 Agent 学习近期会话。 * **Evolve 会自动修改我的文件吗?** 默认不会。Evolve 会先展示 diff,仅在您明确确认后才将建议写入运行时文件。若您为某个能力面开启了自动应用(Auto Apply),该能力面的后续建议会在生成后自动应用,无需逐条确认。 * **如何撤销已应用的建议?** 以追加方式应用的内容会写入带有标记的代码块中,例如: ```Text ... ``` 删除对应标记块即可撤销该次变更。以替换方式应用的变更不包括标记块,如需恢复,可参考应用前的 diff 预览手动还原。 * **提示找不到可优化文件怎么办?** 请确认初始化时选择的目录正确,并且目录中存在对应运行时的指令文件。例如: - Claude Code:CLAUDE.md - OpenClaw:AGENTS.md、SOUL.md 或相关 Skills - TraeCode:AGENTS.md 完整的可优化文件列表参见 [能力介绍](/docs/agent-plan-personal-evolve#9c1e2f3a) 中的运行时表格。 * **初始化或导入会话失败怎么办?** 请依次检查: - 方舟 API Key 是否有效; - 当前网络是否可以访问 Evolve 后端; - 当前运行时目录是否正确; - 本机是否安装 Python 3.9 或更高版本,以及 pip。 * **如何卸载 Evolve Skill?** 对 Agent 说 `please delete self evolve skill`,由 Agent 完成 Skill 的删除。 * **如何计费?** 进化服务会调用云端的Agent分析日志,并生成进化方案,调用仅根据tokens消耗计费,tokens直接转换为AFP扣费,无其他额外服务计费。 --- # ArkClaw Source: https://ark.volcengine.com/region:cn-beijing/docs/agent-plan-personal-arkclaw ArkClaw 是火山引擎提供的云端 AI 智能体(Agent)服务,能帮助您**一键云端部署** OpenClaw,**享有一对一专属 ECS 资源**,免去复杂配置、7 × 24 在线,让您零门槛使用 OpenClaw,还能无缝使用您订阅的火山方舟 Agent Plan,告别 Token 按量计费焦虑。 # 用户权益 > **注意** > > 自 2026 年 9 月 1 日起,Agent Plan Medium 及以上套餐不再赠送 ArkClaw 权益。该调整仅涉及赠送的 ArkClaw,套餐的其他构成不变。详情参见[Agent Plan 套餐赠送 ArkClaw 权益调整公告](/docs/agent-plan-personal-arkclaw-benefit-deprecation)。 订阅方舟 **Agent Plan Medium 及以上套餐**:赠送 ArkClaw 轻量版。套餐到期时,您创建的 ArkClaw 将被删除,其中的数据将为您**保留 24 小时**。 > **说明** > > 体验中心提供的 ArkClaw 服务要求同一主账号同一套餐只能开通一个 ArkClaw,主账号下的子账号会共享数据记录。 # 步骤一:购买 Agent Plan 进入 [Agent Plan 控制台](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=agentPlan),按需购买Agent Plan Medium 及以上套餐。套餐介绍请参见[套餐概览](/docs/agent-plan-personal-plan-overview)。 # 步骤二:创建并使用 ArkClaw 1. 登录火山方舟 [体验中心](https://ark.volcengine.com/region:cn-beijing/experience)。 2. 在左侧目录选择“Agent > ArkClaw”。 3. 单击“**立即创建**”按钮,提交创建申请。 > **注意** > > * 使用子账号创建 ArkClaw 前,需先联系账号管理员为子账号添加`ArkClawXFullAccess`权限,权限配置完成后再单击**立即创建**创建 ArkClaw。 > * 可以在页面左上角切换套餐,当前默认是已购买的 Agent Plan 的套餐。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/e6c4da63af9142e7a636120e44700b73~tplv-goo7wpa0wc-image.image) 4. 待创建成功后,即可在方舟中与 ArkClaw 进行对话。 > **注意** > > 根据 [使用技巧](https://docs.volcengine.com/docs/6396/2227963?lang=zh#NxLmzbFS),对 ArkClaw 进行个性化配置与管理,如配置消息渠道、切换使用的模型、定义人格等。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/0ba98eeff70f49f49d6e67528c2562ea~tplv-goo7wpa0wc-image.image) # 使用技巧 * [查看并配置定时任务](https://docs.volcengine.com/docs/87732/2266926?lang=zh):不仅支持实时解答问题,还支持完成设置的定时任务,主动发送提醒。 * [使用快捷指令](https://docs.volcengine.com/docs/87732/2275055?lang=zh):预置了常用的操作命令,例如:新建对话、查看系统状态及清空上下文等。 * [配置消息渠道](https://docs.volcengine.com/docs/87732/2266749?lang=zh):支持与您的 IM 工具(例如飞书机器人、钉钉机器人)进行快捷集成。 * [学习并使用技能](https://docs.volcengine.com/docs/87732/2266925?lang=zh):ArkClaw 已预置部分常用技能(Skills),可根据任务需求自动匹配调用。 * [使用网盘功能上传/下载文件](https://docs.volcengine.com/docs/87732/2266928?lang=zh):将 [对象存储(TOS)](https://www.volcengine.com/docs/6349) 服务的TOS桶作为网盘,实现本地与云端的文件快速上传/下载操作。 # 服务规则 [ArkClaw 服务规则](/docs/arkclaw-service-rules) --- # Computer Use Agent Source: https://ark.volcengine.com/region:cn-beijing/docs/agent-plan-personal-cua Computer Use Agent(简称 CUA)是面向 AI Agent 场景的用户专属云端运行环境,为 Agent 提供可见、可操作的 Windows 云桌面。Agent 可在远端桌面中完成网页浏览、原生应用操作、终端执行、文件处理和多步骤工作流,并通过任务状态、上下文、产物与可观测链路将执行结果返回调用方。 本文将介绍购买 Agent Plan 套餐后,如何在 AI 工具中通过 Skill 接入并使用 Computer Use Agent。 # 能力介绍 CUA 是一套"本地操作、远端运行"的 Windows 云桌面系统。支持的核心能力如下: | 能力 | 说明 | | --- | --- | | **Windows 云桌面** | 通过 ark-cua skill 获取私有的 URL,随时通过电脑、手机访问你的云桌面,并且支持移动端、PC 端的整体适配。

    **桌面端交互:**
    [视频](https://arkdocs.tos-cn-beijing.volces.com/videos/CodingPlan/cua-app-desktop.webm)

    **移动端交互:**
    [视频](https://arkdocs.tos-cn-beijing.volces.com/videos/CodingPlan/cua-app-mobile.webm) | | **浏览器自动化** | 通过浏览器结构化能力完成 URL 访问、DOM 读取、网页表单和下载等 Web 任务。

    **分析股票行情走势:**
    [视频](https://arkdocs.tos-cn-beijing.volces.com/videos/CodingPlan/cua-stock-analysis.webm) | | **视觉自动化** | 结合截图、鼠标键盘和 Windows UI Automation 操作原生桌面应用(如微信、豆包),以及无法通过 DOM 完成的图形交互。 | | **长程任务** | 支持任务状态跟踪、需要用户输入时暂停、上下文复用、时间线、定时或周期任务。 | | **虚拟外设** | 支持浏览器连接本地外设工具(摄像头、麦克风)。 | **典型场景:** - 登录业务系统并完成跨页面数据录入、查询和下载。 - 操作仅提供 Windows 客户端的办公、研发或行业软件。 - 组合浏览器、终端、桌面应用和文件工具完成端到端流程。 - 执行需要等待、追踪进度、人工补充信息或导出文件的长程任务。 - 按指定时间执行一次性或周期性桌面工作流。 - 通过连接器远程连接本地麦克风和摄像头完成交互。 # 使用限制 - 需订购 Agent Plan **Medium 及以上**套餐,并由平台为当前用户分配或绑定可用的 CUA 桌面。 - 根据管理需要,使用本能力前需在 [火山平台](https://console.volcengine.com/user/authentication/detail/) 预先完成实名认证,否则可能会导致无法正常分配机器。 - 同一桌面同一时间只运行一个活动任务。 - 云桌面临时访问 URL 属于敏感凭证,不应写入公开文档、日志或群聊;使用完毕或疑似泄露时应立即撤销。 - Agent Plan API Key 仅在用户本地终端输入并缓存,禁止粘贴到对话、任务目标、命令参数日志、仓库文件或截图中。 - 桌面重置会重建桌面,必须显式确认;任务取消仅在用户明确要求停止时执行。 # 接入方法 ## 步骤一:订阅 Agent Plan 1. 进入 [开通管理-Agent Plan](https://ark.volcengine.com/region:cn-beijing/subscription/agent-plan?agentMode=close) 页面,选择并订购 **Medium 及以上**级别套餐(目前仅 Medium 及以上套餐支持购买 Computer Use Agent)。套餐说明参见 [套餐概览](/docs/agent-plan-personal-plan-overview)。 2. 确认使用地域、账号实名认证和套餐状态符合要求。 ## 步骤二:开启 Computer Use Agent Harness 1. 在 Agent Plan 控制台单击 **Harness**。 ![image-20260908-205313-739.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260908-205313-739.png) 2. 在 **Harness** 区域找到 **Computer Use Agent**,开启抵扣开关。 ![open-cua-harness.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/open-cua-harness.png) 3. 确认当前用户已分配或绑定 CUA。若控制台尚未展示 CUA 服务项,表示能力尚未对当前账号开放,请先检查套餐等级是否为 Medium 及以上;如仍有问题请联系管理员或业务支持。 ## 步骤三:安装或更新 CUA Skill ### 方式一:使用 arkcli 安装(推荐) 1. 安装 arkcli。 ```Bash npm i @volcengine/ark-cli -g --registry https://registry.npmjs.org ``` > **提示**:如果之前有安装过,可以先移除再重装。 2. 通过 arkcli 配置 agentplan 并安装 cua(以 codex 为例)。 ```Bash arkcli helper mcp codex --capability cua ``` ### 方式二:通过 Skill 安装器安装 以下以 Codex 为例;其他受支持的 AI 工具可替换 `--agent` 参数。 ```Bash # 安装 ark-cua Skill npx skills add https://skills.volces.com/skills/volcengine/ark -s byted-util-ark-cua --agent codex ``` # 使用方法 ## Skill 方式 在已安装 ark-cua 的 AI 工具中,直接用自然语言描述任务即可。例如:`使用 ark-cua 打开浏览器,登录测试环境,查询今天创建的订单并导出 CSV。导出后告诉我记录数,并把文件作为产物返回;如遇验证码或需要业务确认,先向我提问。` AI 工具会依次检查登录状态、提交原始目标、记录任务 ID,并根据返回状态继续处理: | outcome | 含义 | 下一步 | | --- | --- | --- | | `in_progress` | 任务仍在运行 | 继续执行返回的 `next.command` 或 `watch`。 | | `needs_input` | 需要用户补充信息 | 原样转达 `input_request.question`,收到答复后执行 `answer`。 | | `completed` | 任务完成 | 以 `result.text` 为最终结果,并处理产物。 | | `failed` | 任务失败 | 报告错误码、请求 ID 和安全诊断;不要盲目重试。 | | `cancelled` | 任务已取消 | 告知用户任务已停止。 | ## 登录 CUA 操作 1. 通过 Skill 让 Agent 返回临时 URL 访问 Computer Use Agent。URL 有效期约 30 分钟,过期后重新获取指令即可。 ![cua-return-url.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/cua-return-url.png) 2. 使用返回的 URL 登录后,可以在左侧的聊天框内发布指令,也可以直接在右侧图形化界面中操作 CUA。 ![cua-open.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/cua-open.png) 3. **通过配置使用连接器和外设。** CUA 预装了多种软件连接器(Office CLI 等),选择最左侧连接器标签,跟随引导补充配置信息,即可通过 Skill 使用对应能力。当场景需要摄像头或麦克风输入时,也可将本地外设连接至 CUA。 ![cua-switch-tool.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/cua-switch-tool.png) ## 关闭 CUA 停止计费 CUA 是按照使用时长计费的,计费频率为小时,因此当确认不再需要使用时,可以通过 Skill 请求关闭 CUA,同步停止计费,以节约使用成本。 关闭 CUA 后,之前签发的云桌面的访问地址同步失效,机器无法使用。 > **注意** > > 关闭后机器仅保留 7 天,超过 7 天关闭的 CUA 会被销毁。此时重新运行机器,平台会为你创建全新机器,而不是恢复之前的机器! ![cua-close.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/cua-close.png) # 最佳实践 1. **把目标写成可验收的任务。** 说明目标系统、环境、数据范围、交付物、成功标准和禁止动作。例如"在测试环境创建一条草稿,保存但不要提交审批,并返回草稿编号"比"帮我操作一下系统"更稳定。 2. **优先使用确定性证据。** 同一目标可由多种工具完成时,优先选能产生结构化、可验证结果的路径:Terminal 适合命令和状态检查,Browser 适合网页 DOM 与表单,Computer / UIA 用于原生应用、拖拽和系统级弹窗。不要用坐标点击替代可以通过终端或 DOM 完成的操作。 3. **一个请求只创建一次任务。** 保存首次返回的 `invocation_id` 或 task ID。等待超时不等于任务失败,继续 `watch` 即可;重复 `delegate` 既可能触发冲突,也可能造成重复业务操作和额外消耗。 4. **正确处理人工介入。** 遇到验证码、登录确认、业务审批、不可逆操作或信息不足时,允许任务向调用方转达问题,由调用方将问题原样交给用户后再继续。 5. **将进度、观察和结果分开。** 进度摘要、截图与观察日志只用于了解任务正在发生什么。完成判定必须基于 `outcome == completed`,文件交付必须确认 Artifact 存在可下载内容。 6. **管好凭证和临时访问链接。** API Key 只在本地终端输入并妥善保管;临时桌面票据不进入仓库和群聊,使用完毕或疑似泄露时应立即撤销。 7. **对外部副作用设置边界。** 生产环境写入、发送消息、提交审批、购买、删除和桌面重置等动作,应在目标中明确是否允许,并在不可逆步骤前要求确认。失败时根据稳定错误码处理,不通过盲目重试扩大影响。 # 计费说明 CUA 作为 Agent Plan Harness,计费遵循 Agent Plan Harness 的统一原则:按小时计算费用,抵扣用户积分。 | 场景 | 规则 | | --- | --- | | **套餐额度未用尽** | 优先消耗 Agent Plan 套餐额度 / AFP。目前折扣费率为312.5 AFP/CU/小时,活动期内限时2折优惠,费率低至62.5 AFP/CU/小时。套餐内用量通常不再就该 Harness 能力单独推送后付费账单;在 CUA 内的 agent也会消耗token,这部分token消耗是自动通过用户的agent plan结算。 | | **超额后场景** | 当用户的套餐积分在周期内耗尽,默认关闭 CUA 使用入口,同时机器为用户保留 7 天,用户需要尽快补充积分。 | | **计量口径** | 平台按照实际占用和使用情况结算费用,结算粒度为小时级别。 | # 常见问题 - **为什么返回 AUTH_REQUIRED?** 本地没有有效的 Agent Plan API Key,或 Key 已失效。请在自己的本地终端按提示完成配置后重试。不要把 Key 发到对话中。 - **为什么返回 DESKTOP_NOT_BOUND?** 当前账号尚未分配 CUA 桌面。请确认已开通 CUA Harness,并联系管理员或业务支持完成资源分配。 - **为什么返回 ACTIVE_RUN_CONFLICT?** 绑定桌面已有活动任务,新任务未启动。等待现有任务结束;除非用户明确要求,不要取消现有任务或重复提交。 - **watch 超时是否代表任务失败?** 不是。超时只是本次等待窗口结束;只要 outcome 仍为 `in_progress`,继续执行 `watch`。 - **桌面访问链接失效怎么办?** 通过 Skill 让 Agent 重新获取新链接。旧链接不应长期保存或转发。 # 服务协议 - [Harness 能力说明和产品专用条款](/docs/harness-rules) - [Computer Use Agent 服务规则](/docs/cua-service-rules) --- # Ark CLI:Agent Plan 个人版使用指南 Source: https://ark.volcengine.com/region:cn-beijing/docs/agent-plan-personal-ark-cli Ark CLI 是火山方舟平台官方命令行工具,可在本地终端快捷配置与管理 Agent Plan 个人版的套餐、模型和 Harness 能力。 # 一、安装和登录 ArkCLI **环境要求:** Node.js >= 16 **选项:手动安装并登录** ## 安装 Ark CLI 在终端执行以下命令: ```Bash # 1. 通过 NPM 安装(下载最新版本) npm install -g @volcengine/ark-cli@latest # 2. 验证安装 arkcli --version ``` ## 登录 Ark CLI ```Bash # 登录方式 arkcli auth login # 查看登录状态 arkcli auth status ``` **选项:通过 AI Agent 安装并登录** 将下方提示词复制给 AI Agent(Claude Code、Codex、Cursor、Trae 等),它会自动完成安装。 ```Plain 根据下面命令帮我安装 Ark CLI:https://lf3-static.bytednsdoc.com/obj/eden-cn/psjryh/ljhwZthlaukjlkulzlp/intro/volc.md ``` # 二、配置 Agent Plan 在终端中输入命令 `arkcli helper`,根据 TUI 引导选择需要配置的套餐、模型、harness 能力。 现以Agent plan个人版配置Claude Code为例: ![](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/ap-personal.gif) # 三、使用 ArkCLI ## 能力概览 ArkCLI 支持 Agent Plan 相关命令,覆盖**交易、配置、用量、安全、场景化使用**五大范围,更多能力见 [ArkCLI 指南](/docs/ark-cli)。 - 交易:新购、续费、查询账号下套餐状态 - 配置:配置模型/Harness 能力、查询套餐支持模型、查询配置状态 - 用量:余额查询、用量查询、具体模型/工具用量查询 - 安全:轮换 API Key - 场景化能力:生图/生视频、Harness 能力使用 ## 交易 **选项:通过 Agent 调用** | 功能 | 示例提示词 | | --- | --- | | 新购套餐 | "我想买一个 Agent Plan 个人版 Max,帮我下单" | | 续费套餐 | "帮我续费一个月 Agent Plan" | | 查询账号下套餐状态 | "我都订阅了哪些 Plan?是什么规格?" | **选项:通过终端调用** - 新购套餐: ```Bash # arkcli plans buy --plan <套餐名> --type <规格> [--duration <月数>] [--yes] # 参数说明: # 套餐名:agent-plan # 规格:small/medium/large/max # 月数:1-12 月,例如:1,若不传该参数,默认 1 个月 # --yes:真实下单确认,若没有 --yes 仅返回订单预览与协议,建议先不加 --yes,预览订单 # 示例命令: # 预览:只返回协议链接 arkcli plans buy --plan agent-plan --type max --duration 1 # 真实下单 arkcli plans buy --plan agent-plan --type max --duration 1 --yes ``` - 续费: ```Bash # arkcli plans renew --plan <套餐名> [--duration <月数>] [--yes] # 参数说明: # 套餐名:agent-plan # 月数:1-12 月,例如:1,若不传该参数,默认 1 个月 # --yes:真实下单确认,若没有 --yes 仅返回订单预览与协议,建议先不加 --yes,预览订单 # 示例命令: # 预览:只返回协议链接 arkcli plans renew --plan agent-plan --duration 1 # 真实下单 arkcli plans renew --plan agent-plan --duration 1 --yes ``` - 查询账号下套餐状态: ```Bash arkcli plans get ``` ## 配置 | 功能 | 示例提示词 | | --- | --- | | 配置全部 Harness 能力 | "把 Agent Plan 的 harness 能力都配到我本机的 Claude Code 上" | | 仅配置单项 Harness 能力 | "帮我的 Codex 装上豆包搜索的 MCP" | | 移除配置 | "把 claude code 上的豆包搜索 mcp 配置全撤掉" | | 查询配置状态 | "看看我本机哪些 AI 工具已经接了 Agent Plan,MCP 装齐了没" | | 查询套餐支持的模型 | "Agent Plan Max 支持哪些模型?" | ## 用量 | 功能 | 示例提示词 | | --- | --- | | 余额查询 | "我这个月 Agent Plan 还剩多少 ?" | | 用量查询 | "我本周使用了多少 ?" | | Model/Harness 用量查询 | "我本周 doubao-seed-2.1-lite 用了多少 ?" | ## 安全 **选项:通过 Agent 调用** | 功能 | 示例提示词 | | --- | --- | | 轮换 API Key | "帮我轮换 Agent Plan 的 API Key" | **选项:通过终端调用** > **注意** > > 该命令需二次确认,执行后旧 API key 失效。 ```Bash arkcli plans personal rotate-apikey ``` ## 场景化能力 > **说明** > > - ArkCLI 支持配置 Agent Plan 套餐内的 Harness 能力。对于需要额外安装的 Harness,ArkCLI 可完成对应 Skill、MCP 的安装与配置。 > - 相关 Harness: > - [专业数据集](/docs/agent-plan-personal-datapro) > - [豆包搜索](/docs/agent-plan-personal-search) > - [Agent 记忆](/docs/agent-plan-personal-openviking-memory) > - [AI Native 应用开发底座](/docs/agent-plan-personal-supabase) > - 除上述 Harness 能力外,ArkCLI 还内置生图、生视频等命令,可通过 Agent 或终端直接调用。 **选项:通过 Agent 调用** 可直接通过提示词说明生图、生视频要求,具体能力可见 [Agent Plan 支持视觉模型能力](/docs/agent-plan-personal-visual-models#7a1c4e9b)。 **生图:** ```Bash "帮我使用 AgentPlan 生成一张 4k 大图,一只赛博朋克风格的猫咪坐在东京街头,霓虹灯反射" ``` **生视频:** ```Bash 视频生成:"生成一段 5 秒 16:9 视频:无人机航拍雪山日出,缓慢右移,同步等结果" 查询列表:"目前我都有哪些视频正在生成中?" 查询进度:"刚刚的视频生成好了吗?" 取消任务:"取消刚刚的视频生成任务" ``` **选项:通过终端调用** **1. 生图** ```Bash arkcli +gen "赛博朋克风格的猫咪坐在东京街头,霓虹灯反射" ``` ```Bash arkcli +gen "赛博朋克猫咪,霓虹灯反射,超写实" \ --model doubao-seedream-5.0 \ --size 1024x1024 \ --image-count 4 \ --save-to ./out ``` **图生图:** ```Bash arkcli +gen "把这只猫改成水彩画风格" \ --input @./cat.png \ --model doubao-seedream-5.0 \ --save-to ./out ``` **2. 生视频** ```Bash # 生成视频 # 方式一:异步 arkcli +gen "无人机航拍雪山日出,缓慢平移" --modality video --duration 5 --ratio 16:9 # 方式二:同步 arkcli +gen "无人机航拍雪山日出,缓慢平移" --modality video --duration 5 --ratio 16:9 --wait --save-to ./out # 查单个视频任务(成功后自动下载) arkcli gen get cgt-20260708-xxxxxxxx --save-to ./out # 列出最近任务(分页) arkcli gen list --page-size 10 # 删除任务 arkcli gen delete cgt-20260708-xxxxxxxx --yes ``` --- # 使用 Agent Plan 开发短视频网站 Source: https://ark.volcengine.com/region:cn-beijing/docs/agent-plan-personal-practice-short-video 本文档提供使用 Agent Plan 接入 AI 工具快速打造**抖音同款**短视频网站的完整实践指南,涵盖从套餐购买、环境配置、需求定义全模态素材生产到完整项目开发全流程。通过本文,您可以在分钟级别完成项目核心开发,全程无需手动编写代码。 # 项目概述 ## 项目效果 本项目是使用 Agent Plan 接入 AI 工具后实现的抖音同款短视频网站,具体效果如下。关于 Agent Plan 的核心优势及套餐信息请参见[套餐概览](/docs/agent-plan-personal-plan-overview)。 [视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/1f9a4955009443a1a8643e2312365f8e) ## 核心使用能力 * 语言模型:Agent Plan 支持 Seed 2.0 系列、GLM 系列、Minimax 系列、DeepSeek 系列、Kimi 系列等多种优秀模型,可灵活切换或使用 Auto 模式调度。 * 生图生视频模型:Agent Plan 提供生图生视频模型,包含字节 SOTA 水平的 Seedance、Seedream,支持通过 Skill 接入并使用。 * 豆包搜索:Agent Plan 提供豆包搜索专属 Harness,支持通过 Skill 或 MCP 方式接入。 * 多工具兼容:Agent Plan 兼容多生态,无缝接入 OpenClaw、Hermes Agent、Claude Code 等主流编程及 AI Agent 工具。 ## 成本预估 完成该项目基础开发预估使用 14,900+ AFP,大约是 3% Max 套餐月额度。实际消耗以具体使用情况为准,可能会存在差异。 # 前置准备 ## 一、购买 Agent Plan 进入 [Agent Plan 控制台](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=agentPlan) 购买 Agent Plan 套餐。套餐详情参见[套餐概览](/docs/agent-plan-personal-plan-overview)。 > **注意** > > 推荐购买 Large 及以上套餐,Small、Medium 套餐不支持生视频模型。 ## 二、配置工具 完成套餐购买后,需要获取 Agent Plan 支持的专属 Base URL、专属 API Key 及模型,完成工具配置后才能正常使用并抵扣套餐额度。 ### 需要配置的信息 * 专属 Base URL: * 兼容 Anthropic 接口协议工具:`https://ark.cn-beijing.volces.com/api/plan` * 兼容 OpenAI 接口协议工具:`https://ark.cn-beijing.volces.com/api/plan/v3` * 专属 API Key:[获取专属 API Key](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&OpenModelVisible=false&advancedActiveKey=agentPlan),其他方舟 API Key 无法在 Agent Plan 中使用。 ![image-20260908-203322-616.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260908-203322-616.png) * 支持模型:见 [支持模型及Harness](/docs/agent-plan-personal-plan-overview#3d801f5f)。 ### 接入 AI 工具 选择支持的 AI 工具并配置 Agent Plan,具体步骤参见[二、选择 AI 工具](/docs/agent-plan-personal-get-started#c5311898)。完成文本生成模型配置后,需要安装生图、生视频、豆包搜索 Skill,具体如下: * 安装生图生视频 Skill:[接入视觉模型](/docs/agent-plan-personal-visual-models) * 安装豆包搜索 Skill:在控制台**配置 Harness** 开通豆包搜索,具体步骤参见 [豆包搜索](/docs/agent-plan-personal-search)。 # 实践流程 ## 一、明确项目需求 具体的项目需求可参考下面内容。 请帮我实现一个短视频网站项目: 1、功能调研:首先使用豆包搜索 skill 调研主流短视频平台的 Web 端设计,总结关键功能。 2、页面设计:网页风格简洁时尚,可参考提供截图的页面布局设计。参考截图如下: ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/67a84ace998a464abcacaae625c4e816~tplv-goo7wpa0wc-image.image) 3、生成素材:请调用已安装的生图skill绘制网站logo,并使用生视频Skill,生成首页的3条视频素材,主题分别为自然风光、美食推荐、美妆护肤。 ## 二、执行任务 启动工具后,提交上述短视频网站开发项目的需求,AI 工具(以 Claude Code 为例)将自动完成以下关键步骤。 ### 1.调用豆包搜索 Skill 通过调用豆包搜索 Skill 进行功能调研。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/e50ef837bc3e46e5b55bec844f5873c3~tplv-goo7wpa0wc-image.image) ### 2.调用生图、生视频 Skill 生成素材 通过调用Seedream、Seedance Skill生成网站所需的多模态素材,例如网站Logo设计、短视频内容、视频封面素材等。生成素材示例如下: |使用模型 |doubao-seedance-2.0 |doubao-seedance-2.0 |doubao-seedance-2.0 | |---|---|---|---| |生成素材 |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/7e887f5e90d34158a56690cdc8280a2e) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/03b508c88b1342ec8cc4b46ab8f3c16b) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/818e260760644aaab708e7a2da73e262) | ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/76d1cc3b2e5d4843aaff265d28fda6d1~tplv-goo7wpa0wc-image.image) ### 3.网站生成与预览 通过 AI 工具自动完成网站基础开发工作,后续可根据需求调整细节或部署上线。 > 您可以选用前端设计 Skill 进行页面美化设计。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/853601a78b4041b493610ca2c2d0e103~tplv-goo7wpa0wc-image.image) ## 三、查询用量消耗 进入 [Agent Plan 控制台](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=agentPlan) 查询 AFP 用量。实际用量消耗根据具体使用情况而定,详情参见 [AFP 积分计费规则](/docs/agent-plan-personal-afp-credits-billing-rules)。 实现该项目预估消耗的 AFP 明细如下: |消耗项 |消耗量 |预估 AFP 消耗 | |---|---|---| |语言模型 |开发一个完整的项目、对话消耗。 |1250 AFP | \ | |> 不同层级模型抵扣系数不同。 | | |生图模型 |7 张 seedream-5.0-lite 生成的图片素材。 |693 AFP | \ | |> 一张图消耗 99 AFP。 | | |生视频模型 |3个 seedance-2.0 生成的 5秒视频素材。 |13000 AFP | \ | |> 约消耗 50w-60w token。 | | \ | |> 计算公式:消耗的原始 token / 10,000 * 抵扣系数 | | --- # 使用 Agent Plan 开发学习教育网站 Source: https://ark.volcengine.com/region:cn-beijing/docs/agent-plan-personal-practice-education 本文档以**绘声绘色学古诗-教育网站**为例,介绍如何通过 Agent Plan 一站式调用全模态模型及 Harness 完成产品落地。借助套餐内的多模态模型,快速产出带人声吟诵的诗境动画短片、古风意境画卷等优质素材,并通过优秀编程模型完成高质量网站代码交付。 # 项目概述 ## 项目效果 本项目是使用 Agent Plan 接入 AI 工具后实现的绘声绘色学古诗的教育网站,具体效果如下。关于 Agent Plan 的核心优势及套餐信息请参见[套餐概览](/docs/agent-plan-personal-plan-overview)。 [视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/3c11ee8ff0564e58b348d2f305099581) ## 核心使用能力 * 语言模型:Agent Plan 支持 Seed 2.0 系列、GLM 系列、Minimax 系列、DeepSeek 系列、Kimi 系列等多种优秀模型,可灵活切换或使用 Auto 模式调度。 * 生图生视频模型:Agent Plan 提供生图生视频模型,包含字节 SOTA 水平的 Seedance、Seedream,支持通过 Skill 接入并使用。 * 豆包搜索:Agent Plan 提供豆包搜索专属 Harness,支持通过 Skill 或 MCP 方式接入。 * 多工具兼容:Agent Plan 兼容多生态,无缝接入 OpenClaw、Hermes Agent、Claude Code 等主流编程及 AI Agent 工具。 ## 成本预估 完成该项目基础开发预估使用 19,700+ AFP,大约是 4.6% Max 套餐月额度。实际消耗以具体使用情况为准,可能会存在差异。 # 前置准备 ## 一、购买 Agent Plan 进入 [Agent Plan 控制台](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=agentPlan) 购买 Agent Plan 套餐。套餐详情参见[套餐概览](/docs/agent-plan-personal-plan-overview)。 > **注意** > > 推荐购买 Large 及以上套餐,Small、Medium 套餐不支持生视频模型。 ## 二、配置工具 完成套餐购买后,需要获取 Agent Plan 支持的专属 Base URL、专属 API Key 及模型,完成工具配置后才能正常使用并抵扣套餐额度。 ### 需要配置的信息 * 专属 Base URL: * 兼容 Anthropic 接口协议工具:`https://ark.cn-beijing.volces.com/api/plan` * 兼容 OpenAI 接口协议工具:`https://ark.cn-beijing.volces.com/api/plan/v3` * 专属 API Key:[获取专属 API Key](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&OpenModelVisible=false&advancedActiveKey=agentPlan),其他方舟 API Key 无法在 Agent Plan 中使用。 ![image-20260908-203322-616.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260908-203322-616.png) * 支持模型:见 [支持模型及Harness](/docs/agent-plan-personal-plan-overview#3d801f5f)。 ### 接入 AI 工具 选择支持的 AI 工具并配置 Agent Plan,具体步骤参见[二、选择 AI 工具](/docs/agent-plan-personal-get-started#c5311898)。完成文本生成模型配置后,需要安装生图、生视频、豆包搜索 Skill,具体如下: * 安装生图生视频 Skill:[接入视觉模型](/docs/agent-plan-personal-visual-models) * 安装豆包搜索 Skill:在控制台**配置 Harness** 开通豆包搜索,具体步骤参见 [豆包搜索](/docs/agent-plan-personal-search)。 # 实践流程 ## 一、明确项目需求 具体的项目需求可参考下面内容。 ```Plain Text 帮我实现一个学古诗教育网站 通过沉浸式的诗境动画,让用户"看见诗、听见诗、读懂诗" 1、豆包搜索 3 首代表性中小学古诗词,作为精选诗词库 2、网页设计:精致的典雅古风,网站图片素材可使用生图skill进行生成,诗文用衬线体模拟书法韵味 3、每首诗歌的学习模块包括: - 诗歌原文、诗词解析 - 诗境动画短片:使用生视频skill生成带有人声朗诵诗句的意境短片,帮助用户学习 - 知识测验:每首诗歌包含5道选择题,可包含作者生平、意境理解等 ``` ## 二、执行任务 启动工具后,提交上述古诗学习教育网站开发项目的需求,AI 工具(以 Claude Code 为例)将自动完成以下关键步骤。 ### 1.调用豆包搜索 Skill 通过调用豆包搜索 Skill 进行古诗词内容搜索。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/b495d32954ac40ae96776dc05a4c83bf~tplv-goo7wpa0wc-image.image) ### 2.调用生图、生视频 Skill 生成素材 通过调用Seedream、Seedance Skill生成网站所需的多模态素材,例如带有人声吟诵的动画短片、古风意境画卷等。 |使用模型 |doubao-seedance-2.0 |doubao-seedance-2.0 |doubao-seedance-2.0 | |---|---|---|---| |生成素材 |带人声吟诵的短片 |带人声吟诵的短片 |带人声吟诵的短片 | \ | |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/be34f0c7416f40f881e8b441e15beef2) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/d91809c3400b4f3195c1cfc3f1998fd0) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/3b01b0ff747e4d629e313b42375de069) | 调用生视频 Skill 过程如下: ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/5dfb1eacfca94c95b87f6a588f4487ae~tplv-goo7wpa0wc-image.image) ### 3.网站生成与预览 通过 AI 工具自动完成网站基础开发工作,后续可根据需求调整细节或部署上线。 > 您可以选用前端设计 Skill 进行页面美化设计。 |首页 |诗词库 |诗歌学习页 | |---|---|---| |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/239e916b0cda418ab65c305c17dd4cee~tplv-goo7wpa0wc-image.image) |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/543fc9e9fa824967bb398cad9196cabe~tplv-goo7wpa0wc-image.image) |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/3a127adfe7534566883bf6b03beff47b~tplv-goo7wpa0wc-image.image) | ## 三、查询用量消耗 进入 [Agent Plan 控制台](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=agentPlan) 查询 AFP 用量。实际用量消耗根据具体使用情况而定,详情参见 [AFP 积分计费规则](/docs/agent-plan-personal-afp-credits-billing-rules)。 实现该项目预估消耗的 AFP 明细如下: |消耗项 |消耗量 |预估 AFP 消耗 | |---|---|---| |语言模型 |开发一个完整的项目、对话消耗。 |3500 AFP | \ | |> 不同层级模型抵扣系数不同。 | | |生图模型 |3 张 seedream-5.0-lite 生成的图片素材。 |297 AFP | \ | |> 一张图消耗 99 AFP。 | | |生视频模型 |4个 seedance-2.0 生成的 5秒视频素材。 |16000 AFP | \ | |> 约消耗 60w-70w token。 | | \ | |> 计算公式:消耗的原始 token / 10,000 * 抵扣系数 | | --- # 常见问题 Source: https://ark.volcengine.com/region:cn-beijing/docs/agent-plan-personal-faq # 关于 Agent Plan ## Agent Plan 和 Coding Plan 有什么区别? Agent Plan 是在 Coding Plan 基础上升级推出的全新订阅包。具体区别如下: |对比 |Agent Plan |Coding Plan | |---|---|---| |核心定位 |主打 Agent 场景,向多模态及 Harness 发展的全新订阅式大模型服务套餐包。 |主打 Coding 场景,面向个人开发者推出的订阅式 Coding 大模型服务套餐包。 | |模型范围 |语言模型、向量化模型、视觉模型(生图模型、生视频模型)、语音模型 |语言模型、向量化模型 | |Harness |豆包搜索、AI Native 应用开发底座、Agent记忆 |/ | |Base URL 与 API Key |在 [Agent Plan 控制台](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=agentPlan) 获取专属 Base URL 和专属 API Key。 |在 [Coding Plan 控制台](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=subscribe) 获取专属 Base URL 和 API Key(方舟 API Key)。 | |套餐信息 |4 档套餐,灵活可选择 |2 档套餐 | |计费方式 |按照 Agent 燃料值(AFP)消费抵扣,额度用量清晰可查。 |预估模型调用次数 | --- # Agent Plan 个人版&专业数据集联合促销活动 Source: https://ark.volcengine.com/region:cn-beijing/docs/agent-plan-personal-dataset-promotion 2026年10月8日至2026年11月8日活动期间内,所有在方舟 Agent Plan 个人版套餐有效期间内的账号,将赠送专业数据集活动额度,其中包含企业工商数据库调用400次,企业风险数据库调用400次,宏观经济数据库调用200次,共计1000次调用,价值24元的数据调用服务。 **活动时间有限,过期活动额度自动作废**;活动资格在新购、续费、升级等场景间共享,使用后不因升档或后续退订/重新购买等操作重新获得。 # 活动时间 2026 年 10 月 8 日 00:00:00 至 2026 年 11 月 8 日 23:59:59(北京时间) # 参与条件与对象 活动期间内持有方舟 Agent Plan 个人版套餐的账号可以参加本活动,适用档位包括 Small、Medium、Large 和 Max。本活动以持有套餐对应的火山引擎账号为单位发放和累计权益。 # 参与方式 符合参与条件的用户在活动期间无需另行领取,活动额度将自动发放至套餐内,本活动额度仅适用于通过方舟 Agent Plan 个人版指定方式发起的调用,调用详情参见 [使用专业数据集](/docs/agent-plan-personal-datapro#use-datapro)。 # 活动资格与活动额度 符合参与条件的账号在活动期间最多可获得: - 企业工商数据库:400 次; - 企业风险数据库:400 次; - 宏观经济数据库:200 次; 共计 1000 次调用,可通过 [高质量数据集控制台](https://console.volcengine.com/high-quality-dataset/data-application/pro-dataset) 查询本次的活动额度使用明细。注意: - 三类数据库活动额度分别计算、分别扣减,不可互相转换、转让、提现或兑换其他权益,其他数据库不参与本次活动。活动资格与活动额度按账号维度发放,仅能在同一账号内享受,**新购、续费、升配共享同一活动资格**。不同账号之间的活动额度不可合并、转移或共享。活动资格与活动额度不支持延期、转让、提现或折算为 AFP、积分及其他权益。 - 活动期间内,若账号对应的方舟 Agent Plan 个人版套餐到期,尚未使用的活动额度将暂停使用;该账号在活动结束前重新购买套餐并恢复套餐有效状态后,可继续使用原有剩余额度,但不会重新发放或补满活动额度。套餐失效期间活动额度不会继续扣减,且不会因此延长活动额度有效期。例如,活动期间内,账号获得 1000 次活动额度并已使用 300 次,套餐到期后且在活动期间重新购买,可继续使用剩余 700 次。 - 活动期间,若活动额度消耗完,则按照方舟 Agent Plan 个人版的 AFP 计费标准计费,如已开通超额后付费服务,当套餐 AFP 用尽后,后续调用将按照超额后付费规则产生费用。活动结束后,专业数据集将按照正常标准与规则进行计费,计费详情参照:[专业数据集](/docs/agent-plan-personal-afp-credits-billing-rules#e5f6a7b8) 与 [专业数据集](/docs/agent-plan-personal-over-quota-postpaid-rules#1a2b3c4d) - 每个账号在活动期间仅可获得一次活动资格和一份活动额度。续费、升配、换档、退订后重新购买套餐等操作,均不会使该账号重新获得或重置活动额度。若活动到期后,剩余活动额度自动收回并作废。 # 特别说明 - 如多个账户通过同一手机号、同一证件号、同一账号 ID,或其他经火山引擎排查多个账户为同一实际控制人的,均视为"同一用户"。用户不得通过批量注册、冒用他人身份、利用系统漏洞或其他不正当方式获取活动权益。 - 对恶意抢占活动资源、批量刷单及其他任何采用非常规手段影响活动公平性和违反服务协议及规则的行为,火山引擎有权取消从事违法违规行为的用户活动资格并回收活动额度,必要时追究违规用户的法律责任。 - 火山引擎可以根据运营情况对活动进行变更或调整,包括但不限于活动规则、商品数量、活动资格与额度、活动有效期等,请以页面最新内容及火山引擎通知为准。用户在活动规则变更或调整前已发放的服务和权益不受影响。 - 价值24元的数据调用服务是按照专业数据集 MCP 对应数据服务计费规则与标准计算得出,未使用的活动额度到期自动作废,不支持延期使用,未使用部分无法折算成积分进行其他场景调用。 --- # Agent Plan 套餐赠送 ArkClaw 权益调整公告 Source: https://ark.volcengine.com/region:cn-beijing/docs/agent-plan-personal-arkclaw-benefit-deprecation 发布日期:2026 年 8 月 27 日 为持续优化产品与套餐结构,火山方舟将对 Agent Plan 套餐的赠送权益进行调整。现将有关事项公告如下。 ## 一、调整内容 自 2026 年 9 月 1 日起,Agent Plan Medium 及以上套餐不再赠送 ArkClaw 权益。该调整仅涉及赠送的 ArkClaw,套餐的其他构成不变。 ## 二、存量用户过渡安排 - 您已获赠的 ArkClaw 可继续使用至当前订阅月到期,下一订阅月将不再赠送。 - 当前订阅月到期后,无论续费、新购或升配,活动结束后均不再包含赠送的 ArkClaw。 - 若您还未领取,可在活动结束前,前往 [火山方舟体验中心](https://ark.volcengine.com/region:cn-beijing/application/claw) 进行领取和创建,逾期无法补发。 - 您的套餐其余权益、剩余订阅时长、模型调用配额均不受影响,本次调整仅涉及赠送的 ArkClaw 权益。 ## 三、关于“订阅月”的说明 本公告中的“订阅月”指套餐配额的当前刷新周期,与用户一次性购买的套餐总时长无关。 示例:某用户于 2026 年 8 月 8 日购买 Agent Plan Medium 12 个月套餐,其套餐配额每月 8 日刷新。则该用户已获赠的 ArkClaw 可使用至 2026 年 9 月 7 日,自 9 月 8 日进入新订阅月起不再赠送;其 12 个月套餐的主体权益与剩余时长不受影响,可正常使用至 2027 年 8 月 7 日。 ## 四、不受本次调整影响的内容 以下内容在本次调整中均不变更: - 套餐的模型调用配额及配额刷新规则。 - 套餐的剩余订阅时长与到期时间。 - 套餐价格与已完成的付费权益。 - 除赠送 ArkClaw 外的其他套餐权益。 ## 五、后续使用 到期后您仍可单独开通 ArkClaw,可通过 [ArkClaw 控制台](https://console.volcengine.com/arkclaw) 进行开通。 ## 六、咨询方式 如对本次调整有任何疑问,可通过控制台提交工单,或联系您的客户经理及在线客服。 感谢您对火山方舟的支持。 --- # 模型抵扣系数调整公告 Source: https://ark.volcengine.com/region:cn-beijing/docs/agent-plan-personal-afp-credit-deduction 为优化产品计费、提升用量预估的确定性,自**2026年9月1日**起,套餐内 AFP 抵扣规则将进行调整。调整后,文本生成模型与向量化模型的**输入抵扣系数将不再按输入长度分段计算**,统一适用模型对应的抵扣系数。 ## 一、调整内容 **调整前:**`输入抵扣系数 = 模型抵扣系数 × 输入分段系数`,其中输入分段系数根据输入 token 长度分为三档: | 输入长度 | 输入分段系数 | |---|---| | 输入长度 ≤ 32k | 0.67 | | 32k < 输入长度 ≤ 128k | 1 | | 输入长度 > 128k | 2 | **调整后:** 取消输入分段系数,输入抵扣系数统一等于模型抵扣系数,不再随输入长度变化。 | 输入长度 | 输入分段系数 | |---|---| | 任意长度 | 1(统一) | ## 二、影响范围 本次调整仅影响**文本生成模型与向量化模型**的输入抵扣系数,输出抵扣系数及视频生成、图片生成、语音模型、专业数据集等其他模型的抵扣规则保持不变。 调整后各模型输入/输出抵扣系数如下: | 模型类别 | 模型 | 输入抵扣系数 | 输出抵扣系数 | |---|---|---:|---:| | 文本生成(极速) | `doubao-seed-2.0-mini` | 0.25 | 0.25 | | 文本生成(标准) | `doubao-seed-2.0-lite`
    `deepseek-v4-flash` | 0.5 | 0.5 | | 文本生成(进阶) | `doubao-seed-2.1-turbo`
    `doubao-seed-evolving`
    `minimax-m3` | 2.5 | 2.5 | | 文本生成(进阶) | `kimi-k2.7-code` | 4.5 | 4.5 | | 文本生成(进阶) | `glm-5.2`(即将下线) | 4.5 | 4.5 | | 文本生成(进阶) | `glm-5.3`(`glm-latest`) | 4.5 | 4.5 | | 文本生成(进阶) | `deepseek-v4-pro` | 5.5 | 5.5 | | 文本生成(进阶) | `kimi-k3` | 10 | 10 | | 向量化 | `doubao-embedding-vision` | 0.5 | 0.5 | ## 三、抵扣公式(不变) 文本生成模型、向量化模型单次请求 AFP 消耗: `AFP 消耗 =(输入 token × 输入抵扣系数 + 输出 token × 输出抵扣系数)/ 10,000` ## 四、抵扣示例 以 `doubao-seed-2.1-turbo` 为例,某次请求输入为 50k token,输出为 0.5k token: ```Plain Text AFP 消耗 =(50,000 × 2.5 + 500 × 2.5)/ 10,000 = 12.625 AFP ``` 调整前同等条件下输入 50k token(处于 32k ~ 128k 档)的抵扣系数同样为 2.5,计算结果一致;但对于 ≤32k 的短输入,调整后 AFP 消耗将有所上升;对于 >128k 的长输入,调整后 AFP 消耗将有所下降。 ## 五、其他说明 - 2026年6月10日至2026年11月8日活动期间,Auto 模式抵扣系数为 0.5 的限时折扣活动不受影响。 - 如有疑问,请联系您的客户成功经理或提交工单咨询。 --- # Agent Plan Small & Medium 套餐限时邀请活动 Source: https://ark.volcengine.com/region:cn-beijing/docs/agent-plan-personal-small-medium-invitation 本活动为方舟 Agent Plan 个人版 Small & Medium 套餐的限时新用户邀请活动。邀请人可获得代金券奖励,奖励上不封顶,被邀请人将获得首单限时叠加优惠奖励。 # 活动时间 2026年7月24日至2026年12月31日 # 活动入口 [单击前往活动](https://www.volcengine.com/activity/agentplan) # 邀请者福利 邀请人成功邀请好友(即“受邀用户”)完成首个 Agent Plan Small 或 Agent Plan Medium 的有效支付后,可获得代金券奖励: 1. 奖励计算: - 每成功邀请 1 名有效好友,邀请人即可获得该好友首单实际支付金额的 5% 作为代金券奖励。 - 邀请人数无上限,奖励多邀多得。 2. 实际支付金额定义:受邀用户首单订阅时,最终实际支付的现金金额。 3. 代金券使用规则: - 性质:代金券是平台提供的优惠权益,不可提现、转让或找零。 - 抵扣范围:方舟 Agent Plan Medium 套餐与方舟 Agent Plan Small 套餐。 - 有效期:发放即日起至 2027 年 3 月 31 日,逾期自动作废。 # 被邀请者福利 受邀用户通过有效的邀请链接或邀请码完成方舟 Agent Plan Small 或 Medium 套餐的首次订阅时,可享受首次订阅订单应付金额 9.5 折的叠加优惠。 1. 适用对象与条件: - 受邀用户从未购买过方舟 Agent Plan Small 或 Medium 套餐。 - 若受邀用户历史购买过方舟 Agent Plan Large 或 Max 套餐,但从未购买过方舟 Agent Plan Small 或 Medium 套餐,仍可作为受邀用户参与本活动。 - 用户一旦创建邀请码,即成为“邀请人”,将无法再作为“被邀请人”享受首单折扣;但“被邀请人”可以作为新的“邀请人”邀请其他人。 - 每个用户仅可以以受邀用户身份享受一次 9.5 折叠加优惠。 2. 强烈建议:9.5 折叠加优惠适用于整个首单订单。一次性订阅多月套餐,相比订阅单月并自动续费更为划算。 # 邀请关系的绑定 1. 邀请好友:点击活动页上的邀请好友按钮,即可生成专属邀请链接与邀请码。当好友点击专属链接或通过邀请码完成登录(或注册)时,双方邀请关系即绑定。 2. 获取奖励:受邀用户须在本活动有效期内完成首单支付,方可计为一次有效邀请,作为计算邀请奖励的依据。 3. 注意:邀请关系以首次绑定为准,作为后续计算邀请奖励的唯一依据。 # 特别说明 1. 邀请关系以受邀用户点击专属链接或填写邀请码进行订阅为准,系统记录为唯一凭证。平台将综合账号、设备、支付等信息判定用户身份合理性。任何作弊行为(如批量注册、虚假支付等)将导致所有相关奖励无效。 2. 平台可根据运营情况调整或终止本活动,并于页面公告。在法律允许范围内,本规则的最终解释权归平台所有。 3. 若活动终止,对于活动终止前已建立的邀请关系,受邀用户需在活动公告的终止日期前完成支付方可生效。对于已发放至用户账户的代金券,其相关权益将予以保障。 --- # Agent/Coding Plan 指定模型抵扣系数限时折扣活动 Source: https://ark.volcengine.com/region:cn-beijing/docs/agent-plan-personal-model-discount 活动期间内,Agent/Coding Plan 个人版用户使用指定模型时,模型抵扣系数在现有抵扣系数基础上享最低 2.5 折优惠。活动到点自动生效,无需用户申请。各模型的活动时间参见[活动时间](/docs/agent-plan-personal-model-discount#a2f6c9d4)。 # 活动时间 * Auto 模式:2026年6月10日18:00:00至2026年11月8日23:59:59 * glm-5.3-flash 模型:2026年8月28日00:00:00至2026年9月11日23:59:59 * deepseek-v4.1-flash 模型:2026年9月15日00:00:00至2026年12月30日23:59:59 * deepseek-v4.1-flash-economy 模型:2026年10月20日00:00:00至2026年12月30日23:59:59 * kimi-k2.8-preview 模型:2026年9月17日00:00:00至2026年12月14日23:59:59 * kimi-k3 模型:2026年10月12日00:00:00至2026年10月25日23:59:59 * glm-5.2 模型:2026年6月10日18:00:00至2026年8月8日23:59:59 * deepseek-v4-pro、kimi-k2.6、kimi-k2.7-code 模型:2026年6月10日18:00:00至2026年7月15日00:00:00 # 活动对象 所有 Agent/Coding Plan 个人版用户,活动到点自动生效,无需申请。 # 适用产品与模型 | 适用产品 | 适用模型 | 活动状态 | 优惠规则 | |---|---|---|---| | Agent/Coding Plan 个人版 | Auto 模式 | 进行中 | Auto 模式在 Agent Plan 中抵扣系数为0.5,支持路由到 kimi-k3,夜间 00:00-8:00,kimi-k3 的路由比例会大幅度提升。 | | ^^ | deepseek-v4.1-flash | 进行中 | 新模型上线限时活动,活动期间模型抵扣系数在现有抵扣系数基础上享 5 折优惠,可使用配额为原用量的 200%。 | | ^^ | deepseek-v4.1-flash-economy | 进行中 | 新模型上线限时活动,活动期间模型抵扣系数在现有抵扣系数基础上享 5 折优惠,可使用配额为原用量的 200%。 | | ^^ | kimi-k2.8-preview | 进行中 | 新模型上线限时活动,活动期间模型抵扣系数在现有抵扣系数基础上享 6 折优惠,可使用配额为原用量的 166%。 | | ^^ | kimi-k3 | 进行中 | 活动期间模型抵扣系数在现有抵扣系数基础上享 5 折优惠,可使用配额为原用量的 200%。 | | ^^ | glm-5.3-flash | 已结束 | 新模型上线活动,活动期间模型抵扣系数在现有抵扣系数基础上享 5 折优惠,可使用配额为原用量的 200%。 | | ^^ | deepseek-v4-pro | 已结束 | 活动期间,模型抵扣系数在现有抵扣系数基础上享 4 折优惠,可使用配额为原用量的 250%。 | | ^^ | kimi-k2.6 | 已结束 | ^^ | | ^^ | kimi-k2.7-code | 已结束 | 新模型上线,模型抵扣系数在现有抵扣系数基础上享 2.5 折优惠,可使用配额为原用量的 400%。 | | ^^ | glm-5.2 | 已结束 | ^^ | # 参与方式 活动到点自动生效。 * 您可以访问 [方舟 Agent Plan 活动](https://www.volcengine.com/activity/agentplan) 了解活动详情并订阅 Agent Plan 套餐。 * 您可以访问 [方舟 Coding Plan 活动](https://www.volcengine.com/activity/codingplan) 了解活动详情并订阅 Coding Plan 套餐。 # 特别说明 * 本活动仅调整适用模型在活动期间的抵扣系数,不改变套餐内其他模型、Harness、套餐额度刷新规则与使用限制。 * 活动结束后,适用模型的抵扣系数恢复为原有规则。 * 火山引擎可以根据运营情况对活动进行变更或调整,包括不限于活动规则、活动有效期等,请以页面最新内容及火山引擎通知为准。 --- # Agent Plan Small & Medium 套餐 2.5 折普惠活动 Source: https://ark.volcengine.com/region:cn-beijing/docs/agent-plan-personal-universal-promotion 2026年6月8日至2026年11月8日活动期间内,所有用户购买 Agent Plan Small、Medium 套餐,最多可享首两个月 2.5 折优惠,第三个月起恢复原价。**名额有限,先到先得**;优惠资格在新购、续费、升级场景间共享,使用后不因升档或后续退订等操作重新获得。 # 活动时间 2026年6月8日至2026年11月8日 # 活动对象 所有用户,**名额有限**,**先到先得** # 适用产品与档位 > **注意** > > * 活动期间内,每个账号最多能享受两个月的特惠套餐,新购、续费、升配共享同一优惠资格。 > * 若用户首次仅订阅了一个月的特惠套餐,第二个月的特惠套餐相关操作(包含新购、续费、升配)需在首月套餐购买成功次日起才可进行。 | 档位 | 原价 | 折扣价 | 折扣享受条件 | |---|---|---|---| | Small | 40元 | 9.9元 | 2026年6月8日至2026年11月8日,首两个月套餐可享。 | \ | | | |* 新用户: | \ | | | | * 如果当前没有订阅套餐,购买前两个月套餐 2.5 折,第三个月起原价。 | \ | | | |* 老用户: | \ | | | | * 若当前已有订阅 Small 套餐,续费或升配至 Medium 套餐,前两个月套餐 2.5折(不满 1 个月按 1 个月计算),第三个月起原价。 | \ | | | | * 若当前已有订阅 Medium 套餐,续费前两个月套餐 2.5折,第三个月起原价。 | | Medium | 200元 | 49.9元 | ^^ | # 优惠资格规则 * 活动优惠资格按用户维度发放,仅能在同一账号内享受。 * **新购、续费、升配共享同一优惠资格**。 * 用户使用优惠资格后,后续操作**不会因续费、升配或换档重新获得优惠**。 * **名额有限,先到先得**。 # 特别说明 * 如多个账户通过同一手机号、同一证件号、同一账号 ID,或其他经火山引擎排查多个账户为同一实际控制人的,均视为“同一用户”。 * 对恶意抢占活动资源、批量刷单及其他任何采用非常规手段影响活动公平性和违反服务协议及规则的行为,火山引擎有权取消从事违法违规行为的用户活动资格并回收奖励包资源,必要时追究违规用户的法律责任。 * 火山引擎可以根据运营情况对活动进行变更或调整,包括不限于活动规则、商品数量、活动有效期等,请以页面最新内容及火山引擎通知为准。用户在活动规则变更或调整前已发放的服务和权益不受影响。 --- # 连续包季/包年活动 Source: https://ark.volcengine.com/region:cn-beijing/docs/agent-plan-personal-annual-quarterly 本活动是方舟 Agent Plan 上线期间面向开发者的限时折扣活动,仅在活动期内开通连续包季/包年订阅可享。 # 活动概览 ## 活动时间 2026.5.19 00:00 - 2028.5.19 23:59 ## 活动入口 [单击前往活动](https://www.volcengine.com/activity/agentplan),立即订阅。 ## 活动内容 活动期间,购买方舟 Agent Plan 并选择连续包季或连续包年自动续费的用户可享受以下活动折扣: - **连续包季**:享 **9.7 折**优惠 - **连续包年**:享 **9.5 折**优惠 | 订阅类型 | 套餐类型 | 活动折扣价 | 原价 | | --- | --- | --- | --- | | 连续包季 | Small Plan | ¥116.4 / 季 | ¥120 / 季 | | 连续包季 | Medium Plan | ¥582 / 季 | ¥600 / 季 | | 连续包季 | Large Plan | ¥1,455 / 季 | ¥1,500 / 季 | | 连续包季 | Max Plan | ¥2,910 / 季 | ¥3,000 / 季 | | 连续包年 | Small Plan | ¥456 / 年 | ¥480 / 年 | | 连续包年 | Medium Plan | ¥2,280 / 年 | ¥2,400 / 年 | | 连续包年 | Large Plan | ¥5,700 / 年 | ¥6,000 / 年 | | 连续包年 | Max Plan | ¥11,400 / 年 | ¥12,000 / 年 | # 用户须知 ## 关于自动续费 1. 开通连续包季 / 连续包年即视为您同意以自动续费方式续订方舟 Agent Plan 服务,更多详情查看:[自动续费规则](https://docs.volcengine.com/docs/6269/1134227?_vtm_=0.0.0.0.finance-fastbuy-drawer-175&lang=zh)。 2. 多次重试自动扣款仍失败的,您的连续包季/包年订阅将自动转为非订阅状态,届时您可在控制台手动开通新的订阅,订阅金额以重新开通日的价格为准。 3. 非我方原因导致扣款失败,从而导致服务中断或不可用,我方不承担任何责任。 ## 2.2 关于活动调整 1. 活动期以本页面公示时间为准,如有调整以最新公告为准。 2. 活动折扣价**适用于活动期内开通的首个订阅周期**。后续自动续费的实际扣款金额,**以续费扣款日当日页面公示的有效价格为准。** 活动调整或终止**不会影响您已成功扣款且未结束的订阅周期内的服务与折扣**。 3. 活动调整/终止前**至少提前 7 个自然日**通过公告、站内信等方式公示,并对受影响的自动续费用户**至少提前 7 个自然日**通过短信、站内信、邮件等方式单独告知。 4. 您对活动调整有任何异议的,可在公示期内通过费用中心关闭自动续费,**已开通且未结束周期内的服务与折扣不受任何影响**。 ## 2.3 特别说明 1. 如多个账户通过同一手机号、同一证件号、同一账号 ID,或其他经火山引擎排查多个账户为同一实际控制人的,均视为“同一用户”。 2. 对恶意抢占活动资源、批量刷单及其他任何采用非常规手段影响活动公平性和违反服务协议及规则的行为,火山引擎有权取消从事违法违规行为的用户活动资格并回收奖励包资源,必要时追究违规用户的法律责任。 3. 火山引擎可以根据运营情况对活动进行变更或调整,包括不限于活动规则、商品数量、活动有效期等,请以页面最新内容及火山引擎通知为准。用户在活动规则变更或调整前已发放的服务和权益不受影响。 --- # Agent Plan Medium 套餐 seedance 2.0 系列模型调整公告 Source: https://ark.volcengine.com/region:cn-beijing/docs/agent-plan-personal-medium-seedance # 调整内容 为优化 Agent Plan 套餐能力配置,自2026年6月8日起,Agent Plan Medium 套餐将不再支持 seedance 2.0 系列模型调用,包含 seedance 2.0 与 seedance 2.0 fast 模型。本次调整仅涉及 Agent plan Medium 套餐中的 seedance 2.0 系列模型能力,不影响其他已支持模型及其他档位套餐现有权益。 # 影响范围 2026年6月8日00:00:00 前已订阅并生效的 Agent Plan Medium 套餐用户。 > **说明** > > 2026年6月8日00:00:00 后新购、续费、升配的 Medium 套餐,不包含在本次影响范围内。时间以套餐生效时间为准。 # 处理方案 如你受本次调整实际影响,可于**2026年6月8日至2026年6月15日**前往 [火山方舟控制台](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=agentPlan),将符合条件的 Medium 套餐免费升级 Large 套餐,逾期不再受理。 > **注意** > > 本次补偿仅有1次免费升配机会,若因错误操作导致资格失效,资格不再恢复。具体资格以控制台页面展示及系统校验结果为准。平台将结合套餐生效情况及相关使用情况进行资格校验。 | 订阅情况 | 是否符合免费升级条件 | |-|-| | 2026年6月8日00:00:00 前已订阅并生效的 Medium 套餐周期 | 适用 | | 2026年6月8日00:00:00 后新购的 Medium 套餐 | 不适用 | | 2026年6月8日00:00:00 后续费形成的新套餐周期 | 不适用 | | 2026年6月8日00:00:00 后升配的 Medium 套餐 | 不适用 | --- # 功能发布公告 Source: https://ark.volcengine.com/region:cn-beijing/docs/agent-plan-personal-feature-release # 202610 |发布日期 |功能说明 |帮助文档 | |---|---|---| |10.20 |* 模型新增:支持 `deepseek-v4.1-flash-economy` 模型。 |[支持的模型](/docs/agent-plan-personal-plan-overview#3d801f5f) | \ | |* 新模型限时活动:`deepseek-v4.1-flash-economy` 抵扣系数 5 折,截止 2026-12-30 23:59:59。 |[限时折扣活动](/docs/agent-plan-personal-model-discount) | \ |10.19 |* 模型启动下线:`minimax-m3` 模型启动下线。 |[模型下线公告](/docs/agent-plan-personal-model-deprecation-announcement#4a9c7f81) | \ | | | | |10.13 |* 模型启动下线:`kimi-k2.7-code` 模型启动下线。 |[模型下线公告](/docs/agent-plan-personal-model-deprecation-announcement#b2c8f1a0) | \ | | | | # 202609 |发布日期 |功能说明 |帮助文档 | |---|---|---| |09.23 |* 模型新增:支持 `doubao-seed-2.1-pro`、`doubao-seed-2.1-lite`模型,`doubao-seed-2.0-mini` 更新至最新版本。 |[支持的模型](/docs/agent-plan-personal-plan-overview#3d801f5f) | \ | |* 模型启动下线:`doubao-seed-2.1-turbo`、`doubao-seed-2.0-lite`模型启动下线。 |[模型下线公告](/docs/agent-plan-personal-model-deprecation-announcement#e4b7c2a9) | |09.17 |* 模型新增:支持 `kimi-k2.8-preview` 模型 |[支持的模型](/docs/agent-plan-personal-plan-overview#3d801f5f) | \ | |* 新模型限时活动:`kimi-k2.8-preview` 抵扣系数 6 折,截止 2026-09-30 23:59:59。 |[限时折扣活动](/docs/agent-plan-personal-model-discount) | |09.15 |* 模型新增:支持 `deepseek-v4.1-flash` 模型 |[支持的模型](/docs/agent-plan-personal-plan-overview#3d801f5f) | \ | |* 新模型限时活动:`deepseek-v4.1-flash` 抵扣系数 5 折,截止 2026-09-28 23:59:59。 |[限时折扣活动](/docs/agent-plan-personal-model-discount) | |09.11 |* 模型新增:支持 `doubao-seedance-2.5` 视频生成模型,支持 Large 及以上套餐。 |[支持的模型](/docs/agent-plan-personal-plan-overview#3d801f5f) | \ | | | | |09.11 |* 模型新增:支持 `doubao-seedream-5-0-pro` 图片生成模型。 |[支持的模型](/docs/agent-plan-personal-plan-overview#3d801f5f) | \ | | | | # 202608 |发布日期 |功能说明 |帮助文档 | |---|---|---| |08.28 |* 模型新增:支持 `glm-5.3-flash` 模型,首个原生多模态模型,以极致低成本架构实现超越 GLM-5.2 的更强智能。 |[支持的模型](/docs/agent-plan-personal-plan-overview#3d801f5f) | \ | |* 限时活动:`glm-5.3-flash` 首两周抵扣系数 5 折优惠,活动截止 2026-09-11 23:59:59。 |[限时折扣活动](/docs/agent-plan-personal-model-discount) | \ |08.24 |* 模型新增:`deepseek-v4-pro` 正式版已上线,Agent 能力全面跃升,支持通过 model name 及控制台选择进行访问。 |[支持的模型](/docs/agent-plan-personal-plan-overview#3d801f5f) | \ | | | | |08.17 |* 模型启动下线:`glm-5.2` 模型启动下线。 |[模型下线公告](/docs/agent-plan-personal-model-deprecation-announcement#b6a4c2d1) | \ | | | | |08.14 |* 模型新增:支持 `glm-5.3` 模型。 |[支持的模型](/docs/agent-plan-personal-plan-overview#3d801f5f) | \ | | | | |08.07 |* 模型更新:`deepseek-v4-flash` 正式版已全量上线,支持通过 model name 直接调用。 |[支持的模型](/docs/agent-plan-personal-plan-overview#3d801f5f) | \ | | | | |08.04 |* 模型启动下线:`kimi-k2.6`、`minimax-m2.7` 模型启动下线。 |[模型下线公告](/docs/agent-plan-personal-model-deprecation-announcement#7a3d1c90) | \ | | | | |08.03 |* 模型新增:支持 `deepseek-v4-flash` 正式版模型。 |[支持的模型](/docs/agent-plan-personal-plan-overview#3d801f5f) | \ | | | | # 202607 |发布日期 |功能说明 |帮助文档 | |---|---|---| |07.23 |* 模型新增:支持 `doubao-seed-2.1-turbo` 模型。 |[支持的模型](/docs/agent-plan-personal-plan-overview#3d801f5f) | \ | | | | |07.17 |* 模型新增:支持 `kimi-k3` 模型。 |[支持的模型](/docs/agent-plan-personal-plan-overview#3d801f5f) | \ | | | | |07.15 |* 模型新增:支持 `doubao-seed-evolving` 模型。 |[支持的模型](/docs/agent-plan-personal-plan-overview#3d801f5f) | \ | | | | |07.01 |* Small、Medium 套餐支持 AI Native 应用开发底座。 |[套餐概览](/docs/agent-plan-personal-plan-overview#3d801f5f) | \ | | | | # 202606 |发布日期 |功能说明 |帮助文档 | |---|---|---| |06.30 |* 模型下线:`glm-5.1`,`deepseek-v3.2` 模型下线。 | [支持的模型](/docs/agent-plan-personal-plan-overview#3d801f5f)| \ | | | | |06.25 |* 模型新增:支持 `doubao-seedance-2.0-mini` 视频生成模型,仅 Large、Max 套餐支持。 |[支持的模型](/docs/agent-plan-personal-plan-overview#3d801f5f) | \ | | | | |06.21 |* 联网搜索(Beta)版升级为豆包搜索。 |[套餐概览](/docs/agent-plan-personal-plan-overview#3d801f5f) | \ | |* 新增支持 AI Native 应用开发底座、Agent 记忆。 | | |06.17 |* 模型新增:支持 `glm-5.2`、`kimi-k2.7-code` 模型。 |[支持的模型](/docs/agent-plan-personal-plan-overview#3d801f5f) | \ | | | | |06.11 |* 模型新增:语音模型 `doubao-seed-tts-2.0`、`doubao-seed-asr-2.0`。|[套餐概览](/docs/agent-plan-personal-plan-overview#3d801f5f) | \ | |* 新增支持专业数据集,支持开启超额后付费。 | | |06.08 |* 模型新增:支持 `minimax-m3` 模型。 |[支持的模型](/docs/agent-plan-personal-plan-overview#3d801f5f) | \ | |* 模型下线:`minimax-m2.5`、`kimi-k2.5`、`glm-4.7` 模型下线。 | | # 202605 |发布日期 |功能说明 |帮助文档 | |---|---|---| |05.15 |* 模型新增:支持 `deepseek-v4-flash`、`deepseek-v4-pro` 模型。 |[支持的模型](/docs/agent-plan-personal-plan-overview#3d801f5f) | \ | | | | |05.07 |* 方舟 Agent Plan 正式上线,支持全模态模型及 Harness,采用精细化积分计费模式。 |[套餐概览](/docs/agent-plan-personal-plan-overview) | \ | | | | --- # 模型上线公告 Source: https://ark.volcengine.com/region:cn-beijing/docs/agent-plan-personal-model-release 本文用于汇总 Agent Plan 个人版新增模型的上线记录,并提供对应帮助文档入口。如果需要使用新模型,可参见[切换模型步骤](/docs/agent-plan-personal-model-release#9a17d0f3)。 # 202610 |发布日期 |模型 |说明 |如何使用 | |---|---|---|---| |10.20 |deepseek-v4.1-flash-economy |DeepSeek-V4.1-Flash-Economy 与标准版采用完全相同的模型权重,能力与效果完全一致。经济版价格更低,回答生成速度略慢,适合注重成本、对生成速度要求不高的场景,支持多模态输入。 |[快速开始](/docs/agent-plan-personal-get-started) | # 202609 |发布日期 |模型 |说明 |如何使用 | |---|---|---|---| |09.23 |doubao-seed-2.1-pro |豆包 Seed 2.1 系列旗舰模型,全面升级 Coding、Agent 与多模态能力,具备顶尖推理与复杂任务执行能力。 |[快速开始](/docs/agent-plan-personal-get-started) | |09.23 |doubao-seed-2.1-lite |豆包 Seed 2.1 系列轻量模型,兼顾生成质量与响应速度,适合通用生产级任务。 |[快速开始](/docs/agent-plan-personal-get-started) | |09.23 |doubao-seed-2.0-mini |豆包 Seed 2.0 Mini 模型,已升级到 0428 版本,Agent 能力显著增强。 |[快速开始](/docs/agent-plan-personal-get-started) | |09.17 |kimi-k2.8-preview |综合性能接近 K3,思考效率更高,擅长代码补全与常规开发任务,支持 1024k 上下文窗口。 |[快速开始](/docs/agent-plan-personal-get-started) | |09.15 |deepseek-v4.1-flash |DeepSeek-V4.1-Flash 是 DeepSeek 全新架构系列中的轻量旗舰模型,以 552B 总参数 MoE 实现越级智能,在多项基准上超越包括 DeepSeek-V4-Pro 在内的主流旗舰模型,原生具备多模态视觉理解能力。 |[快速开始](/docs/agent-plan-personal-get-started) | |09.11 |doubao-seedance-2.5 |视频生成模型,支持 Large 及以上套餐。 |[接入视觉模型](/docs/agent-plan-personal-visual-models) | |09.11 |doubao-seedream-5-0-pro |图片生成模型,支持文生图、图层拆分等能力。 |[接入视觉模型](/docs/agent-plan-personal-visual-models) | # 202608 |发布日期 |模型 |说明 |如何使用 | |---|---|---|---| |08.28 |glm-5.3-flash |首个原生多模态模型,以极致低成本架构实现超越 GLM-5.2 的更强智能。 |[快速开始](/docs/agent-plan-personal-get-started) | |08.24 |deepseek-v4-pro 正式版 |deepseek-v4-pro 正式版已上线,Agent 能力全面跃升,支持通过 model name 及控制台选择进行访问。 |[快速开始](/docs/agent-plan-personal-get-started) | |08.14 |glm-5.3 |智谱旗舰 GLM-5.3,编程与安全能力突出,支持 1M 上下文窗口,可生产级代码交付。 |[快速开始](/docs/agent-plan-personal-get-started) | |08.07 |deepseek-v4-flash 正式版 |deepseek-v4-flash 正式版已全量上线,支持通过 model name `deepseek-v4-flash` 直接调用。 |[快速开始](/docs/agent-plan-personal-get-started) | |08.03 |deepseek-v4-flash 正式版 |deepseek-v4-flash 正式版已上线,Agent 能力大幅增强,基准测试远超 V4-Pro-Preview。|[快速开始](/docs/agent-plan-personal-get-started) | # 202607 |发布日期 |模型 |说明 |如何使用 | |---|---|---|---| |07.23 |doubao-seed-2.1-turbo |效果与成本均衡,全面升级 Coding、Agent 与多模态能力,以更强的自主规划、长链路执行和动态修复能力,胜任企业真实复杂任务。 |[快速开始](/docs/agent-plan-personal-get-started) | |07.17 |kimi-k3 | 原生支持视觉理解,并拥有 100 万 token 上下文窗口,面向软件工程、知识工作和深度推理等前沿智能场景而设计。 |[快速开始](/docs/agent-plan-personal-get-started) | |07.15 |doubao-seed-evolving |面向 Coding 与 Agent 场景,持续周级升级,以统一模型 ID 提供最新能力,助力复杂任务高效落地。 |[快速开始](/docs/agent-plan-personal-get-started) | # 202606 |发布日期 |模型 |说明 |如何使用 | |---|---|---|---| |06.25 |doubao-seedance-2.0-mini |视频生成模型,仅 Large、Max 套餐支持。 |[接入视觉模型](/docs/agent-plan-personal-visual-models) | |06.17 |glm-5.2 |智谱面向长程自主编码场景的旗舰开源模型,全面强化了大型代码库工程、长程任务规划与工具协同能力,在多个榜单上斩获开源第一,整体表现对齐海外闭源 SOTA 模型,开发场景的成功率进一步提升。它支持真正可用的 1M 上下文,可一次性承载项目级工程,且在执行复杂智能体任务时,指令遵循与工具调用更加稳定,一次任务即可贯通需求到多端可部署产物的完整开发链路。 |[快速开始](/docs/agent-plan-personal-get-started) | |06.17 |kimi-k2.7-code |月之暗面最新代码模型,主打长上下文编程、复杂软件工程任务、工具调用与多步调试,指令遵循和任务完成率高。 |[快速开始](/docs/agent-plan-personal-get-started) | |06.11 |doubao-seed-tts-2.0 |语音合成模型,支持在 Agent Plan 个人版套餐中调用。 |[接入语音模型](/docs/agent-plan-personal-voice-model) | |06.11 |doubao-seed-asr-2.0 |语音识别模型,支持在 Agent Plan 个人版套餐中调用。 |[接入语音模型](/docs/agent-plan-personal-voice-model) | |06.08 |minimax-m3 | 国内首个同时具备前沿 Coding 与智能体能力、1M 超长上下文窗口、原生多模态输入的开源旗舰大模型。|[快速开始](/docs/agent-plan-personal-get-started) | # 202605 |发布日期 |模型 |说明 |如何使用 | |---|---|---|---| |05.15 |deepseek-v4-flash |DeepSeek 高效经济版大模型,同享百万上下文与先进架构,推理速度更快、成本更低,平衡性能与效率,适合日常问答、轻量 Agent 及高并发场景。|[快速开始](/docs/agent-plan-personal-get-started) | |05.15 |deepseek-v4-pro |DeepSeek 新一代旗舰大模型,采用 MoE 架构,原生支持百万级超长上下文,具备顶尖推理、代码与复杂 Agent 能力,适合高强度复杂任务与专业场景。 |[快速开始](/docs/agent-plan-personal-get-started) | # 切换模型步骤 以下是针对文本生成模型的切换方式。 ## 方式一:使用 latest 配置(推荐) 在配置模型名称时,推荐使用 latest 配置,避免旧版本模型下线带来的影响: - ark-code-latest:可在控制台选择或切换目标模型,不需要修改工具配置文件。 - glm-latest、minimax-latest、kimi-latest、deepseek-latest:默认使用支持的最新版本模型,可第一时间使用对应最新版本模型。 |latest 模型 |对应模型 | |---|---| |glm-latest |glm-5.3 | |minimax-latest |minimax-m3 | |kimi-latest |kimi-k2.7-code | |deepseek-latest |deepseek-v4-pro | ## 方式二:修改配置文件 如果在工具中配置的是具体的 Model Name,在旧模型下线前需要将配置文件中的模型信息更新为当前支持的模型名称。不同工具的配置入口参见对应文档: * Claude Code:[配置 Claude Code](/docs/agent-plan-personal-claude-code#92b07719) * OpenClaw:[配置 OpenClaw](/docs/agent-plan-personal-openclaw#48c0b1ea) * Codex:[配置 Codex CLI](/docs/agent-plan-personal-codex#b7c0b9c1) * OpenCode:[配置 OpenCode](/docs/agent-plan-personal-opencode#c807cb71) * TraeCode:[配置 TraeCode](/docs/agent-plan-personal-trae#3ef00eb4) * Hermes Agent:[配置 Hermes Agent](/docs/agent-plan-personal-hermes-agent#14207659) * 其他工具:[其他工具](/docs/agent-plan-personal-other-tools) --- # 模型下线公告 Source: https://ark.volcengine.com/region:cn-beijing/docs/agent-plan-personal-model-deprecation-announcement 随着 Agent Plan 的更新发布,新版本模型在效果、推理时延等各方面将远超较旧版本的模型。因此,我们将逐步下线这些旧版本模型。当某个模型确定下线计划时,我们会通过短信、站内信等方式发布通知,请及时关注。 可用模型范围以控制台实际展示为准,完整列表参见:[支持的模型](/docs/agent-plan-personal-plan-overview#3d801f5f)。在工具中切换模型,参见[切换模型步骤](/docs/agent-plan-personal-model-deprecation-announcement#9c6e8b2d)。 # 2026.10.19 启动模型下线说明 |模型 |下线计划 |建议迁移模型 | |---|---|---| |minimax-m3 |1. 启动&通知:2026-10-19 10:00:00(UTC+8) |doubao-seed-evolving / kimi-k3 | \ | |2. 模型停止对新用户提供服务:2026-10-19 10:00:00(UTC+8) | | \ | | > * 新用户无法使用该模型。新用户定义:购买 Agent Plan 套餐但未使用过该模型的用户。 | | \ | | > * 建议提前切换至对应的替换模型,并测试验证新模型对业务的影响。 | | \ | |3. 模型服务下线:2026-11-02 14:00:00(UTC+8) | | \ | | > 模型正式下线并停止服务,如果到期未迁移模型,会影响业务。 | | # 2026.10.13 启动模型下线说明 |模型 |下线计划 |建议迁移模型 | |---|---|---| |kimi-k2.7-code |1. 启动&通知:2026-10-13 10:00:00(UTC+8) |* Small 套餐:kimi-k2.8-preview | \ | |2. 模型停止对新用户提供服务:2026-10-13 10:00:00(UTC+8) |* 其他套餐:kimi-k3 | \ | | > * 新用户无法使用该模型。新用户定义:购买 Agent Plan 套餐但未使用过该模型的用户。 | | \ | | > * 建议提前切换至对应的替换模型,并测试验证新模型对业务的影响。 | | \ | |3. 模型服务下线:2026-10-28 14:00:00(UTC+8) | | \ | | > 模型正式下线并停止服务,如果到期未迁移模型,会影响业务。 | | # 2026.09.28 启动模型下线说明 详细信息 |模型 |下线计划 |建议迁移模型 | |---|---|---| |doubao-seedream-5.0-lite |1. 启动&通知:2026-09-28 10:00:00(UTC+8) |doubao-seedream-5.0-pro | \ | |2. 模型停止对新用户提供服务:2026-09-28 10:00:00(UTC+8) | | \ | | > * 新用户无法使用该模型。新用户定义:购买 Agent Plan 套餐但未使用过该模型的用户。 | | \ | | > * 建议提前切换至对应的替换模型,并测试验证新模型对业务的影响。 | | \ | |3. 模型服务下线:2026-10-12 14:00:00(UTC+8) | | \ | | > 模型正式下线并停止服务,如果到期未迁移模型,会影响业务。 | | # 2026.09.23 启动模型下线说明 详细信息 |模型 |下线计划 |建议迁移模型 | |---|---|---| |doubao-seed-2.1-turbo |1. 启动&通知:2026-09-23 10:00:00(UTC+8) |doubao-seed-2.1-pro | \ | |2. 模型停止对新用户提供服务:2026-09-23 10:00:00(UTC+8) | | \ | | > * 新用户无法使用该模型。新用户定义:购买 Agent Plan 套餐但未使用过该模型的用户。 | | \ | | > * 建议提前切换至对应的替换模型,并测试验证新模型对业务的影响。 | | \ | |3. 模型服务下线:2026-10-09 14:00:00(UTC+8) | | \ | | > 模型正式下线并停止服务,如果到期未迁移模型,会影响业务。 | | |doubao-seed-2.0-lite |^^ |doubao-seed-2.1-lite | # 2026.08.17 启动模型下线说明 详细信息 |模型 |下线计划 |建议迁移模型 | |---|---|---| |glm-5.2 |1. 启动&通知:2026-08-17 10:00:00(UTC+8) |glm-5.3 | \ | |2. 模型停止对新用户提供服务:2026-08-17 10:00:00(UTC+8) | | \ | | > * 新用户无法使用该模型,包含超额后付费。新用户定义:购买 Agent Plan 套餐但未使用过该模型的用户。 | | \ | | > * 建议提前切换至对应的替换模型,并测试验证新模型对业务的影响。 | | \ | |3. 模型服务下线:2026-08-31 14:00:00(UTC+8) | | \ | | > 模型正式下线并停止服务,如果到期未迁移模型,glm-5.2 会自动路由到 glm-5.3。 | | # 2026.08.04 启动模型下线说明 详细信息 |模型 |下线计划 |建议迁移模型 | |---|---|---| |kimi-k2.6 |1. 启动&通知:2026-08-04 10:00:00(UTC+8) |kimi-k2.7-code/kimi-k3 | \ | |2. 模型停止对新用户提供服务:2026-08-04 10:00:00(UTC+8) | | \ | | > * 新用户无法使用该模型。新用户定义:购买 Agent Plan 套餐但未使用过该模型的用户。 | | \ | | > * 建议提前切换至对应的替换模型,并测试验证新模型对业务的影响。 | | \ | |3. 模型服务下线:2026-08-18 14:00:00(UTC+8) | | \ | | > 模型正式下线并停止服务,如果到期未迁移模型,会影响业务。 | | |minimax-m2.7 |^^ |minimax-m3 | # 2026.07.24 启动模型下线说明 详细信息 |模型 |下线计划 |建议迁移模型 | |---|---|---| |doubao-seed-2.0-code |1. 启动&通知:2026-07-24 10:00:00(UTC+8) |doubao-seed-2.1-turbo | \ | |2. 模型停止对新用户提供服务:2026-07-24 10:00:00(UTC+8) | | \ | | > * 新用户无法使用该模型。新用户定义:购买 Agent Plan 套餐但未使用过该模型的用户。 | | \ | | > * 建议提前切换至对应的替换模型,并测试验证新模型对业务的影响。 | | \ | |3. 模型服务下线:2026-08-08 10:00(UTC+8) | | \ | | > 模型正式下线并停止服务,如果到期未迁移模型,会影响业务。 | | |doubao-seed-2.0-pro |^^ |doubao-seed-2.1-turbo | # 2026.07.10 启动模型下线说明 详细信息 |模型 |下线计划 |建议迁移模型 | |---|---|---| |doubao-seedance-1.5-pro |1. 启动&通知:2026-07-10 10:00:00(UTC+8) |doubao-seedance-2.0-mini | \ | |2. 模型停止对新用户提供服务:2026-07-10 10:00:00(UTC+8) | | \ | | > * 新用户无法使用该模型。新用户定义:购买 Agent Plan 套餐但未使用过该模型的用户。 | | \ | | > * 建议提前切换至对应的替换模型,并测试验证新模型对业务的影响。 | | \ | |3. 模型服务下线:2026-09-21 14:00(UTC+8) | | \ | | > 模型正式下线并停止服务,如果到期未迁移模型,会影响业务。 | | # 2026.06.17 启动模型下线说明 详细信息 |模型 |下线计划 |建议迁移模型 | |---|---|---| |glm-5.1 |1. 启动&通知:2026-06-17 10:00:00(UTC+8) |glm-5.2 | \ | |2. 模型停止对新用户提供服务:2026-06-17 10:00:00(UTC+8) | | \ | | > * 新用户无法使用该模型。新用户定义:购买 Agent Plan 套餐但未使用过该模型的用户。 | | \ | | > * 建议提前切换至对应的替换模型,并测试验证新模型对业务的影响。 | | \ | |3. 模型服务下线:2026-06-30 14:00(UTC+8) | | \ | | > 模型正式下线并停止服务,如果到期未迁移模型,会影响业务。 | | |deepseek-v3.2 |^^ |deepseek-v4-pro | # 已下线模型 |模型 |下线时间 | |---|---| |doubao-seedream-5.0-lite |10.12 | |doubao-seed-2.1-turbo |10.09 | |doubao-seed-2.0-lite |10.09 | |doubao-seedance-1.5-pro |09.21 | |glm-5.2 |08.31 | |kimi-k2.6 |08.18 | |minimax-m2.7 |08.18 | |doubao-seed-2.0-code |08.08 | |doubao-seed-2.0-pro |08.08 | |glm-5.1 |06.30 | |deepseek-v3.2 |06.30 | |minimax-m2.5 |06.08 | |kimi-k2.5 |06.08 | |glm-4.7 |06.08 | # 切换模型步骤 以下是针对文本生成模型的切换方式。 ## 方式一:使用 latest 配置(推荐) 在配置模型名称时,推荐使用 latest 配置,避免旧版本模型下线带来的影响: - ark-code-latest:可在控制台选择或切换目标模型,不需要修改工具配置文件。 - glm-latest、minimax-latest、kimi-latest、deepseek-latest:默认使用支持的最新版本模型,可第一时间使用对应最新版本模型。 |latest 模型 |对应模型 | |---|---| |glm-latest |glm-5.3 | |minimax-latest |minimax-m3 | |kimi-latest |kimi-k2.7-code | |deepseek-latest |deepseek-v4.1-flash | ## 方式二:修改配置文件 如果在工具中配置的是具体的 Model Name,在旧模型下线前需要将配置文件中的模型信息更新为当前支持的模型名称。不同工具的配置入口参见对应文档: * Claude Code:[配置 Claude Code](/docs/agent-plan-personal-claude-code#92b07719) * OpenClaw:[配置 OpenClaw](/docs/agent-plan-personal-openclaw#48c0b1ea) * Codex:[配置 Codex CLI](/docs/agent-plan-personal-codex#b7c0b9c1) * OpenCode:[配置 OpenCode](/docs/agent-plan-personal-opencode#c807cb71) * TraeCode:[配置 TraeCode](/docs/agent-plan-personal-trae#3ef00eb4) * Hermes Agent:[配置 Hermes Agent](/docs/agent-plan-personal-hermes-agent#14207659) * 其他工具:[其他工具](/docs/agent-plan-personal-other-tools) --- # 套餐概览 Source: https://ark.volcengine.com/region:cn-beijing/docs/coding-plan-personal-plan-overview 方舟 Coding Plan 是为开发者量身定制的订阅服务,助力高效编码开发。具备如下优势: * **支持主流模型**:不仅支持主流大语言模型,还支持 Embedding 向量化模型,涵盖 Doubao Seed Evolving、Doubao Seed 2.0 系列、GLM 系列、MiniMax 系列、Kimi系列、DeepSeek 系列、Doubao Embedding Vision 等模型。 * **兼容主流 AI 编码工具**:支持 Claude Code、OpenCode、OpenClaw、TraeCode、Cline、Cursor、Roo Code、Kilo Code 等主流编程工具,套餐额度共享,适配多种开发场景。 * **多种套餐适配不同场景**:提供 Lite 与 Pro 套餐,适应普通与高强度编程场景。 * **稳定平稳运行**:平台具有多租户隔离能力,调用高峰不会明显降速,TPM 满足正常开发需求。 > **说明** > > * 已了解方舟 Coding Plan 的用户,可以访问 [方舟 Coding Plan 活动](https://www.volcengine.com/activity/codingplan) 按需订阅套餐,参见[快速开始](/docs/coding-plan-personal-get-started)开启 AI 编程之旅。 方舟 Coding 开发者交流群 飞书扫码进群,交流 AI Coding 实践与心得 ![20260706-141656.jpeg](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/20260706-141656.jpeg) 方舟 Agent 开发者交流群 飞书扫码进群,交流 Agent 开发与应用(如 OpenClaw) ![image-20260611-103021-273.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260611-103021-273.png) ## 适用场景及要求 |类别 ||说明 | |---|---|---| |适用场景 ||**个人开发场景**:助力开发者完成个人项目、学习实践、工具搭建等编码任务。 | \ | | | | \ | | |:::tip | \ | | |企业级开发需求,请通过**火山方舟模型 API** 调用模型服务。 | \ | | |::: | |套餐额度 |生效要求 |在 AI 编程工具中生效,套餐额度共享。 | |^^| | | \ | |使用限制 |不能用于 API 调用。 | \ | | | | \ | | |:::tip | \ | | |在非 AI 编程工具中使用方舟 Coding Plan 权益对应的 Base URL 和 API Key 有可能被识别为滥用/违规,会导致订阅停用或账号封禁。 | \ | | |::: | ## 套餐详情 ### 用量预估说明 > **注意** > > 方舟已推出 Agent Plan 套餐,新增支持全模态模型及专属 Harness,采用精细化 AFP 抵扣规则,用量清晰可查。如需使用,请前往 [方舟 Agent Plan 活动](https://ai.volcengine.com/activity/agentplan?_vtm_=a441938.b656048.0_0.0_0.0.2709_7612576610202109478) 订阅套餐。 资源消耗因请求上下文长度和模型差异巨大,实际可用次数会因此有较大波动。 例如 OpenClaw、Claude Code 开启 Agent Team 模式资源消耗会显著增加,建议仅在复杂多任务开发场景下使用,避免额度快速消耗。 |套餐 |适用场景 | |---|---| |Lite 套餐 |中等强度的开发任务,适合大多数开发者。 | |Pro 套餐 |复杂项目开发,适合高强度工作的开发者。 | 实际可用量会因项目复杂度、代码库规模、是否启用自动接受、是否开启 thinking 等因素而有所不同。套餐用量信息可在 [开通管理页面](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=subscribe) 查看。 ### 套餐有效期 套餐有效期以自然月为单位,自购买成功当日开始计算。1 个月套餐有效期示例如下: |购买日期 |购买时长 |结束日期 | |---|---|---| |01.04 |1 个月 |02.04 23:59 | |01.31 |1 个月 |02.28 23:59 | |02.01 |1 个月 |03.01 23:59 | ### 套餐额度刷新规则 套餐额度在时间周期内耗尽后,需要等待下一个周期自动恢复额度,不会消耗其他资源包或账户余额。 * 每5小时限额:根据首次请求发生时间,以 5 小时为周期定时刷新限额。 * 周限额:每周一 00:00:00 重置周限额。 * 月限额:每订阅月第 1 日 00:00:00 重置月限额。 ### 套餐额度使用限制 * 同一订阅套餐可在所有支持的工具中使用,额度共享。 * 套餐额度仅在 AI 编程工具中生效,不可用于 API 调用。在非 AI 编程工具中使用方舟 Coding Plan 权益对应的 Base URL 和 API Key 有可能被识别为滥用/违规,会导致订阅停用或账号封禁。 ## 接入编程工具 > **注意** > > 务必使用 Coding Plan 支持的模型及 Base URL:`https://ark.cn-beijing.volces.com/api/coding/v3`(兼容 OpenAI 协议)或`https://ark.cn-beijing.volces.com/api/coding`(兼容 Anthropic 接口协议)。 > * 其他模型无法在 Coding Plan 中使用。 > * 如未使用指定的 Base URL,将无法使用 Coding Plan 额度,并可能产生额外 API 请求的费用。 ### 支持的模型 支持主流 Code 模型,不同区域可选择的模型请以控制台为准。模型配置支持以下两种方式(具体参见 [模型配置](/docs/coding-plan-personal-get-started#3a775131)): * 配置 Model Name,实时切换模型。 * 配置 `ark-code-latest`,在控制台切换模型。 > **说明** > > * 2026年6月10日18:00:00至2026年11月8日23:59:59活动期间,Auto 模式在 Coding Plan 中抵扣系数为 1。详情参见[Agent/Coding Plan 指定模型抵扣系数限时折扣活动](/docs/coding-plan-personal-model-discount)。 > * 2026年9月23日00:00:00至2026年12月30日23:59:59活动期间,deepseek-v4.1-flash 模型在 Coding Plan 中抵扣系数在现有抵扣系数基础上享 5 折优惠。详情参见[Agent/Coding Plan 指定模型抵扣系数限时折扣活动](/docs/coding-plan-personal-model-discount)。 > * 2026年10月20日00:00:00至2026年12月30日23:59:59活动期间,deepseek-v4.1-flash-economy 模型在 Coding Plan 中抵扣系数在现有抵扣系数基础上享 5 折优惠。详情参见[Agent/Coding Plan 指定模型抵扣系数限时折扣活动](/docs/coding-plan-personal-model-discount)。 > * 2026年9月18日00:00:00至2026年12月14日23:59:59活动期间,Coding Plan 中 Kimi-K2.8-Preview 的可用量,与 Agent Plan 6 折抵扣活动期间相当。详情参见[Agent/Coding Plan 指定模型抵扣系数限时折扣活动](/docs/coding-plan-personal-model-discount)。 > * 在控制台可以查看模型在编码工具中默认的 thinking 行为,真实使用时可由编码工具通过指定参数修改思考行为。 > **注意** > > `doubao-seed-evolving`、`glm-5.3`、`glm-5.3-flash`、`kimi-k3`、`kimi-k2.8-preview`、`deepseek-v4.1-flash`、`deepseek-v4.1-flash-economy`、`deepseek-v4-flash`、`deepseek-v4-pro` 支持 1M 上下文窗口用于包含大型代码库的长会话。在工具中开启 1M 上下文的方案可参见 [Claude Code](/docs/coding-plan-personal-ai-claude-code#7a3e5c1b)、[OpenCode](/docs/coding-plan-personal-ai-opencode#baa2dc81)、[OpenClaw](/docs/coding-plan-personal-ai-openclaw#96962158)。 |模型 |说明 | |---|---| |Auto |默认选择。智能调度模型,基于 「效果 + 速度」双维度智能匹配最优算力与模型组合,可优先体验最新模型能力。 | |Doubao-Seed-2.1-pro |新一代旗舰级模型,综合能力全面提升。1024k 上下文窗口,256k 输出,适合复杂推理、深度分析与长链路任务执行场景。 | |Doubao-Seed-2.1-lite |轻量高效,兼顾效果与速度。1024k 上下文窗口,256k 输出,适合日常编码和常规开发任务。 | |Doubao-Seed-2.0-mini |极速响应,适合简单编码任务和代码补全场景。256k 上下文窗口,128k 输出。 | |Doubao-Seed-Evolving |面向 Coding 与 Agent 场景,持续周级升级,以统一模型 ID 提供最新能力。支持 1M 超长上下文,具备复杂任务编排、长程规划、代码生成与工具调用能力。 | \ | |:::tip | \ | |Doubao-Seed-Evolving 长度限制如下: | \ | |* 上下文窗口:1024k | \ | |* 最大输出:256k | \ | |::: | |MiniMax-M3 `即将下线`|支持多模态视觉理解。新一代 M 系列语言模型,在编码与智能体评测中达到行业顶尖水平,适用于 Agent 推理、工具调用、代码和长上下文任务。 | \ | |:::tip | \ | |MiniMax-M3 长度限制如下: | \ | |* 上下文窗口:1024k | \ | |* 最大输出长度:128k | \ | |::: | |Kimi-K2.7-Code `即将下线`|支持多模态视觉理解。Kimi 最新 Coding 模型,在长上下文中更可靠地遵循指令,能以更高的成功率完成编程任务,同时支持文本、图片与视频输入,思考模式,对话与 Agent 任务。 | \ | |:::tip | \ | |Kimi-K2.7-Code 长度限制如下: | \ | |* 上下文窗口:256k | \ | |* 最大输出长度(包含思维链):32k | \ | |::: | |Kimi-K2.8-Preview |综合性能接近 K3,思考效率更高,擅长代码补全与常规开发任务,支持文本和图片输入。 | \ | |:::tip | \ | |Kimi-K2.8-Preview 长度限制如下: | \ | |* 上下文窗口:1024k | \ | |* 最大输出长度:1024k | \ | |::: | |Kimi-K3 |原生支持视觉理解,并拥有 100 万 token 上下文窗口,面向软件工程、知识工作和深度推理等前沿智能场景而设计。| \ | | | \ | |:::warning | \ | |Kimi-K3 模型抵扣系数高,仅建议 Pro 套餐用户使用。Kimi-K3 默认开启思考,不支持关闭思考。 | \ | |::: | \ | | | \ | | | \ | |:::tip | \ | |Kimi-K3 长度限制如下: | \ | |* 上下文窗口:1024k | \ | |* 最大输出长度:128k | \ | |::: | |GLM-5.3 |智谱旗舰 GLM-5.3,编程与安全能力突出,支持 1M 上下文窗口,可生产级代码交付。 | \ | | | \ | |:::warning | \ | |GLM-5.3 模型抵扣系数较高,额度消耗较快,推荐用于重难点复杂问题,日常使用建议切换其他模型。模型默认开启思考,不支持关闭思考。| \ | |::: | \ | | | \ | | | \ | |:::tip | \ | |GLM-5.3 长度限制如下: | \ | |* 上下文窗口:1024k | \ | |* 最大输出长度:128k | \ | |::: | |GLM-5.3-Flash |智谱首个原生多模态模型,以极致低成本架构实现超越 GLM-5.2 的更强智能。 | \ | | | \ | |:::warning | \ | |glm-5.3-flash 为原生多模态模型,支持图片输入。| \ | |::: | \ | | | \ | | | \ | |:::tip | \ | |GLM-5.3-Flash 长度限制如下: | \ | |* 上下文窗口:1024k | \ | |* 最大输出长度:128k | \ | |::: | |DeepSeek-V4-Flash | | \ | | | \ | |DeepSeek-V4-Flash,能够提供更加快捷、经济的 API 服务。默认开启深度思考(thinking),支持手动关闭。 | \ | | | \ | |:::tip | \ | |DeepSeek-V4-Flash 长度限制如下: | \ | |* 上下文窗口:1024k | \ | |* 最大输出长度:384k | \ | |::: | |DeepSeek-V4-Pro | | \ | | | \ | |DeepSeek-V4-Pro,Agent 能力显著增强,具备丰富的世界知识。默认开启深度思考(thinking),支持手动关闭。 | \ | | | \ | |:::warning | \ | |* DeepSeek-V4-Pro 正式版已上线,Agent 能力全面跃升,支持通过 model name 及控制台选择进行访问。| \ | |* DeepSeek-V4-Pro 模型抵扣系数较高,额度消耗较快,推荐用于重难点复杂问题,日常使用建议切换其他模型。 | \ | |::: | \ | | | \ | |:::tip | \ | |DeepSeek-V4-Pro 长度限制如下: | \ | |* 上下文窗口:1024k | \ | |* 最大输出长度:384k | \ | |::: | |DeepSeek-V4.1-Flash | | \ | | | \ | |DeepSeek-V4.1-Flash 是 DeepSeek 全新架构系列中的轻量旗舰模型,以 552B 总参数 MoE 实现越级智能。原生具备多模态视觉理解能力。默认开启深度思考(thinking),支持手动关闭。 | \ | | | \ | |:::tip | \ | |DeepSeek-V4.1-Flash 长度限制如下: | \ | |* 上下文窗口:1024k | \ | |* 最大输出长度:384k | \ | |::: | |DeepSeek-V4.1-Flash-Economy | | \ | | | \ | |DeepSeek-V4.1-Flash-Economy 与标准版采用完全相同的模型权重,能力与效果完全一致。经济版价格更低,回答生成速度略慢,适合注重成本、对生成速度要求不高的场景,支持多模态输入。默认开启深度思考(thinking),支持手动关闭。 | \ | | | \ | |:::tip | \ | |DeepSeek-V4.1-Flash-Economy 长度限制如下: | \ | |* 上下文窗口:1049k | \ | |* 最大输出长度:384k | \ | |::: | ### 支持的工具 使用 Coding Plan 套餐时遇到报错,可查看对应的报错场景并定位问题,具体可参考[错误码](/docs/error-codes)。 **[Claude Code](/docs/coding-plan-personal-ai-claude-code)** AI 终端编程助手,自然语言编程 **[TraeCode](/docs/coding-plan-personal-ai-trae)** 智能 IDE,构建新一代编程工作流 **[Roo Code](/docs/coding-plan-personal-ai-other-tools)** 轻量级编程助手 **[Codex CLI](/docs/coding-plan-personal-ai-codex)** OpenAI 推出的命令行编程工具 **[OpenCode](/docs/coding-plan-personal-ai-opencode)** 开源 AI 编程代理工具 **[Cline](/docs/coding-plan-personal-ai-other-tools)** VSCode 扩展,代码补全和调试 **[Kilo Code](/docs/coding-plan-personal-ai-other-tools)** 轻量高性能编程工具 **[OpenClaw](/docs/coding-plan-personal-ai-openclaw)** 开源、自托管个人 AI 助手 **[Cursor](/docs/coding-plan-personal-ai-other-tools)** AI 原生代码编辑器 **[Hermes Agent](/docs/coding-plan-personal-ai-hermes-agent)** 开源自主 AI 智能体 ## 常见问题 [常见问题](/docs/coding-plan-personal-faq) ## 数据授权使用协议 [火山引擎数据授权使用协议](/docs/volcengine-data-authorization-agreement) --- # 快速开始 Source: https://ark.volcengine.com/region:cn-beijing/docs/coding-plan-personal-get-started 本文介绍如何在编程工具中快速使用 Coding Plan 套餐所支持的模型进行代码开发。 # 核心配置 接入工具的核心参数如下: ## **模型配置** 支持以下两种方式配置模型: **选项:配置 Model Name (配置文件指定)** 在工具配置文件中指定 Model Name,可实时切换模型。支持配置的 Model Name: > **注意** > > 配置 Model Name 时,支持使用全小写格式,同时也支持直接复制 [开通管理页面](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=subscribe) 中的模型名称。 * `doubao-seed-evolving` * `doubao-seed-2.1-pro` * `doubao-seed-2.1-lite` * `doubao-seed-2.0-mini` * `glm-5.3` (`glm-latest`) * `glm-5.3-flash` * `deepseek-v4.1-flash` * `deepseek-v4.1-flash-economy` * `deepseek-v4-flash` * `deepseek-v4-pro` * `kimi-k2.8-preview` * `kimi-k3` > **说明** > > Model Name 不支持配置为 `Auto`,如需使用,请通过控制台切换该模式。 **选项:配置 ark-code-latest (控制台管理)** 1. 在配置文件中指定模型为`ark-code-latest`。 2. 通过 [开通管理页面](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=subscribe) 选择或切换目标模型,切换模型后 3-5 分钟即可生效。 支持 Auto 模式,通过「效果 + 速度」双维度智能算法自动选择模型。 ## **Base URL** 不同的工具配置的 Base URL 根据兼容的协议会有不同: * 兼容 Anthropic 接口协议工具:`https://ark.cn-beijing.volces.com/api/coding` * 兼容 OpenAI 接口协议工具:`https://ark.cn-beijing.volces.com/api/coding/v3` > **注意** > > 请勿使用 `https://ark.cn-beijing.volces.com/api/v3` :该 Base URL 不会消耗您的 Coding Plan 额度,而是会产生额外费用。 ## **API Key** [获取 API Key](https://ark.volcengine.com/region:cn-beijing/apikey) # 步骤一:订阅方舟 Coding Plan 访问 [方舟 Coding Plan 活动](https://www.volcengine.com/activity/codingplan),按需订阅套餐。套餐介绍请参见[套餐概览](/docs/coding-plan-personal-plan-overview)。 # 步骤二:配置编程工具 Coding Plan 支持主流的编程工具,可按需选择。 **[Claude Code](/docs/coding-plan-personal-ai-claude-code)** AI 终端编程助手,自然语言编程 **[TraeCode](/docs/coding-plan-personal-ai-trae)** 智能 IDE,构建新一代编程工作流 **[Roo Code](/docs/coding-plan-personal-ai-other-tools)** 轻量级编程助手 **[Codex CLI](/docs/coding-plan-personal-ai-codex)** OpenAI 推出的命令行编程工具 **[OpenCode](/docs/coding-plan-personal-ai-opencode)** 开源 AI 编程代理工具 **[Cline](/docs/coding-plan-personal-ai-other-tools)** VSCode 扩展,代码补全和调试 **[Kilo Code](/docs/coding-plan-personal-ai-other-tools)** 轻量高性能编程工具 **[OpenClaw](/docs/coding-plan-personal-ai-openclaw)** 开源、自托管个人 AI 助手 **[Cursor](/docs/coding-plan-personal-ai-other-tools)** AI 原生代码编辑器 **[Hermes Agent](/docs/coding-plan-personal-ai-hermes-agent)** 开源自主 AI 智能体 下面以 Claude Code 为例介绍如何使用 Coding Plan。 ## 安装 Claude Code 前提条件: * 安装 [Node.js 18 或更新版本环境](https://nodejs.org/en/download/)。 * Windows 用户需安装 [Git for Windows](https://git-scm.com/download/win)。 在命令行界面,执行以下命令安装 Claude Code。 ```Bash npm install -g @anthropic-ai/claude-code ``` 安装结束后,执行以下命令查看安装结果,若显示版本号则安装成功。 ```Bash claude --version ``` ## 配置工具 ### 方式一:自动化助手(推荐) ArkCLI Helper 是一个编码工具助手,支持快速配置选择的工具接入 Coding Plan。安装并运行该助手,根据界面提示操作可自动完成工具配置,降低手动配置的时间成本和出错风险。 > **注意** > > * ArkCLI Helper 是基于 Ark Helper 升级演进的工具配置服务,相关能力将持续在 ArkCLI Helper 上迭代更新。建议优先使用 ArkCLI Helper 完成工具配置。 > * ArkCLI Helper 支持 macOS、Linux、Windows 系统。 1. 安装 Ark CLI。 ```Bash # 1. 通过 NPM 安装 npm install -g @volcengine/ark-cli@latest # 2. 验证安装 arkcli --version ``` 2. 登录 Ark CLI。 ```Bash arkcli auth login ``` ![image-20260624-144256-509.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-144256-509.png) 根据界面提示选择登录方式。若之前已登录过 arkcli,会沿用上次选择的配置;如需重新选择,请先执行 `arkcli config reset` 后再运行 `arkcli auth login`。首次登录时,按提示完成以下配置: 1. **选择项目(Project)**:可按需选择,或默认选择**账号全部资源**。 2. **选择消费模式(Type)**:选择 `coding-plan`。 ![image-20260624-163746-727.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-163746-727.png) 3. 运行 ArkCLI Helper,根据界面提示完成 Claude Code 的配置。 1. 在命令行界面输入 `arkcli helper` 命令,启动 ArkCLI Helper。 2. **选择要配置的 Plan profile**:选择 `coding-plan_cn-beijing_personal (Coding Plan)`。 ![image-20260624-163451-813.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-163451-813.png) 3. **选择默认 model**:按需选择。 4. **选择要配置的 AI Agent**:`Claude Code`。 ![image-20260624-163912-096.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-163912-096.png) 完成上述操作后,将自动完成 Claude Code 的基础配置,无需手动安装。 ### 方式二:手动配置 完成Claude Code安装后,配置以下信息。 * **ANTHROPIC_BASE_URL**:`https://ark.cn-beijing.volces.com/api/coding` * **ANTHROPIC_AUTH_TOKEN**:[获取 API Key](https://ark.volcengine.com/region:cn-beijing/apikey) * **ANTHROPIC_MODEL**: 支持配置 Model Name (实时切换模型)、配置`ark-code-latest`(控制台切换模型)两种方式,具体见 [模型配置](/docs/coding-plan-personal-get-started#3a775131)。 配置步骤如下: 1. 创建并打开 `settings.json` 配置文件。文件路径因系统而异,具体操作如下: **选项:macOS/Linux** macOS/Linux 系统 Claude Code 配置文件路径:`~/.claude/settings.json`。 1. 如果在主目录下没有`.claude`目录,执行以下命令创建目录。 ```Bash mkdir -p ~/.claude ``` 2. 创建并打开配置文件。 ```Bash nano ~/.claude/settings.json ``` **选项:Windows** Windows 系统 Claude Code 配置文件路径:`C:\Users\<用户名>\.claude\settings.json`。以 CMD 命令行方式为例,操作如下。 1. 如果当前用户目录下没有`.claude`目录,执行以下命令创建目录。 ```Bash if not exist "%USERPROFILE%\.claude" mkdir "%USERPROFILE%\.claude" ``` 2. 创建并打开配置文件。 ```Bash notepad "%USERPROFILE%\.claude\settings.json" ``` 2. 编辑配置文件,需要修改的配置信息如下: * ``:替换为您自己的 [API Key](https://ark.volcengine.com/region:cn-beijing/apikey)。 * ``:更新为需要使用的模型信息,如`ark-code-latest`。支持的模型信息参见 [模型配置](/docs/coding-plan-personal-get-started#3a775131)。 ```JSON { "env": { "ANTHROPIC_AUTH_TOKEN": "", "ANTHROPIC_BASE_URL": "https://ark.cn-beijing.volces.com/api/coding", "ANTHROPIC_MODEL": "", "ANTHROPIC_DEFAULT_HAIKU_MODEL": "", "ANTHROPIC_DEFAULT_SONNET_MODEL": "", "ANTHROPIC_DEFAULT_OPUS_MODEL": "", "CLAUDE_CODE_SUBAGENT_MODEL": "", "CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": "1" } } ``` > **说明** > > * 要开启 1M 上下文窗口,配置参见[扩展上下文](/docs/coding-plan-personal-ai-claude-code#7a3e5c1b)。 > * 推荐使用完整模型配置,并按任务复杂度选择模型:Haiku(轻量)、Sonnet(日常)、Opus(复杂)。 > * `CLAUDE_CODE_SUBAGENT_MODEL` 建议与主模型保持一致。 > * `ANTHROPIC_DEFAULT_HAIKU_MODEL` 建议设置为小尺寸模型,通常不会影响整体使用效果。 > * `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC` 用于关闭 Claude Code 后台匿名遥测请求。遥测请求默认会走 `ANTHROPIC_BASE_URL` 并占用 Coding Plan 配额,设为 `"1"` 可避免额度被静默消耗(方式 1 的 ArkCLI Helper 会自动配置此项)。 3. 编辑或新增 `.claude.json` 文件,修改或新增 `hasCompletedOnboarding` 字段值为 true。 1. 不同系统`.claude.json`配置文件路径如下: * macOS/Linux:`~/.claude.json` * Windows:`C:\Users\<用户名>\.claude.json` 2. 修改或新增的字段信息如下: ```JSON { "hasCompletedOnboarding": true } ``` 保存配置文件后,在新的终端窗口执行后续命令。 ## 使用 Claude Code 1. 启动 Claude Code:进入项目目录,执行`claude`命令,即可开始使用 Claude Code。 ```Bash cd my-project claude ``` 启动后,选择信任此文件夹,允许 Claude Code 访问该文件夹中的文件。 2. 模型状态验证:输入`/status`确认模型状态。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/4382021492134eee946601bf53514b48~tplv-goo7wpa0wc-image.image) 3. 在 Claude Code 中对话。 > **注意** > > [Claude Code 如何开启深度思考模式?](/docs/coding-plan-personal-faq#1c6446b6) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/631742d8a5814d68a5cbc62988ba8cab~tplv-goo7wpa0wc-image.image) ## 切换模型 请根据模型配置方式,选择对应的模型切换方案。 |配置方式 |配置`ark-code-latest` |配置 Model Name | |---|---|---| |切换模型操作 |1. 在 [开通管理页面](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=subscribe) 选择要使用的模型,切换后3-5分钟即可生效。 |* 启动时:执行`claude --model `,可指定对应的模型。 | \ | |2. 在命令行窗口,启动 Claude Code 后,输入`/status`确认模型状态。 |* 对话期间:执行`/model `切换模型。 | # 常见问题 [常见问题](/docs/coding-plan-personal-faq) # 错误码 如遇报错,可根据错误信息查看错误码说明,定位&解决问题。详细信息请参见[错误码](/docs/error-codes)。 --- # Codex Source: https://ark.volcengine.com/region:cn-beijing/docs/coding-plan-personal-ai-codex 本文介绍如何配置方舟 Coding Plan 个人版到 Codex CLI 中使用。 > **说明** > > 需要先访问 [方舟 Coding Plan活动](https://www.volcengine.com/activity/codingplan),按需订阅套餐后再配置使用编程工具。 # 核心配置 接入工具的核心参数如下: ## **模型配置** 支持以下两种方式配置模型: **选项:配置 Model Name (配置文件指定)** 在工具配置文件中指定 Model Name,可实时切换模型。支持配置的 Model Name: > **注意** > > 配置 Model Name 时,支持使用全小写格式,同时也支持直接复制 [开通管理页面](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=subscribe) 中的模型名称。 * `doubao-seed-evolving` * `doubao-seed-2.1-pro` * `doubao-seed-2.1-lite` * `doubao-seed-2.0-mini` * `glm-5.3` (`glm-latest`) * `glm-5.3-flash` * `deepseek-v4.1-flash` * `deepseek-v4.1-flash-economy` * `deepseek-v4-flash` * `deepseek-v4-pro` * `kimi-k2.8-preview` * `kimi-k3` > **说明** > > Model Name 不支持配置为 `Auto`,如需使用,请通过控制台切换该模式。 **选项:配置 ark-code-latest (控制台管理)** 1. 在配置文件中指定模型为`ark-code-latest`。 2. 通过 [开通管理页面](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=subscribe) 选择或切换目标模型,切换模型后 3-5 分钟即可生效。 支持 Auto 模式,通过「效果 + 速度」双维度智能算法自动选择模型。 ## **Base URL** 不同的工具配置的 Base URL 根据兼容的协议会有不同: * 兼容 Anthropic 接口协议工具:`https://ark.cn-beijing.volces.com/api/coding` * 兼容 OpenAI 接口协议工具:`https://ark.cn-beijing.volces.com/api/coding/v3` > **注意** > > 请勿使用 `https://ark.cn-beijing.volces.com/api/v3` :该 Base URL 不会消耗您的 Coding Plan 额度,而是会产生额外费用。 ## **API Key** [获取 API Key](https://ark.volcengine.com/region:cn-beijing/apikey) # Codex CLI ## 一、安装 Codex CLI > **说明** > > Coding Plan 支持 Responses API,可以使用最新版 Codex CLI。 前提条件:安装 [Node.js 18 或更新版本](https://nodejs.org/en/download/)。 在命令行界面,执行以下命令安装 Codex CLI。 ```Bash npm i -g @openai/codex ``` 安装结束后,执行以下命令检查版本。 ```Bash codex --version ``` ## 二、配置 Codex CLI ### 方式 1:自动化助手(推荐) ArkCLI Helper 是一个编码工具助手,支持快速配置选择的工具接入 Coding Plan。安装并运行该助手,根据界面提示操作可自动完成工具配置,降低手动配置的时间成本和出错风险。 > **注意** > > * ArkCLI Helper 是基于 Ark Helper 升级演进的工具配置服务,相关能力将持续在 ArkCLI Helper 上迭代更新。建议优先使用 ArkCLI Helper 完成工具配置。 > * ArkCLI Helper 支持 macOS、Linux、Windows 系统。 1. 安装 Ark CLI。 ```Bash # 1. 通过 NPM 安装 npm install -g @volcengine/ark-cli@latest # 2. 验证安装 arkcli --version ``` 2. 登录 Ark CLI。 ```Bash arkcli auth login ``` ![image-20260624-144256-509.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-144256-509.png) 根据界面提示选择登录方式。若之前已登录过 arkcli,会沿用上次选择的配置;如需重新选择,请先执行 `arkcli config reset` 后再运行 `arkcli auth login`。首次登录时,按提示完成以下配置: 1. **选择项目(Project)**:可按需选择,或默认选择**账号全部资源**。 2. **选择消费模式(Type)**:选择 `coding-plan`。 ![image-20260624-163746-727.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-163746-727.png) 3. 运行 ArkCLI Helper,根据界面提示完成 Codex 的配置。 1. 在命令行界面输入 `arkcli helper` 命令,启动 ArkCLI Helper。 2. **选择要配置的 Plan profile**:选择 `coding-plan_cn-beijing_personal (Coding Plan)`。 ![image-20260624-163451-813.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-163451-813.png) 3. **选择默认 model**:按需选择。 4. **选择要配置的 AI Agent**:`Codex`。 ![](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/arkcli-codex.png) 完成上述操作后,将自动完成 Codex 的基础配置,无需手动安装。 ### 方式 2:手动配置 1. 创建并打开 Codex 的配置文件。文件路径因系统而异,具体操作如下: **选项:macOS/Linux** macOS/Linux 系统 Codex 配置文件路径:`~/.codex/config.toml`。 1. 如果在主目录下没有`.codex`目录,执行以下命令创建目录。 ```Bash mkdir -p ~/.codex ``` 2. 创建并打开配置文件。 ```Bash nano ~/.codex/config.toml ``` **选项:Windows** Windows 系统 Codex 配置文件路径:`%USERPROFILE%\.codex\config.toml`。以 CMD 命令行方式为例,操作如下。 1. 如果当前用户目录下没有`.codex`目录,执行以下命令创建目录。 ```Bash if not exist "%USERPROFILE%\.codex" mkdir "%USERPROFILE%\.codex" ``` 2. 创建并打开配置文件。 ```Bash notepad "%USERPROFILE%\.codex\config.toml" ``` 2. 编辑 `config.toml`,需关注的配置信息如下: * `model`:配置方式参见 [模型配置](/docs/coding-plan-personal-ai-codex#3a775131)。 * `env_key`:设置的是环境变量名称,请不要直接修改 `ARK_API_KEY`,您需要在下一步设置该环境变量的值。 ```Plain Text model = "" model_provider = "volcengine-coding-plan" model_supports_reasoning_summaries = true [model_providers.volcengine-coding-plan] name = "volcengine-coding-plan" base_url = "https://ark.cn-beijing.volces.com/api/coding/v3" env_key = "ARK_API_KEY" wire_api = "responses" ``` > **注意** > > * `model_supports_reasoning_summaries = true`:开启推理能力。 > * `model_reasoning_effort`:控制思考长度,可以设置为 `low`、`medium`、`high`。 > * kimi-k2.7-code 不支持设置 `model_supports_reasoning_summaries = true`。 3. 配置环境变量,需要将 `ARK_API_KEY` 环境变量设置为 [API Key](https://ark.volcengine.com/region:cn-beijing/apikey)。 **选项:macOS / Linux** 1. 查看 Shell 类型。 ```Bash echo $SHELL ``` 2. 将环境变量写入 Shell 配置文件,使其在新开终端时自动生效。 * Zsh ```Bash # 需要将 YOUR_API_KEY 替换为专属 API Key。 echo 'export ARK_API_KEY="YOUR_API_KEY"' >> ~/.zshrc source ~/.zshrc ``` * Bash ```Bash # 需要将 YOUR_API_KEY 替换为专属 API Key。 echo 'export ARK_API_KEY="YOUR_API_KEY"' >> ~/.bashrc source ~/.bashrc ``` **选项:Windows** * CMD:环境变量设置完成后,新开 CMD 窗口生效。 ```Bash # 需要将 YOUR_API_KEY 替换为专属 API Key。 setx ARK_API_KEY "YOUR_API_KEY" # 新开窗口,检查环境变量是否生效 echo %ARK_API_KEY% ``` * PowerShell:环境变量设置完成后,新开 PowerShell 窗口生效。 ```Bash # 需要将 YOUR_API_KEY 替换为专属 API Key。 [Environment]::SetEnvironmentVariable("ARK_API_KEY", "YOUR_API_KEY", [EnvironmentVariableTarget]::User) # 新开窗口,检查环境变量是否生效 echo $env:ARK_API_KEY ``` ## 三、开始使用 执行以下命令启动 Codex CLI。 ```Bash codex ``` # Codex 桌面客户端 OpenAI 更新后已取消 Codex 的独立应用,将其融入了 ChatGPT Desktop App 作为其中的一个模式。 ## 一、安装 ChatGPT 桌面客户端 从 [OpenAI 官网](https://openai.com/chatgpt/download/) 下载并安装 ChatGPT 桌面客户端。 ## 二、配置桌面客户端 登录 ChatGPT 桌面客户端后,通过左上角的选项切换 ChatGPT Work 和 Codex,切换到 Codex 模式后,根据以下步骤进行配置。 1. 单击左下角的**设置**。 ![image-20260630-172328-897.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260630-172328-897.png) 2. 在**配置**页面单击**打开 config.toml**。 ![image-20260630-172525-618.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260630-172525-618.png) 3. 编辑 `config.toml`,需关注的配置信息如下。 * `model`:配置方式参见 [模型配置](/docs/coding-plan-personal-ai-codex#3a775131)。 * `env_key`:设置的是环境变量名称,请不要直接修改 `ARK_API_KEY`,您需要在下一步设置该环境变量的值。 ```Plain Text model = "" model_provider = "volcengine-coding-plan" model_supports_reasoning_summaries = true [model_providers.volcengine-coding-plan] name = "volcengine-coding-plan" base_url = "https://ark.cn-beijing.volces.com/api/coding/v3" env_key = "ARK_API_KEY" wire_api = "responses" ``` > **注意** > > * `model_supports_reasoning_summaries = true`:开启推理能力。 > * `model_reasoning_effort`:控制思考长度,可以设置为 `low`、`medium`、`high`。 > * kimi-k2.7-code 不支持设置 `model_supports_reasoning_summaries = true`。 4. 配置环境变量,需要将 `ARK_API_KEY` 环境变量设置为 [API Key](https://ark.volcengine.com/region:cn-beijing/apikey)。 **选项:macOS / Linux** 1. 查看 Shell 类型。 ```Bash echo $SHELL ``` 2. 将环境变量写入 Shell 配置文件,使其在新开终端时自动生效。 * Zsh ```Bash # 需要将 YOUR_API_KEY 替换为专属 API Key。 echo 'export ARK_API_KEY="YOUR_API_KEY"' >> ~/.zshrc source ~/.zshrc ``` * Bash ```Bash # 需要将 YOUR_API_KEY 替换为专属 API Key。 echo 'export ARK_API_KEY="YOUR_API_KEY"' >> ~/.bashrc source ~/.bashrc ``` **选项:Windows** * CMD:环境变量设置完成后,新开 CMD 窗口生效。 ```Bash # 需要将 YOUR_API_KEY 替换为专属 API Key。 setx ARK_API_KEY "YOUR_API_KEY" # 新开窗口,检查环境变量是否生效 echo %ARK_API_KEY% ``` * PowerShell:环境变量设置完成后,新开 PowerShell 窗口生效。 ```Bash # 需要将 YOUR_API_KEY 替换为专属 API Key。 [Environment]::SetEnvironmentVariable("ARK_API_KEY", "YOUR_API_KEY", [EnvironmentVariableTarget]::User) # 新开窗口,检查环境变量是否生效 echo $env:ARK_API_KEY ``` ## 三、开始使用 配置完成后,需要退出 ChatGPT 桌面客户端并重新打开让配置生效。重新启动后,即可在对话界面中使用。 # 使用 Codex 的 Web Search 功能 > **说明** > > - 在 Coding Plan 场景下,通过 Responses API 接入的 Codex 也可原生使用 Web Search 功能。 > - 使用豆包搜索承接的 Web Search 会额外发起大模型 API 请求,对搜索结果进行总结。使用前需前往**方舟控制台 > 开通管理 > 应用组件库 > 豆包搜索**启用并开通豆包搜索custom版服务,否则将无法使用 Web Search 功能。 完成配置后,按以下步骤在 Codex 使用 Web Search 功能。 1. 登录方舟控制台,打开 [应用组件库 > 豆包搜索](https://ark.volcengine.com/region:cn-beijing/openManagement?advancedActiveKey=component&tab=DoubaoSearch) 标签页。 2. 在**豆包搜索 Custom 版**的**操作**列中点击**开通服务**。 ![image-20260922-225128-888.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260922-225128-888.png) 3. 在 Codex 中直接提问,例如"GitHub 最近有哪些热门开源项目"。 # 错误码 在编程工具中使用 Coding Plan 套餐时可能会遇到报错,您可以根据错误信息查看对应的报错场景并定位问题,具体可参考[错误码](/docs/error-codes)。 --- # Claude Code Source: https://ark.volcengine.com/region:cn-beijing/docs/coding-plan-personal-ai-claude-code 本文介绍如何在 Claude Code 中使用 方舟 Coding Plan 。 > **说明** > > 需要先访问 [方舟 Coding Plan活动](https://www.volcengine.com/activity/codingplan),按需订阅套餐后再配置使用编程工具。 # 核心配置 接入工具的核心参数如下: ## **模型配置** 支持以下两种方式配置模型: **选项:配置 Model Name (配置文件指定)** 在工具配置文件中指定 Model Name,可实时切换模型。支持配置的 Model Name: > **注意** > > 配置 Model Name 时,支持使用全小写格式,同时也支持直接复制 [开通管理页面](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=subscribe) 中的模型名称。 * `doubao-seed-evolving` * `doubao-seed-2.1-pro` * `doubao-seed-2.1-lite` * `doubao-seed-2.0-mini` * `glm-5.3` (`glm-latest`) * `glm-5.3-flash` * `deepseek-v4.1-flash` * `deepseek-v4.1-flash-economy` * `deepseek-v4-flash` * `deepseek-v4-pro` * `kimi-k2.8-preview` * `kimi-k3` > **说明** > > Model Name 不支持配置为 `Auto`,如需使用,请通过控制台切换该模式。 **选项:配置 ark-code-latest (控制台管理)** 1. 在配置文件中指定模型为`ark-code-latest`。 2. 通过 [开通管理页面](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=subscribe) 选择或切换目标模型,切换模型后 3-5 分钟即可生效。 支持 Auto 模式,通过「效果 + 速度」双维度智能算法自动选择模型。 ## **Base URL** 不同的工具配置的 Base URL 根据兼容的协议会有不同: * 兼容 Anthropic 接口协议工具:`https://ark.cn-beijing.volces.com/api/coding` * 兼容 OpenAI 接口协议工具:`https://ark.cn-beijing.volces.com/api/coding/v3` > **注意** > > 请勿使用 `https://ark.cn-beijing.volces.com/api/v3` :该 Base URL 不会消耗您的 Coding Plan 额度,而是会产生额外费用。 ## **API Key** [获取 API Key](https://ark.volcengine.com/region:cn-beijing/apikey) # 一、安装 Claude Code 前提条件: * 安装 [Node.js 18 或更新版本环境](https://nodejs.org/en/download/)。 * Windows 用户需安装 [Git for Windows](https://git-scm.com/download/win)。 在命令行界面,执行以下命令安装 Claude Code。 ```Bash npm install -g @anthropic-ai/claude-code ``` 安装结束后,执行以下命令查看安装结果,若显示版本号则安装成功。 ```Bash claude --version ``` # 二、配置 Claude Code ## 方式 1:自动化助手(推荐) ArkCLI Helper 是一个编码工具助手,支持快速配置选择的工具接入 Coding Plan。安装并运行该助手,根据界面提示操作可自动完成工具配置,降低手动配置的时间成本和出错风险。 > **注意** > > * ArkCLI Helper 是基于 Ark Helper 升级演进的工具配置服务,相关能力将持续在 ArkCLI Helper 上迭代更新。建议优先使用 ArkCLI Helper 完成工具配置。 > * ArkCLI Helper 支持 macOS、Linux、Windows 系统。 1. 安装 Ark CLI。 ```Bash # 1. 通过 NPM 安装 npm install -g @volcengine/ark-cli@latest # 2. 验证安装 arkcli --version ``` 2. 登录 Ark CLI。 ```Bash arkcli auth login ``` ![image-20260624-144256-509.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-144256-509.png) 根据界面提示选择登录方式。若之前已登录过 arkcli,会沿用上次选择的配置;如需重新选择,请先执行 `arkcli config reset` 后再运行 `arkcli auth login`。首次登录时,按提示完成以下配置: 1. **选择项目(Project)**:可按需选择,或默认选择**账号全部资源**。 2. **选择消费模式(Type)**:选择 `coding-plan`。 ![image-20260624-163746-727.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-163746-727.png) 3. 运行 ArkCLI Helper,根据界面提示完成 Claude Code 的配置。 1. 在命令行界面输入 `arkcli helper` 命令,启动 ArkCLI Helper。 2. **选择要配置的 Plan profile**:选择 `coding-plan_cn-beijing_personal (Coding Plan)`。 ![image-20260624-163451-813.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-163451-813.png) 3. **选择默认 model**:按需选择。 4. **选择要配置的 AI Agent**:`Claude Code`。 ![image-20260624-163912-096.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-163912-096.png) 完成上述操作后,将自动完成 Claude Code 的基础配置,无需手动安装。 ## 方式 2:手动配置 完成Claude Code安装后,配置以下信息。 * **ANTHROPIC_BASE_URL**:`https://ark.cn-beijing.volces.com/api/coding` * **ANTHROPIC_AUTH_TOKEN**:[获取API Key](https://ark.volcengine.com/region:cn-beijing/apikey) * **ANTHROPIC_MODEL**: 支持配置 Model Name (实时切换模型)、配置`ark-code-latest`(控制台切换模型)两种方式,具体见 [模型配置](/docs/coding-plan-personal-ai-claude-code#3a775131)。 > **注意** > > 配置前注意清除以下环境变量,避免与旧配置冲突: > > ```Bash > unset ANTHROPIC_AUTH_TOKEN > unset ANTHROPIC_BASE_URL > ``` > > 若变量在 `~/.bashrc` / `~/.zshrc` 中,可以备份并同步删除对应变量。 配置步骤如下: 1. 创建并打开 `settings.json` 配置文件。文件路径因系统而异,具体操作如下: **选项:macOS/Linux** macOS/Linux 系统 Claude Code 配置文件路径:`~/.claude/settings.json`。 1. 如果在主目录下没有`.claude`目录,执行以下命令创建目录。 ```Bash mkdir -p ~/.claude ``` 2. 创建并打开配置文件。 ```Bash nano ~/.claude/settings.json ``` **选项:Windows** Windows 系统 Claude Code 配置文件路径:`C:\Users\<用户名>\.claude\settings.json`。以 CMD 命令行方式为例,操作如下。 1. 如果当前用户目录下没有`.claude`目录,执行以下命令创建目录。 ```Bash if not exist "%USERPROFILE%\.claude" mkdir "%USERPROFILE%\.claude" ``` 2. 创建并打开配置文件。 ```Bash notepad "%USERPROFILE%\.claude\settings.json" ``` 2. 编辑配置文件,需要修改的配置信息如下: * ``:替换为您自己的 [API Key](https://ark.volcengine.com/region:cn-beijing/apikey)。 * ``:更新为需要使用的模型信息,如`ark-code-latest`。支持的模型信息参见 [模型配置](/docs/coding-plan-personal-ai-claude-code#3a775131)。 ```JSON { "env": { "ANTHROPIC_AUTH_TOKEN": "", "ANTHROPIC_BASE_URL": "https://ark.cn-beijing.volces.com/api/coding", "ANTHROPIC_MODEL": "", "ANTHROPIC_DEFAULT_HAIKU_MODEL": "", "ANTHROPIC_DEFAULT_SONNET_MODEL": "", "ANTHROPIC_DEFAULT_OPUS_MODEL": "", "CLAUDE_CODE_SUBAGENT_MODEL": "", "CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": "1" } } ``` > **说明** > > * 要开启 1M 上下文窗口,配置参见[扩展上下文](/docs/coding-plan-personal-ai-claude-code#7a3e5c1b)。 > * 推荐使用完整模型配置,并按任务复杂度选择模型:Haiku(轻量)、Sonnet(日常)、Opus(复杂)。 > * `CLAUDE_CODE_SUBAGENT_MODEL` 建议与主模型保持一致。 > * `ANTHROPIC_DEFAULT_HAIKU_MODEL` 建议设置为小尺寸模型,通常不会影响整体使用效果。 > * `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC` 用于关闭 Claude Code 后台匿名遥测请求。遥测请求默认会走 `ANTHROPIC_BASE_URL` 并占用 Coding Plan 配额,设为 `"1"` 可避免额度被静默消耗(方式 1 的 ArkCLI Helper 会自动配置此项)。 > * 如需关闭思考(thinking)模式,需要在 `env` 中添加 `"CLAUDE_CODE_EXTRA_BODY": "{\"thinking\":{\"type\":\"disabled\"}}"`。 3. 编辑或新增 `.claude.json` 文件,修改或新增 `hasCompletedOnboarding` 字段值为 true。 1. 不同系统`.claude.json`配置文件路径如下: * macOS/Linux:`~/.claude.json` * Windows:`C:\Users\<用户名>\.claude.json` 2. 修改或新增的字段信息如下: ```JSON { "hasCompletedOnboarding": true } ``` 保存配置文件后,在新的终端窗口执行后续命令。 # 三、启动并使用 Claude Code ## 开始使用 1. 启动 Claude Code:进入项目目录,执行`claude`命令,即可开始使用 Claude Code。 ```Bash cd my-project claude ``` 启动后,选择信任此文件夹,允许 Claude Code 访问该文件夹中的文件。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/f621624ffa07485ea37f49ea96c8e8f4~tplv-goo7wpa0wc-image.image) 2. 模型状态验证:输入`/status`确认模型状态。 3. 在 Claude Code 中对话。 > 更多使用教程请参见 [Claude Code 官网](https://code.claude.com/docs/zh-CN/quickstart#%E6%AD%A5%E9%AA%A4-4%EF%BC%9A%E6%8F%90%E5%87%BA%E6%82%A8%E7%9A%84%E7%AC%AC%E4%B8%80%E4%B8%AA%E9%97%AE%E9%A2%98)。 ## 切换模型 请根据模型配置方式,选择对应的模型切换方案。 |配置方式 |配置`ark-code-latest` |配置 Model Name | |---|---|---| |切换模型操作 |1. 在 [开通管理页面](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=subscribe) 选择要使用的模型,切换后3-5分钟即可生效。 |* 启动时:执行`claude --model `,可指定对应的模型。 | \ | |2. 在命令行窗口,启动 Claude Code 后,输入`/status`确认模型状态。 |* 对话期间:执行`/model `切换模型。 | ## 扩展上下文 `glm-5.3`、`deepseek-v4.1-flash`、`deepseek-v4.1-flash-economy`、`deepseek-v4-flash`、`deepseek-v4-pro` 支持 1M 上下文窗口,可用于包含大型代码库的长会话。以 `glm-5.3` 模型为例,配置信息如下: ```JSON { "env": { "ANTHROPIC_AUTH_TOKEN": "", "ANTHROPIC_BASE_URL": "https://ark.cn-beijing.volces.com/api/coding", "CLAUDE_CODE_AUTO_COMPACT_WINDOW": "1000000", "ANTHROPIC_MODEL": "glm-5.3[1m]", "ANTHROPIC_DEFAULT_HAIKU_MODEL": "glm-5.3[1m]", "ANTHROPIC_DEFAULT_SONNET_MODEL": "glm-5.3[1m]", "ANTHROPIC_DEFAULT_OPUS_MODEL": "glm-5.3[1m]" } } ``` > **注意** > > * 开启 1M 上下文时,需要在模型名称后增加 `[1m]` 后缀,如 `glm-5.3[1m]`,同时配置压缩窗口大小参数 `"CLAUDE_CODE_AUTO_COMPACT_WINDOW": "1000000"`。 > * 若模型参数加上 `[1m]` 后缀后,Claude Code 识别模型不存在,需升级 Claude Code 到最新版本后重试。 ## 使用 CC Switch CC Switch 是一款跨平台桌面应用,专为使用 AI 编程工具的开发者设计。它帮助你统一管理 Claude Code、Claude Desktop、Codex、Gemini CLI、OpenCode、OpenClaw 和 Hermes 等受管应用的配置。 ### 支持的平台 - Windows 10 及以上 - macOS 12 (Monterey) 及以上 - Linux Ubuntu 22.04+ / Debian 11+ / Fedora 34+(x64 / ARM64) ### 安装 > 更多安装方式和详细说明请参考 [CC Switch 官方文档](https://github.com/farion1231/cc-switch)。 **选项:macOS** - **Homebrew(推荐)**: ```Bash brew tap farion1231/ccswitch brew install --cask cc-switch ``` - **手动下载**:从 [Releases 页面](https://github.com/farion1231/cc-switch/releases) 下载 `.dmg`。 **选项:Linux** - **Arch 发行版**: ```Bash paru -S cc-switch-bin ``` - **其他发行版**:根据架构(Debian / Ubuntu)从 [Releases 页面](https://github.com/farion1231/cc-switch/releases) 下载 `.deb` / `.rpm`,或者下载 `.AppImage`(通用)。 **选项:Windows** - 从 [Releases 页面](https://github.com/farion1231/cc-switch/releases) 下载 `.msi` 安装包或 `.zip` 绿色版。 ### 添加供应商 1. 在 CC Switch 中添加供应商: 1. 在主界面顶部图标栏选中 Claude Code 图标,点击右上角 **+** 进入添加新供应商。 2. 选择 **自定义配置**,填写以下信息: - **API Key**:替换为您自己的 [API Key](https://ark.volcengine.com/region:cn-beijing/apikey) - **请求地址**:`https://ark.cn-beijing.volces.com/api/coding` 3. 展开高级选项,根据当前套餐支持的模型范围,分别配置 Sonnet、Opus、Fable、Haiku 模型,可配置的模型见 [模型配置](/docs/coding-plan-personal-ai-claude-code#3a775131)。 > **注意** > > 建议 Haiku 设置为小尺寸模型。 4. 选择右下角 **添加**,完成供应商配置。 3. 回到首页,点击右侧 **启用** 按钮,新开一个 Claude Code 会话使配置生效。 # 使用 Claude Code 的 Web Search 功能 > **说明** > > - 在 Coding Plan 场景下,通过 Messages API 接入的 Claude Code 也可原生使用 Web Search 功能。 > - 使用豆包搜索承接的 Web Search 会额外发起大模型 API 请求,对搜索结果进行总结。使用前需前往**方舟控制台 > 开通管理 > 应用组件库 > 豆包搜索**启用并开通豆包搜索custom版服务,否则将无法使用 Web Search 功能。 完成配置后,按以下步骤在 Claude Code 使用 Web Search 功能。 1. 登录方舟控制台,打开 [应用组件库 > 豆包搜索](https://ark.volcengine.com/region:cn-beijing/openManagement?advancedActiveKey=component&tab=DoubaoSearch) 标签页。 2. 在**豆包搜索 Custom 版**的**操作**列中点击**开通服务**。 ![image-20260922-225128-888.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260922-225128-888.png) 3. 在 Claude Code 中直接提问,例如"GitHub 最近有哪些热门开源项目"。 # 安装使用 Claude Code IDE 插件 1. 安装 Claude Code 并配置好环境变量,具体参考 [接入Claude Code](/docs/coding-plan-personal-ai-claude-code#f87f0ea9)。 Claude Code IDE 插件依赖 Claude Code CLI 工具,需先完成 Claude Code的安装及配置。 2. 安装并使用 IDE 插件。 > 因 IDE 插件会迭代演进,以下内容仅供参考,具体的安装及使用可参考 [Visual Studio Code](https://code.claude.com/docs/en/vs-code)、[JetBrains IDEs](https://code.claude.com/docs/en/jetbrains)。 **选项:Claude Code VSCode 插件** > **说明** > > Claude Code VSCode 插件支持在 VSCode 及基于 VSCode 的 IDE(如 Cursor、TraeCode 等)中使用。 ### 安装插件 打开 VSCode,在扩展市场搜索`claude code`进行安装。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/6c39c8cb4ec84f03bb0ca2444804eac7~tplv-goo7wpa0wc-image.image) ### 配置环境变量 1. 打开 VS Code 左下角打开设置,打开**Etensions** - **Claude Code**。 ![claude-code-setings-json.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/claude-code-setings-json.png) 2. 在 **Claude Code: Environment Variables** 区域单击 **Edit in settings.json**,修改`claudeCode.environmentVariables`、`claudeCode.selectedModel`。 > **说明** > > 需要修改的配置信息如下: > * ``:替换为您自己的 [API Key](https://ark.volcengine.com/region:cn-beijing/apikey) > * ``:更新为需要使用的模型信息,如 `ark-code-latest`。支持的模型信息参见 [模型配置](/docs/coding-plan-personal-ai-claude-code#3a775131)。 > > 若在 Claude Code 对话框中输入 `/config`,插件仅返回可配置项的用法说明,不提供交互式编辑界面,请走步骤 2 的设置入口。 ```JSON ... "claudeCode.environmentVariables": [ { "name": "ANTHROPIC_BASE_URL", "value": "https://ark.cn-beijing.volces.com/api/coding" }, { "name": "ANTHROPIC_AUTH_TOKEN", "value": "" }, { "name": "ANTHROPIC_MODEL", "value": "" } ], "claudeCode.selectedModel": "", ... ``` 保存配置后,新开一个窗口开始使用 Claude Code。 **选项:Claude Code JetBrains 插件** > **说明** > > Claude Code JetBrains 插件支持 Jetbrains 的系列 IDE 如 IntelliJ IDEA、PyCharm、WebStorm 等。 ### 安装插件 打开 JetBrains IDE,在插件市场搜索`claude code`进行安装。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/5859916985a34036bb41f5097ba58f6c~tplv-goo7wpa0wc-image.image) ### 开始使用 安装完成后,重启IDE后,单击Claude Code 图标,进入 Claude Code 页面开始使用。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/78fae54038524ffbbb0f9d0e677de393~tplv-goo7wpa0wc-image.image) # 常见问题 * [Claude Code 如何开启深度思考模式?](/docs/coding-plan-personal-faq#1c6446b6) * [如何升级 Ark Helper?](/docs/coding-plan-personal-faq#7bdd6584) * [如何卸载 Ark Helper?](/docs/coding-plan-personal-faq#e2f455fc) # 错误码 在编程工具中使用 Coding Plan 套餐时可能会遇到报错,您可以根据错误信息查看对应的报错场景并定位问题,具体可参考[错误码](/docs/error-codes)。 --- # OpenCode Source: https://ark.volcengine.com/region:cn-beijing/docs/coding-plan-personal-ai-opencode OpenCode 是一款开源的 AI 编程代理工具,提供终端界面、桌面应用和 IDE 扩展等多种使用方式。 方舟 Coding Plan 支持在 OpenCode 中使用,可参考本文进行配置及使用。 > **说明** > > 需要先访问 [方舟 Coding Plan活动](https://www.volcengine.com/activity/codingplan),按需订阅套餐后再配置使用编程工具。 # 核心配置 接入工具的核心参数如下: ## **模型配置** 支持以下两种方式配置模型: **选项:配置 Model Name (配置文件指定)** 在工具配置文件中指定 Model Name,可实时切换模型。支持配置的 Model Name: > **注意** > > 配置 Model Name 时,支持使用全小写格式,同时也支持直接复制 [开通管理页面](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=subscribe) 中的模型名称。 * `doubao-seed-evolving` * `doubao-seed-2.1-pro` * `doubao-seed-2.1-lite` * `doubao-seed-2.0-mini` * `glm-5.3` (`glm-latest`) * `glm-5.3-flash` * `deepseek-v4.1-flash` * `deepseek-v4.1-flash-economy` * `deepseek-v4-flash` * `deepseek-v4-pro` * `kimi-k2.8-preview` * `kimi-k3` > **说明** > > Model Name 不支持配置为 `Auto`,如需使用,请通过控制台切换该模式。 **选项:配置 ark-code-latest (控制台管理)** 1. 在配置文件中指定模型为`ark-code-latest`。 2. 通过 [开通管理页面](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=subscribe) 选择或切换目标模型,切换模型后 3-5 分钟即可生效。 支持 Auto 模式,通过「效果 + 速度」双维度智能算法自动选择模型。 ## **Base URL** 不同的工具配置的 Base URL 根据兼容的协议会有不同: * 兼容 Anthropic 接口协议工具:`https://ark.cn-beijing.volces.com/api/coding` * 兼容 OpenAI 接口协议工具:`https://ark.cn-beijing.volces.com/api/coding/v3` > **注意** > > 请勿使用 `https://ark.cn-beijing.volces.com/api/v3` :该 Base URL 不会消耗您的 Coding Plan 额度,而是会产生额外费用。 ## **API Key** [获取 API Key](https://ark.volcengine.com/region:cn-beijing/apikey) # 一、安装 OpenCode 前提条件:安装 [Node.js 18 或更新版本](https://nodejs.org/en/download/)。 在命令行界面,执行以下命令安装 OpenCode。 ```Bash npm install -g opencode-ai ``` 安装结束后,执行以下命令查看安装结果,若显示版本号则安装成功。 ```Bash opencode --version ``` # 二、配置 OpenCode ## 方式 1:自动化助手(推荐) ArkCLI Helper 是一个编码工具助手,支持快速配置选择的工具接入 Coding Plan。安装并运行该助手,根据界面提示操作可自动完成工具配置,降低手动配置的时间成本和出错风险。 > **注意** > > * ArkCLI Helper 是基于 Ark Helper 升级演进的工具配置服务,相关能力将持续在 ArkCLI Helper 上迭代更新。建议优先使用 ArkCLI Helper 完成工具配置。 > * ArkCLI Helper 支持 macOS、Linux、Windows 系统。 1. 安装 Ark CLI。 ```Bash # 1. 通过 NPM 安装 npm install -g @volcengine/ark-cli@latest # 2. 验证安装 arkcli --version ``` 2. 登录 Ark CLI。 ```Bash arkcli auth login ``` ![image-20260624-144256-509.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-144256-509.png) 根据界面提示选择登录方式。若之前已登录过 arkcli,会沿用上次选择的配置;如需重新选择,请先执行 `arkcli config reset` 后再运行 `arkcli auth login`。首次登录时,按提示完成以下配置: 1. **选择项目(Project)**:可按需选择,或默认选择**账号全部资源**。 2. **选择消费模式(Type)**:选择 `coding-plan`。 ![image-20260624-163746-727.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-163746-727.png) 3. 运行 ArkCLI Helper,根据界面提示完成 OpenCode 的配置。 1. 在命令行界面输入 `arkcli helper` 命令,启动 ArkCLI Helper。 2. **选择要配置的 Plan profile**:选择 `coding-plan_cn-beijing_personal (Coding Plan)`。 ![image-20260624-163451-813.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-163451-813.png) 3. **选择默认 model**:按需选择。 4. **选择要配置的 AI Agent**:`OpenCode`。 ![image-20260624-164505-484.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-164505-484.png) 完成上述操作后,将自动完成 OpenCode 的基础配置,无需手动安装。 ## 方式 2:手动配置 1. 创建并打开 OpenCode 的配置文件。文件路径因系统而异,具体操作如下: **选项:macOS/Linux** macOS/Linux 系统 OpenCode 配置文件路径:`~/.config/opencode/opencode.json`。 1. 如果在主目录下没有`.config/opencode`目录,执行以下命令创建目录。 ```Bash mkdir -p ~/.config/opencode ``` 2. 创建并打开配置文件。 ```Bash nano ~/.config/opencode/opencode.json ``` **选项:Windows** Windows 系统 OpenCode 配置文件路径:`%USERPROFILE%\.config\opencode\opencode.json`。以 CMD 命令行方式为例,操作如下。 1. 如果当前用户目录下没有`.config\opencode`目录,执行以下命令创建目录。 ```Bash if not exist "%USERPROFILE%\.config\opencode" mkdir "%USERPROFILE%\.config\opencode" ``` 2. 创建并打开配置文件。 ```Bash notepad "%USERPROFILE%\.config\opencode\opencode.json" ``` 2. 编辑 `opencode.json`,需关注的配置信息如下: * ``:替换为您自己的 [API Key](https://ark.volcengine.com/region:cn-beijing/apikey)。 * `model`:更新为需要使用的模型信息。支持的模型信息参见 [模型配置](/docs/coding-plan-personal-ai-opencode#3a775131)。 Coding Plan 兼容 OpenAI 接口协议,支持 Responses API、Chat API。推荐使用 Responses API 的配置,推理效果更好。 支持的两类 API 仅在 npm 配置上不同: * Responses API 配置:`"npm": "@ai-sdk/openai"` * Chat API 配置:`"npm": "@ai-sdk/openai-compatible"` 以配置`ark-code-latest`为例,具体信息如下。 > **注意** > > * `glm-5.3`、`deepseek-v4-flash`、`deepseek-v4-pro`、`kimi-k2.8-preview` 支持 1M 上下文窗口用于包含大型代码库的长会话,可以通过 `limit.context` 字段显式指定窗口大小。 > * `provider.volcengine-plan.models`节点下有**两处**(对象键、`name`字段)需**替换为同一 Model Name**,切勿遗漏。 > * 若需开启模型图片理解能力,需在模型配置节点下新增如下配置项: > > `"modalities": {"input": ["text", "image"], "output": ["text"]}` **选项:Responses API** > **说明** > > npm 必须使用 `@ai-sdk/openai`,模型才会使用 Responses API,在 `baseURL` 的基础上自动拼接 `/responses`。 ```JSON { "$schema": "https://opencode.ai/config.json", "model": "volcengine-plan/ark-code-latest", "provider": { "volcengine-plan": { "npm": "@ai-sdk/openai", "name": "Volcano Engine(Responses API)", "options": { "baseURL": "https://ark.cn-beijing.volces.com/api/coding/v3", "apiKey": "" }, "models": { "ark-code-latest": { "name": "ark-code-latest", "limit": { "context": 256000, "output": 32000 }, "modalities": { "input": [ "text", "image" ], "output": [ "text" ] } }, "doubao-seed-2.1-pro": { "name": "doubao-seed-2.1-pro", "limit": { "context": 1024000, "output": 65536 }, "modalities": { "input": [ "text", "image" ], "output": [ "text" ] } }, "doubao-seed-evolving": { "name": "doubao-seed-evolving", "limit": { "context": 1024000, "output": 65536 }, "modalities": { "input": [ "text", "image" ], "output": [ "text" ] } }, "glm-5.3": { "name": "glm-5.3", "limit": { "context": 1024000, "output": 65536 }, "modalities": { "input": [ "text" ], "output": [ "text" ] } }, "glm-5.3-flash": { "name": "glm-5.3-flash", "limit": { "context": 1024000, "output": 65536 }, "modalities": { "input": [ "text", "image" ], "output": [ "text" ] } }, "glm-latest": { "name": "glm-latest", "limit": { "context": 1024000, "output": 65536 }, "modalities": { "input": [ "text" ], "output": [ "text" ] } }, "deepseek-v4-flash": { "name": "deepseek-v4-flash", "limit": { "context": 1024000, "output": 65536 } }, "deepseek-v4-pro": { "name": "deepseek-v4-pro", "limit": { "context": 1024000, "output": 65536 } }, "deepseek-v4.1-flash": { "name": "deepseek-v4.1-flash", "limit": { "context": 1024000, "output": 65536 }, "modalities": { "input": [ "text", "image" ], "output": [ "text" ] } }, "deepseek-v4.1-flash-economy": { "name": "deepseek-v4.1-flash-economy", "limit": { "context": 1049000, "output": 65536 }, "modalities": { "input": [ "text", "image" ], "output": [ "text" ] } }, "doubao-seed-2.1-lite": { "name": "doubao-seed-2.1-lite", "limit": { "context": 1024000, "output": 65536 }, "modalities": { "input": [ "text", "image" ], "output": [ "text" ] } }, "doubao-seed-2.0-mini": { "name": "doubao-seed-2.0-mini", "limit": { "context": 256000, "output": 65536 }, "modalities": { "input": [ "text", "image" ], "output": [ "text" ] } }, "kimi-k2.8-preview": { "name": "kimi-k2.8-preview", "limit": { "context": 1024000, "output": 65536 }, "modalities": { "input": [ "text", "image" ], "output": [ "text" ] } }, "kimi-k3": { "name": "kimi-k3", "limit": { "context": 1024000, "output": 65536 }, "modalities": { "input": [ "text", "image" ], "output": [ "text" ] } } } } } } ``` **选项:Chat API** > **说明** > > npm 必须使用 `@ai-sdk/openai-compatible`,模型才会使用 Chat API,在 `baseURL` 的基础上自动拼接 `/chat/completions`。 ```JSON { "$schema": "https://opencode.ai/config.json", "model": "volcengine-plan/ark-code-latest", "provider": { "volcengine-plan": { "npm": "@ai-sdk/openai-compatible", "name": "Volcano Engine(Chat API)", "options": { "baseURL": "https://ark.cn-beijing.volces.com/api/coding/v3", "apiKey": "" }, "models": { "ark-code-latest": { "name": "ark-code-latest", "limit": { "context": 256000, "output": 32000 }, "modalities": { "input": [ "text", "image" ], "output": [ "text" ] } }, "doubao-seed-2.1-pro": { "name": "doubao-seed-2.1-pro", "limit": { "context": 1024000, "output": 65536 }, "modalities": { "input": [ "text", "image" ], "output": [ "text" ] } }, "doubao-seed-evolving": { "name": "doubao-seed-evolving", "limit": { "context": 1024000, "output": 65536 }, "modalities": { "input": [ "text", "image" ], "output": [ "text" ] } }, "glm-5.3": { "name": "glm-5.3", "limit": { "context": 1024000, "output": 65536 }, "modalities": { "input": [ "text" ], "output": [ "text" ] } }, "glm-5.3-flash": { "name": "glm-5.3-flash", "limit": { "context": 1024000, "output": 65536 }, "modalities": { "input": [ "text", "image" ], "output": [ "text" ] } }, "glm-latest": { "name": "glm-latest", "limit": { "context": 1024000, "output": 65536 }, "modalities": { "input": [ "text" ], "output": [ "text" ] } }, "deepseek-v4-flash": { "name": "deepseek-v4-flash", "limit": { "context": 1024000, "output": 65536 } }, "deepseek-v4-pro": { "name": "deepseek-v4-pro", "limit": { "context": 1024000, "output": 65536 } }, "deepseek-v4.1-flash": { "name": "deepseek-v4.1-flash", "limit": { "context": 1024000, "output": 65536 }, "modalities": { "input": [ "text", "image" ], "output": [ "text" ] } }, "deepseek-v4.1-flash-economy": { "name": "deepseek-v4.1-flash-economy", "limit": { "context": 1049000, "output": 65536 }, "modalities": { "input": [ "text", "image" ], "output": [ "text" ] } }, "doubao-seed-2.1-lite": { "name": "doubao-seed-2.1-lite", "limit": { "context": 1024000, "output": 65536 }, "modalities": { "input": [ "text", "image" ], "output": [ "text" ] } }, "doubao-seed-2.0-mini": { "name": "doubao-seed-2.0-mini", "limit": { "context": 256000, "output": 65536 }, "modalities": { "input": [ "text", "image" ], "output": [ "text" ] } }, "kimi-k3": { "name": "kimi-k3", "limit": { "context": 1024000, "output": 65536 }, "modalities": { "input": [ "text", "image" ], "output": [ "text" ] } }, "kimi-k2.8-preview": { "name": "kimi-k2.8-preview", "limit": { "context": 1024000, "output": 65536 }, "modalities": { "input": [ "text", "image" ], "output": [ "text" ] } } } } } } ``` # 三、使用 OpenCode 1. 启动OpenCode: ```Bash opencode ``` 2. 输入`/models`,选择配置的模型并在 OpenCode 中使用。 # 常见问题 * [OpenCode 如何开启深度思考模式?](/docs/coding-plan-personal-faq#1cfacd2b) * [如何升级 Ark Helper?](/docs/coding-plan-personal-faq#7bdd6584) * [如何卸载 Ark Helper?](/docs/coding-plan-personal-faq#e2f455fc) # 错误码 在编程工具中使用 Coding Plan 套餐时可能会遇到报错,您可以根据错误信息查看对应的报错场景并定位问题,具体可参考[错误码](/docs/error-codes)。 --- # OpenClaw Source: https://ark.volcengine.com/region:cn-beijing/docs/coding-plan-personal-ai-openclaw [OpenClaw(原 Clawdbot)](https://clawd.bot/) 是一款开源、自托管的个人 AI 助手,可以在本地计算机上运行,兼容 macOS、Windows 及 Linux 等多种系统,支持接入常用聊天工具,除了内置多种 Agent 常用工具外,还可以通过插件和 Skill 扩展更多能力。 方舟 Coding Plan 支持在 OpenClaw 中使用,可参考本文进行配置及使用。 > **说明** > > 需要先访问 [方舟 Coding Plan活动](https://www.volcengine.com/activity/codingplan),按需订阅套餐后再配置使用编程工具。 # 核心配置 接入工具的核心参数如下: ## **模型配置** 支持以下两种方式配置模型: **选项:配置 Model Name (配置文件指定)** 在工具配置文件中指定 Model Name,可实时切换模型。支持配置的 Model Name: > **注意** > > 配置 Model Name 时,支持使用全小写格式,同时也支持直接复制 [开通管理页面](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=subscribe) 中的模型名称。 * `doubao-seed-evolving` * `doubao-seed-2.1-pro` * `doubao-seed-2.1-lite` * `doubao-seed-2.0-mini` * `glm-5.3` (`glm-latest`) * `glm-5.3-flash` * `deepseek-v4.1-flash` * `deepseek-v4.1-flash-economy` * `deepseek-v4-flash` * `deepseek-v4-pro` * `kimi-k2.8-preview` * `kimi-k3` > **说明** > > Model Name 不支持配置为 `Auto`,如需使用,请通过控制台切换该模式。 **选项:配置 ark-code-latest (控制台管理)** 1. 在配置文件中指定模型为`ark-code-latest`。 2. 通过 [开通管理页面](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=subscribe) 选择或切换目标模型,切换模型后 3-5 分钟即可生效。 支持 Auto 模式,通过「效果 + 速度」双维度智能算法自动选择模型。 ## **Base URL** 不同的工具配置的 Base URL 根据兼容的协议会有不同: * 兼容 Anthropic 接口协议工具:`https://ark.cn-beijing.volces.com/api/coding` * 兼容 OpenAI 接口协议工具:`https://ark.cn-beijing.volces.com/api/coding/v3` > **注意** > > 请勿使用 `https://ark.cn-beijing.volces.com/api/v3` :该 Base URL 不会消耗您的 Coding Plan 额度,而是会产生额外费用。 ## **API Key** [获取 API Key](https://ark.volcengine.com/region:cn-beijing/apikey) # 一、安装 OpenClaw 前提条件:安装 [Node.js 22 或更新版本](https://nodejs.org/en/download/)。 1. 执行以下命令安装 OpenClaw。 **选项:macOS / Linux** ```Bash curl -fsSL https://openclaw.ai/install.sh | bash ``` **选项:Windows** Windows PowerShell 环境下安装命令如下: ```Bash iwr -useb https://openclaw.ai/install.ps1 | iex ``` 2. 根据提示信息完成 OpenClaw 配置,配置信息如下。 > **注意** > > OpenClaw 在不断迭代,如果实际使用与以下配置存在差异,可以选择 "Skip" 或默认选项完成配置流程,后续可以参考文档配置并使用 Coding Plan。 |提示信息 |配置 | |---|---| |I understand this is personal-by-default and shared/multi-user use requires lock-down. Continue? |选择 "Yes" | |Setup mode |选择 “QuickStart” | |Model/auth provider |选择 "Skip for now",后续可以配置。 | |Default model |选择 "Keep current" | |Select channel (QuickStart) |选择 “Skip for now”,后续可以配置。 | |Search provider |选择 “Skip for now” | |Configure skills now? (recommended) |选择 “No”,后续可以配置。 | | Enable hooks? |选择 "Skip for now"。选择方式:按空格键选中选项,按回车键进入下一步。 | |How do you want to hatch your bot? |选择 "Hatch in Terminal"。 | # 二、 配置 OpenClaw 根据操作系统选择合适的方式完成工具配置后,配置文件中会包含 Coding Plan 支持的完整的模型列表,便于快速切换目标模型。 ### 方式 1:自动化助手(推荐) ArkCLI Helper 是一个编码工具助手,支持快速配置选择的工具接入 Coding Plan。安装并运行该助手,根据界面提示操作可自动完成工具配置,降低手动配置的时间成本和出错风险。 > **注意** > > * ArkCLI Helper 是基于 Ark Helper 升级演进的工具配置服务,相关能力将持续在 ArkCLI Helper 上迭代更新。建议优先使用 ArkCLI Helper 完成工具配置。 > * ArkCLI Helper 支持 macOS、Linux、Windows 系统。 1. 安装 Ark CLI。 ```Bash # 1. 通过 NPM 安装 npm install -g @volcengine/ark-cli@latest # 2. 验证安装 arkcli --version ``` 2. 登录 Ark CLI。 ```Bash arkcli auth login ``` ![image-20260624-144256-509.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-144256-509.png) 根据界面提示选择登录方式。若之前已登录过 arkcli,会沿用上次选择的配置;如需重新选择,请先执行 `arkcli config reset` 后再运行 `arkcli auth login`。首次登录时,按提示完成以下配置: 1. **选择项目(Project)**:可按需选择,或默认选择**账号全部资源**。 2. **选择消费模式(Type)**:选择 `coding-plan`。 ![image-20260624-163746-727.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-163746-727.png) 3. 运行 ArkCLI Helper,根据界面提示完成 OpenClaw 的配置。 1. 在命令行界面输入 `arkcli helper` 命令,启动 ArkCLI Helper。 2. **选择要配置的 Plan profile**:选择 `coding-plan_cn-beijing_personal (Coding Plan)`。 ![image-20260624-163451-813.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-163451-813.png) 3. **选择默认 model**:按需选择。 4. **选择要配置的 AI Agent**:`OpenClaw`。 ![image-20260624-164348-884.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-164348-884.png) 完成上述操作后,将自动完成 OpenClaw 的基础配置,无需手动安装。 ### 方式 2:手动配置 Coding Plan 兼容 OpenAI 接口协议,支持 Responses API、Chat API。推荐使用 Responses API 的配置,推理效果更好。 两类 API 的配置方式基本一致,只需在 `models.providers` 中指定对应的 API 适配器: - Responses API 配置:`"api": "openai-responses"` - Chat API 配置:`"api": "openai-completions"` > **注意** > > `glm-5.3`、`deepseek-v4-flash`、`deepseek-v4-pro`、`kimi-k2.8-preview` 支持 1M 上下文窗口用于包含大型代码库的长会话,可以通过 `contextWindow` 字段显式指定窗口大小。 **选项:Web UI 方式** 1. 执行以下命令打开 Web UI。 ```Bash openclaw dashboard ``` 2. 在左侧菜单栏选择**配置** - **Advanced** - **Raw**或者**配置** - **Advanced** - **open**,查看并修改配置信息。具体配置信息如下,其中需要将``替换为您自己的 [API Key](https://ark.volcengine.com/region:cn-beijing/apikey)。 > **注意** > > * 如果已经配置过 OpenClaw,请勿直接覆盖原有配置,建议根据提供的配置更新`models`、`agents` 和 `gateway` 节点信息。其中`models`节点包含支持的模型列表。 > * [OpenClaw 如何开启深度思考模式?](/docs/coding-plan-personal-faq#7805bea3) > * [在 OpenClaw 中无法识别图片,如何处理?](/docs/coding-plan-personal-faq#95ad3a53) > * [配置 OpenClaw 时报错 “run error: 404 The model or endpoint xxx does not exist or you do not have access to it”,如何处理?](/docs/coding-plan-personal-faq#0a04411f) ![](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/webUI3.png) 以下是 Responses API 的配置示例。 ```JSON { "models": { "providers": { "volcengine-plan": { "baseUrl": "https://ark.cn-beijing.volces.com/api/coding/v3", "apiKey": "", "api": "openai-responses", "models": [ { "id": "ark-code-latest", "name": "ark-code-latest", "contextWindow": 256000, "maxTokens": 32000, "input": [ "text", "image" ] }, { "id": "doubao-seed-2.1-pro", "name": "doubao-seed-2.1-pro", "contextWindow": 1024000, "maxTokens": 65536, "input": [ "text", "image" ] }, { "id": "doubao-seed-2.1-lite", "name": "doubao-seed-2.1-lite", "contextWindow": 1024000, "maxTokens": 65536, "input": [ "text", "image" ] }, { "id": "doubao-seed-2.0-mini", "name": "doubao-seed-2.0-mini", "contextWindow": 256000, "maxTokens": 65536, "input": [ "text", "image" ] }, { "id": "doubao-seed-evolving", "name": "doubao-seed-evolving", "contextWindow": 1024000, "maxTokens": 65536, "input": [ "text", "image" ] }, { "id": "glm-5.3", "name": "glm-5.3", "contextWindow": 1024000, "maxTokens": 65536, "input": [ "text" ] }, { "id": "glm-5.3-flash", "name": "glm-5.3-flash", "contextWindow": 1024000, "maxTokens": 65536, "input": [ "text", "image" ] }, { "id": "glm-latest", "name": "glm-latest", "contextWindow": 1024000, "maxTokens": 65536, "input": [ "text" ] }, { "id": "deepseek-v4-flash", "name": "deepseek-v4-flash", "contextWindow": 1024000, "maxTokens": 65536, "input": [ "text" ] }, { "id": "deepseek-v4-pro", "name": "deepseek-v4-pro", "contextWindow": 1024000, "maxTokens": 65536, "input": [ "text" ] }, { "id": "deepseek-v4.1-flash", "name": "deepseek-v4.1-flash", "contextWindow": 1024000, "maxTokens": 65536, "input": [ "text", "image" ] }, { "id": "deepseek-v4.1-flash-economy", "name": "deepseek-v4.1-flash-economy", "contextWindow": 1049000, "maxTokens": 65536, "input": [ "text", "image" ] }, { "id": "kimi-k2.8-preview", "name": "kimi-k2.8-preview", "contextWindow": 1024000, "maxTokens": 65536, "input": [ "text", "image" ] }, { "id": "kimi-k3", "name": "kimi-k3", "contextWindow": 1024000, "maxTokens": 65536, "input": [ "text", "image" ] } ] } } }, "agents": { "defaults": { "model": { "primary": "volcengine-plan/ark-code-latest" }, "models": { "volcengine-plan/ark-code-latest": {}, "volcengine-plan/doubao-seed-2.1-pro": {}, "volcengine-plan/doubao-seed-2.1-lite": {}, "volcengine-plan/doubao-seed-2.0-mini": {}, "volcengine-plan/doubao-seed-evolving": {}, "volcengine-plan/glm-5.3": {}, "volcengine-plan/glm-5.3-flash": {}, "volcengine-plan/glm-latest": {}, "volcengine-plan/kimi-k2.8-preview": {}, "volcengine-plan/kimi-k3": {}, "volcengine-plan/deepseek-v4.1-flash": {}, "volcengine-plan/deepseek-v4.1-flash-economy": {}, "volcengine-plan/deepseek-v4-flash": {}, "volcengine-plan/deepseek-v4-pro": {} } } }, "gateway": { "mode": "local" } } ``` 3. 配置完成后,先单击右上角 **Save** 保存,保存完成后单击 **Update** 更新配置。 **选项:终端方式** 1. 在终端执行以下命令打开 OpenClaw 配置文件。 ```Bash nano ~/.openclaw/openclaw.json ``` 2. 修改配置信息,完成 Coding Plan 对接。将``替换为您自己的 [API Key](https://ark.volcengine.com/region:cn-beijing/apikey)。 > **注意** > > * 如果已经配置过 OpenClaw,请勿直接覆盖原有配置,建议根据提供的配置更新`models`、`agents` 和 `gateway` 节点信息。其中`models`节点包含支持的模型列表。 > * [OpenClaw 如何开启深度思考模式?](/docs/coding-plan-personal-faq#7805bea3) > * [在 OpenClaw 中无法识别图片,如何处理?](/docs/coding-plan-personal-faq#95ad3a53) > * [配置 OpenClaw 时报错 “run error: 404 The model or endpoint xxx does not exist or you do not have access to it”,如何处理?](/docs/coding-plan-personal-faq#0a04411f) 以下是 Responses API 的配置示例。 ```JSON { "models": { "providers": { "volcengine-plan": { "baseUrl": "https://ark.cn-beijing.volces.com/api/coding/v3", "apiKey": "", "api": "openai-responses", "models": [ { "id": "ark-code-latest", "name": "ark-code-latest", "contextWindow": 256000, "maxTokens": 32000, "input": [ "text", "image" ] }, { "id": "doubao-seed-2.1-pro", "name": "doubao-seed-2.1-pro", "contextWindow": 1024000, "maxTokens": 65536, "input": [ "text", "image" ] }, { "id": "doubao-seed-2.1-lite", "name": "doubao-seed-2.1-lite", "contextWindow": 1024000, "maxTokens": 65536, "input": [ "text", "image" ] }, { "id": "doubao-seed-2.0-mini", "name": "doubao-seed-2.0-mini", "contextWindow": 256000, "maxTokens": 65536, "input": [ "text", "image" ] }, { "id": "doubao-seed-evolving", "name": "doubao-seed-evolving", "contextWindow": 1024000, "maxTokens": 65536, "input": [ "text", "image" ] }, { "id": "glm-5.3", "name": "glm-5.3", "contextWindow": 1024000, "maxTokens": 65536, "input": [ "text" ] }, { "id": "glm-5.3-flash", "name": "glm-5.3-flash", "contextWindow": 1024000, "maxTokens": 65536, "input": [ "text", "image" ] }, { "id": "glm-latest", "name": "glm-latest", "contextWindow": 1024000, "maxTokens": 65536, "input": [ "text" ] }, { "id": "deepseek-v4-flash", "name": "deepseek-v4-flash", "contextWindow": 1024000, "maxTokens": 65536, "input": [ "text" ] }, { "id": "deepseek-v4-pro", "name": "deepseek-v4-pro", "contextWindow": 1024000, "maxTokens": 65536, "input": [ "text" ] }, { "id": "deepseek-v4.1-flash", "name": "deepseek-v4.1-flash", "contextWindow": 1024000, "maxTokens": 65536, "input": [ "text", "image" ] }, { "id": "deepseek-v4.1-flash-economy", "name": "deepseek-v4.1-flash-economy", "contextWindow": 1049000, "maxTokens": 65536, "input": [ "text", "image" ] }, { "id": "kimi-k2.8-preview", "name": "kimi-k2.8-preview", "contextWindow": 1024000, "maxTokens": 65536, "input": [ "text", "image" ] }, { "id": "kimi-k3", "name": "kimi-k3", "contextWindow": 1024000, "maxTokens": 65536, "input": [ "text", "image" ] } ] } } }, "agents": { "defaults": { "model": { "primary": "volcengine-plan/ark-code-latest" }, "models": { "volcengine-plan/ark-code-latest": {}, "volcengine-plan/doubao-seed-2.1-pro": {}, "volcengine-plan/doubao-seed-2.1-lite": {}, "volcengine-plan/doubao-seed-2.0-mini": {}, "volcengine-plan/doubao-seed-evolving": {}, "volcengine-plan/glm-5.3": {}, "volcengine-plan/glm-5.3-flash": {}, "volcengine-plan/glm-latest": {}, "volcengine-plan/kimi-k2.8-preview": {}, "volcengine-plan/kimi-k3": {}, "volcengine-plan/deepseek-v4.1-flash": {}, "volcengine-plan/deepseek-v4.1-flash-economy": {}, "volcengine-plan/deepseek-v4-flash": {}, "volcengine-plan/deepseek-v4-pro": {} } } }, "gateway": { "mode": "local" } } ``` 3. 配置完成后保存文件,并在终端执行以下命令重启服务使更改生效。 ```Bash openclaw gateway restart ``` # 三、使用 OpenClaw ## 开始使用 * 打开 Web UI,在 Chat 页面进行交互。 ```Bash openclaw dashboard ``` * 打开 TUI,并查看 Gateway 状态。 ```Bash openclaw tui /status ``` ## 切换模型 请根据模型配置方式,选择对应的模型切换方案。 * 模型配置:Model Name,支持以下两种方式切换模型。 前提条件:根据 [二、配置 OpenClaw](/docs/coding-plan-personal-ai-openclaw#48c0b1ea) 步骤完成文件配置,其中`agents.defaults.models`包含支持的模型列表。 * 方式一:全局配置(永久有效) 在配置文件中直接修改`agents.defaults.model.primary`为目标模型,修改完成后需要重新启动服务。 ```JSON { "agents": { "defaults": { "model": { "primary": "volcengine-plan/doubao-seed-2.1-pro" } } } } ``` * 方式二:在当前会话切换模型(临时有效) 在终端执行`openclaw tui`后,通过`/models`切换模型,当界面返回 "model set to " 时,表示配置生效。 ![](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/changemodel.png) * 模型配置:`volcengine-plan/ark-code-latest`,通过控制台切换模型。 配置文件中`agents.defaults.model.primary`为`volcengine-plan/ark-code-latest`。 模型切换操作:在 [开通管理页面](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=subscribe) 选择要使用的模型,切换后3-5分钟即可生效。 # 其他操作 ## 接入飞书机器人 ### 前置准备 安装并配置 OpenClaw,参见[一、安装 OpenClaw](/docs/coding-plan-personal-ai-openclaw#b51c87f8)、[二、配置 OpenClaw](/docs/coding-plan-personal-ai-openclaw#48c0b1ea)。 > **注意** > > 飞书插件处于快速迭代阶段,本文使用的插件版本为 **2026.3.10**,如果实际使用与以下步骤存在差异,可参见 [OpenClaw 飞书官网插件](https://bytedance.larkoffice.com/docx/MFK7dDFLFoVlOGxWCv5cTXKmnMh)。 ### 安装飞书插件 1. 执行以下命令安装飞书插件。 ```Bash npx -y @larksuite/openclaw-lark-tools install ``` 如果执行命令时报错,可在命令行前增加`sudo`重新执行。 2. 根据界面提示信息,选择**新建机器人**。 ![Image](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/9af37555c38f4ffb858932eab3ed05c5~tplv-goo7wpa0wc-image.image) 3. 通过飞书客户端扫描二维码,选择**一键创建飞书机器人**。 ![Image](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/71401f60297543279b95f1c764991f99~tplv-goo7wpa0wc-image.image) 4. 在飞书中向机器人发送`/feishu start`,若返回版本号信息,代表安装成功。 5. 在飞书中向机器人发送消息,开始对话。 ## 高级配置:配置 Embedding 模型 方舟 Coding Plan 提供的 `doubao-embedding-vision` 模型(向量模型)可以为 OpenClaw 提供语义向量能力,将对话、文档与任务信息转换为高维向量表示,实现基于语义相似度的高效检索。 相比传统关键词匹配,Embedding 检索在信息量大、对话长、资料分散的场景下,能够更准确地召回相关内容,显著降低遗漏与误判。同时,Embedding 为记忆检索、知识库问答与工具调用提供统一的语义索引层,帮助 OpenClaw 在不增加主模型推理成本的前提下,提升跨轮次上下文追踪能力与整体效果。 选择以下任一方式配置向量模型。 **选项:Web UI 方式** 1. 执行以下命令打开 Web UI。 ```Bash openclaw dashboard ``` 1. 在左侧菜单栏选择**配置** - **All Settings** - **Raw**,在`agents.defaults`节点下增加 `memorySearch`相关配置信息,增加的配置信息如下。其中需要将``替换为您自己的 [API Key](https://ark.volcengine.com/region:cn-beijing/apikey)。 ```JSON { ... "agents": { "defaults": { ... "memorySearch": { "provider": "openai", "model": "doubao-embedding-vision", "remote": { "baseUrl": "https://ark.cn-beijing.volces.com/api/coding/v3", "apiKey": "" } } ... } } ... } ``` 2. 配置完成后,先单击右上角 **Save** 保存,保存完成后单击 **Update** 更新配置。 **选项:终端方式** 1. 在终端执行以下命令打开 OpenClaw 配置文件。 ```Bash nano ~/.openclaw/openclaw.json ``` 1. 在`agents.defaults`节点下增加 `memorySearch`相关配置信息,增加的配置信息如下。其中需要将``替换为您自己的 [API Key](https://ark.volcengine.com/region:cn-beijing/apikey)。 ```JSON { ... "agents": { "defaults": { ... "memorySearch": { "provider": "openai", "model": "doubao-embedding-vision", "remote": { "baseUrl": "https://ark.cn-beijing.volces.com/api/coding/v3", "apiKey": "" } } ... } } ... } ``` 2. 配置完成后,重启网关使配置生效。 ```Bash openclaw gateway restart ``` # 常见问题 ## OpenClaw 配置问题 * [OpenClaw 如何开启深度思考模式?](/docs/coding-plan-personal-faq#7805bea3) * [使用 OpenClaw 时,出现不支持 developer role 的报错,如何解决?](/docs/coding-plan-personal-faq#f7034bc1) * [在 OpenClaw 中无法识别图片,如何处理?](/docs/coding-plan-personal-faq#95ad3a53) * [安装 OpenClaw 时报错 “gateway connect failed: Error: pairing required”,如何处理?](/docs/coding-plan-personal-faq#2dbe7807) * [配置 OpenClaw 时报错 “run error: 404 The model or endpoint xxx does not exist or you do not have access to it”,如何处理?](/docs/coding-plan-personal-faq#0a04411f) ## 飞书插件使用问题 * [如何升级飞书插件版本?](/docs/coding-plan-personal-faq#cbd18e98) * [在使用飞书插件时遇到问题,如何操作?](/docs/coding-plan-personal-faq#56d65f8c) * [如何配置飞书机器人,使其具备流式输出、耗时显示及状态展示能力?](/docs/coding-plan-personal-faq#b81c7462) * [如何修改飞书机器人在群内的回复方式?](/docs/coding-plan-personal-faq#863901a0) ## Ark Helper 使用问题 * [如何升级 Ark Helper?](/docs/coding-plan-personal-faq#7bdd6584) * [如何卸载 Ark Helper?](/docs/coding-plan-personal-faq#e2f455fc) # 错误码 在编程工具中使用 Coding Plan 套餐时可能会遇到报错,您可以根据错误信息查看对应的报错场景并定位问题,具体可参考[错误码](/docs/error-codes)。 --- # Hermes Agent Source: https://ark.volcengine.com/region:cn-beijing/docs/coding-plan-personal-ai-hermes-agent [Hermes Agent](https://hermes-agent.nousresearch.com/) 是由 Nous Research 开发的开源自主 AI 智能体,具备跨会话持久记忆和自我学习能力。本文介绍如何在 Hermes Agent 使用方舟 Coding Plan。 # 核心配置 接入工具的核心参数如下: ## **模型配置** 支持以下两种方式配置模型: **选项:配置 Model Name (配置文件指定)** 在工具配置文件中指定 Model Name,可实时切换模型。支持配置的 Model Name: > **注意** > > 配置 Model Name 时,支持使用全小写格式,同时也支持直接复制 [开通管理页面](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=subscribe) 中的模型名称。 * `doubao-seed-evolving` * `doubao-seed-2.1-pro` * `doubao-seed-2.1-lite` * `doubao-seed-2.0-mini` * `glm-5.3` (`glm-latest`) * `glm-5.3-flash` * `deepseek-v4.1-flash` * `deepseek-v4.1-flash-economy` * `deepseek-v4-flash` * `deepseek-v4-pro` * `kimi-k2.8-preview` * `kimi-k3` > **说明** > > Model Name 不支持配置为 `Auto`,如需使用,请通过控制台切换该模式。 **选项:配置 ark-code-latest (控制台管理)** 1. 在配置文件中指定模型为`ark-code-latest`。 2. 通过 [开通管理页面](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=subscribe) 选择或切换目标模型,切换模型后 3-5 分钟即可生效。 支持 Auto 模式,通过「效果 + 速度」双维度智能算法自动选择模型。 ## **Base URL** 不同的工具配置的 Base URL 根据兼容的协议会有不同: * 兼容 Anthropic 接口协议工具:`https://ark.cn-beijing.volces.com/api/coding` * 兼容 OpenAI 接口协议工具:`https://ark.cn-beijing.volces.com/api/coding/v3` > **注意** > > 请勿使用 `https://ark.cn-beijing.volces.com/api/v3` :该 Base URL 不会消耗您的 Coding Plan 额度,而是会产生额外费用。 ## **API Key** [获取 API Key](https://ark.volcengine.com/region:cn-beijing/apikey) # 一、前提条件 支持在 macOS、Linux 和 Windows 系统中安装 Hermes Agent。 # 二、安装 Hermes Agent 根据操作系统执行以下命令安装 Hermes Agent,安装过程中会检测并安装 uv、Python、Node.js、ripgrep、ffmpeg 等依赖,安装完成后重新加载 Shell 或终端。更多安装说明参见 [Hermes Agent 官方文档](https://hermes-agent.nousresearch.com/docs/getting-started/installation)。 **选项:macOS / Linux** 1. 执行以下 cURL 命令安装: ```Bash curl -fsSL https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash ``` 2. 安装完成后重新加载 Shell。 ```Bash source ~/.bashrc # or: source ~/.zshrc ``` **选项:Windows** 1. 在 PowerShell 中执行以下命令安装: ```PowerShell iex (irm https://hermes-agent.nousresearch.com/install.ps1) ``` 2. 安装完成后重新打开 PowerShell 窗口,或执行 `. $PROFILE` 刷新环境变量。 # 三、配置 Hermes Agent ## 方式 1:自动化助手(推荐) ArkCLI Helper 是一个编码工具助手,支持快速配置选择的工具接入 Coding Plan。安装并运行该助手,根据界面提示操作可自动完成工具配置,降低手动配置的时间成本和出错风险。 > **注意** > > * ArkCLI Helper 是基于 Ark Helper 升级演进的工具配置服务,相关能力将持续在 ArkCLI Helper 上迭代更新。建议优先使用 ArkCLI Helper 完成工具配置。 > * ArkCLI Helper 支持 macOS、Linux、Windows 系统。 1. 安装 Ark CLI。 ```Bash # 1. 通过 NPM 安装 npm install -g @volcengine/ark-cli@latest # 2. 验证安装 arkcli --version ``` 2. 登录 Ark CLI。 ```Bash arkcli auth login ``` ![image-20260624-144256-509.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-144256-509.png) 根据界面提示选择登录方式。若之前已登录过 arkcli,会沿用上次选择的配置;如需重新选择,请先执行 `arkcli config reset` 后再运行 `arkcli auth login`。首次登录时,按提示完成以下配置: 1. **选择项目(Project)**:可按需选择,或默认选择**账号全部资源**。 2. **选择消费模式(Type)**:选择 `coding-plan`。 ![image-20260624-163746-727.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-163746-727.png) 3. 运行 ArkCLI Helper,根据界面提示完成 Hermes Agent 的配置。 1. 在命令行界面输入 `arkcli helper` 命令,启动 ArkCLI Helper。 2. **选择要配置的 Plan profile**:选择 `coding-plan_cn-beijing_personal (Coding Plan)`。 ![image-20260624-163451-813.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-163451-813.png) 3. **选择默认 model**:按需选择。 4. **选择要配置的 AI Agent**:`Hermes Agent`。 ![image-20260624-164208-100.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-164208-100.png) 完成上述操作后,将自动完成 Hermes Agent 的基础配置,无需手动安装。 ## 方式 2:手动配置 Coding Plan 兼容 OpenAI 接口协议,支持 Responses API、Chat API。推荐使用 Responses API 的配置,推理效果更好。 **选项:Responses API** > **注意** > > 使用 Responses API,需要配置 `api_mode: codex_responses`。 执行以下命令配置 Hermes Agent,其中需要将 `` 替换为您自己的 [API Key](https://ark.volcengine.com/region:cn-beijing/apikey),可用的模型参见 [模型配置](/docs/coding-plan-personal-ai-hermes-agent#3a775131)。 ```Bash hermes config set model.provider custom hermes config set model.base_url https://ark.cn-beijing.volces.com/api/coding/v3 hermes config set model.api_key hermes config set model.default ark-code-latest hermes config set model.api_mode codex_responses ``` 配置完成后,配置文件 `~/.hermes/config.yaml` 内容如下。您也可以直接编辑该配置文件。 ```YAML model: default: ark-code-latest provider: custom base_url: https://ark.cn-beijing.volces.com/api/coding/v3 api_key: api_mode: codex_responses ``` **选项:Chat API** > **注意** > > 使用 Chat API,需要配置 `api_mode: chat_completions`。 执行以下命令配置 Hermes Agent,其中需要将 `` 替换为您自己的 [API Key](https://ark.volcengine.com/region:cn-beijing/apikey),可用的模型参见 [模型配置](/docs/coding-plan-personal-ai-hermes-agent#3a775131)。 ```Bash hermes config set model.provider custom hermes config set model.base_url https://ark.cn-beijing.volces.com/api/coding/v3 hermes config set model.api_key hermes config set model.default ark-code-latest hermes config set model.api_mode chat_completions ``` 配置完成后,配置文件 `~/.hermes/config.yaml` 内容如下。您也可以直接编辑该配置文件。 ```YAML model: default: ark-code-latest provider: custom base_url: https://ark.cn-beijing.volces.com/api/coding/v3 api_key: api_mode: chat_completions ``` > **说明** > > * 如需使用 1MB 上下文,直接选择支持 1M 上下文的模型,Hermes Agent 会自动完成调整,无需手动配置。 > * 若模型本身支持 1M 上下文,但 Hermes Agent 未正确识别,可在 `~/.hermes/config.yaml` 中手动添加或修改相应模型的 `context_length` 字段:`context_length: 1048576`。 # 四、启动并使用 Hermes Agent 1. 执行以下命令开启 Hermes Agent。 ```Bash hermes ``` 2. 开始使用 Hermes Agent,支持的 CLI Interface 参见 [官方文档](https://hermes-agent.nousresearch.com/docs/user-guide/cli)。 # 其他操作 ## 切换模型 你可以随时根据需求切换**文本生成模型**。 |配置方式 |通过控制台 |修改配置文件 | |---|---|---| |切换模型操作 |1. 参考[三、配置 Hermes Agent](/docs/coding-plan-personal-ai-hermes-agent#14207659)配置模型名称为`ark-code-latest`。 |参考[三、配置 Hermes Agent](/docs/coding-plan-personal-ai-hermes-agent#14207659)配置模型名称为您需要的模型。 | \ | |2. 在 [开通管理页面](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=subscribe) 选择要使用的模型,切换后3-5分钟即可生效。 | | ## 接入飞书机器人 > **注意** > > 本文档基于 Hermes Agent v0.8.0(2026.4.8)编写,工具迭代演进过程配置步骤可能会有差异,可参考以下内容配置关键信息。 1. 单击 [链接](https://open.larkoffice.com/page/openclaw?form=multiAgent) 快速创建飞书机器人。 2. 在终端执行以下命令配置信息平台。 ```Bash hermes gateway setup ``` * **Select a platform to configure**:选择 `Feishu / Lark` * **How would you like to set up Feishu / Lark**:选择 `Enter existing App ID and App Secret manually` * 配置创建的机器人对应的 **App ID**、**App Secret** * **Domain**:选择`feishu` * **Connection mode**:选择`WebSocket` * **How should direct messages be authorized**:选择 `Use DM pairing approval` * **How should group chats be handled**:选择`Respond only when @mentioned in groups` * **Home chat ID**:暂不配置 * 选择 **done** 后, **Install the gateway as a launchd service**:选择 `Y` * **Start the service now**:选择 `Y` 3. 在飞书打开刚创建的飞书机器人,发送任意消息获取配对码。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/c2011e63fa4f4be8af7b0a56c3ea1301~tplv-goo7wpa0wc-image.image) 4. 在终端执行以下命令对飞书进行配置,其中``需替换为获取的配对码。 ```Bash hermes pairing approve feishu ``` ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/016ab535150a4301b82d03cbeb3681db~tplv-goo7wpa0wc-image.image) 5. 在飞书中发送`/sethome`命令将飞书会话设置为主会话,然后即可正常在飞书中使用 Hermes Agent。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/474f623625654ef594c530f2946034f6~tplv-goo7wpa0wc-image.image) --- # TRAE Source: https://ark.volcengine.com/region:cn-beijing/docs/coding-plan-personal-ai-trae TraeCode 是一款面向开发者的智能 IDE,集成代码编辑、智能补全、调试运行、版本控制等一体化工具链,打造新一代高效编程工作流。 方舟 Coding Plan 支持在 TraeCode 中使用,可参考本文进行配置及使用。 > **说明** > > 需要先访问 [方舟 Coding Plan活动](https://www.volcengine.com/activity/codingplan),按需订阅套餐后再配置使用编程工具。 # 一、安装 TraeCode CN 访问 [TraeCode 官网](https://www.trae.cn/) 下载并安装对应操作系统的版本。 # 二、配置 TraeCode 1. 根据个人用户入口登录后,进入设置中心添加模型。 1. 选择**个人用户**入口登录后,点击界面右上角的 **设置** 图标,进入设置中心。 2. 在左侧导航栏中,选择 **模型**,在模型管理页面进行配置。 3. 点击 **+ 添加模型** 按钮,界面上显示 **添加模型** 窗口。 2. 在**添加模型**窗口中,配置模型信息。 1. 选择服务商:**火山引擎** 2. 配置方式:**Coding Plan** 3. 选择模型。 * 直接从列表中选择提供的模型。 * 若希望使用 Coding Plan 支持的其他模型,单击**使用其他模型**,**模型 ID** 配置信息如下: |配置方式 |配置信息 | |---|---| |配置 Model Name |Coding Plan 直接配置 Model Name,提供的是模型最新版本。支持的 Model Name: | \ | | | \ | |:::warning | \ | |配置时,**模型 ID** 支持使用全小写格式,同时也支持直接复制 [开通管理页面](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=subscribe) 中的模型名称。 | \ | |::: | \ | | | \ | | | \ | |* `doubao-seed-2.1-pro` | \ | |* `doubao-seed-2.1-lite` | \ | |* `doubao-seed-2.0-mini` | \ | |* `doubao-seed-evolving` | \ | |* `glm-5.3` | \ | |* `glm-5.3-flash` | \ | |* `deepseek-v4.1-flash` | \ | |* `deepseek-v4.1-flash-economy` | \ | |* `deepseek-v4-flash` | \ | |* `deepseek-v4-pro` | \ | |* `kimi-k2.8-preview` | \ | |* `kimi-k3` | \ | | | \ | | | \ | | | \ | | | \ | | | \ | | | \ | |:::tip | \ | |Model Name 不支持配置为 `Auto`。如需使用,模型 ID 配置为 `ark-code-latest`并通过控制台选择` Auto `模式。 | \ | |::: | |配置 ark-code-latest |1. 模型 ID 配置为 `ark-code-latest`。 | \ | |2. 通过 [开通管理页面](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=subscribe) 选择或切换目标模型。 | \ | |支持 Auto 模式,通过「效果 + 速度」双维度智能算法自动选择模型。 | ![Image](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/%E6%88%AA%E5%B1%8F2026-07-06%20%E4%B8%8B%E5%8D%888.45.58.png) 3. 填写 API 密钥 **API 密钥**:[获取API Key](https://ark.volcengine.com/region:cn-beijing/apikey) # 三、使用 TraeCode 在 AI 对话输入框的右下角,单击当前模型名称,在模型列表中,选择配置的模型。 选定模型后,即可使用 TraeCode 进行开发任务了。 --- # WorkBuddy Source: https://ark.volcengine.com/region:cn-beijing/docs/coding-plan-personal-ai-workbuddy WorkBuddy 是腾讯云推出的桌面 AI 智能体客户端,适配 QQ / 企微生态。本文介绍如何在 WorkBuddy 中接入方舟 Coding Plan 使用。 # 一、前置操作 1. 访问 [方舟 Coding Plan 活动](https://www.volcengine.com/activity/codingplan),按需订阅套餐后再配置使用编程工具。 2. 访问 [WorkBuddy 官网](https://www.workbuddy.ai/),下载并安装适合您操作系统的版本。安装完成后按提示登录。 # 核心配置 接入工具的核心参数如下: ## **模型配置** 支持以下两种方式配置模型: **选项:配置 Model Name (配置文件指定)** 在工具配置文件中指定 Model Name,可实时切换模型。支持配置的 Model Name: > **注意** > > 配置 Model Name 时,支持使用全小写格式,同时也支持直接复制 [开通管理页面](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=subscribe) 中的模型名称。 * `doubao-seed-evolving` * `doubao-seed-2.1-pro` * `doubao-seed-2.1-lite` * `doubao-seed-2.0-mini` * `glm-5.3` (`glm-latest`) * `glm-5.3-flash` * `deepseek-v4.1-flash` * `deepseek-v4.1-flash-economy` * `deepseek-v4-flash` * `deepseek-v4-pro` * `kimi-k2.8-preview` * `kimi-k3` > **说明** > > Model Name 不支持配置为 `Auto`,如需使用,请通过控制台切换该模式。 **选项:配置 ark-code-latest (控制台管理)** 1. 在配置文件中指定模型为`ark-code-latest`。 2. 通过 [开通管理页面](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=subscribe) 选择或切换目标模型,切换模型后 3-5 分钟即可生效。 支持 Auto 模式,通过「效果 + 速度」双维度智能算法自动选择模型。 ## **Base URL** 不同的工具配置的 Base URL 根据兼容的协议会有不同: * 兼容 Anthropic 接口协议工具:`https://ark.cn-beijing.volces.com/api/coding` * 兼容 OpenAI 接口协议工具:`https://ark.cn-beijing.volces.com/api/coding/v3` > **注意** > > 请勿使用 `https://ark.cn-beijing.volces.com/api/v3` :该 Base URL 不会消耗您的 Coding Plan 额度,而是会产生额外费用。 ## **API Key** [获取 API Key](https://ark.volcengine.com/region:cn-beijing/apikey) # 二、配置 WorkBuddy ## 方式 1:自动化助手(推荐) ArkCLI Helper 是一个编码工具助手,支持快速配置选择的工具接入 Coding Plan。安装并运行该助手,根据界面提示操作可自动完成工具配置,降低手动配置的时间成本和出错风险。 > **注意** > > * ArkCLI Helper 是基于 Ark Helper 升级演进的工具配置服务,相关能力将持续在 ArkCLI Helper 上迭代更新。建议优先使用 ArkCLI Helper 完成工具配置。 > * ArkCLI Helper 支持 macOS、Linux、Windows 系统。 1. 安装 Ark CLI。 ```Bash # 1. 通过 NPM 安装 npm install -g @volcengine/ark-cli@latest # 2. 验证安装 arkcli --version ``` 2. 登录 Ark CLI。 ```Bash arkcli auth login ``` ![image-20260624-144256-509.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-144256-509.png) 根据界面提示选择登录方式。若之前已登录过 arkcli,会沿用上次选择的配置;如需重新选择,请先执行 `arkcli config reset` 后再运行 `arkcli auth login`。首次登录时,按提示完成以下配置: 1. **选择项目(Project)**:可按需选择,或默认选择**账号全部资源**。 2. **选择消费模式(Type)**:选择 `coding-plan`。 ![image-20260624-163746-727.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-163746-727.png) 其中: * ``:运行 ArkCLI Helper 时填写的 Coding Plan API Key。 3. 运行 ArkCLI Helper,根据界面提示完成 WorkBuddy 的配置。 1. 在命令行界面输入 `arkcli helper` 命令,启动 ArkCLI Helper。 2. **选择要配置的 Plan profile**:选择 `coding-plan_cn-beijing_personal (Coding Plan)`。 ![image-20260624-163451-813.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-163451-813.png) 3. **选择默认 model**:按需选择。 4. **选择要配置的 AI Agent**:`WorkBuddy`。 ![](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/workbuddy-arkcli.png) 完成上述操作后,将自动完成 WorkBuddy 的基础配置,无需手动安装。 ## 方式 2:手动配置 1. 启动 WorkBuddy,单击左下角账户头像,选择 **设置**。 ![](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/workbuddy-login.png) 2. 在左侧导航中选择 **模型**,在自定义模型区域单击 **添加模型**。 ![workbuddy-setting.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/workbuddy-setting.png) 3. 在提供商中选择 **自定义 / Custom**,填写以下字段并保存: * **接口地址**:`https://ark.cn-beijing.volces.com/api/coding/v3` * **API Key**:请在 [Coding Plan 页面](https://ark.volcengine.com/region:cn-beijing/subscription/coding-plan) 使用 **API Key**。 * **模型名称**:填写所选套餐支持的 Model Name,模型信息见 [支持的模型](/docs/coding-plan-personal-plan-overview#51b87c17),需配置文本生成模型。 * **高级工具**:非必填,按需勾选。按需开启 **工具调用**、**图片输入**、**思考模式**。 * **自定义协议**:当模型服务使用非标准 URL 路径(如经过网关或代理层封装)时,可在高级配置中开启自定义协议开关。开启后 Tencent WorkBuddy 将直接按填写的 URL 发起请求,跳过路径校验与自动补全。关闭(默认):使用标准 `/chat/completions` 路径,自动校验并补全接口地址。开启:直接使用用户填写的接口地址发起请求,跳过路径校验与自动补全逻辑。 ![workbuddy-add-model.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/workbuddy-add-model.png) 除了在客户端 UI 中添加自定义模型,也可以直接编辑本地配置文件 `~/.workbuddy/models.json` 来接入 Coding Plan,保存后,WorkBuddy 会自动监听并热加载新配置(**无需重启**)。返回主界面的模型下拉列表中显示的即为 `name` 字段。 `~/.workbuddy/models.json` 示例 ```JSON [ { "id": "doubao-seed-2.1-pro", "name": "Doubao Seed 2.1 Pro", "vendor": "Custom", "url": "https://ark.cn-beijing.volces.com/api/coding/v3", "apiKey": "", "supportsToolCall": true, "supportsImages": false, "supportsReasoning": false, "useCustomProtocol": false } ] ``` 4. 保存后返回 WorkBuddy 主界面。 # 三、使用 WorkBuddy 1. 在主界面顶部的模型下拉中,选中刚添加的模型。 2. 在输入框用一句话描述你的任务(如生成周报、数据分析、整理文件、代码生成 / 重构 / 修 Bug),回车即可启动,WorkBuddy 会自主规划执行并产出文档、表格、代码文件等结果,在右侧结果区可查看生成内容与文件变更。 > 更多使用技巧和场景参见 [WorkBuddy 官方文档](https://www.workbuddy.ai/docs/zh/workbuddy/Quickstart)。 --- # ZCode Source: https://ark.volcengine.com/region:cn-beijing/docs/coding-plan-personal-ai-zcode ZCode 是智谱推出的桌面 AI 编程客户端(macOS / Windows / Linux),深度集成 GLM 系列模型,同时兼容自定义 OpenAI / Anthropic 协议供应商。本文介绍如何在 ZCode 中接入方舟 Coding Plan。 # 一、前置操作 1. 访问 [方舟 Coding Plan 活动](https://www.volcengine.com/activity/codingplan),按需订阅套餐后再配置使用编程工具。 2. 访问 [ZCode 官网](https://zcode.z.ai/cn#all-downloads),下载并安装适合您操作系统的版本。安装步骤可参考 [ZCode 官方安装教程](https://zcode.net.cn/en/docs/install#setup-guide),安装完成后按提示登录。 # 核心配置 接入工具的核心参数如下: ## **模型配置** 支持以下两种方式配置模型: **选项:配置 Model Name (配置文件指定)** 在工具配置文件中指定 Model Name,可实时切换模型。支持配置的 Model Name: > **注意** > > 配置 Model Name 时,支持使用全小写格式,同时也支持直接复制 [开通管理页面](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=subscribe) 中的模型名称。 * `doubao-seed-evolving` * `doubao-seed-2.1-pro` * `doubao-seed-2.1-lite` * `doubao-seed-2.0-mini` * `glm-5.3` (`glm-latest`) * `glm-5.3-flash` * `deepseek-v4.1-flash` * `deepseek-v4.1-flash-economy` * `deepseek-v4-flash` * `deepseek-v4-pro` * `kimi-k2.8-preview` * `kimi-k3` > **说明** > > Model Name 不支持配置为 `Auto`,如需使用,请通过控制台切换该模式。 **选项:配置 ark-code-latest (控制台管理)** 1. 在配置文件中指定模型为`ark-code-latest`。 2. 通过 [开通管理页面](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=subscribe) 选择或切换目标模型,切换模型后 3-5 分钟即可生效。 支持 Auto 模式,通过「效果 + 速度」双维度智能算法自动选择模型。 ## **Base URL** 不同的工具配置的 Base URL 根据兼容的协议会有不同: * 兼容 Anthropic 接口协议工具:`https://ark.cn-beijing.volces.com/api/coding` * 兼容 OpenAI 接口协议工具:`https://ark.cn-beijing.volces.com/api/coding/v3` > **注意** > > 请勿使用 `https://ark.cn-beijing.volces.com/api/v3` :该 Base URL 不会消耗您的 Coding Plan 额度,而是会产生额外费用。 ## **API Key** [获取 API Key](https://ark.volcengine.com/region:cn-beijing/apikey) # 二、配置 ZCode Coding Plan 同时兼容 OpenAI 与 Anthropic 接口协议,ZCode 均支持。以下以 **OpenAI 协议**为例;如需使用 Anthropic 协议,将 API 格式改为 **Anthropic** 并把 Base URL 换成 `https://ark.cn-beijing.volces.com/api/coding` 即可。 ## 方式 1:自动化助手(推荐) ArkCLI Helper 是一个编码工具助手,支持快速配置选择的工具接入 Coding Plan。安装并运行该助手,根据界面提示操作可自动完成工具配置,降低手动配置的时间成本和出错风险。 > **注意** > > * ArkCLI Helper 是基于 Ark Helper 升级演进的工具配置服务,相关能力将持续在 ArkCLI Helper 上迭代更新。建议优先使用 ArkCLI Helper 完成工具配置。 > * ArkCLI Helper 支持 macOS、Linux、Windows 系统。 1. 安装 Ark CLI。 ```Bash # 1. 通过 NPM 安装 npm install -g @volcengine/ark-cli@latest # 2. 验证安装 arkcli --version ``` 2. 登录 Ark CLI。 ```Bash arkcli auth login ``` ![image-20260624-144256-509.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-144256-509.png) 根据界面提示选择登录方式。若之前已登录过 arkcli,会沿用上次选择的配置;如需重新选择,请先执行 `arkcli config reset` 后再运行 `arkcli auth login`。首次登录时,按提示完成以下配置: 1. **选择项目(Project)**:可按需选择,或默认选择**账号全部资源**。 2. **选择消费模式(Type)**:选择 `coding-plan`。 ![image-20260624-163746-727.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-163746-727.png) 其中: * ``:运行 ArkCLI Helper 时填写的 Coding Plan API Key。 3. 运行 ArkCLI Helper,根据界面提示完成 ZCode 的配置。 1. 在命令行界面输入 `arkcli helper` 命令,启动 ArkCLI Helper。 2. **选择要配置的 Plan profile**:选择 `coding-plan_cn-beijing_personal (Coding Plan)`。 ![image-20260624-163451-813.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-163451-813.png) 3. **选择默认 model**:按需选择。 4. **选择要配置的 AI Agent**:`ZCode`。 ![](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/zcode-arkcli.png) 完成上述操作后,将自动完成 ZCode 的基础配置,无需手动安装。 ## 方式 2:手动配置 1. 打开 ZCode 客户端,单击左下角 **设置** 图标,进入 **模型设置**,单击 **添加供应商**。 ![zcode-setting.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/zcode-setting.png) 2. 在弹出的表单中填写以下字段,保存供应商。 * **名称**:自定义,便于识别,例如 `Ark Coding Plan`。 * **Base URL**:`https://ark.cn-beijing.volces.com/api/coding/v3`(OpenAI 协议);若使用 Anthropic 协议,填 `https://ark.cn-beijing.volces.com/api/coding`。 * **API Key**:填写您的 [方舟 API Key](https://ark.volcengine.com/region:cn-beijing/apikey)。 * **API 格式**:取决于选择的 Base URL。 |API 格式 |Base URL | |---|---| |Anthropic Messages |`https://ark.cn-beijing.volces.com/api/coding` | |Chat Completions |`https://ark.cn-beijing.volces.com/api/coding/v3` | |Responses |`https://ark.cn-beijing.volces.com/api/coding/v3` | ![zcode-setting2.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/zcode-setting2.png) 3. 单击 **添加模型**,在表单中填写以下字段,保存模型。可以多次点击 **添加模型**,为一个供应商添加多个模型。 * **模型 ID**:填入支持的 Model Name(详见上方**核心配置**),或使用 `ark-code-latest`。 * **上下文窗口**:按所选模型的最大上下文长度填写。 * **最大输出 Token**(可选):按需填写,默认可留空跟随模型上限。 除了在客户端 UI 中添加供应商,也可以直接编辑本地配置文件 `~/.zcode/v2/config.json`(Windows 系统为 `%USERPROFILE%\.zcode\v2\config.json`)。首次通过 UI 完成任意配置后该文件会自动生成,已有内容时在 `provider` 对象中追加一条即可。 API 格式为**Anthropic Messages**时,`~/.zcode/v2/config.json` 示例 ```JSON { "provider": { ... "ark-coding-plan": { "name": "Ark Coding Plan", "kind": "anthropic", "options": { "apiKey": "", "baseURL": "https://ark.cn-beijing.volces.com/api/coding", "apiKeyRequired": true }, "enabled": true, "source": "custom", "models": { "ark-code-latest": { "limit": { "context": 256000, "output": 32768 }, "modalities": { "input": ["text", "image"], "output": ["text"] } }, "doubao-seed-2.1-pro": { "limit": { "context": 1024000, "output": 262144 }, "modalities": { "input": ["text", "image"], "output": ["text"] } }, "doubao-seed-evolving": { "limit": { "context": 1024000, "output": 262144 }, "modalities": { "input": ["text", "image"], "output": ["text"] } }, "doubao-seed-2.1-lite": { "limit": { "context": 1024000, "output": 256000 }, "modalities": { "input": ["text", "image"], "output": ["text"] } }, "doubao-seed-2.0-mini": { "limit": { "context": 256000, "output": 128000 }, "modalities": { "input": ["text", "image"], "output": ["text"] } }, "glm-5.3": { "limit": { "context": 1024000, "output": 131072 }, "modalities": { "input": ["text"], "output": ["text"] } }, "glm-5.3-flash": { "limit": { "context": 1024000, "output": 131072 }, "modalities": { "input": ["text", "image"], "output": ["text"] } }, "glm-latest": { "limit": { "context": 1024000, "output": 131072 }, "modalities": { "input": ["text"], "output": ["text"] } }, "deepseek-v4-flash": { "limit": { "context": 1024000, "output": 393216 }, "modalities": { "input": ["text"], "output": ["text"] } }, "deepseek-v4-pro": { "limit": { "context": 1024000, "output": 393216 }, "modalities": { "input": ["text"], "output": ["text"] } }, "deepseek-v4.1-flash": { "limit": { "context": 1024000, "output": 393216 }, "modalities": { "input": ["text", "image"], "output": ["text"] } }, "deepseek-v4.1-flash-economy": { "limit": { "context": 1049000, "output": 393216 }, "modalities": { "input": ["text", "image"], "output": ["text"] } }, "kimi-k2.8-preview": { "limit": { "context": 1024000, "output": 1024000 }, "modalities": { "input": ["text", "image"], "output": ["text"] } }, "kimi-k3": { "limit": { "context": 1024000, "output": 131072 }, "modalities": { "input": ["text","image"], "output": ["text"] } } } } ... } } ``` API 格式为**Chat Completions**时,`~/.zcode/v2/config.json` 示例 ```JSON { "provider": { ... "ark-coding-plan": { "name": "Ark Coding Plan", "kind": "openai-compatible", "options": { "apiKey": "", "baseURL": "https://ark.cn-beijing.volces.com/api/coding/v3", "apiKeyRequired": true }, "enabled": true, "source": "custom", "models": { "ark-code-latest": { "limit": { "context": 256000, "output": 32768 }, "modalities": { "input": ["text", "image"], "output": ["text"] } }, "doubao-seed-2.1-pro": { "limit": { "context": 1024000, "output": 262144 }, "modalities": { "input": ["text", "image"], "output": ["text"] } }, "doubao-seed-evolving": { "limit": { "context": 1024000, "output": 262144 }, "modalities": { "input": ["text", "image"], "output": ["text"] } }, "doubao-seed-2.1-lite": { "limit": { "context": 1024000, "output": 256000 }, "modalities": { "input": ["text", "image"], "output": ["text"] } }, "doubao-seed-2.0-mini": { "limit": { "context": 256000, "output": 128000 }, "modalities": { "input": ["text", "image"], "output": ["text"] } }, "glm-5.3": { "limit": { "context": 1024000, "output": 131072 }, "modalities": { "input": ["text"], "output": ["text"] } }, "glm-5.3-flash": { "limit": { "context": 1024000, "output": 131072 }, "modalities": { "input": ["text", "image"], "output": ["text"] } }, "glm-latest": { "limit": { "context": 1024000, "output": 131072 }, "modalities": { "input": ["text"], "output": ["text"] } }, "deepseek-v4-flash": { "limit": { "context": 1024000, "output": 393216 }, "modalities": { "input": ["text"], "output": ["text"] } }, "deepseek-v4-pro": { "limit": { "context": 1024000, "output": 393216 }, "modalities": { "input": ["text"], "output": ["text"] } }, "deepseek-v4.1-flash": { "limit": { "context": 1024000, "output": 393216 }, "modalities": { "input": ["text", "image"], "output": ["text"] } }, "deepseek-v4.1-flash-economy": { "limit": { "context": 1049000, "output": 393216 }, "modalities": { "input": ["text", "image"], "output": ["text"] } }, "kimi-k2.8-preview": { "limit": { "context": 1024000, "output": 1024000 }, "modalities": { "input": ["text", "image"], "output": ["text"] } }, "kimi-k3": { "limit": { "context": 1024000, "output": 131072 }, "modalities": { "input": ["text","image"], "output": ["text"] } } } } ... } } ``` API 格式为**Responses**时,`~/.zcode/v2/config.json` 示例 ```JSON { "provider": { ... "ark-coding-plan": { "name": "Ark Coding Plan", "kind": "openai", "options": { "apiKey": "", "baseURL": "https://ark.cn-beijing.volces.com/api/coding/v3", "apiKeyRequired": true }, "enabled": true, "source": "custom", "models": { "ark-code-latest": { "limit": { "context": 256000, "output": 32768 }, "modalities": { "input": ["text", "image"], "output": ["text"] } }, "doubao-seed-2.1-pro": { "limit": { "context": 1024000, "output": 262144 }, "modalities": { "input": ["text", "image"], "output": ["text"] } }, "doubao-seed-evolving": { "limit": { "context": 1024000, "output": 262144 }, "modalities": { "input": ["text", "image"], "output": ["text"] } }, "doubao-seed-2.1-lite": { "limit": { "context": 1024000, "output": 256000 }, "modalities": { "input": ["text", "image"], "output": ["text"] } }, "doubao-seed-2.0-mini": { "limit": { "context": 256000, "output": 128000 }, "modalities": { "input": ["text", "image"], "output": ["text"] } }, "glm-5.3": { "limit": { "context": 1024000, "output": 131072 }, "modalities": { "input": ["text"], "output": ["text"] } }, "glm-5.3-flash": { "limit": { "context": 1024000, "output": 131072 }, "modalities": { "input": ["text", "image"], "output": ["text"] } }, "glm-latest": { "limit": { "context": 1024000, "output": 131072 }, "modalities": { "input": ["text"], "output": ["text"] } }, "deepseek-v4-flash": { "limit": { "context": 1024000, "output": 393216 }, "modalities": { "input": ["text"], "output": ["text"] } }, "deepseek-v4-pro": { "limit": { "context": 1024000, "output": 393216 }, "modalities": { "input": ["text"], "output": ["text"] } }, "deepseek-v4.1-flash": { "limit": { "context": 1024000, "output": 393216 }, "modalities": { "input": ["text", "image"], "output": ["text"] } }, "deepseek-v4.1-flash-economy": { "limit": { "context": 1049000, "output": 393216 }, "modalities": { "input": ["text", "image"], "output": ["text"] } }, "kimi-k2.8-preview": { "limit": { "context": 1024000, "output": 1024000 }, "modalities": { "input": ["text", "image"], "output": ["text"] } }, "kimi-k3": { "limit": { "context": 1024000, "output": 131072 }, "modalities": { "input": ["text","image"], "output": ["text"] } } } } ... } } ``` > **注意** > > * `` 替换为您的 [方舟 API Key](https://ark.volcengine.com/region:cn-beijing/apikey)。 > * 上述示例仅列出 Coding Plan 目前提供的文本生成模型,实际支持的 Model Name 以上方**核心配置**中的列表为准;请删除您不需要或所选套餐不支持的条目,避免调用时收到 model not found 错误。 ![zcode-setting-ready.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/zcode-setting-ready.png) 1. 保存完成后,回到 ZCode 主界面。 ![zcode-start-to-work.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/zcode-start-to-work.png) # 三、使用 ZCode 1. 在 ZCode 主界面顶部的模型下拉中,选中刚添加的模型。 2. 在对话框输入你的需求(如生成代码、修复 bug、重构、写单元测试),回车即可开始对话开发。ZCode 支持规划、编码、评审与上线等全流程研发场景。 > 更多使用技巧和高级功能参见 [ZCode 官方文档](https://zcode.net.cn/en/docs)。 --- # DeepSeek Harness Source: https://ark.volcengine.com/region:cn-beijing/docs/coding-plan-personal-ai-deepseek-harness DeepSeek Harness 是 DeepSeek AI 开发的一套用来构建、运行和扩展智能体的应用框架,采用**一切皆插件**的架构。本文介绍如何在 DeepSeek Harness 中接入方舟 Coding Plan 个人版使用。 > **注意** > > DeepSeek Harness 目前处于**开发者预览**阶段,正在快速迭代,后续可能会出现破坏兼容性的变更。 > **说明** > > 需要先访问 [方舟 Coding Plan活动](https://www.volcengine.com/activity/codingplan),按需订阅套餐后再配置使用编程工具。 # 核心配置 接入工具的核心参数如下: ## **模型配置** 支持以下两种方式配置模型: **选项:配置 Model Name (配置文件指定)** 在工具配置文件中指定 Model Name,可实时切换模型。支持配置的 Model Name: > **注意** > > 配置 Model Name 时,支持使用全小写格式,同时也支持直接复制 [开通管理页面](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=subscribe) 中的模型名称。 * `doubao-seed-evolving` * `doubao-seed-2.1-pro` * `doubao-seed-2.1-lite` * `doubao-seed-2.0-mini` * `glm-5.3` (`glm-latest`) * `glm-5.3-flash` * `deepseek-v4.1-flash` * `deepseek-v4.1-flash-economy` * `deepseek-v4-flash` * `deepseek-v4-pro` * `kimi-k2.8-preview` * `kimi-k3` > **说明** > > Model Name 不支持配置为 `Auto`,如需使用,请通过控制台切换该模式。 **选项:配置 ark-code-latest (控制台管理)** 1. 在配置文件中指定模型为`ark-code-latest`。 2. 通过 [开通管理页面](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=subscribe) 选择或切换目标模型,切换模型后 3-5 分钟即可生效。 支持 Auto 模式,通过「效果 + 速度」双维度智能算法自动选择模型。 ## **Base URL** 不同的工具配置的 Base URL 根据兼容的协议会有不同: * 兼容 Anthropic 接口协议工具:`https://ark.cn-beijing.volces.com/api/coding` * 兼容 OpenAI 接口协议工具:`https://ark.cn-beijing.volces.com/api/coding/v3` > **注意** > > 请勿使用 `https://ark.cn-beijing.volces.com/api/v3` :该 Base URL 不会消耗您的 Coding Plan 额度,而是会产生额外费用。 ## **API Key** [获取 API Key](https://ark.volcengine.com/region:cn-beijing/apikey) # 一、配置 DeepSeek Harness 您可以按下面任一方式在 DeepSeek Harness 中接入方舟 Coding Plan。**自动化助手** 通过 ArkCLI Helper 引导完成工具配置;**通过 Web UI 手动配置** 通过 DeepSeek Harness Web UI 逐项填写;**通过 Ark 插件配置** 借助方舟官方插件自动完成 provider 添加,只需填入 API Key。 ## 方式 1:自动化助手(推荐) ArkCLI Helper 是一个编码工具助手,支持快速配置选择的工具接入 Coding Plan。安装并运行该助手,根据界面提示操作可自动完成工具配置,降低手动配置的时间成本和出错风险。 > **注意** > > * ArkCLI Helper 是基于 Ark Helper 升级演进的工具配置服务,相关能力将持续在 ArkCLI Helper 上迭代更新。建议优先使用 ArkCLI Helper 完成工具配置。 > * ArkCLI Helper 支持 macOS、Linux、Windows 系统。 1. 安装 Ark CLI。 ```Bash # 1. 通过 NPM 安装 npm install -g @volcengine/ark-cli@latest # 2. 验证安装 arkcli --version ``` 2. 登录 Ark CLI。 ```Bash arkcli auth login ``` ![image-20260624-144256-509.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-144256-509.png) 根据界面提示选择登录方式。若之前已登录过 arkcli,会沿用上次选择的配置;如需重新选择,请先执行 `arkcli config reset` 后再运行 `arkcli auth login`。首次登录时,按提示完成以下配置: 1. **选择项目(Project)**:可按需选择,或默认选择**账号全部资源**。 2. **选择消费模式(Type)**:选择 `coding-plan`。 ![image-20260624-163746-727.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-163746-727.png) 其中: * ``:运行 ArkCLI Helper 时填写的 Coding Plan API Key。 3. 运行 ArkCLI Helper,根据界面提示完成 DeepSeek Harness 的配置。 1. 在命令行界面输入 `arkcli helper` 命令,启动 ArkCLI Helper。 2. **选择要配置的 Plan profile**:选择 `coding-plan_cn-beijing_personal (Coding Plan)`。 ![image-20260624-163451-813.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-163451-813.png) 3. **选择默认 model**:按需选择。 4. **选择要配置的 AI Agent**:`DeepSeek Harness`。 ![](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/dsh-arkcli.png) 完成上述操作后,将自动完成 DeepSeek Harness 的基础配置,无需手动安装。 ## 方式 2:通过 Web UI 手动配置 前提条件:您已安装 Node.js(建议使用 LTS 版本)。 1. 启动 DeepSeek Harness。 1. 在终端执行以下命令启动 DeepSeek Harness 的 Web UI。 ```bash npx @deepseek-ai/dsh web ``` 2. 在浏览器打开命令输出的访问地址。默认地址为 `http://127.0.0.1:3080/`。 2. 在 DeepSeek Harness Web UI 中,单击左下角**设置**。 ![image-20260814-001513-207.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260814-001513-207.png) 3. 在左侧导航栏单击**模型**,根据界面信息进行配置。 - 方式一:配置 DeepSeek 卡片 在 DeepSeek 卡片,选择**自定义设置**,按下面信息填写并保存。 - **API 密钥**:填写 Coding Plan [API Key](https://ark.volcengine.com/region:cn-beijing/apikey)。 - **API 地址**:`https://ark.cn-beijing.volces.com/api/coding/v3` - **添加模型**:可用的模型参见 [模型配置](/docs/coding-plan-personal-ai-deepseek-harness#3a775131)。 ![image-20260814-001035-757.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260814-001035-757.png) - 方式二:添加自定义提供方 单击**添加自定义提供方**,按下面信息填写完成提供方的创建。 - **Provider ID**:自定义设置,后续如需重命名则需要添加新的提供方,并删除旧的提供方。 - **显式名称**:自定义设置。 - **API 地址**、**API 协议**:支持的 API 地址、API 协议及对应关系如下,不要配置错误。 |API 协议 | API 地址 | |---|---| |openai-completions |`https://ark.cn-beijing.volces.com/api/coding/v3` | |openai-responses |`https://ark.cn-beijing.volces.com/api/coding/v3` | |anthropic-messages |`https://ark.cn-beijing.volces.com/api/coding` | - **API 密钥**:填写 Coding Plan [API Key](https://ark.volcengine.com/region:cn-beijing/apikey)。 - **添加模型**:可用的模型参见 [模型配置](/docs/coding-plan-personal-ai-deepseek-harness#3a775131)。 4. (可选) 如果需要给模型配置支持图片输入,则需要在配置文件中进行配置。 1. 在模型配置页面,单击**打开配置文件**,路径`$DSH_HOME/settings.yaml`。 2. 在支持的模型配置部分加上 `input: [text, image]`,配置示例如下。 ```Yaml llm-pi-ai: providers: ark-plan: displayName: ark-plan apiKeyEnv: CODING_PLAN_API_KEY api: openai-responses baseURL: https://ark.cn-beijing.volces.com/api/coding/v3 models: - id: doubao-seed-2.1-pro name: doubao-seed-2.1-pro input: [text, image] ``` ## 方式 3:通过 Ark 插件配置 方舟提供以下官方 Ark Plan 和后付费模型插件,自动为 DeepSeek Harness 配置方舟 Coding Plan、Harness(专业数据集、豆包搜索、Agent 记忆等)与后付费模型 provider,安装后可以自动完成 DeepSeek Harness 与方舟服务的对接,免去手动填写 API 地址、API Key 等步骤: 1. 启动 DeepSeek Harness。 1. 在终端执行以下命令启动 DeepSeek Harness 的 Web UI。 ```bash npx @deepseek-ai/dsh web ``` 2. 在浏览器打开命令输出的访问地址。默认地址为 `http://127.0.0.1:3080/`。 2. 在对话框中输入以下 Prompt,让 Agent 帮你完成安装`ark-plan-api` 插件。 ```bash 帮我安装下面的插件:curl -fsSL -o dsh-ark-plugin-install.sh "https://lf3-static.bytednsdoc.com/obj/eden-cn/ylwslo-yrh/ljhwZthlaukjlkulzlp/ark-cli-outer-resource/dsh-ark-plugin-install.sh" && bash dsh-ark-plugin-install.sh --plugin-name ark-plan-api ``` ![deepseek-harness-install1.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/deepseek-harness-install1.png) 3. `ark-plan-api` 插件安装后会在 **设置 > 模型** 页面自动添加 Agent Plan、Coding Plan 以及后付费的模型 provider,用户可输入自己的 [API Key](https://ark.volcengine.com/region:cn-beijing/apikey)。回到对话页,在输入框右下角的模型下拉菜单中选择 **Ark Coding Plan** 下的模型即可开始使用。 ![ark-plan-plugin1.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/ark-plan-plugin1.png) 4. (可选) 安装插件市场,方便后续查看和管理已装插件。 ```bash 帮我安装下面插件:dsh plugin --profile web add dshmarket ``` 安装完成后,**设置** 侧边栏会新增 **插件市场** 页。 ![plugin-market.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/plugin-market.png) # 二、使用 DeepSeek Harness 1. 在页面中点击 **选择工作区**,添加你启动 `dsh` 时所在的项目目录。选中工作区后,会话输入框才可用。 2. 在输入框右下角的模型下拉菜单中选择 **Ark Coding Plan** 下的模型即可开始使用。可用模型列表参见 [支持的模型](/docs/coding-plan-personal-plan-overview#51b87c17)。 ![ark-plan-plugin2.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/ark-plan-plugin2.png) 3. 在输入框输入需求即可开始使用 DeepSeek Harness。 Agent 可以读取和编辑工作区文件、运行命令、委派工作并维护计划。当操作在当前权限策略下需要审批时,Web UI 会先询问你。 --- # Pi Source: https://ark.volcengine.com/region:cn-beijing/docs/coding-plan-personal-ai-pi Pi 是一款开源终端编程 Agent,通过统一 LLM API 兼容 OpenAI、Anthropic、Google 等多家协议。方舟 Coding Plan 支持在 Pi 中使用,可参考本文进行配置及使用。更多详情请参见 [Pi 官方文档](https://pi.dev/docs/latest)。 > **说明** > > 需要先访问 [方舟 Coding Plan活动](https://www.volcengine.com/activity/codingplan),按需订阅套餐后再配置使用编程工具。 # 核心配置 接入工具的核心参数如下: ## **模型配置** 支持以下两种方式配置模型: **选项:配置 Model Name (配置文件指定)** 在工具配置文件中指定 Model Name,可实时切换模型。支持配置的 Model Name: > **注意** > > 配置 Model Name 时,支持使用全小写格式,同时也支持直接复制 [开通管理页面](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=subscribe) 中的模型名称。 * `doubao-seed-evolving` * `doubao-seed-2.1-pro` * `doubao-seed-2.1-lite` * `doubao-seed-2.0-mini` * `glm-5.3` (`glm-latest`) * `glm-5.3-flash` * `deepseek-v4.1-flash` * `deepseek-v4.1-flash-economy` * `deepseek-v4-flash` * `deepseek-v4-pro` * `kimi-k2.8-preview` * `kimi-k3` > **说明** > > Model Name 不支持配置为 `Auto`,如需使用,请通过控制台切换该模式。 **选项:配置 ark-code-latest (控制台管理)** 1. 在配置文件中指定模型为`ark-code-latest`。 2. 通过 [开通管理页面](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=subscribe) 选择或切换目标模型,切换模型后 3-5 分钟即可生效。 支持 Auto 模式,通过「效果 + 速度」双维度智能算法自动选择模型。 ## **Base URL** 不同的工具配置的 Base URL 根据兼容的协议会有不同: * 兼容 Anthropic 接口协议工具:`https://ark.cn-beijing.volces.com/api/coding` * 兼容 OpenAI 接口协议工具:`https://ark.cn-beijing.volces.com/api/coding/v3` > **注意** > > 请勿使用 `https://ark.cn-beijing.volces.com/api/v3` :该 Base URL 不会消耗您的 Coding Plan 额度,而是会产生额外费用。 ## **API Key** [获取 API Key](https://ark.volcengine.com/region:cn-beijing/apikey) # 一、安装 Pi 前提条件:安装 [Node.js 20 或更新版本](https://nodejs.org/en/download/)。 **选项:macOS/Linux** 在命令行界面,执行以下命令安装 Pi。 ```Bash # 方式 1:npm 全局安装 npm install -g @earendil-works/pi-coding-agent # 方式 2:官方一键脚本 curl -fsSL https://pi.dev/install.sh | sh ``` 安装结束后,执行以下命令查看安装结果,若显示版本号则安装成功。 ```Bash pi --version ``` **选项:Windows** 需先额外安装 [Git for Windows](https://git-scm.com/download/win),Pi 依赖其提供的 `bash.exe` 执行 `!` / `!!` shell 命令;官方 curl 一键脚本在 Windows 上不支持。 通过 npm 全局安装: ```Bash npm install -g @earendil-works/pi-coding-agent ``` 安装结束后,执行以下命令查看安装结果,若显示版本号则安装成功。 ```Bash pi --version ``` # 二、配置 Pi ## 方式 1:自动化助手(推荐) ArkCLI Helper 是一个编码工具助手,支持快速配置选择的工具接入 Coding Plan。安装并运行该助手,根据界面提示操作可自动完成工具配置,降低手动配置的时间成本和出错风险。 > **注意** > > * ArkCLI Helper 是基于 Ark Helper 升级演进的工具配置服务,相关能力将持续在 ArkCLI Helper 上迭代更新。建议优先使用 ArkCLI Helper 完成工具配置。 > * ArkCLI Helper 支持 macOS、Linux、Windows 系统。 1. 安装 Ark CLI。 ```Bash # 1. 通过 NPM 安装 npm install -g @volcengine/ark-cli@latest # 2. 验证安装 arkcli --version ``` 2. 登录 Ark CLI。 ```Bash arkcli auth login ``` ![image-20260624-144256-509.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-144256-509.png) 根据界面提示选择登录方式。若之前已登录过 arkcli,会沿用上次选择的配置;如需重新选择,请先执行 `arkcli config reset` 后再运行 `arkcli auth login`。首次登录时,按提示完成以下配置: 1. **选择项目(Project)**:可按需选择,或默认选择**账号全部资源**。 2. **选择消费模式(Type)**:选择 `coding-plan`。 ![image-20260624-163746-727.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-163746-727.png) 3. 运行 ArkCLI Helper,根据界面提示完成 Pi 的配置。 1. 在命令行界面输入 `arkcli helper` 命令,启动 ArkCLI Helper。 2. **选择要配置的 Plan profile**:选择 `coding-plan_cn-beijing_personal (Coding Plan)`。 ![image-20260624-163451-813.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260624-163451-813.png) 3. **选择默认 model**:按需选择。 4. **选择要配置的 AI Agent**:`Pi`。 ![pi-ark-cli.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/pi-ark-cli.png) 完成上述操作后,将自动完成 Pi 的基础配置,无需手动安装。 ## 方式 2:手动配置 1. 关注的配置信息如下: * ``:替换为您自己的 [API Key](https://ark.volcengine.com/region:cn-beijing/apikey)。 * `model`:更新为需要使用的模型信息。 2. 创建并编辑 `~/.pi/agent/models.json` 文件。如目录不存在,先创建后再编辑。 ```JSON { "providers": { "coding-plan": { "api": "openai-completions", "apiKey": "", "baseUrl": "https://ark.cn-beijing.volces.com/api/coding/v3", "models": [ { "id": "ark-code-latest" }, { "contextWindow": 1048576, "id": "doubao-seed-evolving", "input": ["text", "image"], "maxTokens": 256000 }, { "contextWindow": 1048576, "id": "doubao-seed-2.1-pro", "input": ["text", "image"], "maxTokens": 256000 }, { "contextWindow": 1048576, "id": "doubao-seed-2.1-lite", "input": ["text", "image"], "maxTokens": 256000 }, { "contextWindow": 262144, "id": "doubao-seed-2.0-mini", "input": ["text", "image"], "maxTokens": 128000 }, { "contextWindow": 1048576, "id": "glm-5.3", "input": ["text"], "maxTokens": 128000 }, { "contextWindow": 1048576, "id": "glm-5.3-flash", "input": ["text", "image"], "maxTokens": 128000 }, { "contextWindow": 1048576, "id": "deepseek-v4-pro", "input": ["text"], "maxTokens": 393216 }, { "contextWindow": 1048576, "id": "deepseek-v4.1-flash", "input": ["text", "image"], "maxTokens": 393216 }, { "contextWindow": 1049000, "id": "deepseek-v4.1-flash-economy", "input": ["text", "image"], "maxTokens": 393216 }, { "contextWindow": 1048576, "id": "deepseek-v4-flash", "input": ["text"], "maxTokens": 393216 }, { "contextWindow": 1048576, "id": "glm-latest", "input": ["text"], "maxTokens": 128000 }, { "contextWindow": 1048576, "id": "kimi-k2.8-preview", "input": ["text", "image"], "maxTokens": 1048576 }, { "contextWindow": 1048576, "id": "kimi-k3", "input": ["text", "image"], "maxTokens": 65536 } ] } } } ``` > **说明** > > 修改 `models.json` 后无需重启 Pi,在对话中执行 `/model` 会自动重新加载。 # 三、使用 Pi 1. 进入项目目录并启动 Pi: ```Bash pi ``` 2. 在 Pi 交互界面执行 `/model`,可选择切换刚才配置的 provider 和模型。 ![cp-personal-pi-choose-model.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/cp-personal-pi-choose-model.png) 3. 发送任意问题验证连通性,例如: ``` 简单介绍一下当前目录的文件结构。 ``` 若返回内容正常,说明 Coding Plan 已成功接入。 > 更多 Pi 使用教程请参见 [Pi 官方文档](https://pi.dev/docs/latest)。 # 常见问题 * [OpenCode 如何开启深度思考模式?](/docs/coding-plan-personal-faq#1cfacd2b) * [如何升级 Ark Helper?](/docs/coding-plan-personal-faq#7bdd6584) * [如何卸载 Ark Helper?](/docs/coding-plan-personal-faq#e2f455fc) # 错误码 在编程工具中使用 Coding Plan 套餐时可能会遇到报错,您可以根据错误信息查看对应的报错场景并定位问题,具体可参考[错误码](/docs/error-codes)。 --- # OpenViking Source: https://ark.volcengine.com/region:cn-beijing/docs/coding-plan-personal-ai-openviking **OpenViking** 是专为 AI 智能体(Agent)打造的上下文数据库,主要适用于多 Agent 协同、长期记忆管理、复杂任务执行等场景。该数据库采用 `viking:// `文件系统范式,将智能体的**记忆、资源与技能**进行统一组织管理,依托分层加载机制按需供给上下文,在减少 Token 消耗的同时提升运行效率,结合目录式检索优化信息召回效果。功能上,OpenViking 支持**多租户、多用户及多 Agent 隔离**,且能在会话结束后自动沉淀长期记忆,实现智能体能力的持续积累与自我优化,既有效降低开发者的上下文管理成本,也能显著提升 OpenClaw 等智能体的整体运行表现。 方舟 Coding Plan 支持在 OpenViking 中使用,可参考本文进行配置及使用。 > **注意** > > OpenViking 工具处于快速迭代阶段,本文使用的版本为 **0.4.15**,如果实际使用与以下步骤存在差异,可参见 [OpenViking:AI 智能体的上下文数据库](https://github.com/volcengine/OpenViking/blob/main/docs/repository/README_CN.md)。 > **说明** > > 需要先访问 [方舟 Coding Plan活动](https://www.volcengine.com/activity/codingplan),按需订阅套餐后再配置使用工具。 # 核心配置 ## 模型配置 ### VLM 模型 Coding Plan 支持的 VLM 模型及配置方式如下: **选项:配置 Model Name (配置文件指定)** 在工具配置文件中指定 Model Name,可实时切换模型。支持配置的 Model Name: > **注意** > > 配置 Model Name 时,支持使用全小写格式,同时也支持直接复制 [开通管理页面](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=subscribe) 中的模型名称。 * `doubao-seed-2.1-pro` * `doubao-seed-2.1-lite` * `doubao-seed-evolving` * `minimax-m2.7` * `glm-5.3` * `glm-5.3-flash` * `deepseek-v4-flash` * `deepseek-v4-pro` * `kimi-k2.6` * `kimi-k2.8-preview` * `kimi-k3` > **说明** > > Model Name 不支持配置为 `Auto`,如需使用,请通过控制台切换该模式。 **选项:配置 ark-code-latest (控制台管理)** 1. 在配置文件中指定模型为`ark-code-latest`。 2. 通过 [开通管理页面](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=subscribe) 选择或切换目标模型,切换模型后 3-5 分钟即可生效。 支持 Auto 模式,通过「效果 + 速度」双维度智能算法自动选择模型。 ### Embedding 模型 Coding Plan 支持的 Embedding 模型:`doubao-embedding-vision` ## Base URL 使用 Coding Plan 专属 Base URL:`https://ark.cn-beijing.volces.com/api/coding/v3`(兼容 OpenAI 接口协议) > **注意** > > 请使用 Coding Plan 专属 Base URL,否则会产生额外费用。 ## API Key [获取 API Key](https://ark.volcengine.com/region:cn-beijing/apikey) # 一、前提条件 * 已安装 [Python 3.10 或更高版本](https://wiki.python.org/moin/BeginnersGuide/Download)。 * 已安装 [Go 1.22 或更高版本](https://golang.google.cn/dl/)。 * 已安装 C++ 编译器,且 GCC 9+ 或 Clang 11+。 > **说明** > > 通过命令`clang++ --version`和`clang++ -std=c++17 -E -x c++ - < /dev/null`检查 C++编译器支持情况。 > **说明** > > 如果执行 `pip install openviking` 时提示 `No matching distribution found`,请先运行 `python3 --version` 确认 Python 版本不低于 3.10。 # 二、安装 OpenViking 执行以下命令安装 OpenViking。 ```Bash pip install openviking --upgrade --force-reinstall ``` 安装结束后,执行以下命令查看安装结果,若显示版本号则安装成功。 ```Bash openviking --version ``` # 三、配置 OpenViking 1. 创建配置文件`~/.openviking/ov.conf`,配置信息如下。需要修改的配置信息如下: * `storage.workspace`:替换为实际的工作空间路径。 * `embedding`:配置 Embedding 模型,用于向量化和语义检索。 * `embedding.dense.model`:支持的 Embedding 模型 `doubao-embedding-vision`。 * `embedding.dense.api_key`:替换为您自己的 [API Key](https://ark.volcengine.com/region:cn-beijing/apikey)。 * `vlm`:配置 VLM 模型,用于图像和内容理解。 * `vlm.model`:支持的 VLM 模型,具体参见[VLM 模型](/docs/coding-plan-personal-ai-openviking#47a3a76a)。 * `vlm.api_key`:替换为您自己的 [API Key](https://ark.volcengine.com/region:cn-beijing/apikey)。 ```JSON { "storage": { "workspace": "/home/your-name/openviking_workspace" }, "log": { "level": "INFO", "output": "stdout" }, "embedding": { "dense": { "backend": "volcengine", "api_key": "", "model": "doubao-embedding-vision", "api_base": "https://ark.cn-beijing.volces.com/api/coding/v3", "dimension": 1024, "input": "multimodal" } }, "vlm": { "backend": "volcengine", "api_key": "", "model": "doubao-seed-2.1-pro", "api_base": "https://ark.cn-beijing.volces.com/api/coding/v3", "temperature": 0.1, "max_retries": 3 } } ``` 2. 设置服务器配置环境变量。 根据系统环境选择对应的方式设置环境变量。 > **说明** > > 如果配置文件放在其他位置,需要在环境变量中指定对应的文件路径。 **选项:macOS/Linux** 执行以下命令,设置环境变量指向对应的配置文件。 ```Bash export OPENVIKING_CONFIG_FILE=~/.openviking/ov.conf ``` **选项:Windows** 选择以下任一方式,设置环境变量指向对应的配置文件。 * **PowerShell** ```Bash $env:OPENVIKING_CONFIG_FILE = "$HOME/.openviking/ov.conf" ``` * **CMD** ```Bash set "OPENVIKING_CONFIG_FILE=%USERPROFILE%\.openviking\ov.conf" ``` # 四、 开始使用 OpenViking > **说明** > > 需要先在另一个终端执行 `openviking-server` 启动服务,再运行下面的 Python 示例。 1. 创建 Python 文件`example.py`,代码内容如下。 ```Python from openviking_sdk import SyncHTTPClient # Initialize OpenViking HTTP client client = SyncHTTPClient(url="http://localhost:1933", api_key="") try: # Initialize the client client.initialize() # Add resource (supports URL, file, or directory) add_result = client.add_resource( path="https://raw.githubusercontent.com/volcengine/OpenViking/refs/heads/main/README.md" ) root_uri = add_result['root_uri'] # Explore the resource tree structure ls_result = client.ls(root_uri) print(f"Directory structure:\n{ls_result}\n") # Use glob to find markdown files glob_result = client.glob(pattern="**/*.md", uri=root_uri) if glob_result['matches']: content = client.read(glob_result['matches'][0]) print(f"Content preview: {content[:200]}...\n") # Wait for semantic processing to complete print("Wait for semantic processing...") client.wait_processed(timeout=120) # Get abstract and overview of the resource abstract = client.abstract(root_uri) overview = client.overview(root_uri) print(f"Abstract:\n{abstract}\n\nOverview:\n{overview}\n") # Perform semantic search results = client.find("what is openviking", target_uri=root_uri) print("Search results:") for r in results.get("resources", []): print(f" {r['uri']} (score: {r['score']:.4f})") # Close the client client.close() except Exception as e: print(f"Error: {e}") ``` 2. 执行命令 `python example.py`,输出如下内容则说明 OpenViking 已成功运行。 ``` Directory structure: ... Content preview: ... Wait for semantic processing... Abstract: ... Overview: ... Search results: viking://resources/... (score: 0.8523) ... ``` # 其他操作 ## CLI 服务端配置并使用 OpenViking 如果需要将 OpenViking 作为独立的 HTTP 服务运行,然后从任意客户端连接,请参考以下步骤进行配置。 ### 前提条件 已安装并完成配置 OpenViking,具体参见 [安装 OpenViking](/docs/coding-plan-personal-ai-openviking#30f6a2c6)、[配置 OpenViking](/docs/coding-plan-personal-ai-openviking#ceac2da4)。 ### 启动服务 执行以下命令启动服务。 ```Bash openviking-server ``` 启动完成后,在新的命令行界面执行以下命令验证服务启动是否成功,若返回`"status":"ok"`则表示启动成功。 ```Bash curl http://localhost:1933/health ``` ### 使用 CLI 连接 1. 创建 CLI 连接配置文件 `~/.openviking/ovcli.conf`,配置信息如下。其中``需替换为您自己的 [API Key](https://ark.volcengine.com/region:cn-beijing/apikey)。 ```JSON { "url": "http://localhost:1933", "api_key": "", "output": "table" } ``` 2. 在新的命令行界面执行以下 CLI 命令。 ```Bash # Check system health openviking observer system # Add a resource to memory openviking add-resource https://raw.githubusercontent.com/volcengine/OpenViking/refs/heads/main/README.md # List all synchronized resources openviking ls viking://resources # Query openviking find "what is openviking" ``` ### 使用 curl 连接 启动服务后,也可以在命令行界面使用 curl 命令连接 OpenViking。 ```Bash # Add a resource curl -X POST http://localhost:1933/api/v1/resources \ -H "Content-Type: application/json" \ -d '{"path": "https://raw.githubusercontent.com/volcengine/OpenViking/refs/heads/main/README.md"}' # List resources curl "http://localhost:1933/api/v1/fs/ls?uri=viking://resources/" # Semantic search curl -X POST http://localhost:1933/api/v1/search/find \ -H "Content-Type: application/json" \ -d '{"query": "what is openviking"}' ``` ## 在 OpenClaw 配置 OpenViking 记忆功能 通过 OpenViking 为 OpenClaw 提供长效记忆能力,配置完成后,OpenClaw 将自动记住对话中的重要信息,并在回复前回忆相关内容。 ### 前提条件 已完成 OpenClaw 的安装与配置,具体参见 [安装 OpenClaw](/docs/coding-plan-personal-ai-openclaw#b51c87f8)、[配置 OpenClaw](/docs/coding-plan-personal-ai-openclaw#48c0b1ea)。 ### 安装及配置 具体步骤参见 [为 OpenClaw 安装 OpenViking 记忆功能](https://github.com/volcengine/OpenViking/blob/main/examples/openclaw-plugin/INSTALL-ZH.md)。 安装完成后,编辑配置文件`~/.openviking/ov.conf`,使用 Coding Plan 支持的模型。配置信息可参见 [配置工具](/docs/coding-plan-personal-ai-openviking#ceac2da4)。 --- # 其他工具 Source: https://ark.volcengine.com/region:cn-beijing/docs/coding-plan-personal-ai-other-tools 方舟 Coding Plan 已适配 Anthropic、OpenAI 接口协议,可兼容对应工具生态。开发者通过配置 Coding Plan 专用的 Base URL并指定支持模型,可快速接入并使用相关工具。 > **说明** > > 需要先访问 [方舟 Coding Plan活动](https://www.volcengine.com/activity/codingplan),按需订阅套餐后再配置使用编程工具。 # 核心配置 接入工具的核心参数如下: ## **模型配置** 支持以下两种方式配置模型: **选项:配置 Model Name (配置文件指定)** 在工具配置文件中指定 Model Name,可实时切换模型。支持配置的 Model Name: > **注意** > > 配置 Model Name 时,支持使用全小写格式,同时也支持直接复制 [开通管理页面](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=subscribe) 中的模型名称。 * `doubao-seed-evolving` * `doubao-seed-2.1-pro` * `doubao-seed-2.1-lite` * `doubao-seed-2.0-mini` * `glm-5.3` (`glm-latest`) * `glm-5.3-flash` * `deepseek-v4.1-flash` * `deepseek-v4.1-flash-economy` * `deepseek-v4-flash` * `deepseek-v4-pro` * `kimi-k2.8-preview` * `kimi-k3` > **说明** > > Model Name 不支持配置为 `Auto`,如需使用,请通过控制台切换该模式。 **选项:配置 ark-code-latest (控制台管理)** 1. 在配置文件中指定模型为`ark-code-latest`。 2. 通过 [开通管理页面](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=subscribe) 选择或切换目标模型,切换模型后 3-5 分钟即可生效。 支持 Auto 模式,通过「效果 + 速度」双维度智能算法自动选择模型。 ## **Base URL** 不同的工具配置的 Base URL 根据兼容的协议会有不同: * 兼容 Anthropic 接口协议工具:`https://ark.cn-beijing.volces.com/api/coding` * 兼容 OpenAI 接口协议工具:`https://ark.cn-beijing.volces.com/api/coding/v3` > **注意** > > 请勿使用 `https://ark.cn-beijing.volces.com/api/v3` :该 Base URL 不会消耗您的 Coding Plan 额度,而是会产生额外费用。 ## **API Key** [获取 API Key](https://ark.volcengine.com/region:cn-beijing/apikey) # 适用工具 |接口协议 |Base URL |适用工具 | |---|---|---| |兼容 Anthropic 接口协议 |`https://ark.cn-beijing.volces.com/api/coding` |Claude Code | |兼容 OpenAI 接口协议 |`https://ark.cn-beijing.volces.com/api/coding/v3` |OpenCode、OpenClaw、TraeCode、Hermes Agent、Codex CLI、Cline、Cursor、Kilo Code、Roo Code 等 | # 接入Cline ## 安装步骤 打开 VSCode,在扩展市场搜索`Cline`安装。 ## 配置工具 Cline插件安装完成后,您需要配置以下信息。 * **API Provider**:`OpenAI Compatible`(Coding Plan 接口兼容 OpenAI 标准) * **Base URL**:`https://ark.cn-beijing.volces.com/api/coding/v3` * **API Key**:[获取API Key](https://ark.volcengine.com/region:cn-beijing/apikey) * **Model ID**:支持配置`ark-code-latest`、配置 Model Name 两种方式,具体见 [核心配置](/docs/coding-plan-personal-ai-other-tools#61e3b838)。 配置完成后,就可以在输入框中输入需求,与模型进行交互。 # 接入Cursor ## 安装步骤 官网下载安装包:通过 [Cursor官网](https://cursor.com/) 下载并安装Cursor。 ## 配置工具 > **说明** > > 由于 Cursor 的限制,只有订阅了 Cursor Pro 及以上套餐的用户才支持自定义配置模型。 Cursor 安装完成后,Models 模块的具体配置如下: * OpenAI API Key:[获取API Key](https://ark.volcengine.com/region:cn-beijing/apikey) * Override OpenAI Base URL:`https://ark.cn-beijing.volces.com/api/coding/v3` * Add Custom Model:支持配置`ark-code-latest`、配置 Model Name 两种方式,具体见 [核心配置](/docs/coding-plan-personal-ai-other-tools#61e3b838)。 > **注意** > > 在 Cursor 中配置 `minimax-m2.7`、`glm-5.3`、`glm-5.3-flash`、`kimi-k2.8-preview` 模型时若遇到名称冲突问题,建议改用 `minimax-m2-7`、`glm-5-3`、`glm-5-3-flash`、`kimi-k2-8-preview` 配置。 配置完成后,即可在聊天面板中选择配置的模型进行交互。 # 接入Roo Code ## 安装步骤 > **说明** > > 若模型表现异常,建议将插件更新到最新版本(3.43.0 及后续版本)。 打开 VSCode,在扩展市场搜索`Roo Code`进行安装,安装完成后选择信任发布者。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/dd47c5150044469cb4e95b8de067d817~tplv-goo7wpa0wc-image.image) ## 配置工具 安装完成后,配置以下信息。 * **API Provider**:`OpenAI Compatible`(Coding Plan 接口兼容 OpenAI 标准) * **Base URL**:`https://ark.cn-beijing.volces.com/api/coding/v3` * **API Key**:[获取API Key](https://ark.volcengine.com/region:cn-beijing/apikey) * **Model**:支持配置`ark-code-latest`、配置 Model Name 两种方式,具体见 [核心配置](/docs/coding-plan-personal-ai-other-tools#61e3b838)。 配置完成后,就可以在输入框中输入需求,与模型进行交互。 # 接入Kilo Code ## 安装步骤 打开 VSCode,在扩展市场搜索`kilo code`进行安装,安装完成后选择信任发布者。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/3e991c168c0c49bc9449f6f6efc29bd7~tplv-goo7wpa0wc-image.image) ## 配置工具 选择**Settings** - **Providers** - **Custom provider**,然后配置以下信息。 * **Provider ID**:Provider 的唯一标识,按需填写。 * **Display Name**:Provider 的显示名称,按需填写。 * **API Provider**:`OpenAI Compatible`(Coding Plan 接口兼容 OpenAI 标准) * **Base URL**:`https://ark.cn-beijing.volces.com/api/coding/v3` * **API Key**:[获取API Key](https://ark.volcengine.com/region:cn-beijing/apikey) * **Model ID**:即要配置的模型名称,如 `ark-code-latest`。支持的模型见 [核心配置](/docs/coding-plan-personal-ai-other-tools#61e3b838)。 * **Model Name**:模型的显示名称,按需填写。 > **注意** > > Kilo Code 客户端 UI 迭代较为频繁,字段名称、顺序或数量可能随版本变化,本文内容以近期版本为准,仅供参考。若与您本地界面存在差异,请以客户端实际提示为准。 配置完成后,就可以在输入框中输入需求,与模型进行交互。 # 错误码 在编程工具中使用 Coding Plan 套餐时可能会遇到报错,您可以根据错误信息查看对应的报错场景并定位问题,具体可参考[错误码](/docs/error-codes)。 --- # ArkClaw Source: https://ark.volcengine.com/region:cn-beijing/docs/coding-plan-personal-benefits-arkclaw ArkClaw 是火山引擎提供的云端 AI 智能体(Agent)服务,能帮助您**一键云端部署** OpenClaw,**享有一对一专属 ECS 资源**,免去复杂配置、7 × 24 在线,让您零门槛使用 OpenClaw,还能无缝使用您订阅的火山方舟 Coding Plan,告别 Token 按量计费焦虑。 # 用户权益 * 已订阅方舟 **Coding Plan Pro 套餐** 的历史用户:可畅享 ArkClaw 提供的服务。**Coding Plan Pro** 到期时,您创建的 ArkClaw 将被删除,其中的数据将为您**保留 24 小时**。(自 2026.05.18 12:00 起,Coding Plan Pro 套餐赠送 ArkClaw 活动已下线,新订阅用户不再赠送该权益。) > **说明** > > * 自2026.05.18 12:00起,**Coding Plan Pro 套餐赠送 ArkClaw 正式下线**,具体规则参见 [Coding Plan Pro 套餐赠送 ArkClaw 活动下线公告](https://www.volcengine.com/uwirt3wt/csk1dowx)。 > * 自2026.03.24起,**Coding Plan Lite 套餐**新购用户不再赠送 ArkClaw 的7日免费体验。 > * 体验中心提供的 ArkClaw 服务要求一个主账号只能开通一个 ArkClaw,主账号下的子账号会共享数据记录。 # 步骤一:订阅方舟 Coding Plan 访问 [方舟 Coding Plan 活动](https://www.volcengine.com/activity/codingplan),单击“**立即订阅**”完成订阅操作。套餐介绍请参见[套餐概览](/docs/coding-plan-personal-plan-overview)。 # 步骤二:创建并使用 ArkClaw 1. 登录火山方舟 [体验中心](https://ark.volcengine.com/region:cn-beijing/experience)。 2. 在左侧目录选择“Agent > ArkClaw”。 3. 单击“**立即开始**”按钮,提交创建申请。 > **注意** > > 使用子账号创建 ArkClaw 前,需先联系账号管理员为子账号添加权限`iam:CreateRole`、`iam:GetRole`、`iam:AttachRolePolicy`、`iam:ListAttachedRolePolicies`,权限配置完成后再单击**立即开始**创建 ArkClaw。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/b46662dce31b44e5b647c77d858ff588~tplv-goo7wpa0wc-image.image) 4. 待创建成功后,即可在方舟中与 ArkClaw 进行对话。 > **注意** > > 根据 [使用技巧](https://docs.volcengine.com/docs/6396/2227963?lang=zh#NxLmzbFS),对 ArkClaw 进行个性化配置与管理,如配置消息渠道、切换使用的模型、定义人格等。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/2166df72094d42d29dfb7fc4fb57639a~tplv-goo7wpa0wc-image.image) # 使用技巧 * [查看并配置技能](https://docs.volcengine.com/docs/6396/2227963?lang=zh#2QJXIw3g):支持查看、安装技能。 * [查看并配置定时任务](https://docs.volcengine.com/docs/6396/2227963?lang=zh#HHUCeQh0):不仅支持实时解答问题,还支持完成设置的定时任务,主动发送提醒。 * [配置消息渠道](https://docs.volcengine.com/docs/6396/2227963?lang=zh#PjW6wboh):支持与您的 IM 工具(例如飞书机器人、钉钉机器人)进行快捷集成。 * [配置人格](https://docs.volcengine.com/docs/6396/2227963?lang=zh#TmVCi78i):可以为 ArkClaw 定义人格,将其塑造为一个“有灵魂”的AI助手。 * [使用文件快传功能上传/下载文件](https://docs.volcengine.com/docs/6396/2227963?lang=zh#o53PyVqP):将 [对象存储(TOS)](https://www.volcengine.com/docs/6349) 服务的TOS桶作为网盘,实现本地与云端的文件快速上传/下载操作。 * [管理 ArkClaw](https://docs.volcengine.com/docs/6396/2227963?lang=zh#X38eyGyB):支持调整推理模型、重启、初始化 ArkClaw 服务等。 # 服务规则 [ArkClaw 服务规则](/docs/arkclaw-service-rules) --- # 记忆增强-Embedding模型 Source: https://ark.volcengine.com/region:cn-beijing/docs/coding-plan-personal-embedding-memory 方舟 Coding Plan 提供 Embedding 模型,可以为工具提供语义向量能力,将对话、文档与任务信息等转换为高维向量表示,实现基于语义相似度的高效检索。 相比传统关键词匹配,Embedding 检索在信息量大、对话长、资料分散的场景下,能够更准确地召回相关内容,显著降低遗漏与误判。同时,Embedding 为记忆检索、知识库问答与工具调用提供统一的语义检索层,帮助工具在不增加主模型推理成本的前提下,提升跨轮次上下文追踪能力与整体效果。 # 核心配置 在 Coding Plan 中使用 Embedding 模型时,需要的核心配置如下: * 支持的 Embedding 模型:`doubao-embedding-vision`(对应模型 [doubao-embedding-vision-251215](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-embedding-vision)) > **注意** > > 建议固定使用同一版本的 Embedding 模型,请勿混用不同版本。 * 专属 Base URL:`https://ark.cn-beijing.volces.com/api/coding/v3` (兼容 OpenAI 接口协议) * API Key:[获取 API Key](https://ark.volcengine.com/region:cn-beijing/apikey) # 配置 Embedding 模型 > **注意** > > Embedding 模型与其他模型一致,均会消耗套餐额度,按模型调用次数进行估算。 ## OpenClaw OpenClaw 支持配置 Embedding 模型,解决大模型原生记忆有限、易产生幻觉、无法适配私有数据的问题,从而提升模型在处理复杂任务时的准确性和可靠性。 1. 前提条件:已完成 OpenClaw 的安装与配置,步骤参见 [安装和配置 OpenClaw](/docs/coding-plan-personal-ai-openclaw#b51c87f8)。 2. 选择以下任一方式配置 Embedding 模型。 **选项:Web UI 方式** 1. 执行以下命令打开 Web UI。 ```Bash openclaw dashboard ``` 2. 在左侧菜单栏选择**配置** - **All Settings** - **Raw**,在`agents.defaults`节点下增加 `memorySearch`相关配置信息,增加的配置信息如下。其中需要将``替换为您自己的 [API Key](https://ark.volcengine.com/region:cn-beijing/apikey)。 ```JSON { ... "agents": { "defaults": { ... "memorySearch": { "provider": "openai", "model": "doubao-embedding-vision", "remote": { "baseUrl": "https://ark.cn-beijing.volces.com/api/coding/v3", "apiKey": "" } } ... } } ... } ``` 3. 配置完成后,先单击右上角 **Save** 保存,保存完成后单击 **Update** 更新配置。 **选项:终端方式** 1. 在终端执行以下命令打开 OpenClaw 配置文件。 ```Bash nano ~/.openclaw/openclaw.json ``` 2. 在`agents.defaults`节点下增加 `memorySearch`相关配置信息,增加的配置信息如下。其中需要将``替换为您自己的 [API Key](https://ark.volcengine.com/region:cn-beijing/apikey)。 ```JSON { ... "agents": { "defaults": { ... "memorySearch": { "provider": "openai", "model": "doubao-embedding-vision", "remote": { "baseUrl": "https://ark.cn-beijing.volces.com/api/coding/v3", "apiKey": "" } } ... } } ... } ``` 3. 配置完成后,重启网关使配置生效。 ```Bash openclaw gateway restart ``` ## OpenViking OpenViking 是专为 AI 智能体设计的开源上下文数据库,支持多模态 Embedding 模型的集成与接入,实现非结构化数据的向量化转换,并提供高效的语义相似度检索能力。 1. 前提条件:已完成 OpenViking 的安装与基础配置,步骤参见 [OpenViking](/docs/coding-plan-personal-ai-openviking)。 2. 在配置文件 `~/.openviking/ov.conf`中新增`embedding`相关配置。其中需要将``替换为您自己的 [API Key](https://ark.volcengine.com/region:cn-beijing/apikey)。 ```JSON { ... "embedding": { "dense": { "api_base" : "https://ark.cn-beijing.volces.com/api/coding/v3", "api_key" : "", "provider" : "volcengine", "dimension": 1024, "model" : "doubao-embedding-vision" }, "max_concurrent": 10 } ... } ``` --- # Ark CLI:Coding Plan 个人版使用指南 Source: https://ark.volcengine.com/region:cn-beijing/docs/coding-plan-personal-ark-cli Ark CLI 是火山方舟平台官方命令行工具,可在本地终端快捷配置与管理 Coding Plan 个人版的套餐和模型。 # 一、安装和登录 ArkCLI **环境要求:** Node.js >= 16 **选项:手动安装并登录** ## 安装 Ark CLI 在终端执行以下命令: ```Bash # 1. 通过 NPM 安装(下载最新版本) npm install -g @volcengine/ark-cli@latest # 2. 验证安装 arkcli --version ``` ## 登录 Ark CLI ```Bash # 登录方式 arkcli auth login # 查看登录状态 arkcli auth status ``` **选项:通过 AI Agent 安装并登录** 将下方提示词复制给 AI Agent(Claude Code、Codex、Cursor、Trae 等),它会自动完成安装。 ```Plain 根据下面命令帮我安装 Ark CLI:https://lf3-static.bytednsdoc.com/obj/eden-cn/psjryh/ljhwZthlaukjlkulzlp/intro/volc.md ``` # 二、配置 Coding Plan > 目前支持 Claude Code、Codex、OpenCode、OpenClaw、Trae 等主流工具,更多 Agent 陆续支持中。 在终端中输入命令 `arkcli helper`,根据 TUI 交互引导配置套餐、模型。 现以Coding plan个人版配置Claude Code为例: ![](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/cp-personal.gif) # 三、使用 ArkCLI ## 能力概览 ArkCLI 支持 Coding Plan 相关命令,覆盖**交易、配置、用量**三大范围,更多能力见 [ArkCLI 指南](/docs/ark-cli)。 - 交易:新购、续费、查询账号下套餐状态 - 配置:配置模型、查询套餐支持模型、查询配置状态 - 用量:余额查询、用量查询 ## 交易 **选项:通过 Agent 调用** | 功能 | 示例提示词 | | --- | --- | | 新购套餐 | "我想买一个 Coding Plan 个人版 Pro,帮我下单" | | 续费套餐 | "帮我续费一个月 Coding Plan" | | 查询账号下套餐状态 | "我都订阅了哪些 Plan?是什么规格?" | **选项:通过终端调用** - 新购套餐: ```Bash # arkcli plans buy --plan <套餐名> --type <规格> [--duration <月数>] [--yes] # 参数说明: # 套餐名:coding-plan # 规格:lite/pro # 月数:1-12 月,例如:1,若不传该参数,默认 1 个月 # --yes:真实下单确认,若没有 --yes 仅返回订单预览与协议,建议先不加 --yes,预览订单 # 示例命令: # 预览:只返回协议链接 arkcli plans buy --plan coding-plan --type pro --duration 1 # 真实下单 arkcli plans buy --plan coding-plan --type pro --duration 1 --yes ``` - 续费: ```Bash # arkcli plans renew --plan <套餐名> [--duration <月数>] [--yes] # 参数说明: # 套餐名:coding-plan # 月数:1-12 月,例如:1,若不传该参数,默认 1 个月 # --yes:真实下单确认,若没有 --yes 仅返回订单预览与协议,建议先不加 --yes,预览订单 # 示例命令: # 预览:只返回协议链接 arkcli plans renew --plan coding-plan --duration 1 # 真实下单 arkcli plans renew --plan coding-plan --duration 1 --yes ``` - 查询账号下套餐状态: ```Bash arkcli plans get ``` ## 配置 | 功能 | 示例提示词 | | --- | --- | | 查询套餐支持的模型 | "Coding Plan Pro 支持哪些模型?" | ## 用量 | 功能 | 示例提示词 | | --- | --- | | 余额查询 | "我这个月 Coding Plan 还剩多少额度?" | | 用量查询 | "我五小时额度还剩多少?" | | Model 用量查询 | "我本周 doubao-seed-2.1-lite 用了多少额度?" | --- # 常见问题 Source: https://ark.volcengine.com/region:cn-beijing/docs/coding-plan-personal-faq ## 关于接入 AI 编程工具 ### Claude Code 如何开启深度思考模式? 1. 编辑 Claude Code 的配置文件`~/.claude/settings.json`,在`env`中新增`"CLAUDE_CODE_EXTRA_BODY": "{\"thinking\":{\"type\":\"enabled\"}}"`。 2. 配置完成后执行命令`claude`重新启动。 ### OpenCode 如何开启深度思考模式? 1. 编辑 OpenCode 的配置文件`~/.config/opencode/opencode.json`,在``模型配置中新增`options`配置,内容为` {"thinking": {"type": "enabled"}}`。参考示例如下: ```JSON { "$schema": "https://opencode.ai/config.json", "provider": { "volcengine-plan": { "npm": "@ai-sdk/openai-compatible", "name": "volcengine", "options": { "baseURL": "https://ark.cn-beijing.volces.com/api/coding/v3", "apiKey": "" }, "models": { "": { "name": "", "options": { "thinking": { "type": "enabled" } } } } } } } ``` 2. 配置完成后执行命令`opencode`重新启动。如果在对话时仍看不到`Thinking`信息,可以在输入框按`ctrl+p`,搜索`think`,选中`Show thinking`,则可以查看思考的信息。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/beb557544bfe466bbc41b242c8ecf7cb~tplv-goo7wpa0wc-image.image) ### OpenClaw 如何开启深度思考模式? OpenClaw 支持以下几种方式开启深度思考模式: > **说明** > > OpenClaw 支持设置的深度思考 level:off、minimal、low、medium、high、xhigh。具体参见 [Thinking Levels](https://docs.openclaw.ai/tools/thinking#thinking-levels)。 1. 在当前消息临时开启深度思考模式 在消息前面添加内联指令:`/think:` 或`/t `,示例如下: ```Bash /think:high 你的问题 # 或者使用简写模式 /t high 你的问题 ``` 2. 在会话级别开启深度思考模式 单独发送一条指令消息:`/think:` 或`/t `,示例如下: ```Bash /think:high # 或者使用简写模式 /t high ``` 3. 全局配置开启深度思考模式 使用 config 命令修改全局配置:`openclaw config set agents.defaults.thinkingDefault `,示例如下: ```Bash openclaw config set agents.defaults.thinkingDefault high # 重启 gateway 才能生效 openclaw gateway restart # 查看配置是否生效 openclaw config get agents.defaults.thinkingDefault ``` ### 使用 OpenClaw 时,出现不支持 developer role 的报错,如何解决? **问题描述** 在 OpenClaw Chat 中发送消息后没有响应,错误信息如下: ```SQL HTTP 400: The parameter messages.role specified in the request are not valid: invalid value: developer, supported values are: system, assistant, user, tool. ``` **问题原因** API 兼容性问题:方舟 API 不支持 **developer** role(OpenAI 新版 API 格式)。 **解决方案** 1. 在 **model** 对象内部添加 **compat** 兼容性配置 `"compat": { "supportsDeveloperRole": false }`,示例如下: > **说明** > > **compat** 配置必须放在 model 级别,不能放在 provider 级别,否则会报 `Unrecognized key: "compat"`错误。 ```JSON { "models": { "providers": { "volcengine-plan": { "baseUrl": "https://ark.cn-beijing.volces.com/api/coding/v3", "apiKey": "", "api": "openai-completions", "models": [ { "id": "", "name": "", "reasoning": true, "input": ["text"], "cost": { "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0 }, "contextWindow": 200000, "maxTokens": 8192, "compat": { "supportsDeveloperRole": false } } ] } } }, "agents": { "defaults": { "model": { "primary": "volcengine-plan/" } } } } ``` 2. 配置修改完成后,执行以下命令重启 gateway。 ```Bash pkill -f openclaw openclaw gateway restart ``` ### 在 OpenClaw 中无法识别图片,如何处理? 1. 确认模型支持图片输入。 检查配置文件 `~/.openclaw/openclaw.json` 中的模型`input`字段是否包含 `image` 输入类型。以模型 doubao-seed-2.1-lite 为例,配置信息如下: ```JSON "models": { "providers": { "volcengine-plan": { "models": [ { "id": "doubao-seed-2.1-lite", "name": "doubao-seed-2.1-lite", "input": ["text", "image"], ... } ] } } } ``` 2. 配置 Image Model,并检查模型别名配置。 在 `agents.defaults.imageModel` 中显式设置用于图片识别的模型,确保 `agents.defaults.models` 中包含正确的模型别名。 ```JSON "agents": { "defaults": { "imageModel": { "primary": "volcengine-plan/doubao-seed-2.1-lite" }, "models": { "volcengine-plan/doubao-seed-2.1-lite": { "alias": "volcengine" } }, ... } } ``` 3. 重启 Gateway 使配置生效,然后即可在 OpenClaw 中识别图片。 ```Bash openclaw gateway restart ``` ### 安装 OpenClaw 时报错 “gateway connect failed: Error: pairing required”,如何处理? 执行以下命令删除设备和身份,然后重新安装网关并重启解决该问题。 ```Bash rm -rf ~/.openclaw/devices rm -rf ~/.openclaw/identity openclaw gateway install --force openclaw gateway start ``` ### 配置 OpenClaw 时报错 “run error: 404 The model or endpoint xxx does not exist or you do not have access to it”,如何处理? 1. 请检查以下两个配置文件中的`baseurl`等信息是否一致。 * `~/.openclaw/openclaw.json`:全局配置 * `~/.openclaw/agents/main/agent/models.json`:单个 Agent 本地模型配置,优先级高,会覆盖全局配置。 2. 两个配置文件不一致时,需先删除`~/.openclaw/agents/main/agent/models.json`。 3. 根据 OpenClaw 配置文档配置`~/.openclaw/openclaw.json`,配置完成后保存文件并执行命令重启服务。 ```Bash openclaw gateway restart ``` ## 关于飞书插件的使用 ### 如何升级飞书插件版本? 1. 执行`openclaw -v`命令查看已安装的 OpenClaw 的版本,新版插件对 OpenClaw 的版本要求如下。若低于该版本,插件运行可能出现异常,可执行 `npm install -g openclaw` 命令升级。 * **Linux**/**macOS:2026.2.26** 及以上 * **Windows:2026.3.2** 及以上 2. 执行以下命令升级飞书官方插件到最新版本。 ```Bash npx -y @larksuite/openclaw-lark-tools update ``` 若执行该命令行出错,可在命令行前 增加 `sudo` 重新执行。 ### 在使用飞书插件时遇到问题,如何操作? 1. 通过在飞书机器人对话框中输入以下内容排查问题并解决。 1. `/feishu start`:确认是否安装成功。 2. `/feishu doctor`:检查配置是否正常。 3. `/feishu auth`:批量完成用户授权。 4. 插件中内置了常见问题的解决方案,可在对话框中直接输入问题获取解答。 2. 在终端执行以下命令进行修复。 ```Bash # 查看问题,自主修复 npx @larksuite/openclaw-lark-tools doctor # 自动修复 npx @larksuite/openclaw-lark-tools doctor --fix ``` 3. 在终端执行以下命令获取信息,在飞书群里反馈解答。 ```Bash # 执行以下命令,查看版本信息,辅助排查 npx @larksuite/openclaw-lark-tools info # 执行以下命令,查看详细配置信息 npx @larksuite/openclaw-lark-tools info --all ``` ### 如何配置飞书机器人,使其具备流式输出、耗时显示及状态展示能力? 1. 执行以下命令对飞书机器人进行配置。 * 开启流式输出 ```Bash openclaw config set channels.feishu.streaming true ``` * 关闭流式输出 ```Bash openclaw config set channels.feishu.streaming false ``` * 开启耗时 ```Bash openclaw config set channels.feishu.footer.elapsed true ``` * 开启状态展示 ```Bash openclaw config set channels.feishu.footer.status true ``` 2. 配置完成后,需要执行以下命令重启服务。 ```Bash openclaw gateway stop openclaw gateway run ``` ### 如何修改飞书机器人在群内的回复方式? 目前插件在群内默认的方式为:只有@机器人才会回复。 * 模式1:只有@机器人才回复。 在终端执行以下命令配置飞书机器人,配置完成后重启服务。 ```Bash # 设置需要 @ 才回复 openclaw config set channels.feishu.requireMention true --json ``` 完整的配置示例如下: ```JSON {"channels": {"feishu": {"enabled": true,"appId": "你的AppID(登录飞书开放平台,进入应用详情的凭证与基础信息获取)","appSecret": "你的AppSecret(登录飞书开放平台,进入应用详情的凭证与基础信息获取)","requireMention": true,"groupPolicy": "open"}}} ``` * 模式2:不用@机器人,所有消息都回复。 > **说明** > > 这个模式在大群里容易刷屏,请谨慎使用! 1. 在 [飞书开放平台](https://open.feishu.cn/app?lang=zh-CN),单击创建的飞书开放应用。 2. 在左侧菜单中选择”开发配置 > 权限管理“,单击”开通权限“按钮,添加权限”获取群组中所有消息(敏感权限)“,然后单击”确认开通权限“。 3. 重新发布应用。 4. 在终端执行以下命令配置飞书机器人,配置完成后重启服务。 ```Bash # 设置不需要 @ 也回复 openclaw config set channels.feishu.requireMention false --json ``` 其中完整的配置示例如下: ```JSON {"channels": {"feishu": {"enabled": true,"appId": "你的AppID","appSecret": "你的AppSecret","requireMention": false,"groupPolicy": "open"}}} ``` * 模式3:只有指定群@机器人才回复,适合不同群不同规则。 1. 获取群 ID。 * 在飞书群设置页面中获取群 ID。 * 在飞书群让机器人回复群 ID。 2. 配置指定群回复消息规则,配置完成后重启服务。 ```Bash # 1. 设置默认所有群都不需要 @ openclaw config set channels.feishu.requireMention false --json # 2. 给特定群设置需要 @(这里群ID只是示例,需要替换成真实的群ID) openclaw config set channels.feishu.groups.oc_xxxxxxxx.requireMention true --json ``` ## 关于 Ark Helper 的使用 ### 如何升级 Ark Helper? 重新执行以下命令就可以升级到 Ark Helper 最新版本。 ```Bash curl -fsSL https://lf3-static.bytednsdoc.com/obj/eden-cn/ylwslo-yrh/ljhwZthlaukjlkulzlp/install.sh | sh ``` ### 如何卸载 Ark Helper? 执行以下命令可以卸载 Ark Helper。 ```Bash npm uninstall -g @byted-aml/ark-helper ``` ## 关于方舟 Coding Plan 的使用 ### 套餐的用量额度限制是多少? > **注意** > > 方舟已推出 Agent Plan 套餐,新增支持全模态模型及专属 Harness,采用精细化 AFP 抵扣规则,用量清晰可查。如需使用,请前往 [方舟 Agent Plan 活动](https://ai.volcengine.com/activity/agentplan?_vtm_=a441938.b656048.0_0.0_0.0.2709_7612576610202109478) 订阅套餐。 方舟 Coding Plan 提供 2 种订阅套餐,满足不同开发场景的需求。 资源消耗因请求上下文长度和模型差异巨大,实际可用次数会因此有较大波动。**基于 Doubao Seed 2.0 Lite 模型 在 Claude Code 未开启 Agent Team 模式下**,**套餐的预估用量可参考下表**。 |套餐 |适用场景 |用量限制 | |---|---|---| |Lite 套餐 |中等强度的开发任务,适合大多数开发者。 |* 每 5 小时:最多约 1,200 次请求。 | \ | | |* 每周:最多约 9,000 次请求。 | \ | | |* 每订阅月:最多约 18,000 次请求。 | |Pro 套餐 |复杂项目开发,适合高强度工作的开发者。 |> Lite 套餐的 5 倍用量。 | \ | | | | \ | | |* 每 5 小时:最多约 6,000 次请求。 | \ | | |* 每周:最多约 45,000 次请求。 | \ | | |* 每订阅月:最多约 90,000 次请求。 | 注意:实际用量会因开发任务复杂度、代码库大小及 Coding 工具的使用方式等因素有所不同。 ### 如何查看 Coding Plan 套餐的用量? 您可以在控制台的 [Coding Plan 管理页面](https://ark.volcengine.com/region:cn-beijing/openManagement?&advancedActiveKey=subscribe) 上查看套餐的用量统计数据和剩余额度。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/a9dbd626ff7543698ddfd20a33a73b1f~tplv-goo7wpa0wc-image.image) ### 套餐额度耗尽后是否会继续消耗其他资源包或账户余额? 不会,套餐额度在时间周期内耗尽后,您需要等待下一个周期自动恢复额度,不会消耗其他资源包或账户余额。 * 每 5 小时限额:根据首次请求发生时间,以 5 小时为周期定时刷新限额。 * 周限额:每周一 00:00:00 刷新。 * 月限额:每订阅月第1日 00:00:00 刷新。 ### 购买 Coding Plan 后,是否需要到火山方舟控制台单独开通模型,并创建推理接入点? 不需要,Coding Plan 购买即开通,您成功订阅套餐后,相应的能力即已开通,无需任何额外的模型开通、Endpoint创建等复杂配置。关于如何在您熟悉的编程工具(如Claude Code、Cursor等)开始使用,请参阅 [接入AI编程工具](/docs/coding-plan-personal-ai-claude-code)。 ### 支持使用哪些模型? 支持使用的模型以控制台实际展示为准,完整列表参见:[支持的模型](/docs/coding-plan-personal-plan-overview#51b87c17)。 ### Coding Plan 支持哪些编程工具? Coding Plan支持多款主流编程工具,如Claude Code、Cursor、Cline(VSCode)、Kilo Code、Roo Code、OpenCode、TraeCode 等编程工具。 ### Coding Plan 套餐如何接入编程工具? 需要使用 Coding Plan 专用 API Base URL 接入,接入步骤可参考接入AI编程工具。 * 配置 Base URL(如Claude Code):https://ark.cn-beijing.volces.com/api/coding * 兼容OpenAI API工具Base URL(如Cline、Cursor、OpenCode):https://ark.cn-beijing.volces.com/api/coding/v3 注意:套餐额度仅在支持的 Coding 工具中生效,不能用于 API 调用,API 调用需要按照方舟现有计费规则进行收费。 ### **我可以同时在多个工具中使用我的套餐吗?** 可以,您可以在所有支持的工具中使用同一套餐,但额度是共享的,所有工具的使用会消耗同一套餐额度。 ### 套餐是否支持团队使用? 目前方舟 Coding Plan 主要面向个人开发者。团队协作使用,请使用方舟模型 API 按量付费方式接入。 ### 套餐是否仅可用于AI工具中的调用? 是的,在非 AI 工具中使用方舟 Coding Plan / Agent Plan 权益对应的 Base URL 和 API Key 有可能被识别为滥用/违规,会导致订阅停用或账号封禁。 ## 关于方舟 Coding Plan 的订阅 ### **如何升级我的套餐?** 您可以通过访问 [方舟 Coding Plan 活动](https://www.volcengine.com/activity/codingplan) 或 [方舟控制台-开通管理](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=subscribe) 进行套餐升级操作。升级后立即生效。 ### 订阅套餐后可以退款吗? * 支持**非七天无理由退订**:会退订已购买的订单,退订说明及退款计算公式可详见 [非七天无理由退订说明](https://docs.volcengine.com/docs/6269/81013?lang=zh#.5pSv5oyB6Z2e5LiD5aSp5peg55CG55Sx6YCA5qy-5Lqn5ZOB)。 * 支持**退订未生效续费订单**:退订通过点击续费购买且未生效的订单,不会退订当前生效中的订单。例如,首次购买的订单包含5个月时长,但不是续费订单,所以无法通过退订未生效续费订单的方式退订。 **操作步骤**如下: 1. 进入火山引擎 [费用中心-退订管理](https://console.volcengine.com/finance/unsubscribe)。 2. 支持非七天无理由退订、退订未生效续费订单,具体如下: * **非七天无理由退订**:在**退订资源**页签,单击**非七天无理由退订**,在**产品**列过滤**字节跳动大模型服务(豆包大模型)**,在配置列找到要退订的 Coding Plan 套餐,在对应操作列单击**退订**,根据界面提示完成套餐退订。 ![image-20260923-154049-861.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260923-154049-861.png) * **退订未生效续费订单**:在**退订未生效续费周期**页签,找到商品名称为**字节跳动大模型服务(豆包大模型)** 的待生效的续费订单,在操作列单击**退订**,根据界面提示完成退订。 ![image-20260923-154307-087.png](https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/image-20260923-154307-087.png) ### 如何续费我的套餐? 强烈建议您在订阅时开启自动续费,避免后续影响使用。若您在订阅时,没有开启自动续费,可跳转至 [方舟控制台-开通管理](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=subscribe),点击套餐对应的**续费**按钮,进行续费操作。 ### 如何取消自动续费? 您可以在 [方舟控制台-开通管理](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=subscribe) 取消自动续费。请务必在下一个扣费日至少 7 天前取消,避免自动续费。取消自动续费后,当前周期继续有效,但到期后会不再续费。 ## 关于新用户特惠活动 ### 一个用户只能享受一次 Coding Plan套餐优惠? 是的,一个用户仅能享受一次优惠价格,再次购买及续订都无法享受该优惠。 ### 订阅Coding Plan套餐,享受优惠有什么限制? 一个认证主体只能享受一次套餐优惠。如果该认证主体下有多个账号,则只有首次购买的账号能享受该优惠。 ### 我购买时为什么没有优惠? 如果您没有享受首购优惠,需要您确认:当前账号的认证主体是否有其他账号已经购买过Coding Plan套餐。 ## 关于限时邀请活动 ### 如何成功建立邀请关系? 当您的好友(被邀请人)首次点击您的专属邀请链接或通过您的邀请码完成登录/注册时,邀请关系即永久绑定。此关系以系统首次记录为准。 ### 一个用户可以同时是“邀请人”和“被邀请人”吗? 一旦您创建邀请码,即成为“邀请人”,将无法再作为“被邀请人”享受首单折扣,但“被邀请人”可以作为新的“邀请人”邀请其他人。 ### 代金券可以用于支付“自动续费”的账单吗? 可以,只要代金券在有效期内,系统在自动续费扣款时,可以使用代金券进行抵扣。 ### 我如何查看我成功邀请的好友与获得的代金券? 您可以在 [我的邀请](https://www.volcengine.com/activity/invitations) 页面,查看当前邀请成功的好友与代金券,此外,您还可以在 [费用中心-代金券](https://console.volcengine.com/finance/coupon) 查看代金券。 ### 邀请奖励的代金券可以怎么用?有效期多久? 为鼓励开发者探索 AI 的无限可能,您的邀请奖励代金券除了能用于订阅 Coding Plan 外,还能用于抵扣豆包大模型商品的后付费 API 调用费用,具体适用模型以代金券使用规则为准。自发放之日起有效期为 90天,逾期自动作废。 ### 为什么我邀请好友下单后,奖励的代金券金额低于订单金额的10%? 因为您的奖励是基于好友的 “实际支付金额” 计算的,而非订单原价。实际支付金额”指好友支付的真实现金部分。举例,您邀请好友订阅方舟 Coding Plan,好友订阅了Lite月套餐,好友实际支付了9.9元 × 90% = 8.9元,您将获得 8.9元 × 10% = 0.89元 面值的代金券。 --- # 限时邀请活动 Source: https://ark.volcengine.com/region:cn-beijing/docs/coding-plan-personal-limited-time-invitation-event 方舟 Coding Plan 是为开发者打造的 AI 编程订阅套餐,[点击前往活动](https://www.volcengine.com/activity/codingplan)。 * **模型与工具自选**:支持在 Claude Code、OpenCode、Cursor 等主流编程工具中,选用 Doubao Seed Code、Doubao Seed 2.0 系列、GLM 系列、MiniMax 系列、Kimi系列、DeepSeek 系列、Doubao Embedding Vision 等模型,也可开启 Auto 模式,根据场景选择最优模型。 * **限时邀请有礼**:邀请好友成功订阅,好友可享 9.5 折优惠;您也可获得 5% 的代金券奖励,上不封顶。[点击邀请好友](https://www.volcengine.com/activity/codingplan)。 本活动中,邀请人可获得代金券奖励,奖励上不封顶,被邀请人将获得首单限时叠加优惠奖励。本文为您详细介绍**限时邀请活动**。 ## 活动时间 2026.05.19 - 2026.11.19 ## 活动入口 [单击前往活动](https://www.volcengine.com/activity/codingplan),立即邀请。 ## 邀请者福利 邀请人成功邀请好友(即“受邀用户”)完成首单有效支付后,可获得代金券奖励: 1. 奖励计算: * 每成功邀请 1 名有效好友,邀请人即可获得该好友首单实际支付金额的 5% 作为代金券奖励。 * 邀请人数无上限,奖励多邀多得。 2. 实际支付金额定义:指被邀请人首单订阅时,最终实际支付的现金金额。 3. 代金券使用规则: * 性质:代金券是平台提供的优惠权益,不可提现、转让或找零。 * 抵扣范围:方舟 Coding Plan Pro 套餐与方舟 Coding Plan Lite 套餐。 * 有效期:发放即日起至2027.5.19,逾期自动作废。 ## 被邀请者福利 受邀用户通过有效的邀请链接或邀请码完成方舟 Coding Plan 任意套餐的首次订阅时,可享受首次订阅订单应付金额 9.5 折的叠加优惠。 1. 适用对象与条件:受邀用户从未购买过任何方舟 Coding Plan 套餐。一旦用户创建邀请码,即成为“邀请人”,将无法再作为“被邀请人”享受首单折扣,但“被邀请人”可以作为新的“邀请人”邀请其他人。每个用户仅可以以受邀用户身份享受一次 9.5 折叠加优惠。 2. 强烈建议:9.5 折叠加优惠适用于整个首单订单。因此,一次性订阅多月套餐,相比订阅单月并自动续费更为划算。 ## 邀请关系的绑定 1. 邀请好友:点击活动页上的邀请好友按钮,即可生成专属邀请链接与邀请码。当好友点击您的专属链接或通过邀请码完成登录(或注册)时,双方邀请关系即绑定。 2. 获取奖励:被邀请人须在本活动有效期内完成首单支付,方可计为一次有效邀请,作为计算邀请奖励的依据。 3. 注意:此绑定关系以首次绑定为准,作为后续计算邀请奖励的唯一依据。 ## 特别说明 1. 邀请关系以受邀用户点击专属链接或填写邀请码完成登录(或注册)为准,系统记录为唯一凭证。平台将综合账号、设备、支付等信息判定用户身份合理性。任何作弊行为(如批量注册、虚假支付等)将导致所有相关奖励无效。 2. 平台可根据运营情况调整或终止本活动,并于页面公告。在法律允许范围内,本规则的最终解释权归平台所有。 3. 若活动终止,对于活动终止前已建立的邀请关系,被邀请人需在活动公告的终止日期前完成支付方可生效,对于已发放至用户账户的代金券,其相关权益将予以保障。 --- # Coding Plan Lite & Pro 套餐 2.5 折普惠活动 Source: https://ark.volcengine.com/region:cn-beijing/docs/coding-plan-personal-universal-promotion 2026年6月8日至2026年11月8日活动期间内,所有用户购买 Coding Plan Lite、Pro 套餐,最多可享首两个月 2.5 折优惠,第三个月起恢复原价。**名额有限,先到先得**;优惠资格在新购、续费、升级场景间共享,使用后不因升档或后续退订等操作重新获得。 # 活动时间 2026年6月8日至2026年11月8日 # 活动对象 所有用户,**名额有限**,**先到先得** # 适用产品与档位 > **注意** > > * 活动期间内,每个账号最多能享受两个月的特惠套餐,新购、续费、升配共享同一优惠资格。 > * 若用户首次仅订阅了一个月的特惠套餐,第二个月的特惠套餐相关操作(包含新购、续费、升配)需在首月套餐购买成功次日起才可进行。 | 档位 | 原价 | 折扣价 | 折扣享受条件 | |---|---|---|---| | Lite | 40元 | 9.9元 | 2026年6月8日至2026年11月8日,首两个月套餐可享。 | \ | | | | * 新用户: | \ | | | | * 如果当前没有订阅套餐,购买前两个月套餐 2.5 折,第三个月起原价。 | \ | | | | * 若参与9.5折 Coding Plan 裂变活动,9.5折可叠加使用。 | \ | | | | * 老用户: | \ | | | | * 若当前已有订阅 Lite 套餐,续费或升配至 Pro 套餐,前两个月套餐 2.5折(不满 1 个月按 1 个月计算),第三个月起原价。 | \ | | | | * 若当前已有订阅 Pro 套餐,续费前两个月套餐 2.5折,第三个月起原价。 | | Pro | 200元 | 49.9元 | ^^ | # 优惠资格规则 * 活动优惠资格按用户维度发放,仅能在同一账号内享受。 * **新购、续费、升配共享同一优惠资格**。 * 用户使用优惠资格后,后续操作**不会因续费、升配或换档重新获得优惠**。 * **名额有限,先到先得**。 # 特别说明 * 如多个账户通过同一手机号、同一证件号、同一账号 ID,或其他经火山引擎排查多个账户为同一实际控制人的,均视为“同一用户”。 * 对恶意抢占活动资源、批量刷单及其他任何采用非常规手段影响活动公平性和违反服务协议及规则的行为,火山引擎有权取消从事违法违规行为的用户活动资格并回收奖励包资源,必要时追究违规用户的法律责任。 * 火山引擎可以根据运营情况对活动进行变更或调整,并于页面公告,包括不限于活动规则、商品数量、活动有效期等,请以页面最新内容及火山引擎通知为准。用户在活动规则变更或调整前已发放的服务和权益不受影响。 * 平台可根据运营情况调整或终止本活动。在法律允许范围内,本规则的最终解释权归平台所有。 --- # Agent/Coding Plan 指定模型抵扣系数限时折扣活动 Source: https://ark.volcengine.com/region:cn-beijing/docs/coding-plan-personal-model-discount 活动期间内,Agent/Coding Plan 个人版用户使用指定模型时,模型抵扣系数在现有抵扣系数基础上享最低 2.5 折优惠。活动到点自动生效,无需用户申请。各模型的活动时间参见[活动时间](/docs/coding-plan-personal-model-discount#a2f6c9d4)。 # 活动时间 * Auto 模式:2026年6月10日18:00:00至2026年11月8日23:59:59 * deepseek-v4.1-flash 模型:2026年9月15日00:00:00至2026年12月30日23:59:59 * deepseek-v4.1-flash-economy 模型:2026年10月20日00:00:00至2026年12月30日23:59:59 * kimi-k2.8-preview 模型:2026年9月17日00:00:00至2026年12月14日23:59:59 * kimi-k3 模型:2026年10月12日00:00:00至2026年10月25日23:59:59 * glm-5.3-flash 模型:2026年8月28日00:00:00至2026年9月11日23:59:59 * glm-5.2 模型:2026年6月10日18:00:00至2026年8月8日23:59:59 * deepseek-v4-pro、kimi-k2.6、kimi-k2.7-code 模型:2026年6月10日18:00:00至2026年7月15日00:00:00 # 活动对象 所有 Agent/Coding Plan 个人版用户,活动到点自动生效,无需申请。 # 适用产品与模型 | 适用产品 | 适用模型 | 活动状态 | 优惠规则 | |---|---|---|---| | Agent/Coding Plan 个人版 | Auto 模式 | 进行中 | Auto 模式在 Coding Plan 中抵扣系数为 1 ,支持路由到 kimi-k3,夜间 00:00-8:00,kimi-k3 的路由比例会大幅度提升。 | | ^^ | kimi-k2.8-preview | 进行中 | 新模型上线限时活动,活动期间,Coding Plan 中 Kimi-K2.8-Preview 的可用量,与 Agent Plan 6 折抵扣活动期间相当。 | | ^^ | kimi-k3 | 进行中 | 活动期间,Coding Plan 中 Kimi-K3 的可用量,与 Agent Plan 5 折抵扣活动期间相当。 | | ^^ | deepseek-v4.1-flash | 进行中 | 新模型上线活动,活动期间模型抵扣系数在现有抵扣系数基础上享 5 折优惠,可使用配额为原用量的 200%。 | | ^^ | deepseek-v4.1-flash-economy | 进行中 | 新模型上线活动,活动期间模型抵扣系数在现有抵扣系数基础上享 5 折优惠,可使用配额为原用量的 200%。 | | ^^ | glm-5.3-flash | 已结束 | 新模型上线活动,活动期间模型抵扣系数在现有抵扣系数基础上享 5 折优惠,可使用配额为原用量的 200%。 | | ^^ | deepseek-v4-pro | 已结束 | 活动期间,模型抵扣系数在现有抵扣系数基础上享 4 折优惠,可使用配额为原用量的 250%。 | | ^^ | kimi-k2.6 | 已结束 | ^^ | | ^^ | kimi-k2.7-code | 已结束 | 新模型上线,模型抵扣系数在现有抵扣系数基础上享 2.5 折优惠,可使用配额为原用量的 400%。 | | ^^ | glm-5.2 | 已结束 | ^^ | # 参与方式 活动到点自动生效。 * 您可以访问 [方舟 Agent Plan 活动](https://www.volcengine.com/activity/agentplan) 了解活动详情并订阅 Agent Plan 套餐。 * 您可以访问 [方舟 Coding Plan 活动](https://www.volcengine.com/activity/codingplan) 了解活动详情并订阅 Coding Plan 套餐。 # 特别说明 * 本活动仅调整适用模型在活动期间的抵扣系数,不改变套餐内其他模型、Harness、套餐额度刷新规则与使用限制。 * 活动结束后,适用模型的抵扣系数恢复为原有规则。 * 火山引擎可以根据运营情况对活动进行变更或调整,包括不限于活动规则、活动有效期等,请以页面最新内容及火山引擎通知为准。 --- # Coding Plan Pro 套餐赠送 ArkClaw 活动下线公告 Source: https://ark.volcengine.com/region:cn-beijing/docs/coding-plan-personal-arkclaw-annual-subscription 感谢您一直以来对火山引擎 Coding Plan 的支持与信任。由于业务调整,**Coding Plan Pro 套餐赠送 ArkClaw 活动将于 2026 年 5 月 18 日 12:00 正式下线**。下线后,购买该套餐将不再赠送 ArkClaw 权益。 # 下线规则 针对不同用户的权益生效情况,具体规则如下: * **2026 年 5 月 18 日 12:00 及之前**:已购买 Coding Plan Pro 套餐,且已在体验中心完成 ArkClaw 创建领取的用户,赠送权益正常生效,有效期与所购套餐保持同步。 * **2026 年 5 月 18 日 12:00 之后**:不再赠送 ArkClaw 权益。 为了帮助您更好的理解本次调整,可根据以下场景查看权益处理方式。 |用户场景 |权益处理方式 | |---|---| |活动下线前,已购买 Pro 套餐**且已到体验中心创建** |已生效权益正常使用至套餐到期 | |活动下线前,已购买 Pro 套餐**但未到体验中心创建** |下线后无法再领取创建 | |活动下线后,Pro 用户在原套餐有效期内**续费延期** |已发放的 ArkClaw 有效期随套餐延长 | |活动下线后,Lite 套餐**升配至 Pro 套餐** |不再赠送 ArkClaw | |活动下线后,**新购** **Pro 套餐** |不再赠送 ArkClaw | # 温馨提示 * **尽早领取**:若您已购买 Pro 套餐但尚未到体验中心创建 ArkClaw,请务必于 **2026 年 5 月 18 日 12:00 前**到 [火山方舟体验中心](https://ark.volcengine.com/region:cn-beijing/experience/claw) 完成创建。**逾期将无法补发,敬请谅解**。 * **不受影响**:已成功领取并正在使用中的 ArkClaw,其使用体验及当前有效期内的服务将不受本次活动调整的影响。 --- # 功能发布公告 Source: https://ark.volcengine.com/region:cn-beijing/docs/coding-plan-personal-feature-release # 202610 |发布日期 |功能说明 |帮助文档 | |---|---|---| |10.20 |* 模型新增:支持 `deepseek-v4.1-flash-economy` 模型。 |[支持的模型](/docs/coding-plan-personal-plan-overview#51b87c17) | \ | |* 新模型限时活动:`deepseek-v4.1-flash-economy` 抵扣系数 5 折,截止 2026-12-30 23:59:59。 |[限时折扣活动](/docs/coding-plan-personal-model-discount) | \ |10.19 |* 模型启动下线:`minimax-m3` 模型启动下线。 |[2026.10.19 启动模型下线说明](/docs/coding-plan-personal-model-deprecation#4a9c7f81) | \ | | | | |10.13 |* 模型启动下线:`kimi-k2.7-code` 模型启动下线。 |[2026.10.13 启动模型下线说明](/docs/coding-plan-personal-model-deprecation#b2c8f1a0) | \ | | | | # 202609 |发布日期 |功能说明 |帮助文档 | |---|---|---| |09.23 |* 模型新增:支持 `doubao-seed-2.1-pro`、`doubao-seed-2.1-lite`、`doubao-seed-2.0-mini`、`deepseek-v4.1-flash` 模型。 |[支持的模型](/docs/coding-plan-personal-plan-overview#51b87c17) | \ | |* 新模型限时活动:`deepseek-v4.1-flash` 抵扣系数 5 折,截止 2026-10-30 18:00:00。 |[限时折扣活动](/docs/coding-plan-personal-model-discount) | \ | |* 模型启动下线:`doubao-seed-2.1-turbo`、`doubao-seed-2.0-lite`模型启动下线。 |[2026.09.23 启动模型下线说明](/docs/coding-plan-personal-model-deprecation#f3a1d8c6) | \ | | | | |09.18 |* 模型新增:支持 `kimi-k2.8-preview` 模型。 |[支持的模型](/docs/coding-plan-personal-plan-overview#51b87c17) | \ | |* 新模型限时活动:活动期间,Coding Plan 中 Kimi-K2.8-Preview 的可用量,与 Agent Plan 6 折抵扣活动期间相当。 |[Agent/Coding Plan 指定模型抵扣系数限时折扣活动](/docs/coding-plan-personal-model-discount) | |09.08 |* 模型新增:支持 `kimi-k3` 模型,模型抵扣系数较高,仅建议 Pro 套餐用户使用。 |[支持的模型](/docs/coding-plan-personal-plan-overview#51b87c17) | \ | | | | # 202608 |发布日期 |功能说明 |帮助文档 | |---|---|---| |08.28 |* 模型新增:支持 `glm-5.3-flash` 模型,首个原生多模态模型,以极致低成本架构实现超越 GLM-5.2 的更强智能。 |[支持的模型](/docs/coding-plan-personal-plan-overview#51b87c17) | \ | |* 限时活动:`glm-5.3-flash` 首两周抵扣系数 5 折优惠,活动截止 2026-09-11 23:59:59。 |[Agent/Coding Plan 指定模型抵扣系数限时折扣活动](/docs/coding-plan-personal-model-discount) | |08.26 |* 模型新增:`deepseek-v4-pro` 正式版已上线,Agent 能力全面跃升,支持通过 model name 及控制台选择进行访问。 |[支持的模型](/docs/coding-plan-personal-plan-overview#51b87c17) | \ | | | | |08.21 |* 模型新增:支持 `doubao-seed-evolving` 模型。 |[支持的模型](/docs/coding-plan-personal-plan-overview#51b87c17) | \ | | | | |08.17 |* 模型启动下线:`glm-5.2` 模型启动下线。 |[2026.08.17 启动模型下线说明](/docs/coding-plan-personal-model-deprecation#c8d5e2a1) | \ | | | | |08.14 |* 模型新增:支持 `glm-5.3` 模型。 |[支持的模型](/docs/coding-plan-personal-plan-overview#51b87c17) | \ | | | | |08.07 |* 模型更新:`deepseek-v4-flash` 正式版已全量上线,支持通过 model name 直接调用。 |[支持的模型](/docs/coding-plan-personal-plan-overview#51b87c17) | \ | | | | |08.04 |* 模型启动下线:`kimi-k2.6`、`minimax-m2.7` 模型启动下线。 |[2026.08.04 启动模型下线说明](/docs/coding-plan-personal-model-deprecation#7a3d1c90) | \ | | | | |08.04 |* 模型新增:支持 `deepseek-v4-flash` 正式版模型。 |[支持的模型](/docs/coding-plan-personal-plan-overview#51b87c17) | \ | | | | # 202607 |发布日期 |功能说明 |帮助文档 | |---|---|---| |07.23 |* 模型新增:支持 `doubao-seed-2.1-turbo` 模型。 |[支持的模型](/docs/coding-plan-personal-plan-overview#51b87c17) | \ | | | | # 202606 |发布日期 |功能说明 |帮助文档 | |---|---|---| |06.30 |* 模型下线:glm-5.1,deepseek-v3.2 模型下线。 | [支持的模型](/docs/coding-plan-personal-plan-overview#51b87c17) | \ | | | | |06.18 |* 模型新增:支持 kimi-k2.7-code 模型。 |[支持的模型](/docs/coding-plan-personal-plan-overview#51b87c17) | \ | | | | |06.17 |* 模型新增:支持 glm-5.2 模型。 |[支持的模型](/docs/coding-plan-personal-plan-overview#51b87c17) | \ | | | | |06.08 |* 模型新增:支持 minimax-m3 模型。 |[支持的模型](/docs/coding-plan-personal-plan-overview#51b87c17) | \ | |* 模型下线:minimax-m2.5,kimi-k2.5,glm-4.7 模型下线。 | | # 202605 |发布日期 |功能说明 |帮助文档 | |---|---|---| |05.18 |* 模型新增:支持 deepseek-v4-flash、deepseek-v4-pro 模型。 |[支持的模型](/docs/coding-plan-personal-plan-overview#51b87c17) | \ | | | | # 202604 |发布日期 |功能说明 |帮助文档 | |---|---|---| |04.22 |* 模型新增:支持 glm-5.1、minimax-m2.7、kimi-k2.6 模型。 |[支持的模型](/docs/coding-plan-personal-plan-overview#51b87c17) | \ | |* 模型下线:kimi-k2-thinking 模型下线。 | | # 202603 |发布日期 |功能说明 |帮助文档 | |---|---|---| |03.31 |* 模型新增:支持 Embedding 模型 doubao-embedding-vision,为工具提供语义向量能力。 |[记忆增强-Embedding模型](/docs/coding-plan-personal-embedding-memory) | \ | |* 方舟 Coding Plan 支持接入 OpenViking。 |[OpenViking](/docs/coding-plan-personal-ai-openviking) | |03.06 |* 模型新增:支持 doubao-seed-2.0-pro、doubao-seed-2.0-lite、minimax-m2.5 模型。 |[支持的模型](/docs/coding-plan-personal-plan-overview#51b87c17) | \ | | | | |03.02 |* 订阅方舟 Coding Plan 后,可免费解锁 ArkClaw,支持一键云端部署 OpenClaw,享有一对一专属 ECS 资源。 |[ArkClaw](/docs/coding-plan-personal-benefits-arkclaw) | \ | | | | # 202602 |发布日期 |功能说明 |帮助文档 | |---|---|---| |02.14 |* 模型新增:支持 doubao-seed-2.0-code 模型。 |[支持的模型](/docs/coding-plan-personal-plan-overview#51b87c17) | \ | | | | |02.11 |* 模型 kimi-k2.5 支持多模态视觉理解。 |[支持的模型](/docs/coding-plan-personal-plan-overview#51b87c17) | \ | | | | |02.06 |* 支持在配置文件通过 Model Name 方式配置模型。 |[模型配置](/docs/coding-plan-personal-get-started#3a775131) | \ | | | | |02.04 |* 方舟 Coding Plan 支持接入 TraeCode 个人版。 |[TRAE](/docs/coding-plan-personal-ai-trae) | \ | | | | # 202601 |发布日期 |功能说明 |帮助文档 | |---|---|---| |01.29 |* 模型新增:支持 kimi-k2.5 模型(目前仅支持纯文本输入)。 |[支持的模型](/docs/coding-plan-personal-plan-overview#51b87c17) | \ | | | | |01.27 |* 方舟 Coding Plan 支持接入 OpenClaw。 |[OpenClaw](/docs/coding-plan-personal-ai-openclaw) | \ | | | | |01.13 |* 方舟 Coding Plan 权益扩展,支持四款主流 Code 模型:doubao-seed-code、glm-4.7、kimi-k2-thinking、deepseek-v3.2。 |[支持的模型](/docs/coding-plan-personal-plan-overview#51b87c17) | \ | | | | # 202512 |发布日期 |功能说明 |帮助文档 | |---|---|---| |12.05 |* 方舟 Coding Plan 支持模型扩展,新增模型 deepseek-v3.2。 |[支持的模型](/docs/coding-plan-personal-plan-overview#51b87c17) | \ | | | | # 202511 |发布日期 |功能说明 |帮助文档 | |---|---|---| |11.11 |* 方舟 Coding Plan 正式上线,支持模型 doubao-seed-code。 |[套餐概览](/docs/coding-plan-personal-plan-overview) | \ | | |[快速开始](/docs/coding-plan-personal-get-started) | --- # 模型上线公告 Source: https://ark.volcengine.com/region:cn-beijing/docs/coding-plan-personal-model-release 本文用于汇总 Coding Plan 个人版新增模型的上线记录,并提供对应帮助文档入口。如果需要使用新模型,可参见[切换模型步骤](/docs/coding-plan-personal-model-release#b31f4c9e)。 # 202610 |发布日期 |模型 |说明 |如何使用 | |---|---|---|---| |10.20 |deepseek-v4.1-flash-economy |DeepSeek-V4.1-Flash-Economy 与标准版采用完全相同的模型权重,能力与效果完全一致。经济版价格更低,回答生成速度略慢,适合注重成本、对生成速度要求不高的场景,支持多模态输入。 |[快速开始](/docs/coding-plan-personal-get-started) | # 202609 |发布日期 |模型 |说明 |如何使用 | |---|---|---|---| |09.23 |doubao-seed-2.1-pro |豆包 Seed 2.1 系列旗舰模型,全面升级 Coding、Agent 与多模态能力,具备顶尖推理与复杂任务执行能力。 |[快速开始](/docs/coding-plan-personal-get-started) | |09.23 |doubao-seed-2.1-lite |豆包 Seed 2.1 系列轻量模型,兼顾生成质量与响应速度,适合通用生产级任务。 |[快速开始](/docs/coding-plan-personal-get-started) | |09.23 |doubao-seed-2.0-mini |豆包 Seed 2.0 Mini 模型,已升级到 0428 版本,Agent 能力显著增强。 |[快速开始](/docs/coding-plan-personal-get-started) | |09.23 |deepseek-v4.1-flash |DeepSeek-V4.1-Flash 是 DeepSeek 全新架构系列中的轻量旗舰模型,以 552B 总参数 MoE 实现越级智能,在多项基准上超越包括 DeepSeek-V4-Pro 在内的主流旗舰模型,原生具备多模态视觉理解能力。 |[快速开始](/docs/coding-plan-personal-get-started) | |09.18 |kimi-k2.8-preview |综合性能接近 K3,思考效率更高,擅长代码补全与常规开发任务,支持 1024k 上下文窗口。 |[快速开始](/docs/coding-plan-personal-get-started) | |09.08 |kimi-k3 |原生支持视觉理解,并拥有 100 万 token 上下文窗口,面向软件工程、知识工作和深度推理等前沿智能场景而设计。模型抵扣系数较高,仅建议 Pro 套餐用户使用。 |[快速开始](/docs/coding-plan-personal-get-started) | # 202608 |发布日期 |模型 |说明 |如何使用 | |---|---|---|---| |08.28 |glm-5.3-flash |首个原生多模态模型,以极致低成本架构实现超越 GLM-5.2 的更强智能。 |[快速开始](/docs/coding-plan-personal-get-started) | |08.26 |deepseek-v4-pro 正式版 |deepseek-v4-pro 正式版已上线,Agent 能力全面跃升,支持通过 model name 及控制台选择进行访问。 |[快速开始](/docs/coding-plan-personal-get-started) | |08.21 |doubao-seed-evolving |Doubao-Seed-Evolving 面向 Coding 与 Agent 场景,持续周级升级,以统一模型 ID 提供最新能力。支持 1M 超长上下文,具备复杂任务编排、长程规划、代码生成与工具调用能力。 |[快速开始](/docs/coding-plan-personal-get-started) | |08.14 |glm-5.3 |智谱旗舰 GLM-5.3,编程与安全能力突出,支持 1M 上下文窗口,可生产级代码交付。 |[快速开始](/docs/coding-plan-personal-get-started) | |08.07 |deepseek-v4-flash 正式版 |deepseek-v4-flash 正式版已全量上线,支持通过 model name `deepseek-v4-flash` 直接调用。 |[快速开始](/docs/coding-plan-personal-get-started) | |08.04 |deepseek-v4-flash 正式版 |deepseek-v4-flash 正式版已上线,Agent 能力大幅增强,基准测试远超 V4-Pro-Preview。|[快速开始](/docs/coding-plan-personal-get-started) | # 202607 |发布日期 |模型 |说明 |如何使用 | |---|---|---|---| |07.23 |doubao-seed-2.1-turbo |效果与成本均衡,全面升级 Coding、Agent 与多模态能力,以更强的自主规划、长链路执行和动态修复能力,胜任企业真实复杂任务。 |[快速开始](/docs/coding-plan-personal-get-started) | # 202606 |发布日期 |模型 |说明 |如何使用 | |---|---|---|---| |06.18 |kimi-k2.7-code |Kimi 最新 Coding 模型,在长上下文中更可靠地遵循指令,能以更高的成功率完成编程任务,同时支持文本、图片与视频输入,思考模式,对话与 Agent 任务。 |[快速开始](/docs/coding-plan-personal-get-started) | |06.17 |glm-5.2 |智谱最新旗舰模型,支持 1M 上下文窗口,长程任务效果表现突出,多项权威评测榜单成绩稳居前列。 |[快速开始](/docs/coding-plan-personal-get-started) | |06.08 |minimax-m3 |新一代 M 系列语言模型,在编码与智能体评测中达到行业顶尖水平,适用于 Agent 推理、工具调用、代码和长上下文任务。 |[快速开始](/docs/coding-plan-personal-get-started) | # 202605 |发布日期 |模型 |说明 |如何使用 | |---|---|---|---| |05.18 |deepseek-v4-flash |高效经济版大模型,推理速度更快、成本更低,适合日常问答与高并发场景。 |[快速开始](/docs/coding-plan-personal-get-started) | |05.18 |deepseek-v4-pro |新一代旗舰大模型,具备更强的推理、代码与复杂 Agent 能力,适合高强度复杂任务。 |[快速开始](/docs/coding-plan-personal-get-started) | # 202604 |发布日期 |模型 |说明 |如何使用 | |---|---|---|---| |04.22 |glm-5.1 |智谱新一代旗舰模型,在代码生成、长程自主执行、复杂工程优化与真实开发场景中表现优异。 |[快速开始](/docs/coding-plan-personal-get-started) | |04.22 |minimax-m2.7 |能够自行构建复杂 Agent Harness,并基于 Agent Teams、复杂 Skills、Tool 等能力,完成高度复杂的生产力任务。 |[快速开始](/docs/coding-plan-personal-get-started) | |04.22 |kimi-k2.6 |具备强思考能力,支持多步工具调用和推理,擅长解决复杂问题,如复杂的逻辑推理、数学问题、代码编写等。|[快速开始](/docs/coding-plan-personal-get-started) | # 202603 |发布日期 |模型 |说明 |如何使用 | |---|---|---|---| |03.31 |doubao-embedding-vision |Embedding 模型,为工具提供语义向量能力。 |[记忆增强-Embedding模型](/docs/coding-plan-personal-embedding-memory) | |03.06 |doubao-seed-2.0-pro |旗舰级全能通用模型,适合复杂推理与长链路任务执行场景,强调多模态理解、长上下文推理、结构化生成与工具增强执行。|[快速开始](/docs/coding-plan-personal-get-started) | |03.06 |doubao-seed-2.0-lite |兼顾生成质量与响应速度,适合作为通用生产级模型,胜任非结构化信息处理、内容创作、搜索推荐、数据分析等生产型工作。 |[快速开始](/docs/coding-plan-personal-get-started) | |03.06 |minimax-m2.5 |MiniMax 旗舰级开源大模型,在编程、工具调用和搜索、办公等生产力场景都达到或者刷新了行业的 SOTA。|[快速开始](/docs/coding-plan-personal-get-started) | # 202602 |发布日期 |模型 |说明 |如何使用 | |---|---|---|---| |02.14 |doubao-seed-2.0-code |依托 Seed 2.0 Agent 与视觉理解能力,强化代码能力:前端出众,多语言适配。 |[快速开始](/docs/coding-plan-personal-get-started) | # 202601 |发布日期 |模型 |说明 |如何使用 | |---|---|---|---| |01.29 |kimi-k2.5 |Moonshot AI 最新编程模型,强化了前端代码质量与设计表现力。 |[快速开始](/docs/coding-plan-personal-get-started) | |01.13 |glm-4.7 |智谱 AI 旗舰代码大模型,在代码生成、调试、全链路理解场景中表现优异。|[快速开始](/docs/coding-plan-personal-get-started) | |01.13 |kimi-k2-thinking |Moonshot AI 推出的 MoE 混合专家架构大模型,在复杂代码开发、Agent 全链路任务中具备强逻辑推理与多任务协同能力。 |[快速开始](/docs/coding-plan-personal-get-started) | # 202512 |发布日期 |模型 |说明 |如何使用 | |---|---|---|---| |12.05 |deepseek v3.2 |深度求索推理模型,平衡推理能力与输出长度,在通用问答、日常 Agent 任务、轻量级代码开发场景中稳定高效。 |[快速开始](/docs/coding-plan-personal-get-started) | # 202511 |发布日期 |模型 |说明 |如何使用 | |---|---|---|---| |11.11 |doubao-seed-code |豆包编程模型,具备精准的代码生成、任务调度与逻辑协同能力。 |[快速开始](/docs/coding-plan-personal-get-started) | # 切换模型步骤 以下是针对文本生成模型的切换方式。 ## 方式一:使用 latest 配置(推荐) 在配置模型名称时,推荐使用 latest 配置,避免旧版本模型下线带来的影响: - ark-code-latest:可在控制台选择或切换目标模型,不需要修改工具配置文件。 - glm-latest、minimax-latest、kimi-latest、deepseek-latest:默认使用支持的最新版本模型,可第一时间使用对应最新版本模型。 |latest 模型 |对应模型 | |---|---| |glm-latest |glm-5.3 | |minimax-latest |minimax-m3 | |kimi-latest |kimi-k2.7-code | |deepseek-latest |deepseek-v4-pro | ## 方式二:修改配置文件 如果在工具中配置的是具体的 Model Name,在旧模型下线前需要将配置文件中的模型信息更新为当前支持的模型名称。不同工具的配置入口参见对应文档: * Claude Code:[配置 Claude Code](/docs/coding-plan-personal-ai-claude-code#92b07719) * OpenClaw:[配置 OpenClaw](/docs/coding-plan-personal-ai-openclaw#48c0b1ea) * Codex:[配置 Codex CLI](/docs/coding-plan-personal-ai-codex#6d2d0676) * OpenCode:[配置 OpenCode](/docs/coding-plan-personal-ai-opencode#c807cb71) * TraeCode:[配置 TraeCode](/docs/coding-plan-personal-ai-trae#962c91bd) * Hermes Agent:[配置 Hermes Agent](/docs/coding-plan-personal-ai-hermes-agent#14207659) * 其他工具:[其他工具](/docs/coding-plan-personal-ai-other-tools) --- # 模型下线公告 Source: https://ark.volcengine.com/region:cn-beijing/docs/coding-plan-personal-model-deprecation 随着 Coding Plan 的更新发布,新版本模型在效果、推理时延等各方面将远超较旧版本的模型。因此,我们将逐步下线这些旧版本模型。当某个模型确定下线计划时,我们会通过短信、站内信等方式发布通知,请及时关注。 可用模型范围以控制台实际展示为准,完整列表参见:[支持的模型](/docs/coding-plan-personal-plan-overview#51b87c17)。在工具中切换模型,参见[切换模型步骤](/docs/coding-plan-personal-model-deprecation#b31f4c9e)。 # 2026.10.19 启动模型下线说明 |模型 |下线计划 |建议迁移模型 | |---|---|---| |minimax-m3 |1. 启动&通知:2026-10-19 10:00:00(UTC+8) |doubao-seed-evolving / kimi-k3 | \ | |2. 模型停止对新用户提供服务:2026-10-19 10:00:00(UTC+8) | | \ | | > * 新用户无法使用该模型。新用户定义:购买 Coding Plan 套餐但未使用过该模型的用户。 | | \ | | > * 建议提前切换至对应的替换模型,并测试验证新模型对业务的影响。 | | \ | |3. 模型服务下线:2026-11-02 14:00:00(UTC+8) | | \ | | > 模型正式下线并停止服务,如果到期未迁移模型,会影响业务。 | | # 2026.10.13 启动模型下线说明 |模型 |下线计划 |建议迁移模型 | |---|---|---| |kimi-k2.7-code |1. 启动&通知:2026-10-13 10:00:00(UTC+8) |kimi-k3 | \ | |2. 模型停止对新用户提供服务:2026-10-13 10:00:00(UTC+8) | | \ | | > * 新用户无法使用该模型。新用户定义:购买 Coding Plan 套餐但未使用过该模型的用户。 | | \ | | > * 建议提前切换至对应的替换模型,并测试验证新模型对业务的影响。 | | \ | |3. 模型服务下线:2026-10-28 14:00:00(UTC+8) | | \ | | > 模型正式下线并停止服务,如果到期未迁移模型,会影响业务。 | | # 2026.09.23 启动模型下线说明 详细信息 |模型 |下线计划 |建议迁移模型 | |---|---|---| |doubao-seed-2.1-turbo |1. 启动&通知:2026-09-23 10:00:00(UTC+8) |doubao-seed-2.1-pro | \ | |2. 模型停止对新用户提供服务:2026-09-23 10:00:00(UTC+8) | | \ | | > * 新用户无法使用该模型。新用户定义:购买 Coding Plan 套餐但未使用过该模型的用户。 | | \ | | > * 建议提前切换至对应的替换模型,并测试验证新模型对业务的影响。 | | \ | |3. 模型服务下线:2026-10-09 14:00:00(UTC+8) | | \ | | > 模型正式下线并停止服务,如果到期未迁移模型,会影响业务。 | | |doubao-seed-2.0-lite |^^ |doubao-seed-2.1-lite | # 2026.08.17 启动模型下线说明 详细信息 |模型 |下线计划 |建议迁移模型 | |---|---|---| |glm-5.2 |1. 启动&通知:2026-08-17 10:00:00(UTC+8) |glm-5.3 | \ | |2. 模型停止对新用户提供服务:2026-08-17 10:00:00(UTC+8) | | \ | | > * 新用户无法使用该模型。新用户定义:购买 Coding Plan 套餐但未使用过该模型的用户。 | | \ | | > * 建议提前切换至对应的替换模型,并测试验证新模型对业务的影响。 | | \ | |3. 模型服务下线:2026-08-31 14:00:00(UTC+8) | | \ | | > 模型正式下线并停止服务,如果到期未迁移模型,glm-5.2 会自动路由到 glm-5.3。 | | # 2026.08.04 启动模型下线说明 详细信息 |模型 |下线计划 |建议迁移模型 | |---|---|---| |kimi-k2.6 |1. 启动&通知:2026-08-04 10:00:00(UTC+8) | kimi-k2.7-code | \ | |2. 模型停止对新用户提供服务:2026-08-04 10:00:00(UTC+8) | | \ | | > * 新用户无法使用该模型。新用户定义:购买 Coding Plan 套餐但未使用过该模型的用户。 | | \ | | > * 建议提前切换至对应的替换模型,并测试验证新模型对业务的影响。 | | \ | |3. 模型服务下线:2026-08-18 14:00:00(UTC+8) | | \ | | > 模型正式下线并停止服务,如果到期未迁移模型,会影响业务。 | | |minimax-m2.7 |^^ |minimax-m3 | # 2026.07.24 启动模型下线说明 详细信息 |模型 |下线计划 |建议迁移模型 | |---|---|---| |doubao-seed-2.0-code |1. 启动&通知:2026-07-24 10:00:00(UTC+8) |doubao-seed-2.1-turbo | \ | |2. 模型停止对新用户提供服务:2026-07-24 10:00:00(UTC+8) | | \ | | > * 新用户无法使用该模型。新用户定义:购买 Coding Plan 套餐但未使用过该模型的用户。 | | \ | | > * 建议提前切换至对应的替换模型,并测试验证新模型对业务的影响。 | | \ | |3. 模型服务下线:2026-08-08 14:00:00(UTC+8) | | \ | | > 模型正式下线并停止服务,如果到期未迁移模型,会影响业务。 | | |doubao-seed-2.0-pro |^^ |doubao-seed-2.1-turbo | # 2026.07.21 启动模型下线说明 详细信息 |模型 |下线计划 |建议迁移模型 | |---|---|---| |doubao-seed-code |1. 启动&通知:2026-07-21 10:00:00(UTC+8) |doubao-seed-2.0-code | \ | |2. 模型停止对新用户提供服务:2026-07-21 10:00:00(UTC+8) | | \ | | > * 新用户无法使用该模型。新用户定义:购买 Coding Plan 套餐但未使用过该模型的用户。 | | \ | | > * 建议提前切换至对应的替换模型,并测试验证新模型对业务的影响。 | | \ | |3. 模型服务下线:2026-08-05 14:00(UTC+8) | | \ | | > 模型正式下线并停止服务,如果到期未迁移模型,会影响业务。 | | # 2026.06.17 启动模型下线说明 详细信息 |模型 |下线计划 |建议迁移模型 | |---|---|---| |glm-5.1 |1. 启动&通知:2026-06-17 10:00:00(UTC+8) |glm-5.2 | \ | |2. 模型停止对新用户提供服务:2026-06-17 10:00:00(UTC+8) | | \ | | > * 新用户无法使用该模型。新用户定义:购买 Coding Plan 套餐但未使用过该模型的用户。 | | \ | | > * 建议提前切换至对应的替换模型,并测试验证新模型对业务的影响。 | | \ | |3. 模型服务下线:2026-06-30 14:00(UTC+8) | | \ | | > 模型正式下线并停止服务,如果到期未迁移模型,会影响业务。 | | |deepseek-v3.2 |^^ |deepseek-v4-pro | # 已下线模型 |模型 |下线时间 | |---|---| |doubao-seed-2.1-turbo |10.09 | |doubao-seed-2.0-lite |10.09 | |glm-5.2 |08.31 | |kimi-k2.6 |08.18 | |minimax-m2.7 |08.18 | |doubao-seed-2.0-code |08.08 | |doubao-seed-2.0-pro |08.08 | |doubao-seed-code |08.05 | |glm-5.1 |06.30 | |deepseek-v3.2 |06.30 | |minimax-m2.5 |06.08 | |kimi-k2.5 |06.08 | |glm-4.7 |06.08 | |kimi-k2-thinking |04.22 | # 切换模型步骤 以下是针对文本生成模型的切换方式。 ## 方式一:使用 latest 配置(推荐) 在配置模型名称时,推荐使用 latest 配置,避免旧版本模型下线带来的影响: - ark-code-latest:可在控制台选择或切换目标模型,不需要修改工具配置文件。 - glm-latest、minimax-latest、kimi-latest、deepseek-latest:默认使用支持的最新版本模型,可第一时间使用对应最新版本模型。 |latest 模型 |对应模型 | |---|---| |glm-latest |glm-5.3 | |minimax-latest |minimax-m3 | |kimi-latest |kimi-k2.7-code | |deepseek-latest |deepseek-v4.1-flash | ## 方式二:修改配置文件 如果在工具中配置的是具体的 Model Name,在旧模型下线前需要将配置文件中的模型信息更新为当前支持的模型名称。不同工具的配置入口参见对应文档: * Claude Code:[配置 Claude Code](/docs/coding-plan-personal-ai-claude-code#92b07719) * OpenClaw:[配置 OpenClaw](/docs/coding-plan-personal-ai-openclaw#48c0b1ea) * Codex:[配置 Codex CLI](/docs/coding-plan-personal-ai-codex#6d2d0676) * OpenCode:[配置 OpenCode](/docs/coding-plan-personal-ai-opencode#c807cb71) * TraeCode:[配置 TraeCode](/docs/coding-plan-personal-ai-trae#962c91bd) * Hermes Agent:[配置 Hermes Agent](/docs/coding-plan-personal-ai-hermes-agent#14207659) * 其他工具:[其他工具](/docs/coding-plan-personal-ai-other-tools) --- # 获取 API Key 并配置 Source: https://ark.volcengine.com/region:cn-beijing/docs/api-key 您调用方舟平台的模型之前,您需要 API Key 来进行鉴权。同时因为 API Key 信息较为敏感,泄露 API Key 会导致您的模型用量被其他人花费,造成一定的损失,因此我们会给出配置 API Key 进环境变量的方法,方便您合理安全地使用API Key。 > **注意:API Key 明文格式变更** > > 2026 年 9 月 17 日 12:00(UTC+8)之后创建的 ModelArk API Key 将使用新的明文格式。本次调整仅涉及 API Key 格式,不影响 API 鉴权方式。该时间点以前创建的 API Key 继续有效,无需重新生成。 ## 获取 API Key 1. 登录控制台。 2. (可选)在控制台左下角切换项目空间,然后选择 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey)。 3. 单击 **创建 API Key** 按钮。 4. 在弹出框的 **名称** 文本框中确认/更改 API Key名称,单击创建。 您可以在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面的 **API Key 列表**中查看刚创建的API Key信息。 ## 配置 API Key 推荐将 API Key 配置在环境变量中,而不是硬编码进代码中,避免 API Key 随代码泄露,导致配额被他人使用,产生额外花费。 配置方法见:[环境变量配置指南](/docs/environment-variable-configuration-guide)。 ## 使用说明 * API Key 配额:一个主账号下支持创建 50 个API Key,如需更多配额请提交 [工单](https://console.volcengine.com/workorder/create?step=2&SubProductID=P00001166) 申请。 * API Key 权限控制:API Key 创建于您当前所在项目,用于访问当前项目下的资源(即模型服务和应用)。您可为 API Key 额外限制可鉴权的 Model ID /自定义推理接入点,或可调用该 API Key 的 IP。 * TIPS :您切换项目空间创建 API Key,可限制 API Key 只用于指定项目空间下的模型服务的鉴权凭证。当您的账号是多人使用,可以通过此方法进行权限隔离。 * 注意:API Key 仅支持访问指定项目下的接入点,不支持跨项目访问。当您跨项目迁移了接入点,则原 API Key 鉴权将失效。 --- # 安装及升级 SDK Source: https://ark.volcengine.com/region:cn-beijing/docs/install-and-upgrade-sdk 方舟提供了 Python 、 Go 和 Java 的 SDK ,方便使用对应编程语言快速调用方舟的模型服务。 推荐新项目使用最新稳定版方舟官方 SDK。对于新版 SDK 暂未支持的 API,可继续安装并使用旧版渠道 SDK;两套 SDK 的包名和导入路径不同,可以在迁移期间并存。请仅在对应代码路径中初始化所需客户端,避免混用请求或响应类型。 # Python SDK ## 前提条件 本地已安装了 Python ,且版本不低于 3.8。 > 可在终端中通过命令确认 Python 版本。 ```Bash python -V ``` > Python 可使用 [UV](https://docs.astral.sh/uv/) 安装,并通过它来管理虚拟环境。UV 是一个 Rust 编写的、速度极快的 Python 包和项目管理器,可以方便进行环境隔离,避免干扰您系统中已有的 Python 配置。 ## 安装 Python SDK 推荐安装最新版方舟官方 SDK: ```Bash python -m pip install --upgrade arkruntime ``` 在代码中使用: ```Python from arkruntime import Ark ``` 如需调用新版 SDK 暂不支持的 API,可继续安装旧版渠道 SDK: ```Bash pip install 'volcengine-python-sdk[ark]' ``` > **说明** > > 如本地安装错误,可尝试下面方法: > * Windows CMD 不支持单引号作为引用符。如在 Windows CMD 中执行,请改用双引号: > ```Bash > pip install "volcengine-python-sdk[ark]" > ``` > > * [Windows系统安装SDK失败,ERROR: Failed building wheel for volcengine-python-sdk](/docs/modelark-faq#b74e8ad6) > * 也可尝试使用 [uv](https://docs.astral.sh/uv/) 安装,速度更快: > ```Bash > uv pip install 'volcengine-python-sdk[ark]' > ``` > * 如需源码安装,下载并解压对应版本的 SDK 包,进入目录执行: > ```Bash > pip install . > ``` ## 升级 Python SDK 升级方舟官方 SDK: ```Bash python -m pip install --upgrade arkruntime ``` 升级旧版渠道 SDK: ```Bash pip install -U 'volcengine-python-sdk[ark]' ``` # Go SDK ## 前提条件 检查 Go 版本,需 1.20 或以上。 ```Bash go version ``` 如未安装或版本不满足,可访问 [Go 语言官方网站](https://golang.google.cn/dl/) 下载并安装,请选择 1.20 或以上版本。 ## 安装 Go SDK 1. Go SDK 使用 go mod 管理,可运行以下命令初始化 go mod。`` 替换为项目名称。 ```Bash # 如在文件夹 ark-demo 下打开终端窗口,运行命令go mod init ark-demo go mod init ``` 2. 在本地初始化 go mod 后,运行以下命令安装最新版方舟官方 SDK。 ```Bash go get github.com/volcengine/ark-runtime-go@latest ``` 3. 在代码中引入方舟官方 SDK。 ```Go import "github.com/volcengine/ark-runtime-go/arkruntime" ``` > **说明** > > 如需锁定已验证版本,将 `latest` 替换为具体版本号。版本信息参见 [ark-runtime-go Releases](https://github.com/volcengine/ark-runtime-go/releases)。 如需调用新版 SDK 暂不支持的 API,可继续安装并引入旧版渠道 SDK: ```Bash go get -u github.com/volcengine/volcengine-go-sdk ``` ```Go import "github.com/volcengine/volcengine-go-sdk/service/arkruntime" ``` 4. 更新依赖后,使用命令整理依赖。 ```Bash go mod tidy ``` ## 升级 Go SDK * 将方舟官方 SDK 升级至最新版本: ```Bash go get github.com/volcengine/ark-runtime-go@latest ``` * 将方舟官方 SDK 升级至指定版本: ```Bash go get github.com/volcengine/ark-runtime-go@ ``` * 升级旧版渠道 SDK: ```Bash go get -u github.com/volcengine/volcengine-go-sdk@ ``` # Java SDK ## 适用范围 本 SDK 仅适用于 Java 服务端开发,暂不支持 Android 平台。若需在 Android 平台使用相关功能,需由客户自行开发适配方案。 ## 前提条件 1. 检查并安装 Java 版本,Java 版本需 1.8 或以上。 ```Bash java -version ``` 如未安装 Java 或者版本不满足要求,可访问 [Oracle 官方网站](https://www.java.com/en/download/help/index_installing.html) 下载并安装适合操作系统的 Java 版本。请确保选择 1.8 或以上版本。 ## 安装 Java SDK 火山方舟 Java SDK 支持通过 Maven 安装、通过 Gradle 安装两种方式。 ### 安装方舟官方 SDK(推荐) 推荐新项目使用方舟官方 SDK。请从 [Maven Central](https://central.sonatype.com/artifact/com.volcengine/ark-runtime) 获取最新稳定版本,并将 `` 替换为该版本号。 ```XML com.volcengine ark-runtime ``` ```Groovy implementation "com.volcengine:ark-runtime:" ``` ### 安装旧版渠道 SDK 如需调用新版 SDK 暂不支持的 API,可继续使用以下旧版渠道 SDK。请将 `` 替换为方舟 Java SDK 最新版本号,SDK 版本可查询:https://central.sonatype.com/artifact/com.volcengine/volcengine-java-sdk-ark-runtime。如需安装指定版本 SDK,也可替换为具体版本号。 #### 通过 Maven 安装 在 `pom.xml` 文件中进行如下配置,完整配置可参考 [Maven Central](https://central.sonatype.com/artifact/com.volcengine/volcengine-java-sdk-ark-runtime): ```XML ... com.volcengine volcengine-java-sdk-ark-runtime ... ``` #### 通过 Gradle 安装 在 `build.gradle` 文件中进行如下配置,在 `dependencies` 中添加依赖。 ```plaintext implementation 'com.volcengine:volcengine-java-sdk-ark-runtime:' ``` ## 升级 Java SDK ### 升级方舟官方 SDK 使用 Maven Central 上的最新稳定版本替换 ``,验证通过后在构建文件中锁定该版本。 ### 升级旧版渠道 SDK 旧版渠道 SDK 请按下方方式查询和升级。 > **说明** > > 获取 SDK 版本信息,将 `` 替换为指定/最新版本号。SDK版本号可查询:[https://github.com/volcengine/volcengine-java-sdk/releases](https://github.com/volcengine/volcengine-java-sdk/releases) 同安装 Java SDK,指定需升级的版本号即可。 # 第三方SDK 火山方舟模型调用 API 与 OpenAI API 协议兼容,可使用兼容 OpenAI API 协议的多语言社区 SDK 调用火山方舟大模型或应用。可很方便地迁移模型服务至方舟平台以及 Doubao 大模型。具体使用方法请参考[兼容 OpenAI SDK](/docs/compatible-with-openai-sdk)。 # 相关文档 [SDK 常见使用示例](/docs/sdk-common-examples):包含SDK的常见用法。 --- # Base URL及鉴权 Source: https://ark.volcengine.com/region:cn-beijing/docs/base-url-and-authentication 火山方舟API分为模型调用的API(数据面 API),及管理推理接入点等管控相关的管控面 API。它们支持的鉴权方式有所不同,下面介绍方舟API的鉴权方式。 # 概念解释 * **数据面 API**:是直接面向**业务数据传输、实时交互、用户请求处理**的接口,聚焦于 “实际业务数据的流转与处理”,是系统对外提供核心服务能力的载体。请求大模型服务的 Chat API、Responses API 均为数据面 API。 * **管控面 API**:用于**系统资源管理、配置控制和状态监控**的接口。它专注于管理和调度数据面及系统资源,是保障系统稳定运行的“控制中枢”。例如,在方舟中用于管理 API Key、基础模型等接口,均属于管控面 API。 * **Base URL**:是构建完整 API 请求 URL 的 “基础模板”,包含**协议(如 http/https)、host(主机域名或 IP)、端口(可选)和基础路径(可选)**,是所有具体接口路径的 “公共前缀”。你可以根据Base URL 加接口/版本等参数拼接出完整接口 URL ,典型结构:`[协议]://[host]/[基础路径(可选)]` # Base URL > **注意** > > 下面给到的数据面 API 与 Coding Plan 支持的 Base URL 不同。Coding Plan 用户请使用正确的 Base URL,避免因地址错误产生额外费用,具体参见 [Base URL](/docs/coding-plan-personal-get-started#7fd1eee7)。 各接口类型对应的 Base URL。 * 数据面 API:https://ark.cn-beijing.volces.com/api/v3 * 管控面 API:https://ark.cn-beijing.volcengineapi.com/ # 数据面 API 鉴权 支持两种鉴权方式,API Key 鉴权(简单方便),与 Access Key 鉴权(传统云上资源权限管控,可以分资源组云产品等维度管理,面向企业精细化管理)。 ## API Key 签名鉴权 ### 前提条件 > **说明** > > 方舟平台的新用户?获取 API Key 及 开通模型等准备工作,请参见 [快速入门](/docs/quick-start)。 ### 签名构造 在 HTTP 请求 header 中按如下方式添加 `Authorization` header: ```Bash Authorization: Bearer $ARK_API_KEY ``` 示例如下 ```Bash curl https://ark.cn-beijing.volces.com/api/v3/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "messages": [ { "role": "system", "content": "You are a helpful assistant." }, { "role": "user", "content": "Hello!" } ] }' ``` * 可按需替换 Model ID。查询 Model ID见 [模型列表](/docs/model-list)。 ## Access Key 签名鉴权 ### 前提条件 你已获取到Access Key。如需创建/查看Access Key,请参见 [API访问密钥管理](https://docs.volcengine.com/docs/6257/64983?lang=zh)。 > 由于主账号的Access Key拥有较大权限,建议你创建IAM用户并授予方舟等权限,然后使用IAM用户的 Access Key 来进行操作,具体请参见[使用 IAM 管理权限](/docs/use-iam-to-manage-permissions)。 ### 使用示例 见 [使用Access Key鉴权](/docs/sdk-common-examples#fa44b913)。 > 通过Access Key 鉴权,model 字段 需配置为 Endpoint ID。 # 管控面 API 鉴权 管控面的API,如管理API Key、管理推理接入点等接口。 ## Access Key 签名鉴权 获取Access Key。如需创建/查看Access Key,请参见 [API访问密钥管理](https://docs.volcengine.com/docs/6257/64983?lang=zh)。 ### 方法:使用示例/说明(简单,推荐) 参见 [SDK 接入指南](https://api.volcengine.com/api-sdk/view?serviceCode=ark&version=2024-01-01&language=Java)。 ### 方法:自行实现签名(实现成本高,不推荐) 1. 使用 Access Key 构造签名。具体方法请参见 [签名方法](https://docs.volcengine.com/docs/6369/67269?lang=zh)。 > 签名用到的方舟相关字段信息: > * Service:`ark` > * Region:`cn-beijing` 2. 使用cURL发起请求,请求示例如下: ```Bash curl -X POST \ 'https://ark.cn-beijing.volcengineapi.com/?Action=ListEndpoints&Version=2024-01-01' \ -H 'Authorization: HMAC-SHA256 Credential=AKL**/20240710/cn-beijing/ark/request, SignedHeaders=host;x-content-sha256;x-date, Signature=a7a****' \ -H 'Content-Type: application/json' \ -H 'Host: ark.cn-beijing.volcengineapi.com' \ -H 'X-Content-Sha256: 44***' \ -H 'X-Date: 20240710T042925Z' \ -d '{}' ``` --- # 对话(Chat) API Source: https://ark.volcengine.com/region:cn-beijing/docs/chat-api `POST https://ark.cn-beijing.volces.com/api/v3/chat/completions` 发送包含文本、图片、视频、音频等模态的消息列表,模型将生成对话中的下一条消息。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * 【推荐】API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 * 【可选】Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。 --- ## 请求参数 ### Body 参数 **messages** `object[]` `必选` | 消息列表 不同模型支持不同类型的消息,如文本、图片、视频、音频等 系统消息 `object` 系统消息,模型需遵循的指令,包括扮演的角色、背景信息等。 **content** `string / object[]` `必选` | 消息内容 `messages.content` 系统消息的内容,支持纯文本或多模态内容 纯文本 `string` 纯文本内容 多模态内容 `object[]` 多模态内容,支持文本、图片、视频、音频等模态内容。 文本信息 `object` 文本部分,多模态消息中文本模态的部分。 **text** `string` `必选` | 文本内容 `messages.content.text` 文本模态部分的内容 **type** `string` `必选` | 类型 `messages.content.type` 内容模态类型,此处固定为 `text` 图片信息 `object` 图片部分 **image_url** `object` `必选` | 图片内容 `messages.content.image_url` 图片模态的内容。 图片输入支持**file_id、url**两个字段,需二选一传入。具体使用请参见 [图片理解说明](/docs/image-understanding) **detail** `string` | 图片解析粒度 `messages.content.image_url.detail` 图片解析粒度。 理解图片的精细度、不同模型默认取值及对应的具体像素区间,参见 [控制图片理解的精细度](/docs/image-understanding#bf4d9224)。可选值:`low`、`high`、`xhigh`。 **file_id** `string` | 文件 ID `messages.content.image_url.file_id` 文件 ID。 * 文件 ID 是通过 [Files API](/docs/upload-files-api)上传文件后返回的 id。 * **file_id** 对应的文件类型需要和 **type** 保持一致,且文件状态需要为**active**。 * **API Key** 所属项目与 **file_id** 上传时所属项目需保持一致 **image_pixel_limit** `object` `默认值 null` | 图片像素限制 `messages.content.image_url.image_pixel_limit` 输入给模型的图片的像素范围,如不在此范围,图片会被等比例缩放至该范围。 * 生效优先级:高于 **detail** 字段,即同时配置 **detail** 与 **image_pixel_limit** 字段时,生效 **image_pixel_limit** 字段配置。 * 默认生效规则:若未设置**image_pixel_limit**,则使用 **detail** 配置的值对应的 **min_pixels** / **max_pixels** 值。 > **注意** > > 图片像素范围需在 [196, 36,000,000],否则会直接报错。 **max_pixels** `integer` | 最大像素 `messages.content.image_url.image_pixel_limit.max_pixels` 传入图片最大像素限制,大于此像素则等比例缩小至 `max_pixels` 字段取值以下。若未设置,则取值为 `detail` 配置的值对应的 `max_pixels` 值。 **最大值**:`9031680` **min_pixels** `integer` | 最小像素 `messages.content.image_url.image_pixel_limit.min_pixels` 传入图片最小像素限制,小于此像素则等比例放大至 `min_pixels` 字段取值以上。若未设置,则取值为 `detail` 配置的值对应的 `min_pixels` 值。 **最小值**:`1764` **url** `string` | 资源 URL `messages.content.image_url.url` 发给模型的图片 URL。支持格式如下: * 图片链接 * 图片的 Base64 编码 **type** `string` `必选` | 类型 `messages.content.type` 内容模态类型,此处固定为 `image_url` 视频信息 `object` 视频部分 **type** `string` `必选` | 类型 `messages.content.type` 内容模态类型,此处固定为 `video_url` **video_url** `object` `必选` | 视频内容 `messages.content.video_url` 视频消息的内容部分。 视频输入支持**file_id、url**两个字段,需二选一传入。具体使用请参见 [视频理解说明](/docs/video-understanding) **file_id** `string` | 文件 ID `messages.content.video_url.file_id` 文件 ID。 * 文件 ID 是通过 [Files API](/docs/upload-files-api)上传文件后返回的 id。 * **file_id** 对应的文件类型需要和 **type** 保持一致,且文件状态需要为**active**。 * **API Key** 所属项目与 **file_id** 上传时所属项目需保持一致 **fps** `number` `默认值 1.0` | 视频帧率 `messages.content.video_url.fps` 抽帧频率,详见 [视频理解](/docs/video-understanding)。 * 取值越高,对视频中画面变化越敏感。 * 取值越低,对视频中画面变化越迟钝,但 token 花费少,速度更快。 **取值范围**:`[0.2, 5]` **url** `string` | 资源 URL `messages.content.video_url.url` 发给模型的视频 URL。支持格式如下: * 视频链接 * 视频的 Base64 编码 音频信息 `object` 音频部分 **input_audio** `object` `必选` | 音频内容 `messages.content.input_audio` 音频模态的内容。 音频输入支持**file_id、url、data**三个字段,需三选一传入。具体使用请参见 [音频理解](/docs/audio-understanding) > **注意** > > * 文件大小不超过 25 MB。 > * 单次请求音频总时长不超过 120 分钟,仅统计纯音频时长,视频内嵌音频不计入统计。 > * 详细说明请参见 [音频理解](/docs/audio-understanding)。 **data** `string` | 音频数据 `messages.content.input_audio.data` 音频内容的 Base64 编码 **file_id** `string` | 文件 ID `messages.content.input_audio.file_id` 文件 ID。 * 文件 ID 是通过 [Files API](/docs/upload-files-api)上传文件后返回的 id。 * **file_id** 对应的文件类型需要和 **type** 保持一致,且文件状态需要为**active**。 * **API Key** 所属项目与 **file_id** 上传时所属项目需保持一致 **format** `string` | 音频格式 `messages.content.input_audio.format` 音频格式。当使用 **data** 时,该参数必填。支持的音频格式 `MIME` 类型如下: 纯音频格式: * mp3:`audio/mpeg` * wav:`audio/wav` * aac:`audio/aac` * m4a:`audio/mp4` 视频内嵌音频格式: * mp3:`audio/mpeg` * wav:`audio/wav` * aac:`audio/aac` * m4a:`audio/mp4` * pcm:`audio/L16` * ac3:`audio/ac3` * alac:`audio/mp4` **url** `string` | 资源 URL `messages.content.input_audio.url` 音频内容的 URL **type** `string` `必选` | 类型 `messages.content.type` 内容模态类型,此处固定为 `input_audio` 文件信息 `object` 文件部分 **file** `object` `必选` | 文件内容 `messages.content.file` 文件模态的内容,当前仅支持 PDF 文件。 文件输入支持**file_id、file_data、file_url**三个字段,需三选一传入。多模态理解示例见 [文档理解](/docs/document-understanding) > **说明** > > 文档理解详细说明请参见 [文档理解](/docs/document-understanding)。 **file_data** `string` | 文件数据 `messages.content.file.file_data` 文件内容的 Base64 编码。单个文件大小要求不超过 50 MB **file_id** `string` | 文件 ID `messages.content.file.file_id` 文件 ID。 * 文件 ID 是通过 [Files API](/docs/upload-files-api)上传文件后返回的 id。 * **file_id** 对应的文件类型需要和 **type** 保持一致,且文件状态需要为**active**。 * **API Key** 所属项目与 **file_id** 上传时所属项目需保持一致 **file_url** `string` | 资源 URL `messages.content.file.file_url` 文件的可访问 URL。对应文件的大小要求不超过 50 MB **filename** `string` | 文件名 `messages.content.file.filename` 文件名。当使用 **file_data** 时该参数必填 **type** `string` `必选` | 类型 `messages.content.type` 消息模态,此处固定为 `file` **role** `string` `必选` | 角色 `messages.role` 发送消息的角色 取值固定为 `system`。 **name** `string` | 参与者名称 `messages.name` 参与者名称,帮助模型区分不同的参与者 用户消息 `object` 用户消息,用户角色发送的消息。不同模型支持的字段类型不同。 **role** `string` `必选` | 角色 `messages.role` 发送消息的角色 取值固定为 `user`。 **content** `string / object[]` | 消息内容 `messages.content` 用户消息的内容,支持纯文本或多模态内容。省略、传入 `null` 或传入空内容时,服务端会按空字符串处理。 纯文本 `string` 纯文本内容 多模态内容 `object[]` 多模态内容,支持文本、图片、视频、音频等模态内容。 文本信息 `object` 文本部分,多模态消息中文本模态的部分。 **text** `string` `必选` | 文本内容 `messages.content.text` 文本模态部分的内容 **type** `string` `必选` | 类型 `messages.content.type` 内容模态类型,此处固定为 `text` 图片信息 `object` 图片部分 **image_url** `object` `必选` | 图片内容 `messages.content.image_url` 图片模态的内容。 图片输入支持**file_id、url**两个字段,需二选一传入。具体使用请参见 [图片理解说明](/docs/image-understanding) **detail** `string` | 图片解析粒度 `messages.content.image_url.detail` 图片解析粒度。 理解图片的精细度、不同模型默认取值及对应的具体像素区间,参见 [控制图片理解的精细度](/docs/image-understanding#bf4d9224)。可选值:`low`、`high`、`xhigh`。 **file_id** `string` | 文件 ID `messages.content.image_url.file_id` 文件 ID。 * 文件 ID 是通过 [Files API](/docs/upload-files-api)上传文件后返回的 id。 * **file_id** 对应的文件类型需要和 **type** 保持一致,且文件状态需要为**active**。 * **API Key** 所属项目与 **file_id** 上传时所属项目需保持一致 **image_pixel_limit** `object` `默认值 null` | 图片像素限制 `messages.content.image_url.image_pixel_limit` 输入给模型的图片的像素范围,如不在此范围,图片会被等比例缩放至该范围。 * 生效优先级:高于 **detail** 字段,即同时配置 **detail** 与 **image_pixel_limit** 字段时,生效 **image_pixel_limit** 字段配置。 * 默认生效规则:若未设置**image_pixel_limit**,则使用 **detail** 配置的值对应的 **min_pixels** / **max_pixels** 值。 > **注意** > > 图片像素范围需在 [196, 36,000,000],否则会直接报错。 **max_pixels** `integer` | 最大像素 `messages.content.image_url.image_pixel_limit.max_pixels` 传入图片最大像素限制,大于此像素则等比例缩小至 `max_pixels` 字段取值以下。若未设置,则取值为 `detail` 配置的值对应的 `max_pixels` 值。 **最大值**:`9031680` **min_pixels** `integer` | 最小像素 `messages.content.image_url.image_pixel_limit.min_pixels` 传入图片最小像素限制,小于此像素则等比例放大至 `min_pixels` 字段取值以上。若未设置,则取值为 `detail` 配置的值对应的 `min_pixels` 值。 **最小值**:`1764` **url** `string` | 资源 URL `messages.content.image_url.url` 发给模型的图片 URL。支持格式如下: * 图片链接 * 图片的 Base64 编码 **type** `string` `必选` | 类型 `messages.content.type` 内容模态类型,此处固定为 `image_url` 视频信息 `object` 视频部分 **type** `string` `必选` | 类型 `messages.content.type` 内容模态类型,此处固定为 `video_url` **video_url** `object` `必选` | 视频内容 `messages.content.video_url` 视频消息的内容部分。 视频输入支持**file_id、url**两个字段,需二选一传入。具体使用请参见 [视频理解说明](/docs/video-understanding) **file_id** `string` | 文件 ID `messages.content.video_url.file_id` 文件 ID。 * 文件 ID 是通过 [Files API](/docs/upload-files-api)上传文件后返回的 id。 * **file_id** 对应的文件类型需要和 **type** 保持一致,且文件状态需要为**active**。 * **API Key** 所属项目与 **file_id** 上传时所属项目需保持一致 **fps** `number` `默认值 1.0` | 视频帧率 `messages.content.video_url.fps` 抽帧频率,详见 [视频理解](/docs/video-understanding)。 * 取值越高,对视频中画面变化越敏感。 * 取值越低,对视频中画面变化越迟钝,但 token 花费少,速度更快。 **取值范围**:`[0.2, 5]` **url** `string` | 资源 URL `messages.content.video_url.url` 发给模型的视频 URL。支持格式如下: * 视频链接 * 视频的 Base64 编码 音频信息 `object` 音频部分 **input_audio** `object` `必选` | 音频内容 `messages.content.input_audio` 音频模态的内容。 音频输入支持**file_id、url、data**三个字段,需三选一传入。具体使用请参见 [音频理解](/docs/audio-understanding) > **注意** > > * 文件大小不超过 25 MB。 > * 单次请求音频总时长不超过 120 分钟,仅统计纯音频时长,视频内嵌音频不计入统计。 > * 详细说明请参见 [音频理解](/docs/audio-understanding)。 **data** `string` | 音频数据 `messages.content.input_audio.data` 音频内容的 Base64 编码 **file_id** `string` | 文件 ID `messages.content.input_audio.file_id` 文件 ID。 * 文件 ID 是通过 [Files API](/docs/upload-files-api)上传文件后返回的 id。 * **file_id** 对应的文件类型需要和 **type** 保持一致,且文件状态需要为**active**。 * **API Key** 所属项目与 **file_id** 上传时所属项目需保持一致 **format** `string` | 音频格式 `messages.content.input_audio.format` 音频格式。当使用 **data** 时,该参数必填。支持的音频格式 `MIME` 类型如下: 纯音频格式: * mp3:`audio/mpeg` * wav:`audio/wav` * aac:`audio/aac` * m4a:`audio/mp4` 视频内嵌音频格式: * mp3:`audio/mpeg` * wav:`audio/wav` * aac:`audio/aac` * m4a:`audio/mp4` * pcm:`audio/L16` * ac3:`audio/ac3` * alac:`audio/mp4` **url** `string` | 资源 URL `messages.content.input_audio.url` 音频内容的 URL **type** `string` `必选` | 类型 `messages.content.type` 内容模态类型,此处固定为 `input_audio` 文件信息 `object` 文件部分 **file** `object` `必选` | 文件内容 `messages.content.file` 文件模态的内容,当前仅支持 PDF 文件。 文件输入支持**file_id、file_data、file_url**三个字段,需三选一传入。多模态理解示例见 [文档理解](/docs/document-understanding) > **说明** > > 文档理解详细说明请参见 [文档理解](/docs/document-understanding)。 **file_data** `string` | 文件数据 `messages.content.file.file_data` 文件内容的 Base64 编码。单个文件大小要求不超过 50 MB **file_id** `string` | 文件 ID `messages.content.file.file_id` 文件 ID。 * 文件 ID 是通过 [Files API](/docs/upload-files-api)上传文件后返回的 id。 * **file_id** 对应的文件类型需要和 **type** 保持一致,且文件状态需要为**active**。 * **API Key** 所属项目与 **file_id** 上传时所属项目需保持一致 **file_url** `string` | 资源 URL `messages.content.file.file_url` 文件的可访问 URL。对应文件的大小要求不超过 50 MB **filename** `string` | 文件名 `messages.content.file.filename` 文件名。当使用 **file_data** 时该参数必填 **type** `string` `必选` | 类型 `messages.content.type` 消息模态,此处固定为 `file` **name** `string` | 参与者名称 `messages.name` 参与者名称,帮助模型区分不同的参与者 模型消息 `object` 模型消息,历史对话中模型角色返回的消息。用以保持对话一致性,多在 [多轮对话](/docs/text-generation#f6222fec)及 [续写模式](/docs/continuation-mode)使用。 **role** `string` `必选` | 角色 `messages.role` 发送消息的角色 取值固定为 `assistant`。 **content** `string` | 消息内容 `messages.content` 模型消息的内容。省略、传入 `null` 或传入空内容时,服务端会按空字符串处理。 **encrypted_content** `string` | 加密思考内容 `messages.encrypted_content` 思考内容加密原文。经加密及压缩处理后的思考内容加密原文。 在支持的模型调用时,必须回传思考内容加密原文,保证模型推理效果。 相关文档: * [关键规则](/docs/agent-model-invocation-practice#key-rules) * [回传思考内容加密块使用示例](/docs/agent-model-invocation-practice#encrypted-thinking-block-examples) > **注意** > > * 回传 `encrypted_content` 内容需有效,篡改或无法还原时返回错误:`Invalid signature`。 > * `encrypted_content` 优先级高于 `reasoning_content`,回传 `encrypted_content` 时,将忽略 `reasoning_content` 内容。 **模型支持**: * `doubao-seed-2-0-lite-260428 及后续版本` **name** `string` | 参与者名称 `messages.name` 参与者名称,帮助模型区分不同的参与者 **reasoning_content** `string` | 思维链内容 `messages.reasoning_content` 模型消息中思维链内容。 **模型支持**: * `seed 系列模型` * `deepseek-v4-pro` * `deepseek-v4-flash` **tool_calls** `object[]` | 工具调用 `messages.tool_calls` 模型消息中工具调用部分 **function** `object` `必选` | 函数信息 `messages.tool_calls.function` 模型生成的工具调用函数信息。 **arguments** `string` `必选` | 函数参数 `messages.tool_calls.function.arguments` 模型生成的用于调用函数的参数,JSON 格式。 模型并不总是生成有效的 JSON,并且可能会虚构出一些您的函数参数规范中未定义的参数。在调用函数之前,请在您的代码中验证这些参数是否有效 **name** `string` `必选` | 函数名 `messages.tool_calls.function.name` 模型调用的函数名称 **type** `string` `必选` | 类型 `messages.tool_calls.type` 工具类型,当前仅支持 `function`。 **id** `string` | 工具调用 ID `messages.tool_calls.id` 历史模型消息中的工具调用 ID,用于与后续工具消息的 `tool_call_id` 关联。省略或传入 `null` 时,服务端会按空字符串处理。 工具消息 `object` 工具消息,历史对话中调用工具返回的消息。工具调用场景中使用。 **role** `string` `必选` | 角色 `messages.role` 发送消息的角色 取值固定为 `tool`。 **content** `string` | 消息内容 `messages.content` 工具返回的消息。省略或传入 `null` 时,服务端会按空字符串处理。 **name** `string` | 参与者名称 `messages.name` 参与者名称,帮助模型区分不同的参与者 **tool_call_id** `string` | 工具调用 ID `messages.tool_call_id` 工具结果关联的工具调用 ID。取值对应历史模型消息中 `tool_calls.id` 的值,用于让服务端将工具返回结果匹配到对应的工具调用。省略或传入 `null` 时,服务端会按空字符串处理。 **model** `string` `必选` | 模型 ID 调用的模型 ID(Model ID)。[开通模型服务](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&OpenTokenDrawer=false) 后可 [查询 Model ID](/docs/model-list)。 多个应用及精细管理场景,推荐使用推理接入点 ID 调用,详细请参考 [获取 Endpoint ID](/docs/online-inference-standard)。 **frequency_penalty** `number` `默认值 0.0` | 频率惩罚系数 如值为正,根据新 token 在文本中的出现频率对其进行惩罚,从而降低模型逐字重复的可能性。 > **注意** > > * doubao-seed-2.0 及后续系列、deepseek-v4.1-flash 都不支持该参数。 > * deepseek-v4-pro、deepseek-v4-flash 在思考模式下也不支持该参数。 > * glm-5.3-flash 支持该参数。 **取值范围**:`[-2.0, 2.0]` **logit_bias** `object` `默认值 null` | Token 偏差 调整指定 token 在模型输出内容中出现的概率,使模型生成的内容更加符合特定的偏好。 `logit_bias` 接受一个 map。每个键为词表中的 token ID(可通过 tokenization 接口获取),每个值为该 token 的偏差值: * 负值降低选择该 token 的可能性;`-100` 会完全禁止选择该 token。 * 正值增加选择该 token 的可能性;`100` 会导致仅可选择该 token。 示例:`{"": -100}`。该参数的实际效果可能因模型而异。 > **注意** > > 带深度思考能力模型不支持该字段,即 [模型列表](/docs/model-list#32e9e053)中能力标签含"深度思考"的模型。 **取值范围**:`[-100, 100]` **logprobs** `boolean` `默认值 false` | 返回对数概率 是否返回输出 tokens 的对数概率。 * `false`:不返回对数概率信息。 * `true`:返回消息内容中每个输出 token 的对数概率。 > [深度思考能力模型](/docs/model-list)不支持该字段。其中,`deepseek-v4-1-flash-261017`、`deepseek-v4-1-flash-260910`、`deepseek-v4-1-flash-economy-261017`、`deepseek-v4-pro-ga-260813`、`deepseek-v4-flash-ga-260731` 支持该字段。 **max_completion_tokens** `integer` | 最大输出长度 控制模型输出的最大长度(包括模型回答和模型思维链内容长度,单位 token)。 配置了该参数后,可以让模型输出超长内容,`max_tokens` 默认值失效,模型按需输出内容(回答和思维链),直到达到 `max_completion_tokens` 值。 不可与 `max_tokens` 字段同时设置。 > **注意** > > `deepseek-v4-1-flash-261017`、`deepseek-v4-1-flash-260910`、`deepseek-v4-1-flash-economy-261017` 模型该字段默认值 128k。支持该字段的模型及使用说明见 [文档](/docs/deep-thinking)。 **取值范围**:`[1, 65536]` **max_tokens** `integer` `默认值 4096` | 最大回答长度 模型回答最大长度(单位 token)。取值范围各个模型不同,详细见 [模型列表](/docs/model-list)。 > **说明** > > * `deepseek-v4-1-flash-261017`、`deepseek-v4-1-flash-260910`、`deepseek-v4-1-flash-economy-261017`:`max_tokens` 控制模型回答和模型思维链内容长度,超出长度后不报错,默认取值 128k。 > * 除上述模型的其他模型:`max_tokens` 控制模型回答长度,不包含思维链内容,模型回答 = 模型输出 - 模型思维链(如有) > * 输出 token 的总长度还受模型的上下文长度限制。 **parallel_tool_calls** `boolean` `默认值 true` | 并行工具调用 本次请求,模型返回是否允许包含多个待调用的工具。 * `true`:允许返回多个待调用的工具。 * `false`:允许返回的待调用的工具小于等于 1。 **presence_penalty** `number` `默认值 0.0` | 存在惩罚系数 如果值为正,会根据新 token 到目前为止是否出现在文本中对其进行惩罚,从而增加模型谈论新主题的可能性。 > **注意** > > * doubao-seed-2.0 及后续系列、deepseek-v4.1-flash 都不支持该参数。 > * deepseek-v4-pro、deepseek-v4-flash 在思考模式下也不支持该参数。 > * glm-5.3-flash 支持该参数。 **取值范围**:`[-2.0, 2.0]` **prompt_cache_key** `string` | 缓存路由标识 用于提升隐式缓存命中率的缓存路由标识。取值相同的请求会优先路由到缓存命中率更高的服务,从而提升隐式缓存命中率。 **reasoning_effort** `string` | 思考深度 限制思考的工作量。减少思考深度可提升速度,思考花费的 token 更少。 * `none`:关闭思考。 * `minimal`:关闭思考,直接回答。 * `low`:轻量思考,侧重快速响应。 * `medium`:均衡模式,兼顾速度与深度。 * `high`:深度分析,处理复杂问题。 * `xhigh`:更高程度思考。 * `max`:最高程度思考,适配高难度推理任务。 > **注意:说明** > > 支持该字段的模型、默认取值、参数兼容映射规则,以及与 `thinking.type` 字段的关系,详见 [文档](/docs/deep-thinking)。 **response_format** `object` | 回答格式 指定模型回答格式。默认值:`{"type": "text"}` > **注意** > > * 支持该字段的模型请参见 [文档](/docs/structured-output-beta#3aae5325)。 > * 该能力尚在 beta 阶段,请谨慎在生产环境使用。 **json_schema** `object` | Schema 配置 `response_format.json_schema` JSON 结构体的定义 **name** `string` `必选` | Schema 名称 `response_format.json_schema.name` JSON Schema 的名称,用于标识本次响应格式 **schema** `object` `必选` | Schema 定义 `response_format.json_schema.schema` 回答格式的 JSON Schema 定义 **description** `string` | 描述 `response_format.json_schema.description` 回答用途说明,模型据此判断如何按该格式生成回答 **strict** `boolean` `默认值 false` | 严格模式 `response_format.json_schema.strict` 是否在生成输出时,启用严格遵循模式。 - `true`:模型将始终严格遵循 `schema` 字段中定义的格式。 - `false`:模型会尽可能遵循 `schema` 字段中定义的结构。 **type** `string` | 类型 `response_format.type` 回答格式类型。可选值:`text`、`json_schema`、`json_object`。 **service_tier** `string` | 推理模式 控制使用的在线推理模式。 * `fast`:本次请求优先使用 [在线推理(低延迟)](/docs/online-inference-low-latency) 模式。 * 推理接入点(`model` 字段指定)有低延迟限流配额,本次请求将会优先使用低延迟限流配额,获得更高的服务等级(延迟、可用性等)。 * 推理接入点无低延迟限流配额,或者限流配额已满,降级至 **在线推理(常规)** 模式,维持常规的服务等级。 * `auto`:本次请求优先使用 [在线推理(TPM 保障包)](/docs/tpm-guarantee-package) 模式。 * 推理接入点有 TPM 保障包额度,本次请求将会优先使用 TPM 保障包额度,获得最高的服务等级。 * 推理接入点无 TPM 保障包额度或用超额度,降级至 **在线推理(常规)** 模式,维持常规的服务等级。 * `default`:本次请求只使用 [在线推理(常规)](/docs/online-inference-standard) 模式,维持常规的服务等级。 * 即使调用的推理接入点有 TPM 保障包额度 / 低延迟限流额度,也只使用在线推理(常规)模式。 * `flex`:本次请求使用 [在线推理(低优)](/docs/online-inference-flex) 模式。 **stop** `string / string[]` `默认值 null` | 停止词 模型遇到 `stop` 字段所指定的字符串时将停止继续生成,这个词语本身不会输出。 * 默认最多支持 `4` 个停止词。 * `deepseek-v4-1-flash-261017`、`deepseek-v4-1-flash-260910`、`deepseek-v4-1-flash-economy-261017`、`deepseek-v4-pro-ga-260813`、`deepseek-v4-flash-ga-260731` 最多支持 `16` 个停止词。 示例:`["你好", "天气"]`。 > [深度思考能力模型](/docs/model-list#32e9e053)默认不支持该字段;上述 DeepSeek V4 模型除外。 **stream** `boolean` `默认值 false` | 流式返回 响应内容是否流式返回。 * `false`:模型生成完所有内容后一次性返回结果。 * `true`:按 SSE 协议逐块返回模型生成内容,并以一条 `data: [DONE]` 消息结束。当 `stream` 为 `true` 时,可设置 `stream_options` 字段以获取 token 用量统计信息。 **stream_options** `object` `默认值 null` | 流式选项 流式响应的选项。当 `stream` 为 `true` 时,可设置本字段。 **chunk_include_usage** `boolean` `默认值 false` | 逐块用量信息 `stream_options.chunk_include_usage` 模型流式输出时,输出的每个 chunk 中是否输出本次请求到此 chunk 输出时刻的累计 token 用量信息。 * `true`:在返回的 `usage` 字段中,输出本次请求到此 chunk 输出时刻的累计 token 用量。 * `false`:不在每个 chunk 都返回 token 用量信息。 **include_usage** `boolean` `默认值 false` | 输出用量信息 `stream_options.include_usage` 模型流式输出时,是否在输出结束前输出本次请求的 token 用量信息。 * `true`:在 `data: [DONE]` 消息之前会返回一个额外的 chunk。此 chunk 中,`usage` 字段中输出整个请求的 token 用量,`choices` 字段为空数组。 * `false`:输出结束前,没有一个 chunk 来返回 token 用量信息。 > **说明** > > `deepseek-v4-1-flash-261017`、`deepseek-v4-1-flash-economy-261017` 模型不支持通过该参数控制用量信息的返回方式。上述模型默认在带有 `finish_reason` 的 chunk 中返回本次请求的 `usage` 信息,不额外返回独立的用量信息 chunk。 **temperature** `number` `默认值 1.0` | 采样温度 控制了生成文本时对每个候选词的概率分布进行平滑的程度。当取值为 0 时模型仅考虑对数概率最大的一个 token。 较高的值(如 0.8)会使输出更加随机,而较低的值(如 0.2)会使输出更加集中确定。 通常建议仅调整 `temperature` 或 `top_p` 其中之一,不建议两者都修改。 > **注意** > > 调用下列模型时字段取值固定为 `1`,手动指定的参数值将被忽略: > > * `doubao-seed-2-0-pro-260215` > * `doubao-seed-2-0-lite-260215` **取值范围**:`[0, 2]` **thinking** `object` | 深度思考开关 控制模型是否开启深度思考模式。 > **注意** > > 不同模型是否支持以及默认取值不同,详情请查询 [文档](/docs/deep-thinking#14b5c6db)。 **type** `string` | 类型 `thinking.type` 控制模型是否开启思考模式。 * `enabled`:开启思考模式,模型强制先思考再回答。 * `disabled`:关闭思考模式,模型直接回答问题,不进行思考。 * `auto`:自动思考模式,模型根据问题自主判断是否需要思考,简单题目直接回答。 **tool_choice** `string / object` | 工具调用控制 本次请求,模型返回信息中是否有待调用的工具。 * `none`:模型不会调用工具,直接生成消息。当没有指定工具时,`none` 是默认值。 * `auto`:模型可以选择生成消息或调用工具。如果存在工具,则 `auto` 是默认值。 * `required`:模型必须调用一个或多个工具。 您也可以通过设置 `tool_choice` 为 object 类型,来强制模型调用指定工具。 枚举值 `string` 控制模型返回是否包含待调用的工具。 * `none`:模型返回信息中不可含有待调用的工具。 * `required`:模型返回信息中必须含待调用的工具。选择此项时请确认存在适合的工具,以减少模型产生幻觉的情况。 * `auto`:模型自行判断返回信息是否有待调用的工具。 指定工具 `object` 指定待调用工具的范围。模型返回信息中,只允许包含以下模型信息。 选择此项时请确认该工具适合用户需求,以减少模型产生幻觉的情况。 **function** `object` `必选` | 函数信息 `tool_choice.function` 调用工具的信息 **name** `string` `必选` | 函数名 `tool_choice.function.name` 要调用的函数名称 **type** `string` `必选` | 类型 `tool_choice.type` 调用的类型,此处应为 `function` **tools** `object[]` `默认值 null` | 工具列表 待调用工具的列表,模型返回信息中可包含。 当您需要让模型返回待调用工具时,需要配置该结构体。支持该字段的模型请参见 [文档](/docs/model-list#f44ceef7)。 **function** `object` `必选` | 函数信息 `tools.function` 模型返回中可包含待调用的工具 **name** `string` `必选` | 函数名 `tools.function.name` 工具(函数)名称,供模型识别与调用 **description** `string` | 描述 `tools.function.description` 调用的函数的描述,大模型会使用它来判断是否调用这个工具 **parameters** `object` | 参数定义 `tools.function.parameters` 函数请求参数,以 JSON Schema 格式描述。具体格式请参考 [JSON Schema](https://json-schema.org/understanding-json-schema) 文档。 格式如下: ```JSON { "type": "object", "properties": { "参数名": { "type": "string | number | boolean | object | array", "description": "参数说明" } }, "required": ["必填参数"] } ``` 使用要点:所有字段名大小写敏感;`parameters` 须是合规的 JSON Schema 对象;建议用英文字段名,中文置于 `description` 字段中。 **strict** `boolean` | 严格模式 `tools.function.strict` 是否启用严格的 Schema 校验,确保模型生成的函数调用参数严格符合 `parameters` 定义。 **type** `string` `必选` | 类型 `tools.type` 工具类型,此处应为 `function` **top_logprobs** `integer` `默认值 0` | 返回概率数量 指定每个输出 token 位置最有可能返回的 token 数量,每个 token 都有关联的对数概率。 > **注意** > > * 仅当 `logprobs=true` 时可以设置本参数。 > * [深度思考能力模型](/docs/model-list)不支持该字段。其中,`deepseek-v4-1-flash-261017`、`deepseek-v4-1-flash-260910`、`deepseek-v4-1-flash-economy-261017`、`deepseek-v4-pro-ga-260813`、`deepseek-v4-flash-ga-260731` 支持该字段。 **取值范围**:`[0, 20]` **top_p** `number` `默认值 0.7` | 核采样阈值 核采样概率阈值。模型会考虑概率质量在 `top_p` 内的 token 结果。 当取值为 0 时模型仅考虑对数概率最大的一个 token。0.1 意味着只考虑概率质量最高的前 10% 的 token,取值越大生成的随机性越高,取值越低生成的确定性越高。 通常建议仅调整 `temperature` 或 `top_p` 其中之一,不建议两者都修改。 > **注意** > > * 调用下列模型时字段取值固定为 `0.95`,手动指定的参数值将被忽略: > * `doubao-seed-2-0-pro-260215` > * `doubao-seed-2-0-lite-260215` > * `glm-5-3-flash-260828` 模型默认值为 0.95。 > * `deepseek-v4-1-flash-261017`、`deepseek-v4-1-flash-260910`、`deepseek-v4-1-flash-economy-261017` 模型 top_p 参数取值规则如下: > * 思考模式:参数生效。不传该参数时,使用 tool 时默认值为 0.95,其他情况默认值为 1。 > * 传入值 < 0.95:系统自动提升至 0.95。 > * 传入值 ≥ 0.95:按实际传入值使用。 > * 非思考模式:字段取值固定为 1.0,传入的值将被忽略。 **取值范围**:`[0, 1]` ## 响应参数 ### 非流式调用响应 **choices** `object[]` | 生成结果 本次请求的模型输出内容 **finish_reason** `string` | 结束原因 `choices.finish_reason` 模型停止生成 token 的原因。 * `stop`:模型输出自然结束,或因命中请求参数 `stop` 中指定的字段而被截断。 * `length`:模型输出因达到模型输出限制而被截断,有以下原因: * 触发 `max_tokens` 限制(回答内容的长度限制)。 * 触发 `max_completion_tokens` 限制(思维链内容 + 回答内容的长度限制)。 * 触发 `context_window` 限制(输入内容 + 思维链内容 + 回答内容的长度限制)。 * `content_filter`:模型输出被内容审核拦截。 * `tool_calls`:模型调用了工具。 **index** `integer` | 序号 `choices.index` 当前元素在 **choices** 列表的索引 **logprobs** `object` | 选项对数概率详情 `choices.logprobs` 当前内容的对数概率信息 **content** `object[]` | 消息内容 `choices.logprobs.content` message 列表中每个 content 元素中的 token 对数概率信息 **bytes** `integer[]` | 字节 `choices.logprobs.content.bytes` 当前 token 的 UTF-8 值,格式为整数列表。当一个字符由多个 token 组成(表情符号或特殊字符等)时可以用于字符的编码和解码。如果 token 没有 UTF-8 值则为空 **logprob** `number` | 对数概率值 `choices.logprobs.content.logprob` 当前 token 的对数概率 **token** `string` | Token `choices.logprobs.content.token` 当前 token **top_logprobs** `object[]` | 候选概率 `choices.logprobs.content.top_logprobs` 在当前 token 位置最有可能的标记及其对数概率的列表。在一些情况下,返回的数量可能比请求参数 top_logprobs 指定的数量要少 **bytes** `integer[]` | 字节 `choices.logprobs.content.top_logprobs.bytes` 当前 token 的 UTF-8 值,格式为整数列表。当一个字符由多个 token 组成(表情符号或特殊字符等)时可以用于字符的编码和解码。如果 token 没有 UTF-8 值则为空 **logprob** `number` | 对数概率值 `choices.logprobs.content.top_logprobs.logprob` 当前 token 的对数概率 **token** `string` | Token `choices.logprobs.content.top_logprobs.token` 当前 token **message** `object` | 消息 `choices.message` 模型输出的内容 **content** `string` | 消息内容 `choices.message.content` 模型生成的消息内容 **role** `string` | 角色 `choices.message.role` 内容输出的角色,此处固定为 `assistant` **encrypted_content** `string` | 加密思考内容 `choices.message.encrypted_content` 思考内容加密原文。经加密及压缩处理后的思考内容原文。 相关文档: * [关键规则](/docs/agent-model-invocation-practice#key-rules) * [回传思考内容加密块使用示例](/docs/agent-model-invocation-practice#encrypted-thinking-block-examples) **模型支持**: * `doubao-seed-2-0-lite-260428 及后续版本` **reasoning_content** `string` | 思维链内容 `choices.message.reasoning_content` 模型处理问题的思维链内容。 **模型支持**: * `seed 系列模型` * `deepseek-v4-pro` * `deepseek-v4-flash` **tool_calls** `object[]` | 工具调用 `choices.message.tool_calls` 模型生成的工具调用 **function** `object` | 函数信息 `choices.message.tool_calls.function` 模型调用的函数 **arguments** `string` | 函数参数 `choices.message.tool_calls.function.arguments` 模型生成的用于调用函数的参数,JSON 格式。 模型并不总是生成有效的 JSON,并且可能会虚构出一些您的函数参数规范中未定义的参数。在调用函数之前,请在您的代码中验证这些参数是否有效 **name** `string` | 函数名 `choices.message.tool_calls.function.name` 模型调用的函数名称 **id** `string` | ID `choices.message.tool_calls.id` 模型生成的工具调用 ID。开发者调用工具后,需要在后续工具消息的 `tool_call_id` 中回传该值,用于关联工具返回结果与对应的工具调用。响应中该字段始终返回。 **type** `string` | 类型 `choices.message.tool_calls.type` 工具类型,当前仅支持`function` **moderation_hit_type** `string` | 审核命中类型 `choices.moderation_hit_type` 模型输出文字含有敏感信息时,会返回模型输出文字命中的风险分类标签。 * `severe_violation`:模型输出文字涉及严重违规。 * `violence`:模型输出文字涉及激进行为。 > **说明:注意** > > 注意:当前只有 [视觉理解模型](/docs/image-understanding#f8d6cc48)支持返回该字段,且只有在方舟控制台 [接入点配置页面](https://ark.volcengine.com/region:cn-beijing/endpoint/create?customModelId=) 或者 CreateEndpoint 接口中,将内容护栏方案(ModerationStrategy)设置为基础方案(Basic)时,才会返回风险分类标签。 **created** `integer` | 创建时间 本次请求创建时间的 Unix 时间戳(秒) **id** `string` | 请求 ID 本次请求的唯一标识 **model** `string` | 模型名称 本次请求实际使用的模型名称和版本 **object** `string` | 对象类型 固定为 `chat.completion` **service_status** `object` | 服务状态 本次请求附带的服务状态信息,例如是否触发了模型降级(fallback) **model_fallback** `object` | 模型降级状态 `service_status.model_fallback` 模型降级(fallback)相关的状态信息 **fallback_triggered** `boolean` | 是否触发降级 `service_status.model_fallback.fallback_triggered` 本次请求是否触发了模型降级 **original_model** `string` | 原始模型 `service_status.model_fallback.original_model` 触发降级前,请求最初指定的模型名称 **service_tier** `string` | 推理模式 本次请求实际使用的推理模式。 * `scale`:本次请求使用 [在线推理(TPM 保障包)](/docs/tpm-guarantee-package) 模式。 * `default`:本次请求使用 [在线推理(常规)](/docs/online-inference-standard) 模式。 * `fast`:本次请求使用 [在线推理(低延迟)](/docs/online-inference-low-latency) 模式。 * `flex`:本次请求使用 [在线推理(低优)](/docs/online-inference-flex) 模式。 **usage** `object` | Token 用量 本次请求的 token 用量 **completion_tokens** `integer` | 输出 Token 数 `usage.completion_tokens` 模型输出内容花费的 token **completion_tokens_details** `object` | 输出 Token 明细 `usage.completion_tokens_details` 模型输出内容花费的 token 的细节 **reasoning_tokens** `integer` | 思维链 Token 数 `usage.completion_tokens_details.reasoning_tokens` 输出思维链内容花费的 token 数。 支持输出思维链的模型请参见 [文档](/docs/deep-thinking#14b5c6db) **prompt_tokens** `integer` | 输入 Token 数 `usage.prompt_tokens` 输入给模型处理的内容 token 数量 **prompt_tokens_details** `object` | 输入 Token 明细 `usage.prompt_tokens_details` 输入给模型处理的内容 token 数量的细节 **cached_tokens** `integer` | 缓存命中 Token 数 `usage.prompt_tokens_details.cached_tokens` 缓存命中的输入内容(含文本、音频等所有类型)所消耗的 token 总数 **audio_cached_tokens** `integer` | 音频缓存 Token 数 `usage.prompt_tokens_details.audio_cached_tokens` 缓存命中的音频输入内容所消耗的 token 数量。仅在隐式缓存模式且命中音频缓存时返回;开启显式缓存时该字段不返回。 **audio_tokens** `integer` | 音频 Token 数 `usage.prompt_tokens_details.audio_tokens` 音频输入内容所消耗的 token 数量 **total_tokens** `integer` | 总 Token 数 `usage.total_tokens` 本次请求消耗的总 token 数量(输入 + 输出) ### 流式调用响应 **choices** `object[]` | 生成结果 本次请求的模型输出内容 **delta** `object` | 增量消息 `choices.delta` 模型输出的增量内容 **content** `string` | 消息内容 `choices.delta.content` 模型生成的消息内容 **encrypted_content** `string` | 加密思考内容 `choices.delta.encrypted_content` 思考内容加密原文。经加密及压缩处理后的思考内容原文。 相关文档: * [关键规则](/docs/agent-model-invocation-practice#key-rules) * [回传思考内容加密块使用示例](/docs/agent-model-invocation-practice#encrypted-thinking-block-examples) > **说明** > > 流式输出场景下,将在思考内容输出完成后、正式应答内容输出前,输出包含完整 `encrypted_content` 的数据。其中 `content` 与 `reasoning_content` 字段均为空。 **模型支持**: * `doubao-seed-2-0-lite-260428 及后续版本` **reasoning_content** `string` | 思维链内容 `choices.delta.reasoning_content` 思考内容原文。 自 `doubao-seed-2-0-lite-260428` 版本起,返回思考内容摘要。 > **注意** > > 针对长文本生成、深度推理等耗时场景,建议适当调大首 Token 超时时间(TTFT)与逐 Token 生成超时时间(TPOT),避免请求因超时而中断。 **模型支持**: * `seed 系列模型` * `deepseek-v4-pro` * `deepseek-v4-flash` **role** `string` | 角色 `choices.delta.role` 内容输出的角色,此处固定为 `assistant` **tool_calls** `object[]` | 工具调用 `choices.delta.tool_calls` 模型生成的工具调用 **index** `integer` | 序号 `choices.delta.tool_calls.index` 工具调用在数组中的索引位置 **function** `object` | 函数信息 `choices.delta.tool_calls.function` 模型调用的函数 **arguments** `string` | 函数参数 `choices.delta.tool_calls.function.arguments` 模型生成的用于调用函数的参数,JSON 格式。 模型并不总是生成有效的 JSON,并且可能会虚构出一些您的函数参数规范中未定义的参数。在调用函数之前,请在您的代码中验证这些参数是否有效 **name** `string` | 函数名 `choices.delta.tool_calls.function.name` 模型调用的函数名称 **id** `string` | ID `choices.delta.tool_calls.id` 调用的工具的 ID **type** `string` | 类型 `choices.delta.tool_calls.type` 工具类型,当前仅支持`function` **index** `integer` | 序号 `choices.index` 当前元素在 **choices** 列表的索引 **finish_reason** `string` | 结束原因 `choices.finish_reason` 模型停止生成 token 的原因。 * `stop`:模型输出自然结束,或因命中请求参数 `stop` 中指定的字段而被截断。 * `length`:模型输出因达到模型输出限制而被截断,有以下原因: * 触发 `max_tokens` 限制(回答内容的长度限制)。 * 触发 `max_completion_tokens` 限制(思维链内容 + 回答内容的长度限制)。 * 触发 `context_window` 限制(输入内容 + 思维链内容 + 回答内容的长度限制)。 * `content_filter`:模型输出被内容审核拦截。 * `tool_calls`:模型调用了工具。 **logprobs** `object` | 选项对数概率详情 `choices.logprobs` 当前内容的对数概率信息 **content** `object[]` | 消息内容 `choices.logprobs.content` message 列表中每个 content 元素中的 token 对数概率信息 **bytes** `integer[]` | 字节 `choices.logprobs.content.bytes` 当前 token 的 UTF-8 值,格式为整数列表。当一个字符由多个 token 组成(表情符号或特殊字符等)时可以用于字符的编码和解码。如果 token 没有 UTF-8 值则为空 **logprob** `number` | 对数概率值 `choices.logprobs.content.logprob` 当前 token 的对数概率 **token** `string` | Token `choices.logprobs.content.token` 当前 token **top_logprobs** `object[]` | 候选概率 `choices.logprobs.content.top_logprobs` 在当前 token 位置最有可能的标记及其对数概率的列表。在一些情况下,返回的数量可能比请求参数 top_logprobs 指定的数量要少 **bytes** `integer[]` | 字节 `choices.logprobs.content.top_logprobs.bytes` 当前 token 的 UTF-8 值,格式为整数列表。当一个字符由多个 token 组成(表情符号或特殊字符等)时可以用于字符的编码和解码。如果 token 没有 UTF-8 值则为空 **logprob** `number` | 对数概率值 `choices.logprobs.content.top_logprobs.logprob` 当前 token 的对数概率 **token** `string` | Token `choices.logprobs.content.top_logprobs.token` 当前 token **moderation_hit_type** `string` | 审核命中类型 `choices.moderation_hit_type` 模型输出文字含有敏感信息时,会返回模型输出文字命中的风险分类标签。 * `severe_violation`:模型输出文字涉及严重违规。 * `violence`:模型输出文字涉及激进行为。 > **说明:注意** > > 注意:当前只有 [视觉理解模型](/docs/image-understanding#f8d6cc48)支持返回该字段,且只有在方舟控制台 [接入点配置页面](https://ark.volcengine.com/region:cn-beijing/endpoint/create?customModelId=) 或者 CreateEndpoint 接口中,将内容护栏方案(ModerationStrategy)设置为基础方案(Basic)时,才会返回风险分类标签。 **created** `integer` | 创建时间 本次请求创建时间的 Unix 时间戳(秒) **id** `string` | 请求 ID 本次请求的唯一标识 **model** `string` | 模型名称 本次请求实际使用的模型名称和版本 **object** `string` | 对象类型 固定为 `chat.completion.chunk` **service_status** `object` | 服务状态 本次请求附带的服务状态信息,例如是否触发了模型降级(fallback) **model_fallback** `object` | 模型降级状态 `service_status.model_fallback` 模型降级(fallback)相关的状态信息 **fallback_triggered** `boolean` | 是否触发降级 `service_status.model_fallback.fallback_triggered` 本次请求是否触发了模型降级 **original_model** `string` | 原始模型 `service_status.model_fallback.original_model` 触发降级前,请求最初指定的模型名称 **service_tier** `string` | 推理模式 本次请求实际使用的推理模式。 * `scale`:本次请求使用 [在线推理(TPM 保障包)](/docs/tpm-guarantee-package) 模式。 * `default`:本次请求使用 [在线推理(常规)](/docs/online-inference-standard) 模式。 * `fast`:本次请求使用 [在线推理(低延迟)](/docs/online-inference-low-latency) 模式。 * `flex`:本次请求使用 [在线推理(低优)](/docs/online-inference-flex) 模式。 **usage** `object` | Token 用量 本次请求的 token 用量。 默认行为: * 部分模型默认在输出结束前返回本次请求的 token 用量信息。适用模型:`doubao-seed-2-1-lite-260915`、`glm-5-3-flash-260828`、`glm-5-2-260617`、`deepseek-v4-1-flash-261017`、`deepseek-v4-1-flash-260910`、`deepseek-v4-1-flash-economy-261017`、`deepseek-v4-pro-ga-260813`、`deepseek-v4-flash-ga-260731`。其中,`deepseek-v4-1-flash-261017`、`deepseek-v4-1-flash-economy-261017` 默认在带有 `finish_reason` 的 chunk 中返回本次请求的 token 用量信息。 * 其他模型:默认不统计 token 用量信息,返回值为 `null`。如需统计,需设置 `stream_options.include_usage` 为 `true`。 **completion_tokens** `integer` | 输出 Token 数 `usage.completion_tokens` 模型输出内容花费的 token **completion_tokens_details** `object` | 输出 Token 明细 `usage.completion_tokens_details` 模型输出内容花费的 token 的细节 **reasoning_tokens** `integer` | 思维链 Token 数 `usage.completion_tokens_details.reasoning_tokens` 输出思维链内容花费的 token 数。 支持输出思维链的模型请参见 [文档](/docs/deep-thinking#14b5c6db) **prompt_tokens** `integer` | 输入 Token 数 `usage.prompt_tokens` 输入给模型处理的内容 token 数量 **prompt_tokens_details** `object` | 输入 Token 明细 `usage.prompt_tokens_details` 输入给模型处理的内容 token 数量的细节 **cached_tokens** `integer` | 缓存命中 Token 数 `usage.prompt_tokens_details.cached_tokens` 缓存命中的输入内容(含文本、音频等所有类型)所消耗的 token 总数 **audio_cached_tokens** `integer` | 音频缓存 Token 数 `usage.prompt_tokens_details.audio_cached_tokens` 缓存命中的音频输入内容所消耗的 token 数量。仅在隐式缓存模式且命中音频缓存时返回;开启显式缓存时该字段不返回。 **audio_tokens** `integer` | 音频 Token 数 `usage.prompt_tokens_details.audio_tokens` 音频输入内容所消耗的 token 数量 **total_tokens** `integer` | 总 Token 数 `usage.total_tokens` 本次请求消耗的总 token 数量(输入 + 输出) ## 代码示例 ## 默认 ### cURL #### Request ```bash curl https://ark.cn-beijing.volces.com/api/v3/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "messages": [ { "role": "system", "content": "You are a helpful assistant." }, { "role": "user", "content": "Hello!" } ] }' ``` #### Response ``` { "choices": [ { "finish_reason": "stop", "index": 0, "logprobs": null, "message": { "content": "Hello! How can I help you today?", "role": "assistant" } } ], "created": 1742631811, "id": "0217426318107460cfa43dc3f3683b1de1c09624ff49085a456ac", "model": "doubao-seed-2-1-pro-260915", "service_tier": "default", "object": "chat.completion", "usage": { "completion_tokens": 9, "prompt_tokens": 19, "total_tokens": 28, "prompt_tokens_details": { "cached_tokens": 0 }, "completion_tokens_details": { "reasoning_tokens": 0 } } } ``` ### Python #### Request ```python import os from arkruntime import Ark client = Ark( api_key=os.environ.get("ARK_API_KEY"), base_url="https://ark.cn-beijing.volces.com/api/v3", ) completion = client.chat.completions.create( model="doubao-seed-2-1-pro-260915", messages=[ {"role": "user", "content": "You are a helpful assistant."} ] ) print(completion.choices[0].message) ``` #### Response ``` { "choices": [ { "finish_reason": "stop", "index": 0, "logprobs": null, "message": { "content": "Hello! How can I help you today?", "role": "assistant" } } ], "created": 1742631811, "id": "0217426318107460cfa43dc3f3683b1de1c09624ff49085a456ac", "model": "doubao-seed-2-1-pro-260915", "service_tier": "default", "object": "chat.completion", "usage": { "completion_tokens": 9, "prompt_tokens": 19, "total_tokens": 28, "prompt_tokens_details": { "cached_tokens": 0 }, "completion_tokens_details": { "reasoning_tokens": 0 } } } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/chat" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() req := &chat.ChatCompletionRequest{ Model: "doubao-seed-2-1-pro-260915", Messages: []chat.ChatCompletionRequestMessage{ userMessage("You are a helpful assistant."), }, } resp, err := client.CreateChatCompletion(ctx, req) if err != nil { fmt.Printf("standard chat error: %v\n", err) return } fmt.Println(resp.Choices[0].Message.Content) } func userMessage(content string) chat.ChatCompletionRequestMessage { return chat.ChatCompletionRequestMessage{ OneOf: chat.NewChatCompletionRequestUserMessageChatCompletionRequestMessageSum( chat.ChatCompletionRequestUserMessage{ Role: chat.ChatCompletionRequestUserMessageRoleUser, Content: chat.NewOptNilChatCompletionMessageContent(chat.NewStringChatCompletionMessageContent(content)), }, ), } } ``` #### Response ``` { "choices": [ { "finish_reason": "stop", "index": 0, "logprobs": null, "message": { "content": "Hello! How can I help you today?", "role": "assistant" } } ], "created": 1742631811, "id": "0217426318107460cfa43dc3f3683b1de1c09624ff49085a456ac", "model": "doubao-seed-2-1-pro-260915", "service_tier": "default", "object": "chat.completion", "usage": { "completion_tokens": 9, "prompt_tokens": 19, "total_tokens": 28, "prompt_tokens_details": { "cached_tokens": 0 }, "completion_tokens_details": { "reasoning_tokens": 0 } } } ``` ### Java #### Request ```java package com.volcengine.sample; import com.fasterxml.jackson.core.JsonProcessingException; import com.volcengine.ark.runtime.models.chat.*; import com.volcengine.ark.runtime.models.chat.ChatCompletionRequest.*; import com.volcengine.ark.runtime.service.ArkService; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; /* # pom.xml com.volcengine ark-runtime // 替换正式版本号 ${ark-runtime.version} */ public class Sample { //从环境变量中获取您的API KEY,配置方法见:https://ark.volcengine.com/region:cn-beijing/docs/quick-start static String apiKey = System.getenv("ARK_API_KEY"); static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); static Dispatcher dispatcher = new Dispatcher(); static ArkService service = ArkService.builder() .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); public static void main(String[] args) throws JsonProcessingException { List messagesForReqList = new ArrayList<>(); ChatCompletionRequestMessage elementForMessagesForReqList0 = ChatCompletionRequestUserMessage.builder() .role(ChatCompletionRequestMessageType.USER) .content(ChatCompletionMessageContent.ofString("You are a helpful assistant.")) .build(); messagesForReqList.add(elementForMessagesForReqList0); ChatCompletionRequest req = ChatCompletionRequest.builder() .model("doubao-seed-2-1-pro-260915") .messages(messagesForReqList) .build(); service.createChatCompletion(req) .getChoices() .forEach(choice -> System.out.println(choice.getMessage().getContent())); // shutdown service after all requests is finished service.shutdownExecutor(); } } ``` #### Response ``` { "choices": [ { "finish_reason": "stop", "index": 0, "logprobs": null, "message": { "content": "Hello! How can I help you today?", "role": "assistant" } } ], "created": 1742631811, "id": "0217426318107460cfa43dc3f3683b1de1c09624ff49085a456ac", "model": "doubao-seed-2-1-pro-260915", "service_tier": "default", "object": "chat.completion", "usage": { "completion_tokens": 9, "prompt_tokens": 19, "total_tokens": 28, "prompt_tokens_details": { "cached_tokens": 0 }, "completion_tokens_details": { "reasoning_tokens": 0 } } } ``` ## 流式输出 ### cURL #### Request ```bash curl https://ark.cn-beijing.volces.com/api/v3/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d $'{ "messages": [ { "content": "You are a helpful assistant.", "role": "system" }, { "content": "hello", "role": "user" } ], "model": "doubao-seed-2-1-pro-260915", "stream": true }' ``` #### Response ``` {"choices":[{"delta":{"content":"Hello","role":"assistant"},"index":0}],"created":1742632436,"id":"021742632435712396f12d018b5d576a7a55349c2eba0815061fc","model":"doubao-seed-2-1-pro-260915","service_tier":"default","object":"chat.completion.chunk","usage":null} {"choices":[{"delta":{"content":"!","role":"assistant"},"index":0}],"created":1742632436,"id":"021742632435712396f12d018b5d576a7a55349c2eba0815061fc","model":"doubao-seed-2-1-pro-260915","service_tier":"default","object":"chat.completion.chunk","usage":null} {"choices":[{"delta":{"content":" How","role":"assistant"},"index":0}],"created":1742632436,"id":"021742632435712396f12d018b5d576a7a55349c2eba0815061fc","model":"doubao-seed-2-1-pro-260915","service_tier":"default","object":"chat.completion.chunk","usage":null} {"choices":[{"delta":{"content":" can","role":"assistant"},"index":0}],"created":1742632436,"id":"021742632435712396f12d018b5d576a7a55349c2eba0815061fc","model":"doubao-seed-2-1-pro-260915","service_tier":"default","object":"chat.completion.chunk","usage":null} {"choices":[{"delta":{"content":" I","role":"assistant"},"index":0}],"created":1742632436,"id":"021742632435712396f12d018b5d576a7a55349c2eba0815061fc","model":"doubao-seed-2-1-pro-260915","service_tier":"default","object":"chat.completion.chunk","usage":null} {"choices":[{"delta":{"content":" help","role":"assistant"},"index":0}],"created":1742632436,"id":"021742632435712396f12d018b5d576a7a55349c2eba0815061fc","model":"doubao-seed-2-1-pro-260915","service_tier":"default","object":"chat.completion.chunk","usage":null} {"choices":[{"delta":{"content":" you","role":"assistant"},"index":0}],"created":1742632436,"id":"021742632435712396f12d018b5d576a7a55349c2eba0815061fc","model":"doubao-seed-2-1-pro-260915","service_tier":"default","object":"chat.completion.chunk","usage":null} {"choices":[{"delta":{"content":" today","role":"assistant"},"index":0}],"created":1742632436,"id":"021742632435712396f12d018b5d576a7a55349c2eba0815061fc","model":"doubao-seed-2-1-pro-260915","service_tier":"default","object":"chat.completion.chunk","usage":null} {"choices":[{"delta":{"content":"?","role":"assistant"},"index":0}],"created":1742632436,"id":"021742632435712396f12d018b5d576a7a55349c2eba0815061fc","model":"doubao-seed-2-1-pro-260915","service_tier":"default","object":"chat.completion.chunk","usage":null} {"choices":[{"delta":{"content":"","role":"assistant"},"finish_reason":"stop","index":0}],"created":1742632436,"id":"021742632435712396f12d018b5d576a7a55349c2eba0815061fc","model":"doubao-seed-2-1-pro-260915","service_tier":"default","object":"chat.completion.chunk","usage":null} [DONE] ``` ### Python #### Request ```python import os from arkruntime import Ark client = Ark( api_key=os.environ.get("ARK_API_KEY"), base_url="https://ark.cn-beijing.volces.com/api/v3", ) if __name__ == "__main__": resp = client.chat.completions.create( model="doubao-seed-2-1-pro-260915", messages=[{"content":"You are a helpful assistant.","role":"system"},{"content":"hello","role":"user"}], stream=True, ) for chunk in resp: if not chunk.choices: continue print(chunk.choices[0].delta.content or "", end="") ``` #### Response ``` {"choices":[{"delta":{"content":"Hello","role":"assistant"},"index":0}],"created":1742632436,"id":"021742632435712396f12d018b5d576a7a55349c2eba0815061fc","model":"doubao-seed-2-1-pro-260915","service_tier":"default","object":"chat.completion.chunk","usage":null} {"choices":[{"delta":{"content":"!","role":"assistant"},"index":0}],"created":1742632436,"id":"021742632435712396f12d018b5d576a7a55349c2eba0815061fc","model":"doubao-seed-2-1-pro-260915","service_tier":"default","object":"chat.completion.chunk","usage":null} {"choices":[{"delta":{"content":" How","role":"assistant"},"index":0}],"created":1742632436,"id":"021742632435712396f12d018b5d576a7a55349c2eba0815061fc","model":"doubao-seed-2-1-pro-260915","service_tier":"default","object":"chat.completion.chunk","usage":null} {"choices":[{"delta":{"content":" can","role":"assistant"},"index":0}],"created":1742632436,"id":"021742632435712396f12d018b5d576a7a55349c2eba0815061fc","model":"doubao-seed-2-1-pro-260915","service_tier":"default","object":"chat.completion.chunk","usage":null} {"choices":[{"delta":{"content":" I","role":"assistant"},"index":0}],"created":1742632436,"id":"021742632435712396f12d018b5d576a7a55349c2eba0815061fc","model":"doubao-seed-2-1-pro-260915","service_tier":"default","object":"chat.completion.chunk","usage":null} {"choices":[{"delta":{"content":" help","role":"assistant"},"index":0}],"created":1742632436,"id":"021742632435712396f12d018b5d576a7a55349c2eba0815061fc","model":"doubao-seed-2-1-pro-260915","service_tier":"default","object":"chat.completion.chunk","usage":null} {"choices":[{"delta":{"content":" you","role":"assistant"},"index":0}],"created":1742632436,"id":"021742632435712396f12d018b5d576a7a55349c2eba0815061fc","model":"doubao-seed-2-1-pro-260915","service_tier":"default","object":"chat.completion.chunk","usage":null} {"choices":[{"delta":{"content":" today","role":"assistant"},"index":0}],"created":1742632436,"id":"021742632435712396f12d018b5d576a7a55349c2eba0815061fc","model":"doubao-seed-2-1-pro-260915","service_tier":"default","object":"chat.completion.chunk","usage":null} {"choices":[{"delta":{"content":"?","role":"assistant"},"index":0}],"created":1742632436,"id":"021742632435712396f12d018b5d576a7a55349c2eba0815061fc","model":"doubao-seed-2-1-pro-260915","service_tier":"default","object":"chat.completion.chunk","usage":null} {"choices":[{"delta":{"content":"","role":"assistant"},"finish_reason":"stop","index":0}],"created":1742632436,"id":"021742632435712396f12d018b5d576a7a55349c2eba0815061fc","model":"doubao-seed-2-1-pro-260915","service_tier":"default","object":"chat.completion.chunk","usage":null} [DONE] ``` ### Go #### Request ```go package main import ( "context" "fmt" "io" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/chat" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() req := &chat.ChatCompletionRequest{ Model: "doubao-seed-2-1-pro-260915", Messages: []chat.ChatCompletionRequestMessage{ systemMessage("You are a helpful assistant."), userMessage("hello"), }, } fmt.Println("----- streaming request -----") stream, err := client.CreateChatCompletionStream(ctx, req) if err != nil { fmt.Printf("stream chat error: %v\n", err) return } defer stream.Close() for { recv, err := stream.Recv() if err == io.EOF { return } if err != nil { fmt.Printf("Stream chat error: %v\n", err) return } if len(recv.Choices) > 0 { fmt.Print(recv.Choices[0].Delta.Content.Or("")) } } } func systemMessage(content string) chat.ChatCompletionRequestMessage { return chat.ChatCompletionRequestMessage{ OneOf: chat.NewChatCompletionRequestSystemMessageChatCompletionRequestMessageSum( chat.ChatCompletionRequestSystemMessage{ Role: chat.ChatCompletionRequestSystemMessageRoleSystem, Content: chat.NewStringChatCompletionMessageContent(content), }, ), } } func userMessage(content string) chat.ChatCompletionRequestMessage { return chat.ChatCompletionRequestMessage{ OneOf: chat.NewChatCompletionRequestUserMessageChatCompletionRequestMessageSum( chat.ChatCompletionRequestUserMessage{ Role: chat.ChatCompletionRequestUserMessageRoleUser, Content: chat.NewOptNilChatCompletionMessageContent(chat.NewStringChatCompletionMessageContent(content)), }, ), } } ``` #### Response ``` {"choices":[{"delta":{"content":"Hello","role":"assistant"},"index":0}],"created":1742632436,"id":"021742632435712396f12d018b5d576a7a55349c2eba0815061fc","model":"doubao-seed-2-1-pro-260915","service_tier":"default","object":"chat.completion.chunk","usage":null} {"choices":[{"delta":{"content":"!","role":"assistant"},"index":0}],"created":1742632436,"id":"021742632435712396f12d018b5d576a7a55349c2eba0815061fc","model":"doubao-seed-2-1-pro-260915","service_tier":"default","object":"chat.completion.chunk","usage":null} {"choices":[{"delta":{"content":" How","role":"assistant"},"index":0}],"created":1742632436,"id":"021742632435712396f12d018b5d576a7a55349c2eba0815061fc","model":"doubao-seed-2-1-pro-260915","service_tier":"default","object":"chat.completion.chunk","usage":null} {"choices":[{"delta":{"content":" can","role":"assistant"},"index":0}],"created":1742632436,"id":"021742632435712396f12d018b5d576a7a55349c2eba0815061fc","model":"doubao-seed-2-1-pro-260915","service_tier":"default","object":"chat.completion.chunk","usage":null} {"choices":[{"delta":{"content":" I","role":"assistant"},"index":0}],"created":1742632436,"id":"021742632435712396f12d018b5d576a7a55349c2eba0815061fc","model":"doubao-seed-2-1-pro-260915","service_tier":"default","object":"chat.completion.chunk","usage":null} {"choices":[{"delta":{"content":" help","role":"assistant"},"index":0}],"created":1742632436,"id":"021742632435712396f12d018b5d576a7a55349c2eba0815061fc","model":"doubao-seed-2-1-pro-260915","service_tier":"default","object":"chat.completion.chunk","usage":null} {"choices":[{"delta":{"content":" you","role":"assistant"},"index":0}],"created":1742632436,"id":"021742632435712396f12d018b5d576a7a55349c2eba0815061fc","model":"doubao-seed-2-1-pro-260915","service_tier":"default","object":"chat.completion.chunk","usage":null} {"choices":[{"delta":{"content":" today","role":"assistant"},"index":0}],"created":1742632436,"id":"021742632435712396f12d018b5d576a7a55349c2eba0815061fc","model":"doubao-seed-2-1-pro-260915","service_tier":"default","object":"chat.completion.chunk","usage":null} {"choices":[{"delta":{"content":"?","role":"assistant"},"index":0}],"created":1742632436,"id":"021742632435712396f12d018b5d576a7a55349c2eba0815061fc","model":"doubao-seed-2-1-pro-260915","service_tier":"default","object":"chat.completion.chunk","usage":null} {"choices":[{"delta":{"content":"","role":"assistant"},"finish_reason":"stop","index":0}],"created":1742632436,"id":"021742632435712396f12d018b5d576a7a55349c2eba0815061fc","model":"doubao-seed-2-1-pro-260915","service_tier":"default","object":"chat.completion.chunk","usage":null} [DONE] ``` ### Java #### Request ```java package com.volcengine.sample; import com.fasterxml.jackson.core.JsonProcessingException; import com.volcengine.ark.runtime.models.chat.*; import com.volcengine.ark.runtime.models.chat.ChatCompletionRequest.*; import com.volcengine.ark.runtime.service.ArkService; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; /* # pom.xml com.volcengine ark-runtime // 替换正式版本号 ${ark-runtime.version} */ public class Sample { static String apiKey = System.getenv("ARK_API_KEY"); static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); static Dispatcher dispatcher = new Dispatcher(); static ArkService service = ArkService.builder() .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); public static void main(String[] args) throws JsonProcessingException { List messagesForReqList = new ArrayList<>(); ChatCompletionRequestMessage elementForMessagesForReqList0 = ChatCompletionRequestSystemMessage.builder() .role(ChatCompletionRequestMessageType.SYSTEM) .content(ChatCompletionMessageContent.ofString("You are a helpful assistant.")) .build(); ChatCompletionRequestMessage elementForMessagesForReqList1 = ChatCompletionRequestUserMessage.builder().role(ChatCompletionRequestMessageType.USER).content(ChatCompletionMessageContent.ofString("hello")).build(); messagesForReqList.add(elementForMessagesForReqList0); messagesForReqList.add(elementForMessagesForReqList1); ChatCompletionRequest req = ChatCompletionRequest.builder() .model("doubao-seed-2-1-pro-260915") .messages(messagesForReqList) .stream(true) .build(); service.streamChatCompletion(req) .doOnError(Throwable::printStackTrace) .blockingForEach( choice -> { if (choice.getChoices().size() > 0) { System.out.print( choice.getChoices().get(0).getDelta().getContent()); } }); // shutdown service after all requests is finished service.shutdownExecutor(); } } ``` #### Response ``` {"choices":[{"delta":{"content":"Hello","role":"assistant"},"index":0}],"created":1742632436,"id":"021742632435712396f12d018b5d576a7a55349c2eba0815061fc","model":"doubao-seed-2-1-pro-260915","service_tier":"default","object":"chat.completion.chunk","usage":null} {"choices":[{"delta":{"content":"!","role":"assistant"},"index":0}],"created":1742632436,"id":"021742632435712396f12d018b5d576a7a55349c2eba0815061fc","model":"doubao-seed-2-1-pro-260915","service_tier":"default","object":"chat.completion.chunk","usage":null} {"choices":[{"delta":{"content":" How","role":"assistant"},"index":0}],"created":1742632436,"id":"021742632435712396f12d018b5d576a7a55349c2eba0815061fc","model":"doubao-seed-2-1-pro-260915","service_tier":"default","object":"chat.completion.chunk","usage":null} {"choices":[{"delta":{"content":" can","role":"assistant"},"index":0}],"created":1742632436,"id":"021742632435712396f12d018b5d576a7a55349c2eba0815061fc","model":"doubao-seed-2-1-pro-260915","service_tier":"default","object":"chat.completion.chunk","usage":null} {"choices":[{"delta":{"content":" I","role":"assistant"},"index":0}],"created":1742632436,"id":"021742632435712396f12d018b5d576a7a55349c2eba0815061fc","model":"doubao-seed-2-1-pro-260915","service_tier":"default","object":"chat.completion.chunk","usage":null} {"choices":[{"delta":{"content":" help","role":"assistant"},"index":0}],"created":1742632436,"id":"021742632435712396f12d018b5d576a7a55349c2eba0815061fc","model":"doubao-seed-2-1-pro-260915","service_tier":"default","object":"chat.completion.chunk","usage":null} {"choices":[{"delta":{"content":" you","role":"assistant"},"index":0}],"created":1742632436,"id":"021742632435712396f12d018b5d576a7a55349c2eba0815061fc","model":"doubao-seed-2-1-pro-260915","service_tier":"default","object":"chat.completion.chunk","usage":null} {"choices":[{"delta":{"content":" today","role":"assistant"},"index":0}],"created":1742632436,"id":"021742632435712396f12d018b5d576a7a55349c2eba0815061fc","model":"doubao-seed-2-1-pro-260915","service_tier":"default","object":"chat.completion.chunk","usage":null} {"choices":[{"delta":{"content":"?","role":"assistant"},"index":0}],"created":1742632436,"id":"021742632435712396f12d018b5d576a7a55349c2eba0815061fc","model":"doubao-seed-2-1-pro-260915","service_tier":"default","object":"chat.completion.chunk","usage":null} {"choices":[{"delta":{"content":"","role":"assistant"},"finish_reason":"stop","index":0}],"created":1742632436,"id":"021742632435712396f12d018b5d576a7a55349c2eba0815061fc","model":"doubao-seed-2-1-pro-260915","service_tier":"default","object":"chat.completion.chunk","usage":null} [DONE] ``` ## 续写模式 ### cURL #### Request ```bash curl https://ark.cn-beijing.volces.com/api/v3/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d $'{ "messages": [ { "content": "你是一个计算器,请计算: 1 + 1", "role": "user" }, { "content": "=", "role": "assistant" } ], "model": "doubao-seed-2-1-pro-260915" }' ``` #### Response ``` { "choices": [ { "finish_reason": "stop", "index": 0, "logprobs": null, "message": { "content": " 2", "role": "assistant" } } ], "created": 1742634165, "id": "0217426341647344ee2a242cadeb3c7acc981f0bd805884bc65fc", "model": "doubao-seed-2-1-pro-260915", "service_tier": "default", "object": "chat.completion", "usage": { "completion_tokens": 2, "prompt_tokens": 21, "total_tokens": 23, "prompt_tokens_details": { "cached_tokens": 0 }, "completion_tokens_details": { "reasoning_tokens": 0 } } } ``` ### Python #### Request ```python import os from arkruntime import Ark client = Ark( api_key=os.environ.get("ARK_API_KEY"), base_url="https://ark.cn-beijing.volces.com/api/v3", ) if __name__ == "__main__": resp = client.chat.completions.create( model="doubao-seed-2-1-pro-260915", messages=[{"content":"你是一个计算器,请计算: 1 + 1","role":"user"},{"content":"=","role":"assistant"}], ) print(resp.choices[0].message.content) ``` #### Response ``` { "choices": [ { "finish_reason": "stop", "index": 0, "logprobs": null, "message": { "content": " 2", "role": "assistant" } } ], "created": 1742634165, "id": "0217426341647344ee2a242cadeb3c7acc981f0bd805884bc65fc", "model": "doubao-seed-2-1-pro-260915", "service_tier": "default", "object": "chat.completion", "usage": { "completion_tokens": 2, "prompt_tokens": 21, "total_tokens": 23, "prompt_tokens_details": { "cached_tokens": 0 }, "completion_tokens_details": { "reasoning_tokens": 0 } } } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/chat" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() req := &chat.ChatCompletionRequest{ Model: "doubao-seed-2-1-pro-260915", Messages: []chat.ChatCompletionRequestMessage{ userMessage("你是一个计算器,请计算:1 + 1"), assistantMessage("="), }, } fmt.Println("----- standard request -----") resp, err := client.CreateChatCompletion(ctx, req) if err != nil { fmt.Printf("standard chat error: %v\n", err) return } fmt.Println(resp.Choices[0].Message.Content) } func userMessage(content string) chat.ChatCompletionRequestMessage { return chat.ChatCompletionRequestMessage{ OneOf: chat.NewChatCompletionRequestUserMessageChatCompletionRequestMessageSum( chat.ChatCompletionRequestUserMessage{ Role: chat.ChatCompletionRequestUserMessageRoleUser, Content: chat.NewOptNilChatCompletionMessageContent(chat.NewStringChatCompletionMessageContent(content)), }, ), } } func assistantMessage(content string) chat.ChatCompletionRequestMessage { return chat.ChatCompletionRequestMessage{ OneOf: chat.NewChatCompletionRequestAssistantMessageChatCompletionRequestMessageSum( chat.ChatCompletionRequestAssistantMessage{ Role: chat.ChatCompletionRequestAssistantMessageRoleAssistant, Content: chat.NewOptNilChatCompletionMessageContent(chat.NewStringChatCompletionMessageContent(content)), }, ), } } ``` #### Response ``` { "choices": [ { "finish_reason": "stop", "index": 0, "logprobs": null, "message": { "content": " 2", "role": "assistant" } } ], "created": 1742634165, "id": "0217426341647344ee2a242cadeb3c7acc981f0bd805884bc65fc", "model": "doubao-seed-2-1-pro-260915", "service_tier": "default", "object": "chat.completion", "usage": { "completion_tokens": 2, "prompt_tokens": 21, "total_tokens": 23, "prompt_tokens_details": { "cached_tokens": 0 }, "completion_tokens_details": { "reasoning_tokens": 0 } } } ``` ### Java #### Request ```java package com.volcengine.sample; import com.fasterxml.jackson.core.JsonProcessingException; import com.volcengine.ark.runtime.models.chat.*; import com.volcengine.ark.runtime.models.chat.ChatCompletionRequest.*; import com.volcengine.ark.runtime.service.ArkService; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; /* # pom.xml com.volcengine ark-runtime // 替换正式版本号 ${ark-runtime.version} */ public class Sample { static String apiKey = System.getenv("ARK_API_KEY"); static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); static Dispatcher dispatcher = new Dispatcher(); static ArkService service = ArkService.builder() .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); public static void main(String[] args) throws JsonProcessingException { List messagesForReqList = new ArrayList<>(); ChatCompletionRequestMessage elementForMessagesForReqList0 = ChatCompletionRequestUserMessage.builder() .role(ChatCompletionRequestMessageType.USER) .content(ChatCompletionMessageContent.ofString("你是一个计算器,请计算: 1 + 1")) .build(); ChatCompletionRequestMessage elementForMessagesForReqList1 = ChatCompletionRequestAssistantMessage.builder().role(ChatCompletionRequestMessageType.ASSISTANT).content(ChatCompletionMessageContent.ofString("=")).build(); messagesForReqList.add(elementForMessagesForReqList0); messagesForReqList.add(elementForMessagesForReqList1); ChatCompletionRequest req = ChatCompletionRequest.builder() .model("doubao-seed-2-1-pro-260915") .messages(messagesForReqList) .build(); service.createChatCompletion(req) .getChoices() .forEach(choice -> System.out.println(choice.getMessage().getContent())); // shutdown service after all requests is finished service.shutdownExecutor(); } } ``` #### Response ``` { "choices": [ { "finish_reason": "stop", "index": 0, "logprobs": null, "message": { "content": " 2", "role": "assistant" } } ], "created": 1742634165, "id": "0217426341647344ee2a242cadeb3c7acc981f0bd805884bc65fc", "model": "doubao-seed-2-1-pro-260915", "service_tier": "default", "object": "chat.completion", "usage": { "completion_tokens": 2, "prompt_tokens": 21, "total_tokens": 23, "prompt_tokens_details": { "cached_tokens": 0 }, "completion_tokens_details": { "reasoning_tokens": 0 } } } ``` ## 图片理解 ### cURL #### Request ```bash curl https://ark.cn-beijing.volces.com/api/v3/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d $'{ "model": "doubao-seed-2-1-pro-260915", "messages": [ { "content": [ { "image_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/view.jpeg" }, "type": "image_url" }, { "text": "图片主要讲了什么?", "type": "text" } ], "role": "user" } ] }' ``` #### Response ``` { "choices": [ { "finish_reason": "stop", "index": 0, "logprobs": null, "message": { "content": "画面中呈现了一幅宁静的户外景象。一个人乘坐在橙黄色的皮划艇上,手持船桨,正在平静的水面划行。水面如镜,倒映着周围景致。远处是茂密的森林,森林后方矗立着巍峨的雪山,山体覆盖着白雪。天空呈浅蓝色,飘浮着一些云朵。整体氛围静谧而美好,展现出自然的纯净与壮阔。 ", "role": "assistant" } } ], "created": 1742636149, "id": "0217426361458116592a076493be583bc5e33f80ac2dcf1efc31b", "model": "doubao-seed-2-1-pro-260915", "service_tier": "default", "object": "chat.completion", "usage": { "completion_tokens": 85, "prompt_tokens": 521, "total_tokens": 606, "prompt_tokens_details": { "cached_tokens": 0 }, "completion_tokens_details": { "reasoning_tokens": 0 } } } ``` ### Python #### Request ```python import os from arkruntime import Ark client = Ark( api_key=os.environ.get("ARK_API_KEY"), base_url="https://ark.cn-beijing.volces.com/api/v3", ) if __name__ == "__main__": resp = client.chat.completions.create( model="doubao-seed-2-1-pro-260915", messages=[{"content":[{"image_url":{"url":"https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/view.jpeg"},"type":"image_url"},{"text":"图片主要讲了什么?","type":"text"}],"role":"user"}], ) print(resp.choices[0].message.content) ``` #### Response ``` { "choices": [ { "finish_reason": "stop", "index": 0, "logprobs": null, "message": { "content": "画面中呈现了一幅宁静的户外景象。一个人乘坐在橙黄色的皮划艇上,手持船桨,正在平静的水面划行。水面如镜,倒映着周围景致。远处是茂密的森林,森林后方矗立着巍峨的雪山,山体覆盖着白雪。天空呈浅蓝色,飘浮着一些云朵。整体氛围静谧而美好,展现出自然的纯净与壮阔。 ", "role": "assistant" } } ], "created": 1742636149, "id": "0217426361458116592a076493be583bc5e33f80ac2dcf1efc31b", "model": "doubao-seed-2-1-pro-260915", "service_tier": "default", "object": "chat.completion", "usage": { "completion_tokens": 85, "prompt_tokens": 521, "total_tokens": 606, "prompt_tokens_details": { "cached_tokens": 0 }, "completion_tokens_details": { "reasoning_tokens": 0 } } } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/chat" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() req := &chat.ChatCompletionRequest{ Model: "doubao-seed-2-1-pro-260915", Messages: []chat.ChatCompletionRequestMessage{ imageMessage( "https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/view.jpeg", "图片主要讲了什么?", ), }, } fmt.Println("----- standard request -----") resp, err := client.CreateChatCompletion(ctx, req) if err != nil { fmt.Printf("standard chat error: %v\n", err) return } fmt.Println(resp.Choices[0].Message.Content) } func imageMessage(imageURL, prompt string) chat.ChatCompletionRequestMessage { parts := []chat.ChatCompletionContentPart{ { OneOf: chat.NewChatCompletionContentPartImageChatCompletionContentPartSum( chat.ChatCompletionContentPartImage{ Type: chat.ChatCompletionContentPartImageTypeImageURL, ImageURL: chat.NewChatCompletionContentPartImageImageUrlChatCompletionContentPartImageImageURL(chat.ChatCompletionContentPartImageImageUrl{ URL: chat.NewOptString(imageURL), }), }, ), }, { OneOf: chat.NewChatCompletionContentPartTextChatCompletionContentPartSum( chat.ChatCompletionContentPartText{ Type: chat.ChatCompletionContentPartTextTypeText, Text: prompt, }, ), }, } return chat.ChatCompletionRequestMessage{ OneOf: chat.NewChatCompletionRequestUserMessageChatCompletionRequestMessageSum( chat.ChatCompletionRequestUserMessage{ Role: chat.ChatCompletionRequestUserMessageRoleUser, Content: chat.NewOptNilChatCompletionMessageContent(chat.NewChatCompletionContentPartArrayChatCompletionMessageContent( parts, )), }, ), } } ``` #### Response ``` { "choices": [ { "finish_reason": "stop", "index": 0, "logprobs": null, "message": { "content": "画面中呈现了一幅宁静的户外景象。一个人乘坐在橙黄色的皮划艇上,手持船桨,正在平静的水面划行。水面如镜,倒映着周围景致。远处是茂密的森林,森林后方矗立着巍峨的雪山,山体覆盖着白雪。天空呈浅蓝色,飘浮着一些云朵。整体氛围静谧而美好,展现出自然的纯净与壮阔。 ", "role": "assistant" } } ], "created": 1742636149, "id": "0217426361458116592a076493be583bc5e33f80ac2dcf1efc31b", "model": "doubao-seed-2-1-pro-260915", "service_tier": "default", "object": "chat.completion", "usage": { "completion_tokens": 85, "prompt_tokens": 521, "total_tokens": 606, "prompt_tokens_details": { "cached_tokens": 0 }, "completion_tokens_details": { "reasoning_tokens": 0 } } } ``` ### Java #### Request ```java package com.volcengine.sample; import com.fasterxml.jackson.core.JsonProcessingException; import com.volcengine.ark.runtime.models.chat.*; import com.volcengine.ark.runtime.models.chat.ChatCompletionContentPart.*; import com.volcengine.ark.runtime.models.chat.ChatCompletionRequest.*; import com.volcengine.ark.runtime.service.ArkService; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; /* # pom.xml com.volcengine ark-runtime // 替换正式版本号 ${ark-runtime.version} */ public class Sample { static String apiKey = System.getenv("ARK_API_KEY"); static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); static Dispatcher dispatcher = new Dispatcher(); static ArkService service = ArkService.builder() .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); public static void main(String[] args) throws JsonProcessingException { List messagesForReqList = new ArrayList<>(); List contentForElementForMessagesForReqList0 = new ArrayList<>(); ChatCompletionContentPartImageImageUrl imageUrlForElementForContentForElementForMessagesForReqList00 = ChatCompletionContentPartImageImageUrl.builder().build(); imageUrlForElementForContentForElementForMessagesForReqList00.setUrl( "https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/view.jpeg"); ChatCompletionContentPart elementForContentForElementForMessagesForReqList00 = ChatCompletionContentPartImage.builder() .type(ChatCompletionContentPartType.IMAGE_URL) .imageUrl(ChatCompletionContentPartImageImageUrl2.ofChatCompletionContentPartImageImageUrl(imageUrlForElementForContentForElementForMessagesForReqList00)) .build(); ChatCompletionContentPart elementForContentForElementForMessagesForReqList01 = ChatCompletionContentPartText.builder() .type(ChatCompletionContentPartType.TEXT) .text("图片主要讲了什么?") .build(); contentForElementForMessagesForReqList0.add( elementForContentForElementForMessagesForReqList00); contentForElementForMessagesForReqList0.add( elementForContentForElementForMessagesForReqList01); ChatCompletionRequestMessage elementForMessagesForReqList0 = ChatCompletionRequestUserMessage.builder() .role(ChatCompletionRequestMessageType.USER) .content(ChatCompletionMessageContent.ofList(contentForElementForMessagesForReqList0)) .build(); messagesForReqList.add(elementForMessagesForReqList0); ChatCompletionRequest req = ChatCompletionRequest.builder() .model("doubao-seed-2-1-pro-260915") .messages(messagesForReqList) .build(); service.createChatCompletion(req) .getChoices() .forEach(choice -> System.out.println(choice.getMessage().getContent())); // shutdown service after all requests is finished service.shutdownExecutor(); } } ``` #### Response ``` { "choices": [ { "finish_reason": "stop", "index": 0, "logprobs": null, "message": { "content": "画面中呈现了一幅宁静的户外景象。一个人乘坐在橙黄色的皮划艇上,手持船桨,正在平静的水面划行。水面如镜,倒映着周围景致。远处是茂密的森林,森林后方矗立着巍峨的雪山,山体覆盖着白雪。天空呈浅蓝色,飘浮着一些云朵。整体氛围静谧而美好,展现出自然的纯净与壮阔。 ", "role": "assistant" } } ], "created": 1742636149, "id": "0217426361458116592a076493be583bc5e33f80ac2dcf1efc31b", "model": "doubao-seed-2-1-pro-260915", "service_tier": "default", "object": "chat.completion", "usage": { "completion_tokens": 85, "prompt_tokens": 521, "total_tokens": 606, "prompt_tokens_details": { "cached_tokens": 0 }, "completion_tokens_details": { "reasoning_tokens": 0 } } } ``` ## 视频理解 ### cURL #### Request ```bash curl https://ark.cn-beijing.volces.com/api/v3/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "messages": [ { "role": "user", "content": [ {"type": "video_url","video_url": {"url": "https://arkdocs.tos-cn-beijing.volces.com/videos/advanced-usage/ark_vlm_video_input.mp4"},"fps": "2"}, {"type": "text", "text": "What is in the video?"} ] } ], "max_tokens": 300 }' ``` #### Response ``` { "choices": [ { "finish_reason": "stop", "index": 0, "logprobs": null, "message": { "content": "The video showcases a cityscape featuring a prominent clock tower (resembling Big Ben) on the left side. A bridge spans across the scene, with a steady flow of vehicles—including cars and a red bus—moving along it. The background includes a mix of historic and modern buildings under a cloudy sky with warm, golden-hour lighting. The text \"AI生成\" (AI-generated) is visible in the bottom-right corner throughout the video.", "reasoning_content": "\nGot it, let's see. The video shows a city scene with a famous clock tower (Big Ben-like) and a bridge with traffic. The clock is on the left, and there are cars and a red bus moving on the bridge. The sky is cloudy with a sunset or sunrise hue. Also, there are buildings in the background, and the word \"AI生成\" is in the bottom right corner. So I need to describe what's visible: the clock tower, the bridge with vehicles (including a red bus), the cityscape, the sky, and the AI-generated text.", "role": "assistant" } } ], "created": 1769687250, "id": "02176968724393181abbd6c16bee1cf75e33ac11302acbd610474", "model": "doubao-seed-2-1-pro-260915", "service_tier": "default", "object": "chat.completion", "usage": { "completion_tokens": 210, "prompt_tokens": 10391, "total_tokens": 10601, "prompt_tokens_details": { "cached_tokens": 0 }, "completion_tokens_details": { "reasoning_tokens": 121 } } } ``` ### Python #### Request ```python import os # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark client = Ark( # The base URL for model invocation . base_url="https://ark.cn-beijing.volces.com/api/v3", api_key=os.getenv('ARK_API_KEY'), ) completion = client.chat.completions.create( # Replace with Model ID . model = "doubao-seed-2-1-pro-260915", messages=[ { "role": "user", "content": [ { "type": "video_url", "video_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/advanced-usage/ark_vlm_video_input.mp4", "fps": 2, } }, {"type": "text", "text": "What is in the video?"}, ], } ], ) print(completion.choices[0]) ``` #### Response ``` { "choices": [ { "finish_reason": "stop", "index": 0, "logprobs": null, "message": { "content": "The video showcases a cityscape featuring a prominent clock tower (resembling Big Ben) on the left side. A bridge spans across the scene, with a steady flow of vehicles—including cars and a red bus—moving along it. The background includes a mix of historic and modern buildings under a cloudy sky with warm, golden-hour lighting. The text \"AI生成\" (AI-generated) is visible in the bottom-right corner throughout the video.", "reasoning_content": "\nGot it, let's see. The video shows a city scene with a famous clock tower (Big Ben-like) and a bridge with traffic. The clock is on the left, and there are cars and a red bus moving on the bridge. The sky is cloudy with a sunset or sunrise hue. Also, there are buildings in the background, and the word \"AI生成\" is in the bottom right corner. So I need to describe what's visible: the clock tower, the bridge with vehicles (including a red bus), the cityscape, the sky, and the AI-generated text.", "role": "assistant" } } ], "created": 1769687250, "id": "02176968724393181abbd6c16bee1cf75e33ac11302acbd610474", "model": "doubao-seed-2-1-pro-260915", "service_tier": "default", "object": "chat.completion", "usage": { "completion_tokens": 210, "prompt_tokens": 10391, "total_tokens": 10601, "prompt_tokens_details": { "cached_tokens": 0 }, "completion_tokens_details": { "reasoning_tokens": 121 } } } ``` ### Go #### Request ```go package main import ( "context" "fmt" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/chat" "os" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() contentParts := []chat.ChatCompletionContentPart{ { OneOf: chat.NewChatCompletionContentPartVideoChatCompletionContentPartSum( chat.ChatCompletionContentPartVideo{ Type: chat.ChatCompletionContentPartVideoTypeVideoURL, VideoURL: chat.ChatCompletionContentPartVideoVideoUrl{ URL: chat.NewOptString("https://arkdocs.tos-cn-beijing.volces.com/videos/advanced-usage/ark_vlm_video_input.mp4"), Fps: chat.NewOptFloat64(2), }, }, ), }, { OneOf: chat.NewChatCompletionContentPartTextChatCompletionContentPartSum( chat.ChatCompletionContentPartText{ Type: chat.ChatCompletionContentPartTextTypeText, Text: "What is in the video?", }, ), }, } req := &chat.ChatCompletionRequest{ Model: "doubao-seed-2-1-pro-260915", Messages: []chat.ChatCompletionRequestMessage{ userMessage(contentParts), }, MaxTokens: chat.NewOptInt32(300), } resp, err := client.CreateChatCompletion(ctx, req) if err != nil { fmt.Printf("standard chat error: %v\n", err) return } fmt.Println(resp.Choices[0].Message.Content) } func userMessage(parts []chat.ChatCompletionContentPart) chat.ChatCompletionRequestMessage { return chat.ChatCompletionRequestMessage{ OneOf: chat.NewChatCompletionRequestUserMessageChatCompletionRequestMessageSum( chat.ChatCompletionRequestUserMessage{ Role: chat.ChatCompletionRequestUserMessageRoleUser, Content: chat.NewOptNilChatCompletionMessageContent(chat.NewChatCompletionContentPartArrayChatCompletionMessageContent( parts, )), }, ), } } ``` #### Response ``` { "choices": [ { "finish_reason": "stop", "index": 0, "logprobs": null, "message": { "content": "The video showcases a cityscape featuring a prominent clock tower (resembling Big Ben) on the left side. A bridge spans across the scene, with a steady flow of vehicles—including cars and a red bus—moving along it. The background includes a mix of historic and modern buildings under a cloudy sky with warm, golden-hour lighting. The text \"AI生成\" (AI-generated) is visible in the bottom-right corner throughout the video.", "reasoning_content": "\nGot it, let's see. The video shows a city scene with a famous clock tower (Big Ben-like) and a bridge with traffic. The clock is on the left, and there are cars and a red bus moving on the bridge. The sky is cloudy with a sunset or sunrise hue. Also, there are buildings in the background, and the word \"AI生成\" is in the bottom right corner. So I need to describe what's visible: the clock tower, the bridge with vehicles (including a red bus), the cityscape, the sky, and the AI-generated text.", "role": "assistant" } } ], "created": 1769687250, "id": "02176968724393181abbd6c16bee1cf75e33ac11302acbd610474", "model": "doubao-seed-2-1-pro-260915", "service_tier": "default", "object": "chat.completion", "usage": { "completion_tokens": 210, "prompt_tokens": 10391, "total_tokens": 10601, "prompt_tokens_details": { "cached_tokens": 0 }, "completion_tokens_details": { "reasoning_tokens": 121 } } } ``` ### Java #### Request ```java package com.ark.sample; import com.volcengine.ark.runtime.models.chat.*; import com.volcengine.ark.runtime.models.chat.ChatCompletionContentPart.*; import com.volcengine.ark.runtime.service.ArkService; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; public class VideoSample { static String apiKey = System.getenv("ARK_API_KEY"); static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); static Dispatcher dispatcher = new Dispatcher(); static ArkService service = ArkService.builder() .dispatcher(dispatcher) .connectionPool(connectionPool) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation . .apiKey(apiKey) .build(); public static void main(String[] args) throws Exception { List messagesForReqList = new ArrayList<>(); List contentParts = new ArrayList<>(); contentParts.add(ChatCompletionContentPartVideo.builder() .type(ChatCompletionContentPartType.VIDEO_URL) .videoUrl(ChatCompletionContentPartVideoVideoUrl.builder().url("https://arkdocs.tos-cn-beijing.volces.com/videos/advanced-usage/ark_vlm_video_input.mp4").fps(2.0).build()) .build()); contentParts.add(ChatCompletionContentPartText.builder() .type(ChatCompletionContentPartType.TEXT) .text("What is in the video?") .build()); messagesForReqList.add(ChatCompletionRequestUserMessage.builder() .role(ChatCompletionRequestMessageType.USER) .content(ChatCompletionMessageContent.ofList(contentParts)) .build()); ChatCompletionRequest req = ChatCompletionRequest.builder() .model("doubao-seed-2-1-pro-260915") //Replace with Model ID . .messages(messagesForReqList) .maxTokens(300) .build(); service.createChatCompletion(req) .getChoices() .forEach(choice -> System.out.println(choice.getMessage().getContent())); // shutdown service after all requests are finished service.shutdownExecutor(); } } ``` #### Response ``` { "choices": [ { "finish_reason": "stop", "index": 0, "logprobs": null, "message": { "content": "The video showcases a cityscape featuring a prominent clock tower (resembling Big Ben) on the left side. A bridge spans across the scene, with a steady flow of vehicles—including cars and a red bus—moving along it. The background includes a mix of historic and modern buildings under a cloudy sky with warm, golden-hour lighting. The text \"AI生成\" (AI-generated) is visible in the bottom-right corner throughout the video.", "reasoning_content": "\nGot it, let's see. The video shows a city scene with a famous clock tower (Big Ben-like) and a bridge with traffic. The clock is on the left, and there are cars and a red bus moving on the bridge. The sky is cloudy with a sunset or sunrise hue. Also, there are buildings in the background, and the word \"AI生成\" is in the bottom right corner. So I need to describe what's visible: the clock tower, the bridge with vehicles (including a red bus), the cityscape, the sky, and the AI-generated text.", "role": "assistant" } } ], "created": 1769687250, "id": "02176968724393181abbd6c16bee1cf75e33ac11302acbd610474", "model": "doubao-seed-2-1-pro-260915", "service_tier": "default", "object": "chat.completion", "usage": { "completion_tokens": 210, "prompt_tokens": 10391, "total_tokens": 10601, "prompt_tokens_details": { "cached_tokens": 0 }, "completion_tokens_details": { "reasoning_tokens": 121 } } } ``` ## 音频理解 ### cURL #### Request ```bash curl https://ark.cn-beijing.volces.com/api/v3/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seed-2-1-lite-260915", "messages": [ { "role": "user", "content": [ { "type": "input_audio", "input_audio": { "url": "https://arkdocs.tos-cn-beijing.volces.com/files/advanced-usage/ark_demo_audio.mp3", "format": "mp3" } }, { "type": "text", "text": "请识别音频中的内容" } ] } ] }' ``` #### Response ``` { "choices": [ { "finish_reason": "stop", "index": 0, "logprobs": null, "message": { "content": "识别到的音频内容为:绵如云朵入口即化,甜蜜尽在SEEDNS。这是一句偏向甜品相关品牌的宣传 slogan,描述对应食物口感像云朵般绵软、入口快速融化的特点,点出甜蜜的体验都来自名为SEEDNS的品牌。", "reasoning_content": "待识别的音频内容为“绵如云朵入口即化,甜蜜尽在SEEDNS。”音频内容的识别核对工作已经完成,确认识别结果准确无误,该内容为甜品宣传slogan,核心信息为“绵如云朵入口即化,甜蜜尽在SEEDNS”,接下来将直接输出识别到的准确内容。\n", "encrypted_content": "djF5bw7BtwH3UvkWgRPtDQkv3RnL8tQuyAj2JwFajlts/zz7bkoX0IB1joHPJFjuOq/iVdheVGrSxFVTCmpGUzpK/2rDgeg1NBSkUp6u9pObv8mG0XtojzAPT92slvJuumKP07BgFrJQAXy36WIMXAsdNI/rOLNHMjvK/5Iqzg2zyFTU0kNnzs8ZQ1MMwbToi8PL1ycDuu9viZvwNUdPZ9jMsx4BwnHiDbMPppBUFlI7N2zLK4gyg6C+6ep/vfmGlnRRZdvocMmIK4SZQlAqxsL/hVMeGX7dOWBIhB+jaynY9cDS31pePmhXjxbNNGF7nfhwfjJS+IPqOi4IK+DIJyF5wVYCaTMgkGGJbDl0CgKf8c3Lr6Mw4mCovRKBcDuSmjMgsTUG2pXibe88mlGoNn7NLf1bO50BtcDkZiLagSuJ6PAcrbO6n34V0/SKZmVZbGfdhI2AijVvdtrsk3OVHM/XTrzca5SmhBwRqEKi1YKH8uEVkqjVGOJsR1SwpUDbZ/B6abc2Fq0qAlNJqDnf03ENMnudn1nQDecYLw/97qgGjjxb2H+VO0BNVgx7P6+nbQUIdko/DyOarnMGmloPR7f5az2iwkX6+Q5r4iro79IQ3EWV9AsQZjHI2ALMbnksNXxvFPhnmzWhy9s0lhG7pNUTbgyb7zCVCu2ymsE8610er01sS0wdYaflrq+GXeJ7njDrfvdDJNZ+TjdjAoSGwKvQO6eykepmcjjrro7+VSsEIfeYx8BVyCvNsmwRJEOE+63K/FklxKz65Qco7Ye8jQbY465EpQ7JuLZ58yYeKspNasS5PWJj2OZkrkecleuYtEV8uMYjaTaL87KmIxthfPJ0A8EQtGb1A98ER17oIxJ7sV2NPcxlKWoq38Ej3aGzZDPjgd+JQ23lmglPH3vNgKR0OyMmuA==", "role": "assistant" } } ], "created": 1778829097, "id": "02177882907049470efbf1cf5c1ae3d0b3f284807454d292b2912", "model": "doubao-seed-2-0-lite-260428", "service_tier": "default", "object": "chat.completion", "usage": { "completion_tokens": 311, "prompt_tokens": 80, "total_tokens": 391, "prompt_tokens_details": { "cached_tokens": 0, "audio_tokens": 40 }, "completion_tokens_details": { "reasoning_tokens": 250 } } } ``` ### Python #### Request ```python import os # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark client = Ark( # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv('ARK_API_KEY'), ) completion = client.chat.completions.create( # Replace with Model ID model = "doubao-seed-2-1-lite-260915", messages=[ { "role": "user", "content": [ { "type": "input_audio", "input_audio": { "url": "https://arkdocs.tos-cn-beijing.volces.com/files/advanced-usage/ark_demo_audio.mp3", "format": "mp3" } }, {"type": "text", "text": "请识别音频中的内容"}, ], } ], ) print(completion.choices[0]) ``` #### Response ``` { "choices": [ { "finish_reason": "stop", "index": 0, "logprobs": null, "message": { "content": "识别到的音频内容为:绵如云朵入口即化,甜蜜尽在SEEDNS。这是一句偏向甜品相关品牌的宣传 slogan,描述对应食物口感像云朵般绵软、入口快速融化的特点,点出甜蜜的体验都来自名为SEEDNS的品牌。", "reasoning_content": "待识别的音频内容为“绵如云朵入口即化,甜蜜尽在SEEDNS。”音频内容的识别核对工作已经完成,确认识别结果准确无误,该内容为甜品宣传slogan,核心信息为“绵如云朵入口即化,甜蜜尽在SEEDNS”,接下来将直接输出识别到的准确内容。\n", "encrypted_content": "djF5bw7BtwH3UvkWgRPtDQkv3RnL8tQuyAj2JwFajlts/zz7bkoX0IB1joHPJFjuOq/iVdheVGrSxFVTCmpGUzpK/2rDgeg1NBSkUp6u9pObv8mG0XtojzAPT92slvJuumKP07BgFrJQAXy36WIMXAsdNI/rOLNHMjvK/5Iqzg2zyFTU0kNnzs8ZQ1MMwbToi8PL1ycDuu9viZvwNUdPZ9jMsx4BwnHiDbMPppBUFlI7N2zLK4gyg6C+6ep/vfmGlnRRZdvocMmIK4SZQlAqxsL/hVMeGX7dOWBIhB+jaynY9cDS31pePmhXjxbNNGF7nfhwfjJS+IPqOi4IK+DIJyF5wVYCaTMgkGGJbDl0CgKf8c3Lr6Mw4mCovRKBcDuSmjMgsTUG2pXibe88mlGoNn7NLf1bO50BtcDkZiLagSuJ6PAcrbO6n34V0/SKZmVZbGfdhI2AijVvdtrsk3OVHM/XTrzca5SmhBwRqEKi1YKH8uEVkqjVGOJsR1SwpUDbZ/B6abc2Fq0qAlNJqDnf03ENMnudn1nQDecYLw/97qgGjjxb2H+VO0BNVgx7P6+nbQUIdko/DyOarnMGmloPR7f5az2iwkX6+Q5r4iro79IQ3EWV9AsQZjHI2ALMbnksNXxvFPhnmzWhy9s0lhG7pNUTbgyb7zCVCu2ymsE8610er01sS0wdYaflrq+GXeJ7njDrfvdDJNZ+TjdjAoSGwKvQO6eykepmcjjrro7+VSsEIfeYx8BVyCvNsmwRJEOE+63K/FklxKz65Qco7Ye8jQbY465EpQ7JuLZ58yYeKspNasS5PWJj2OZkrkecleuYtEV8uMYjaTaL87KmIxthfPJ0A8EQtGb1A98ER17oIxJ7sV2NPcxlKWoq38Ej3aGzZDPjgd+JQ23lmglPH3vNgKR0OyMmuA==", "role": "assistant" } } ], "created": 1778829097, "id": "02177882907049470efbf1cf5c1ae3d0b3f284807454d292b2912", "model": "doubao-seed-2-0-lite-260428", "service_tier": "default", "object": "chat.completion", "usage": { "completion_tokens": 311, "prompt_tokens": 80, "total_tokens": 391, "prompt_tokens_details": { "cached_tokens": 0, "audio_tokens": 40 }, "completion_tokens_details": { "reasoning_tokens": 250 } } } ``` ### Java #### Request ```java package com.ark.sample; import com.volcengine.ark.runtime.models.chat.*; import com.volcengine.ark.runtime.models.chat.ChatCompletionContentPart.*; import com.volcengine.ark.runtime.service.ArkService; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; public class Sample { static String apiKey = System.getenv("ARK_API_KEY"); static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); static Dispatcher dispatcher = new Dispatcher(); static ArkService service = ArkService.builder() .dispatcher(dispatcher) .connectionPool(connectionPool) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .apiKey(apiKey) .build(); public static void main(String[] args) throws Exception { List messagesForReqList = new ArrayList<>(); List contentParts = new ArrayList<>(); ChatCompletionContentPartAudioInputAudio inputAudio = new ChatCompletionContentPartAudioInputAudio(); inputAudio.setUrl("https://arkdocs.tos-cn-beijing.volces.com/files/advanced-usage/ark_demo_audio.mp3"); inputAudio.setFormat("mp3"); contentParts.add(ChatCompletionContentPartAudio.builder() .type(ChatCompletionContentPartType.INPUT_AUDIO) .inputAudio(inputAudio) .build()); contentParts.add(ChatCompletionContentPartText.builder() .type(ChatCompletionContentPartType.TEXT) .text("请识别音频中的内容") .build()); messagesForReqList.add(ChatCompletionRequestUserMessage.builder() .role(ChatCompletionRequestMessageType.USER) .content(ChatCompletionMessageContent.ofList(contentParts)) .build()); ChatCompletionRequest req = ChatCompletionRequest.builder() .model("doubao-seed-2-1-lite-260915") .messages(messagesForReqList) .build(); service.createChatCompletion(req) .getChoices() .forEach(choice -> System.out.println(choice.getMessage().getContent())); service.shutdownExecutor(); } } ``` #### Response ``` { "choices": [ { "finish_reason": "stop", "index": 0, "logprobs": null, "message": { "content": "识别到的音频内容为:绵如云朵入口即化,甜蜜尽在SEEDNS。这是一句偏向甜品相关品牌的宣传 slogan,描述对应食物口感像云朵般绵软、入口快速融化的特点,点出甜蜜的体验都来自名为SEEDNS的品牌。", "reasoning_content": "待识别的音频内容为“绵如云朵入口即化,甜蜜尽在SEEDNS。”音频内容的识别核对工作已经完成,确认识别结果准确无误,该内容为甜品宣传slogan,核心信息为“绵如云朵入口即化,甜蜜尽在SEEDNS”,接下来将直接输出识别到的准确内容。\n", "encrypted_content": "djF5bw7BtwH3UvkWgRPtDQkv3RnL8tQuyAj2JwFajlts/zz7bkoX0IB1joHPJFjuOq/iVdheVGrSxFVTCmpGUzpK/2rDgeg1NBSkUp6u9pObv8mG0XtojzAPT92slvJuumKP07BgFrJQAXy36WIMXAsdNI/rOLNHMjvK/5Iqzg2zyFTU0kNnzs8ZQ1MMwbToi8PL1ycDuu9viZvwNUdPZ9jMsx4BwnHiDbMPppBUFlI7N2zLK4gyg6C+6ep/vfmGlnRRZdvocMmIK4SZQlAqxsL/hVMeGX7dOWBIhB+jaynY9cDS31pePmhXjxbNNGF7nfhwfjJS+IPqOi4IK+DIJyF5wVYCaTMgkGGJbDl0CgKf8c3Lr6Mw4mCovRKBcDuSmjMgsTUG2pXibe88mlGoNn7NLf1bO50BtcDkZiLagSuJ6PAcrbO6n34V0/SKZmVZbGfdhI2AijVvdtrsk3OVHM/XTrzca5SmhBwRqEKi1YKH8uEVkqjVGOJsR1SwpUDbZ/B6abc2Fq0qAlNJqDnf03ENMnudn1nQDecYLw/97qgGjjxb2H+VO0BNVgx7P6+nbQUIdko/DyOarnMGmloPR7f5az2iwkX6+Q5r4iro79IQ3EWV9AsQZjHI2ALMbnksNXxvFPhnmzWhy9s0lhG7pNUTbgyb7zCVCu2ymsE8610er01sS0wdYaflrq+GXeJ7njDrfvdDJNZ+TjdjAoSGwKvQO6eykepmcjjrro7+VSsEIfeYx8BVyCvNsmwRJEOE+63K/FklxKz65Qco7Ye8jQbY465EpQ7JuLZ58yYeKspNasS5PWJj2OZkrkecleuYtEV8uMYjaTaL87KmIxthfPJ0A8EQtGb1A98ER17oIxJ7sV2NPcxlKWoq38Ej3aGzZDPjgd+JQ23lmglPH3vNgKR0OyMmuA==", "role": "assistant" } } ], "created": 1778829097, "id": "02177882907049470efbf1cf5c1ae3d0b3f284807454d292b2912", "model": "doubao-seed-2-0-lite-260428", "service_tier": "default", "object": "chat.completion", "usage": { "completion_tokens": 311, "prompt_tokens": 80, "total_tokens": 391, "prompt_tokens_details": { "cached_tokens": 0, "audio_tokens": 40 }, "completion_tokens_details": { "reasoning_tokens": 250 } } } ``` ## 深度推理 ### cURL #### Request ```bash curl https://ark.cn-beijing.volces.com/api/v3/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d $'{ "messages": [ { "content": "我要有研究推理模型与非推理模型区别的课题,怎么体现我的专业性", "role": "user" } ], "model": "doubao-seed-2-1-pro-260915" }' ``` #### Response ``` { "choices": [ { "finish_reason": "stop", "index": 0, "logprobs": null, "message": { "content": "\n\n推理模型与非推理模型的主要区别在于其处理任务的方式、能力侧重点以及应用场景。以下是两者的核心区别分析:\n\n---\n\n### **1. 核心定义**\n- **推理模型** \n 具备**逻辑推理、因果推断或复杂决策**能力,*** \n\n实际应用中,两类模型常配合使用(如用非推理模型提取特征,再交给推理模型决策),以平衡效率与准确性。", "reasoning_content": "嗯,用户问的是推理模型和非推理模型有什么区别。我需要先理解这两个术语的具体含义。可能用户对机器学习或深度学习有一定的了解,但需要更清晰的区分。首先,我应该明确这两个概念的定义,然后从不同角度进行比较。\n\n首先,推理模型可能指的是那些需要进行逻辑推理、处理复杂任务的模型,***,而非推理模型侧重于模式识别和直接映射,帮助用户形成清晰的概念框架。\n", "role": "assistant" } } ], "created": 1742636537, "id": "0217426364949596592a076493be583bc5e33f80ac2dcf1eeaf9b", "model": "doubao-seed-2-1-pro-260915", "service_tier": "default", "object": "chat.completion", "usage": { "completion_tokens": 1207, "prompt_tokens": 11, "total_tokens": 1218, "prompt_tokens_details": { "cached_tokens": 0 }, "completion_tokens_details": { "reasoning_tokens": 419 } } } ``` ### Python #### Request ```python import os # 升级方舟 SDK 到最新版本 pip install -U arkruntime from arkruntime import Ark client = Ark( # 从环境变量中读取您的方舟API Key api_key=os.environ.get("ARK_API_KEY"), base_url="https://ark.cn-beijing.volces.com/api/v3", # 深度推理模型耗费时间会较长,请您设置较大的超时时间,避免超时,推荐30分钟以上 timeout=1800, ) response = client.chat.completions.create( # 替换 为模型的Model ID model="doubao-seed-2-1-pro-260915", messages=[ {"role": "user", "content": "我要有研究推理模型与非推理模型区别的课题,怎么体现我的专业性"} ] ) # 当触发深度推理时,打印思维链内容 if hasattr(response.choices[0].message, 'reasoning_content'): print(response.choices[0].message.reasoning_content) print(response.choices[0].message.content) ``` #### Response ``` { "choices": [ { "finish_reason": "stop", "index": 0, "logprobs": null, "message": { "content": "\n\n推理模型与非推理模型的主要区别在于其处理任务的方式、能力侧重点以及应用场景。以下是两者的核心区别分析:\n\n---\n\n### **1. 核心定义**\n- **推理模型** \n 具备**逻辑推理、因果推断或复杂决策**能力,*** \n\n实际应用中,两类模型常配合使用(如用非推理模型提取特征,再交给推理模型决策),以平衡效率与准确性。", "reasoning_content": "嗯,用户问的是推理模型和非推理模型有什么区别。我需要先理解这两个术语的具体含义。可能用户对机器学习或深度学习有一定的了解,但需要更清晰的区分。首先,我应该明确这两个概念的定义,然后从不同角度进行比较。\n\n首先,推理模型可能指的是那些需要进行逻辑推理、处理复杂任务的模型,***,而非推理模型侧重于模式识别和直接映射,帮助用户形成清晰的概念框架。\n", "role": "assistant" } } ], "created": 1742636537, "id": "0217426364949596592a076493be583bc5e33f80ac2dcf1eeaf9b", "model": "doubao-seed-2-1-pro-260915", "service_tier": "default", "object": "chat.completion", "usage": { "completion_tokens": 1207, "prompt_tokens": 11, "total_tokens": 1218, "prompt_tokens_details": { "cached_tokens": 0 }, "completion_tokens_details": { "reasoning_tokens": 419 } } } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "time" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/chat" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), arkruntime.WithTimeout(30*time.Minute), ) ctx := context.Background() req := &chat.ChatCompletionRequest{ Model: "doubao-seed-2-1-pro-260915", Messages: []chat.ChatCompletionRequestMessage{ userMessage("我要研究推理模型与非推理模型的区别,如何体现课题的专业性?"), }, } resp, err := client.CreateChatCompletion(ctx, req) if err != nil { fmt.Printf("standard chat error: %v\n", err) return } if reasoning, ok := resp.Choices[0].Message.ReasoningContent.Get(); ok { fmt.Println(reasoning) } fmt.Println(resp.Choices[0].Message.Content) } func userMessage(content string) chat.ChatCompletionRequestMessage { return chat.ChatCompletionRequestMessage{ OneOf: chat.NewChatCompletionRequestUserMessageChatCompletionRequestMessageSum( chat.ChatCompletionRequestUserMessage{ Role: chat.ChatCompletionRequestUserMessageRoleUser, Content: chat.NewOptNilChatCompletionMessageContent(chat.NewStringChatCompletionMessageContent(content)), }, ), } } ``` #### Response ``` { "choices": [ { "finish_reason": "stop", "index": 0, "logprobs": null, "message": { "content": "\n\n推理模型与非推理模型的主要区别在于其处理任务的方式、能力侧重点以及应用场景。以下是两者的核心区别分析:\n\n---\n\n### **1. 核心定义**\n- **推理模型** \n 具备**逻辑推理、因果推断或复杂决策**能力,*** \n\n实际应用中,两类模型常配合使用(如用非推理模型提取特征,再交给推理模型决策),以平衡效率与准确性。", "reasoning_content": "嗯,用户问的是推理模型和非推理模型有什么区别。我需要先理解这两个术语的具体含义。可能用户对机器学习或深度学习有一定的了解,但需要更清晰的区分。首先,我应该明确这两个概念的定义,然后从不同角度进行比较。\n\n首先,推理模型可能指的是那些需要进行逻辑推理、处理复杂任务的模型,***,而非推理模型侧重于模式识别和直接映射,帮助用户形成清晰的概念框架。\n", "role": "assistant" } } ], "created": 1742636537, "id": "0217426364949596592a076493be583bc5e33f80ac2dcf1eeaf9b", "model": "doubao-seed-2-1-pro-260915", "service_tier": "default", "object": "chat.completion", "usage": { "completion_tokens": 1207, "prompt_tokens": 11, "total_tokens": 1218, "prompt_tokens_details": { "cached_tokens": 0 }, "completion_tokens_details": { "reasoning_tokens": 419 } } } ``` ### Java #### Request ```java package com.example; import com.volcengine.ark.runtime.models.chat.*; import com.volcengine.ark.runtime.service.ArkService; import java.time.Duration; import java.util.ArrayList; import java.util.List; /** * 这是一个示例类,展示了如何使用ArkService来完成聊天功能。 */ public class ChatCompletionsExample { public static void main(String[] args) { // 从环境变量中获取API密钥 String apiKey = System.getenv("ARK_API_KEY"); // 创建ArkService实例 ArkService arkService = ArkService.builder().apiKey(apiKey) .timeout(Duration.ofMinutes(30))// 深度推理模型耗费时间会较长,请您设置较大的超时时间,避免超时导致任务失败。推荐30分钟以上 .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); // 初始化消息列表 List chatMessages = new ArrayList<>(); // 创建用户消息 ChatCompletionRequestMessage userMessage = ChatCompletionRequestUserMessage.builder() .role(ChatCompletionRequestMessageType.USER) // 设置消息角色为用户 .content(ChatCompletionMessageContent.ofString("我要有研究推理模型与非推理模型区别的课题,怎么体现我的专业性")) // 设置消息内容 .build(); // 将用户消息添加到消息列表 chatMessages.add(userMessage); // 创建聊天完成请求 ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder() .model("doubao-seed-2-1-pro-260915") .messages(chatMessages) // 设置消息列表 .build(); // 发送聊天完成请求并打印响应 try { // 获取响应并打印每个选择的消息内容 arkService.createChatCompletion(chatCompletionRequest) .getChoices() .forEach(choice -> { // 校验是否触发了深度思考,打印思维链内容 if (choice.getMessage().getReasoningContent() != null) { System.out.println("推理内容: " + choice.getMessage().getReasoningContent()); } else { System.out.println("推理内容为空"); } // 打印消息内容 System.out.println("消息内容: " + choice.getMessage().getContent()); }); } catch (Exception e) { System.out.println("请求失败: " + e.getMessage()); } finally { // 关闭服务执行器 arkService.shutdownExecutor(); } } } ``` #### Response ``` { "choices": [ { "finish_reason": "stop", "index": 0, "logprobs": null, "message": { "content": "\n\n推理模型与非推理模型的主要区别在于其处理任务的方式、能力侧重点以及应用场景。以下是两者的核心区别分析:\n\n---\n\n### **1. 核心定义**\n- **推理模型** \n 具备**逻辑推理、因果推断或复杂决策**能力,*** \n\n实际应用中,两类模型常配合使用(如用非推理模型提取特征,再交给推理模型决策),以平衡效率与准确性。", "reasoning_content": "嗯,用户问的是推理模型和非推理模型有什么区别。我需要先理解这两个术语的具体含义。可能用户对机器学习或深度学习有一定的了解,但需要更清晰的区分。首先,我应该明确这两个概念的定义,然后从不同角度进行比较。\n\n首先,推理模型可能指的是那些需要进行逻辑推理、处理复杂任务的模型,***,而非推理模型侧重于模式识别和直接映射,帮助用户形成清晰的概念框架。\n", "role": "assistant" } } ], "created": 1742636537, "id": "0217426364949596592a076493be583bc5e33f80ac2dcf1eeaf9b", "model": "doubao-seed-2-1-pro-260915", "service_tier": "default", "object": "chat.completion", "usage": { "completion_tokens": 1207, "prompt_tokens": 11, "total_tokens": 1218, "prompt_tokens_details": { "cached_tokens": 0 }, "completion_tokens_details": { "reasoning_tokens": 419 } } } ``` --- # 创建 Response Source: https://ark.volcengine.com/region:cn-beijing/docs/create-model-responses-api `POST https://ark.cn-beijing.volces.com/api/v3/responses` 通过 Responses API 创建一个 Response,本文介绍接口的输入输出参数。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Header 参数 > 在 HTTP 请求头中传入。 **X-Fornax-Trace** `string` | 开启数据上报 是否开启数据上报。设置为 `true` 时,Responses API 会将请求数据上报至方舟平台,用于统计分析。开启后,可在推理接入点的**分析统计**页面查看 Trace 列表与 Trace 详情,用于快速排查与定位问题。 > **说明** > > - 当前仅 Responses API 支持通过该 header 开启数据上报。 > - SDK 设置 header 的示例参见 [开启数据上报](/docs/sdk-common-examples#d5f5495b)。 > - 支持统计分析的数据范围参见 [分析统计](/docs/manage-inference-endpoints#db0a7d46)。 ### Body 参数 **input** `string / object[]` `必选` | 输入内容 模型需要处理的输入内容。可为文本字符串(等同于 `user` 角色的单条文本输入),或输入元素列表(支持消息、函数调用、思考等多种类型,见 *InputItem*)。 文本输入 `string` 输入给模型的文本类型信息,等同于使用 user 角色输入的文本信息。 输入的元素列表 `object[]` 输入给模型的信息元素,可以包括不同的信息类型。 输入的消息 `object` 发送给模型的消息,其中角色用于指示指令遵循的优先级层级。由 developer 或 system 角色给出的指令优先于 user 角色给出的指令。assistant 角色的消息通常被认为是模型在先前交互中生成的回复。 **content** `string / object[]` `必选` | 消息内容 `input.content` 用于生成回复的文本、图片、视频或文件输入,也可以包含先前助手的回复内容。 文本输入 `string` 文本类型的消息内容,直接传入字符串。 输入的内容列表 `object[]` 内容元素列表,可包含文本、图片、视频、文件和音频等多种模态输入。 输入模型的文本 `object` 输入给模型的文本内容。 **text** `string` `必选` | 文本 `input.content.text` 文本内容。 **type** `string` `必选` | 类型 `input.content.type` 内容类型标识。 取值固定为 `input_text`。 **translation_options** `object` | 翻译选项 `input.content.translation_options` 文本翻译选项,指定源语言与目标语言以启用翻译。 输入模型的图片 `object` 输入给模型的图片内容。支持通过 file_id、image_url 或 Base64 编码传入。 **type** `string` `必选` | 类型 `input.content.type` 内容类型标识。 取值固定为 `input_image`。 **detail** `string` | 精度 `input.content.detail` 图片解析精度,控制模型处理图片的清晰度与细节层级。可选值:`auto`、`low`、`high`、`xhigh`。 > **说明** > > 不同模型默认取值及对应的具体像素区间,参见 [控制图片理解的精细度](/docs/image-understanding#bf4d9224)。 **file_id** `string` | 文件 ID `input.content.file_id` 文件 ID。 * 文件 ID 是通过 [Files API](/docs/upload-files-api)上传文件后返回的 id。 * **file_id** 对应的文件类型需要和 **type** 保持一致,且文件状态需要为**active**。 * **API Key** 所属项目与 **file_id** 上传时所属项目需保持一致 **image_pixel_limit** `object` `默认值 null` | 像素限制 `input.content.image_pixel_limit` 输入给模型的图片的像素范围,如不在此范围,图片会被等比例缩放至该范围。 > **注意** > > 图片像素范围需在 `[196, 36000000]`,否则会直接报错。 > > * 生效优先级:高于 `detail` 字段,即同时配置 `detail` 与 `image_pixel_limit` 字段时,生效 `image_pixel_limit` 字段配置。 > * 默认生效规则:若未设置 `image_pixel_limit`,则使用 `detail` 配置的值对应的 `min_pixels` / `max_pixels` 值。 **max_pixels** `integer` | 最大像素 `input.content.image_pixel_limit.max_pixels` 传入图片最大像素限制,大于此像素则等比例缩小至 `max_pixels` 字段取值以下。若未设置,则取值为 `detail` 配置的值对应的 `max_pixels` 值。 **最大值**:`9031680` **min_pixels** `integer` | 最小像素 `input.content.image_pixel_limit.min_pixels` 传入图片最小像素限制,小于此像素则等比例放大至 `min_pixels` 字段取值以上。若未设置,则取值为 `detail` 配置的值对应的 `min_pixels` 值。 **最小值**:`1764` **image_url** `string` | 图片地址 `input.content.image_url` 图片 URL 或 Base64 编码(格式 `data:image/{格式};base64,{编码}`) 输入模型的音频 `object` 输入给模型的音频内容。支持通过 file_id 或 audio_url 传入。 **type** `string` `必选` | 类型 `input.content.type` 内容类型标识,用于区分 ContentItem 变体。 取值固定为 `input_audio`。 **audio_url** `string` | 音频地址 `input.content.audio_url` 音频 URL 或 Base64 编码。 **chunking_strategy** `object` | 分段策略 `input.content.chunking_strategy` 音频分段策略配置。 **type** `string` `必选` | 类型 `input.content.chunking_strategy.type` 分段策略的类型标识。 取值固定为 `server_vad`。 **prefix_padding_ms** `integer` | 前置填充 `input.content.chunking_strategy.prefix_padding_ms` 语音前置静音填充时长(毫秒) **silence_duration_ms** `integer` | 静音时长 `input.content.chunking_strategy.silence_duration_ms` 触发分段的静音持续时长(毫秒) **threshold** `number` | 检测阈值 `input.content.chunking_strategy.threshold` VAD 检测阈值。 **file_id** `string` | 文件 ID `input.content.file_id` 文件 ID。 * 文件 ID 是通过 [Files API](/docs/upload-files-api)上传文件后返回的 id。 * **file_id** 对应的文件类型需要和 **type** 保持一致,且文件状态需要为**active**。 * **API Key** 所属项目与 **file_id** 上传时所属项目需保持一致 输入模型的文件 `object` 输入给模型的文件内容。支持通过 file_id、file_data(Base64)或 file_url 传入。 **type** `string` `必选` | 类型 `input.content.type` 内容项的类型标识。 取值固定为 `input_file`。 **file_data** `string` | 文件数据 `input.content.file_data` Base64 编码的文件内容。 > **说明** > > 文件大小上限为 50 MB。 **file_id** `string` | 文件 ID `input.content.file_id` 文件 ID。 * 文件 ID 是通过 [Files API](/docs/upload-files-api)上传文件后返回的 id。 * **file_id** 对应的文件类型需要和 **type** 保持一致,且文件状态需要为**active**。 * **API Key** 所属项目与 **file_id** 上传时所属项目需保持一致 **file_url** `string` | 文件地址 `input.content.file_url` 可访问的文件 URL。 > **说明** > > 文件大小上限为 50 MB。 **filename** `string` | 文件名 `input.content.filename` 文件名称。 > **说明** > > 使用 `file_data` 传入文件内容时必传。 输入模型的视频 `object` 输入给模型的视频内容。支持通过 file_id、video_url 或 Base64 编码传入。 **type** `string` `必选` | 类型 `input.content.type` 内容类型标识,用于标记该 ContentItem 为视频输入变体。 取值固定为 `input_video`。 **video_url** `string` `必选` | 视频地址 `input.content.video_url` 视频内容来源。可传完整的 HTTP(S) URL,或 data URL 形式的 Base64 编码视频。 **file_id** `string` | 文件 ID `input.content.file_id` 文件 ID。 * 文件 ID 是通过 [Files API](/docs/upload-files-api)上传文件后返回的 id。 * **file_id** 对应的文件类型需要和 **type** 保持一致,且文件状态需要为**active**。 * **API Key** 所属项目与 **file_id** 上传时所属项目需保持一致 **fps** `number` | 抽帧帧率 `input.content.fps` 视频抽帧频率,指定每秒从视频中提取的图像帧数。 > **说明** > > 使用 `file_id` 传入视频时,`fps` 参数失效。 **取值范围**:`[0.2, 5]` 模型文本输出 `object` 模型生成的文本输出,可在多轮对话中作为上下文回传。 **type** `string` `必选` | 类型 `input.content.type` 内容类型标识。 取值固定为 `output_text`。 **annotations** `object[]` | 标注列表 `input.content.annotations` 文本附带的标注信息列表(如引用来源等) 网页引用 `object` 引用自互联网网页的标注信息。 **title** `string` `必选` | 标题 `input.content.annotations.title` 引用网页的标题。 **type** `string` `必选` | 类型 `input.content.annotations.type` 标注类型的判别字段(discriminator)。 取值固定为 `url_citation`。 **url** `string` `必选` | 网址 `input.content.annotations.url` 引用网页的 URL 地址。 **cover_image** `object` | 封面图 `input.content.annotations.cover_image` 网页封面图片信息。 **height** `integer` | 高度 `input.content.annotations.cover_image.height` 封面图片高度(像素) **url** `string` | 图片地址 `input.content.annotations.cover_image.url` 封面图片的 URL 地址。 **width** `integer` | 宽度 `input.content.annotations.cover_image.width` 封面图片宽度(像素) **freshness_info** `string` | 新鲜度 `input.content.annotations.freshness_info` 内容新鲜度信息。 **logo_url** `string` | Logo 地址 `input.content.annotations.logo_url` 网站 Logo 图标地址。 **mobile_url** `string` | 移动端地址 `input.content.annotations.mobile_url` 移动端访问地址。 **publish_time** `string` | 发布时间 `input.content.annotations.publish_time` 网页发布时间。 **site_name** `string` | 站点名 `input.content.annotations.site_name` 站点名称。 **summary** `string` | 摘要 `input.content.annotations.summary` 网页内容摘要。 文档引用 `object` 引用自私域知识库文档的标注信息。 **type** `string` `必选` | 类型 `input.content.annotations.type` 标注类型。 取值固定为 `doc_citation`。 **chunk_attachment** `object[]` | 分块附件 `input.content.annotations.chunk_attachment` 引用分块附带的附件信息列表。 **chunk_id** `integer` | 分块 ID `input.content.annotations.chunk_id` 引用文档分块的 ID。 **doc_id** `string` | 文档 ID `input.content.annotations.doc_id` 引用文档的 ID。 **doc_name** `string` | 文档名 `input.content.annotations.doc_name` 引用文档的名称。 **text** `string` | 文本内容 `input.content.text` 模型生成的文本内容。 模型思维链文本 `object` 模型思维链文本输出,可在多轮对话中作为上下文回传。 **type** `string` `必选` | 类型 `input.content.type` 内容类型标识。 取值固定为 `reasoning_text`。 **annotations** `object[]` | 标注列表 `input.content.annotations` 思维链附带的标注信息列表。 网页引用 `object` 引用自互联网网页的标注信息。 **title** `string` `必选` | 标题 `input.content.annotations.title` 引用网页的标题。 **type** `string` `必选` | 类型 `input.content.annotations.type` 标注类型的判别字段(discriminator)。 取值固定为 `url_citation`。 **url** `string` `必选` | 网址 `input.content.annotations.url` 引用网页的 URL 地址。 **cover_image** `object` | 封面图 `input.content.annotations.cover_image` 网页封面图片信息。 **height** `integer` | 高度 `input.content.annotations.cover_image.height` 封面图片高度(像素) **url** `string` | 图片地址 `input.content.annotations.cover_image.url` 封面图片的 URL 地址。 **width** `integer` | 宽度 `input.content.annotations.cover_image.width` 封面图片宽度(像素) **freshness_info** `string` | 新鲜度 `input.content.annotations.freshness_info` 内容新鲜度信息。 **logo_url** `string` | Logo 地址 `input.content.annotations.logo_url` 网站 Logo 图标地址。 **mobile_url** `string` | 移动端地址 `input.content.annotations.mobile_url` 移动端访问地址。 **publish_time** `string` | 发布时间 `input.content.annotations.publish_time` 网页发布时间。 **site_name** `string` | 站点名 `input.content.annotations.site_name` 站点名称。 **summary** `string` | 摘要 `input.content.annotations.summary` 网页内容摘要。 文档引用 `object` 引用自私域知识库文档的标注信息。 **type** `string` `必选` | 类型 `input.content.annotations.type` 标注类型。 取值固定为 `doc_citation`。 **chunk_attachment** `object[]` | 分块附件 `input.content.annotations.chunk_attachment` 引用分块附带的附件信息列表。 **chunk_id** `integer` | 分块 ID `input.content.annotations.chunk_id` 引用文档分块的 ID。 **doc_id** `string` | 文档 ID `input.content.annotations.doc_id` 引用文档的 ID。 **doc_name** `string` | 文档名 `input.content.annotations.doc_name` 引用文档的名称。 **text** `string` | 文本内容 `input.content.text` 模型思维链文本内容。 **id** `string` | 条目 ID `input.id` 输入条目的唯一 ID。 **partial** `boolean` | 续写模式 `input.partial` 是否启用续写模式。 > **说明** > > * 仅 `assistant` 角色的消息支持开启续写模式,模型会在原消息内容后继续生成,而非重新起草。 > * 续写场景下 `partial` 必须显式设为 `true`。 **phase** `string` | 消息阶段 `input.phase` 标记 assistant 消息属于中间讲解还是最终回答。在回放 assistant 历史消息时,建议保留并原样回传该字段。可选值:`commentary`、`final_answer`。 **role** `string` | 角色 `input.role` 输入消息的角色,决定指令的优先级层级。可选值:`user`、`system`、`assistant`、`developer`。 **type** `string` `默认值 message` | 类型 `input.type` 输入元素类型标识。 取值固定为 `message`。 > **说明** > > 当 `role` 设置为 `assistant`,且 `content` 中包含 `output_text` 内容块,必须显式传入 `"type": "message"`。 函数调用记录 `object` 历史工具函数调用记录,用于多轮对话中回传模型之前发起的函数调用。 **type** `string` `必选` | 类型 `input.type` 输入元素类型标记,用于区分不同类型的历史输入条目。 取值固定为 `function_call`。 **arguments** `string` | 参数 `input.arguments` 函数参数的 JSON 字符串。 **call_id** `string` | 调用 ID `input.call_id` 函数工具调用的唯一标识 ID,与之前模型输出的 function_call.call_id 对应,用于在多轮回传中关联同一次调用及其结果。 **id** `string` | 条目 ID `input.id` 该 function_call 条目在 Response 中的唯一 ID,区别于用于关联函数结果的 `call_id`。 **name** `string` | 函数名 `input.name` 要运行的函数名称。 **status** `string` | 状态 `input.status` 该 function_call 条目当前的处理状态。可选值:`in_progress`、`completed`、`incomplete`。 函数返回结果 `object` 工具函数返回的结果,用于将函数执行结果回传给模型。 **type** `string` `必选` | 类型 `input.type` 输入元素类型标识。 取值固定为 `function_call_output`。 **call_id** `string` | 调用 ID `input.call_id` 函数工具调用的唯一标识 ID(与对应 function_call 的 call_id 一致) **id** `string` | 条目 ID `input.id` 函数返回结果的唯一 ID。 **output** `string / object[]` | 输出结果 `input.output` 工具函数执行完成后返回给模型的结果内容。 文本输入 `string` 文本类型的消息内容,直接传入字符串。 输入的内容列表 `object[]` 内容元素列表,可包含文本、图片、视频、文件和音频等多种模态输入。 输入模型的文本 `object` 输入给模型的文本内容。 **text** `string` `必选` | 文本 `input.output.text` 文本内容。 **type** `string` `必选` | 类型 `input.output.type` 内容类型标识。 取值固定为 `input_text`。 **translation_options** `object` | 翻译选项 `input.output.translation_options` 文本翻译选项,指定源语言与目标语言以启用翻译。 输入模型的图片 `object` 输入给模型的图片内容。支持通过 file_id、image_url 或 Base64 编码传入。 **type** `string` `必选` | 类型 `input.output.type` 内容类型标识。 取值固定为 `input_image`。 **detail** `string` | 精度 `input.output.detail` 图片解析精度,控制模型处理图片的清晰度与细节层级。可选值:`auto`、`low`、`high`、`xhigh`。 > **说明** > > 不同模型默认取值及对应的具体像素区间,参见 [控制图片理解的精细度](/docs/image-understanding#bf4d9224)。 **file_id** `string` | 文件 ID `input.output.file_id` 文件 ID。 * 文件 ID 是通过 [Files API](/docs/upload-files-api)上传文件后返回的 id。 * **file_id** 对应的文件类型需要和 **type** 保持一致,且文件状态需要为**active**。 * **API Key** 所属项目与 **file_id** 上传时所属项目需保持一致 **image_pixel_limit** `object` `默认值 null` | 像素限制 `input.output.image_pixel_limit` 输入给模型的图片的像素范围,如不在此范围,图片会被等比例缩放至该范围。 > **注意** > > 图片像素范围需在 `[196, 36000000]`,否则会直接报错。 > > * 生效优先级:高于 `detail` 字段,即同时配置 `detail` 与 `image_pixel_limit` 字段时,生效 `image_pixel_limit` 字段配置。 > * 默认生效规则:若未设置 `image_pixel_limit`,则使用 `detail` 配置的值对应的 `min_pixels` / `max_pixels` 值。 **max_pixels** `integer` | 最大像素 `input.output.image_pixel_limit.max_pixels` 传入图片最大像素限制,大于此像素则等比例缩小至 `max_pixels` 字段取值以下。若未设置,则取值为 `detail` 配置的值对应的 `max_pixels` 值。 **最大值**:`9031680` **min_pixels** `integer` | 最小像素 `input.output.image_pixel_limit.min_pixels` 传入图片最小像素限制,小于此像素则等比例放大至 `min_pixels` 字段取值以上。若未设置,则取值为 `detail` 配置的值对应的 `min_pixels` 值。 **最小值**:`1764` **image_url** `string` | 图片地址 `input.output.image_url` 图片 URL 或 Base64 编码(格式 `data:image/{格式};base64,{编码}`) 输入模型的音频 `object` 输入给模型的音频内容。支持通过 file_id 或 audio_url 传入。 **type** `string` `必选` | 类型 `input.output.type` 内容类型标识,用于区分 ContentItem 变体。 取值固定为 `input_audio`。 **audio_url** `string` | 音频地址 `input.output.audio_url` 音频 URL 或 Base64 编码。 **chunking_strategy** `object` | 分段策略 `input.output.chunking_strategy` 音频分段策略配置。 **type** `string` `必选` | 类型 `input.output.chunking_strategy.type` 分段策略的类型标识。 取值固定为 `server_vad`。 **prefix_padding_ms** `integer` | 前置填充 `input.output.chunking_strategy.prefix_padding_ms` 语音前置静音填充时长(毫秒) **silence_duration_ms** `integer` | 静音时长 `input.output.chunking_strategy.silence_duration_ms` 触发分段的静音持续时长(毫秒) **threshold** `number` | 检测阈值 `input.output.chunking_strategy.threshold` VAD 检测阈值。 **file_id** `string` | 文件 ID `input.output.file_id` 文件 ID。 * 文件 ID 是通过 [Files API](/docs/upload-files-api)上传文件后返回的 id。 * **file_id** 对应的文件类型需要和 **type** 保持一致,且文件状态需要为**active**。 * **API Key** 所属项目与 **file_id** 上传时所属项目需保持一致 输入模型的文件 `object` 输入给模型的文件内容。支持通过 file_id、file_data(Base64)或 file_url 传入。 **type** `string` `必选` | 类型 `input.output.type` 内容项的类型标识。 取值固定为 `input_file`。 **file_data** `string` | 文件数据 `input.output.file_data` Base64 编码的文件内容。 > **说明** > > 文件大小上限为 50 MB。 **file_id** `string` | 文件 ID `input.output.file_id` 文件 ID。 * 文件 ID 是通过 [Files API](/docs/upload-files-api)上传文件后返回的 id。 * **file_id** 对应的文件类型需要和 **type** 保持一致,且文件状态需要为**active**。 * **API Key** 所属项目与 **file_id** 上传时所属项目需保持一致 **file_url** `string` | 文件地址 `input.output.file_url` 可访问的文件 URL。 > **说明** > > 文件大小上限为 50 MB。 **filename** `string` | 文件名 `input.output.filename` 文件名称。 > **说明** > > 使用 `file_data` 传入文件内容时必传。 输入模型的视频 `object` 输入给模型的视频内容。支持通过 file_id、video_url 或 Base64 编码传入。 **type** `string` `必选` | 类型 `input.output.type` 内容类型标识,用于标记该 ContentItem 为视频输入变体。 取值固定为 `input_video`。 **video_url** `string` `必选` | 视频地址 `input.output.video_url` 视频内容来源。可传完整的 HTTP(S) URL,或 data URL 形式的 Base64 编码视频。 **file_id** `string` | 文件 ID `input.output.file_id` 文件 ID。 * 文件 ID 是通过 [Files API](/docs/upload-files-api)上传文件后返回的 id。 * **file_id** 对应的文件类型需要和 **type** 保持一致,且文件状态需要为**active**。 * **API Key** 所属项目与 **file_id** 上传时所属项目需保持一致 **fps** `number` | 抽帧帧率 `input.output.fps` 视频抽帧频率,指定每秒从视频中提取的图像帧数。 > **说明** > > 使用 `file_id` 传入视频时,`fps` 参数失效。 **取值范围**:`[0.2, 5]` 模型文本输出 `object` 模型生成的文本输出,可在多轮对话中作为上下文回传。 **type** `string` `必选` | 类型 `input.output.type` 内容类型标识。 取值固定为 `output_text`。 **annotations** `object[]` | 标注列表 `input.output.annotations` 文本附带的标注信息列表(如引用来源等) 网页引用 `object` 引用自互联网网页的标注信息。 **title** `string` `必选` | 标题 `input.output.annotations.title` 引用网页的标题。 **type** `string` `必选` | 类型 `input.output.annotations.type` 标注类型的判别字段(discriminator)。 取值固定为 `url_citation`。 **url** `string` `必选` | 网址 `input.output.annotations.url` 引用网页的 URL 地址。 **cover_image** `object` | 封面图 `input.output.annotations.cover_image` 网页封面图片信息。 **height** `integer` | 高度 `input.output.annotations.cover_image.height` 封面图片高度(像素) **url** `string` | 图片地址 `input.output.annotations.cover_image.url` 封面图片的 URL 地址。 **width** `integer` | 宽度 `input.output.annotations.cover_image.width` 封面图片宽度(像素) **freshness_info** `string` | 新鲜度 `input.output.annotations.freshness_info` 内容新鲜度信息。 **logo_url** `string` | Logo 地址 `input.output.annotations.logo_url` 网站 Logo 图标地址。 **mobile_url** `string` | 移动端地址 `input.output.annotations.mobile_url` 移动端访问地址。 **publish_time** `string` | 发布时间 `input.output.annotations.publish_time` 网页发布时间。 **site_name** `string` | 站点名 `input.output.annotations.site_name` 站点名称。 **summary** `string` | 摘要 `input.output.annotations.summary` 网页内容摘要。 文档引用 `object` 引用自私域知识库文档的标注信息。 **type** `string` `必选` | 类型 `input.output.annotations.type` 标注类型。 取值固定为 `doc_citation`。 **chunk_attachment** `object[]` | 分块附件 `input.output.annotations.chunk_attachment` 引用分块附带的附件信息列表。 **chunk_id** `integer` | 分块 ID `input.output.annotations.chunk_id` 引用文档分块的 ID。 **doc_id** `string` | 文档 ID `input.output.annotations.doc_id` 引用文档的 ID。 **doc_name** `string` | 文档名 `input.output.annotations.doc_name` 引用文档的名称。 **text** `string` | 文本内容 `input.output.text` 模型生成的文本内容。 模型思维链文本 `object` 模型思维链文本输出,可在多轮对话中作为上下文回传。 **type** `string` `必选` | 类型 `input.output.type` 内容类型标识。 取值固定为 `reasoning_text`。 **annotations** `object[]` | 标注列表 `input.output.annotations` 思维链附带的标注信息列表。 网页引用 `object` 引用自互联网网页的标注信息。 **title** `string` `必选` | 标题 `input.output.annotations.title` 引用网页的标题。 **type** `string` `必选` | 类型 `input.output.annotations.type` 标注类型的判别字段(discriminator)。 取值固定为 `url_citation`。 **url** `string` `必选` | 网址 `input.output.annotations.url` 引用网页的 URL 地址。 **cover_image** `object` | 封面图 `input.output.annotations.cover_image` 网页封面图片信息。 **height** `integer` | 高度 `input.output.annotations.cover_image.height` 封面图片高度(像素) **url** `string` | 图片地址 `input.output.annotations.cover_image.url` 封面图片的 URL 地址。 **width** `integer` | 宽度 `input.output.annotations.cover_image.width` 封面图片宽度(像素) **freshness_info** `string` | 新鲜度 `input.output.annotations.freshness_info` 内容新鲜度信息。 **logo_url** `string` | Logo 地址 `input.output.annotations.logo_url` 网站 Logo 图标地址。 **mobile_url** `string` | 移动端地址 `input.output.annotations.mobile_url` 移动端访问地址。 **publish_time** `string` | 发布时间 `input.output.annotations.publish_time` 网页发布时间。 **site_name** `string` | 站点名 `input.output.annotations.site_name` 站点名称。 **summary** `string` | 摘要 `input.output.annotations.summary` 网页内容摘要。 文档引用 `object` 引用自私域知识库文档的标注信息。 **type** `string` `必选` | 类型 `input.output.annotations.type` 标注类型。 取值固定为 `doc_citation`。 **chunk_attachment** `object[]` | 分块附件 `input.output.annotations.chunk_attachment` 引用分块附带的附件信息列表。 **chunk_id** `integer` | 分块 ID `input.output.annotations.chunk_id` 引用文档分块的 ID。 **doc_id** `string` | 文档 ID `input.output.annotations.doc_id` 引用文档的 ID。 **doc_name** `string` | 文档名 `input.output.annotations.doc_name` 引用文档的名称。 **text** `string` | 文本内容 `input.output.text` 模型思维链文本内容。 **status** `string` | 状态 `input.status` 函数输出条目的处理状态。可选值:`in_progress`、`completed`、`incomplete`。 模型思维链信息 `object` 在模型生成响应时使用的思维链信息。如果需要手动管理,需要设置该字段,以便在后续的对话中进行管理。 **status** `string` `必选` | 状态 `input.status` 推理内容的状态。可选值:`in_progress`、`completed`、`incomplete`。 **type** `string` `必选` | 类型 `input.type` 输入元素类型判别标签。 取值固定为 `reasoning`。 **content** `object[]` | 推理内容 `input.content` 推理过程的内容元素列表。 模型回答文本 `object` 模型生成的最终回答文本。 **type** `string` `必选` | 类型 `input.content.type` 内容类型判别字段,用于区分 union 变体。 取值固定为 `output_text`。 **annotations** `object[]` | 标注列表 `input.content.annotations` 文本附带的标注信息列表(如引用来源等) 网页引用 `object` 引用自互联网网页的标注信息。 **title** `string` `必选` | 标题 `input.content.annotations.title` 引用网页的标题。 **type** `string` `必选` | 类型 `input.content.annotations.type` 标注类型的判别字段(discriminator)。 取值固定为 `url_citation`。 **url** `string` `必选` | 网址 `input.content.annotations.url` 引用网页的 URL 地址。 **cover_image** `object` | 封面图 `input.content.annotations.cover_image` 网页封面图片信息。 **height** `integer` | 高度 `input.content.annotations.cover_image.height` 封面图片高度(像素) **url** `string` | 图片地址 `input.content.annotations.cover_image.url` 封面图片的 URL 地址。 **width** `integer` | 宽度 `input.content.annotations.cover_image.width` 封面图片宽度(像素) **freshness_info** `string` | 新鲜度 `input.content.annotations.freshness_info` 内容新鲜度信息。 **logo_url** `string` | Logo 地址 `input.content.annotations.logo_url` 网站 Logo 图标地址。 **mobile_url** `string` | 移动端地址 `input.content.annotations.mobile_url` 移动端访问地址。 **publish_time** `string` | 发布时间 `input.content.annotations.publish_time` 网页发布时间。 **site_name** `string` | 站点名 `input.content.annotations.site_name` 站点名称。 **summary** `string` | 摘要 `input.content.annotations.summary` 网页内容摘要。 文档引用 `object` 引用自私域知识库文档的标注信息。 **type** `string` `必选` | 类型 `input.content.annotations.type` 标注类型。 取值固定为 `doc_citation`。 **chunk_attachment** `object[]` | 分块附件 `input.content.annotations.chunk_attachment` 引用分块附带的附件信息列表。 **chunk_id** `integer` | 分块 ID `input.content.annotations.chunk_id` 引用文档分块的 ID。 **doc_id** `string` | 文档 ID `input.content.annotations.doc_id` 引用文档的 ID。 **doc_name** `string` | 文档名 `input.content.annotations.doc_name` 引用文档的名称。 **text** `string` | 文本内容 `input.content.text` 模型生成的文本内容。 模型思维链文本 `object` 模型生成的思维链文本。 **type** `string` `必选` | 类型 `input.content.type` 内容类型标识,用于区分 union 变体。 取值固定为 `reasoning_text`。 **annotations** `object[]` | 标注列表 `input.content.annotations` 思维链附带的标注信息列表。 网页引用 `object` 引用自互联网网页的标注信息。 **title** `string` `必选` | 标题 `input.content.annotations.title` 引用网页的标题。 **type** `string` `必选` | 类型 `input.content.annotations.type` 标注类型的判别字段(discriminator)。 取值固定为 `url_citation`。 **url** `string` `必选` | 网址 `input.content.annotations.url` 引用网页的 URL 地址。 **cover_image** `object` | 封面图 `input.content.annotations.cover_image` 网页封面图片信息。 **height** `integer` | 高度 `input.content.annotations.cover_image.height` 封面图片高度(像素) **url** `string` | 图片地址 `input.content.annotations.cover_image.url` 封面图片的 URL 地址。 **width** `integer` | 宽度 `input.content.annotations.cover_image.width` 封面图片宽度(像素) **freshness_info** `string` | 新鲜度 `input.content.annotations.freshness_info` 内容新鲜度信息。 **logo_url** `string` | Logo 地址 `input.content.annotations.logo_url` 网站 Logo 图标地址。 **mobile_url** `string` | 移动端地址 `input.content.annotations.mobile_url` 移动端访问地址。 **publish_time** `string` | 发布时间 `input.content.annotations.publish_time` 网页发布时间。 **site_name** `string` | 站点名 `input.content.annotations.site_name` 站点名称。 **summary** `string` | 摘要 `input.content.annotations.summary` 网页内容摘要。 文档引用 `object` 引用自私域知识库文档的标注信息。 **type** `string` `必选` | 类型 `input.content.annotations.type` 标注类型。 取值固定为 `doc_citation`。 **chunk_attachment** `object[]` | 分块附件 `input.content.annotations.chunk_attachment` 引用分块附带的附件信息列表。 **chunk_id** `integer` | 分块 ID `input.content.annotations.chunk_id` 引用文档分块的 ID。 **doc_id** `string` | 文档 ID `input.content.annotations.doc_id` 引用文档的 ID。 **doc_name** `string` | 文档名 `input.content.annotations.doc_name` 引用文档的名称。 **text** `string` | 文本内容 `input.content.text` 模型思维链文本内容。 **encrypted_content** `string` | 加密思维链 `input.encrypted_content` 思考内容加密原文。经加密及压缩处理后的思考内容加密原文。 在 Agent 场景下如果不采用 `previous_response_id` 方式进行多轮对话,则必须回传思考内容加密原文,保证模型推理效果。 相关文档: * [关键规则](/docs/agent-model-invocation-practice#key-rules) * [回传思考内容加密块使用示例](/docs/agent-model-invocation-practice#encrypted-thinking-block-examples) **模型支持**: * `doubao-seed-2-0-lite-260428 及后续版本` **id** `string` | 推理 ID `input.id` 推理内容的唯一标识 ID。 **summary** `object[]` | 推理摘要 `input.summary` 模型推理过程的分段摘要,每项对应一段摘要文本,用于多轮对话回传管理思维链上下文。 **type** `string` `必选` | 类型 `input.summary.type` 摘要片段类型标识。 取值固定为 `summary_text`。 **text** `string` | 摘要文本 `input.summary.text` 思维链摘要文本内容。 MCP 审批请求 `object` 历史 MCP 工具审批请求记录,用于多轮对话上下文回传。 **arguments** `string` `必选` | 调用参数 `input.arguments` 工具调用参数的 JSON 字符串。 **name** `string` `必选` | 工具名 `input.name` 待运行的工具名称。 **server_label** `string` `必选` | 服务标签 `input.server_label` 发起请求的 MCP Server 标签。 **type** `string` `必选` | 类型 `input.type` 输入元素类型。 取值固定为 `mcp_approval_request`。 **id** `string` | 请求 ID `input.id` 审批请求的唯一 ID。 MCP 审批响应 `object` 历史 MCP 工具审批响应记录,回传给模型后据此决定是否调用工具。 **approval_request_id** `string` `必选` | 请求 ID `input.approval_request_id` 被回应的审批请求 ID。 **approve** `boolean` `必选` | 是否批准 `input.approve` 是否批准该工具调用请求。 **type** `string` `必选` | 类型 `input.type` 输入元素类型标识。 取值固定为 `mcp_approval_response`。 **id** `string` | 响应 ID `input.id` 审批响应的唯一 ID。 **reason** `string` | 决策理由 `input.reason` 对该审批决策的说明或依据。 MCP 工具清单 `object` 历史 MCP 工具清单记录,用于多轮对话上下文回传。 **server_label** `string` `必选` | 服务标签 `input.server_label` 该工具清单所属的 MCP Server 标签。 **type** `string` `必选` | 类型 `input.type` 输入元素类型,用于标识这是一条 MCP 工具清单记录。 取值固定为 `mcp_list_tools`。 **error** `string` | 错误信息 `input.error` MCP Server 无法返回工具列表时的错误信息。 **id** `string` | 列表 ID `input.id` 工具列表的唯一 ID。 **tools** `object[]` | 工具列表 `input.tools` 该 MCP Server 上可用的工具列表。 **name** `string` `必选` | 工具名 `input.tools.name` 工具名称。 **annotations** `object` | 注解信息 `input.tools.annotations` 工具的附加注解信息。 **description** `string` | 工具描述 `input.tools.description` 工具的功能描述。 **input_schema** `object` | 入参 Schema `input.tools.input_schema` 描述工具入参的 JSON Schema。 MCP 工具调用 `object` 历史 MCP 工具调用记录,用于多轮对话上下文回传。 **name** `string` `必选` | 工具名 `input.name` 实际运行的工具名称。 **server_label** `string` `必选` | 服务标签 `input.server_label` 运行工具的 MCP Server 标签。 **type** `string` `必选` | 类型 `input.type` 输入元素类型判别标签,标识该条目为 MCP 工具调用记录。 取值固定为 `mcp_call`。 **arguments** `string` | 调用参数 `input.arguments` 传递给 MCP 工具的调用参数,JSON 字符串。 > **说明** > > 该字段通过 `response.mcp_call_arguments.delta` 事件流式追加,初始 `output_item.added` 事件可能不携带该字段。 **error** `string` | 错误信息 `input.error` 工具调用失败时的错误信息。 **id** `string` | 调用 ID `input.id` 工具调用的唯一 ID。 **output** `string` | 返回结果 `input.output` 工具调用的返回结果。 上下文元素 `object` 表示模型生成回复时需参考的上下文内容。该项可以包含文本、图片和视频输入,以及先前助手的回复和工具调用的输出。 **id** `string` `必选` | 条目 ID `input.id` 引用的上下文条目 ID。 **type** `string` `必选` | 类型 `input.type` 输入元素类型标识。 取值固定为 `item_reference`。 **model** `string` `必选` | 模型 ID 本次请求调用的模型 ID(Model ID),用于指定处理输入内容的模型。 > **说明** > > - 开通模型服务并查询 Model ID,请参见 [模型列表](/docs/model-list)。 > - 若需要多个应用分别调用模型服务或做更细粒度的权限管理,可改传 Endpoint ID(在线推理接入点的 ID)。 **caching** `object` | 上下文缓存 是否为本次请求开启上下文缓存。 > **注意** > > 不可与 instructions 字段、tools(除自定义函数 Function Calling 外)字段一起使用。 **prefix** `boolean` `默认值 false` | 仅写缓存 `caching.prefix` 是否仅写入前缀缓存,不生成回复。`true` 只写缓存,不返回模型输出;`false` 正常生成回复并写缓存。 **type** `string` `默认值 disabled` | 缓存模式 `caching.type` 缓存模式。 * `enabled`:开启上下文缓存。 * `disabled`:关闭上下文缓存。 **context_management** `object` | 上下文管理 上下文管理策略,帮助模型有效利用上下文窗口。 **edits** `object[]` `必选` | 编辑策略 `context_management.edits` 要应用的上下文编辑策略列表,按顺序执行。 清理工具调用 `object` 清理工具调用记录的编辑策略。 **clear_tool_inputs** `object` `必选` | 清理范围 `context_management.edits.clear_tool_inputs` 清理范围配置(清理全部或仅清理指定工具) **clear_all** `boolean` | 全部清理 `context_management.edits.clear_tool_inputs.clear_all` 是否清理全部工具调用记录。 **tool_name_list** `object` | 指定工具名 `context_management.edits.clear_tool_inputs.tool_name_list` 仅清理指定名称的工具调用记录。 **clear_tool_names** `string[]` `必选` | 工具名列表 `context_management.edits.clear_tool_inputs.tool_name_list.clear_tool_names` 需要清理记录的工具名称列表。 **type** `string` `必选` | 类型 `context_management.edits.type` 编辑策略类型(union 判别字段) 取值固定为 `clear_tool_uses`。 **exclude_tools** `string[]` | 排除工具 `context_management.edits.exclude_tools` 免清理的工具名称列表。列表中的工具,其调用记录不会被清理,仍完整保留在上下文中。 **keep** `object` | 保留策略 `context_management.edits.keep` 保留最近若干次工具调用。 **type** `string` `必选` | 类型 `context_management.edits.keep.type` 保留策略类型。 取值固定为 `tool_uses`。 **value** `integer` `必选` | 保留次数 `context_management.edits.keep.value` 保留的最近工具调用次数。 **trigger** `object` | 触发条件 `context_management.edits.trigger` 触发清理的阈值配置。 **type** `string` `必选` | 类型 `context_management.edits.trigger.type` 触发类型(discriminator) 取值固定为 `tool_uses`。 **value** `integer` `必选` | 触发阈值 `context_management.edits.trigger.value` 累计工具调用次数达到该阈值时触发清理。 清理思维链 `object` 清理思维链内容的编辑策略。 **keep** `object` `必选` | 保留策略 `context_management.edits.keep` 保留策略,配置清理思维链后仍要保留的内容范围。 > **注意** > > *ClearThinkingKeep* 二选一:设 *all* 为 `"all"` 表示全部保留,或通过 *thinking_turn_params* 保留指定轮次。 **all** `string` | 全部保留 `context_management.edits.keep.all` 全部保留策略的启用标识。 取值固定为 `all`。 **thinking_turn_params** `object` | 按轮次保留 `context_management.edits.keep.thinking_turn_params` 按轮次保留的策略配置。 **type** `string` `必选` | 类型 `context_management.edits.keep.thinking_turn_params.type` 保留策略类型(判别字段) 取值固定为 `thinking_turns`。 **value** `integer` `必选` | 保留轮次 `context_management.edits.keep.thinking_turn_params.value` 保留的最近思维链轮次数量。 **最小值**:`0` **type** `string` `必选` | 类型 `context_management.edits.type` 编辑策略类型判别字段。 取值固定为 `clear_thinking`。 **expire_at** `integer` | 过期时间戳 存储过期时刻,UTC Unix 时间戳(秒),对 `store`(上下文存储)和 `caching`(上下文缓存)都生效。默认值:`创建时刻+259200` > **说明** > > * 取值范围:`(创建时刻, 创建时刻+604800]`,即最多保留 7 天。 > * 缓存存储时间计费按 `过期时刻 - 创建时刻` 计算,不满 1 小时按 1 小时计。 > * 详细配置及示例代码请参见 [文档](/docs/context-cache#expire-cache)。 **include** `string[]` | 附加输出数据 指定要在模型响应中返回的其他输出数据。 **instructions** `string` | 系统指令 在模型上下文中作为系统消息或开发者指令插入。 > **说明** > > 与 `previous_response_id` 一起使用时,前一个回复中的指令不会被继承到下一个回复中。 > **注意** > > 不可与缓存能力一起使用。配置了 instructions 字段后,本轮请求无法写入缓存和使用缓存: > - caching 字段配置为 `{"type":"enabled"}` 时报错。 > - 传入带缓存的 previous_response_id 时,缓存输入(cached_tokens)为 0。 **max_output_tokens** `integer` | 最大输出长度 控制模型本次响应输出的最大长度(单位 token),包含模型回答与思维链内容。 > **说明** > > - `deepseek-v4-1-flash-261017`、`deepseek-v4-1-flash-260910`、`deepseek-v4-1-flash-economy-261017` 模型该字段默认值 128k。 > - 模型输出总长度还受模型的上下文长度限制,实际可用上限以模型列表为准。 > - 计入的输出 token 包含模型回答与思维链内容之和。 **max_tool_calls** `integer` | 最大调用轮次 最大工具调用轮次(一轮里不限制次数),在工具调用达到此限制次数后,提示模型停止更多工具调用并进行回答。 > **注意** > > * 该参数为尽力而为(best effort)机制,不保证成功,最终调用次数会受模型推理效果、工具返回结果有效性等因素影响。 > * 各工具类型的默认值: > * `web_search` 基础联网搜索工具默认值 `3`。 > * `image_process` 图像处理工具默认值 `10`,不支持修改。 > * `knowledge_search` 私域知识库搜索工具默认值 `3`。 > * 豆包助手不支持此参数。 **取值范围**:`[1, 10]` **metadata** `object` | 自定义元数据 用户自定义键值对元数据,会与响应对象一同存储并在后续读取时原样回显。最多支持 16 对键值,key 长度不超过 64 个字符,value 长度不超过 512 个字符。 **previous_response_id** `string` | 上轮响应 ID 上一个模型回复的唯一标识符。传入该字段可实现多轮对话。 > **说明** > > - 在请求中传入 `previous_response_id`,会引入上一轮请求的输入和回答内容,本次请求的输入 tokens 会相应增加。 > - 在多轮连续对话中,建议在每次请求之间加入约 100 毫秒的延迟,否则可能会导致调用失败。 **prompt_cache_key** `string` | 缓存路由标识 用于提升隐式缓存命中率的缓存路由标识。取值相同的请求会优先路由到缓存命中率更高的服务,从而提升隐式缓存命中率。 **reasoning** `object` | 思考工作量 限制深度思考的工作量。减少深度思考工作量可使响应速度更快,并且深度思考的 token 用量更小。 **effort** `string` | 思考深度 `reasoning.effort` 限制思考的工作量。减少思考深度可提升速度,思考花费的 token 更少。 * `none`:关闭思考。 * `minimal`:关闭思考,直接回答。 * `low`:轻量思考,侧重快速响应。 * `medium`:均衡模式,兼顾速度与深度。 * `high`:深度分析,处理复杂问题。 * `xhigh`:更高程度思考。 * `max`:最高程度思考,适配高难度推理任务。 > **注意:说明** > > 支持该字段的模型、默认取值、参数兼容映射规则,以及与 `thinking.type` 字段的关系,详见 [文档](/docs/responses-api-deep-thinking#dc4c1547)。 **service_tier** `string` | 推理模式 控制使用的在线推理模式。 * `fast`:本次请求优先使用 [在线推理(低延迟)](/docs/online-inference-low-latency) 模式。 * 推理接入点(`model` 字段指定)有低延迟限流配额,本次请求将会优先使用低延迟限流配额,获得更高的服务等级(延迟、可用性等)。 * 推理接入点无低延迟限流配额,或者限流配额已满,降级至 **在线推理(常规)** 模式,维持常规的服务等级。 * `auto`:本次请求优先使用 [在线推理(TPM 保障包)](/docs/tpm-guarantee-package) 模式。 * 推理接入点有 TPM 保障包额度,本次请求将会优先使用 TPM 保障包额度,获得最高的服务等级。 * 推理接入点无 TPM 保障包额度或用超额度,降级至 **在线推理(常规)** 模式,维持常规的服务等级。 * `default`:本次请求只使用 [在线推理(常规)](/docs/online-inference-standard) 模式,维持常规的服务等级。 * 即使调用的推理接入点有 TPM 保障包额度 / 低延迟限流额度,也只使用在线推理(常规)模式。 * `flex`:本次请求使用 [在线推理(低优)](/docs/online-inference-flex) 模式。 **store** `boolean` `默认值 true` | 存储响应 是否存储生成的模型响应,以便后续通过 API 检索。 - `false`:不存储生成的模型响应。 - `true`:存储当前模型响应。 当 `service_tier` 为 `flex` 时,本字段只能设置为 `false`。 **stream** `boolean` `默认值 false` | 流式输出 响应内容是否流式返回。 - `false`:模型生成完所有内容后一次性返回结果。 - `true`:按 SSE 协议逐块返回模型生成内容,并以一条 `data: [DONE]` 消息结束。 **temperature** `number` `默认值 1.0` | 采样温度 采样温度,控制生成文本时对每个候选词的概率分布进行平滑的程度。 - 取值为 0 时,模型仅考虑对数概率最大的一个 token。 - 较高的值(如 0.8)会使输出更加随机,较低的值(如 0.2)会使输出更加集中确定。 > **注意** > > 调用下列模型时,本字段取值固定为 1,手动指定的参数值将被忽略。 > > - doubao-seed-2-0-code-preview-260215 > - doubao-seed-2-0-pro-260215 > - doubao-seed-2-0-lite-260215 **取值范围**:`[0, 2]` **text** `object` | 输出格式 模型文本输出的格式定义,可以是自然语言,也可以是结构化的 JSON 数据。 **format** `object` `必选` | 输出格式 `text.format` 文本输出格式定义。 **type** `string` `必选` | 格式类型 `text.format.type` 输出格式类型。可选值:`text`、`json_schema`、`json_object`。 > **注意** > > `json_object` / `json_schema` 能力尚在 beta 阶段,请谨慎在生产环境使用。 **description** `string` | 格式描述 `text.format.description` 格式描述信息。 **name** `string` | 格式名称 `text.format.name` 格式名称,作为 JSON Schema 输出格式的标识。 > **注意** > > 仅当 *type* 为 `json_schema` 时需要提供此字段。 **schema** `object` | Schema 定义 `text.format.schema` JSON Schema 定义。当 *type* 为 `json_schema` 时必填。 **strict** `boolean` | 严格模式 `text.format.strict` 是否严格按 JSON Schema 校验模型输出。 > **注意** > > 仅当 *type* 为 `json_schema` 时生效。 **thinking** `object` | 深度思考开关 配置模型深度思考模式的开关,通过子字段 `type` 指定启用、关闭或由模型自行判断。 > **说明** > > 未传入 `thinking` 时,模型默认开启深度思考;如需关闭,需显式将子字段 `type` 设置为 `disabled`。 **type** `string` | 思考模式 `thinking.type` 深度思考模式。 * `enabled`:开启深度思考。 * `disabled`:关闭深度思考。 * `auto`:由模型自行判断是否需要深度思考。 **tool_choice** `string / object` | 工具调用策略 本次请求,模型返回信息中是否有待调用的工具的调用策略。 > **说明** > > * 未指定工具时默认值为 `none`;存在工具时默认值为 `auto`。 **模型支持**: * `Doubao Seed 2.0 系列` 简单策略 `string` 直接传入字符串 `none`、`auto` 或 `required`,控制工具调用整体策略。 指定工具 `object` 通过对象指定具体工具类型或工具名进行调用。 **type** `string` `必选` | 工具类型 `tool_choice.type` 指定要调用的工具类型,用于精确路由到对应工具。可选值: * `function` * `web_search` * `image_process` * `mcp` * `knowledge_search` * `doubao_app` **name** `string` | 工具名称 `tool_choice.name` 指定要调用的具体工具名,如函数名或 MCP 服务下的工具名。 **tools** `object[]` | 工具列表 模型可以调用的工具列表,支持内置工具(Built-in tools)、MCP 工具和自定义工具(Function Calling) 函数调用 `object` 自定义函数调用(Function Calling),让模型生成结构化的函数参数。 **name** `string` `必选` | 函数名 `tools.name` 供模型调用的函数名称,模型在 function_call 输出中以该名称回传,用于匹配对应函数。 **type** `string` `必选` | 类型 `tools.type` 工具类型标识,用于在 union 中区分不同工具类别。 取值固定为 `function`。 **description** `string` | 函数描述 `tools.description` 函数的描述信息,帮助模型理解何时使用该函数。 **parameters** `object` | 参数定义 `tools.parameters` 函数参数定义,遵循 JSON Schema 格式。 联网搜索 `object` 联网搜索工具,让模型在需要时自动进行网页搜索获取实时信息。 **type** `string` `必选` | 类型 `tools.type` 工具类型标识,用于区分 Tool 的不同变体。 取值固定为 `web_search`。 **limit** `integer` `默认值 10` | 最大结果数 `tools.limit` 每轮搜索最大返回结果数量。 > **说明** > > 单次搜索最多返回 20 条;单轮可能有多次搜索,最终召回条数受此参数限制影响。 **取值范围**:`[1, 50]` **max_keyword** `integer` | 最大关键词数 `tools.max_keyword` 最大并行搜索关键词数量。 **取值范围**:`[1, 50]` **sources** `string[]` | 搜索来源 `tools.sources` 搜索信息来源限制,指定模型可从哪些渠道检索网页内容。可选值:`toutiao`、`douyin`、`moji`、`search_engine`、`doubao`。 > **说明** > > `doubao` 不能与其他搜索来源同时配置。传入 `["doubao"]` 时,`tools.limit`、`tools.max_keyword`、`tools.user_location` 均不生效,向它们传入的值将被忽略。 **user_location** `object` | 用户位置 `tools.user_location` 用户地理位置信息,用于搜索优化。 **type** `string` `必选` | 类型 `tools.user_location.type` 位置类型。 取值固定为 `approximate`。 **city** `string` | 城市 `tools.user_location.city` 用户所在城市。 **country** `string` | 国家 `tools.user_location.country` 用户所在国家。 **region** `string` | 地区 `tools.user_location.region` 用户所在地区。 **timezone** `number` | 时区 `tools.user_location.timezone` 用户所在时区。 图像处理 `object` 图像处理工具,让模型对图片进行画点、选区、缩放、旋转等操作。 **type** `string` `必选` | 类型 `tools.type` 工具类型标识,用于区分 Tool 的不同变体。 取值固定为 `image_process`。 **grounding** `object` | 选区功能 `tools.grounding` 选区/裁切功能配置,启用后模型可返回图像中目标的检测框或裁切区域坐标。 **type** `string` `默认值 enabled` | 开关 `tools.grounding.type` 功能开关。可选值:`enabled`、`disabled`。 **point** `object` | 画点功能 `tools.point` 画点/画线功能开关。 **type** `string` `默认值 enabled` | 开关 `tools.point.type` 功能开关。可选值:`enabled`、`disabled`。 **rotate** `object` | 旋转功能 `tools.rotate` 旋转功能开关。启用后模型可请求对图片按指定角度进行旋转。 > **注意** > > 旋转角度支持范围为 0-359 度。 **type** `string` `默认值 enabled` | 开关 `tools.rotate.type` 功能开关。可选值:`enabled`、`disabled`。 **zoom** `object` | 缩放功能 `tools.zoom` 缩放功能开关,启用后模型可对图像目标区域执行缩放操作。 > **说明** > > 缩放倍率支持范围 0.5-2.0 倍。 **type** `string` `默认值 enabled` | 开关 `tools.zoom.type` 功能开关。可选值:`enabled`、`disabled`。 MCP 工具 `object` MCP(Model Context Protocol)工具,让模型调用外部 MCP Server 提供的工具。 **server_label** `string` `必选` | 服务标签 `tools.server_label` MCP Server 的唯一标识标签。模型在工具调用输出中通过该标签指向对应 Server,便于在多个 MCP Server 场景下区分调用来源。 **server_url** `string` `必选` | 服务地址 `tools.server_url` MCP Server 的 HTTP(S) 访问地址,模型通过该地址向 Server 发起工具调用请求。 **type** `string` `必选` | 类型 `tools.type` 工具类型标识,用于区分 Tool 的不同变体。 取值固定为 `mcp`。 **allowed_tools** `string[] / object` | 允许工具 `tools.allowed_tools` 允许模型调用的工具范围。可传工具名称字符串数组,或包含 `tool_names` 字段的过滤器对象。 工具名数组 `string[]` 直接传入允许调用的工具名称数组。 工具过滤器 `object` 通过过滤器对象指定允许调用的工具范围。 **tool_names** `string[]` `必选` | 工具名列表 `tools.allowed_tools.tool_names` 允许调用的工具名称列表。 **headers** `object` | 请求头 `tools.headers` 调用 MCP Server 时附加的 HTTP 请求头,以字符串键值对形式指定 header 名与值。 > **说明** > > * 常用于传递鉴权信息(如 `Authorization`)。 > * `Authorization` 字段不会被服务端存储。 **require_approval** `string / object` `默认值 always` | 审批策略 `tools.require_approval` MCP 工具调用前的审批策略;支持简单模式(字符串)或按工具粒度控制(过滤器对象)。 简单策略 `string` 直接传入字符串 `always` 或 `never`,对所有工具应用统一审批策略。 工具过滤器 `object` 通过过滤器对象按工具粒度配置审批策略。 **always** `object` | 始终审批 `tools.require_approval.always` 始终需要审批的工具过滤器。 **tool_names** `string[]` `必选` | 工具名列表 `tools.require_approval.always.tool_names` 始终需要审批的工具名称列表。 **never** `object` | 无需审批 `tools.require_approval.never` 无需审批的工具过滤器。 **tool_names** `string[]` `必选` | 工具名列表 `tools.require_approval.never.tool_names` 无需审批即可调用的工具名称列表。 **server_description** `string` | 服务描述 `tools.server_description` MCP Server 的描述信息,帮助模型理解何时使用该 Server。 知识库搜索 `object` 私域知识库搜索工具,让模型检索企业内部知识库中的文档内容。 **knowledge_resource_id** `string` `必选` | 知识库 ID `tools.knowledge_resource_id` **type** `string` `必选` | 类型 `tools.type` 工具类型标识,用于区分 Tool 的不同变体。 取值固定为 `knowledge_search`。 **dense_weight** `number` `默认值 0.5` | 稠密权重 `tools.dense_weight` 混合检索中稠密向量(语义)检索的权重,值越大越偏向语义匹配,越小越偏向关键词匹配。 > **说明** > > 仅在混合检索(索引算法为 `hnsw_hybrid`)下生效。 **取值范围**:`[0.2, 1]` **description** `string` | 知识库描述 `tools.description` 知识库描述信息,帮助模型理解何时使用该知识库。 **doc_filter** `object` | 文档过滤 `tools.doc_filter` 设置文档字段级别的检索过滤条件,确保只在符合条件的文档中检索。 > **说明** > > * 支持用作过滤条件的文档字段: > * 系统字段:`doc_id`(仅手动创建的知识库)、`_sys_auto_doc_id`(手动 + API 创建均适用) > * 自定义字段:已为知识库文档添加的**文档标签**(对应知识库 `index_config.fields` 中的 `field`) > * 支持单一条件过滤和多条件组合过滤(支持 `And` / `Or` 逻辑运算)。 > * 详细使用方式和支持字段参见 [filter 表达式](https://docs.volcengine.com/docs/84313/1419289?lang=zh#filter-%E8%A1%A8%E8%BE%BE%E5%BC%8F)。 > * 若自定义字段类型为 `Boolean`,取值范围是 `True` / `False`,大小写规则:cURL 用 `true` / `false`,Python 用 `True` / `False`。 **limit** `integer` `默认值 10` | 最大结果数 `tools.limit` 最大搜索结果数量。 **取值范围**:`[1, 200]` **max_keyword** `integer` | 最大关键词数 `tools.max_keyword` 最大并行搜索关键词数量。 **取值范围**:`[1, 50]` **ranking_options** `object` | 排序选项 `tools.ranking_options` 检索后处理选项。可参考 [知识库 API 文档](https://docs.volcengine.com/docs/84313/1350012?lang=zh) `post_processing` 字段。 **chunk_diffusion_count** `integer` `默认值 0` | 切片扩散数 `tools.ranking_options.chunk_diffusion_count` 检索阶段返回命中切片的上下几片邻近切片。取 `0` 表示不进行 chunk diffusion。 **取值范围**:`[0, 5]` **chunk_group** `boolean` `默认值 false` | 文本聚合 `tools.ranking_options.chunk_group` 文本聚合。 * 默认不聚合。 * 对于非结构化文件,可开启文本聚合以更好保留原文档内容语序。 * 开启后,会根据文档及文档顺序,对切片重新聚合排序返回。 **get_attachment_link** `boolean` `默认值 false` | 获取附件链接 `tools.ranking_options.get_attachment_link` 是否获取切片中图片的临时下载链接。 **rerank_model** `string` `默认值 base-multilingual-rerank` | Rerank 模型 `tools.ranking_options.rerank_model` rerank 模型选择。可选值:`base-multilingual-rerank`、`m3-v2-rerank`。 > **说明** > > * 仅在 `rerank_switch` 为 `true` 时生效。 > * `base-multilingual-rerank`(推荐):速度快、长文本、支持 70+ 种语言。 > * `m3-v2-rerank`:常规文本、支持 100+ 种语言。 **rerank_only_chunk** `boolean` `默认值 false` | 仅切片重排 `tools.ranking_options.rerank_only_chunk` 是否仅根据 chunk 内容计算重排分数。`true` 只根据 chunk 内容计算分;`false` 根据 chunk title + 内容一起计算排序分。 **rerank_switch** `boolean` `默认值 false` | 开启重排 `tools.ranking_options.rerank_switch` 是否自动对检索结果做 rerank。若设置为 `true`,则会自动请求 rerank 模型排序。 **retrieve_count** `integer` `默认值 25` | 重排切片数 `tools.ranking_options.retrieve_count` 进入重排的切片数量。 > **注意** > > * 仅在 `rerank_switch` 为 `true` 时生效。 > * `retrieve_count` 需要大于等于 `limit`,否则会抛出错误。 豆包助手 `object` 豆包助手工具,让模型使用豆包的聊天、深度思考、AI 搜索和推理搜索能力。 **feature** `object` `必选` | 功能配置 `tools.feature` 豆包助手的子功能配置,用于按需开启聊天、深度思考、AI 搜索、推理搜索四类能力并设置对应角色描述。 **ai_search** `object` | AI 搜索 `tools.feature.ai_search` AI 搜索功能配置。 **role_description** `string` | 角色描述 `tools.feature.ai_search.role_description` 使用豆包助手时修改角色设定。默认值:`你的名字是豆包,有很强的专业性。` > **注意** > > 此字段与 `system prompt`、`instructions` 互斥,同时配置时以本字段为准。 **type** `string` `默认值 disabled` | 开关 `tools.feature.ai_search.type` 功能开关。可选值:`enabled`、`disabled`。 **chat** `object` | 普通聊天 `tools.feature.chat` 普通聊天功能配置。 **role_description** `string` | 角色描述 `tools.feature.chat.role_description` 使用豆包助手时修改角色设定。默认值:`你的名字是豆包,有很强的专业性。` > **注意** > > 此字段与 `system prompt`、`instructions` 互斥,同时配置时以本字段为准。 **type** `string` `默认值 disabled` | 开关 `tools.feature.chat.type` 功能开关。可选值:`enabled`、`disabled`。 **deep_chat** `object` | 深度聊天 `tools.feature.deep_chat` 深度聊天功能配置。 **role_description** `string` | 角色描述 `tools.feature.deep_chat.role_description` 使用豆包助手时修改角色设定。默认值:`你的名字是豆包,有很强的专业性。` > **注意** > > 此字段与 `system prompt`、`instructions` 互斥,同时配置时以本字段为准。 **type** `string` `默认值 disabled` | 开关 `tools.feature.deep_chat.type` 功能开关。可选值:`enabled`、`disabled`。 **reasoning_search** `object` | 推理搜索 `tools.feature.reasoning_search` 推理搜索功能配置。 **role_description** `string` | 角色描述 `tools.feature.reasoning_search.role_description` 使用豆包助手时修改角色设定。默认值:`你的名字是豆包,有很强的专业性。` > **注意** > > 此字段与 `system prompt`、`instructions` 互斥,同时配置时以本字段为准。 **type** `string` `默认值 disabled` | 开关 `tools.feature.reasoning_search.type` 功能开关。可选值:`enabled`、`disabled`。 **type** `string` `必选` | 类型 `tools.type` 工具类型,此处固定为 `doubao_app` **user_location** `object` | 用户位置 `tools.user_location` 用户地理位置信息,用于搜索优化。 **type** `string` `必选` | 类型 `tools.user_location.type` 位置类型。 取值固定为 `approximate`。 **city** `string` | 城市 `tools.user_location.city` 用户所在城市。 **country** `string` | 国家 `tools.user_location.country` 用户所在国家。 **region** `string` | 地区 `tools.user_location.region` 用户所在地区。 **timezone** `number` | 时区 `tools.user_location.timezone` 用户所在时区。 **top_p** `number` `默认值 0.7` | 核采样阈值 核采样概率阈值。模型只考虑累计概率质量在 top_p 内的 token;取值为 0 时仅考虑对数概率最大的单个 token。 > **说明** > > 通常仅调整 `temperature` 或 `top_p` 其中之一,不建议同时修改。 > **注意** > > * 当调用下列模型,字段取值固定为 0.95,手动指定的参数值将被忽略。 > * doubao-seed-2-0-code-preview-260215 > * doubao-seed-2-0-pro-260215 > * doubao-seed-2-0-lite-260215 > * `glm-5-3-flash-260828` 模型默认值为 0.95。 > * `deepseek-v4-1-flash-261017`、`deepseek-v4-1-flash-260910`、`deepseek-v4-1-flash-economy-261017` 模型 top_p 参数取值规则如下: > * 思考模式:参数生效。不传该参数时,使用 tool 时默认值为 0.95,其他情况默认值为 1。 > * 传入值 < 0.95:系统自动提升至 0.95。 > * 传入值 ≥ 0.95:按实际传入值使用。 > * 非思考模式:字段取值固定为 1.0,传入的值将被忽略。 **取值范围**:`[0, 1]` ## 响应参数 ### 非流式调用响应。 **created_at** `integer` | 创建时间戳 本次请求创建时间的 Unix 时间戳(秒) **id** `string` | 响应 ID 本次请求的唯一标识。 **model** `string` | 模型 ID 本次请求实际使用的模型名称和版本。 **object** `string` | 对象类型 响应对象的类型标识。 取值固定为 `response`。 **output** `object[]` | 输出条目 模型的输出消息列表,包含模型响应本次请求生成的回答、思维链、工具调用。 消息输出 `object` 模型生成的消息输出,包含文本内容。 **content** `object[]` | 输出内容 `output.content` 输出内容列表。 模型回答文本 `object` 模型生成的最终回答文本。 **type** `string` | 类型 `output.content.type` 内容类型判别字段,用于区分 union 变体。 取值固定为 `output_text`。 **annotations** `object[]` | 标注列表 `output.content.annotations` 文本附带的标注信息列表(如引用来源等) 网页引用 `object` 引用自互联网网页的标注信息。 **title** `string` | 标题 `output.content.annotations.title` 引用网页的标题。 **type** `string` | 类型 `output.content.annotations.type` 标注类型的判别字段(discriminator)。 取值固定为 `url_citation`。 **url** `string` | 网址 `output.content.annotations.url` 引用网页的 URL 地址。 **cover_image** `object` | 封面图 `output.content.annotations.cover_image` 网页封面图片信息。 **height** `integer` | 高度 `output.content.annotations.cover_image.height` 封面图片高度(像素) **url** `string` | 图片地址 `output.content.annotations.cover_image.url` 封面图片的 URL 地址。 **width** `integer` | 宽度 `output.content.annotations.cover_image.width` 封面图片宽度(像素) **freshness_info** `string` | 新鲜度 `output.content.annotations.freshness_info` 内容新鲜度信息。 **logo_url** `string` | Logo 地址 `output.content.annotations.logo_url` 网站 Logo 图标地址。 **mobile_url** `string` | 移动端地址 `output.content.annotations.mobile_url` 移动端访问地址。 **publish_time** `string` | 发布时间 `output.content.annotations.publish_time` 网页发布时间。 **site_name** `string` | 站点名 `output.content.annotations.site_name` 站点名称。 **summary** `string` | 摘要 `output.content.annotations.summary` 网页内容摘要。 文档引用 `object` 引用自私域知识库文档的标注信息。 **type** `string` | 类型 `output.content.annotations.type` 标注类型。 取值固定为 `doc_citation`。 **chunk_attachment** `object[]` | 分块附件 `output.content.annotations.chunk_attachment` 引用分块附带的附件信息列表。 **chunk_id** `integer` | 分块 ID `output.content.annotations.chunk_id` 引用文档分块的 ID。 **doc_id** `string` | 文档 ID `output.content.annotations.doc_id` 引用文档的 ID。 **doc_name** `string` | 文档名 `output.content.annotations.doc_name` 引用文档的名称。 **text** `string` | 文本内容 `output.content.text` 模型生成的文本内容。 模型思维链文本 `object` 模型生成的思维链文本。 **type** `string` | 类型 `output.content.type` 内容类型标识,用于区分 union 变体。 取值固定为 `reasoning_text`。 **annotations** `object[]` | 标注列表 `output.content.annotations` 思维链附带的标注信息列表。 网页引用 `object` 引用自互联网网页的标注信息。 **title** `string` | 标题 `output.content.annotations.title` 引用网页的标题。 **type** `string` | 类型 `output.content.annotations.type` 标注类型的判别字段(discriminator)。 取值固定为 `url_citation`。 **url** `string` | 网址 `output.content.annotations.url` 引用网页的 URL 地址。 **cover_image** `object` | 封面图 `output.content.annotations.cover_image` 网页封面图片信息。 **height** `integer` | 高度 `output.content.annotations.cover_image.height` 封面图片高度(像素) **url** `string` | 图片地址 `output.content.annotations.cover_image.url` 封面图片的 URL 地址。 **width** `integer` | 宽度 `output.content.annotations.cover_image.width` 封面图片宽度(像素) **freshness_info** `string` | 新鲜度 `output.content.annotations.freshness_info` 内容新鲜度信息。 **logo_url** `string` | Logo 地址 `output.content.annotations.logo_url` 网站 Logo 图标地址。 **mobile_url** `string` | 移动端地址 `output.content.annotations.mobile_url` 移动端访问地址。 **publish_time** `string` | 发布时间 `output.content.annotations.publish_time` 网页发布时间。 **site_name** `string` | 站点名 `output.content.annotations.site_name` 站点名称。 **summary** `string` | 摘要 `output.content.annotations.summary` 网页内容摘要。 文档引用 `object` 引用自私域知识库文档的标注信息。 **type** `string` | 类型 `output.content.annotations.type` 标注类型。 取值固定为 `doc_citation`。 **chunk_attachment** `object[]` | 分块附件 `output.content.annotations.chunk_attachment` 引用分块附带的附件信息列表。 **chunk_id** `integer` | 分块 ID `output.content.annotations.chunk_id` 引用文档分块的 ID。 **doc_id** `string` | 文档 ID `output.content.annotations.doc_id` 引用文档的 ID。 **doc_name** `string` | 文档名 `output.content.annotations.doc_name` 引用文档的名称。 **text** `string` | 文本内容 `output.content.text` 模型思维链文本内容。 **id** `string` | 条目 ID `output.id` 输出条目唯一标识。 **role** `string` | 角色 `output.role` 消息发送者的角色。 取值固定为 `assistant`。 **status** `string` | 状态 `output.status` 消息输出条目的当前状态。 * `completed`:消息已生成完毕。 * `in_progress`:消息正在生成中(流式场景)。 * `incomplete`:消息未完整生成(例如达到 `max_output_tokens` 上限)。 * `failed`:消息生成失败。 **type** `string` | 类型 `output.type` 输出条目的类型标识。 取值固定为 `message`。 **partial** `boolean` | 增量片段 `output.partial` 是否为流式增量片段。 **phase** `string` | 消息阶段 `output.phase` 标记 assistant 消息属于中间讲解还是最终回答。在回放 assistant 历史消息时,建议保留并原样回传该字段。可选值:`commentary`、`final_answer`。 函数调用输出 `object` 模型发起的函数调用请求。 **type** `string` | 类型 `output.type` 输出条目类型标识,用于区分 OutputItem 变体。 取值固定为 `function_call`。 **arguments** `string` | 参数 `output.arguments` 函数参数的 JSON 字符串。 **call_id** `string` | 调用 ID `output.call_id` 函数调用的唯一标识 ID,用于将该 function_call 输出与后续回传的 function_call_output 关联匹配。 **id** `string` | 条目 ID `output.id` 输出条目唯一标识。 **name** `string` | 函数名 `output.name` 调用的函数名称。 **status** `string` | 状态 `output.status` 函数调用条目的当前状态。 * `completed`:函数调用请求已生成完毕。 * `in_progress`:函数调用请求正在生成中(流式场景)。 * `incomplete`:函数调用请求未完整生成(例如达到 `max_output_tokens` 上限)。 * `failed`:函数调用生成失败。 思维链输出 `object` 模型的深度思考过程输出。 **status** `string` | 状态 `output.status` 推理条目的处理状态,用于判断思维链是否生成完成。可选值:`completed`、`failed`、`in_progress`、`incomplete`。 **summary** `object[]` | 推理摘要 `output.summary` 推理摘要内容列表。 **type** `string` | 类型 `output.summary.type` 摘要片段类型标识。 取值固定为 `summary_text`。 **text** `string` | 摘要文本 `output.summary.text` 思维链摘要文本内容。 **type** `string` | 类型 `output.type` 输出条目类型标识,用于区分 OutputItem 变体。 取值固定为 `reasoning`。 **content** `object[]` | 推理内容 `output.content` 思维链推理过程的内容元素列表。 模型回答文本 `object` 模型生成的最终回答文本。 **type** `string` | 类型 `output.content.type` 内容类型判别字段,用于区分 union 变体。 取值固定为 `output_text`。 **annotations** `object[]` | 标注列表 `output.content.annotations` 文本附带的标注信息列表(如引用来源等) 网页引用 `object` 引用自互联网网页的标注信息。 **title** `string` | 标题 `output.content.annotations.title` 引用网页的标题。 **type** `string` | 类型 `output.content.annotations.type` 标注类型的判别字段(discriminator)。 取值固定为 `url_citation`。 **url** `string` | 网址 `output.content.annotations.url` 引用网页的 URL 地址。 **cover_image** `object` | 封面图 `output.content.annotations.cover_image` 网页封面图片信息。 **height** `integer` | 高度 `output.content.annotations.cover_image.height` 封面图片高度(像素) **url** `string` | 图片地址 `output.content.annotations.cover_image.url` 封面图片的 URL 地址。 **width** `integer` | 宽度 `output.content.annotations.cover_image.width` 封面图片宽度(像素) **freshness_info** `string` | 新鲜度 `output.content.annotations.freshness_info` 内容新鲜度信息。 **logo_url** `string` | Logo 地址 `output.content.annotations.logo_url` 网站 Logo 图标地址。 **mobile_url** `string` | 移动端地址 `output.content.annotations.mobile_url` 移动端访问地址。 **publish_time** `string` | 发布时间 `output.content.annotations.publish_time` 网页发布时间。 **site_name** `string` | 站点名 `output.content.annotations.site_name` 站点名称。 **summary** `string` | 摘要 `output.content.annotations.summary` 网页内容摘要。 文档引用 `object` 引用自私域知识库文档的标注信息。 **type** `string` | 类型 `output.content.annotations.type` 标注类型。 取值固定为 `doc_citation`。 **chunk_attachment** `object[]` | 分块附件 `output.content.annotations.chunk_attachment` 引用分块附带的附件信息列表。 **chunk_id** `integer` | 分块 ID `output.content.annotations.chunk_id` 引用文档分块的 ID。 **doc_id** `string` | 文档 ID `output.content.annotations.doc_id` 引用文档的 ID。 **doc_name** `string` | 文档名 `output.content.annotations.doc_name` 引用文档的名称。 **text** `string` | 文本内容 `output.content.text` 模型生成的文本内容。 模型思维链文本 `object` 模型生成的思维链文本。 **type** `string` | 类型 `output.content.type` 内容类型标识,用于区分 union 变体。 取值固定为 `reasoning_text`。 **annotations** `object[]` | 标注列表 `output.content.annotations` 思维链附带的标注信息列表。 网页引用 `object` 引用自互联网网页的标注信息。 **title** `string` | 标题 `output.content.annotations.title` 引用网页的标题。 **type** `string` | 类型 `output.content.annotations.type` 标注类型的判别字段(discriminator)。 取值固定为 `url_citation`。 **url** `string` | 网址 `output.content.annotations.url` 引用网页的 URL 地址。 **cover_image** `object` | 封面图 `output.content.annotations.cover_image` 网页封面图片信息。 **height** `integer` | 高度 `output.content.annotations.cover_image.height` 封面图片高度(像素) **url** `string` | 图片地址 `output.content.annotations.cover_image.url` 封面图片的 URL 地址。 **width** `integer` | 宽度 `output.content.annotations.cover_image.width` 封面图片宽度(像素) **freshness_info** `string` | 新鲜度 `output.content.annotations.freshness_info` 内容新鲜度信息。 **logo_url** `string` | Logo 地址 `output.content.annotations.logo_url` 网站 Logo 图标地址。 **mobile_url** `string` | 移动端地址 `output.content.annotations.mobile_url` 移动端访问地址。 **publish_time** `string` | 发布时间 `output.content.annotations.publish_time` 网页发布时间。 **site_name** `string` | 站点名 `output.content.annotations.site_name` 站点名称。 **summary** `string` | 摘要 `output.content.annotations.summary` 网页内容摘要。 文档引用 `object` 引用自私域知识库文档的标注信息。 **type** `string` | 类型 `output.content.annotations.type` 标注类型。 取值固定为 `doc_citation`。 **chunk_attachment** `object[]` | 分块附件 `output.content.annotations.chunk_attachment` 引用分块附带的附件信息列表。 **chunk_id** `integer` | 分块 ID `output.content.annotations.chunk_id` 引用文档分块的 ID。 **doc_id** `string` | 文档 ID `output.content.annotations.doc_id` 引用文档的 ID。 **doc_name** `string` | 文档名 `output.content.annotations.doc_name` 引用文档的名称。 **text** `string` | 文本内容 `output.content.text` 模型思维链文本内容。 **encrypted_content** `string` | 加密思维链 `output.encrypted_content` 思考内容加密原文。经加密及压缩处理后的思考内容原文。 相关文档: * [关键规则](/docs/agent-model-invocation-practice#key-rules) * [回传思考内容加密块使用示例](/docs/agent-model-invocation-practice#encrypted-thinking-block-examples) > **说明** > > 流式输出场景下,思考内容加密原文通过 `response.output_item.added`、`response.output_item.done`、`response.completed` 等相关事件下发,需要按事件中 `encrypted_content` 字段非空过滤获取。 **模型支持**: * `doubao-seed-2-0-lite-260428 及后续版本` **id** `string` | 条目 ID `output.id` 输出条目唯一标识。 语音转写输出 `object` 模型返回的语音转写输出。 **status** `string` | 状态 `output.status` 语音转写条目的当前状态。 * `completed`:转写已生成完毕。 * `in_progress`:转写正在生成中(流式场景)。 * `incomplete`:转写未完整生成(例如达到输出上限而截断)。 * `failed`:转写生成失败。 **type** `string` | 类型 `output.type` 输出条目类型标识。 取值固定为 `transcription`。 **id** `string` | 条目 ID `output.id` 输出条目唯一标识。 **transcription** `object[]` | 转写内容 `output.transcription` 语音转写结果片段列表。 **type** `string` | 类型 `output.transcription.type` 转写片段类型。 取值固定为 `transcription_text`。 **chunks** `object[]` | 音频小段 `output.transcription.chunks` 当前片段对应的音频小段列表。 **end_time** `integer` | 结束时间 `output.transcription.chunks.end_time` 片段结束时间(毫秒) **start_time** `integer` | 开始时间 `output.transcription.chunks.start_time` 片段开始时间(毫秒) **text** `string` | 文字内容 `output.transcription.chunks.text` 当前片段对应的文字内容。 **text** `string` | 转写文本 `output.transcription.text` 当前片段的转写文本。 网页搜索调用 `object` 模型发起的网页搜索调用记录。 **id** `string` | 条目 ID `output.id` 输出条目唯一标识。 **status** `string` | 状态 `output.status` 网页搜索调用的当前状态。可选值:`in_progress`、`searching`、`completed`、`incomplete`、`failed`。 **type** `string` | 类型 `output.type` 输出条目类型标识,用于区分 OutputItem 变体。 取值固定为 `web_search_call`。 **action** `object` | 搜索动作 `output.action` 描述模型执行的网页搜索动作,包括搜索类型与查询关键字。 **query** `string` | 查询语句 `output.action.query` 模型实际发起的搜索查询语句。 **type** `string` | 类型 `output.action.type` 网页搜索动作的类型标识。 取值固定为 `search`。 **queries** `string[]` | 查询语句列表 `output.action.queries` 本次网页搜索产生的查询语句列表。 图像处理调用 `object` 模型发起的图像处理调用记录。 **id** `string` | 条目 ID `output.id` 输出条目唯一标识。 **status** `string` | 状态 `output.status` 图像处理调用的当前状态。 * `completed`:图像处理已完成。 * `in_progress`:图像处理正在执行中。 * `incomplete`:图像处理未完整执行(例如被中断或截断)。 * `failed`:图像处理执行失败,具体原因见 `error` 字段。 **type** `string` | 类型 `output.type` 输出条目类型标识,用于区分 OutputItem 变体。 取值固定为 `image_process`。 **action** `object` | 处理动作 `output.action` 图像处理动作详情。 **type** `string` | 类型 `output.action.type` 图像处理动作类型。 **result_image_url** `string` | 结果图地址 `output.action.result_image_url` 处理后图像的 URL 地址。 **arguments** `object` | 处理参数 `output.arguments` 图像处理动作的输入参数,以键值对形式承载具体处理选项。 **error** `object` | 图像处理错误 `output.error` 图像处理失败时的错误信息。 **message** `string` | 错误描述 `output.error.message` 错误的可读描述。 MCP 审批请求 `object` MCP 工具调用前的审批请求记录。 **arguments** `string` | 调用参数 `output.arguments` 工具调用参数的 JSON 字符串。 **name** `string` | 工具名 `output.name` 待运行的工具名称。 **server_label** `string` | 服务标签 `output.server_label` 发起请求的 MCP Server 标签。 **type** `string` | 类型 `output.type` 输出项类型标识符,用于区分 OutputItem 的变体。 取值固定为 `mcp_approval_request`。 **id** `string` | 请求 ID `output.id` 审批请求的唯一 ID。 MCP 工具清单 `object` MCP Server 提供的工具清单输出。 **server_label** `string` | 服务标签 `output.server_label` MCP Server 标签。 **type** `string` | 类型 `output.type` 输出项类型标识。 取值固定为 `mcp_list_tools`。 **error** `string` | 错误信息 `output.error` 当 MCP Server 无法返回工具列表时的错误信息。 **id** `string` | 列表 ID `output.id` 工具列表的唯一 ID。 **tools** `object[]` | 工具列表 `output.tools` 该 MCP Server 上可用的工具列表。 **name** `string` | 工具名 `output.tools.name` 工具名称。 **annotations** `object` | 注解信息 `output.tools.annotations` 工具的附加注解信息。 **description** `string` | 工具描述 `output.tools.description` 工具的功能描述。 **input_schema** `object` | 入参 Schema `output.tools.input_schema` 描述工具入参的 JSON Schema。 MCP 工具调用 `object` 模型对 MCP 工具的实际调用记录及结果。 **name** `string` | 工具名 `output.name` 实际运行的工具名称。 **server_label** `string` | 服务标签 `output.server_label` 运行工具的 MCP Server 标签。 **type** `string` | 类型 `output.type` 标识该输出项为 MCP 工具调用记录。 取值固定为 `mcp_call`。 **arguments** `string` | 调用参数 `output.arguments` 传递给 MCP 工具的调用参数,格式为 JSON 字符串。 > **说明** > > 该字段通过 `response.mcp_call_arguments.delta` 事件流式追加,初始 `output_item.added` 事件可能不携带该字段。 **error** `string` | 错误信息 `output.error` 工具调用失败时的错误信息。 **id** `string` | 调用 ID `output.id` 工具调用的唯一 ID。 **output** `string` | 返回结果 `output.output` 工具调用的返回结果。 知识库检索调用 `object` 模型发起的私域知识库检索调用记录。 **knowledge_resource_id** `string` | 知识库 ID `output.knowledge_resource_id` 检索使用的知识库 ID。 **queries** `string[]` | 查询语句 `output.queries` 模型实际执行的检索查询语句。 **status** `string` | 状态 `output.status` 知识库检索调用的执行状态。可选值:`in_progress`、`searching`、`completed`、`failed`、`incomplete`。 **type** `string` | 类型 `output.type` 输出条目类型标识,用于区分不同类型的输出条目。 取值固定为 `knowledge_search_call`。 **id** `string` | 条目 ID `output.id` 输出条目唯一标识。 豆包应用调用 `object` 模型对豆包助手能力的调用记录。 **type** `string` | 类型 `output.type` 输出条目类型标识。 取值固定为 `doubao_app_call`。 **blocks** `object[]` | 内容块 `output.blocks` 豆包应用调用产出的内容块列表。 文本输出 `object` 豆包应用产出的文本输出内容块。 **type** `string` | 类型 `output.blocks.type` 内容块类型标识符。 取值固定为 `output_text`。 **id** `string` | 块 ID `output.blocks.id` 内容块的唯一标识。 **parent_id** `string` | 父级 ID `output.blocks.parent_id` 所属父级条目的 ID。 **status** `string` | 状态 `output.blocks.status` 内容块状态。 **text** `string` | 文本内容 `output.blocks.text` 思维链文本 `object` 豆包应用产出的思维链文本内容块。 **type** `string` | 类型 `output.blocks.type` 内容块类型标识符。 取值固定为 `reasoning_text`。 **id** `string` | 块 ID `output.blocks.id` 内容块的唯一标识。 **parent_id** `string` | 父级 ID `output.blocks.parent_id` 所属父级条目的 ID。 **reasoning_text** `string` | 思考文本 `output.blocks.reasoning_text` 思维链文本内容。 **status** `string` | 状态 `output.blocks.status` 内容块状态。 搜索过程 `object` 豆包应用 AI 搜索过程产出的内容块。 **type** `string` | 类型 `output.blocks.type` 内容块类型标识符。 取值固定为 `search`。 **id** `string` | 块 ID `output.blocks.id` 内容块的唯一标识。 **parent_id** `string` | 父级 ID `output.blocks.parent_id` 所属父级条目的 ID。 **queries** `string[]` | 查询语句 `output.blocks.queries` 搜索查询语句列表。 **results** `object[]` | 搜索结果 `output.blocks.results` 搜索结果列表。 **text_card** `object` | 文本卡片 `output.blocks.results.text_card` 文本卡片形式的搜索结果。 **sitename** `string` | 站点名 `output.blocks.results.text_card.sitename` 来源站点名称。 **title** `string` | 标题 `output.blocks.results.text_card.title` 搜索结果标题。 **url** `string` | 网址 `output.blocks.results.text_card.url` 搜索结果 URL 地址。 **status** `string` | 状态 `output.blocks.status` 内容块状态。 **summary** `string` | 搜索总结 `output.blocks.summary` AI 搜索过程中对本轮搜索结果的总结性文字,概括从搜索结果中提取的核心信息。 推理搜索过程 `object` 豆包应用推理搜索过程产出的内容块。 **type** `string` | 类型 `output.blocks.type` 内容块类型。 取值固定为 `reasoning_search`。 **id** `string` | 块 ID `output.blocks.id` 内容块的唯一标识。 **parent_id** `string` | 父级 ID `output.blocks.parent_id` 所属父级条目的 ID。 **queries** `string[]` | 查询语句 `output.blocks.queries` 搜索查询语句列表。 **results** `object[]` | 搜索结果 `output.blocks.results` 搜索结果列表。 **text_card** `object` | 文本卡片 `output.blocks.results.text_card` 文本卡片形式的搜索结果。 **sitename** `string` | 站点名 `output.blocks.results.text_card.sitename` 来源站点名称。 **title** `string` | 标题 `output.blocks.results.text_card.title` 搜索结果标题。 **url** `string` | 网址 `output.blocks.results.text_card.url` 搜索结果 URL 地址。 **status** `string` | 状态 `output.blocks.status` 推理搜索内容块的处理状态。可选值:`in_progress`、`searching`、`completed`、`incomplete`、`failed`。 **summary** `string` | 搜索总结 `output.blocks.summary` 推理搜索过程中对本轮搜索结果的总结性文字,概括从搜索结果中提取的核心信息。 **feature** `string` | 功能名 `output.feature` 本次调用触发的豆包子功能名称。可选值:`chat`、`deep_chat`、`ai_search`、`reasoning_search`。 **id** `string` | 条目 ID `output.id` 输出条目唯一标识。 **status** `string` | 状态 `output.status` 输出状态。可选值:`completed`、`failed`、`in_progress`、`incomplete`。 智能体工具调用 `object` 模型发起的智能体工具调用记录。 **name** `string` | 工具名 `output.name` 被调用的智能体工具名称。 **status** `string` | 状态 `output.status` 智能体工具调用的执行状态。可选值:`completed`、`failed`、`in_progress`、`incomplete`。 **type** `string` | 类型 `output.type` 输出条目类型标识符,用于区分 OutputItem 的 variant。 取值固定为 `agent_tool_call`。 **id** `string` | 条目 ID `output.id` 输出条目唯一标识。 **caching** `object` | 上下文缓存 是否开启缓存。 **prefix** `boolean` | 仅写缓存 `caching.prefix` 是否仅写入前缀缓存,不生成回复。`true` 只写缓存,不返回模型输出;`false` 正常生成回复并写缓存。 **type** `string` | 缓存模式 `caching.type` 缓存模式。 * `enabled`:开启上下文缓存。 * `disabled`:关闭上下文缓存。 **context_management** `object` | 上下文管理 本次请求实际应用的上下文管理策略信息。 **applied_edits** `object[]` | 已应用编辑 `context_management.applied_edits` 已应用的上下文编辑结果列表。 清理工具调用 `object` 已应用的清理工具调用编辑结果。 **cleared_tool_uses** `integer` | 清理次数 `context_management.applied_edits.cleared_tool_uses` 已清理的工具调用数量。 **type** `string` | 类型 `context_management.applied_edits.type` 编辑类型。 取值固定为 `clear_tool_uses`。 清理思维链 `object` 已应用的清理思维链编辑结果。 **cleared_thinking_turns** `integer` | 清理轮次 `context_management.applied_edits.cleared_thinking_turns` 已清理的思维链轮次数量。 **type** `string` | 类型 `context_management.applied_edits.type` 编辑类型。 取值固定为 `clear_thinking`。 **error** `object` | 响应错误 模型未能生成响应时返回的错误对象。 **code** `string` | 错误码 `error.code` **message** `string` | 错误描述 `error.message` 错误信息的可读描述。 **expire_at** `integer` | 过期时间戳 响应储存的过期时刻 Unix 时间戳(秒),回显请求中的 expire_at 设置,对 store 与 caching 均生效。 > **说明** > > 最多保留 7 天。 **incomplete_details** `object` | 未完成详情 响应未能完成的细节。 **reason** `string` | 原因 `incomplete_details.reason` 响应未完成的原因。 **content_filter** `object` | 内容过滤 `incomplete_details.content_filter` 内容过滤详情。 **details** `string` | 详情 `incomplete_details.content_filter.details` 内容过滤命中的详细描述。 **type** `string` | 类型 `incomplete_details.content_filter.type` 内容过滤命中的类型。 **instructions** `string` | 系统指令 在模型上下文中插入的系统(或开发者)指令,作为首项。 > **说明** > > 与 `previous_response_id` 一起使用时,前一响应中的指令不会延续到下一响应。 **max_output_tokens** `integer` | 最大输出长度 模型输出最大 token 数,包含模型回答和思维链内容。 **max_tool_calls** `integer` | 最大调用轮次 本次请求生效的最大工具调用轮次。 **metadata** `object` | 自定义元数据 回显请求中的 metadata 键值对元数据。最多支持 16 对键值,key 长度不超过 64 个字符,value 长度不超过 512 个字符,服务端不会解释其中内容。 **previous_response_id** `string` | 上轮响应 ID 本次请求时传入的历史响应 ID。 **reasoning** `object` | 思考工作量 本次请求实际生效的深度思考工作量配置。 **effort** `string` | 思考深度 `reasoning.effort` 限制思考的工作量。减少思考深度可提升速度,思考花费的 token 更少。 * `none`:关闭思考。 * `minimal`:关闭思考,直接回答。 * `low`:轻量思考,侧重快速响应。 * `medium`:均衡模式,兼顾速度与深度。 * `high`:深度分析,处理复杂问题。 * `xhigh`:更高程度思考。 * `max`:最高程度思考,适配高难度推理任务。 > **注意:说明** > > 支持该字段的模型、默认取值、参数兼容映射规则,以及与 `thinking.type` 字段的关系,详见 [文档](/docs/responses-api-deep-thinking#dc4c1547)。 **service_tier** `string` | 推理模式 本次请求实际使用的推理模式。 * `fast`:本次请求使用 [在线推理(低延迟)](/docs/online-inference-low-latency) 模式。 * `auto`:本次请求使用 [在线推理(TPM 保障包)](/docs/tpm-guarantee-package) 模式。 * `default`:本次请求使用 [在线推理(常规)](/docs/online-inference-standard) 模式。 * `flex`:本次请求使用 [在线推理(低优)](/docs/online-inference-flex) 模式。 **status** `string` | 响应状态 生成响应的状态。 **store** `boolean` | 存储响应 响应是否被储存的实际状态。 **temperature** `number` | 采样温度 本次请求实际使用的采样温度。 **text** `object` | 输出格式 用于定义输出的格式,可以是纯文本,也可以是结构化的 JSON 数据。 **format** `object` | 输出格式 `text.format` 文本输出格式定义。 **type** `string` | 格式类型 `text.format.type` 输出格式类型。可选值:`text`、`json_schema`、`json_object`。 > **注意** > > `json_object` / `json_schema` 能力尚在 beta 阶段,请谨慎在生产环境使用。 **description** `string` | 格式描述 `text.format.description` 格式描述信息。 **name** `string` | 格式名称 `text.format.name` 格式名称,作为 JSON Schema 输出格式的标识。 > **注意** > > 仅当 *type* 为 `json_schema` 时需要提供此字段。 **schema** `object` | Schema 定义 `text.format.schema` JSON Schema 定义。当 *type* 为 `json_schema` 时必填。 **strict** `boolean` | 严格模式 `text.format.strict` 是否严格按 JSON Schema 校验模型输出。 > **注意** > > 仅当 *type* 为 `json_schema` 时生效。 **thinking** `object` | 深度思考配置 本次请求实际生效的深度思考模式配置。 **type** `string` | 思考模式 `thinking.type` 深度思考模式。 * `enabled`:开启深度思考。 * `disabled`:关闭深度思考。 * `auto`:由模型自行判断是否需要深度思考。 **tool_choice** `string / object` | 工具调用策略 本次请求实际生效的工具调用策略。 > **说明** > > 未指定工具时默认值为 `none`;存在工具时默认值为 `auto`。 简单策略 `string` 直接传入字符串 `none`、`auto` 或 `required`,控制工具调用整体策略。 指定工具 `object` 通过对象指定具体工具类型或工具名进行调用。 **type** `string` | 工具类型 `tool_choice.type` 指定要调用的工具类型,用于精确路由到对应工具。可选值: * `function` * `web_search` * `image_process` * `mcp` * `knowledge_search` * `doubao_app` **name** `string` | 工具名称 `tool_choice.name` 指定要调用的具体工具名,如函数名或 MCP 服务下的工具名。 **tools** `object[]` | 工具列表 模型可以调用的工具列表。 函数调用 `object` 自定义函数调用(Function Calling),让模型生成结构化的函数参数。 **name** `string` | 函数名 `tools.name` 供模型调用的函数名称,模型在 function_call 输出中以该名称回传,用于匹配对应函数。 **type** `string` | 类型 `tools.type` 工具类型标识,用于在 union 中区分不同工具类别。 取值固定为 `function`。 **description** `string` | 函数描述 `tools.description` 函数的描述信息,帮助模型理解何时使用该函数。 **parameters** `object` | 参数定义 `tools.parameters` 函数参数定义,遵循 JSON Schema 格式。 联网搜索 `object` 联网搜索工具,让模型在需要时自动进行网页搜索获取实时信息。 **type** `string` | 类型 `tools.type` 工具类型标识,用于区分 Tool 的不同变体。 取值固定为 `web_search`。 **limit** `integer` | 最大结果数 `tools.limit` 每轮搜索最大返回结果数量。 > **说明** > > 单次搜索最多返回 20 条;单轮可能有多次搜索,最终召回条数受此参数限制影响。 **取值范围**:`[1, 50]` **max_keyword** `integer` | 最大关键词数 `tools.max_keyword` 最大并行搜索关键词数量。 **取值范围**:`[1, 50]` **sources** `string[]` | 搜索来源 `tools.sources` 搜索信息来源限制,指定模型可从哪些渠道检索网页内容。可选值:`toutiao`、`douyin`、`moji`、`search_engine`、`doubao`。 > **说明** > > `doubao` 不能与其他搜索来源同时配置。传入 `["doubao"]` 时,`tools.limit`、`tools.max_keyword`、`tools.user_location` 均不生效,向它们传入的值将被忽略。 **user_location** `object` | 用户位置 `tools.user_location` 用户地理位置信息,用于搜索优化。 **type** `string` | 类型 `tools.user_location.type` 位置类型。 取值固定为 `approximate`。 **city** `string` | 城市 `tools.user_location.city` 用户所在城市。 **country** `string` | 国家 `tools.user_location.country` 用户所在国家。 **region** `string` | 地区 `tools.user_location.region` 用户所在地区。 **timezone** `number` | 时区 `tools.user_location.timezone` 用户所在时区。 图像处理 `object` 图像处理工具,让模型对图片进行画点、选区、缩放、旋转等操作。 **type** `string` | 类型 `tools.type` 工具类型标识,用于区分 Tool 的不同变体。 取值固定为 `image_process`。 **grounding** `object` | 选区功能 `tools.grounding` 选区/裁切功能配置,启用后模型可返回图像中目标的检测框或裁切区域坐标。 **type** `string` | 开关 `tools.grounding.type` 功能开关。可选值:`enabled`、`disabled`。 **point** `object` | 画点功能 `tools.point` 画点/画线功能开关。 **type** `string` | 开关 `tools.point.type` 功能开关。可选值:`enabled`、`disabled`。 **rotate** `object` | 旋转功能 `tools.rotate` 旋转功能开关。启用后模型可请求对图片按指定角度进行旋转。 > **注意** > > 旋转角度支持范围为 0-359 度。 **type** `string` | 开关 `tools.rotate.type` 功能开关。可选值:`enabled`、`disabled`。 **zoom** `object` | 缩放功能 `tools.zoom` 缩放功能开关,启用后模型可对图像目标区域执行缩放操作。 > **说明** > > 缩放倍率支持范围 0.5-2.0 倍。 **type** `string` | 开关 `tools.zoom.type` 功能开关。可选值:`enabled`、`disabled`。 MCP 工具 `object` MCP(Model Context Protocol)工具,让模型调用外部 MCP Server 提供的工具。 **server_label** `string` | 服务标签 `tools.server_label` MCP Server 的唯一标识标签。模型在工具调用输出中通过该标签指向对应 Server,便于在多个 MCP Server 场景下区分调用来源。 **server_url** `string` | 服务地址 `tools.server_url` MCP Server 的 HTTP(S) 访问地址,模型通过该地址向 Server 发起工具调用请求。 **type** `string` | 类型 `tools.type` 工具类型标识,用于区分 Tool 的不同变体。 取值固定为 `mcp`。 **allowed_tools** `string[] / object` | 允许工具 `tools.allowed_tools` 允许模型调用的工具范围。可传工具名称字符串数组,或包含 `tool_names` 字段的过滤器对象。 工具名数组 `string[]` 直接传入允许调用的工具名称数组。 工具过滤器 `object` 通过过滤器对象指定允许调用的工具范围。 **tool_names** `string[]` | 工具名列表 `tools.allowed_tools.tool_names` 允许调用的工具名称列表。 **headers** `object` | 请求头 `tools.headers` 调用 MCP Server 时附加的 HTTP 请求头,以字符串键值对形式指定 header 名与值。 > **说明** > > * 常用于传递鉴权信息(如 `Authorization`)。 > * `Authorization` 字段不会被服务端存储。 **require_approval** `string / object` | 审批策略 `tools.require_approval` MCP 工具调用前的审批策略;支持简单模式(字符串)或按工具粒度控制(过滤器对象)。 简单策略 `string` 直接传入字符串 `always` 或 `never`,对所有工具应用统一审批策略。 工具过滤器 `object` 通过过滤器对象按工具粒度配置审批策略。 **always** `object` | 始终审批 `tools.require_approval.always` 始终需要审批的工具过滤器。 **tool_names** `string[]` | 工具名列表 `tools.require_approval.always.tool_names` 始终需要审批的工具名称列表。 **never** `object` | 无需审批 `tools.require_approval.never` 无需审批的工具过滤器。 **tool_names** `string[]` | 工具名列表 `tools.require_approval.never.tool_names` 无需审批即可调用的工具名称列表。 **server_description** `string` | 服务描述 `tools.server_description` MCP Server 的描述信息,帮助模型理解何时使用该 Server。 知识库搜索 `object` 私域知识库搜索工具,让模型检索企业内部知识库中的文档内容。 **knowledge_resource_id** `string` | 知识库 ID `tools.knowledge_resource_id` **type** `string` | 类型 `tools.type` 工具类型标识,用于区分 Tool 的不同变体。 取值固定为 `knowledge_search`。 **dense_weight** `number` | 稠密权重 `tools.dense_weight` 混合检索中稠密向量(语义)检索的权重,值越大越偏向语义匹配,越小越偏向关键词匹配。 > **说明** > > 仅在混合检索(索引算法为 `hnsw_hybrid`)下生效。 **取值范围**:`[0.2, 1]` **description** `string` | 知识库描述 `tools.description` 知识库描述信息,帮助模型理解何时使用该知识库。 **doc_filter** `object` | 文档过滤 `tools.doc_filter` 设置文档字段级别的检索过滤条件,确保只在符合条件的文档中检索。 > **说明** > > * 支持用作过滤条件的文档字段: > * 系统字段:`doc_id`(仅手动创建的知识库)、`_sys_auto_doc_id`(手动 + API 创建均适用) > * 自定义字段:已为知识库文档添加的**文档标签**(对应知识库 `index_config.fields` 中的 `field`) > * 支持单一条件过滤和多条件组合过滤(支持 `And` / `Or` 逻辑运算)。 > * 详细使用方式和支持字段参见 [filter 表达式](https://docs.volcengine.com/docs/84313/1419289?lang=zh#filter-%E8%A1%A8%E8%BE%BE%E5%BC%8F)。 > * 若自定义字段类型为 `Boolean`,取值范围是 `True` / `False`,大小写规则:cURL 用 `true` / `false`,Python 用 `True` / `False`。 **limit** `integer` | 最大结果数 `tools.limit` 最大搜索结果数量。 **取值范围**:`[1, 200]` **max_keyword** `integer` | 最大关键词数 `tools.max_keyword` 最大并行搜索关键词数量。 **取值范围**:`[1, 50]` **ranking_options** `object` | 排序选项 `tools.ranking_options` 检索后处理选项。可参考 [知识库 API 文档](https://docs.volcengine.com/docs/84313/1350012?lang=zh) `post_processing` 字段。 **chunk_diffusion_count** `integer` | 切片扩散数 `tools.ranking_options.chunk_diffusion_count` 检索阶段返回命中切片的上下几片邻近切片。取 `0` 表示不进行 chunk diffusion。 **取值范围**:`[0, 5]` **chunk_group** `boolean` | 文本聚合 `tools.ranking_options.chunk_group` 文本聚合。 * 默认不聚合。 * 对于非结构化文件,可开启文本聚合以更好保留原文档内容语序。 * 开启后,会根据文档及文档顺序,对切片重新聚合排序返回。 **get_attachment_link** `boolean` | 获取附件链接 `tools.ranking_options.get_attachment_link` 是否获取切片中图片的临时下载链接。 **rerank_model** `string` | Rerank 模型 `tools.ranking_options.rerank_model` rerank 模型选择。默认值:`base-multilingual-rerank`。取值:`base-multilingual-rerank` / `m3-v2-rerank`。 > **说明** > > * 仅在 `rerank_switch` 为 `true` 时生效。 > * `base-multilingual-rerank`(推荐):速度快、长文本、支持 70+ 种语言。 > * `m3-v2-rerank`:常规文本、支持 100+ 种语言。 **rerank_only_chunk** `boolean` | 仅切片重排 `tools.ranking_options.rerank_only_chunk` 是否仅根据 chunk 内容计算重排分数。`true` 只根据 chunk 内容计算分;`false` 根据 chunk title + 内容一起计算排序分。 **rerank_switch** `boolean` | 开启重排 `tools.ranking_options.rerank_switch` 是否自动对检索结果做 rerank。若设置为 `true`,则会自动请求 rerank 模型排序。 **retrieve_count** `integer` | 重排切片数 `tools.ranking_options.retrieve_count` 进入重排的切片数量。 > **注意** > > * 仅在 `rerank_switch` 为 `true` 时生效。 > * `retrieve_count` 需要大于等于 `limit`,否则会抛出错误。 豆包助手 `object` 豆包助手工具,让模型使用豆包的聊天、深度思考、AI 搜索和推理搜索能力。 **feature** `object` | 功能配置 `tools.feature` 豆包助手的子功能配置,用于按需开启聊天、深度思考、AI 搜索、推理搜索四类能力并设置对应角色描述。 **ai_search** `object` | AI 搜索 `tools.feature.ai_search` AI 搜索功能配置。 **role_description** `string` | 角色描述 `tools.feature.ai_search.role_description` 使用豆包助手时修改角色设定。默认值:`你的名字是豆包,有很强的专业性。` > **注意** > > 此字段与 `system prompt`、`instructions` 互斥,同时配置时以本字段为准。 **type** `string` | 开关 `tools.feature.ai_search.type` 功能开关。可选值:`enabled`、`disabled`。 **chat** `object` | 普通聊天 `tools.feature.chat` 普通聊天功能配置。 **role_description** `string` | 角色描述 `tools.feature.chat.role_description` 使用豆包助手时修改角色设定。默认值:`你的名字是豆包,有很强的专业性。` > **注意** > > 此字段与 `system prompt`、`instructions` 互斥,同时配置时以本字段为准。 **type** `string` | 开关 `tools.feature.chat.type` 功能开关。可选值:`enabled`、`disabled`。 **deep_chat** `object` | 深度聊天 `tools.feature.deep_chat` 深度聊天功能配置。 **role_description** `string` | 角色描述 `tools.feature.deep_chat.role_description` 使用豆包助手时修改角色设定。默认值:`你的名字是豆包,有很强的专业性。` > **注意** > > 此字段与 `system prompt`、`instructions` 互斥,同时配置时以本字段为准。 **type** `string` | 开关 `tools.feature.deep_chat.type` 功能开关。可选值:`enabled`、`disabled`。 **reasoning_search** `object` | 推理搜索 `tools.feature.reasoning_search` 推理搜索功能配置。 **role_description** `string` | 角色描述 `tools.feature.reasoning_search.role_description` 使用豆包助手时修改角色设定。默认值:`你的名字是豆包,有很强的专业性。` > **注意** > > 此字段与 `system prompt`、`instructions` 互斥,同时配置时以本字段为准。 **type** `string` | 开关 `tools.feature.reasoning_search.type` 功能开关。可选值:`enabled`、`disabled`。 **type** `string` | 类型 `tools.type` 工具类型,此处固定为 `doubao_app` **user_location** `object` | 用户位置 `tools.user_location` 用户地理位置信息,用于搜索优化。 **type** `string` | 类型 `tools.user_location.type` 位置类型。 取值固定为 `approximate`。 **city** `string` | 城市 `tools.user_location.city` 用户所在城市。 **country** `string` | 国家 `tools.user_location.country` 用户所在国家。 **region** `string` | 地区 `tools.user_location.region` 用户所在地区。 **timezone** `number` | 时区 `tools.user_location.timezone` 用户所在时区。 **top_p** `number` | 核采样阈值 本次请求实际使用的核采样概率阈值。 **usage** `object` | Token 用量 本次请求的 token 用量统计,含输入/输出 token 数及工具调用明细。 **input_tokens** `integer` | 输入 token 数 `usage.input_tokens` 输入消耗的 token 数量。 **input_tokens_details** `object` | 输入明细 `usage.input_tokens_details` 输入 token 用量明细。 **cached_tokens** `integer` | 缓存 token `usage.input_tokens_details.cached_tokens` 命中缓存的 token 数量。 **audio_cached_tokens** `integer` | 音频缓存 Token 数 `usage.input_tokens_details.audio_cached_tokens` 缓存命中的音频输入内容所消耗的 token 数量。仅在隐式缓存模式且命中音频缓存时返回;开启显式缓存时该字段不返回。 **audio_tokens** `integer` | 音频 token `usage.input_tokens_details.audio_tokens` 音频输入消耗的 token 数量。 **output_tokens** `integer` | 输出 token 数 `usage.output_tokens` 输出消耗的 token 数量。 **output_tokens_details** `object` | 输出明细 `usage.output_tokens_details` 输出 token 用量明细。 **reasoning_tokens** `integer` | 思考 token `usage.output_tokens_details.reasoning_tokens` 深度思考消耗的 token 数量。 **total_tokens** `integer` | 总 token 数 `usage.total_tokens` 本次请求消耗的 token 总数。 **tool_usage** `object` | 工具用量 `usage.tool_usage` 工具调用用量统计。 **doubao_app** `integer` | 豆包次数 `usage.tool_usage.doubao_app` 豆包助手工具调用次数。 **knowledge_search** `integer` | 知识库次数 `usage.tool_usage.knowledge_search` 知识库搜索工具调用次数。 **mcp** `integer` | MCP 次数 `usage.tool_usage.mcp` MCP 工具调用次数。 **web_search** `integer` | 搜索次数 `usage.tool_usage.web_search` 联网搜索工具调用次数。 **tool_usage_details** `object` | 工具明细 `usage.tool_usage_details` 工具调用用量明细。 **doubao_app** `object` | 豆包明细 `usage.tool_usage_details.doubao_app` 豆包助手工具用量明细。 **knowledge_search** `object` | 知识库明细 `usage.tool_usage_details.knowledge_search` 知识库搜索工具用量明细。 **mcp** `object` | MCP 明细 `usage.tool_usage_details.mcp` MCP 工具用量明细。 **web_search** `object` | 搜索明细 `usage.tool_usage_details.web_search` 联网搜索工具用量明细。 ### Response 生命周期事件。 字段结构详见 [Response 生命周期](/docs/response-lifecycle)。 ### 语音转写与错误事件。 字段结构详见 [语音转写与错误事件](/docs/audio-and-errors)。 ### Output Item 与文本回答。 字段结构详见 [Output Item 与文本回答](/docs/output-and-text)。 ### 工具调用事件。 字段结构详见 [工具调用事件](/docs/streaming-responses-tools)。 ## 代码示例 ## 单轮对话 ### cURL #### Request ```bash curl --location "https://ark.cn-beijing.volces.com/api/v3/responses" \ --header "Authorization: Bearer $ARK_API_KEY" \ --header "Content-Type: application/json" \ --data '{ "model": "doubao-seed-2-1-pro-260915", "input": "你好呀。" }' ``` #### Response ``` { "id": "resp_0217****", "created_at": 1756280722.0, "error": null, "incomplete_details": null, "instructions": null, "model": "doubao-seed-2-1-pro-260915", "object": "response", "output": [ { "id": "rs_0217****404a", "summary": [ { "text": "\n用户说“你好呀。”,这是一个很友好的问候,我需要用同样友好的方式回应。首先,应该回应用户的问候,然后可以表达一下愿意帮助的态度,让对话能够继续下去。用户可能接下来会有其他问题或者想聊聊天,所以回应要自然、亲切。\n\n首先,直接回“你好呀!”来呼应对方的问候,保持一致的语气。然后加上一句“很高兴见到你~ 有什么我可以帮你的吗?”这样既表达了友好,又主动提供帮助,让用户知道我在这里可以协助他们。这样的回应比较温暖,也符合日常交流的习惯,不会显得太生硬。\n\n需要注意的是,用户可能只是想打个招呼,所以回应不要太复杂,保持简洁和亲切就好。避免使用太正式的语言,保持口语化,让用户感觉舒适。总结一下,回应应该包含问候、表达高兴见到对方,以及提供帮助的意愿。", "type": "summary_text" } ], "type": "reasoning", "status": "completed" }, { "id": "msg_0217****a93c", "content": [ { "text": "你好呀!很高兴见到你~ 有什么我可以帮你的吗? 😊", "type": "output_text", "annotations": null } ], "role": "assistant", "status": "completed", "type": "message" } ], "parallel_tool_calls": null, "temperature": null, "tool_choice": null, "tools": null, "top_p": null, "max_output_tokens": 32768, "previous_response_id": null, "thinking": null, "service_tier": "default", "status": "completed", "text": null, "usage": { "input_tokens": 88, "input_tokens_details": { "cached_tokens": 0 }, "output_tokens": 230, "output_tokens_details": { "reasoning_tokens": 211 }, "total_tokens": 318 }, "caching": { "type": "disabled" }, "store": true, "expire_at": 1756539922 } ``` ### Python-OpenAI #### Request ```python import os from openai import OpenAI # 从环境变量中获取您的API KEY,配置方法见:https://ark.volcengine.com/region:cn-beijing/docs/quick-start api_key = os.getenv('ARK_API_KEY') client = OpenAI( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) # 创建一个对话请求 response = client.responses.create( # 替换为模型的Model ID model="doubao-seed-2-1-pro-260915", input="你好呀。" ) print(response) ``` #### Response ``` { "id": "resp_0217****", "created_at": 1756280722.0, "error": null, "incomplete_details": null, "instructions": null, "model": "doubao-seed-2-1-pro-260915", "object": "response", "output": [ { "id": "rs_0217****404a", "summary": [ { "text": "\n用户说“你好呀。”,这是一个很友好的问候,我需要用同样友好的方式回应。首先,应该回应用户的问候,然后可以表达一下愿意帮助的态度,让对话能够继续下去。用户可能接下来会有其他问题或者想聊聊天,所以回应要自然、亲切。\n\n首先,直接回“你好呀!”来呼应对方的问候,保持一致的语气。然后加上一句“很高兴见到你~ 有什么我可以帮你的吗?”这样既表达了友好,又主动提供帮助,让用户知道我在这里可以协助他们。这样的回应比较温暖,也符合日常交流的习惯,不会显得太生硬。\n\n需要注意的是,用户可能只是想打个招呼,所以回应不要太复杂,保持简洁和亲切就好。避免使用太正式的语言,保持口语化,让用户感觉舒适。总结一下,回应应该包含问候、表达高兴见到对方,以及提供帮助的意愿。", "type": "summary_text" } ], "type": "reasoning", "status": "completed" }, { "id": "msg_0217****a93c", "content": [ { "text": "你好呀!很高兴见到你~ 有什么我可以帮你的吗? 😊", "type": "output_text", "annotations": null } ], "role": "assistant", "status": "completed", "type": "message" } ], "parallel_tool_calls": null, "temperature": null, "tool_choice": null, "tools": null, "top_p": null, "max_output_tokens": 32768, "previous_response_id": null, "thinking": null, "service_tier": "default", "status": "completed", "text": null, "usage": { "input_tokens": 88, "input_tokens_details": { "cached_tokens": 0 }, "output_tokens": 230, "output_tokens_details": { "reasoning_tokens": 211 }, "total_tokens": 318 }, "caching": { "type": "disabled" }, "store": true, "expire_at": 1756539922 } ``` ### Python #### Request ```python import os from arkruntime import Ark # 从环境变量中获取您的API KEY,配置方法见:https://ark.volcengine.com/region:cn-beijing/docs/quick-start api_key = os.getenv('ARK_API_KEY') client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) # 创建一个对话请求 response = client.responses.create( # 替换为模型的Model ID model="doubao-seed-2-1-pro-260915", input="你好呀。" ) print(response) ``` #### Response ``` { "id": "resp_0217****", "created_at": 1756280722.0, "error": null, "incomplete_details": null, "instructions": null, "model": "doubao-seed-2-1-pro-260915", "object": "response", "output": [ { "id": "rs_0217****404a", "summary": [ { "text": "\n用户说“你好呀。”,这是一个很友好的问候,我需要用同样友好的方式回应。首先,应该回应用户的问候,然后可以表达一下愿意帮助的态度,让对话能够继续下去。用户可能接下来会有其他问题或者想聊聊天,所以回应要自然、亲切。\n\n首先,直接回“你好呀!”来呼应对方的问候,保持一致的语气。然后加上一句“很高兴见到你~ 有什么我可以帮你的吗?”这样既表达了友好,又主动提供帮助,让用户知道我在这里可以协助他们。这样的回应比较温暖,也符合日常交流的习惯,不会显得太生硬。\n\n需要注意的是,用户可能只是想打个招呼,所以回应不要太复杂,保持简洁和亲切就好。避免使用太正式的语言,保持口语化,让用户感觉舒适。总结一下,回应应该包含问候、表达高兴见到对方,以及提供帮助的意愿。", "type": "summary_text" } ], "type": "reasoning", "status": "completed" }, { "id": "msg_0217****a93c", "content": [ { "text": "你好呀!很高兴见到你~ 有什么我可以帮你的吗? 😊", "type": "output_text", "annotations": null } ], "role": "assistant", "status": "completed", "type": "message" } ], "parallel_tool_calls": null, "temperature": null, "tool_choice": null, "tools": null, "top_p": null, "max_output_tokens": 32768, "previous_response_id": null, "thinking": null, "service_tier": "default", "status": "completed", "text": null, "usage": { "input_tokens": 88, "input_tokens_details": { "cached_tokens": 0 }, "output_tokens": 230, "output_tokens_details": { "reasoning_tokens": 211 }, "total_tokens": 318 }, "caching": { "type": "disabled" }, "store": true, "expire_at": 1756539922 } ``` ### Go #### Request ```go package main import ( "context" "fmt" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/responses" "os" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() resp, err := client.CreateResponses(ctx, &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", Input: responses.NewStringResponsesInput("你好呀。"), }) if err != nil { fmt.Printf("response error: %v\n", err) return } fmt.Println(resp) } ``` #### Response ``` { "id": "resp_0217****", "created_at": 1756280722.0, "error": null, "incomplete_details": null, "instructions": null, "model": "doubao-seed-2-1-pro-260915", "object": "response", "output": [ { "id": "rs_0217****404a", "summary": [ { "text": "\n用户说“你好呀。”,这是一个很友好的问候,我需要用同样友好的方式回应。首先,应该回应用户的问候,然后可以表达一下愿意帮助的态度,让对话能够继续下去。用户可能接下来会有其他问题或者想聊聊天,所以回应要自然、亲切。\n\n首先,直接回“你好呀!”来呼应对方的问候,保持一致的语气。然后加上一句“很高兴见到你~ 有什么我可以帮你的吗?”这样既表达了友好,又主动提供帮助,让用户知道我在这里可以协助他们。这样的回应比较温暖,也符合日常交流的习惯,不会显得太生硬。\n\n需要注意的是,用户可能只是想打个招呼,所以回应不要太复杂,保持简洁和亲切就好。避免使用太正式的语言,保持口语化,让用户感觉舒适。总结一下,回应应该包含问候、表达高兴见到对方,以及提供帮助的意愿。", "type": "summary_text" } ], "type": "reasoning", "status": "completed" }, { "id": "msg_0217****a93c", "content": [ { "text": "你好呀!很高兴见到你~ 有什么我可以帮你的吗? 😊", "type": "output_text", "annotations": null } ], "role": "assistant", "status": "completed", "type": "message" } ], "parallel_tool_calls": null, "temperature": null, "tool_choice": null, "tools": null, "top_p": null, "max_output_tokens": 32768, "previous_response_id": null, "thinking": null, "service_tier": "default", "status": "completed", "text": null, "usage": { "input_tokens": 88, "input_tokens_details": { "cached_tokens": 0 }, "output_tokens": 230, "output_tokens_details": { "reasoning_tokens": 211 }, "total_tokens": 318 }, "caching": { "type": "disabled" }, "store": true, "expire_at": 1756539922 } ``` ### Java #### Request ```java package com.ark.example; import com.volcengine.ark.runtime.service.ArkService; import com.volcengine.ark.runtime.models.responses.*; public class demo { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); ArkService arkService = ArkService.builder().apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); ResponsesRequest request = ResponsesRequest.builder() .model("doubao-seed-2-1-pro-260915") .stream(false) .input(ResponsesInput.ofString("你好呀。")) .thinking(Thinking.builder().type(ThinkingMode.DISABLED).build()) .build(); Response resp = arkService.createResponse(request); System.out.println(resp); arkService.shutdownExecutor(); } } ``` #### Response ``` { "id": "resp_0217****", "created_at": 1756280722.0, "error": null, "incomplete_details": null, "instructions": null, "model": "doubao-seed-2-1-pro-260915", "object": "response", "output": [ { "id": "rs_0217****404a", "summary": [ { "text": "\n用户说“你好呀。”,这是一个很友好的问候,我需要用同样友好的方式回应。首先,应该回应用户的问候,然后可以表达一下愿意帮助的态度,让对话能够继续下去。用户可能接下来会有其他问题或者想聊聊天,所以回应要自然、亲切。\n\n首先,直接回“你好呀!”来呼应对方的问候,保持一致的语气。然后加上一句“很高兴见到你~ 有什么我可以帮你的吗?”这样既表达了友好,又主动提供帮助,让用户知道我在这里可以协助他们。这样的回应比较温暖,也符合日常交流的习惯,不会显得太生硬。\n\n需要注意的是,用户可能只是想打个招呼,所以回应不要太复杂,保持简洁和亲切就好。避免使用太正式的语言,保持口语化,让用户感觉舒适。总结一下,回应应该包含问候、表达高兴见到对方,以及提供帮助的意愿。", "type": "summary_text" } ], "type": "reasoning", "status": "completed" }, { "id": "msg_0217****a93c", "content": [ { "text": "你好呀!很高兴见到你~ 有什么我可以帮你的吗? 😊", "type": "output_text", "annotations": null } ], "role": "assistant", "status": "completed", "type": "message" } ], "parallel_tool_calls": null, "temperature": null, "tool_choice": null, "tools": null, "top_p": null, "max_output_tokens": 32768, "previous_response_id": null, "thinking": null, "service_tier": "default", "status": "completed", "text": null, "usage": { "input_tokens": 88, "input_tokens_details": { "cached_tokens": 0 }, "output_tokens": 230, "output_tokens_details": { "reasoning_tokens": 211 }, "total_tokens": 318 }, "caching": { "type": "disabled" }, "store": true, "expire_at": 1756539922 } ``` ## 多轮对话 ### Python-OpenAI #### Request ```python from openai import OpenAI import os # 从环境变量中获取您的API KEY,配置方法见:https://ark.volcengine.com/region:cn-beijing/docs/quick-start api_key = os.getenv('ARK_API_KEY') client = OpenAI( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) # 创建第一轮对话请求 response = client.responses.create( model="doubao-seed-2-1-pro-260915", input="Hi,帮我讲个笑话。" ) print(response) # 创建第二轮对话请求 second_response = client.responses.create( model="doubao-seed-2-1-pro-260915", previous_response_id=response.id, input=[{"role": "user", "content": "这个笑话的笑点在哪?"}], ) print(second_response) ``` #### Response ``` [ { "id": "resp_****87fa", "created_at": 1756475482.0, "error": null, "incomplete_details": null, "instructions": null, "model": "doubao-seed-2-1-pro-260915", "object": "response", "output": [ { "id": "msg_0217****5328", "content": [ { "text": "好的,给你讲一个:\n\n病人:“医生,我最近睡不着,吃不下,心情很差,我是不是得了抑郁症啊?”\n医生:“你几岁了?”\n病人:“我16。”\n医生:“你那不是抑郁症,你是快开学了。”\n\n希望你喜欢!😄", "type": "output_text", "annotations": null } ], "role": "assistant", "status": "completed", "type": "message" } ], "parallel_tool_calls": null, "temperature": null, "tool_choice": null, "tools": null, "top_p": null, "max_output_tokens": 32768, "previous_response_id": null, "thinking": { "type": "disabled" }, "service_tier": "default", "status": "completed", "text": null, "usage": { "input_tokens": 43, "input_tokens_details": { "cached_tokens": 0 }, "output_tokens": 71, "output_tokens_details": { "reasoning_tokens": 0 }, "total_tokens": 114 }, "caching": { "type": "disabled" }, "store": true, "expire_at": 1756734682 }, { "id": "resp_0217****e74a", "created_at": 1756475484.0, "error": null, "incomplete_details": null, "instructions": null, "model": "doubao-seed-2-1-pro-260915", "object": "response", "output": [ { "id": "msg_0217****bd53", "content": [ { "text": "这个笑话的笑点主要来自于**“预期违背”**和**“对青少年生活场景的共鸣式调侃”**:\n\n\n### 1. **预期违背(反差感)** \n病人用非常严肃的语气描述了“睡不着、吃不下、心情差”等典型的抑郁症状,引导听者(包括医生和读者)产生“他可能真的有心理问题”的预期。但医生的回答却完全跳出了这个严肃框架——**“你不是抑郁症,是快开学了”**,用一个极其日常、贴近学生生活的“小烦恼”,消解了之前营造的沉重感,形成强烈的反差萌。这种“一本正经地胡说八道”式反转,让人觉得意外又好笑。\n\n\n### 2. **共鸣式调侃(精准戳中痛点)** \n对于学生群体(尤其是经历过开学焦虑的人)来说,“开学前的焦虑”是一个普遍的生活体验:假期结束、作业没写完、要面对早起和学业压力……这些真实的小烦恼,确实可能导致短暂的“情绪低落”,但本质上和“抑郁症”这种严肃的心理疾病完全不是一个量级。笑话通过夸张的对比(把“开学焦虑”伪装成“抑郁症”),精准戳中了学生时代的共同记忆,让人会心一笑——“啊,我当年开学前也这样!”这种共鸣感放大了笑点,让成年人也能回忆起自己的青春,产生亲切感。\n\n\n### 3. **语言的“一本正经”与“真相的简单粗暴”** \n医生的提问“你几岁了?”看似专业,仿佛要进行严肃诊断,结果答案却直白到“扎心”,这种“伪专业”与“真吐槽”的结合,也增加了幽默效果。就像用“医学问诊”的外壳,包装了一个学生党都懂的“生活梗”,既荒诞又真实。\n\n\n简单说,就是用**“大题小做”的反差**和**“共同经历的共鸣”**,把一个日常小焦虑变成了一个轻松的笑话~ 😄", "type": "output_text", "annotations": null } ], "role": "assistant", "status": "completed", "type": "message" } ], "parallel_tool_calls": null, "temperature": null, "tool_choice": null, "tools": null, "top_p": null, "max_output_tokens": 32768, "previous_response_id": "resp_0217****87fa", "thinking": { "type": "disabled" }, "service_tier": "default", "status": "completed", "text": null, "usage": { "input_tokens": 130, "input_tokens_details": { "cached_tokens": 0 }, "output_tokens": 445, "output_tokens_details": { "reasoning_tokens": 0 }, "total_tokens": 575 }, "caching": { "type": "disabled" }, "store": true, "expire_at": 1756734684 } ] ``` ### Python #### Request ```python import os from arkruntime import Ark # 从环境变量中获取您的API KEY,配置方法见:https://ark.volcengine.com/region:cn-beijing/docs/quick-start api_key = os.getenv('ARK_API_KEY') client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) # 创建第一轮对话请求 response = client.responses.create( model="doubao-seed-2-1-pro-260915", input="Hi,帮我讲个笑话。", extra_body={ "thinking":{"type":"disabled"} } ) print(response) # 创建第二轮对话请求 second_response = client.responses.create( model="doubao-seed-2-1-pro-260915", previous_response_id=response.id, input="这个笑话的笑点在哪?", extra_body={ "thinking":{"type":"disabled"} } ) print(second_response) ``` #### Response ``` [ { "id": "resp_****87fa", "created_at": 1756475482.0, "error": null, "incomplete_details": null, "instructions": null, "model": "doubao-seed-2-1-pro-260915", "object": "response", "output": [ { "id": "msg_0217****5328", "content": [ { "text": "好的,给你讲一个:\n\n病人:“医生,我最近睡不着,吃不下,心情很差,我是不是得了抑郁症啊?”\n医生:“你几岁了?”\n病人:“我16。”\n医生:“你那不是抑郁症,你是快开学了。”\n\n希望你喜欢!😄", "type": "output_text", "annotations": null } ], "role": "assistant", "status": "completed", "type": "message" } ], "parallel_tool_calls": null, "temperature": null, "tool_choice": null, "tools": null, "top_p": null, "max_output_tokens": 32768, "previous_response_id": null, "thinking": { "type": "disabled" }, "service_tier": "default", "status": "completed", "text": null, "usage": { "input_tokens": 43, "input_tokens_details": { "cached_tokens": 0 }, "output_tokens": 71, "output_tokens_details": { "reasoning_tokens": 0 }, "total_tokens": 114 }, "caching": { "type": "disabled" }, "store": true, "expire_at": 1756734682 }, { "id": "resp_0217****e74a", "created_at": 1756475484.0, "error": null, "incomplete_details": null, "instructions": null, "model": "doubao-seed-2-1-pro-260915", "object": "response", "output": [ { "id": "msg_0217****bd53", "content": [ { "text": "这个笑话的笑点主要来自于**“预期违背”**和**“对青少年生活场景的共鸣式调侃”**:\n\n\n### 1. **预期违背(反差感)** \n病人用非常严肃的语气描述了“睡不着、吃不下、心情差”等典型的抑郁症状,引导听者(包括医生和读者)产生“他可能真的有心理问题”的预期。但医生的回答却完全跳出了这个严肃框架——**“你不是抑郁症,是快开学了”**,用一个极其日常、贴近学生生活的“小烦恼”,消解了之前营造的沉重感,形成强烈的反差萌。这种“一本正经地胡说八道”式反转,让人觉得意外又好笑。\n\n\n### 2. **共鸣式调侃(精准戳中痛点)** \n对于学生群体(尤其是经历过开学焦虑的人)来说,“开学前的焦虑”是一个普遍的生活体验:假期结束、作业没写完、要面对早起和学业压力……这些真实的小烦恼,确实可能导致短暂的“情绪低落”,但本质上和“抑郁症”这种严肃的心理疾病完全不是一个量级。笑话通过夸张的对比(把“开学焦虑”伪装成“抑郁症”),精准戳中了学生时代的共同记忆,让人会心一笑——“啊,我当年开学前也这样!”这种共鸣感放大了笑点,让成年人也能回忆起自己的青春,产生亲切感。\n\n\n### 3. **语言的“一本正经”与“真相的简单粗暴”** \n医生的提问“你几岁了?”看似专业,仿佛要进行严肃诊断,结果答案却直白到“扎心”,这种“伪专业”与“真吐槽”的结合,也增加了幽默效果。就像用“医学问诊”的外壳,包装了一个学生党都懂的“生活梗”,既荒诞又真实。\n\n\n简单说,就是用**“大题小做”的反差**和**“共同经历的共鸣”**,把一个日常小焦虑变成了一个轻松的笑话~ 😄", "type": "output_text", "annotations": null } ], "role": "assistant", "status": "completed", "type": "message" } ], "parallel_tool_calls": null, "temperature": null, "tool_choice": null, "tools": null, "top_p": null, "max_output_tokens": 32768, "previous_response_id": "resp_0217****87fa", "thinking": { "type": "disabled" }, "service_tier": "default", "status": "completed", "text": null, "usage": { "input_tokens": 130, "input_tokens_details": { "cached_tokens": 0 }, "output_tokens": 445, "output_tokens_details": { "reasoning_tokens": 0 }, "total_tokens": 575 }, "caching": { "type": "disabled" }, "store": true, "expire_at": 1756734684 } ] ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/responses" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() resp, err := client.CreateResponses(ctx, &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", Input: responses.NewStringResponsesInput("你好,帮我讲个笑话。"), }) if err != nil { fmt.Printf("response error: %v\n", err) return } fmt.Println(resp) second_resp, second_err := client.CreateResponses(ctx, &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", PreviousResponseID: responses.NewOptString(resp.ID), Input: responses.NewStringResponsesInput("这个笑话的笑点在哪里?"), }) if second_err != nil { fmt.Printf("second response error: %v\n", second_err) return } fmt.Println(second_resp) } ``` #### Response ``` [ { "id": "resp_****87fa", "created_at": 1756475482.0, "error": null, "incomplete_details": null, "instructions": null, "model": "doubao-seed-2-1-pro-260915", "object": "response", "output": [ { "id": "msg_0217****5328", "content": [ { "text": "好的,给你讲一个:\n\n病人:“医生,我最近睡不着,吃不下,心情很差,我是不是得了抑郁症啊?”\n医生:“你几岁了?”\n病人:“我16。”\n医生:“你那不是抑郁症,你是快开学了。”\n\n希望你喜欢!😄", "type": "output_text", "annotations": null } ], "role": "assistant", "status": "completed", "type": "message" } ], "parallel_tool_calls": null, "temperature": null, "tool_choice": null, "tools": null, "top_p": null, "max_output_tokens": 32768, "previous_response_id": null, "thinking": { "type": "disabled" }, "service_tier": "default", "status": "completed", "text": null, "usage": { "input_tokens": 43, "input_tokens_details": { "cached_tokens": 0 }, "output_tokens": 71, "output_tokens_details": { "reasoning_tokens": 0 }, "total_tokens": 114 }, "caching": { "type": "disabled" }, "store": true, "expire_at": 1756734682 }, { "id": "resp_0217****e74a", "created_at": 1756475484.0, "error": null, "incomplete_details": null, "instructions": null, "model": "doubao-seed-2-1-pro-260915", "object": "response", "output": [ { "id": "msg_0217****bd53", "content": [ { "text": "这个笑话的笑点主要来自于**“预期违背”**和**“对青少年生活场景的共鸣式调侃”**:\n\n\n### 1. **预期违背(反差感)** \n病人用非常严肃的语气描述了“睡不着、吃不下、心情差”等典型的抑郁症状,引导听者(包括医生和读者)产生“他可能真的有心理问题”的预期。但医生的回答却完全跳出了这个严肃框架——**“你不是抑郁症,是快开学了”**,用一个极其日常、贴近学生生活的“小烦恼”,消解了之前营造的沉重感,形成强烈的反差萌。这种“一本正经地胡说八道”式反转,让人觉得意外又好笑。\n\n\n### 2. **共鸣式调侃(精准戳中痛点)** \n对于学生群体(尤其是经历过开学焦虑的人)来说,“开学前的焦虑”是一个普遍的生活体验:假期结束、作业没写完、要面对早起和学业压力……这些真实的小烦恼,确实可能导致短暂的“情绪低落”,但本质上和“抑郁症”这种严肃的心理疾病完全不是一个量级。笑话通过夸张的对比(把“开学焦虑”伪装成“抑郁症”),精准戳中了学生时代的共同记忆,让人会心一笑——“啊,我当年开学前也这样!”这种共鸣感放大了笑点,让成年人也能回忆起自己的青春,产生亲切感。\n\n\n### 3. **语言的“一本正经”与“真相的简单粗暴”** \n医生的提问“你几岁了?”看似专业,仿佛要进行严肃诊断,结果答案却直白到“扎心”,这种“伪专业”与“真吐槽”的结合,也增加了幽默效果。就像用“医学问诊”的外壳,包装了一个学生党都懂的“生活梗”,既荒诞又真实。\n\n\n简单说,就是用**“大题小做”的反差**和**“共同经历的共鸣”**,把一个日常小焦虑变成了一个轻松的笑话~ 😄", "type": "output_text", "annotations": null } ], "role": "assistant", "status": "completed", "type": "message" } ], "parallel_tool_calls": null, "temperature": null, "tool_choice": null, "tools": null, "top_p": null, "max_output_tokens": 32768, "previous_response_id": "resp_0217****87fa", "thinking": { "type": "disabled" }, "service_tier": "default", "status": "completed", "text": null, "usage": { "input_tokens": 130, "input_tokens_details": { "cached_tokens": 0 }, "output_tokens": 445, "output_tokens_details": { "reasoning_tokens": 0 }, "total_tokens": 575 }, "caching": { "type": "disabled" }, "store": true, "expire_at": 1756734684 } ] ``` ### Java #### Request ```java package com.ark.example; import com.volcengine.ark.runtime.service.ArkService; import com.volcengine.ark.runtime.models.responses.*; import java.util.Collections; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.JsonNode; import java.util.*; public class demo { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); ArkService arkService = ArkService.builder().apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); // create a response first ResponsesRequest request = ResponsesRequest.builder() .model("doubao-seed-2-1-pro-260915") .input(ResponsesInput.ofString("Hi,帮我讲个笑话。")) .build(); Response resp = arkService.createResponse(request); System.out.println(resp); // create second response ResponsesRequest request2 = ResponsesRequest.builder() .model("doubao-seed-2-1-pro-260915") .previousResponseId(resp.getId()) .input(ResponsesInput.ofList(java.util.Arrays.asList(ItemEasyMessage.builder().role(MessageRole.USER).content( MessageContent.ofList(java.util.Arrays.asList(ContentItemText.builder().text("这个笑话的笑点在哪?").build())) ).build()))) .build(); Response resp2 = arkService.createResponse(request2); System.out.println(resp2); arkService.shutdownExecutor(); } } ``` #### Response ``` [ { "id": "resp_****87fa", "created_at": 1756475482.0, "error": null, "incomplete_details": null, "instructions": null, "model": "doubao-seed-2-1-pro-260915", "object": "response", "output": [ { "id": "msg_0217****5328", "content": [ { "text": "好的,给你讲一个:\n\n病人:“医生,我最近睡不着,吃不下,心情很差,我是不是得了抑郁症啊?”\n医生:“你几岁了?”\n病人:“我16。”\n医生:“你那不是抑郁症,你是快开学了。”\n\n希望你喜欢!😄", "type": "output_text", "annotations": null } ], "role": "assistant", "status": "completed", "type": "message" } ], "parallel_tool_calls": null, "temperature": null, "tool_choice": null, "tools": null, "top_p": null, "max_output_tokens": 32768, "previous_response_id": null, "thinking": { "type": "disabled" }, "service_tier": "default", "status": "completed", "text": null, "usage": { "input_tokens": 43, "input_tokens_details": { "cached_tokens": 0 }, "output_tokens": 71, "output_tokens_details": { "reasoning_tokens": 0 }, "total_tokens": 114 }, "caching": { "type": "disabled" }, "store": true, "expire_at": 1756734682 }, { "id": "resp_0217****e74a", "created_at": 1756475484.0, "error": null, "incomplete_details": null, "instructions": null, "model": "doubao-seed-2-1-pro-260915", "object": "response", "output": [ { "id": "msg_0217****bd53", "content": [ { "text": "这个笑话的笑点主要来自于**“预期违背”**和**“对青少年生活场景的共鸣式调侃”**:\n\n\n### 1. **预期违背(反差感)** \n病人用非常严肃的语气描述了“睡不着、吃不下、心情差”等典型的抑郁症状,引导听者(包括医生和读者)产生“他可能真的有心理问题”的预期。但医生的回答却完全跳出了这个严肃框架——**“你不是抑郁症,是快开学了”**,用一个极其日常、贴近学生生活的“小烦恼”,消解了之前营造的沉重感,形成强烈的反差萌。这种“一本正经地胡说八道”式反转,让人觉得意外又好笑。\n\n\n### 2. **共鸣式调侃(精准戳中痛点)** \n对于学生群体(尤其是经历过开学焦虑的人)来说,“开学前的焦虑”是一个普遍的生活体验:假期结束、作业没写完、要面对早起和学业压力……这些真实的小烦恼,确实可能导致短暂的“情绪低落”,但本质上和“抑郁症”这种严肃的心理疾病完全不是一个量级。笑话通过夸张的对比(把“开学焦虑”伪装成“抑郁症”),精准戳中了学生时代的共同记忆,让人会心一笑——“啊,我当年开学前也这样!”这种共鸣感放大了笑点,让成年人也能回忆起自己的青春,产生亲切感。\n\n\n### 3. **语言的“一本正经”与“真相的简单粗暴”** \n医生的提问“你几岁了?”看似专业,仿佛要进行严肃诊断,结果答案却直白到“扎心”,这种“伪专业”与“真吐槽”的结合,也增加了幽默效果。就像用“医学问诊”的外壳,包装了一个学生党都懂的“生活梗”,既荒诞又真实。\n\n\n简单说,就是用**“大题小做”的反差**和**“共同经历的共鸣”**,把一个日常小焦虑变成了一个轻松的笑话~ 😄", "type": "output_text", "annotations": null } ], "role": "assistant", "status": "completed", "type": "message" } ], "parallel_tool_calls": null, "temperature": null, "tool_choice": null, "tools": null, "top_p": null, "max_output_tokens": 32768, "previous_response_id": "resp_0217****87fa", "thinking": { "type": "disabled" }, "service_tier": "default", "status": "completed", "text": null, "usage": { "input_tokens": 130, "input_tokens_details": { "cached_tokens": 0 }, "output_tokens": 445, "output_tokens_details": { "reasoning_tokens": 0 }, "total_tokens": 575 }, "caching": { "type": "disabled" }, "store": true, "expire_at": 1756734684 } ] ``` ## 上下文缓存 ### Python-OpenAI #### Request ```python import os from openai import OpenAI # 从环境变量中获取您的API KEY,配置方法见:https://ark.volcengine.com/region:cn-beijing/docs/quick-start api_key = os.getenv('ARK_API_KEY') client = OpenAI( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) response = client.responses.create( model="doubao-seed-2-1-pro-260915", input=[ { "role": "system", "content": "你是三字经小能手。每次用户输入时,你只能用三个汉字作出回应。用户输入如果是三个字,就用三个字像对对联一样进行匹配回应;如果不是三个字,就将用户输入的意思总结成三个字。无论何时,回复都严格限制为三个字。" }, { "role": "user", "content":"人之初" } ], extra_body={ "caching": {"type": "enabled"}, "thinking":{"type":"disabled"} } ) print(response) second_response = client.responses.create( model="doubao-seed-2-1-pro-260915", previous_response_id=response.id, input=[{"role": "user", "content": "下一句"}], extra_body={ "caching": {"type": "enabled"}, "thinking":{"type":"disabled"} } ) print(second_response) third_response = client.responses.create( model="doubao-seed-2-1-pro-260915", previous_response_id=second_response.id, input=[{"role": "user", "content": "下一句"}], extra_body={ "caching": {"type": "enabled"}, "thinking":{"type":"disabled"} } ) print(third_response) ``` #### Response ``` [{ "created_at": 1760168118, "id": "resp_0217*****", "max_output_tokens": 32768, "model": "doubao-seed-2-1-pro-260915", "object": "response", "output": [ { "type": "message", "role": "assistant", "content": [ { "type": "output_text", "text": "性本善" } ], "status": "completed", "id": "msg_02176016811859200000000000000000000ffffac15aa1fde96cd" } ], "thinking": { "type": "disabled" }, "service_tier": "default", "status": "completed", "usage": { "input_tokens": 101, "output_tokens": 3, "total_tokens": 104, "input_tokens_details": { "cached_tokens": 0 }, "output_tokens_details": { "reasoning_tokens": 0 } }, "caching": { "type": "enabled" }, "store": true, "expire_at": 1760427318 }, { "created_at": 1760168211, "id": "resp_0217*****", "max_output_tokens": 32768, "model": "doubao-seed-2-1-pro-260915", "object": "response", "output": [ { "type": "message", "role": "assistant", "content": [ { "type": "output_text", "text": "性相近" } ], "status": "completed", "id": "msg_02176016821111700000000000000000000ffffac15aa7b89be5a" } ], "previous_response_id": "resp_0217*****", "thinking": { "type": "disabled" }, "service_tier": "default", "status": "completed", "usage": { "input_tokens": 116, "output_tokens": 2, "total_tokens": 118, "input_tokens_details": { "cached_tokens": 104 }, "output_tokens_details": { "reasoning_tokens": 0 } }, "caching": { "type": "enabled" }, "store": true, "expire_at": 1760427411 }, { "created_at": 1760168277, "id": "resp_0217*****", "max_output_tokens": 32768, "model": "doubao-seed-2-1-pro-260915", "object": "response", "output": [ { "type": "message", "role": "assistant", "content": [ { "type": "output_text", "text": "习相远" } ], "status": "completed", "id": "msg_02176016827706700000000000000000000ffffac15aa29c2672a" } ], "previous_response_id": "resp_0217*****", "thinking": { "type": "disabled" }, "service_tier": "default", "status": "completed", "usage": { "input_tokens": 130, "output_tokens": 3, "total_tokens": 133, "input_tokens_details": { "cached_tokens": 118 }, "output_tokens_details": { "reasoning_tokens": 0 } }, "caching": { "type": "enabled" }, "store": true, "expire_at": 1760427477 }] ``` ### Python #### Request ```python import os from arkruntime import Ark # 从环境变量中获取您的API KEY,配置方法见:https://ark.volcengine.com/region:cn-beijing/docs/quick-start api_key = os.getenv('ARK_API_KEY') client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) response = client.responses.create( model="doubao-seed-2-1-pro-260915", input=[ { "role": "system", "content": "你是三字经小能手。每次用户输入时,你只能用三个汉字作出回应。用户输入如果是三个字,就用三个字像对对联一样进行匹配回应;如果不是三个字,就将用户输入的意思总结成三个字。无论何时,回复都严格限制为三个字。" }, { "role": "user", "content":"人之初" } ], caching={"type": "enabled"}, thinking={"type": "disabled"}, ) print(response) second_response = client.responses.create( model="doubao-seed-2-1-pro-260915", previous_response_id=response.id, input=[{"role": "user", "content": "下一句"}], caching={"type": "enabled"}, thinking={"type": "disabled"}, ) print(second_response) third_response = client.responses.create( model="doubao-seed-2-1-pro-260915", previous_response_id=second_response.id, input=[{"role": "user", "content": "下一句"}], caching={"type": "enabled"}, thinking={"type": "disabled"}, ) print(third_response) ``` #### Response ``` [{ "created_at": 1760168118, "id": "resp_0217*****", "max_output_tokens": 32768, "model": "doubao-seed-2-1-pro-260915", "object": "response", "output": [ { "type": "message", "role": "assistant", "content": [ { "type": "output_text", "text": "性本善" } ], "status": "completed", "id": "msg_02176016811859200000000000000000000ffffac15aa1fde96cd" } ], "thinking": { "type": "disabled" }, "service_tier": "default", "status": "completed", "usage": { "input_tokens": 101, "output_tokens": 3, "total_tokens": 104, "input_tokens_details": { "cached_tokens": 0 }, "output_tokens_details": { "reasoning_tokens": 0 } }, "caching": { "type": "enabled" }, "store": true, "expire_at": 1760427318 }, { "created_at": 1760168211, "id": "resp_0217*****", "max_output_tokens": 32768, "model": "doubao-seed-2-1-pro-260915", "object": "response", "output": [ { "type": "message", "role": "assistant", "content": [ { "type": "output_text", "text": "性相近" } ], "status": "completed", "id": "msg_02176016821111700000000000000000000ffffac15aa7b89be5a" } ], "previous_response_id": "resp_0217*****", "thinking": { "type": "disabled" }, "service_tier": "default", "status": "completed", "usage": { "input_tokens": 116, "output_tokens": 2, "total_tokens": 118, "input_tokens_details": { "cached_tokens": 104 }, "output_tokens_details": { "reasoning_tokens": 0 } }, "caching": { "type": "enabled" }, "store": true, "expire_at": 1760427411 }, { "created_at": 1760168277, "id": "resp_0217*****", "max_output_tokens": 32768, "model": "doubao-seed-2-1-pro-260915", "object": "response", "output": [ { "type": "message", "role": "assistant", "content": [ { "type": "output_text", "text": "习相远" } ], "status": "completed", "id": "msg_02176016827706700000000000000000000ffffac15aa29c2672a" } ], "previous_response_id": "resp_0217*****", "thinking": { "type": "disabled" }, "service_tier": "default", "status": "completed", "usage": { "input_tokens": 130, "output_tokens": 3, "total_tokens": 133, "input_tokens_details": { "cached_tokens": 118 }, "output_tokens_details": { "reasoning_tokens": 0 } }, "caching": { "type": "enabled" }, "store": true, "expire_at": 1760427477 }] ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/responses" ) func main() { client := arkruntime.NewClientWithApiKey( //通过 os.Getenv 从环境变量中获取 ARK_API_KEY os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) // 创建一个上下文,通常用于传递请求的上下文信息,如超时、取消等 ctx := context.Background() resp, err := client.CreateResponses(ctx, &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", Input: responses.NewInputItemArrayResponsesInput([]responses.InputItem{ easyMessage(responses.MessageRoleSystem, "你是三字经小能手。每次用户输入时,你只能用三个汉字作出回应。用户输入如果是三个字,就用三个字像对对联一样进行匹配回应;如果不是三个字,就将用户输入的意思总结成三个字。无论何时,回复都严格限制为三个字。"), easyMessage(responses.MessageRoleUser, "人之初"), }), Caching: responses.NewOptResponseCaching(responses.ResponseCaching{Type: responses.NewOptCacheMode(responses.CacheModeEnabled)}), Thinking: responses.NewOptThinking(responses.Thinking{Type: responses.NewOptThinkingMode(responses.ThinkingModeDisabled)}), }) if err != nil { fmt.Printf("response error: %v\n", err) return } fmt.Println(resp) second_resp, second_err := client.CreateResponses(ctx, &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", PreviousResponseID: responses.NewOptString(resp.ID), Input: responses.NewInputItemArrayResponsesInput([]responses.InputItem{ easyMessage(responses.MessageRoleUser, "下一句"), }), Caching: responses.NewOptResponseCaching(responses.ResponseCaching{Type: responses.NewOptCacheMode(responses.CacheModeEnabled)}), Thinking: responses.NewOptThinking(responses.Thinking{Type: responses.NewOptThinkingMode(responses.ThinkingModeDisabled)}), }) if second_err != nil { fmt.Printf("second response error: %v\n", second_err) return } fmt.Println(second_resp) third_resp, third_err := client.CreateResponses(ctx, &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", PreviousResponseID: responses.NewOptString(second_resp.ID), Input: responses.NewInputItemArrayResponsesInput([]responses.InputItem{ easyMessage(responses.MessageRoleUser, "下一句"), }), Caching: responses.NewOptResponseCaching(responses.ResponseCaching{Type: responses.NewOptCacheMode(responses.CacheModeEnabled)}), Thinking: responses.NewOptThinking(responses.Thinking{Type: responses.NewOptThinkingMode(responses.ThinkingModeDisabled)}), }) if third_err != nil { fmt.Printf("second response error: %v\n", third_err) return } fmt.Println(third_resp) } func easyMessage(role responses.MessageRole, content string) responses.InputItem { return responses.InputItem{ OneOf: responses.NewItemEasyMessageInputItemSum( responses.ItemEasyMessage{ Role: responses.NewOptMessageRole(role), Content: responses.NewStringMessageContent(content), }, ), } } ``` #### Response ``` [{ "created_at": 1760168118, "id": "resp_0217*****", "max_output_tokens": 32768, "model": "doubao-seed-2-1-pro-260915", "object": "response", "output": [ { "type": "message", "role": "assistant", "content": [ { "type": "output_text", "text": "性本善" } ], "status": "completed", "id": "msg_02176016811859200000000000000000000ffffac15aa1fde96cd" } ], "thinking": { "type": "disabled" }, "service_tier": "default", "status": "completed", "usage": { "input_tokens": 101, "output_tokens": 3, "total_tokens": 104, "input_tokens_details": { "cached_tokens": 0 }, "output_tokens_details": { "reasoning_tokens": 0 } }, "caching": { "type": "enabled" }, "store": true, "expire_at": 1760427318 }, { "created_at": 1760168211, "id": "resp_0217*****", "max_output_tokens": 32768, "model": "doubao-seed-2-1-pro-260915", "object": "response", "output": [ { "type": "message", "role": "assistant", "content": [ { "type": "output_text", "text": "性相近" } ], "status": "completed", "id": "msg_02176016821111700000000000000000000ffffac15aa7b89be5a" } ], "previous_response_id": "resp_0217*****", "thinking": { "type": "disabled" }, "service_tier": "default", "status": "completed", "usage": { "input_tokens": 116, "output_tokens": 2, "total_tokens": 118, "input_tokens_details": { "cached_tokens": 104 }, "output_tokens_details": { "reasoning_tokens": 0 } }, "caching": { "type": "enabled" }, "store": true, "expire_at": 1760427411 }, { "created_at": 1760168277, "id": "resp_0217*****", "max_output_tokens": 32768, "model": "doubao-seed-2-1-pro-260915", "object": "response", "output": [ { "type": "message", "role": "assistant", "content": [ { "type": "output_text", "text": "习相远" } ], "status": "completed", "id": "msg_02176016827706700000000000000000000ffffac15aa29c2672a" } ], "previous_response_id": "resp_0217*****", "thinking": { "type": "disabled" }, "service_tier": "default", "status": "completed", "usage": { "input_tokens": 130, "output_tokens": 3, "total_tokens": 133, "input_tokens_details": { "cached_tokens": 118 }, "output_tokens_details": { "reasoning_tokens": 0 } }, "caching": { "type": "enabled" }, "store": true, "expire_at": 1760427477 }] ``` ### Java #### Request ```java package com.ark.example; import com.volcengine.ark.runtime.service.ArkService; import com.volcengine.ark.runtime.models.responses.*; public class demo { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); // 创建ArkService实例 ArkService arkService = ArkService.builder().apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); ResponsesRequest request = ResponsesRequest.builder() .model("doubao-seed-2-1-pro-260915") .input(ResponsesInput.ofList(java.util.Arrays.asList(ItemEasyMessage.builder().role(MessageRole.SYSTEM).content( MessageContent.ofString("你是三字经小能手。每次用户输入时,你只能用三个汉字作出回应。用户输入如果是三个字,就用三个字像对对联一样进行匹配回应;如果不是三个字,就将用户输入的意思总结成三个字。无论何时,回复都严格限制为三个字。") ).build(), ItemEasyMessage.builder().role(MessageRole.SYSTEM).content( MessageContent.ofString("人之初") ).build()))) .caching(ResponseCaching.builder().type(CacheMode.ENABLED).build()) .thinking(Thinking.builder().type(ThinkingMode.DISABLED).build()) .build(); Response resp = arkService.createResponse(request); System.out.println(resp); System.out.println("---------------------"); ResponsesRequest request2 = ResponsesRequest.builder() .model("doubao-seed-2-1-pro-260915") .previousResponseId(resp.getId()) .input(ResponsesInput.ofList(java.util.Arrays.asList(ItemEasyMessage.builder().role(MessageRole.USER).content( MessageContent.ofString("下一句") ).build()))) .caching(ResponseCaching.builder().type(CacheMode.ENABLED).build()) .thinking(Thinking.builder().type(ThinkingMode.DISABLED).build()) .build(); Response resp2 = arkService.createResponse(request2); System.out.println(resp2); System.out.println("---------------------"); ResponsesRequest request3 = ResponsesRequest.builder() .model("doubao-seed-2-1-pro-260915") .previousResponseId(resp2.getId()) .input(ResponsesInput.ofList(java.util.Arrays.asList(ItemEasyMessage.builder().role(MessageRole.USER).content( MessageContent.ofString("下一句") ).build()))) .caching(ResponseCaching.builder().type(CacheMode.ENABLED).build()) .thinking(Thinking.builder().type(ThinkingMode.DISABLED).build()) .build(); Response resp3 = arkService.createResponse(request3); System.out.println(resp3); arkService.shutdownExecutor(); } } ``` #### Response ``` [{ "created_at": 1760168118, "id": "resp_0217*****", "max_output_tokens": 32768, "model": "doubao-seed-2-1-pro-260915", "object": "response", "output": [ { "type": "message", "role": "assistant", "content": [ { "type": "output_text", "text": "性本善" } ], "status": "completed", "id": "msg_02176016811859200000000000000000000ffffac15aa1fde96cd" } ], "thinking": { "type": "disabled" }, "service_tier": "default", "status": "completed", "usage": { "input_tokens": 101, "output_tokens": 3, "total_tokens": 104, "input_tokens_details": { "cached_tokens": 0 }, "output_tokens_details": { "reasoning_tokens": 0 } }, "caching": { "type": "enabled" }, "store": true, "expire_at": 1760427318 }, { "created_at": 1760168211, "id": "resp_0217*****", "max_output_tokens": 32768, "model": "doubao-seed-2-1-pro-260915", "object": "response", "output": [ { "type": "message", "role": "assistant", "content": [ { "type": "output_text", "text": "性相近" } ], "status": "completed", "id": "msg_02176016821111700000000000000000000ffffac15aa7b89be5a" } ], "previous_response_id": "resp_0217*****", "thinking": { "type": "disabled" }, "service_tier": "default", "status": "completed", "usage": { "input_tokens": 116, "output_tokens": 2, "total_tokens": 118, "input_tokens_details": { "cached_tokens": 104 }, "output_tokens_details": { "reasoning_tokens": 0 } }, "caching": { "type": "enabled" }, "store": true, "expire_at": 1760427411 }, { "created_at": 1760168277, "id": "resp_0217*****", "max_output_tokens": 32768, "model": "doubao-seed-2-1-pro-260915", "object": "response", "output": [ { "type": "message", "role": "assistant", "content": [ { "type": "output_text", "text": "习相远" } ], "status": "completed", "id": "msg_02176016827706700000000000000000000ffffac15aa29c2672a" } ], "previous_response_id": "resp_0217*****", "thinking": { "type": "disabled" }, "service_tier": "default", "status": "completed", "usage": { "input_tokens": 130, "output_tokens": 3, "total_tokens": 133, "input_tokens_details": { "cached_tokens": 118 }, "output_tokens_details": { "reasoning_tokens": 0 } }, "caching": { "type": "enabled" }, "store": true, "expire_at": 1760427477 }] ``` ## 函数调用 Function Calling ### cURL #### Request ```bash curl --location 'https://ark.cn-beijing.volces.com/api/v3/responses' \ --header "Authorization: Bearer $ARK_API_KEY" \ --header 'Content-Type: application/json' \ --data '{ "model": "doubao-seed-2-1-pro-260915", "input": "查询北京今天的天气", "tools":[ { "type": "function", "name": "获取天气信息", "description": "根据给出的位置获取天气信息", "parameters": { "type": "object", "properties": { "location": { "type": "string", "description": "城市名称,例如:北京" } }, "required": [ "location" ] } } ] }' ``` #### Response ``` { "id": "resp_0217****b63e", "created_at": 1756477803.0, "error": null, "incomplete_details": null, "instructions": null, "model": "doubao-seed-2-1-pro-260915", "object": "response", "output": [ { "id": "rs_0217****6b15", "summary": [ { "text": "让我思考一下,我现在需要回答用户的问题:“北京的天气怎么样?”根据系统提示,我需要调用工具来获取天气信息。首先,我要确认用户的问题是否需要调用工具。用户询问的是当前北京的天气,这属于实时信息,无法通过常识直接回答,所以必须使用提供的工具。\n\n接下来,查看可用的工具列表,只有一个工具叫做“获取天气信息”,它的参数需要一个“location”,类型是字符串,必填项。用户的问题中明确提到了“北京”,所以location参数应该是“北京”。\n\n然后,我需要按照格式要求生成工具调用。系统提示说调用工具需要用包裹,里面是一个JSON数组。这里只需要调用一个工具,所以是单工具调用。参数部分应该是{\"location\": \"北京\"}。\n\n检查是否有其他需要注意的地方,比如参数是否正确,格式是否符合要求。确认无误后,生成调用语句。不需要并行调用,因为只有一个工具可用,且只需要一次调用就能获取所需信息。因此,最终的调用应该是:\n\n", "type": "summary_text" } ], "type": "reasoning", "status": "completed" }, { "arguments": "{\"location\":\"北京\"}", "call_id": "call_****a6al", "name": "获取天气信息", "type": "function_call", "id": "fc_0217****c976b", "status": "completed" } ], "parallel_tool_calls": null, "temperature": null, "tool_choice": null, "tools": [ { "name": "获取天气信息", "parameters": { "type": "object", "properties": { "location": { "type": "string", "description": "城市名称,例如:北京" } }, "required": ["location"] }, "type": "function", "description": "根据给出的位置获取天气信息" } ], "top_p": null, "max_output_tokens": 32768, "previous_response_id": null, "thinking": null, "service_tier": "default", "status": "completed", "text": null, "usage": { "input_tokens": 454, "input_tokens_details": { "cached_tokens": 0 }, "output_tokens": 306, "output_tokens_details": { "reasoning_tokens": 279 }, "total_tokens": 760 }, "caching": { "type": "disabled" }, "store": true, "expire_at": 1756737003 } ``` ### Python-OpenAI #### Request ```python from openai import OpenAI import os # 从环境变量中获取您的API KEY,配置方法见:https://ark.volcengine.com/region:cn-beijing/docs/quick-start api_key = os.getenv('ARK_API_KEY') client = OpenAI( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) tools = [{ "type": "function", "name": "获取天气信息", "description": "根据给出的位置获取天气信息", "parameters": { "type": "object", "properties": { "location": { "type": "string", "description": "城市名称,例如:北京" } }, "required": [ "location" ] } }] # 创建一个对话请求 response = client.responses.create( model="doubao-seed-2-1-pro-260915", input=[{"role": "user", "content": "北京的天气怎么样?"}], tools=tools, ) print(response) ``` #### Response ``` { "id": "resp_0217****b63e", "created_at": 1756477803.0, "error": null, "incomplete_details": null, "instructions": null, "model": "doubao-seed-2-1-pro-260915", "object": "response", "output": [ { "id": "rs_0217****6b15", "summary": [ { "text": "让我思考一下,我现在需要回答用户的问题:“北京的天气怎么样?”根据系统提示,我需要调用工具来获取天气信息。首先,我要确认用户的问题是否需要调用工具。用户询问的是当前北京的天气,这属于实时信息,无法通过常识直接回答,所以必须使用提供的工具。\n\n接下来,查看可用的工具列表,只有一个工具叫做“获取天气信息”,它的参数需要一个“location”,类型是字符串,必填项。用户的问题中明确提到了“北京”,所以location参数应该是“北京”。\n\n然后,我需要按照格式要求生成工具调用。系统提示说调用工具需要用包裹,里面是一个JSON数组。这里只需要调用一个工具,所以是单工具调用。参数部分应该是{\"location\": \"北京\"}。\n\n检查是否有其他需要注意的地方,比如参数是否正确,格式是否符合要求。确认无误后,生成调用语句。不需要并行调用,因为只有一个工具可用,且只需要一次调用就能获取所需信息。因此,最终的调用应该是:\n\n", "type": "summary_text" } ], "type": "reasoning", "status": "completed" }, { "arguments": "{\"location\":\"北京\"}", "call_id": "call_****a6al", "name": "获取天气信息", "type": "function_call", "id": "fc_0217****c976b", "status": "completed" } ], "parallel_tool_calls": null, "temperature": null, "tool_choice": null, "tools": [ { "name": "获取天气信息", "parameters": { "type": "object", "properties": { "location": { "type": "string", "description": "城市名称,例如:北京" } }, "required": ["location"] }, "type": "function", "description": "根据给出的位置获取天气信息" } ], "top_p": null, "max_output_tokens": 32768, "previous_response_id": null, "thinking": null, "service_tier": "default", "status": "completed", "text": null, "usage": { "input_tokens": 454, "input_tokens_details": { "cached_tokens": 0 }, "output_tokens": 306, "output_tokens_details": { "reasoning_tokens": 279 }, "total_tokens": 760 }, "caching": { "type": "disabled" }, "store": true, "expire_at": 1756737003 } ``` ### Python #### Request ```python import os from arkruntime import Ark # 从环境变量中获取您的API KEY,配置方法见:https://ark.volcengine.com/region:cn-beijing/docs/quick-start api_key = os.getenv('ARK_API_KEY') client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) tools = [{ "type": "function", "name": "获取天气信息", "description": "根据给出的位置获取天气信息", "parameters": { "type": "object", "properties": { "location": { "type": "string", "description": "城市名称,例如:北京" } }, "required": [ "location" ] } }] # 创建一个对话请求 response = client.responses.create( model="doubao-seed-2-1-pro-260915", input=[{"role": "user", "content": "北京的天气怎么样?"}], tools=tools, ) print(response) ``` #### Response ``` { "id": "resp_0217****b63e", "created_at": 1756477803.0, "error": null, "incomplete_details": null, "instructions": null, "model": "doubao-seed-2-1-pro-260915", "object": "response", "output": [ { "id": "rs_0217****6b15", "summary": [ { "text": "让我思考一下,我现在需要回答用户的问题:“北京的天气怎么样?”根据系统提示,我需要调用工具来获取天气信息。首先,我要确认用户的问题是否需要调用工具。用户询问的是当前北京的天气,这属于实时信息,无法通过常识直接回答,所以必须使用提供的工具。\n\n接下来,查看可用的工具列表,只有一个工具叫做“获取天气信息”,它的参数需要一个“location”,类型是字符串,必填项。用户的问题中明确提到了“北京”,所以location参数应该是“北京”。\n\n然后,我需要按照格式要求生成工具调用。系统提示说调用工具需要用包裹,里面是一个JSON数组。这里只需要调用一个工具,所以是单工具调用。参数部分应该是{\"location\": \"北京\"}。\n\n检查是否有其他需要注意的地方,比如参数是否正确,格式是否符合要求。确认无误后,生成调用语句。不需要并行调用,因为只有一个工具可用,且只需要一次调用就能获取所需信息。因此,最终的调用应该是:\n\n", "type": "summary_text" } ], "type": "reasoning", "status": "completed" }, { "arguments": "{\"location\":\"北京\"}", "call_id": "call_****a6al", "name": "获取天气信息", "type": "function_call", "id": "fc_0217****c976b", "status": "completed" } ], "parallel_tool_calls": null, "temperature": null, "tool_choice": null, "tools": [ { "name": "获取天气信息", "parameters": { "type": "object", "properties": { "location": { "type": "string", "description": "城市名称,例如:北京" } }, "required": ["location"] }, "type": "function", "description": "根据给出的位置获取天气信息" } ], "top_p": null, "max_output_tokens": 32768, "previous_response_id": null, "thinking": null, "service_tier": "default", "status": "completed", "text": null, "usage": { "input_tokens": 454, "input_tokens_details": { "cached_tokens": 0 }, "output_tokens": 306, "output_tokens_details": { "reasoning_tokens": 279 }, "total_tokens": 760 }, "caching": { "type": "disabled" }, "store": true, "expire_at": 1756737003 } ``` ### Go #### Request ```go package main import ( "context" "encoding/json" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/responses" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) response, err := client.CreateResponses(context.Background(), &responses.ResponsesRequest{ Model: "doubao-seed-2-1-pro-260915", Input: responses.NewStringResponsesInput("北京的天气怎么样?"), Tools: []responses.Tool{ functionTool(), }, }) if err != nil { fmt.Printf("response error: %v\n", err) return } fmt.Println(response) } func functionTool() responses.Tool { var parameters responses.FunctionToolParameters if err := json.Unmarshal( []byte(`{"type":"object","properties":{"location":{"type":"string","description":"城市名称,例如:北京"}},"required":["location"]}`), ¶meters, ); err != nil { panic(err) } return responses.Tool{ OneOf: responses.NewFunctionToolToolSum( responses.FunctionTool{ Name: "get_weather", Type: responses.FunctionToolTypeFunction, Description: responses.NewOptString("根据给出的位置获取天气信息"), Parameters: responses.NewOptFunctionToolParameters(parameters), }, ), } } ``` #### Response ``` { "id": "resp_0217****b63e", "created_at": 1756477803.0, "error": null, "incomplete_details": null, "instructions": null, "model": "doubao-seed-2-1-pro-260915", "object": "response", "output": [ { "id": "rs_0217****6b15", "summary": [ { "text": "让我思考一下,我现在需要回答用户的问题:“北京的天气怎么样?”根据系统提示,我需要调用工具来获取天气信息。首先,我要确认用户的问题是否需要调用工具。用户询问的是当前北京的天气,这属于实时信息,无法通过常识直接回答,所以必须使用提供的工具。\n\n接下来,查看可用的工具列表,只有一个工具叫做“获取天气信息”,它的参数需要一个“location”,类型是字符串,必填项。用户的问题中明确提到了“北京”,所以location参数应该是“北京”。\n\n然后,我需要按照格式要求生成工具调用。系统提示说调用工具需要用包裹,里面是一个JSON数组。这里只需要调用一个工具,所以是单工具调用。参数部分应该是{\"location\": \"北京\"}。\n\n检查是否有其他需要注意的地方,比如参数是否正确,格式是否符合要求。确认无误后,生成调用语句。不需要并行调用,因为只有一个工具可用,且只需要一次调用就能获取所需信息。因此,最终的调用应该是:\n\n", "type": "summary_text" } ], "type": "reasoning", "status": "completed" }, { "arguments": "{\"location\":\"北京\"}", "call_id": "call_****a6al", "name": "获取天气信息", "type": "function_call", "id": "fc_0217****c976b", "status": "completed" } ], "parallel_tool_calls": null, "temperature": null, "tool_choice": null, "tools": [ { "name": "获取天气信息", "parameters": { "type": "object", "properties": { "location": { "type": "string", "description": "城市名称,例如:北京" } }, "required": ["location"] }, "type": "function", "description": "根据给出的位置获取天气信息" } ], "top_p": null, "max_output_tokens": 32768, "previous_response_id": null, "thinking": null, "service_tier": "default", "status": "completed", "text": null, "usage": { "input_tokens": 454, "input_tokens_details": { "cached_tokens": 0 }, "output_tokens": 306, "output_tokens_details": { "reasoning_tokens": 279 }, "total_tokens": 760 }, "caching": { "type": "disabled" }, "store": true, "expire_at": 1756737003 } ``` ### Java #### Request ```java package com.ark.example; import com.volcengine.ark.runtime.service.ArkService; import com.volcengine.ark.runtime.models.responses.*; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.JsonNode; import java.util.*; public class demo { public static ObjectMapper om = new ObjectMapper(); public static List buildTools() { JsonNode params = om.createObjectNode() .put("type", "object") .set("properties", om.createObjectNode() .set("location", om.createObjectNode() .put("type", "string") .put("description", "城市名称,例如:北京"))); FunctionTool t = FunctionTool.builder() .name("获取天气信息") .description("根据给出的位置获取天气信息") .parameters(om.convertValue(params, Map.class)) .build(); return Arrays.asList(t); } public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); // 创建ArkService实例 ArkService arkService = ArkService.builder().apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); ResponsesRequest req = ResponsesRequest.builder() .model("doubao-seed-2-1-pro-260915") .input(ResponsesInput.ofList(java.util.Arrays.asList(ItemEasyMessage.builder().role(MessageRole.USER).content( MessageContent.ofList(java.util.Arrays.asList(ContentItemText.builder().text("查询北京今天的天气").build())) ).build()))) .tools(buildTools()) .build(); Response resp = arkService.createResponse(req); System.out.println(resp); arkService.shutdownExecutor(); } } ``` #### Response ``` { "id": "resp_0217****b63e", "created_at": 1756477803.0, "error": null, "incomplete_details": null, "instructions": null, "model": "doubao-seed-2-1-pro-260915", "object": "response", "output": [ { "id": "rs_0217****6b15", "summary": [ { "text": "让我思考一下,我现在需要回答用户的问题:“北京的天气怎么样?”根据系统提示,我需要调用工具来获取天气信息。首先,我要确认用户的问题是否需要调用工具。用户询问的是当前北京的天气,这属于实时信息,无法通过常识直接回答,所以必须使用提供的工具。\n\n接下来,查看可用的工具列表,只有一个工具叫做“获取天气信息”,它的参数需要一个“location”,类型是字符串,必填项。用户的问题中明确提到了“北京”,所以location参数应该是“北京”。\n\n然后,我需要按照格式要求生成工具调用。系统提示说调用工具需要用包裹,里面是一个JSON数组。这里只需要调用一个工具,所以是单工具调用。参数部分应该是{\"location\": \"北京\"}。\n\n检查是否有其他需要注意的地方,比如参数是否正确,格式是否符合要求。确认无误后,生成调用语句。不需要并行调用,因为只有一个工具可用,且只需要一次调用就能获取所需信息。因此,最终的调用应该是:\n\n", "type": "summary_text" } ], "type": "reasoning", "status": "completed" }, { "arguments": "{\"location\":\"北京\"}", "call_id": "call_****a6al", "name": "获取天气信息", "type": "function_call", "id": "fc_0217****c976b", "status": "completed" } ], "parallel_tool_calls": null, "temperature": null, "tool_choice": null, "tools": [ { "name": "获取天气信息", "parameters": { "type": "object", "properties": { "location": { "type": "string", "description": "城市名称,例如:北京" } }, "required": ["location"] }, "type": "function", "description": "根据给出的位置获取天气信息" } ], "top_p": null, "max_output_tokens": 32768, "previous_response_id": null, "thinking": null, "service_tier": "default", "status": "completed", "text": null, "usage": { "input_tokens": 454, "input_tokens_details": { "cached_tokens": 0 }, "output_tokens": 306, "output_tokens_details": { "reasoning_tokens": 279 }, "total_tokens": 760 }, "caching": { "type": "disabled" }, "store": true, "expire_at": 1756737003 } ``` --- # 查询 Response 详情 Source: https://ark.volcengine.com/region:cn-beijing/docs/list-model-responses-api `GET https://ark.cn-beijing.volces.com/api/v3/responses/{responseId}` 通过 ID 查询 Response 详情。如果 Response 已完成,接口会返回完整的 Response 对象;如果 Response 仍在生成中,接口会返回错误码。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **responseId** `string` `必选` | Response ID 要查询的 Response ID。 ### Query 参数 > 在 URL Query String 中传入。 **include** `string[]` | 额外字段 指定响应中需要包含的额外字段。 ## 响应参数 **created_at** `integer` | 创建时间 本次请求创建时间的 Unix 时间戳(秒) **id** `string` | 响应 ID 本次请求的唯一标识。 **model** `string` | 模型 ID 本次请求实际使用的模型名称和版本。 **object** `string` | 对象类型 固定为 `response` **output** `object[]` | 输出条目 模型的输出消息列表,包含模型响应本次请求生成的回答、思维链、工具调用。 消息输出 `object` 模型生成的消息输出,包含文本内容。 **content** `object[]` | 输出内容 `output.content` 输出内容列表。 模型回答文本 `object` 模型生成的最终回答文本。 **type** `string` | 类型 `output.content.type` 内容类型,此处固定为 `output_text` **annotations** `object[]` | 标注列表 `output.content.annotations` 文本附带的标注信息列表(如引用来源等) 网页引用 `object` 引用自互联网网页的标注信息。 **title** `string` | 标题 `output.content.annotations.title` 引用网页的标题。 **type** `string` | 类型 `output.content.annotations.type` 标注类型,此处固定为 `url_citation` **url** `string` | 网址 `output.content.annotations.url` 引用网页的 URL 地址。 **cover_image** `object` | 封面图 `output.content.annotations.cover_image` 网页封面图片信息。 **height** `integer` | 高度 `output.content.annotations.cover_image.height` 封面图片高度(像素) **url** `string` | 图片地址 `output.content.annotations.cover_image.url` 封面图片的 URL 地址。 **width** `integer` | 宽度 `output.content.annotations.cover_image.width` 封面图片宽度(像素) **freshness_info** `string` | 新鲜度 `output.content.annotations.freshness_info` 内容新鲜度信息。 **logo_url** `string` | Logo 地址 `output.content.annotations.logo_url` 网站 Logo 图标地址。 **mobile_url** `string` | 移动端地址 `output.content.annotations.mobile_url` 移动端访问地址。 **publish_time** `string` | 发布时间 `output.content.annotations.publish_time` 网页发布时间。 **site_name** `string` | 站点名 `output.content.annotations.site_name` 站点名称。 **summary** `string` | 摘要 `output.content.annotations.summary` 网页内容摘要。 文档引用 `object` 引用自私域知识库文档的标注信息。 **type** `string` | 类型 `output.content.annotations.type` 标注类型,此处固定为 `doc_citation` **chunk_attachment** `object[]` | 分块附件 `output.content.annotations.chunk_attachment` 引用分块附带的附件信息列表。 **chunk_id** `integer` | 分块 ID `output.content.annotations.chunk_id` 引用文档分块的 ID。 **doc_id** `string` | 文档 ID `output.content.annotations.doc_id` 引用文档的 ID。 **doc_name** `string` | 文档名 `output.content.annotations.doc_name` 引用文档的名称。 **text** `string` | 文本内容 `output.content.text` 模型生成的文本内容。 模型思维链文本 `object` 模型生成的思维链文本。 **type** `string` | 类型 `output.content.type` 内容类型,此处固定为 `reasoning_text` **annotations** `object[]` | 标注列表 `output.content.annotations` 思维链附带的标注信息列表。 网页引用 `object` 引用自互联网网页的标注信息。 **title** `string` | 标题 `output.content.annotations.title` 引用网页的标题。 **type** `string` | 类型 `output.content.annotations.type` 标注类型,此处固定为 `url_citation` **url** `string` | 网址 `output.content.annotations.url` 引用网页的 URL 地址。 **cover_image** `object` | 封面图 `output.content.annotations.cover_image` 网页封面图片信息。 **height** `integer` | 高度 `output.content.annotations.cover_image.height` 封面图片高度(像素) **url** `string` | 图片地址 `output.content.annotations.cover_image.url` 封面图片的 URL 地址。 **width** `integer` | 宽度 `output.content.annotations.cover_image.width` 封面图片宽度(像素) **freshness_info** `string` | 新鲜度 `output.content.annotations.freshness_info` 内容新鲜度信息。 **logo_url** `string` | Logo 地址 `output.content.annotations.logo_url` 网站 Logo 图标地址。 **mobile_url** `string` | 移动端地址 `output.content.annotations.mobile_url` 移动端访问地址。 **publish_time** `string` | 发布时间 `output.content.annotations.publish_time` 网页发布时间。 **site_name** `string` | 站点名 `output.content.annotations.site_name` 站点名称。 **summary** `string` | 摘要 `output.content.annotations.summary` 网页内容摘要。 文档引用 `object` 引用自私域知识库文档的标注信息。 **type** `string` | 类型 `output.content.annotations.type` 标注类型,此处固定为 `doc_citation` **chunk_attachment** `object[]` | 分块附件 `output.content.annotations.chunk_attachment` 引用分块附带的附件信息列表。 **chunk_id** `integer` | 分块 ID `output.content.annotations.chunk_id` 引用文档分块的 ID。 **doc_id** `string` | 文档 ID `output.content.annotations.doc_id` 引用文档的 ID。 **doc_name** `string` | 文档名 `output.content.annotations.doc_name` 引用文档的名称。 **text** `string` | 文本内容 `output.content.text` 模型思维链文本内容。 **id** `string` | 条目 ID `output.id` 输出条目唯一标识。 **role** `string` | 角色 `output.role` 角色,固定为 `assistant` **status** `string` | 状态 `output.status` 输出状态。 **type** `string` | 类型 `output.type` 输出类型,此处固定为 `message` **partial** `boolean` | 增量片段 `output.partial` 是否为流式增量片段。 **phase** `string` | 消息阶段 `output.phase` 标记 assistant 消息属于中间讲解还是最终回答。在回放 assistant 历史消息时,建议保留并原样回传该字段。可选值:`commentary`、`final_answer`。 函数调用输出 `object` 模型发起的函数调用请求。 **type** `string` | 类型 `output.type` 输出类型,此处固定为 `function_call` **arguments** `string` | 参数 `output.arguments` 函数参数的 JSON 字符串。 **call_id** `string` | 调用 ID `output.call_id` 函数调用的唯一 ID。 **id** `string` | 条目 ID `output.id` 输出条目唯一标识。 **name** `string` | 函数名 `output.name` 调用的函数名称。 **status** `string` | 状态 `output.status` 输出状态。 思维链输出 `object` 模型的深度思考过程输出。 **status** `string` | 状态 `output.status` 输出状态。 **summary** `object[]` | 推理摘要 `output.summary` 推理摘要内容列表。 **type** `string` | 类型 `output.summary.type` 摘要片段类型,固定为 `summary_text` **text** `string` | 摘要文本 `output.summary.text` 思维链摘要文本内容。 **type** `string` | 类型 `output.type` 输出类型,此处固定为 `reasoning` **content** `object[]` | 推理内容 `output.content` 思维链推理过程的内容元素列表。 模型回答文本 `object` 模型生成的最终回答文本。 **type** `string` | 类型 `output.content.type` 内容类型,此处固定为 `output_text` **annotations** `object[]` | 标注列表 `output.content.annotations` 文本附带的标注信息列表(如引用来源等) 网页引用 `object` 引用自互联网网页的标注信息。 **title** `string` | 标题 `output.content.annotations.title` 引用网页的标题。 **type** `string` | 类型 `output.content.annotations.type` 标注类型,此处固定为 `url_citation` **url** `string` | 网址 `output.content.annotations.url` 引用网页的 URL 地址。 **cover_image** `object` | 封面图 `output.content.annotations.cover_image` 网页封面图片信息。 **height** `integer` | 高度 `output.content.annotations.cover_image.height` 封面图片高度(像素) **url** `string` | 图片地址 `output.content.annotations.cover_image.url` 封面图片的 URL 地址。 **width** `integer` | 宽度 `output.content.annotations.cover_image.width` 封面图片宽度(像素) **freshness_info** `string` | 新鲜度 `output.content.annotations.freshness_info` 内容新鲜度信息。 **logo_url** `string` | Logo 地址 `output.content.annotations.logo_url` 网站 Logo 图标地址。 **mobile_url** `string` | 移动端地址 `output.content.annotations.mobile_url` 移动端访问地址。 **publish_time** `string` | 发布时间 `output.content.annotations.publish_time` 网页发布时间。 **site_name** `string` | 站点名 `output.content.annotations.site_name` 站点名称。 **summary** `string` | 摘要 `output.content.annotations.summary` 网页内容摘要。 文档引用 `object` 引用自私域知识库文档的标注信息。 **type** `string` | 类型 `output.content.annotations.type` 标注类型,此处固定为 `doc_citation` **chunk_attachment** `object[]` | 分块附件 `output.content.annotations.chunk_attachment` 引用分块附带的附件信息列表。 **chunk_id** `integer` | 分块 ID `output.content.annotations.chunk_id` 引用文档分块的 ID。 **doc_id** `string` | 文档 ID `output.content.annotations.doc_id` 引用文档的 ID。 **doc_name** `string` | 文档名 `output.content.annotations.doc_name` 引用文档的名称。 **text** `string` | 文本内容 `output.content.text` 模型生成的文本内容。 模型思维链文本 `object` 模型生成的思维链文本。 **type** `string` | 类型 `output.content.type` 内容类型,此处固定为 `reasoning_text` **annotations** `object[]` | 标注列表 `output.content.annotations` 思维链附带的标注信息列表。 网页引用 `object` 引用自互联网网页的标注信息。 **title** `string` | 标题 `output.content.annotations.title` 引用网页的标题。 **type** `string` | 类型 `output.content.annotations.type` 标注类型,此处固定为 `url_citation` **url** `string` | 网址 `output.content.annotations.url` 引用网页的 URL 地址。 **cover_image** `object` | 封面图 `output.content.annotations.cover_image` 网页封面图片信息。 **height** `integer` | 高度 `output.content.annotations.cover_image.height` 封面图片高度(像素) **url** `string` | 图片地址 `output.content.annotations.cover_image.url` 封面图片的 URL 地址。 **width** `integer` | 宽度 `output.content.annotations.cover_image.width` 封面图片宽度(像素) **freshness_info** `string` | 新鲜度 `output.content.annotations.freshness_info` 内容新鲜度信息。 **logo_url** `string` | Logo 地址 `output.content.annotations.logo_url` 网站 Logo 图标地址。 **mobile_url** `string` | 移动端地址 `output.content.annotations.mobile_url` 移动端访问地址。 **publish_time** `string` | 发布时间 `output.content.annotations.publish_time` 网页发布时间。 **site_name** `string` | 站点名 `output.content.annotations.site_name` 站点名称。 **summary** `string` | 摘要 `output.content.annotations.summary` 网页内容摘要。 文档引用 `object` 引用自私域知识库文档的标注信息。 **type** `string` | 类型 `output.content.annotations.type` 标注类型,此处固定为 `doc_citation` **chunk_attachment** `object[]` | 分块附件 `output.content.annotations.chunk_attachment` 引用分块附带的附件信息列表。 **chunk_id** `integer` | 分块 ID `output.content.annotations.chunk_id` 引用文档分块的 ID。 **doc_id** `string` | 文档 ID `output.content.annotations.doc_id` 引用文档的 ID。 **doc_name** `string` | 文档名 `output.content.annotations.doc_name` 引用文档的名称。 **text** `string` | 文本内容 `output.content.text` 模型思维链文本内容。 **encrypted_content** `string` | 加密思维链 `output.encrypted_content` 经加密及压缩处理后的思维链原文,用于多轮复用。 **id** `string` | 条目 ID `output.id` 输出条目唯一标识。 语音转写输出 `object` 模型返回的语音转写输出。 **status** `string` | 状态 `output.status` 输出状态。 **type** `string` | 类型 `output.type` 输出类型,此处固定为 `transcription` **id** `string` | 条目 ID `output.id` 输出条目唯一标识。 **transcription** `object[]` | 转写内容 `output.transcription` 语音转写结果片段列表。 **type** `string` | 类型 `output.transcription.type` 转写片段类型,固定为 `transcription_text` **chunks** `object[]` | 音频小段 `output.transcription.chunks` 当前片段对应的音频小段列表。 **end_time** `integer` | 结束时间 `output.transcription.chunks.end_time` 片段结束时间(毫秒) **start_time** `integer` | 开始时间 `output.transcription.chunks.start_time` 片段开始时间(毫秒) **text** `string` | 文字内容 `output.transcription.chunks.text` 当前片段对应的文字内容。 **text** `string` | 转写文本 `output.transcription.text` 当前片段的转写文本。 网页搜索调用 `object` 模型发起的网页搜索调用记录。 **id** `string` | 条目 ID `output.id` 输出条目唯一标识。 **status** `string` | 状态 `output.status` 输出状态。 **type** `string` | 类型 `output.type` 输出类型,此处固定为 `web_search_call` **action** `object` | 搜索动作 `output.action` 网页搜索动作详情。 **query** `string` | 查询语句 `output.action.query` 模型实际发起的搜索查询语句。 **type** `string` | 类型 `output.action.type` 网页搜索动作类型,固定为 `search` **queries** `string[]` | 查询语句列表 `output.action.queries` 本次网页搜索产生的查询语句列表。 图像处理调用 `object` 模型发起的图像处理调用记录。 **id** `string` | 条目 ID `output.id` 输出条目唯一标识。 **status** `string` | 状态 `output.status` 输出状态。 **type** `string` | 类型 `output.type` 输出类型,此处固定为 `image_process` **action** `object` | 处理动作 `output.action` 图像处理动作详情。 **type** `string` | 类型 `output.action.type` 图像处理动作类型。 **result_image_url** `string` | 结果图地址 `output.action.result_image_url` 处理后图像的 URL 地址。 **arguments** `object` | 处理参数 `output.arguments` 图像处理参数(JSON 对象) **error** `object` | 错误信息 `output.error` 图像处理失败时的错误信息。 **message** `string` | 错误描述 `output.error.message` 错误的可读描述。 MCP 审批请求 `object` MCP 工具调用前的审批请求记录。 **arguments** `string` | 调用参数 `output.arguments` 工具调用参数的 JSON 字符串。 **name** `string` | 工具名 `output.name` 待运行的工具名称。 **server_label** `string` | 服务标签 `output.server_label` 发起请求的 MCP Server 标签。 **type** `string` | 类型 `output.type` 输出类型,此处固定为 `mcp_approval_request` **id** `string` | 请求 ID `output.id` 审批请求的唯一 ID。 MCP 工具清单 `object` MCP Server 提供的工具清单输出。 **server_label** `string` | 服务标签 `output.server_label` MCP Server 标签。 **type** `string` | 类型 `output.type` 输出类型,此处固定为 `mcp_list_tools` **error** `string` | 列表错误 `output.error` 当 MCP Server 无法返回工具列表时的错误信息。 **id** `string` | 列表 ID `output.id` 工具列表的唯一 ID。 **tools** `object[]` | 工具列表 `output.tools` 该 MCP Server 上可用的工具列表。 **name** `string` | 工具名 `output.tools.name` 工具名称。 **annotations** `object` | 注解信息 `output.tools.annotations` 工具的附加注解信息。 **description** `string` | 工具描述 `output.tools.description` 工具的功能描述。 **input_schema** `object` | 入参 Schema `output.tools.input_schema` 描述工具入参的 JSON Schema。 MCP 工具调用 `object` 模型对 MCP 工具的实际调用记录及结果。 **name** `string` | 工具名 `output.name` 实际运行的工具名称。 **server_label** `string` | 服务标签 `output.server_label` 运行工具的 MCP Server 标签。 **type** `string` | 类型 `output.type` 输出类型,此处固定为 `mcp_call` **arguments** `string` | 调用参数 `output.arguments` 传递给工具的调用参数 JSON 字符串。通过 `response.mcp_call_arguments.delta` 流式追加,初始 `output_item.added` 事件可能不携带该字段。 **error** `string` | 调用错误 `output.error` 工具调用失败时的错误信息。 **id** `string` | 调用 ID `output.id` 工具调用的唯一 ID。 **output** `string` | 返回结果 `output.output` 工具调用的返回结果。 知识库检索调用 `object` 模型发起的私域知识库检索调用记录。 **knowledge_resource_id** `string` | 知识库 ID `output.knowledge_resource_id` 检索使用的知识库 ID。 **queries** `string[]` | 查询语句 `output.queries` 实际执行的检索查询语句列表。 **status** `string` | 状态 `output.status` 输出状态。 **type** `string` | 类型 `output.type` 输出类型,此处固定为 `knowledge_search_call` **id** `string` | 条目 ID `output.id` 输出条目唯一标识。 豆包应用调用 `object` 模型对豆包助手能力的调用记录。 **type** `string` | 类型 `output.type` 输出类型,此处固定为 `doubao_app_call` **blocks** `object[]` | 内容块 `output.blocks` 豆包应用调用产出的内容块列表。 文本输出 `object` 豆包应用产出的文本输出内容块。 **type** `string` | 类型 `output.blocks.type` 内容块类型,此处固定为 `output_text` **id** `string` | 块 ID `output.blocks.id` 内容块的唯一标识。 **parent_id** `string` | 父级 ID `output.blocks.parent_id` 所属父级条目的 ID。 **status** `string` | 状态 `output.blocks.status` 内容块状态。 **text** `string` | 文本内容 `output.blocks.text` 思维链文本 `object` 豆包应用产出的思维链文本内容块。 **type** `string` | 类型 `output.blocks.type` 内容块类型,此处固定为 `reasoning_text` **id** `string` | 块 ID `output.blocks.id` 内容块的唯一标识。 **parent_id** `string` | 父级 ID `output.blocks.parent_id` 所属父级条目的 ID。 **reasoning_text** `string` | 思考文本 `output.blocks.reasoning_text` 思维链文本内容。 **status** `string` | 状态 `output.blocks.status` 内容块状态。 搜索过程 `object` 豆包应用 AI 搜索过程产出的内容块。 **type** `string` | 类型 `output.blocks.type` 内容块类型,此处固定为 `search` **id** `string` | 块 ID `output.blocks.id` 内容块的唯一标识。 **parent_id** `string` | 父级 ID `output.blocks.parent_id` 所属父级条目的 ID。 **queries** `string[]` | 查询语句 `output.blocks.queries` 搜索查询语句列表。 **results** `object[]` | 搜索结果 `output.blocks.results` 搜索结果列表。 **text_card** `object` | 文本卡片 `output.blocks.results.text_card` 文本卡片形式的搜索结果。 **sitename** `string` | 站点名 `output.blocks.results.text_card.sitename` 来源站点名称。 **title** `string` | 标题 `output.blocks.results.text_card.title` 搜索结果标题。 **url** `string` | 网址 `output.blocks.results.text_card.url` 搜索结果 URL 地址。 **status** `string` | 状态 `output.blocks.status` 内容块状态。 **summary** `string` | 搜索总结 `output.blocks.summary` 推理搜索过程 `object` 豆包应用推理搜索过程产出的内容块。 **type** `string` | 类型 `output.blocks.type` 内容块类型,此处固定为 `reasoning_search` **id** `string` | 块 ID `output.blocks.id` 内容块的唯一标识。 **parent_id** `string` | 父级 ID `output.blocks.parent_id` 所属父级条目的 ID。 **queries** `string[]` | 查询语句 `output.blocks.queries` 搜索查询语句列表。 **results** `object[]` | 搜索结果 `output.blocks.results` 搜索结果列表。 **text_card** `object` | 文本卡片 `output.blocks.results.text_card` 文本卡片形式的搜索结果。 **sitename** `string` | 站点名 `output.blocks.results.text_card.sitename` 来源站点名称。 **title** `string` | 标题 `output.blocks.results.text_card.title` 搜索结果标题。 **url** `string` | 网址 `output.blocks.results.text_card.url` 搜索结果 URL 地址。 **status** `string` | 状态 `output.blocks.status` 内容块状态。 **summary** `string` | 搜索总结 `output.blocks.summary` 推理搜索总结。 **feature** `string` | 功能名 `output.feature` 触发的豆包子功能名称(如 chat、deep_chat、ai_search、reasoning_search) **id** `string` | 条目 ID `output.id` 输出条目唯一标识。 **status** `string` | 状态 `output.status` 输出状态。 智能体工具调用 `object` 模型发起的智能体工具调用记录。 **name** `string` | 工具名 `output.name` 被调用的智能体工具名称。 **status** `string` | 状态 `output.status` 输出状态。 **type** `string` | 类型 `output.type` 输出类型,此处固定为 `agent_tool_call` **id** `string` | 条目 ID `output.id` 输出条目唯一标识。 **caching** `object` | 上下文缓存 是否开启缓存。 **prefix** `boolean` | 仅写缓存 `caching.prefix` 是否仅写入前缀缓存,不生成回复。`true` 只写缓存,不返回模型输出;`false` 正常生成回复并写缓存。 **type** `string` | 缓存模式 `caching.type` 缓存模式。`enabled` 开启上下文缓存;`disabled` 关闭上下文缓存。 **context_management** `object` | 上下文管理 上下文管理响应,请求过程中应用的上下文管理策略信息。 **applied_edits** `object[]` | 已应用编辑 `context_management.applied_edits` 已应用的上下文编辑结果列表。 清理工具调用 `object` 已应用的清理工具调用编辑结果。 **cleared_tool_uses** `integer` | 清理次数 `context_management.applied_edits.cleared_tool_uses` 已清理的工具调用数量。 **type** `string` | 类型 `context_management.applied_edits.type` 编辑类型,此处固定为 `clear_tool_uses` 清理思维链 `object` 已应用的清理思维链编辑结果。 **cleared_thinking_turns** `integer` | 清理轮次 `context_management.applied_edits.cleared_thinking_turns` 已清理的思维链轮次数量。 **type** `string` | 类型 `context_management.applied_edits.type` 编辑类型,此处固定为 `clear_thinking` **error** `object` | 错误信息 模型未能生成响应时返回的错误对象。 **code** `string` | 错误码 `error.code` **message** `string` | 错误描述 `error.message` 错误信息的可读描述。 **expire_at** `integer` | 过期时间戳 响应储存的过期时刻 Unix 时间戳(秒) **incomplete_details** `object` | 未完成详情 响应未能完成的细节。 **reason** `string` | 原因 `incomplete_details.reason` 响应未完成的原因。 **content_filter** `object` | 内容过滤 `incomplete_details.content_filter` 内容过滤详情。 **details** `string` | 详情 `incomplete_details.content_filter.details` 内容过滤命中的详细描述。 **type** `string` | 类型 `incomplete_details.content_filter.type` 内容过滤命中的类型。 **instructions** `string` | 系统指令 在模型上下文中插入一条系统(或开发者)消息,作为首项。当与 previous_response_id 一起使用时,前一响应中的指令不会延续到下一响应。 **max_output_tokens** `integer` | 最大输出长度 模型输出最大 token 数,包含模型回答和思维链内容。 **max_tool_calls** `integer` | 最大调用轮次 本次请求生效的最大工具调用轮次。 **metadata** `object` | 自定义元数据 回显请求中的 metadata 键值对元数据。最多支持 16 对键值,key 长度不超过 64 个字符,value 长度不超过 512 个字符,服务端不会解释其中内容。 **previous_response_id** `string` | 上轮响应 ID 本次请求时传入的历史响应 ID。 **reasoning** `object` | 思考工作量 本次请求实际生效的深度思考工作量配置。 **effort** `string` | 思考力度 `reasoning.effort` 限制深度思考的工作量。减少深度思考工作量可使响应速度更快,并且深度思考的 token 用量更小。 **service_tier** `string` | 推理模式 本次请求实际使用的推理模式。 * `fast`:本次请求使用 [在线推理(低延迟)](/docs/online-inference-low-latency) 模式。 * `auto`:本次请求使用 [在线推理(TPM 保障包)](/docs/tpm-guarantee-package) 模式。 * `default`:本次请求使用 [在线推理(常规)](/docs/online-inference-standard) 模式。 * `flex`:本次请求使用 [在线推理(低优)](/docs/online-inference-flex) 模式。 **status** `string` | 响应状态 生成响应的状态。completed 表示已完成;failed 表示失败;in_progress 表示响应中;incomplete 表示未完成。 **store** `boolean` | 存储响应 是否存储生成的模型响应,以便后续通过 API 检索。 **temperature** `number` | 采样温度 **text** `object` | 输出格式 用于定义输出的格式,可以是纯文本,也可以是结构化的 JSON 数据。 **format** `object` | 输出格式 `text.format` 文本输出格式定义。 **type** `string` | 格式类型 `text.format.type` 输出格式类型。取值范围:`text`、`json_schema`、`json_object` **description** `string` | 格式描述 `text.format.description` 格式描述信息。 **name** `string` | 格式名称 `text.format.name` 格式名称(仅 `json_schema` 类型时需要) **schema** `object` | Schema 定义 `text.format.schema` JSON Schema 定义(仅 `json_schema` 类型时需要) **strict** `boolean` | 严格模式 `text.format.strict` 是否严格校验输出格式。 **thinking** `object` | 深度思考开关 是否开启深度思考模式。 **type** `string` | 思考模式 `thinking.type` 深度思考模式。`enabled` 开启深度思考;`disabled` 关闭深度思考;`auto` 由模型自行判断是否需要深度思考。 **tool_choice** `string / object` | 工具调用策略 本次请求实际生效的工具调用策略。 简单策略 `string` 直接传入字符串 `none`、`auto` 或 `required`,控制工具调用整体策略。 指定工具 `object` 通过对象指定具体工具类型或工具名进行调用。 **type** `string` | 工具类型 `tool_choice.type` 指定工具的类型,例如 `function`、`web_search`、`mcp`、`knowledge_search` 等内置工具类型。取值:`function` / `web_search` / `image_process` / `mcp` / `knowledge_search` / `doubao_app`。 **name** `string` | 工具名称 `tool_choice.name` 当通过名称选择具体工具时使用,例如指定 MCP 服务下的某个工具名。 **tools** `object[]` | 工具列表 模型可以调用的工具列表。 函数调用 `object` 自定义函数调用(Function Calling),让模型生成结构化的函数参数。 **name** `string` | 函数名 `tools.name` 函数名称。 **type** `string` | 类型 `tools.type` 工具类型,此处固定为 `function` **description** `string` | 函数描述 `tools.description` 函数的描述信息,帮助模型理解何时使用该函数。 **parameters** `object` | 参数定义 `tools.parameters` 函数参数定义,遵循 JSON Schema 格式。 联网搜索 `object` 联网搜索工具,让模型在需要时自动进行网页搜索获取实时信息。 **type** `string` | 类型 `tools.type` 工具类型,此处固定为 `web_search` **limit** `integer` | 最大结果数 `tools.limit` 每轮搜索最大返回结果数量。 **取值范围**:`[1, 50]` **max_keyword** `integer` | 最大关键词数 `tools.max_keyword` 最大并行搜索关键词数量。 **取值范围**:`[1, 50]` **sources** `string[]` | 搜索来源 `tools.sources` 搜索信息来源限制,指定模型可从哪些渠道检索网页内容。可选值:`toutiao`、`douyin`、`moji`、`search_engine`、`doubao`。 **user_location** `object` | 用户位置 `tools.user_location` 用户地理位置信息,用于搜索优化。 **type** `string` | 类型 `tools.user_location.type` 位置类型,此处固定为 `approximate` **city** `string` | 城市 `tools.user_location.city` 用户所在城市。 **country** `string` | 国家 `tools.user_location.country` 用户所在国家。 **region** `string` | 地区 `tools.user_location.region` 用户所在地区。 **timezone** `number` | 时区 `tools.user_location.timezone` 用户所在时区。 图像处理 `object` 图像处理工具,让模型对图片进行画点、选区、缩放、旋转等操作。 **type** `string` | 类型 `tools.type` 工具类型,此处固定为 `image_process` **grounding** `object` | 选区功能 `tools.grounding` 选区/裁切功能开关。 **type** `string` | 开关 `tools.grounding.type` 功能开关。 **point** `object` | 画点功能 `tools.point` 画点/画线功能开关。 **type** `string` | 开关 `tools.point.type` 功能开关。 **rotate** `object` | 旋转功能 `tools.rotate` 旋转功能开关(0-359 度) **type** `string` | 开关 `tools.rotate.type` 功能开关。 **zoom** `object` | 缩放功能 `tools.zoom` 缩放功能开关(0.5-2.0 倍) **type** `string` | 开关 `tools.zoom.type` 功能开关。 MCP 工具 `object` MCP(Model Context Protocol)工具,让模型调用外部 MCP Server 提供的工具。 **server_label** `string` | 服务标签 `tools.server_label` MCP Server 标识标签。 **server_url** `string` | 服务地址 `tools.server_url` MCP Server URL 地址。 **type** `string` | 类型 `tools.type` 工具类型,此处固定为 `mcp` **allowed_tools** `string[] / object` | 允许工具 `tools.allowed_tools` 允许调用的工具范围。 工具名数组 `string[]` 直接传入允许调用的工具名称数组。 工具过滤器 `object` 通过过滤器对象指定允许调用的工具范围。 **tool_names** `string[]` | 工具名列表 `tools.allowed_tools.tool_names` 允许调用的工具名称列表。 **headers** `object` | 请求头 `tools.headers` HTTP 请求头(如鉴权信息等) **require_approval** `string / object` | 审批策略 `tools.require_approval` 工具调用审批策略。取值可为字符串 `always`、`never`,或包含审批过滤规则的对象。 简单策略 `string` 直接传入字符串 `always` 或 `never`,对所有工具应用统一审批策略。 工具过滤器 `object` 通过过滤器对象按工具粒度配置审批策略。 **always** `object` | 始终审批 `tools.require_approval.always` 始终需要审批的工具过滤器。 **tool_names** `string[]` | 工具名列表 `tools.require_approval.always.tool_names` 始终需要审批的工具名称列表。 **never** `object` | 无需审批 `tools.require_approval.never` 无需审批的工具过滤器。 **tool_names** `string[]` | 工具名列表 `tools.require_approval.never.tool_names` 无需审批即可调用的工具名称列表。 **server_description** `string` | 服务描述 `tools.server_description` MCP Server 的描述信息,帮助模型理解何时使用该 Server。 知识库搜索 `object` 私域知识库搜索工具,让模型检索企业内部知识库中的文档内容。 **knowledge_resource_id** `string` | 知识库 ID `tools.knowledge_resource_id` **type** `string` | 类型 `tools.type` 工具类型,此处固定为 `knowledge_search` **dense_weight** `number` | 稠密权重 `tools.dense_weight` 稠密向量权重。 **取值范围**:`[0.2, 1]` **description** `string` | 知识库描述 `tools.description` 知识库描述信息,帮助模型理解何时使用该知识库。 **doc_filter** `object` | 文档过滤 `tools.doc_filter` 文档字段级别的检索过滤条件。 **limit** `integer` | 最大结果数 `tools.limit` 最大搜索结果数量。 **取值范围**:`[1, 200]` **max_keyword** `integer` | 最大关键词数 `tools.max_keyword` 最大并行搜索关键词数量。 **取值范围**:`[1, 50]` **ranking_options** `object` | 排序选项 `tools.ranking_options` 检索后处理选项(重排序、分段扩散等) 豆包助手 `object` 豆包助手工具,让模型使用豆包的聊天、深度思考、AI 搜索和推理搜索能力。 **feature** `object` | 功能配置 `tools.feature` 豆包子功能配置。 **ai_search** `object` | AI 搜索 `tools.feature.ai_search` AI 搜索功能配置。 **role_description** `string` | 角色描述 `tools.feature.ai_search.role_description` 角色描述,用于定义该功能的行为特征。 **type** `string` | 开关 `tools.feature.ai_search.type` 功能开关。取值范围:`enabled`、`disabled` **chat** `object` | 普通聊天 `tools.feature.chat` 普通聊天功能配置。 **role_description** `string` | 角色描述 `tools.feature.chat.role_description` 角色描述,用于定义该功能的行为特征。 **type** `string` | 开关 `tools.feature.chat.type` 功能开关。取值范围:`enabled`、`disabled` **deep_chat** `object` | 深度聊天 `tools.feature.deep_chat` 深度聊天功能配置。 **role_description** `string` | 角色描述 `tools.feature.deep_chat.role_description` 角色描述,用于定义该功能的行为特征。 **type** `string` | 开关 `tools.feature.deep_chat.type` 功能开关。取值范围:`enabled`、`disabled` **reasoning_search** `object` | 推理搜索 `tools.feature.reasoning_search` 推理搜索功能配置。 **role_description** `string` | 角色描述 `tools.feature.reasoning_search.role_description` 角色描述,用于定义该功能的行为特征。 **type** `string` | 开关 `tools.feature.reasoning_search.type` 功能开关。取值范围:`enabled`、`disabled` **type** `string` | 类型 `tools.type` 工具类型,此处固定为 `doubao_app` **user_location** `object` | 用户位置 `tools.user_location` 用户地理位置信息,用于搜索优化。 **type** `string` | 类型 `tools.user_location.type` 位置类型,此处固定为 `approximate` **city** `string` | 城市 `tools.user_location.city` 用户所在城市。 **country** `string` | 国家 `tools.user_location.country` 用户所在国家。 **region** `string` | 地区 `tools.user_location.region` 用户所在地区。 **timezone** `number` | 时区 `tools.user_location.timezone` 用户所在时区。 **top_p** `number` | 核采样阈值 核采样概率阈值。 **usage** `object` | Token 用量 本次请求的 token 用量,包括输入 token 数量、输入 token 的详细分解、输出 token 数量、输出 token 的详细分解,以及总共使用的 token 数。如果使用了工具,还会输出使用的工具类型和次数,以及工具的使用详情。 **input_tokens** `integer` | 输入 token 数 `usage.input_tokens` 输入消耗的 token 数量。 **input_tokens_details** `object` | 输入明细 `usage.input_tokens_details` 输入 token 用量明细。 **cached_tokens** `integer` | 缓存 token `usage.input_tokens_details.cached_tokens` 命中缓存的 token 数量。 **audio_cached_tokens** `integer` | 音频缓存 Token 数 `usage.input_tokens_details.audio_cached_tokens` 缓存命中的音频输入内容所消耗的 token 数量。仅在隐式缓存模式且命中音频缓存时返回;开启显式缓存时该字段不返回。 **audio_tokens** `integer` | 音频 token `usage.input_tokens_details.audio_tokens` 音频输入消耗的 token 数量。 **output_tokens** `integer` | 输出 token 数 `usage.output_tokens` 输出消耗的 token 数量。 **output_tokens_details** `object` | 输出明细 `usage.output_tokens_details` 输出 token 用量明细。 **reasoning_tokens** `integer` | 思考 token `usage.output_tokens_details.reasoning_tokens` 深度思考消耗的 token 数量。 **total_tokens** `integer` | 总 token 数 `usage.total_tokens` 本次请求消耗的 token 总数。 **tool_usage** `object` | 工具用量 `usage.tool_usage` 工具调用用量统计。 **doubao_app** `integer` | 豆包次数 `usage.tool_usage.doubao_app` 豆包助手工具调用次数。 **knowledge_search** `integer` | 知识库次数 `usage.tool_usage.knowledge_search` 知识库搜索工具调用次数。 **mcp** `integer` | MCP 次数 `usage.tool_usage.mcp` MCP 工具调用次数。 **web_search** `integer` | 搜索次数 `usage.tool_usage.web_search` 联网搜索工具调用次数。 **tool_usage_details** `object` | 工具明细 `usage.tool_usage_details` 工具调用用量明细。 **doubao_app** `object` | 豆包明细 `usage.tool_usage_details.doubao_app` 豆包助手工具用量明细。 **knowledge_search** `object` | 知识库明细 `usage.tool_usage_details.knowledge_search` 知识库搜索工具用量明细。 **mcp** `object` | MCP 明细 `usage.tool_usage_details.mcp` MCP 工具用量明细。 **web_search** `object` | 搜索明细 `usage.tool_usage_details.web_search` 联网搜索工具用量明细。 ## 代码示例 ## 默认 ### cURL #### Request ```bash RESP_ID="your_response_id" curl --location "https://ark.cn-beijing.volces.com/api/v3/responses/$RESP_ID" \ --header "Authorization: Bearer $ARK_API_KEY" \ --header 'Content-Type: application/json' ``` #### Response ``` { "created_at": 1754571515, "id": "resp_0217******", "max_output_tokens": 32768, "model": "doubao-seed-2-1-pro-260628", "object": "response", "output": [ { "type": "message", "role": "assistant", "content": [ { "type": "output_text", "text": "这张图片呈现了**一位红发女孩与一只红狐亲密依偎**的温馨场景,氛围柔和治愈: \n\n### 人物与动物细节: \n- **女孩**:有着浓密蓬松的**红棕色长发**(色泽与狐狸皮毛呼应),脸上点缀着浅褐色雀斑,身着**轻柔的白色(或米白色)衣衫**(衣料褶皱自然,显柔和质感)。她双眼轻闭,神情恬静温柔,脸颊亲昵地贴靠狐狸头部,姿态满是信赖与温情。 \n- **红狐**:毛色鲜亮且层次丰富——主体为暖调红棕色,脸部、颈部及胸前覆盖**蓬松的白色绒毛**,耳朵尖端呈**黑色**,耳内侧是浅棕与黑色相间的细腻纹理;眼睛是**琥珀色(或金黄带黑瞳)**,明亮有神,黑色鼻尖与搭在女孩衣袖上的**黑色爪子**(可见部分),让它更显灵动真实。狐狸头部微微侧转,却与女孩脸紧密相靠,似在回应这份亲昵。 \n\n\n### 场景与氛围: \n背景是**朦胧的自然草地**(枯黄与绿意交织的草植,因虚化处理更显悠远静谧),柔和的光线(偏暖调)笼罩画面,焦点完全落在人与狐的亲密互动上。整体氛围**温暖、和谐、治愈**,传递出人与动物间信任亲昵的美好瞬间,仿佛时间在此刻静止。 \n\n\n画面通过色彩呼应(女孩红发与狐狸皮毛)、姿态互动(依偎贴靠),构建出诗意且宁静的“共生感”,细节(雀斑、狐的爪/耳纹理)让场景更具真实与感染力。" } ], "status": "completed", "id": "msg_0217******" } ], "thinking": { "type": "enabled" }, "status": "completed", "usage": { "input_tokens": 1377, "output_tokens": 910, "total_tokens": 2287, "input_tokens_details": { "cached_tokens": 0 }, "output_tokens_details": { "reasoning_tokens": 552 } }, "caching": { "type": "disabled" }, "store": true, "expire_at": 1754830715 } ``` ### Python-OpenAI #### Request ```python import os from openai import OpenAI # 从环境变量中获取您的API KEY,配置方法见:https://ark.volcengine.com/region:cn-beijing/docs/quick-start api_key = os.getenv('ARK_API_KEY') client = OpenAI( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) # 查询模型响应 response = client.responses.retrieve( response_id="resp_0217******" ) print(response) ``` #### Response ``` { "created_at": 1754571515, "id": "resp_0217******", "max_output_tokens": 32768, "model": "doubao-seed-2-1-pro-260628", "object": "response", "output": [ { "type": "message", "role": "assistant", "content": [ { "type": "output_text", "text": "这张图片呈现了**一位红发女孩与一只红狐亲密依偎**的温馨场景,氛围柔和治愈: \n\n### 人物与动物细节: \n- **女孩**:有着浓密蓬松的**红棕色长发**(色泽与狐狸皮毛呼应),脸上点缀着浅褐色雀斑,身着**轻柔的白色(或米白色)衣衫**(衣料褶皱自然,显柔和质感)。她双眼轻闭,神情恬静温柔,脸颊亲昵地贴靠狐狸头部,姿态满是信赖与温情。 \n- **红狐**:毛色鲜亮且层次丰富——主体为暖调红棕色,脸部、颈部及胸前覆盖**蓬松的白色绒毛**,耳朵尖端呈**黑色**,耳内侧是浅棕与黑色相间的细腻纹理;眼睛是**琥珀色(或金黄带黑瞳)**,明亮有神,黑色鼻尖与搭在女孩衣袖上的**黑色爪子**(可见部分),让它更显灵动真实。狐狸头部微微侧转,却与女孩脸紧密相靠,似在回应这份亲昵。 \n\n\n### 场景与氛围: \n背景是**朦胧的自然草地**(枯黄与绿意交织的草植,因虚化处理更显悠远静谧),柔和的光线(偏暖调)笼罩画面,焦点完全落在人与狐的亲密互动上。整体氛围**温暖、和谐、治愈**,传递出人与动物间信任亲昵的美好瞬间,仿佛时间在此刻静止。 \n\n\n画面通过色彩呼应(女孩红发与狐狸皮毛)、姿态互动(依偎贴靠),构建出诗意且宁静的“共生感”,细节(雀斑、狐的爪/耳纹理)让场景更具真实与感染力。" } ], "status": "completed", "id": "msg_0217******" } ], "thinking": { "type": "enabled" }, "status": "completed", "usage": { "input_tokens": 1377, "output_tokens": 910, "total_tokens": 2287, "input_tokens_details": { "cached_tokens": 0 }, "output_tokens_details": { "reasoning_tokens": 552 } }, "caching": { "type": "disabled" }, "store": true, "expire_at": 1754830715 } ``` ### Python #### Request ```python import os from arkruntime import Ark # 从环境变量中获取您的API KEY,配置方法见:https://ark.volcengine.com/region:cn-beijing/docs/quick-start api_key = os.getenv('ARK_API_KEY') client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) # 查询模型响应 response = client.responses.retrieve( response_id="resp_0217******" ) print(response) ``` #### Response ``` { "created_at": 1754571515, "id": "resp_0217******", "max_output_tokens": 32768, "model": "doubao-seed-2-1-pro-260628", "object": "response", "output": [ { "type": "message", "role": "assistant", "content": [ { "type": "output_text", "text": "这张图片呈现了**一位红发女孩与一只红狐亲密依偎**的温馨场景,氛围柔和治愈: \n\n### 人物与动物细节: \n- **女孩**:有着浓密蓬松的**红棕色长发**(色泽与狐狸皮毛呼应),脸上点缀着浅褐色雀斑,身着**轻柔的白色(或米白色)衣衫**(衣料褶皱自然,显柔和质感)。她双眼轻闭,神情恬静温柔,脸颊亲昵地贴靠狐狸头部,姿态满是信赖与温情。 \n- **红狐**:毛色鲜亮且层次丰富——主体为暖调红棕色,脸部、颈部及胸前覆盖**蓬松的白色绒毛**,耳朵尖端呈**黑色**,耳内侧是浅棕与黑色相间的细腻纹理;眼睛是**琥珀色(或金黄带黑瞳)**,明亮有神,黑色鼻尖与搭在女孩衣袖上的**黑色爪子**(可见部分),让它更显灵动真实。狐狸头部微微侧转,却与女孩脸紧密相靠,似在回应这份亲昵。 \n\n\n### 场景与氛围: \n背景是**朦胧的自然草地**(枯黄与绿意交织的草植,因虚化处理更显悠远静谧),柔和的光线(偏暖调)笼罩画面,焦点完全落在人与狐的亲密互动上。整体氛围**温暖、和谐、治愈**,传递出人与动物间信任亲昵的美好瞬间,仿佛时间在此刻静止。 \n\n\n画面通过色彩呼应(女孩红发与狐狸皮毛)、姿态互动(依偎贴靠),构建出诗意且宁静的“共生感”,细节(雀斑、狐的爪/耳纹理)让场景更具真实与感染力。" } ], "status": "completed", "id": "msg_0217******" } ], "thinking": { "type": "enabled" }, "status": "completed", "usage": { "input_tokens": 1377, "output_tokens": 910, "total_tokens": 2287, "input_tokens_details": { "cached_tokens": 0 }, "output_tokens_details": { "reasoning_tokens": 552 } }, "caching": { "type": "disabled" }, "store": true, "expire_at": 1754830715 } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/responses" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() resp, err := client.GetResponses(ctx, &responses.ResponsesRetrieveParams{ResponseId: "resp_0217*****"}) if err != nil { fmt.Printf("error: %v\n", err) return } fmt.Println(resp) } ``` #### Response ``` { "created_at": 1754571515, "id": "resp_0217******", "max_output_tokens": 32768, "model": "doubao-seed-2-1-pro-260628", "object": "response", "output": [ { "type": "message", "role": "assistant", "content": [ { "type": "output_text", "text": "这张图片呈现了**一位红发女孩与一只红狐亲密依偎**的温馨场景,氛围柔和治愈: \n\n### 人物与动物细节: \n- **女孩**:有着浓密蓬松的**红棕色长发**(色泽与狐狸皮毛呼应),脸上点缀着浅褐色雀斑,身着**轻柔的白色(或米白色)衣衫**(衣料褶皱自然,显柔和质感)。她双眼轻闭,神情恬静温柔,脸颊亲昵地贴靠狐狸头部,姿态满是信赖与温情。 \n- **红狐**:毛色鲜亮且层次丰富——主体为暖调红棕色,脸部、颈部及胸前覆盖**蓬松的白色绒毛**,耳朵尖端呈**黑色**,耳内侧是浅棕与黑色相间的细腻纹理;眼睛是**琥珀色(或金黄带黑瞳)**,明亮有神,黑色鼻尖与搭在女孩衣袖上的**黑色爪子**(可见部分),让它更显灵动真实。狐狸头部微微侧转,却与女孩脸紧密相靠,似在回应这份亲昵。 \n\n\n### 场景与氛围: \n背景是**朦胧的自然草地**(枯黄与绿意交织的草植,因虚化处理更显悠远静谧),柔和的光线(偏暖调)笼罩画面,焦点完全落在人与狐的亲密互动上。整体氛围**温暖、和谐、治愈**,传递出人与动物间信任亲昵的美好瞬间,仿佛时间在此刻静止。 \n\n\n画面通过色彩呼应(女孩红发与狐狸皮毛)、姿态互动(依偎贴靠),构建出诗意且宁静的“共生感”,细节(雀斑、狐的爪/耳纹理)让场景更具真实与感染力。" } ], "status": "completed", "id": "msg_0217******" } ], "thinking": { "type": "enabled" }, "status": "completed", "usage": { "input_tokens": 1377, "output_tokens": 910, "total_tokens": 2287, "input_tokens_details": { "cached_tokens": 0 }, "output_tokens_details": { "reasoning_tokens": 552 } }, "caching": { "type": "disabled" }, "store": true, "expire_at": 1754830715 } ``` ### Java #### Request ```java package com.volcengine.example; import com.volcengine.ark.runtime.service.ArkService; import com.volcengine.ark.runtime.models.responses.*; public class demo { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); ArkService arkService = ArkService.builder().apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); Response getResult = arkService.getResponse( GetResponseRequest.builder().responseId("resp_0217*****").build() ); System.out.println(getResult); arkService.shutdownExecutor(); } } ``` #### Response ``` { "created_at": 1754571515, "id": "resp_0217******", "max_output_tokens": 32768, "model": "doubao-seed-2-1-pro-260628", "object": "response", "output": [ { "type": "message", "role": "assistant", "content": [ { "type": "output_text", "text": "这张图片呈现了**一位红发女孩与一只红狐亲密依偎**的温馨场景,氛围柔和治愈: \n\n### 人物与动物细节: \n- **女孩**:有着浓密蓬松的**红棕色长发**(色泽与狐狸皮毛呼应),脸上点缀着浅褐色雀斑,身着**轻柔的白色(或米白色)衣衫**(衣料褶皱自然,显柔和质感)。她双眼轻闭,神情恬静温柔,脸颊亲昵地贴靠狐狸头部,姿态满是信赖与温情。 \n- **红狐**:毛色鲜亮且层次丰富——主体为暖调红棕色,脸部、颈部及胸前覆盖**蓬松的白色绒毛**,耳朵尖端呈**黑色**,耳内侧是浅棕与黑色相间的细腻纹理;眼睛是**琥珀色(或金黄带黑瞳)**,明亮有神,黑色鼻尖与搭在女孩衣袖上的**黑色爪子**(可见部分),让它更显灵动真实。狐狸头部微微侧转,却与女孩脸紧密相靠,似在回应这份亲昵。 \n\n\n### 场景与氛围: \n背景是**朦胧的自然草地**(枯黄与绿意交织的草植,因虚化处理更显悠远静谧),柔和的光线(偏暖调)笼罩画面,焦点完全落在人与狐的亲密互动上。整体氛围**温暖、和谐、治愈**,传递出人与动物间信任亲昵的美好瞬间,仿佛时间在此刻静止。 \n\n\n画面通过色彩呼应(女孩红发与狐狸皮毛)、姿态互动(依偎贴靠),构建出诗意且宁静的“共生感”,细节(雀斑、狐的爪/耳纹理)让场景更具真实与感染力。" } ], "status": "completed", "id": "msg_0217******" } ], "thinking": { "type": "enabled" }, "status": "completed", "usage": { "input_tokens": 1377, "output_tokens": 910, "total_tokens": 2287, "input_tokens_details": { "cached_tokens": 0 }, "output_tokens_details": { "reasoning_tokens": 552 } }, "caching": { "type": "disabled" }, "store": true, "expire_at": 1754830715 } ``` --- # 查询 Response 输入项列表 Source: https://ark.volcengine.com/region:cn-beijing/docs/get-response-context-api `GET https://ark.cn-beijing.volces.com/api/v3/responses/{responseId}/input_items` 分页查询某次 Response 的所有输入项列表,返回创建 Response 时传入的 input 内容,以及通过 previous_response_id 关联的历史输入项。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **responseId** `string` `必选` | Response ID 要查询输入项的 Response ID。 ### Query 参数 > 在 URL Query String 中传入。 **after** `string` | 起始游标 返回该 ID 之后的输入项,用于分页向后翻页。 **before** `string` | 结束游标 返回该 ID 之前的输入项,用于分页向前翻页。 **include** `string[]` | 附加返回字段 用于指定在响应中要额外包含的字段。部分接口默认返回基础字段,通过 include 可让服务端补充返回更多信息。 取值固定为 `message.input_image.image_url`。 > **说明:注意** > > 可选值: > > - `message.input_image.image_url`:包含输入消息中的图像 URL。图像为 url 时返回 url;图像为 base64 编码时返回 base64 编码信息。 **limit** `integer` `默认值 20` | 单页数量 控制单次返回的最大项目数。 **取值范围**:`[1, 100]` **order** `string` `默认值 desc` | 排序方式 控制输入项的排序方式。 - `asc`:按照正序排列。 - `desc`:按照倒序排列。 ## 响应参数 **data** `object[]` | 上下文元素列表 上下文元素列表,与创建模型请求时的 input(输入的元素列表)字段结构完全一致。 > **说明:注意** > > 如果请求中引用了 `previous_response_id`,服务器也会返回 previous_response 包含的上下文。 输入的消息 `object` 发送给模型的消息,其中角色用于指示指令遵循的优先级层级。由 developer 或 system 角色给出的指令优先于 user 角色给出的指令。assistant 角色的消息通常被认为是模型在先前交互中生成的回复。 **content** `string / object[]` | 消息内容 `data.content` 用于生成回复的文本、图片、视频或文件输入,也可以包含先前助手的回复内容。 文本输入 `string` 文本类型的消息内容,直接传入字符串。 输入的内容列表 `object[]` 内容元素列表,可包含文本、图片、视频、文件和音频等多种模态输入。 输入模型的文本 `object` 输入给模型的文本内容。 **text** `string` | 文本 `data.content.text` 文本内容。 **type** `string` | 类型 `data.content.type` 内容类型,此处固定为 `input_text` **translation_options** `object` | 翻译选项 `data.content.translation_options` 翻译选项配置。 输入模型的图片 `object` 输入给模型的图片内容。支持通过 file_id、image_url 或 Base64 编码传入。 **type** `string` | 类型 `data.content.type` 内容类型,此处固定为 `input_image` **detail** `string` | 精度 `data.content.detail` 图片解析精度。可选值:`low`、`high`、`xhigh`。 **file_id** `string` | 文件 ID `data.content.file_id` 文件 ID。 * 文件 ID 是通过 [Files API](/docs/upload-files-api)上传文件后返回的 id。 * **file_id** 对应的文件类型需要和 **type** 保持一致,且文件状态需要为**active**。 * **API Key** 所属项目与 **file_id** 上传时所属项目需保持一致 **image_pixel_limit** `object` | 像素限制 `data.content.image_pixel_limit` 图片像素限制配置。 **max_pixels** `integer` | 最大像素 `data.content.image_pixel_limit.max_pixels` 图片最大像素数,超出时等比例缩小。 **min_pixels** `integer` | 最小像素 `data.content.image_pixel_limit.min_pixels` 图片最小像素数,低于时等比例放大。 **image_url** `string` | 图片地址 `data.content.image_url` 图片 URL 或 Base64 编码(格式 `data:image/{格式};base64,{编码}`) 输入模型的音频 `object` 输入给模型的音频内容。支持通过 file_id 或 audio_url 传入。 **type** `string` | 类型 `data.content.type` 内容类型,此处固定为 `input_audio` **audio_url** `string` | 音频地址 `data.content.audio_url` 音频 URL 或 Base64 编码。 **chunking_strategy** `object` | 分段策略 `data.content.chunking_strategy` 音频分段策略配置。 **type** `string` | 类型 `data.content.chunking_strategy.type` 分段策略类型,固定为 `server_vad`(服务端 VAD) **prefix_padding_ms** `integer` | 前置填充 `data.content.chunking_strategy.prefix_padding_ms` 语音前置静音填充时长(毫秒) **silence_duration_ms** `integer` | 静音时长 `data.content.chunking_strategy.silence_duration_ms` 触发分段的静音持续时长(毫秒) **threshold** `number` | 检测阈值 `data.content.chunking_strategy.threshold` VAD 检测阈值。 **file_id** `string` | 文件 ID `data.content.file_id` 文件 ID。 * 文件 ID 是通过 [Files API](/docs/upload-files-api)上传文件后返回的 id。 * **file_id** 对应的文件类型需要和 **type** 保持一致,且文件状态需要为**active**。 * **API Key** 所属项目与 **file_id** 上传时所属项目需保持一致 输入模型的文件 `object` 输入给模型的文件内容。支持通过 file_id、file_data(Base64)或 file_url 传入。 **type** `string` | 类型 `data.content.type` 内容类型,此处固定为 `input_file` **file_data** `string` | 文件数据 `data.content.file_data` Base64 编码的文件内容(最大 50MB) **file_id** `string` | 文件 ID `data.content.file_id` 文件 ID。 * 文件 ID 是通过 [Files API](/docs/upload-files-api)上传文件后返回的 id。 * **file_id** 对应的文件类型需要和 **type** 保持一致,且文件状态需要为**active**。 * **API Key** 所属项目与 **file_id** 上传时所属项目需保持一致 **file_url** `string` | 文件地址 `data.content.file_url` 可访问的文件 URL(最大 50MB) **filename** `string` | 文件名 `data.content.filename` 文件名称(使用 file_data 时必传) 输入模型的视频 `object` 输入给模型的视频内容。支持通过 file_id、video_url 或 Base64 编码传入。 **type** `string` | 类型 `data.content.type` 内容类型,此处固定为 `input_video` **video_url** `string` | 视频地址 `data.content.video_url` 视频 URL 或 Base64 编码。 **file_id** `string` | 文件 ID `data.content.file_id` 文件 ID。 * 文件 ID 是通过 [Files API](/docs/upload-files-api)上传文件后返回的 id。 * **file_id** 对应的文件类型需要和 **type** 保持一致,且文件状态需要为**active**。 * **API Key** 所属项目与 **file_id** 上传时所属项目需保持一致 **fps** `number` | 抽帧帧率 `data.content.fps` **取值范围**:`[0.2, 5]` 模型文本输出 `object` 模型生成的文本输出,可在多轮对话中作为上下文回传。 **type** `string` | 类型 `data.content.type` 内容类型,此处固定为 `output_text` **annotations** `object[]` | 标注列表 `data.content.annotations` 文本附带的标注信息列表(如引用来源等) 网页引用 `object` 引用自互联网网页的标注信息。 **title** `string` | 标题 `data.content.annotations.title` 引用网页的标题。 **type** `string` | 类型 `data.content.annotations.type` 标注类型,此处固定为 `url_citation` **url** `string` | 网址 `data.content.annotations.url` 引用网页的 URL 地址。 **cover_image** `object` | 封面图 `data.content.annotations.cover_image` 网页封面图片信息。 **height** `integer` | 高度 `data.content.annotations.cover_image.height` 封面图片高度(像素) **url** `string` | 图片地址 `data.content.annotations.cover_image.url` 封面图片的 URL 地址。 **width** `integer` | 宽度 `data.content.annotations.cover_image.width` 封面图片宽度(像素) **freshness_info** `string` | 新鲜度 `data.content.annotations.freshness_info` 内容新鲜度信息。 **logo_url** `string` | Logo 地址 `data.content.annotations.logo_url` 网站 Logo 图标地址。 **mobile_url** `string` | 移动端地址 `data.content.annotations.mobile_url` 移动端访问地址。 **publish_time** `string` | 发布时间 `data.content.annotations.publish_time` 网页发布时间。 **site_name** `string` | 站点名 `data.content.annotations.site_name` 站点名称。 **summary** `string` | 摘要 `data.content.annotations.summary` 网页内容摘要。 文档引用 `object` 引用自私域知识库文档的标注信息。 **type** `string` | 类型 `data.content.annotations.type` 标注类型,此处固定为 `doc_citation` **chunk_attachment** `object[]` | 分块附件 `data.content.annotations.chunk_attachment` 引用分块附带的附件信息列表。 **chunk_id** `integer` | 分块 ID `data.content.annotations.chunk_id` 引用文档分块的 ID。 **doc_id** `string` | 文档 ID `data.content.annotations.doc_id` 引用文档的 ID。 **doc_name** `string` | 文档名 `data.content.annotations.doc_name` 引用文档的名称。 **text** `string` | 文本内容 `data.content.text` 模型生成的文本内容。 模型思维链文本 `object` 模型思维链文本输出,可在多轮对话中作为上下文回传。 **type** `string` | 类型 `data.content.type` 内容类型,此处固定为 `reasoning_text` **annotations** `object[]` | 标注列表 `data.content.annotations` 思维链附带的标注信息列表。 网页引用 `object` 引用自互联网网页的标注信息。 **title** `string` | 标题 `data.content.annotations.title` 引用网页的标题。 **type** `string` | 类型 `data.content.annotations.type` 标注类型,此处固定为 `url_citation` **url** `string` | 网址 `data.content.annotations.url` 引用网页的 URL 地址。 **cover_image** `object` | 封面图 `data.content.annotations.cover_image` 网页封面图片信息。 **height** `integer` | 高度 `data.content.annotations.cover_image.height` 封面图片高度(像素) **url** `string` | 图片地址 `data.content.annotations.cover_image.url` 封面图片的 URL 地址。 **width** `integer` | 宽度 `data.content.annotations.cover_image.width` 封面图片宽度(像素) **freshness_info** `string` | 新鲜度 `data.content.annotations.freshness_info` 内容新鲜度信息。 **logo_url** `string` | Logo 地址 `data.content.annotations.logo_url` 网站 Logo 图标地址。 **mobile_url** `string` | 移动端地址 `data.content.annotations.mobile_url` 移动端访问地址。 **publish_time** `string` | 发布时间 `data.content.annotations.publish_time` 网页发布时间。 **site_name** `string` | 站点名 `data.content.annotations.site_name` 站点名称。 **summary** `string` | 摘要 `data.content.annotations.summary` 网页内容摘要。 文档引用 `object` 引用自私域知识库文档的标注信息。 **type** `string` | 类型 `data.content.annotations.type` 标注类型,此处固定为 `doc_citation` **chunk_attachment** `object[]` | 分块附件 `data.content.annotations.chunk_attachment` 引用分块附带的附件信息列表。 **chunk_id** `integer` | 分块 ID `data.content.annotations.chunk_id` 引用文档分块的 ID。 **doc_id** `string` | 文档 ID `data.content.annotations.doc_id` 引用文档的 ID。 **doc_name** `string` | 文档名 `data.content.annotations.doc_name` 引用文档的名称。 **text** `string` | 文本内容 `data.content.text` 模型思维链文本内容。 **id** `string` | 条目 ID `data.id` 输入条目的唯一 ID。 **partial** `boolean` | 续写模式 `data.partial` 是否启用续写模式(仅 assistant 角色支持) **phase** `string` | 消息阶段 `data.phase` 标记 assistant 消息属于中间讲解还是最终回答。在回放 assistant 历史消息时,建议保留并原样回传该字段。可选值:`commentary`、`final_answer`。 **role** `string` | 角色 `data.role` 输入消息的角色,可以是 `user`、`system`、`assistant` 或 `developer` **type** `string` | 类型 `data.type` 输入元素类型,此处固定为 `message` 函数调用记录 `object` 历史工具函数调用记录,用于多轮对话中回传模型之前发起的函数调用。 **type** `string` | 类型 `data.type` 输入元素类型,此处固定为 `function_call` **arguments** `string` | 参数 `data.arguments` 函数参数的 JSON 字符串。 **call_id** `string` | 调用 ID `data.call_id` 函数工具调用的唯一标识 ID。 **id** `string` | 调用 ID `data.id` 函数工具调用的唯一 ID。 **name** `string` | 函数名 `data.name` 要运行的函数名称。 **status** `string` | 状态 `data.status` 条目状态。可选值:`in_progress`、`completed`、`incomplete`。 函数返回结果 `object` 工具函数返回的结果,用于将函数执行结果回传给模型。 **type** `string` | 类型 `data.type` 输入元素类型,此处固定为 `function_call_output` **call_id** `string` | 调用 ID `data.call_id` 函数工具调用的唯一标识 ID(与对应 function_call 的 call_id 一致) **id** `string` | 条目 ID `data.id` 函数返回结果的唯一 ID。 **output** `string / object[]` | 输出结果 `data.output` 工具输出的结果内容。 文本输入 `string` 文本类型的消息内容,直接传入字符串。 输入的内容列表 `object[]` 内容元素列表,可包含文本、图片、视频、文件和音频等多种模态输入。 输入模型的文本 `object` 输入给模型的文本内容。 **text** `string` | 文本 `data.output.text` 文本内容。 **type** `string` | 类型 `data.output.type` 内容类型,此处固定为 `input_text` **translation_options** `object` | 翻译选项 `data.output.translation_options` 翻译选项配置。 输入模型的图片 `object` 输入给模型的图片内容。支持通过 file_id、image_url 或 Base64 编码传入。 **type** `string` | 类型 `data.output.type` 内容类型,此处固定为 `input_image` **detail** `string` | 精度 `data.output.detail` 图片解析精度。可选值:`low`、`high`、`xhigh`。 **file_id** `string` | 文件 ID `data.output.file_id` 文件 ID。 * 文件 ID 是通过 [Files API](/docs/upload-files-api)上传文件后返回的 id。 * **file_id** 对应的文件类型需要和 **type** 保持一致,且文件状态需要为**active**。 * **API Key** 所属项目与 **file_id** 上传时所属项目需保持一致 **image_pixel_limit** `object` | 像素限制 `data.output.image_pixel_limit` 图片像素限制配置。 **max_pixels** `integer` | 最大像素 `data.output.image_pixel_limit.max_pixels` 图片最大像素数,超出时等比例缩小。 **min_pixels** `integer` | 最小像素 `data.output.image_pixel_limit.min_pixels` 图片最小像素数,低于时等比例放大。 **image_url** `string` | 图片地址 `data.output.image_url` 图片 URL 或 Base64 编码(格式 `data:image/{格式};base64,{编码}`) 输入模型的音频 `object` 输入给模型的音频内容。支持通过 file_id 或 audio_url 传入。 **type** `string` | 类型 `data.output.type` 内容类型,此处固定为 `input_audio` **audio_url** `string` | 音频地址 `data.output.audio_url` 音频 URL 或 Base64 编码。 **chunking_strategy** `object` | 分段策略 `data.output.chunking_strategy` 音频分段策略配置。 **type** `string` | 类型 `data.output.chunking_strategy.type` 分段策略类型,固定为 `server_vad`(服务端 VAD) **prefix_padding_ms** `integer` | 前置填充 `data.output.chunking_strategy.prefix_padding_ms` 语音前置静音填充时长(毫秒) **silence_duration_ms** `integer` | 静音时长 `data.output.chunking_strategy.silence_duration_ms` 触发分段的静音持续时长(毫秒) **threshold** `number` | 检测阈值 `data.output.chunking_strategy.threshold` VAD 检测阈值。 **file_id** `string` | 文件 ID `data.output.file_id` 文件 ID。 * 文件 ID 是通过 [Files API](/docs/upload-files-api)上传文件后返回的 id。 * **file_id** 对应的文件类型需要和 **type** 保持一致,且文件状态需要为**active**。 * **API Key** 所属项目与 **file_id** 上传时所属项目需保持一致 输入模型的文件 `object` 输入给模型的文件内容。支持通过 file_id、file_data(Base64)或 file_url 传入。 **type** `string` | 类型 `data.output.type` 内容类型,此处固定为 `input_file` **file_data** `string` | 文件数据 `data.output.file_data` Base64 编码的文件内容(最大 50MB) **file_id** `string` | 文件 ID `data.output.file_id` 文件 ID。 * 文件 ID 是通过 [Files API](/docs/upload-files-api)上传文件后返回的 id。 * **file_id** 对应的文件类型需要和 **type** 保持一致,且文件状态需要为**active**。 * **API Key** 所属项目与 **file_id** 上传时所属项目需保持一致 **file_url** `string` | 文件地址 `data.output.file_url` 可访问的文件 URL(最大 50MB) **filename** `string` | 文件名 `data.output.filename` 文件名称(使用 file_data 时必传) 输入模型的视频 `object` 输入给模型的视频内容。支持通过 file_id、video_url 或 Base64 编码传入。 **type** `string` | 类型 `data.output.type` 内容类型,此处固定为 `input_video` **video_url** `string` | 视频地址 `data.output.video_url` 视频 URL 或 Base64 编码。 **file_id** `string` | 文件 ID `data.output.file_id` 文件 ID。 * 文件 ID 是通过 [Files API](/docs/upload-files-api)上传文件后返回的 id。 * **file_id** 对应的文件类型需要和 **type** 保持一致,且文件状态需要为**active**。 * **API Key** 所属项目与 **file_id** 上传时所属项目需保持一致 **fps** `number` | 抽帧帧率 `data.output.fps` **取值范围**:`[0.2, 5]` 模型文本输出 `object` 模型生成的文本输出,可在多轮对话中作为上下文回传。 **type** `string` | 类型 `data.output.type` 内容类型,此处固定为 `output_text` **annotations** `object[]` | 标注列表 `data.output.annotations` 文本附带的标注信息列表(如引用来源等) 网页引用 `object` 引用自互联网网页的标注信息。 **title** `string` | 标题 `data.output.annotations.title` 引用网页的标题。 **type** `string` | 类型 `data.output.annotations.type` 标注类型,此处固定为 `url_citation` **url** `string` | 网址 `data.output.annotations.url` 引用网页的 URL 地址。 **cover_image** `object` | 封面图 `data.output.annotations.cover_image` 网页封面图片信息。 **height** `integer` | 高度 `data.output.annotations.cover_image.height` 封面图片高度(像素) **url** `string` | 图片地址 `data.output.annotations.cover_image.url` 封面图片的 URL 地址。 **width** `integer` | 宽度 `data.output.annotations.cover_image.width` 封面图片宽度(像素) **freshness_info** `string` | 新鲜度 `data.output.annotations.freshness_info` 内容新鲜度信息。 **logo_url** `string` | Logo 地址 `data.output.annotations.logo_url` 网站 Logo 图标地址。 **mobile_url** `string` | 移动端地址 `data.output.annotations.mobile_url` 移动端访问地址。 **publish_time** `string` | 发布时间 `data.output.annotations.publish_time` 网页发布时间。 **site_name** `string` | 站点名 `data.output.annotations.site_name` 站点名称。 **summary** `string` | 摘要 `data.output.annotations.summary` 网页内容摘要。 文档引用 `object` 引用自私域知识库文档的标注信息。 **type** `string` | 类型 `data.output.annotations.type` 标注类型,此处固定为 `doc_citation` **chunk_attachment** `object[]` | 分块附件 `data.output.annotations.chunk_attachment` 引用分块附带的附件信息列表。 **chunk_id** `integer` | 分块 ID `data.output.annotations.chunk_id` 引用文档分块的 ID。 **doc_id** `string` | 文档 ID `data.output.annotations.doc_id` 引用文档的 ID。 **doc_name** `string` | 文档名 `data.output.annotations.doc_name` 引用文档的名称。 **text** `string` | 文本内容 `data.output.text` 模型生成的文本内容。 模型思维链文本 `object` 模型思维链文本输出,可在多轮对话中作为上下文回传。 **type** `string` | 类型 `data.output.type` 内容类型,此处固定为 `reasoning_text` **annotations** `object[]` | 标注列表 `data.output.annotations` 思维链附带的标注信息列表。 网页引用 `object` 引用自互联网网页的标注信息。 **title** `string` | 标题 `data.output.annotations.title` 引用网页的标题。 **type** `string` | 类型 `data.output.annotations.type` 标注类型,此处固定为 `url_citation` **url** `string` | 网址 `data.output.annotations.url` 引用网页的 URL 地址。 **cover_image** `object` | 封面图 `data.output.annotations.cover_image` 网页封面图片信息。 **height** `integer` | 高度 `data.output.annotations.cover_image.height` 封面图片高度(像素) **url** `string` | 图片地址 `data.output.annotations.cover_image.url` 封面图片的 URL 地址。 **width** `integer` | 宽度 `data.output.annotations.cover_image.width` 封面图片宽度(像素) **freshness_info** `string` | 新鲜度 `data.output.annotations.freshness_info` 内容新鲜度信息。 **logo_url** `string` | Logo 地址 `data.output.annotations.logo_url` 网站 Logo 图标地址。 **mobile_url** `string` | 移动端地址 `data.output.annotations.mobile_url` 移动端访问地址。 **publish_time** `string` | 发布时间 `data.output.annotations.publish_time` 网页发布时间。 **site_name** `string` | 站点名 `data.output.annotations.site_name` 站点名称。 **summary** `string` | 摘要 `data.output.annotations.summary` 网页内容摘要。 文档引用 `object` 引用自私域知识库文档的标注信息。 **type** `string` | 类型 `data.output.annotations.type` 标注类型,此处固定为 `doc_citation` **chunk_attachment** `object[]` | 分块附件 `data.output.annotations.chunk_attachment` 引用分块附带的附件信息列表。 **chunk_id** `integer` | 分块 ID `data.output.annotations.chunk_id` 引用文档分块的 ID。 **doc_id** `string` | 文档 ID `data.output.annotations.doc_id` 引用文档的 ID。 **doc_name** `string` | 文档名 `data.output.annotations.doc_name` 引用文档的名称。 **text** `string` | 文本内容 `data.output.text` 模型思维链文本内容。 **status** `string` | 状态 `data.status` 条目状态。可选值:`in_progress`、`completed`、`incomplete`。 模型思维链信息 `object` 在模型生成响应时使用的思维链信息。如果需要手动管理,需要设置该字段,以便在后续的对话中进行管理。 **status** `string` | 状态 `data.status` 推理内容的状态。可选值:`in_progress`、`completed`、`incomplete`。 **summary** `object[]` | 推理摘要 `data.summary` 推理内容摘要列表。 **type** `string` | 类型 `data.summary.type` 摘要片段类型,固定为 `summary_text` **text** `string` | 摘要文本 `data.summary.text` 思维链摘要文本内容。 **type** `string` | 类型 `data.type` 输入元素类型,此处固定为 `reasoning` **content** `object[]` | 推理内容 `data.content` 推理过程的内容元素列表。 模型回答文本 `object` 模型生成的最终回答文本。 **type** `string` | 类型 `data.content.type` 内容类型,此处固定为 `output_text` **annotations** `object[]` | 标注列表 `data.content.annotations` 文本附带的标注信息列表(如引用来源等) 网页引用 `object` 引用自互联网网页的标注信息。 **title** `string` | 标题 `data.content.annotations.title` 引用网页的标题。 **type** `string` | 类型 `data.content.annotations.type` 标注类型,此处固定为 `url_citation` **url** `string` | 网址 `data.content.annotations.url` 引用网页的 URL 地址。 **cover_image** `object` | 封面图 `data.content.annotations.cover_image` 网页封面图片信息。 **height** `integer` | 高度 `data.content.annotations.cover_image.height` 封面图片高度(像素) **url** `string` | 图片地址 `data.content.annotations.cover_image.url` 封面图片的 URL 地址。 **width** `integer` | 宽度 `data.content.annotations.cover_image.width` 封面图片宽度(像素) **freshness_info** `string` | 新鲜度 `data.content.annotations.freshness_info` 内容新鲜度信息。 **logo_url** `string` | Logo 地址 `data.content.annotations.logo_url` 网站 Logo 图标地址。 **mobile_url** `string` | 移动端地址 `data.content.annotations.mobile_url` 移动端访问地址。 **publish_time** `string` | 发布时间 `data.content.annotations.publish_time` 网页发布时间。 **site_name** `string` | 站点名 `data.content.annotations.site_name` 站点名称。 **summary** `string` | 摘要 `data.content.annotations.summary` 网页内容摘要。 文档引用 `object` 引用自私域知识库文档的标注信息。 **type** `string` | 类型 `data.content.annotations.type` 标注类型,此处固定为 `doc_citation` **chunk_attachment** `object[]` | 分块附件 `data.content.annotations.chunk_attachment` 引用分块附带的附件信息列表。 **chunk_id** `integer` | 分块 ID `data.content.annotations.chunk_id` 引用文档分块的 ID。 **doc_id** `string` | 文档 ID `data.content.annotations.doc_id` 引用文档的 ID。 **doc_name** `string` | 文档名 `data.content.annotations.doc_name` 引用文档的名称。 **text** `string` | 文本内容 `data.content.text` 模型生成的文本内容。 模型思维链文本 `object` 模型生成的思维链文本。 **type** `string` | 类型 `data.content.type` 内容类型,此处固定为 `reasoning_text` **annotations** `object[]` | 标注列表 `data.content.annotations` 思维链附带的标注信息列表。 网页引用 `object` 引用自互联网网页的标注信息。 **title** `string` | 标题 `data.content.annotations.title` 引用网页的标题。 **type** `string` | 类型 `data.content.annotations.type` 标注类型,此处固定为 `url_citation` **url** `string` | 网址 `data.content.annotations.url` 引用网页的 URL 地址。 **cover_image** `object` | 封面图 `data.content.annotations.cover_image` 网页封面图片信息。 **height** `integer` | 高度 `data.content.annotations.cover_image.height` 封面图片高度(像素) **url** `string` | 图片地址 `data.content.annotations.cover_image.url` 封面图片的 URL 地址。 **width** `integer` | 宽度 `data.content.annotations.cover_image.width` 封面图片宽度(像素) **freshness_info** `string` | 新鲜度 `data.content.annotations.freshness_info` 内容新鲜度信息。 **logo_url** `string` | Logo 地址 `data.content.annotations.logo_url` 网站 Logo 图标地址。 **mobile_url** `string` | 移动端地址 `data.content.annotations.mobile_url` 移动端访问地址。 **publish_time** `string` | 发布时间 `data.content.annotations.publish_time` 网页发布时间。 **site_name** `string` | 站点名 `data.content.annotations.site_name` 站点名称。 **summary** `string` | 摘要 `data.content.annotations.summary` 网页内容摘要。 文档引用 `object` 引用自私域知识库文档的标注信息。 **type** `string` | 类型 `data.content.annotations.type` 标注类型,此处固定为 `doc_citation` **chunk_attachment** `object[]` | 分块附件 `data.content.annotations.chunk_attachment` 引用分块附带的附件信息列表。 **chunk_id** `integer` | 分块 ID `data.content.annotations.chunk_id` 引用文档分块的 ID。 **doc_id** `string` | 文档 ID `data.content.annotations.doc_id` 引用文档的 ID。 **doc_name** `string` | 文档名 `data.content.annotations.doc_name` 引用文档的名称。 **text** `string` | 文本内容 `data.content.text` 模型思维链文本内容。 **encrypted_content** `string` | 加密思维链 `data.encrypted_content` 经加密及压缩处理后的思维链内容原文,用于多轮复用。 **id** `string` | 推理 ID `data.id` 推理内容的唯一标识 ID。 MCP 审批请求 `object` 历史 MCP 工具审批请求记录,用于多轮对话上下文回传。 **arguments** `string` | 调用参数 `data.arguments` 工具调用参数的 JSON 字符串。 **name** `string` | 工具名 `data.name` 待运行的工具名称。 **server_label** `string` | 服务标签 `data.server_label` 发起请求的 MCP Server 标签。 **type** `string` | 类型 `data.type` 输入元素类型,此处固定为 `mcp_approval_request` **id** `string` | 请求 ID `data.id` 审批请求的唯一 ID。 MCP 审批响应 `object` 历史 MCP 工具审批响应记录,回传给模型后据此决定是否调用工具。 **approval_request_id** `string` | 请求 ID `data.approval_request_id` 被回应的审批请求 ID。 **approve** `boolean` | 是否批准 `data.approve` 是否批准该工具调用请求。 **type** `string` | 类型 `data.type` 输入元素类型,此处固定为 `mcp_approval_response` **id** `string` | 响应 ID `data.id` 审批响应的唯一 ID。 **reason** `string` | 决策理由 `data.reason` 决策理由(可选) MCP 工具清单 `object` 历史 MCP 工具清单记录,用于多轮对话上下文回传。 **server_label** `string` | 服务标签 `data.server_label` MCP Server 标签。 **type** `string` | 类型 `data.type` 输入元素类型,此处固定为 `mcp_list_tools` **error** `string` | 错误信息 `data.error` MCP Server 无法返回工具列表时的错误信息。 **id** `string` | 列表 ID `data.id` 工具列表的唯一 ID。 **tools** `object[]` | 工具列表 `data.tools` 该 MCP Server 上可用的工具列表。 **name** `string` | 工具名 `data.tools.name` 工具名称。 **annotations** `object` | 注解信息 `data.tools.annotations` 工具的附加注解信息。 **description** `string` | 工具描述 `data.tools.description` 工具的功能描述。 **input_schema** `object` | 入参 Schema `data.tools.input_schema` 描述工具入参的 JSON Schema。 MCP 工具调用 `object` 历史 MCP 工具调用记录,用于多轮对话上下文回传。 **name** `string` | 工具名 `data.name` 实际运行的工具名称。 **server_label** `string` | 服务标签 `data.server_label` 运行工具的 MCP Server 标签。 **type** `string` | 类型 `data.type` 输入元素类型,此处固定为 `mcp_call` **arguments** `string` | 调用参数 `data.arguments` 传递给工具的调用参数 JSON 字符串。通过 `response.mcp_call_arguments.delta` 流式追加,初始 `output_item.added` 事件可能不携带该字段。 **error** `string` | 错误信息 `data.error` 工具调用失败时的错误信息。 **id** `string` | 调用 ID `data.id` 工具调用的唯一 ID。 **output** `string` | 返回结果 `data.output` 工具调用的返回结果。 上下文元素 `object` 表示模型生成回复时需参考的上下文内容。该项可以包含文本、图片和视频输入,以及先前助手的回复和工具调用的输出。 **id** `string` | 条目 ID `data.id` 引用的上下文条目 ID。 **type** `string` | 类型 `data.type` 输入元素类型,此处固定为 `item_reference` **first_id** `string` | 首条 ID 列表中第一条数据的 ID。 **last_id** `string` | 末条 ID 列表中最后一条数据的 ID。 **object** `string` | 对象类型 固定为 `list` **has_more** `boolean` | 是否有更多 标识是否还有更多数据未返回。 - `true`:存在未返回的数据。 - `false`:已返回全部数据。 ## 代码示例 ## 默认 ### cURL #### Request ```bash RESP_ID="your_responses_id" curl --location "https://ark.cn-beijing.volces.com/api/v3/responses/$RESP_ID/input_items" \ --header "Authorization: Bearer $ARK_API_KEY" \ --header 'Content-Type: application/json' ``` #### Response ``` { "object": "list", "data": [ { "type": "message", "role": "assistant", "content": [ { "type": "output_text", "text": "# 《赤焰与金瞳》(原创歌曲) \n\n## 【歌词】 \n**前奏**:(风铃声+轻柔吉他,混入草甸风声与狐的轻鸣,营造荒野静谧感) \n\n**主歌1**: \n风掠过草甸 卷碎金的光 \n红发垂落 如燃麦的浪 \n白裙褶皱里 藏星尘的痒(雀斑似星芒在衣间摇晃) \n你金瞳映我 怯生生的惶 \n软爪碰衣角 微凉的惊惶 \n刹那间 心跳与狐步 同频轻响 \n\n\n**副歌**: \n我们是彼此 遗失的镜像 \n红焰吻金瞳 把孤独熔成糖 \n草尖雾吻醒 晨露的谎 \n原来灵魂 会在荒野 长出相契模样 \n\n\n**主歌2**: \n你的绒毛 裹住我所有流亡(过往的孤单在暖绒里松绑) \n我的指尖 数过你耳尖的霜(狐耳薄霜落满时光的凉) \n风揉碎故事 入暮色褶皱(光阴在草浪里悄悄流淌) \n我们对望 连影子都 依偎成诗章 \n\n\n**副歌(重复)**: \n我们是彼此 救赎的镜像 \n红焰暖金瞳 把长夜酿成糖 \n野花吻过风 风吻旧时光 \n原来心跳 会在荒野 开出共生花房 \n\n\n**桥段**: \n星子跌进 你琥珀眼眶(狐眼盛着整片银河的光) \n我把名字 系你尾尖摇晃(尾尖颤动时 名字轻响) \n世界褪色成 黑白默片旧场 \n唯有我们 红得滚烫 亮得倔强 \n\n\n**副歌(升调重复)**: \n我们是彼此 救赎的镜像 \n红焰暖金瞳 把长夜酿成糖 \n野花吻过风 风吻旧时光 \n原来心跳 会在荒野 开出共生花房 \n\n\n**尾声**: \n风又掠草甸 卷碎金的光 \n红发与狐焰 烧亮整片穹苍 \n白裙和绒毛 织柔软的网 \n从此荒野 有了名字 叫“我们的故乡” \n\n\n## 【旋律与编曲建议】 \n- **风格**:民谣+梦幻流行,以“自然治愈感”为核心,融合轻摇滚的情感张力。 \n- **乐器**: \n - 主歌:尼龙弦吉他(分解和弦,如Em→C→G→D的温柔进行)+ 低音竖琴(点缀空灵)。 \n - 副歌:加入弦乐群(小提琴/中提琴铺底)+ 轻柔鼓点(增强节奏共鸣)。 \n - 桥段:暂撤鼓组,用人声+钢琴(单音游走)+ 环境音效(狐鸣/风声采样),营造“荒野私语”的私密感。 \n - 尾声:回归吉他+风铃,余韵如草甸晚风,温柔消散。 \n- **人声**:主歌用“叙事式气声”(像在耳边轻诉),副歌渐强至“爆发式柔腔”(传递灵魂共振的力量),桥段加入轻微咽音(增强脆弱与倔强的对比)。 \n\n\n## 【创作灵感】 \n画面中红发女孩与红狐的“共生感”是核心:她们是彼此的镜像(红发与狐火同色,雀斑与狐瞳同亮),在荒野里完成了“孤独的熔解”与“灵魂的相契”。歌曲用“熔糖”“开花房”“织网”等意象,把“陪伴”升华为“生命的救赎”,让画面的温暖在旋律里具象成可触摸的情感——就像风掠过草甸时,所有孤独都被红焰与金瞳酿成了糖。 \n\n\n(若需简谱或Demo制作思路,可进一步细化~)" } ], "status": "completed", "id": "msg_0217****" }, { "type": "message", "role": "user", "content": [ { "type": "input_text", "text": "再创作一首歌" } ], "id": "msg_0217****" }, { "type": "message", "role": "assistant", "content": [ { "type": "output_text", "text": "这张图片呈现了**一位红发女孩与一只红狐亲密依偎**的温馨场景,氛围柔和治愈: \n\n### 人物与动物细节: \n- **女孩**:有着浓密蓬松的**红棕色长发**(色泽与狐狸皮毛呼应),脸上点缀着浅褐色雀斑,身着**轻柔的白色(或米白色)衣衫**(衣料褶皱自然,显柔和质感)。她双眼轻闭,神情恬静温柔,脸颊亲昵地贴靠狐狸头部,姿态满是信赖与温情。 \n- **红狐**:毛色鲜亮且层次丰富——主体为暖调红棕色,脸部、颈部及胸前覆盖**蓬松的白色绒毛**,耳朵尖端呈**黑色**,耳内侧是浅棕与黑色相间的细腻纹理;眼睛是**琥珀色(或金黄带黑瞳)**,明亮有神,黑色鼻尖与搭在女孩衣袖上的**黑色爪子**(可见部分),让它更显灵动真实。狐狸头部微微侧转,却与女孩脸紧密相靠,似在回应这份亲昵。 \n\n\n### 场景与氛围: \n背景是**朦胧的自然草地**(枯黄与绿意交织的草植,因虚化处理更显悠远静谧),柔和的光线(偏暖调)笼罩画面,焦点完全落在人与狐的亲密互动上。整体氛围**温暖、和谐、治愈**,传递出人与动物间信任亲昵的美好瞬间,仿佛时间在此刻静止。 \n\n\n画面通过色彩呼应(女孩红发与狐狸皮毛)、姿态互动(依偎贴靠),构建出诗意且宁静的“共生感”,细节(雀斑、狐的爪/耳纹理)让场景更具真实与感染力。" } ], "status": "completed", "id": "msg_0217****" }, { "type": "message", "role": "user", "content": [ { "type": "input_text", "text": "你看见了什么?" }, { "type": "input_image" } ], "id": "msg_0217****" } ], "first_id": "msg_****d2d1", "last_id": "msg_****6c67", "has_more": false } ``` ### Python-OpenAI #### Request ```python import os from openai import OpenAI # 从环境变量中获取您的API KEY,配置方法见:https://ark.volcengine.com/region:cn-beijing/docs/quick-start api_key = os.getenv('ARK_API_KEY') client = OpenAI( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) # 获取响应上下文 response = client.responses.input_items.list( response_id="resp_0217******" ) print(response.data) ``` #### Response ``` { "object": "list", "data": [ { "type": "message", "role": "assistant", "content": [ { "type": "output_text", "text": "# 《赤焰与金瞳》(原创歌曲) \n\n## 【歌词】 \n**前奏**:(风铃声+轻柔吉他,混入草甸风声与狐的轻鸣,营造荒野静谧感) \n\n**主歌1**: \n风掠过草甸 卷碎金的光 \n红发垂落 如燃麦的浪 \n白裙褶皱里 藏星尘的痒(雀斑似星芒在衣间摇晃) \n你金瞳映我 怯生生的惶 \n软爪碰衣角 微凉的惊惶 \n刹那间 心跳与狐步 同频轻响 \n\n\n**副歌**: \n我们是彼此 遗失的镜像 \n红焰吻金瞳 把孤独熔成糖 \n草尖雾吻醒 晨露的谎 \n原来灵魂 会在荒野 长出相契模样 \n\n\n**主歌2**: \n你的绒毛 裹住我所有流亡(过往的孤单在暖绒里松绑) \n我的指尖 数过你耳尖的霜(狐耳薄霜落满时光的凉) \n风揉碎故事 入暮色褶皱(光阴在草浪里悄悄流淌) \n我们对望 连影子都 依偎成诗章 \n\n\n**副歌(重复)**: \n我们是彼此 救赎的镜像 \n红焰暖金瞳 把长夜酿成糖 \n野花吻过风 风吻旧时光 \n原来心跳 会在荒野 开出共生花房 \n\n\n**桥段**: \n星子跌进 你琥珀眼眶(狐眼盛着整片银河的光) \n我把名字 系你尾尖摇晃(尾尖颤动时 名字轻响) \n世界褪色成 黑白默片旧场 \n唯有我们 红得滚烫 亮得倔强 \n\n\n**副歌(升调重复)**: \n我们是彼此 救赎的镜像 \n红焰暖金瞳 把长夜酿成糖 \n野花吻过风 风吻旧时光 \n原来心跳 会在荒野 开出共生花房 \n\n\n**尾声**: \n风又掠草甸 卷碎金的光 \n红发与狐焰 烧亮整片穹苍 \n白裙和绒毛 织柔软的网 \n从此荒野 有了名字 叫“我们的故乡” \n\n\n## 【旋律与编曲建议】 \n- **风格**:民谣+梦幻流行,以“自然治愈感”为核心,融合轻摇滚的情感张力。 \n- **乐器**: \n - 主歌:尼龙弦吉他(分解和弦,如Em→C→G→D的温柔进行)+ 低音竖琴(点缀空灵)。 \n - 副歌:加入弦乐群(小提琴/中提琴铺底)+ 轻柔鼓点(增强节奏共鸣)。 \n - 桥段:暂撤鼓组,用人声+钢琴(单音游走)+ 环境音效(狐鸣/风声采样),营造“荒野私语”的私密感。 \n - 尾声:回归吉他+风铃,余韵如草甸晚风,温柔消散。 \n- **人声**:主歌用“叙事式气声”(像在耳边轻诉),副歌渐强至“爆发式柔腔”(传递灵魂共振的力量),桥段加入轻微咽音(增强脆弱与倔强的对比)。 \n\n\n## 【创作灵感】 \n画面中红发女孩与红狐的“共生感”是核心:她们是彼此的镜像(红发与狐火同色,雀斑与狐瞳同亮),在荒野里完成了“孤独的熔解”与“灵魂的相契”。歌曲用“熔糖”“开花房”“织网”等意象,把“陪伴”升华为“生命的救赎”,让画面的温暖在旋律里具象成可触摸的情感——就像风掠过草甸时,所有孤独都被红焰与金瞳酿成了糖。 \n\n\n(若需简谱或Demo制作思路,可进一步细化~)" } ], "status": "completed", "id": "msg_0217****" }, { "type": "message", "role": "user", "content": [ { "type": "input_text", "text": "再创作一首歌" } ], "id": "msg_0217****" }, { "type": "message", "role": "assistant", "content": [ { "type": "output_text", "text": "这张图片呈现了**一位红发女孩与一只红狐亲密依偎**的温馨场景,氛围柔和治愈: \n\n### 人物与动物细节: \n- **女孩**:有着浓密蓬松的**红棕色长发**(色泽与狐狸皮毛呼应),脸上点缀着浅褐色雀斑,身着**轻柔的白色(或米白色)衣衫**(衣料褶皱自然,显柔和质感)。她双眼轻闭,神情恬静温柔,脸颊亲昵地贴靠狐狸头部,姿态满是信赖与温情。 \n- **红狐**:毛色鲜亮且层次丰富——主体为暖调红棕色,脸部、颈部及胸前覆盖**蓬松的白色绒毛**,耳朵尖端呈**黑色**,耳内侧是浅棕与黑色相间的细腻纹理;眼睛是**琥珀色(或金黄带黑瞳)**,明亮有神,黑色鼻尖与搭在女孩衣袖上的**黑色爪子**(可见部分),让它更显灵动真实。狐狸头部微微侧转,却与女孩脸紧密相靠,似在回应这份亲昵。 \n\n\n### 场景与氛围: \n背景是**朦胧的自然草地**(枯黄与绿意交织的草植,因虚化处理更显悠远静谧),柔和的光线(偏暖调)笼罩画面,焦点完全落在人与狐的亲密互动上。整体氛围**温暖、和谐、治愈**,传递出人与动物间信任亲昵的美好瞬间,仿佛时间在此刻静止。 \n\n\n画面通过色彩呼应(女孩红发与狐狸皮毛)、姿态互动(依偎贴靠),构建出诗意且宁静的“共生感”,细节(雀斑、狐的爪/耳纹理)让场景更具真实与感染力。" } ], "status": "completed", "id": "msg_0217****" }, { "type": "message", "role": "user", "content": [ { "type": "input_text", "text": "你看见了什么?" }, { "type": "input_image" } ], "id": "msg_0217****" } ], "first_id": "msg_****d2d1", "last_id": "msg_****6c67", "has_more": false } ``` ### Python #### Request ```python import os from arkruntime import Ark # 从环境变量中获取您的API KEY,配置方法见:https://ark.volcengine.com/region:cn-beijing/docs/quick-start api_key = os.getenv('ARK_API_KEY') client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) # 获取响应上下文 response = client.input_items.list( response_id="resp_0217******" ) print(response) ``` #### Response ``` { "object": "list", "data": [ { "type": "message", "role": "assistant", "content": [ { "type": "output_text", "text": "# 《赤焰与金瞳》(原创歌曲) \n\n## 【歌词】 \n**前奏**:(风铃声+轻柔吉他,混入草甸风声与狐的轻鸣,营造荒野静谧感) \n\n**主歌1**: \n风掠过草甸 卷碎金的光 \n红发垂落 如燃麦的浪 \n白裙褶皱里 藏星尘的痒(雀斑似星芒在衣间摇晃) \n你金瞳映我 怯生生的惶 \n软爪碰衣角 微凉的惊惶 \n刹那间 心跳与狐步 同频轻响 \n\n\n**副歌**: \n我们是彼此 遗失的镜像 \n红焰吻金瞳 把孤独熔成糖 \n草尖雾吻醒 晨露的谎 \n原来灵魂 会在荒野 长出相契模样 \n\n\n**主歌2**: \n你的绒毛 裹住我所有流亡(过往的孤单在暖绒里松绑) \n我的指尖 数过你耳尖的霜(狐耳薄霜落满时光的凉) \n风揉碎故事 入暮色褶皱(光阴在草浪里悄悄流淌) \n我们对望 连影子都 依偎成诗章 \n\n\n**副歌(重复)**: \n我们是彼此 救赎的镜像 \n红焰暖金瞳 把长夜酿成糖 \n野花吻过风 风吻旧时光 \n原来心跳 会在荒野 开出共生花房 \n\n\n**桥段**: \n星子跌进 你琥珀眼眶(狐眼盛着整片银河的光) \n我把名字 系你尾尖摇晃(尾尖颤动时 名字轻响) \n世界褪色成 黑白默片旧场 \n唯有我们 红得滚烫 亮得倔强 \n\n\n**副歌(升调重复)**: \n我们是彼此 救赎的镜像 \n红焰暖金瞳 把长夜酿成糖 \n野花吻过风 风吻旧时光 \n原来心跳 会在荒野 开出共生花房 \n\n\n**尾声**: \n风又掠草甸 卷碎金的光 \n红发与狐焰 烧亮整片穹苍 \n白裙和绒毛 织柔软的网 \n从此荒野 有了名字 叫“我们的故乡” \n\n\n## 【旋律与编曲建议】 \n- **风格**:民谣+梦幻流行,以“自然治愈感”为核心,融合轻摇滚的情感张力。 \n- **乐器**: \n - 主歌:尼龙弦吉他(分解和弦,如Em→C→G→D的温柔进行)+ 低音竖琴(点缀空灵)。 \n - 副歌:加入弦乐群(小提琴/中提琴铺底)+ 轻柔鼓点(增强节奏共鸣)。 \n - 桥段:暂撤鼓组,用人声+钢琴(单音游走)+ 环境音效(狐鸣/风声采样),营造“荒野私语”的私密感。 \n - 尾声:回归吉他+风铃,余韵如草甸晚风,温柔消散。 \n- **人声**:主歌用“叙事式气声”(像在耳边轻诉),副歌渐强至“爆发式柔腔”(传递灵魂共振的力量),桥段加入轻微咽音(增强脆弱与倔强的对比)。 \n\n\n## 【创作灵感】 \n画面中红发女孩与红狐的“共生感”是核心:她们是彼此的镜像(红发与狐火同色,雀斑与狐瞳同亮),在荒野里完成了“孤独的熔解”与“灵魂的相契”。歌曲用“熔糖”“开花房”“织网”等意象,把“陪伴”升华为“生命的救赎”,让画面的温暖在旋律里具象成可触摸的情感——就像风掠过草甸时,所有孤独都被红焰与金瞳酿成了糖。 \n\n\n(若需简谱或Demo制作思路,可进一步细化~)" } ], "status": "completed", "id": "msg_0217****" }, { "type": "message", "role": "user", "content": [ { "type": "input_text", "text": "再创作一首歌" } ], "id": "msg_0217****" }, { "type": "message", "role": "assistant", "content": [ { "type": "output_text", "text": "这张图片呈现了**一位红发女孩与一只红狐亲密依偎**的温馨场景,氛围柔和治愈: \n\n### 人物与动物细节: \n- **女孩**:有着浓密蓬松的**红棕色长发**(色泽与狐狸皮毛呼应),脸上点缀着浅褐色雀斑,身着**轻柔的白色(或米白色)衣衫**(衣料褶皱自然,显柔和质感)。她双眼轻闭,神情恬静温柔,脸颊亲昵地贴靠狐狸头部,姿态满是信赖与温情。 \n- **红狐**:毛色鲜亮且层次丰富——主体为暖调红棕色,脸部、颈部及胸前覆盖**蓬松的白色绒毛**,耳朵尖端呈**黑色**,耳内侧是浅棕与黑色相间的细腻纹理;眼睛是**琥珀色(或金黄带黑瞳)**,明亮有神,黑色鼻尖与搭在女孩衣袖上的**黑色爪子**(可见部分),让它更显灵动真实。狐狸头部微微侧转,却与女孩脸紧密相靠,似在回应这份亲昵。 \n\n\n### 场景与氛围: \n背景是**朦胧的自然草地**(枯黄与绿意交织的草植,因虚化处理更显悠远静谧),柔和的光线(偏暖调)笼罩画面,焦点完全落在人与狐的亲密互动上。整体氛围**温暖、和谐、治愈**,传递出人与动物间信任亲昵的美好瞬间,仿佛时间在此刻静止。 \n\n\n画面通过色彩呼应(女孩红发与狐狸皮毛)、姿态互动(依偎贴靠),构建出诗意且宁静的“共生感”,细节(雀斑、狐的爪/耳纹理)让场景更具真实与感染力。" } ], "status": "completed", "id": "msg_0217****" }, { "type": "message", "role": "user", "content": [ { "type": "input_text", "text": "你看见了什么?" }, { "type": "input_image" } ], "id": "msg_0217****" } ], "first_id": "msg_****d2d1", "last_id": "msg_****6c67", "has_more": false } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/responses" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() resp, err := client.ListResponseInputItems(ctx, &responses.ResponsesListInputItemsParams{ResponseId: "resp_0217*****",}) if err != nil { fmt.Printf("error: %v\n", err) return } fmt.Println(resp) } ``` #### Response ``` { "object": "list", "data": [ { "type": "message", "role": "assistant", "content": [ { "type": "output_text", "text": "# 《赤焰与金瞳》(原创歌曲) \n\n## 【歌词】 \n**前奏**:(风铃声+轻柔吉他,混入草甸风声与狐的轻鸣,营造荒野静谧感) \n\n**主歌1**: \n风掠过草甸 卷碎金的光 \n红发垂落 如燃麦的浪 \n白裙褶皱里 藏星尘的痒(雀斑似星芒在衣间摇晃) \n你金瞳映我 怯生生的惶 \n软爪碰衣角 微凉的惊惶 \n刹那间 心跳与狐步 同频轻响 \n\n\n**副歌**: \n我们是彼此 遗失的镜像 \n红焰吻金瞳 把孤独熔成糖 \n草尖雾吻醒 晨露的谎 \n原来灵魂 会在荒野 长出相契模样 \n\n\n**主歌2**: \n你的绒毛 裹住我所有流亡(过往的孤单在暖绒里松绑) \n我的指尖 数过你耳尖的霜(狐耳薄霜落满时光的凉) \n风揉碎故事 入暮色褶皱(光阴在草浪里悄悄流淌) \n我们对望 连影子都 依偎成诗章 \n\n\n**副歌(重复)**: \n我们是彼此 救赎的镜像 \n红焰暖金瞳 把长夜酿成糖 \n野花吻过风 风吻旧时光 \n原来心跳 会在荒野 开出共生花房 \n\n\n**桥段**: \n星子跌进 你琥珀眼眶(狐眼盛着整片银河的光) \n我把名字 系你尾尖摇晃(尾尖颤动时 名字轻响) \n世界褪色成 黑白默片旧场 \n唯有我们 红得滚烫 亮得倔强 \n\n\n**副歌(升调重复)**: \n我们是彼此 救赎的镜像 \n红焰暖金瞳 把长夜酿成糖 \n野花吻过风 风吻旧时光 \n原来心跳 会在荒野 开出共生花房 \n\n\n**尾声**: \n风又掠草甸 卷碎金的光 \n红发与狐焰 烧亮整片穹苍 \n白裙和绒毛 织柔软的网 \n从此荒野 有了名字 叫“我们的故乡” \n\n\n## 【旋律与编曲建议】 \n- **风格**:民谣+梦幻流行,以“自然治愈感”为核心,融合轻摇滚的情感张力。 \n- **乐器**: \n - 主歌:尼龙弦吉他(分解和弦,如Em→C→G→D的温柔进行)+ 低音竖琴(点缀空灵)。 \n - 副歌:加入弦乐群(小提琴/中提琴铺底)+ 轻柔鼓点(增强节奏共鸣)。 \n - 桥段:暂撤鼓组,用人声+钢琴(单音游走)+ 环境音效(狐鸣/风声采样),营造“荒野私语”的私密感。 \n - 尾声:回归吉他+风铃,余韵如草甸晚风,温柔消散。 \n- **人声**:主歌用“叙事式气声”(像在耳边轻诉),副歌渐强至“爆发式柔腔”(传递灵魂共振的力量),桥段加入轻微咽音(增强脆弱与倔强的对比)。 \n\n\n## 【创作灵感】 \n画面中红发女孩与红狐的“共生感”是核心:她们是彼此的镜像(红发与狐火同色,雀斑与狐瞳同亮),在荒野里完成了“孤独的熔解”与“灵魂的相契”。歌曲用“熔糖”“开花房”“织网”等意象,把“陪伴”升华为“生命的救赎”,让画面的温暖在旋律里具象成可触摸的情感——就像风掠过草甸时,所有孤独都被红焰与金瞳酿成了糖。 \n\n\n(若需简谱或Demo制作思路,可进一步细化~)" } ], "status": "completed", "id": "msg_0217****" }, { "type": "message", "role": "user", "content": [ { "type": "input_text", "text": "再创作一首歌" } ], "id": "msg_0217****" }, { "type": "message", "role": "assistant", "content": [ { "type": "output_text", "text": "这张图片呈现了**一位红发女孩与一只红狐亲密依偎**的温馨场景,氛围柔和治愈: \n\n### 人物与动物细节: \n- **女孩**:有着浓密蓬松的**红棕色长发**(色泽与狐狸皮毛呼应),脸上点缀着浅褐色雀斑,身着**轻柔的白色(或米白色)衣衫**(衣料褶皱自然,显柔和质感)。她双眼轻闭,神情恬静温柔,脸颊亲昵地贴靠狐狸头部,姿态满是信赖与温情。 \n- **红狐**:毛色鲜亮且层次丰富——主体为暖调红棕色,脸部、颈部及胸前覆盖**蓬松的白色绒毛**,耳朵尖端呈**黑色**,耳内侧是浅棕与黑色相间的细腻纹理;眼睛是**琥珀色(或金黄带黑瞳)**,明亮有神,黑色鼻尖与搭在女孩衣袖上的**黑色爪子**(可见部分),让它更显灵动真实。狐狸头部微微侧转,却与女孩脸紧密相靠,似在回应这份亲昵。 \n\n\n### 场景与氛围: \n背景是**朦胧的自然草地**(枯黄与绿意交织的草植,因虚化处理更显悠远静谧),柔和的光线(偏暖调)笼罩画面,焦点完全落在人与狐的亲密互动上。整体氛围**温暖、和谐、治愈**,传递出人与动物间信任亲昵的美好瞬间,仿佛时间在此刻静止。 \n\n\n画面通过色彩呼应(女孩红发与狐狸皮毛)、姿态互动(依偎贴靠),构建出诗意且宁静的“共生感”,细节(雀斑、狐的爪/耳纹理)让场景更具真实与感染力。" } ], "status": "completed", "id": "msg_0217****" }, { "type": "message", "role": "user", "content": [ { "type": "input_text", "text": "你看见了什么?" }, { "type": "input_image" } ], "id": "msg_0217****" } ], "first_id": "msg_****d2d1", "last_id": "msg_****6c67", "has_more": false } ``` ### Java #### Request ```java package com.ark.example; import com.volcengine.ark.runtime.service.ArkService; import com.volcengine.ark.runtime.models.responses.*; public class demo { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); ArkService arkService = ArkService.builder().apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); ListInputItemsResponse listResult = arkService.listResponseInputItems( ListInputItemsRequest.builder().responseId("resp_0217*****").build() ); System.out.println(listResult); arkService.shutdownExecutor(); } } ``` #### Response ``` { "object": "list", "data": [ { "type": "message", "role": "assistant", "content": [ { "type": "output_text", "text": "# 《赤焰与金瞳》(原创歌曲) \n\n## 【歌词】 \n**前奏**:(风铃声+轻柔吉他,混入草甸风声与狐的轻鸣,营造荒野静谧感) \n\n**主歌1**: \n风掠过草甸 卷碎金的光 \n红发垂落 如燃麦的浪 \n白裙褶皱里 藏星尘的痒(雀斑似星芒在衣间摇晃) \n你金瞳映我 怯生生的惶 \n软爪碰衣角 微凉的惊惶 \n刹那间 心跳与狐步 同频轻响 \n\n\n**副歌**: \n我们是彼此 遗失的镜像 \n红焰吻金瞳 把孤独熔成糖 \n草尖雾吻醒 晨露的谎 \n原来灵魂 会在荒野 长出相契模样 \n\n\n**主歌2**: \n你的绒毛 裹住我所有流亡(过往的孤单在暖绒里松绑) \n我的指尖 数过你耳尖的霜(狐耳薄霜落满时光的凉) \n风揉碎故事 入暮色褶皱(光阴在草浪里悄悄流淌) \n我们对望 连影子都 依偎成诗章 \n\n\n**副歌(重复)**: \n我们是彼此 救赎的镜像 \n红焰暖金瞳 把长夜酿成糖 \n野花吻过风 风吻旧时光 \n原来心跳 会在荒野 开出共生花房 \n\n\n**桥段**: \n星子跌进 你琥珀眼眶(狐眼盛着整片银河的光) \n我把名字 系你尾尖摇晃(尾尖颤动时 名字轻响) \n世界褪色成 黑白默片旧场 \n唯有我们 红得滚烫 亮得倔强 \n\n\n**副歌(升调重复)**: \n我们是彼此 救赎的镜像 \n红焰暖金瞳 把长夜酿成糖 \n野花吻过风 风吻旧时光 \n原来心跳 会在荒野 开出共生花房 \n\n\n**尾声**: \n风又掠草甸 卷碎金的光 \n红发与狐焰 烧亮整片穹苍 \n白裙和绒毛 织柔软的网 \n从此荒野 有了名字 叫“我们的故乡” \n\n\n## 【旋律与编曲建议】 \n- **风格**:民谣+梦幻流行,以“自然治愈感”为核心,融合轻摇滚的情感张力。 \n- **乐器**: \n - 主歌:尼龙弦吉他(分解和弦,如Em→C→G→D的温柔进行)+ 低音竖琴(点缀空灵)。 \n - 副歌:加入弦乐群(小提琴/中提琴铺底)+ 轻柔鼓点(增强节奏共鸣)。 \n - 桥段:暂撤鼓组,用人声+钢琴(单音游走)+ 环境音效(狐鸣/风声采样),营造“荒野私语”的私密感。 \n - 尾声:回归吉他+风铃,余韵如草甸晚风,温柔消散。 \n- **人声**:主歌用“叙事式气声”(像在耳边轻诉),副歌渐强至“爆发式柔腔”(传递灵魂共振的力量),桥段加入轻微咽音(增强脆弱与倔强的对比)。 \n\n\n## 【创作灵感】 \n画面中红发女孩与红狐的“共生感”是核心:她们是彼此的镜像(红发与狐火同色,雀斑与狐瞳同亮),在荒野里完成了“孤独的熔解”与“灵魂的相契”。歌曲用“熔糖”“开花房”“织网”等意象,把“陪伴”升华为“生命的救赎”,让画面的温暖在旋律里具象成可触摸的情感——就像风掠过草甸时,所有孤独都被红焰与金瞳酿成了糖。 \n\n\n(若需简谱或Demo制作思路,可进一步细化~)" } ], "status": "completed", "id": "msg_0217****" }, { "type": "message", "role": "user", "content": [ { "type": "input_text", "text": "再创作一首歌" } ], "id": "msg_0217****" }, { "type": "message", "role": "assistant", "content": [ { "type": "output_text", "text": "这张图片呈现了**一位红发女孩与一只红狐亲密依偎**的温馨场景,氛围柔和治愈: \n\n### 人物与动物细节: \n- **女孩**:有着浓密蓬松的**红棕色长发**(色泽与狐狸皮毛呼应),脸上点缀着浅褐色雀斑,身着**轻柔的白色(或米白色)衣衫**(衣料褶皱自然,显柔和质感)。她双眼轻闭,神情恬静温柔,脸颊亲昵地贴靠狐狸头部,姿态满是信赖与温情。 \n- **红狐**:毛色鲜亮且层次丰富——主体为暖调红棕色,脸部、颈部及胸前覆盖**蓬松的白色绒毛**,耳朵尖端呈**黑色**,耳内侧是浅棕与黑色相间的细腻纹理;眼睛是**琥珀色(或金黄带黑瞳)**,明亮有神,黑色鼻尖与搭在女孩衣袖上的**黑色爪子**(可见部分),让它更显灵动真实。狐狸头部微微侧转,却与女孩脸紧密相靠,似在回应这份亲昵。 \n\n\n### 场景与氛围: \n背景是**朦胧的自然草地**(枯黄与绿意交织的草植,因虚化处理更显悠远静谧),柔和的光线(偏暖调)笼罩画面,焦点完全落在人与狐的亲密互动上。整体氛围**温暖、和谐、治愈**,传递出人与动物间信任亲昵的美好瞬间,仿佛时间在此刻静止。 \n\n\n画面通过色彩呼应(女孩红发与狐狸皮毛)、姿态互动(依偎贴靠),构建出诗意且宁静的“共生感”,细节(雀斑、狐的爪/耳纹理)让场景更具真实与感染力。" } ], "status": "completed", "id": "msg_0217****" }, { "type": "message", "role": "user", "content": [ { "type": "input_text", "text": "你看见了什么?" }, { "type": "input_image" } ], "id": "msg_0217****" } ], "first_id": "msg_****d2d1", "last_id": "msg_****6c67", "has_more": false } ``` ## include+order ### cURL #### Request ```bash //包含输入的图片,并正序返回 //注意在终端运行本代码时,请删掉注释内容。 RESP_ID="your_responses_id" curl --location "https://ark.cn-beijing.volces.com/api/v3/responses/$RESP_ID/input_items?include[]=message.input_image.image_url&order=asc" \ --header "Authorization: Bearer $ARK_API_KEY" \ --header 'Content-Type: application/json' ``` #### Response ``` { "object": "list", "data": [ { "type": "message", "role": "user", "content": [ { "type": "input_text", "text": "你看见了什么?" }, { "type": "input_image", "image_url": "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/i2v_foxrgirl.png" } ], "id": "msg_0217****6c67" }, { "type": "message", "role": "assistant", "content": [ { "type": "output_text", "text": "这张图片呈现了**一位红发女孩与一只红狐亲密依偎**的温馨场景,氛围柔和治愈: \n\n### 人物与动物细节: \n- **女孩**:有着浓密蓬松的**红棕色长发**(色泽与狐狸皮毛呼应),脸上点缀着浅褐色雀斑,身着**轻柔的白色(或米白色)衣衫**(衣料褶皱自然,显柔和质感)。她双眼轻闭,神情恬静温柔,脸颊亲昵地贴靠狐狸头部,姿态满是信赖与温情。 \n- **红狐**:毛色鲜亮且层次丰富——主体为暖调红棕色,脸部、颈部及胸前覆盖**蓬松的白色绒毛**,耳朵尖端呈**黑色**,耳内侧是浅棕与黑色相间的细腻纹理;眼睛是**琥珀色(或金黄带黑瞳)**,明亮有神,黑色鼻尖与搭在女孩衣袖上的**黑色爪子**(可见部分),让它更显灵动真实。狐狸头部微微侧转,却与女孩脸紧密相靠,似在回应这份亲昵。 \n\n\n### 场景与氛围: \n背景是**朦胧的自然草地**(枯黄与绿意交织的草植,因虚化处理更显悠远静谧),柔和的光线(偏暖调)笼罩画面,焦点完全落在人与狐的亲密互动上。整体氛围**温暖、和谐、治愈**,传递出人与动物间信任亲昵的美好瞬间,仿佛时间在此刻静止。 \n\n\n画面通过色彩呼应(女孩红发与狐狸皮毛)、姿态互动(依偎贴靠),构建出诗意且宁静的“共生感”,细节(雀斑、狐的爪/耳纹理)让场景更具真实与感染力。" } ], "status": "completed", "id": "msg_0217****2259" }, { "type": "message", "role": "user", "content": [ { "type": "input_text", "text": "再创作一首歌" } ], "id": "msg_0217****a822" }, { "type": "message", "role": "assistant", "content": [ { "type": "output_text", "text": "# 《赤焰与金瞳》(原创歌曲) \n\n## 【歌词】 \n**前奏**:(风铃声+轻柔吉他,混入草甸风声与狐的轻鸣,营造荒野静谧感) \n\n**主歌1**: \n风掠过草甸 卷碎金的光 \n红发垂落 如燃麦的浪 \n白裙褶皱里 藏星尘的痒(雀斑似星芒在衣间摇晃) \n你金瞳映我 怯生生的惶 \n软爪碰衣角 微凉的惊惶 \n刹那间 心跳与狐步 同频轻响 \n\n\n**副歌**: \n我们是彼此 遗失的镜像 \n红焰吻金瞳 把孤独熔成糖 \n草尖雾吻醒 晨露的谎 \n原来灵魂 会在荒野 长出相契模样 \n\n\n**主歌2**: \n你的绒毛 裹住我所有流亡(过往的孤单在暖绒里松绑) \n我的指尖 数过你耳尖的霜(狐耳薄霜落满时光的凉) \n风揉碎故事 入暮色褶皱(光阴在草浪里悄悄流淌) \n我们对望 连影子都 依偎成诗章 \n\n\n**副歌(重复)**: \n我们是彼此 救赎的镜像 \n红焰暖金瞳 把长夜酿成糖 \n野花吻过风 风吻旧时光 \n原来心跳 会在荒野 开出共生花房 \n\n\n**桥段**: \n星子跌进 你琥珀眼眶(狐眼盛着整片银河的光) \n我把名字 系你尾尖摇晃(尾尖颤动时 名字轻响) \n世界褪色成 黑白默片旧场 \n唯有我们 红得滚烫 亮得倔强 \n\n\n**副歌(升调重复)**: \n我们是彼此 救赎的镜像 \n红焰暖金瞳 把长夜酿成糖 \n野花吻过风 风吻旧时光 \n原来心跳 会在荒野 开出共生花房 \n\n\n**尾声**: \n风又掠草甸 卷碎金的光 \n红发与狐焰 烧亮整片穹苍 \n白裙和绒毛 织柔软的网 \n从此荒野 有了名字 叫“我们的故乡” \n\n\n## 【旋律与编曲建议】 \n- **风格**:民谣+梦幻流行,以“自然治愈感”为核心,融合轻摇滚的情感张力。 \n- **乐器**: \n - 主歌:尼龙弦吉他(分解和弦,如Em→C→G→D的温柔进行)+ 低音竖琴(点缀空灵)。 \n - 副歌:加入弦乐群(小提琴/中提琴铺底)+ 轻柔鼓点(增强节奏共鸣)。 \n - 桥段:暂撤鼓组,用人声+钢琴(单音游走)+ 环境音效(狐鸣/风声采样),营造“荒野私语”的私密感。 \n - 尾声:回归吉他+风铃,余韵如草甸晚风,温柔消散。 \n- **人声**:主歌用“叙事式气声”(像在耳边轻诉),副歌渐强至“爆发式柔腔”(传递灵魂共振的力量),桥段加入轻微咽音(增强脆弱与倔强的对比)。 \n\n\n## 【创作灵感】 \n画面中红发女孩与红狐的“共生感”是核心:她们是彼此的镜像(红发与狐火同色,雀斑与狐瞳同亮),在荒野里完成了“孤独的熔解”与“灵魂的相契”。歌曲用“熔糖”“开花房”“织网”等意象,把“陪伴”升华为“生命的救赎”,让画面的温暖在旋律里具象成可触摸的情感——就像风掠过草甸时,所有孤独都被红焰与金瞳酿成了糖。 \n\n\n(若需简谱或Demo制作思路,可进一步细化~)" } ], "status": "completed", "id": "msg_0217****d2d1" } ], "first_id": "msg_0217****6c67", "last_id": "msg_0217****d2d1", "has_more": false } ``` ### Python-OpenAI #### Request ```python import os from openai import OpenAI api_key = os.getenv('ARK_API_KEY') client = OpenAI( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) response = client.responses.input_items.list( response_id="resp_0217******", include=["message.input_image.image_url"], order="asc" ) print(response.data) ``` #### Response ``` { "object": "list", "data": [ { "type": "message", "role": "user", "content": [ { "type": "input_text", "text": "你看见了什么?" }, { "type": "input_image", "image_url": "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/i2v_foxrgirl.png" } ], "id": "msg_0217****6c67" }, { "type": "message", "role": "assistant", "content": [ { "type": "output_text", "text": "这张图片呈现了**一位红发女孩与一只红狐亲密依偎**的温馨场景,氛围柔和治愈: \n\n### 人物与动物细节: \n- **女孩**:有着浓密蓬松的**红棕色长发**(色泽与狐狸皮毛呼应),脸上点缀着浅褐色雀斑,身着**轻柔的白色(或米白色)衣衫**(衣料褶皱自然,显柔和质感)。她双眼轻闭,神情恬静温柔,脸颊亲昵地贴靠狐狸头部,姿态满是信赖与温情。 \n- **红狐**:毛色鲜亮且层次丰富——主体为暖调红棕色,脸部、颈部及胸前覆盖**蓬松的白色绒毛**,耳朵尖端呈**黑色**,耳内侧是浅棕与黑色相间的细腻纹理;眼睛是**琥珀色(或金黄带黑瞳)**,明亮有神,黑色鼻尖与搭在女孩衣袖上的**黑色爪子**(可见部分),让它更显灵动真实。狐狸头部微微侧转,却与女孩脸紧密相靠,似在回应这份亲昵。 \n\n\n### 场景与氛围: \n背景是**朦胧的自然草地**(枯黄与绿意交织的草植,因虚化处理更显悠远静谧),柔和的光线(偏暖调)笼罩画面,焦点完全落在人与狐的亲密互动上。整体氛围**温暖、和谐、治愈**,传递出人与动物间信任亲昵的美好瞬间,仿佛时间在此刻静止。 \n\n\n画面通过色彩呼应(女孩红发与狐狸皮毛)、姿态互动(依偎贴靠),构建出诗意且宁静的“共生感”,细节(雀斑、狐的爪/耳纹理)让场景更具真实与感染力。" } ], "status": "completed", "id": "msg_0217****2259" }, { "type": "message", "role": "user", "content": [ { "type": "input_text", "text": "再创作一首歌" } ], "id": "msg_0217****a822" }, { "type": "message", "role": "assistant", "content": [ { "type": "output_text", "text": "# 《赤焰与金瞳》(原创歌曲) \n\n## 【歌词】 \n**前奏**:(风铃声+轻柔吉他,混入草甸风声与狐的轻鸣,营造荒野静谧感) \n\n**主歌1**: \n风掠过草甸 卷碎金的光 \n红发垂落 如燃麦的浪 \n白裙褶皱里 藏星尘的痒(雀斑似星芒在衣间摇晃) \n你金瞳映我 怯生生的惶 \n软爪碰衣角 微凉的惊惶 \n刹那间 心跳与狐步 同频轻响 \n\n\n**副歌**: \n我们是彼此 遗失的镜像 \n红焰吻金瞳 把孤独熔成糖 \n草尖雾吻醒 晨露的谎 \n原来灵魂 会在荒野 长出相契模样 \n\n\n**主歌2**: \n你的绒毛 裹住我所有流亡(过往的孤单在暖绒里松绑) \n我的指尖 数过你耳尖的霜(狐耳薄霜落满时光的凉) \n风揉碎故事 入暮色褶皱(光阴在草浪里悄悄流淌) \n我们对望 连影子都 依偎成诗章 \n\n\n**副歌(重复)**: \n我们是彼此 救赎的镜像 \n红焰暖金瞳 把长夜酿成糖 \n野花吻过风 风吻旧时光 \n原来心跳 会在荒野 开出共生花房 \n\n\n**桥段**: \n星子跌进 你琥珀眼眶(狐眼盛着整片银河的光) \n我把名字 系你尾尖摇晃(尾尖颤动时 名字轻响) \n世界褪色成 黑白默片旧场 \n唯有我们 红得滚烫 亮得倔强 \n\n\n**副歌(升调重复)**: \n我们是彼此 救赎的镜像 \n红焰暖金瞳 把长夜酿成糖 \n野花吻过风 风吻旧时光 \n原来心跳 会在荒野 开出共生花房 \n\n\n**尾声**: \n风又掠草甸 卷碎金的光 \n红发与狐焰 烧亮整片穹苍 \n白裙和绒毛 织柔软的网 \n从此荒野 有了名字 叫“我们的故乡” \n\n\n## 【旋律与编曲建议】 \n- **风格**:民谣+梦幻流行,以“自然治愈感”为核心,融合轻摇滚的情感张力。 \n- **乐器**: \n - 主歌:尼龙弦吉他(分解和弦,如Em→C→G→D的温柔进行)+ 低音竖琴(点缀空灵)。 \n - 副歌:加入弦乐群(小提琴/中提琴铺底)+ 轻柔鼓点(增强节奏共鸣)。 \n - 桥段:暂撤鼓组,用人声+钢琴(单音游走)+ 环境音效(狐鸣/风声采样),营造“荒野私语”的私密感。 \n - 尾声:回归吉他+风铃,余韵如草甸晚风,温柔消散。 \n- **人声**:主歌用“叙事式气声”(像在耳边轻诉),副歌渐强至“爆发式柔腔”(传递灵魂共振的力量),桥段加入轻微咽音(增强脆弱与倔强的对比)。 \n\n\n## 【创作灵感】 \n画面中红发女孩与红狐的“共生感”是核心:她们是彼此的镜像(红发与狐火同色,雀斑与狐瞳同亮),在荒野里完成了“孤独的熔解”与“灵魂的相契”。歌曲用“熔糖”“开花房”“织网”等意象,把“陪伴”升华为“生命的救赎”,让画面的温暖在旋律里具象成可触摸的情感——就像风掠过草甸时,所有孤独都被红焰与金瞳酿成了糖。 \n\n\n(若需简谱或Demo制作思路,可进一步细化~)" } ], "status": "completed", "id": "msg_0217****d2d1" } ], "first_id": "msg_0217****6c67", "last_id": "msg_0217****d2d1", "has_more": false } ``` ### Python #### Request ```python import os from arkruntime import Ark api_key = os.getenv('ARK_API_KEY') client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) response = client.input_items.list( response_id="resp_0217******", include=["message.input_image.image_url"], order="asc" ) print(response.data) ``` #### Response ``` { "object": "list", "data": [ { "type": "message", "role": "user", "content": [ { "type": "input_text", "text": "你看见了什么?" }, { "type": "input_image", "image_url": "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/i2v_foxrgirl.png" } ], "id": "msg_0217****6c67" }, { "type": "message", "role": "assistant", "content": [ { "type": "output_text", "text": "这张图片呈现了**一位红发女孩与一只红狐亲密依偎**的温馨场景,氛围柔和治愈: \n\n### 人物与动物细节: \n- **女孩**:有着浓密蓬松的**红棕色长发**(色泽与狐狸皮毛呼应),脸上点缀着浅褐色雀斑,身着**轻柔的白色(或米白色)衣衫**(衣料褶皱自然,显柔和质感)。她双眼轻闭,神情恬静温柔,脸颊亲昵地贴靠狐狸头部,姿态满是信赖与温情。 \n- **红狐**:毛色鲜亮且层次丰富——主体为暖调红棕色,脸部、颈部及胸前覆盖**蓬松的白色绒毛**,耳朵尖端呈**黑色**,耳内侧是浅棕与黑色相间的细腻纹理;眼睛是**琥珀色(或金黄带黑瞳)**,明亮有神,黑色鼻尖与搭在女孩衣袖上的**黑色爪子**(可见部分),让它更显灵动真实。狐狸头部微微侧转,却与女孩脸紧密相靠,似在回应这份亲昵。 \n\n\n### 场景与氛围: \n背景是**朦胧的自然草地**(枯黄与绿意交织的草植,因虚化处理更显悠远静谧),柔和的光线(偏暖调)笼罩画面,焦点完全落在人与狐的亲密互动上。整体氛围**温暖、和谐、治愈**,传递出人与动物间信任亲昵的美好瞬间,仿佛时间在此刻静止。 \n\n\n画面通过色彩呼应(女孩红发与狐狸皮毛)、姿态互动(依偎贴靠),构建出诗意且宁静的“共生感”,细节(雀斑、狐的爪/耳纹理)让场景更具真实与感染力。" } ], "status": "completed", "id": "msg_0217****2259" }, { "type": "message", "role": "user", "content": [ { "type": "input_text", "text": "再创作一首歌" } ], "id": "msg_0217****a822" }, { "type": "message", "role": "assistant", "content": [ { "type": "output_text", "text": "# 《赤焰与金瞳》(原创歌曲) \n\n## 【歌词】 \n**前奏**:(风铃声+轻柔吉他,混入草甸风声与狐的轻鸣,营造荒野静谧感) \n\n**主歌1**: \n风掠过草甸 卷碎金的光 \n红发垂落 如燃麦的浪 \n白裙褶皱里 藏星尘的痒(雀斑似星芒在衣间摇晃) \n你金瞳映我 怯生生的惶 \n软爪碰衣角 微凉的惊惶 \n刹那间 心跳与狐步 同频轻响 \n\n\n**副歌**: \n我们是彼此 遗失的镜像 \n红焰吻金瞳 把孤独熔成糖 \n草尖雾吻醒 晨露的谎 \n原来灵魂 会在荒野 长出相契模样 \n\n\n**主歌2**: \n你的绒毛 裹住我所有流亡(过往的孤单在暖绒里松绑) \n我的指尖 数过你耳尖的霜(狐耳薄霜落满时光的凉) \n风揉碎故事 入暮色褶皱(光阴在草浪里悄悄流淌) \n我们对望 连影子都 依偎成诗章 \n\n\n**副歌(重复)**: \n我们是彼此 救赎的镜像 \n红焰暖金瞳 把长夜酿成糖 \n野花吻过风 风吻旧时光 \n原来心跳 会在荒野 开出共生花房 \n\n\n**桥段**: \n星子跌进 你琥珀眼眶(狐眼盛着整片银河的光) \n我把名字 系你尾尖摇晃(尾尖颤动时 名字轻响) \n世界褪色成 黑白默片旧场 \n唯有我们 红得滚烫 亮得倔强 \n\n\n**副歌(升调重复)**: \n我们是彼此 救赎的镜像 \n红焰暖金瞳 把长夜酿成糖 \n野花吻过风 风吻旧时光 \n原来心跳 会在荒野 开出共生花房 \n\n\n**尾声**: \n风又掠草甸 卷碎金的光 \n红发与狐焰 烧亮整片穹苍 \n白裙和绒毛 织柔软的网 \n从此荒野 有了名字 叫“我们的故乡” \n\n\n## 【旋律与编曲建议】 \n- **风格**:民谣+梦幻流行,以“自然治愈感”为核心,融合轻摇滚的情感张力。 \n- **乐器**: \n - 主歌:尼龙弦吉他(分解和弦,如Em→C→G→D的温柔进行)+ 低音竖琴(点缀空灵)。 \n - 副歌:加入弦乐群(小提琴/中提琴铺底)+ 轻柔鼓点(增强节奏共鸣)。 \n - 桥段:暂撤鼓组,用人声+钢琴(单音游走)+ 环境音效(狐鸣/风声采样),营造“荒野私语”的私密感。 \n - 尾声:回归吉他+风铃,余韵如草甸晚风,温柔消散。 \n- **人声**:主歌用“叙事式气声”(像在耳边轻诉),副歌渐强至“爆发式柔腔”(传递灵魂共振的力量),桥段加入轻微咽音(增强脆弱与倔强的对比)。 \n\n\n## 【创作灵感】 \n画面中红发女孩与红狐的“共生感”是核心:她们是彼此的镜像(红发与狐火同色,雀斑与狐瞳同亮),在荒野里完成了“孤独的熔解”与“灵魂的相契”。歌曲用“熔糖”“开花房”“织网”等意象,把“陪伴”升华为“生命的救赎”,让画面的温暖在旋律里具象成可触摸的情感——就像风掠过草甸时,所有孤独都被红焰与金瞳酿成了糖。 \n\n\n(若需简谱或Demo制作思路,可进一步细化~)" } ], "status": "completed", "id": "msg_0217****d2d1" } ], "first_id": "msg_0217****6c67", "last_id": "msg_0217****d2d1", "has_more": false } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/responses" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() asc := "asc" resp, err := client.ListResponseInputItems(ctx, &responses.ResponsesListInputItemsParams{ResponseId: "resp_0217*****", Include: []responses.ResponseIncludable{responses.ResponseIncludableMessageInputImageImageURL}, Order: responses.NewOptOrder(responses.Order(asc)), }) if err != nil { fmt.Printf("error: %v\n", err) return } fmt.Println(resp) } ``` #### Response ``` { "object": "list", "data": [ { "type": "message", "role": "user", "content": [ { "type": "input_text", "text": "你看见了什么?" }, { "type": "input_image", "image_url": "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/i2v_foxrgirl.png" } ], "id": "msg_0217****6c67" }, { "type": "message", "role": "assistant", "content": [ { "type": "output_text", "text": "这张图片呈现了**一位红发女孩与一只红狐亲密依偎**的温馨场景,氛围柔和治愈: \n\n### 人物与动物细节: \n- **女孩**:有着浓密蓬松的**红棕色长发**(色泽与狐狸皮毛呼应),脸上点缀着浅褐色雀斑,身着**轻柔的白色(或米白色)衣衫**(衣料褶皱自然,显柔和质感)。她双眼轻闭,神情恬静温柔,脸颊亲昵地贴靠狐狸头部,姿态满是信赖与温情。 \n- **红狐**:毛色鲜亮且层次丰富——主体为暖调红棕色,脸部、颈部及胸前覆盖**蓬松的白色绒毛**,耳朵尖端呈**黑色**,耳内侧是浅棕与黑色相间的细腻纹理;眼睛是**琥珀色(或金黄带黑瞳)**,明亮有神,黑色鼻尖与搭在女孩衣袖上的**黑色爪子**(可见部分),让它更显灵动真实。狐狸头部微微侧转,却与女孩脸紧密相靠,似在回应这份亲昵。 \n\n\n### 场景与氛围: \n背景是**朦胧的自然草地**(枯黄与绿意交织的草植,因虚化处理更显悠远静谧),柔和的光线(偏暖调)笼罩画面,焦点完全落在人与狐的亲密互动上。整体氛围**温暖、和谐、治愈**,传递出人与动物间信任亲昵的美好瞬间,仿佛时间在此刻静止。 \n\n\n画面通过色彩呼应(女孩红发与狐狸皮毛)、姿态互动(依偎贴靠),构建出诗意且宁静的“共生感”,细节(雀斑、狐的爪/耳纹理)让场景更具真实与感染力。" } ], "status": "completed", "id": "msg_0217****2259" }, { "type": "message", "role": "user", "content": [ { "type": "input_text", "text": "再创作一首歌" } ], "id": "msg_0217****a822" }, { "type": "message", "role": "assistant", "content": [ { "type": "output_text", "text": "# 《赤焰与金瞳》(原创歌曲) \n\n## 【歌词】 \n**前奏**:(风铃声+轻柔吉他,混入草甸风声与狐的轻鸣,营造荒野静谧感) \n\n**主歌1**: \n风掠过草甸 卷碎金的光 \n红发垂落 如燃麦的浪 \n白裙褶皱里 藏星尘的痒(雀斑似星芒在衣间摇晃) \n你金瞳映我 怯生生的惶 \n软爪碰衣角 微凉的惊惶 \n刹那间 心跳与狐步 同频轻响 \n\n\n**副歌**: \n我们是彼此 遗失的镜像 \n红焰吻金瞳 把孤独熔成糖 \n草尖雾吻醒 晨露的谎 \n原来灵魂 会在荒野 长出相契模样 \n\n\n**主歌2**: \n你的绒毛 裹住我所有流亡(过往的孤单在暖绒里松绑) \n我的指尖 数过你耳尖的霜(狐耳薄霜落满时光的凉) \n风揉碎故事 入暮色褶皱(光阴在草浪里悄悄流淌) \n我们对望 连影子都 依偎成诗章 \n\n\n**副歌(重复)**: \n我们是彼此 救赎的镜像 \n红焰暖金瞳 把长夜酿成糖 \n野花吻过风 风吻旧时光 \n原来心跳 会在荒野 开出共生花房 \n\n\n**桥段**: \n星子跌进 你琥珀眼眶(狐眼盛着整片银河的光) \n我把名字 系你尾尖摇晃(尾尖颤动时 名字轻响) \n世界褪色成 黑白默片旧场 \n唯有我们 红得滚烫 亮得倔强 \n\n\n**副歌(升调重复)**: \n我们是彼此 救赎的镜像 \n红焰暖金瞳 把长夜酿成糖 \n野花吻过风 风吻旧时光 \n原来心跳 会在荒野 开出共生花房 \n\n\n**尾声**: \n风又掠草甸 卷碎金的光 \n红发与狐焰 烧亮整片穹苍 \n白裙和绒毛 织柔软的网 \n从此荒野 有了名字 叫“我们的故乡” \n\n\n## 【旋律与编曲建议】 \n- **风格**:民谣+梦幻流行,以“自然治愈感”为核心,融合轻摇滚的情感张力。 \n- **乐器**: \n - 主歌:尼龙弦吉他(分解和弦,如Em→C→G→D的温柔进行)+ 低音竖琴(点缀空灵)。 \n - 副歌:加入弦乐群(小提琴/中提琴铺底)+ 轻柔鼓点(增强节奏共鸣)。 \n - 桥段:暂撤鼓组,用人声+钢琴(单音游走)+ 环境音效(狐鸣/风声采样),营造“荒野私语”的私密感。 \n - 尾声:回归吉他+风铃,余韵如草甸晚风,温柔消散。 \n- **人声**:主歌用“叙事式气声”(像在耳边轻诉),副歌渐强至“爆发式柔腔”(传递灵魂共振的力量),桥段加入轻微咽音(增强脆弱与倔强的对比)。 \n\n\n## 【创作灵感】 \n画面中红发女孩与红狐的“共生感”是核心:她们是彼此的镜像(红发与狐火同色,雀斑与狐瞳同亮),在荒野里完成了“孤独的熔解”与“灵魂的相契”。歌曲用“熔糖”“开花房”“织网”等意象,把“陪伴”升华为“生命的救赎”,让画面的温暖在旋律里具象成可触摸的情感——就像风掠过草甸时,所有孤独都被红焰与金瞳酿成了糖。 \n\n\n(若需简谱或Demo制作思路,可进一步细化~)" } ], "status": "completed", "id": "msg_0217****d2d1" } ], "first_id": "msg_0217****6c67", "last_id": "msg_0217****d2d1", "has_more": false } ``` ### Java #### Request ```java package com.ark.example; import com.volcengine.ark.runtime.service.ArkService; import com.volcengine.ark.runtime.models.responses.*; import java.util.Collections; public class demo { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); ArkService arkService = ArkService.builder().apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); ListInputItemsResponse listResult = arkService.listResponseInputItems( ListInputItemsRequest.builder().responseId("resp_0217*****") .include(Collections.singletonList(ResponseIncludable.MESSAGE_INPUT_IMAGE_IMAGE_URL)) .order(Order.ASC) .build() ); System.out.println(listResult); arkService.shutdownExecutor(); } } ``` #### Response ``` { "object": "list", "data": [ { "type": "message", "role": "user", "content": [ { "type": "input_text", "text": "你看见了什么?" }, { "type": "input_image", "image_url": "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/i2v_foxrgirl.png" } ], "id": "msg_0217****6c67" }, { "type": "message", "role": "assistant", "content": [ { "type": "output_text", "text": "这张图片呈现了**一位红发女孩与一只红狐亲密依偎**的温馨场景,氛围柔和治愈: \n\n### 人物与动物细节: \n- **女孩**:有着浓密蓬松的**红棕色长发**(色泽与狐狸皮毛呼应),脸上点缀着浅褐色雀斑,身着**轻柔的白色(或米白色)衣衫**(衣料褶皱自然,显柔和质感)。她双眼轻闭,神情恬静温柔,脸颊亲昵地贴靠狐狸头部,姿态满是信赖与温情。 \n- **红狐**:毛色鲜亮且层次丰富——主体为暖调红棕色,脸部、颈部及胸前覆盖**蓬松的白色绒毛**,耳朵尖端呈**黑色**,耳内侧是浅棕与黑色相间的细腻纹理;眼睛是**琥珀色(或金黄带黑瞳)**,明亮有神,黑色鼻尖与搭在女孩衣袖上的**黑色爪子**(可见部分),让它更显灵动真实。狐狸头部微微侧转,却与女孩脸紧密相靠,似在回应这份亲昵。 \n\n\n### 场景与氛围: \n背景是**朦胧的自然草地**(枯黄与绿意交织的草植,因虚化处理更显悠远静谧),柔和的光线(偏暖调)笼罩画面,焦点完全落在人与狐的亲密互动上。整体氛围**温暖、和谐、治愈**,传递出人与动物间信任亲昵的美好瞬间,仿佛时间在此刻静止。 \n\n\n画面通过色彩呼应(女孩红发与狐狸皮毛)、姿态互动(依偎贴靠),构建出诗意且宁静的“共生感”,细节(雀斑、狐的爪/耳纹理)让场景更具真实与感染力。" } ], "status": "completed", "id": "msg_0217****2259" }, { "type": "message", "role": "user", "content": [ { "type": "input_text", "text": "再创作一首歌" } ], "id": "msg_0217****a822" }, { "type": "message", "role": "assistant", "content": [ { "type": "output_text", "text": "# 《赤焰与金瞳》(原创歌曲) \n\n## 【歌词】 \n**前奏**:(风铃声+轻柔吉他,混入草甸风声与狐的轻鸣,营造荒野静谧感) \n\n**主歌1**: \n风掠过草甸 卷碎金的光 \n红发垂落 如燃麦的浪 \n白裙褶皱里 藏星尘的痒(雀斑似星芒在衣间摇晃) \n你金瞳映我 怯生生的惶 \n软爪碰衣角 微凉的惊惶 \n刹那间 心跳与狐步 同频轻响 \n\n\n**副歌**: \n我们是彼此 遗失的镜像 \n红焰吻金瞳 把孤独熔成糖 \n草尖雾吻醒 晨露的谎 \n原来灵魂 会在荒野 长出相契模样 \n\n\n**主歌2**: \n你的绒毛 裹住我所有流亡(过往的孤单在暖绒里松绑) \n我的指尖 数过你耳尖的霜(狐耳薄霜落满时光的凉) \n风揉碎故事 入暮色褶皱(光阴在草浪里悄悄流淌) \n我们对望 连影子都 依偎成诗章 \n\n\n**副歌(重复)**: \n我们是彼此 救赎的镜像 \n红焰暖金瞳 把长夜酿成糖 \n野花吻过风 风吻旧时光 \n原来心跳 会在荒野 开出共生花房 \n\n\n**桥段**: \n星子跌进 你琥珀眼眶(狐眼盛着整片银河的光) \n我把名字 系你尾尖摇晃(尾尖颤动时 名字轻响) \n世界褪色成 黑白默片旧场 \n唯有我们 红得滚烫 亮得倔强 \n\n\n**副歌(升调重复)**: \n我们是彼此 救赎的镜像 \n红焰暖金瞳 把长夜酿成糖 \n野花吻过风 风吻旧时光 \n原来心跳 会在荒野 开出共生花房 \n\n\n**尾声**: \n风又掠草甸 卷碎金的光 \n红发与狐焰 烧亮整片穹苍 \n白裙和绒毛 织柔软的网 \n从此荒野 有了名字 叫“我们的故乡” \n\n\n## 【旋律与编曲建议】 \n- **风格**:民谣+梦幻流行,以“自然治愈感”为核心,融合轻摇滚的情感张力。 \n- **乐器**: \n - 主歌:尼龙弦吉他(分解和弦,如Em→C→G→D的温柔进行)+ 低音竖琴(点缀空灵)。 \n - 副歌:加入弦乐群(小提琴/中提琴铺底)+ 轻柔鼓点(增强节奏共鸣)。 \n - 桥段:暂撤鼓组,用人声+钢琴(单音游走)+ 环境音效(狐鸣/风声采样),营造“荒野私语”的私密感。 \n - 尾声:回归吉他+风铃,余韵如草甸晚风,温柔消散。 \n- **人声**:主歌用“叙事式气声”(像在耳边轻诉),副歌渐强至“爆发式柔腔”(传递灵魂共振的力量),桥段加入轻微咽音(增强脆弱与倔强的对比)。 \n\n\n## 【创作灵感】 \n画面中红发女孩与红狐的“共生感”是核心:她们是彼此的镜像(红发与狐火同色,雀斑与狐瞳同亮),在荒野里完成了“孤独的熔解”与“灵魂的相契”。歌曲用“熔糖”“开花房”“织网”等意象,把“陪伴”升华为“生命的救赎”,让画面的温暖在旋律里具象成可触摸的情感——就像风掠过草甸时,所有孤独都被红焰与金瞳酿成了糖。 \n\n\n(若需简谱或Demo制作思路,可进一步细化~)" } ], "status": "completed", "id": "msg_0217****d2d1" } ], "first_id": "msg_0217****6c67", "last_id": "msg_0217****d2d1", "has_more": false } ``` --- # 删除 Response Source: https://ark.volcengine.com/region:cn-beijing/docs/delete-model-responses-api `DELETE https://ark.cn-beijing.volces.com/api/v3/responses/{responseId}` 本文介绍如何删除指定 ID 的 Response。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **responseId** `string` `必选` | Response ID 要删除的 Response ID ## 响应参数 **deleted** `boolean` | 是否删除成功 取值范围: * `true`:删除成功。 * `false`:未删除成功 **id** `string` | Response ID 被删除的 Response ID **object** `string` | 对象类型 固定为 `response` ## 代码示例 ## 删除请求 ### cURL #### Request ```bash RESP_ID="your_response_id" curl -X DELETE "https://ark.cn-beijing.volces.com/api/v3/responses/$RESP_ID" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" ``` #### Response ``` { "id": "resp_0217******", "object": "response", "deleted": true } ``` ### Python-OpenAI #### Request ```python import os from openai import OpenAI # 从环境变量中获取您的API KEY,配置方法见:https://ark.volcengine.com/region:cn-beijing/docs/quick-start api_key = os.getenv('ARK_API_KEY') client = OpenAI( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) if __name__ == "__main__": try: client.responses.delete( response_id="resp_0217*****" ) except Exception as e: print(f"failed to delete response: {e}") ``` #### Response ``` {} ``` ### Python #### Request ```python import os from arkruntime import Ark # 从环境变量中获取您的API KEY,配置方法见:https://ark.volcengine.com/region:cn-beijing/docs/quick-start api_key = os.getenv('ARK_API_KEY') client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) if __name__ == "__main__": try: client.responses.delete( response_id="resp_0217******" ) except Exception as e: print(f"failed to delete response: {e}") ``` #### Response ``` {} ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/responses" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() resp := client.DeleteResponse(ctx, &responses.ResponsesRemoveParams{ResponseId: "resp_0217*****"}) fmt.Println() fmt.Println(resp) } ``` #### Response ``` {} ``` ### Java #### Request ```java package com.ark.example; import com.volcengine.ark.runtime.service.ArkService; import com.volcengine.ark.runtime.models.responses.*; public class demo { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); // 创建ArkService实例 ArkService arkService = ArkService.builder().apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); DeleteResponseResponse deleteResult = arkService.deleteResponse( DeleteResponseRequest.builder().responseId("resp_0217*****").build() ); System.out.println(deleteResult); arkService.shutdownExecutor(); } } ``` #### Response ``` {} ``` --- # Response 生命周期 Source: https://ark.volcengine.com/region:cn-beijing/docs/response-lifecycle 当你创建 Response 并将 `stream` 设置为 `true` 时,服务器会在生成 Response 的过程中,通过 Server-Sent Events(SSE)实时向客户端推送事件。本节介绍 Response 从创建到完成/失败的生命周期事件。 > **说明** > > 流式输出的示例代码及返回示例,详见 [流式输出](/docs/streaming-output) 教程。 ## Response 生命周期 ### response.created > 当响应被创建时触发的事件。 **response** `object` | 响应对象 `response.created.response` 创建状态的响应。包含参数与非流式调用返回的参数一致。 **created_at** `integer` | 创建时间戳 `response.created.response.created_at` 该 Response 创建时的 Unix 时间戳(单位:秒)。 **id** `string` | 响应 ID `response.created.response.id` 本次 Response 的唯一标识,可用于后续查询、续接或删除该响应。 **model** `string` | 模型 ID `response.created.response.model` 生成本次响应所使用的模型标识,回显请求中的 model 字段。 **object** `string` | 对象类型 `response.created.response.object` 返回对象的类型标识,用于区分响应对象种类。 取值固定为 `response`。 **output** `object[]` | 输出内容 `response.created.response.output` 模型本次响应产出的 Item 列表,按生成顺序排列,可能包含消息、工具调用、推理等不同类型条目。 消息输出 `object` 模型生成的消息输出,包含文本内容。 **content** `object[]` | 输出内容 `response.created.response.output.content` 输出内容列表。 模型回答文本 `object` 模型生成的最终回答文本。 **type** `string` | 类型 `response.created.response.output.content.type` 内容类型判别字段,用于区分 union 变体。 取值固定为 `output_text`。 **annotations** `object[]` | 标注列表 `response.created.response.output.content.annotations` 文本附带的标注信息列表(如引用来源等) 网页引用 `object` 引用自互联网网页的标注信息。 **title** `string` | 标题 `response.created.response.output.content.annotations.title` 引用网页的标题。 **type** `string` | 类型 `response.created.response.output.content.annotations.type` 标注类型的判别字段(discriminator)。 取值固定为 `url_citation`。 **url** `string` | 网址 `response.created.response.output.content.annotations.url` 引用网页的 URL 地址。 **cover_image** `object` | 封面图 `response.created.response.output.content.annotations.cover_image` 网页封面图片信息。 **height** `integer` | 高度 `response.created.response.output.content.annotations.cover_image.height` 封面图片高度(像素) **url** `string` | 图片地址 `response.created.response.output.content.annotations.cover_image.url` 封面图片的 URL 地址。 **width** `integer` | 宽度 `response.created.response.output.content.annotations.cover_image.width` 封面图片宽度(像素) **freshness_info** `string` | 新鲜度 `response.created.response.output.content.annotations.freshness_info` 内容新鲜度信息。 **logo_url** `string` | Logo 地址 `response.created.response.output.content.annotations.logo_url` 网站 Logo 图标地址。 **mobile_url** `string` | 移动端地址 `response.created.response.output.content.annotations.mobile_url` 移动端访问地址。 **publish_time** `string` | 发布时间 `response.created.response.output.content.annotations.publish_time` 网页发布时间。 **site_name** `string` | 站点名 `response.created.response.output.content.annotations.site_name` 站点名称。 **summary** `string` | 摘要 `response.created.response.output.content.annotations.summary` 网页内容摘要。 文档引用 `object` 引用自私域知识库文档的标注信息。 **type** `string` | 类型 `response.created.response.output.content.annotations.type` 标注类型。 取值固定为 `doc_citation`。 **chunk_attachment** `object[]` | 分块附件 `response.created.response.output.content.annotations.chunk_attachment` 引用分块附带的附件信息列表。 **chunk_id** `integer` | 分块 ID `response.created.response.output.content.annotations.chunk_id` 引用文档分块的 ID。 **doc_id** `string` | 文档 ID `response.created.response.output.content.annotations.doc_id` 引用文档的 ID。 **doc_name** `string` | 文档名 `response.created.response.output.content.annotations.doc_name` 引用文档的名称。 **text** `string` | 文本内容 `response.created.response.output.content.text` 模型生成的文本内容。 模型思维链文本 `object` 模型生成的思维链文本。 **type** `string` | 类型 `response.created.response.output.content.type` 内容类型标识,用于区分 union 变体。 取值固定为 `reasoning_text`。 **annotations** `object[]` | 标注列表 `response.created.response.output.content.annotations` 思维链附带的标注信息列表。 网页引用 `object` 引用自互联网网页的标注信息。 **title** `string` | 标题 `response.created.response.output.content.annotations.title` 引用网页的标题。 **type** `string` | 类型 `response.created.response.output.content.annotations.type` 标注类型的判别字段(discriminator)。 取值固定为 `url_citation`。 **url** `string` | 网址 `response.created.response.output.content.annotations.url` 引用网页的 URL 地址。 **cover_image** `object` | 封面图 `response.created.response.output.content.annotations.cover_image` 网页封面图片信息。 **height** `integer` | 高度 `response.created.response.output.content.annotations.cover_image.height` 封面图片高度(像素) **url** `string` | 图片地址 `response.created.response.output.content.annotations.cover_image.url` 封面图片的 URL 地址。 **width** `integer` | 宽度 `response.created.response.output.content.annotations.cover_image.width` 封面图片宽度(像素) **freshness_info** `string` | 新鲜度 `response.created.response.output.content.annotations.freshness_info` 内容新鲜度信息。 **logo_url** `string` | Logo 地址 `response.created.response.output.content.annotations.logo_url` 网站 Logo 图标地址。 **mobile_url** `string` | 移动端地址 `response.created.response.output.content.annotations.mobile_url` 移动端访问地址。 **publish_time** `string` | 发布时间 `response.created.response.output.content.annotations.publish_time` 网页发布时间。 **site_name** `string` | 站点名 `response.created.response.output.content.annotations.site_name` 站点名称。 **summary** `string` | 摘要 `response.created.response.output.content.annotations.summary` 网页内容摘要。 文档引用 `object` 引用自私域知识库文档的标注信息。 **type** `string` | 类型 `response.created.response.output.content.annotations.type` 标注类型。 取值固定为 `doc_citation`。 **chunk_attachment** `object[]` | 分块附件 `response.created.response.output.content.annotations.chunk_attachment` 引用分块附带的附件信息列表。 **chunk_id** `integer` | 分块 ID `response.created.response.output.content.annotations.chunk_id` 引用文档分块的 ID。 **doc_id** `string` | 文档 ID `response.created.response.output.content.annotations.doc_id` 引用文档的 ID。 **doc_name** `string` | 文档名 `response.created.response.output.content.annotations.doc_name` 引用文档的名称。 **text** `string` | 文本内容 `response.created.response.output.content.text` 模型思维链文本内容。 **id** `string` | 条目 ID `response.created.response.output.id` 输出条目唯一标识。 **role** `string` | 角色 `response.created.response.output.role` 消息发送者的角色。 取值固定为 `assistant`。 **status** `string` | 状态 `response.created.response.output.status` 消息输出条目的当前状态。 * `completed`:消息已生成完毕。 * `in_progress`:消息正在生成中(流式场景)。 * `incomplete`:消息未完整生成(例如达到 `max_output_tokens` 上限)。 * `failed`:消息生成失败。 **type** `string` | 类型 `response.created.response.output.type` 输出条目的类型标识。 取值固定为 `message`。 **partial** `boolean` | 增量片段 `response.created.response.output.partial` 是否为流式增量片段。 **phase** `string` | 消息阶段 `response.created.response.output.phase` 标记 assistant 消息属于中间讲解还是最终回答。在回放 assistant 历史消息时,建议保留并原样回传该字段。可选值:`commentary`、`final_answer`。 函数调用输出 `object` 模型发起的函数调用请求。 **type** `string` | 类型 `response.created.response.output.type` 输出条目类型标识,用于区分 OutputItem 变体。 取值固定为 `function_call`。 **arguments** `string` | 参数 `response.created.response.output.arguments` 函数参数的 JSON 字符串。 **call_id** `string` | 调用 ID `response.created.response.output.call_id` 函数调用的唯一标识 ID,用于将该 function_call 输出与后续回传的 function_call_output 关联匹配。 **id** `string` | 条目 ID `response.created.response.output.id` 输出条目唯一标识。 **name** `string` | 函数名 `response.created.response.output.name` 调用的函数名称。 **status** `string` | 状态 `response.created.response.output.status` 函数调用条目的当前状态。 * `completed`:函数调用请求已生成完毕。 * `in_progress`:函数调用请求正在生成中(流式场景)。 * `incomplete`:函数调用请求未完整生成(例如达到 `max_output_tokens` 上限)。 * `failed`:函数调用生成失败。 思维链输出 `object` 模型的深度思考过程输出。 **status** `string` | 状态 `response.created.response.output.status` 推理条目的处理状态,用于判断思维链是否生成完成。可选值:`completed`、`failed`、`in_progress`、`incomplete`。 **summary** `object[]` | 推理摘要 `response.created.response.output.summary` 推理摘要内容列表。 **type** `string` | 类型 `response.created.response.output.summary.type` 摘要片段类型标识。 取值固定为 `summary_text`。 **text** `string` | 摘要文本 `response.created.response.output.summary.text` 思维链摘要文本内容。 **type** `string` | 类型 `response.created.response.output.type` 输出条目类型标识,用于区分 OutputItem 变体。 取值固定为 `reasoning`。 **content** `object[]` | 推理内容 `response.created.response.output.content` 思维链推理过程的内容元素列表。 模型回答文本 `object` 模型生成的最终回答文本。 **type** `string` | 类型 `response.created.response.output.content.type` 内容类型判别字段,用于区分 union 变体。 取值固定为 `output_text`。 **annotations** `object[]` | 标注列表 `response.created.response.output.content.annotations` 文本附带的标注信息列表(如引用来源等) 网页引用 `object` 引用自互联网网页的标注信息。 **title** `string` | 标题 `response.created.response.output.content.annotations.title` 引用网页的标题。 **type** `string` | 类型 `response.created.response.output.content.annotations.type` 标注类型的判别字段(discriminator)。 取值固定为 `url_citation`。 **url** `string` | 网址 `response.created.response.output.content.annotations.url` 引用网页的 URL 地址。 **cover_image** `object` | 封面图 `response.created.response.output.content.annotations.cover_image` 网页封面图片信息。 **height** `integer` | 高度 `response.created.response.output.content.annotations.cover_image.height` 封面图片高度(像素) **url** `string` | 图片地址 `response.created.response.output.content.annotations.cover_image.url` 封面图片的 URL 地址。 **width** `integer` | 宽度 `response.created.response.output.content.annotations.cover_image.width` 封面图片宽度(像素) **freshness_info** `string` | 新鲜度 `response.created.response.output.content.annotations.freshness_info` 内容新鲜度信息。 **logo_url** `string` | Logo 地址 `response.created.response.output.content.annotations.logo_url` 网站 Logo 图标地址。 **mobile_url** `string` | 移动端地址 `response.created.response.output.content.annotations.mobile_url` 移动端访问地址。 **publish_time** `string` | 发布时间 `response.created.response.output.content.annotations.publish_time` 网页发布时间。 **site_name** `string` | 站点名 `response.created.response.output.content.annotations.site_name` 站点名称。 **summary** `string` | 摘要 `response.created.response.output.content.annotations.summary` 网页内容摘要。 文档引用 `object` 引用自私域知识库文档的标注信息。 **type** `string` | 类型 `response.created.response.output.content.annotations.type` 标注类型。 取值固定为 `doc_citation`。 **chunk_attachment** `object[]` | 分块附件 `response.created.response.output.content.annotations.chunk_attachment` 引用分块附带的附件信息列表。 **chunk_id** `integer` | 分块 ID `response.created.response.output.content.annotations.chunk_id` 引用文档分块的 ID。 **doc_id** `string` | 文档 ID `response.created.response.output.content.annotations.doc_id` 引用文档的 ID。 **doc_name** `string` | 文档名 `response.created.response.output.content.annotations.doc_name` 引用文档的名称。 **text** `string` | 文本内容 `response.created.response.output.content.text` 模型生成的文本内容。 模型思维链文本 `object` 模型生成的思维链文本。 **type** `string` | 类型 `response.created.response.output.content.type` 内容类型标识,用于区分 union 变体。 取值固定为 `reasoning_text`。 **annotations** `object[]` | 标注列表 `response.created.response.output.content.annotations` 思维链附带的标注信息列表。 网页引用 `object` 引用自互联网网页的标注信息。 **title** `string` | 标题 `response.created.response.output.content.annotations.title` 引用网页的标题。 **type** `string` | 类型 `response.created.response.output.content.annotations.type` 标注类型的判别字段(discriminator)。 取值固定为 `url_citation`。 **url** `string` | 网址 `response.created.response.output.content.annotations.url` 引用网页的 URL 地址。 **cover_image** `object` | 封面图 `response.created.response.output.content.annotations.cover_image` 网页封面图片信息。 **height** `integer` | 高度 `response.created.response.output.content.annotations.cover_image.height` 封面图片高度(像素) **url** `string` | 图片地址 `response.created.response.output.content.annotations.cover_image.url` 封面图片的 URL 地址。 **width** `integer` | 宽度 `response.created.response.output.content.annotations.cover_image.width` 封面图片宽度(像素) **freshness_info** `string` | 新鲜度 `response.created.response.output.content.annotations.freshness_info` 内容新鲜度信息。 **logo_url** `string` | Logo 地址 `response.created.response.output.content.annotations.logo_url` 网站 Logo 图标地址。 **mobile_url** `string` | 移动端地址 `response.created.response.output.content.annotations.mobile_url` 移动端访问地址。 **publish_time** `string` | 发布时间 `response.created.response.output.content.annotations.publish_time` 网页发布时间。 **site_name** `string` | 站点名 `response.created.response.output.content.annotations.site_name` 站点名称。 **summary** `string` | 摘要 `response.created.response.output.content.annotations.summary` 网页内容摘要。 文档引用 `object` 引用自私域知识库文档的标注信息。 **type** `string` | 类型 `response.created.response.output.content.annotations.type` 标注类型。 取值固定为 `doc_citation`。 **chunk_attachment** `object[]` | 分块附件 `response.created.response.output.content.annotations.chunk_attachment` 引用分块附带的附件信息列表。 **chunk_id** `integer` | 分块 ID `response.created.response.output.content.annotations.chunk_id` 引用文档分块的 ID。 **doc_id** `string` | 文档 ID `response.created.response.output.content.annotations.doc_id` 引用文档的 ID。 **doc_name** `string` | 文档名 `response.created.response.output.content.annotations.doc_name` 引用文档的名称。 **text** `string` | 文本内容 `response.created.response.output.content.text` 模型思维链文本内容。 **encrypted_content** `string` | 加密思维链 `response.created.response.output.encrypted_content` 思考内容加密原文。经加密及压缩处理后的思考内容原文。 相关文档: * [关键规则](/docs/agent-model-invocation-practice#key-rules) * [回传思考内容加密块使用示例](/docs/agent-model-invocation-practice#encrypted-thinking-block-examples) > **说明** > > 流式输出场景下,思考内容加密原文通过 `response.output_item.added`、`response.output_item.done`、`response.completed` 等相关事件下发,需要按事件中 `encrypted_content` 字段非空过滤获取。 **模型支持**: * `doubao-seed-2-0-lite-260428 及后续版本` **id** `string` | 条目 ID `response.created.response.output.id` 输出条目唯一标识。 语音转写输出 `object` 模型返回的语音转写输出。 **status** `string` | 状态 `response.created.response.output.status` 语音转写条目的当前状态。 * `completed`:转写已生成完毕。 * `in_progress`:转写正在生成中(流式场景)。 * `incomplete`:转写未完整生成(例如达到输出上限而截断)。 * `failed`:转写生成失败。 **type** `string` | 类型 `response.created.response.output.type` 输出条目类型标识。 取值固定为 `transcription`。 **id** `string` | 条目 ID `response.created.response.output.id` 输出条目唯一标识。 **transcription** `object[]` | 转写内容 `response.created.response.output.transcription` 语音转写结果片段列表。 **type** `string` | 类型 `response.created.response.output.transcription.type` 转写片段类型。 取值固定为 `transcription_text`。 **chunks** `object[]` | 音频小段 `response.created.response.output.transcription.chunks` 当前片段对应的音频小段列表。 **end_time** `integer` | 结束时间 `response.created.response.output.transcription.chunks.end_time` 片段结束时间(毫秒) **start_time** `integer` | 开始时间 `response.created.response.output.transcription.chunks.start_time` 片段开始时间(毫秒) **text** `string` | 文字内容 `response.created.response.output.transcription.chunks.text` 当前片段对应的文字内容。 **text** `string` | 转写文本 `response.created.response.output.transcription.text` 当前片段的转写文本。 网页搜索调用 `object` 模型发起的网页搜索调用记录。 **id** `string` | 条目 ID `response.created.response.output.id` 输出条目唯一标识。 **status** `string` | 状态 `response.created.response.output.status` 网页搜索调用的当前状态。可选值:`in_progress`、`searching`、`completed`、`incomplete`、`failed`。 **type** `string` | 类型 `response.created.response.output.type` 输出条目类型标识,用于区分 OutputItem 变体。 取值固定为 `web_search_call`。 **action** `object` | 搜索动作 `response.created.response.output.action` 描述模型执行的网页搜索动作,包括搜索类型与查询关键字。 **query** `string` | 查询语句 `response.created.response.output.action.query` 模型实际发起的搜索查询语句。 **type** `string` | 类型 `response.created.response.output.action.type` 网页搜索动作的类型标识。 取值固定为 `search`。 **queries** `string[]` | 查询语句列表 `response.created.response.output.action.queries` 本次网页搜索产生的查询语句列表。 图像处理调用 `object` 模型发起的图像处理调用记录。 **id** `string` | 条目 ID `response.created.response.output.id` 输出条目唯一标识。 **status** `string` | 状态 `response.created.response.output.status` 图像处理调用的当前状态。 * `completed`:图像处理已完成。 * `in_progress`:图像处理正在执行中。 * `incomplete`:图像处理未完整执行(例如被中断或截断)。 * `failed`:图像处理执行失败,具体原因见 `error` 字段。 **type** `string` | 类型 `response.created.response.output.type` 输出条目类型标识,用于区分 OutputItem 变体。 取值固定为 `image_process`。 **action** `object` | 处理动作 `response.created.response.output.action` 图像处理动作详情。 **type** `string` | 类型 `response.created.response.output.action.type` 图像处理动作类型。 **result_image_url** `string` | 结果图地址 `response.created.response.output.action.result_image_url` 处理后图像的 URL 地址。 **arguments** `object` | 处理参数 `response.created.response.output.arguments` 图像处理动作的输入参数,以键值对形式承载具体处理选项。 **error** `object` | 图像处理错误 `response.created.response.output.error` 图像处理失败时的错误信息。 **message** `string` | 错误描述 `response.created.response.output.error.message` 错误的可读描述。 MCP 审批请求 `object` MCP 工具调用前的审批请求记录。 **arguments** `string` | 调用参数 `response.created.response.output.arguments` 工具调用参数的 JSON 字符串。 **name** `string` | 工具名 `response.created.response.output.name` 待运行的工具名称。 **server_label** `string` | 服务标签 `response.created.response.output.server_label` 发起请求的 MCP Server 标签。 **type** `string` | 类型 `response.created.response.output.type` 输出项类型标识符,用于区分 OutputItem 的变体。 取值固定为 `mcp_approval_request`。 **id** `string` | 请求 ID `response.created.response.output.id` 审批请求的唯一 ID。 MCP 工具清单 `object` MCP Server 提供的工具清单输出。 **server_label** `string` | 服务标签 `response.created.response.output.server_label` MCP Server 标签。 **type** `string` | 类型 `response.created.response.output.type` 输出项类型标识。 取值固定为 `mcp_list_tools`。 **error** `string` | 错误信息 `response.created.response.output.error` 当 MCP Server 无法返回工具列表时的错误信息。 **id** `string` | 列表 ID `response.created.response.output.id` 工具列表的唯一 ID。 **tools** `object[]` | 工具列表 `response.created.response.output.tools` 该 MCP Server 上可用的工具列表。 **name** `string` | 工具名 `response.created.response.output.tools.name` 工具名称。 **annotations** `object` | 注解信息 `response.created.response.output.tools.annotations` 工具的附加注解信息。 **description** `string` | 工具描述 `response.created.response.output.tools.description` 工具的功能描述。 **input_schema** `object` | 入参 Schema `response.created.response.output.tools.input_schema` 描述工具入参的 JSON Schema。 MCP 工具调用 `object` 模型对 MCP 工具的实际调用记录及结果。 **name** `string` | 工具名 `response.created.response.output.name` 实际运行的工具名称。 **server_label** `string` | 服务标签 `response.created.response.output.server_label` 运行工具的 MCP Server 标签。 **type** `string` | 类型 `response.created.response.output.type` 标识该输出项为 MCP 工具调用记录。 取值固定为 `mcp_call`。 **arguments** `string` | 调用参数 `response.created.response.output.arguments` 传递给 MCP 工具的调用参数,格式为 JSON 字符串。 > **说明** > > 该字段通过 `response.mcp_call_arguments.delta` 事件流式追加,初始 `output_item.added` 事件可能不携带该字段。 **error** `string` | 错误信息 `response.created.response.output.error` 工具调用失败时的错误信息。 **id** `string` | 调用 ID `response.created.response.output.id` 工具调用的唯一 ID。 **output** `string` | 返回结果 `response.created.response.output.output` 工具调用的返回结果。 知识库检索调用 `object` 模型发起的私域知识库检索调用记录。 **knowledge_resource_id** `string` | 知识库 ID `response.created.response.output.knowledge_resource_id` 检索使用的知识库 ID。 **queries** `string[]` | 查询语句 `response.created.response.output.queries` 模型实际执行的检索查询语句。 **status** `string` | 状态 `response.created.response.output.status` 知识库检索调用的执行状态。可选值:`in_progress`、`searching`、`completed`、`failed`、`incomplete`。 **type** `string` | 类型 `response.created.response.output.type` 输出条目类型标识,用于区分不同类型的输出条目。 取值固定为 `knowledge_search_call`。 **id** `string` | 条目 ID `response.created.response.output.id` 输出条目唯一标识。 豆包应用调用 `object` 模型对豆包助手能力的调用记录。 **type** `string` | 类型 `response.created.response.output.type` 输出条目类型标识。 取值固定为 `doubao_app_call`。 **blocks** `object[]` | 内容块 `response.created.response.output.blocks` 豆包应用调用产出的内容块列表。 文本输出 `object` 豆包应用产出的文本输出内容块。 **type** `string` | 类型 `response.created.response.output.blocks.type` 内容块类型标识符。 取值固定为 `output_text`。 **id** `string` | 块 ID `response.created.response.output.blocks.id` 内容块的唯一标识。 **parent_id** `string` | 父级 ID `response.created.response.output.blocks.parent_id` 所属父级条目的 ID。 **status** `string` | 状态 `response.created.response.output.blocks.status` 内容块状态。 **text** `string` | 文本内容 `response.created.response.output.blocks.text` 思维链文本 `object` 豆包应用产出的思维链文本内容块。 **type** `string` | 类型 `response.created.response.output.blocks.type` 内容块类型标识符。 取值固定为 `reasoning_text`。 **id** `string` | 块 ID `response.created.response.output.blocks.id` 内容块的唯一标识。 **parent_id** `string` | 父级 ID `response.created.response.output.blocks.parent_id` 所属父级条目的 ID。 **reasoning_text** `string` | 思考文本 `response.created.response.output.blocks.reasoning_text` 思维链文本内容。 **status** `string` | 状态 `response.created.response.output.blocks.status` 内容块状态。 搜索过程 `object` 豆包应用 AI 搜索过程产出的内容块。 **type** `string` | 类型 `response.created.response.output.blocks.type` 内容块类型标识符。 取值固定为 `search`。 **id** `string` | 块 ID `response.created.response.output.blocks.id` 内容块的唯一标识。 **parent_id** `string` | 父级 ID `response.created.response.output.blocks.parent_id` 所属父级条目的 ID。 **queries** `string[]` | 查询语句 `response.created.response.output.blocks.queries` 搜索查询语句列表。 **results** `object[]` | 搜索结果 `response.created.response.output.blocks.results` 搜索结果列表。 **text_card** `object` | 文本卡片 `response.created.response.output.blocks.results.text_card` 文本卡片形式的搜索结果。 **sitename** `string` | 站点名 `response.created.response.output.blocks.results.text_card.sitename` 来源站点名称。 **title** `string` | 标题 `response.created.response.output.blocks.results.text_card.title` 搜索结果标题。 **url** `string` | 网址 `response.created.response.output.blocks.results.text_card.url` 搜索结果 URL 地址。 **status** `string` | 状态 `response.created.response.output.blocks.status` 内容块状态。 **summary** `string` | 搜索总结 `response.created.response.output.blocks.summary` AI 搜索过程中对本轮搜索结果的总结性文字,概括从搜索结果中提取的核心信息。 推理搜索过程 `object` 豆包应用推理搜索过程产出的内容块。 **type** `string` | 类型 `response.created.response.output.blocks.type` 内容块类型。 取值固定为 `reasoning_search`。 **id** `string` | 块 ID `response.created.response.output.blocks.id` 内容块的唯一标识。 **parent_id** `string` | 父级 ID `response.created.response.output.blocks.parent_id` 所属父级条目的 ID。 **queries** `string[]` | 查询语句 `response.created.response.output.blocks.queries` 搜索查询语句列表。 **results** `object[]` | 搜索结果 `response.created.response.output.blocks.results` 搜索结果列表。 **text_card** `object` | 文本卡片 `response.created.response.output.blocks.results.text_card` 文本卡片形式的搜索结果。 **sitename** `string` | 站点名 `response.created.response.output.blocks.results.text_card.sitename` 来源站点名称。 **title** `string` | 标题 `response.created.response.output.blocks.results.text_card.title` 搜索结果标题。 **url** `string` | 网址 `response.created.response.output.blocks.results.text_card.url` 搜索结果 URL 地址。 **status** `string` | 状态 `response.created.response.output.blocks.status` 推理搜索内容块的处理状态。可选值:`in_progress`、`searching`、`completed`、`incomplete`、`failed`。 **summary** `string` | 搜索总结 `response.created.response.output.blocks.summary` 推理搜索过程中对本轮搜索结果的总结性文字,概括从搜索结果中提取的核心信息。 **feature** `string` | 功能名 `response.created.response.output.feature` 本次调用触发的豆包子功能名称。可选值:`chat`、`deep_chat`、`ai_search`、`reasoning_search`。 **id** `string` | 条目 ID `response.created.response.output.id` 输出条目唯一标识。 **status** `string` | 状态 `response.created.response.output.status` 输出状态。可选值:`completed`、`failed`、`in_progress`、`incomplete`。 智能体工具调用 `object` 模型发起的智能体工具调用记录。 **name** `string` | 工具名 `response.created.response.output.name` 被调用的智能体工具名称。 **status** `string` | 状态 `response.created.response.output.status` 智能体工具调用的执行状态。可选值:`completed`、`failed`、`in_progress`、`incomplete`。 **type** `string` | 类型 `response.created.response.output.type` 输出条目类型标识符,用于区分 OutputItem 的 variant。 取值固定为 `agent_tool_call`。 **id** `string` | 条目 ID `response.created.response.output.id` 输出条目唯一标识。 **caching** `object` | 缓存配置 `response.created.response.caching` 本次响应生效的上下文缓存配置,回显请求中的 caching 设置。 **prefix** `boolean` | 仅写缓存 `response.created.response.caching.prefix` 是否仅写入前缀缓存,不生成回复。`true` 只写缓存,不返回模型输出;`false` 正常生成回复并写缓存。 **type** `string` | 缓存模式 `response.created.response.caching.type` 缓存模式。 * `enabled`:开启上下文缓存。 * `disabled`:关闭上下文缓存。 **context_management** `object` | 上下文管理 `response.created.response.context_management` 本次响应实际执行的上下文管理编辑操作,回显请求中 context_management 生效后的结果。 **applied_edits** `object[]` | 已应用编辑 `response.created.response.context_management.applied_edits` 已应用的上下文编辑结果列表。 清理工具调用 `object` 已应用的清理工具调用编辑结果。 **cleared_tool_uses** `integer` | 清理次数 `response.created.response.context_management.applied_edits.cleared_tool_uses` 已清理的工具调用数量。 **type** `string` | 类型 `response.created.response.context_management.applied_edits.type` 编辑类型。 取值固定为 `clear_tool_uses`。 清理思维链 `object` 已应用的清理思维链编辑结果。 **cleared_thinking_turns** `integer` | 清理轮次 `response.created.response.context_management.applied_edits.cleared_thinking_turns` 已清理的思维链轮次数量。 **type** `string` | 类型 `response.created.response.context_management.applied_edits.type` 编辑类型。 取值固定为 `clear_thinking`。 **error** `object` | 错误信息 `response.created.response.error` 模型响应过程发生错误时的错误信息。仅当 *status* 为 `failed` 时返回。 **code** `string` | 错误码 `response.created.response.error.code` **message** `string` | 错误描述 `response.created.response.error.message` 错误信息的可读描述。 **expire_at** `integer` | 过期时间戳 `response.created.response.expire_at` 响应储存的过期时刻 Unix 时间戳(秒),回显请求中的 expire_at 设置,对 store 与 caching 均生效。 > **说明** > > 最多保留 7 天。 **incomplete_details** `object` | 未完成详情 `response.created.response.incomplete_details` 响应未能完成的详细信息。仅当 *status* 为 `incomplete` 时返回。 **reason** `string` | 原因 `response.created.response.incomplete_details.reason` 响应未完成的原因。 **content_filter** `object` | 内容过滤 `response.created.response.incomplete_details.content_filter` 内容过滤详情。 **details** `string` | 详情 `response.created.response.incomplete_details.content_filter.details` 内容过滤命中的详细描述。 **type** `string` | 类型 `response.created.response.incomplete_details.content_filter.type` 内容过滤命中的类型。 **instructions** `string` | 系统指令 `response.created.response.instructions` 本次响应生效的系统指令,回显请求中的 instructions 设置。 **max_output_tokens** `integer` | 最大输出长度 `response.created.response.max_output_tokens` 回显请求中的 max_output_tokens 参数,即模型输出最大 token 数(含回答与思维链)。 **max_tool_calls** `integer` | 最大工具调用轮次 `response.created.response.max_tool_calls` 本次响应生效的最大工具调用轮次,回显请求中的 max_tool_calls 设置。 **metadata** `object` | 自定义元数据 `response.created.response.metadata` 回显请求中的 metadata 键值对元数据。最多支持 16 对键值,key 长度不超过 64 个字符,value 长度不超过 512 个字符,服务端不会解释其中内容。 **parallel_tool_calls** `boolean` | 并行工具调用 `response.created.response.parallel_tool_calls` 本次请求实际生效的并行工具调用设置,回显请求中的 parallel_tool_calls 值。 **previous_response_id** `string` | 上轮响应 ID `response.created.response.previous_response_id` 回显请求中的 previous_response_id,即前一轮响应的唯一标识。仅在请求传入该字段时返回。 **prompt_cache_key** `string` | 缓存分桶键 `response.created.response.prompt_cache_key` 用于提升缓存命中率的分桶键,回显请求中的 prompt_cache_key 设置。 **reasoning** `object` | 推理配置 `response.created.response.reasoning` 本次响应生效的深度思考工作量配置,回显请求中的 reasoning 设置。 **effort** `string` | 思考深度 `response.created.response.reasoning.effort` 限制思考的工作量。减少思考深度可提升速度,思考花费的 token 更少。 * `none`:关闭思考。 * `minimal`:关闭思考,直接回答。 * `low`:轻量思考,侧重快速响应。 * `medium`:均衡模式,兼顾速度与深度。 * `high`:深度分析,处理复杂问题。 * `xhigh`:更高程度思考。 * `max`:最高程度思考,适配高难度推理任务。 > **注意:说明** > > 支持该字段的模型、默认取值、参数兼容映射规则,以及与 `thinking.type` 字段的关系,详见 [文档](/docs/responses-api-deep-thinking#dc4c1547)。 **safety_identifier** `string` | 安全标识 `response.created.response.safety_identifier` 回显请求中传入的终端用户稳定标识,用于安全策略与违规行为追踪关联。 **service_tier** `string` | 推理模式 `response.created.response.service_tier` 本次请求实际使用的推理模式。 * `fast`:本次请求使用 [在线推理(低延迟)](/docs/online-inference-low-latency) 模式。 * `auto`:本次请求使用 [在线推理(TPM 保障包)](/docs/tpm-guarantee-package) 模式。 * `default`:本次请求使用 [在线推理(常规)](/docs/online-inference-standard) 模式。 * `flex`:本次请求使用 [在线推理(低优)](/docs/online-inference-flex) 模式。 **session** `object` | 会话信息 `response.created.response.session` 本次响应关联的会话信息,回显请求中 session 生效后的结果。 **id** `string` | 会话 ID `response.created.response.session.id` 会话的唯一 ID。 **status** `string` | 响应状态 `response.created.response.status` 本次响应的当前状态,标识生成流程处于进行中、已完成、未完成或已失败等阶段。 **store** `boolean` | 是否存储 `response.created.response.store` 是否储存生成的模型响应以供后续通过 API 检索,回显请求中的 store 设置。 **temperature** `number` | 采样温度 `response.created.response.temperature` 本次响应生效的采样温度,回显请求中的 temperature 设置。 **text** `object` | 输出格式 `response.created.response.text` 本次响应生效的输出格式定义,回显请求中的 text 设置。 **format** `object` | 输出格式 `response.created.response.text.format` 文本输出格式定义。 **type** `string` | 格式类型 `response.created.response.text.format.type` 输出格式类型。可选值:`text`、`json_schema`、`json_object`。 > **注意** > > `json_object` / `json_schema` 能力尚在 beta 阶段,请谨慎在生产环境使用。 **description** `string` | 格式描述 `response.created.response.text.format.description` 格式描述信息。 **name** `string` | 格式名称 `response.created.response.text.format.name` 格式名称,作为 JSON Schema 输出格式的标识。 > **注意** > > 仅当 *type* 为 `json_schema` 时需要提供此字段。 **schema** `object` | Schema 定义 `response.created.response.text.format.schema` JSON Schema 定义。当 *type* 为 `json_schema` 时必填。 **strict** `boolean` | 严格模式 `response.created.response.text.format.strict` 是否严格按 JSON Schema 校验模型输出。 > **注意** > > 仅当 *type* 为 `json_schema` 时生效。 **thinking** `object` | 深度思考 `response.created.response.thinking` 本次响应生效的深度思考配置,回显请求中的 thinking 设置。 **type** `string` | 思考模式 `response.created.response.thinking.type` 深度思考模式。 * `enabled`:开启深度思考。 * `disabled`:关闭深度思考。 * `auto`:由模型自行判断是否需要深度思考。 **tool_choice** `string / object` | 工具调用策略 `response.created.response.tool_choice` 本次请求实际生效的工具调用策略,回显请求中的 tool_choice 设置。 > **说明** > > 未指定工具时默认值为 `none`;存在工具时默认值为 `auto`。 简单策略 `string` 直接传入字符串 `none`、`auto` 或 `required`,控制工具调用整体策略。 指定工具 `object` 通过对象指定具体工具类型或工具名进行调用。 **type** `string` | 工具类型 `response.created.response.tool_choice.type` 指定要调用的工具类型,用于精确路由到对应工具。可选值: * `function` * `web_search` * `image_process` * `mcp` * `knowledge_search` * `doubao_app` **name** `string` | 工具名称 `response.created.response.tool_choice.name` 指定要调用的具体工具名,如函数名或 MCP 服务下的工具名。 **tools** `object[]` | 工具列表 `response.created.response.tools` 本次响应生效的工具列表,回显请求中的 tools 设置。 函数调用 `object` 自定义函数调用(Function Calling),让模型生成结构化的函数参数。 **name** `string` | 函数名 `response.created.response.tools.name` 供模型调用的函数名称,模型在 function_call 输出中以该名称回传,用于匹配对应函数。 **type** `string` | 类型 `response.created.response.tools.type` 工具类型标识,用于在 union 中区分不同工具类别。 取值固定为 `function`。 **description** `string` | 函数描述 `response.created.response.tools.description` 函数的描述信息,帮助模型理解何时使用该函数。 **parameters** `object` | 参数定义 `response.created.response.tools.parameters` 函数参数定义,遵循 JSON Schema 格式。 联网搜索 `object` 联网搜索工具,让模型在需要时自动进行网页搜索获取实时信息。 **type** `string` | 类型 `response.created.response.tools.type` 工具类型标识,用于区分 Tool 的不同变体。 取值固定为 `web_search`。 **limit** `integer` | 最大结果数 `response.created.response.tools.limit` 每轮搜索最大返回结果数量。 > **说明** > > 单次搜索最多返回 20 条;单轮可能有多次搜索,最终召回条数受此参数限制影响。 **取值范围**:`[1, 50]` **max_keyword** `integer` | 最大关键词数 `response.created.response.tools.max_keyword` 最大并行搜索关键词数量。 **取值范围**:`[1, 50]` **sources** `string[]` | 搜索来源 `response.created.response.tools.sources` 搜索信息来源限制,指定模型可从哪些渠道检索网页内容。可选值:`toutiao`、`douyin`、`moji`、`search_engine`、`doubao`。 > **说明** > > `doubao` 不能与其他搜索来源同时配置。传入 `["doubao"]` 时,`tools.limit`、`tools.max_keyword`、`tools.user_location` 均不生效,向它们传入的值将被忽略。 **user_location** `object` | 用户位置 `response.created.response.tools.user_location` 用户地理位置信息,用于搜索优化。 **type** `string` | 类型 `response.created.response.tools.user_location.type` 位置类型。 取值固定为 `approximate`。 **city** `string` | 城市 `response.created.response.tools.user_location.city` 用户所在城市。 **country** `string` | 国家 `response.created.response.tools.user_location.country` 用户所在国家。 **region** `string` | 地区 `response.created.response.tools.user_location.region` 用户所在地区。 **timezone** `number` | 时区 `response.created.response.tools.user_location.timezone` 用户所在时区。 图像处理 `object` 图像处理工具,让模型对图片进行画点、选区、缩放、旋转等操作。 **type** `string` | 类型 `response.created.response.tools.type` 工具类型标识,用于区分 Tool 的不同变体。 取值固定为 `image_process`。 **grounding** `object` | 选区功能 `response.created.response.tools.grounding` 选区/裁切功能配置,启用后模型可返回图像中目标的检测框或裁切区域坐标。 **type** `string` | 开关 `response.created.response.tools.grounding.type` 功能开关。可选值:`enabled`、`disabled`。 **point** `object` | 画点功能 `response.created.response.tools.point` 画点/画线功能开关。 **type** `string` | 开关 `response.created.response.tools.point.type` 功能开关。可选值:`enabled`、`disabled`。 **rotate** `object` | 旋转功能 `response.created.response.tools.rotate` 旋转功能开关。启用后模型可请求对图片按指定角度进行旋转。 > **注意** > > 旋转角度支持范围为 0-359 度。 **type** `string` | 开关 `response.created.response.tools.rotate.type` 功能开关。可选值:`enabled`、`disabled`。 **zoom** `object` | 缩放功能 `response.created.response.tools.zoom` 缩放功能开关,启用后模型可对图像目标区域执行缩放操作。 > **说明** > > 缩放倍率支持范围 0.5-2.0 倍。 **type** `string` | 开关 `response.created.response.tools.zoom.type` 功能开关。可选值:`enabled`、`disabled`。 MCP 工具 `object` MCP(Model Context Protocol)工具,让模型调用外部 MCP Server 提供的工具。 **server_label** `string` | 服务标签 `response.created.response.tools.server_label` MCP Server 的唯一标识标签。模型在工具调用输出中通过该标签指向对应 Server,便于在多个 MCP Server 场景下区分调用来源。 **server_url** `string` | 服务地址 `response.created.response.tools.server_url` MCP Server 的 HTTP(S) 访问地址,模型通过该地址向 Server 发起工具调用请求。 **type** `string` | 类型 `response.created.response.tools.type` 工具类型标识,用于区分 Tool 的不同变体。 取值固定为 `mcp`。 **allowed_tools** `string[] / object` | 允许工具 `response.created.response.tools.allowed_tools` 允许模型调用的工具范围。可传工具名称字符串数组,或包含 `tool_names` 字段的过滤器对象。 工具名数组 `string[]` 直接传入允许调用的工具名称数组。 工具过滤器 `object` 通过过滤器对象指定允许调用的工具范围。 **tool_names** `string[]` | 工具名列表 `response.created.response.tools.allowed_tools.tool_names` 允许调用的工具名称列表。 **headers** `object` | 请求头 `response.created.response.tools.headers` 调用 MCP Server 时附加的 HTTP 请求头,以字符串键值对形式指定 header 名与值。 > **说明** > > * 常用于传递鉴权信息(如 `Authorization`)。 > * `Authorization` 字段不会被服务端存储。 **require_approval** `string / object` | 审批策略 `response.created.response.tools.require_approval` MCP 工具调用前的审批策略;支持简单模式(字符串)或按工具粒度控制(过滤器对象)。 简单策略 `string` 直接传入字符串 `always` 或 `never`,对所有工具应用统一审批策略。 工具过滤器 `object` 通过过滤器对象按工具粒度配置审批策略。 **always** `object` | 始终审批 `response.created.response.tools.require_approval.always` 始终需要审批的工具过滤器。 **tool_names** `string[]` | 工具名列表 `response.created.response.tools.require_approval.always.tool_names` 始终需要审批的工具名称列表。 **never** `object` | 无需审批 `response.created.response.tools.require_approval.never` 无需审批的工具过滤器。 **tool_names** `string[]` | 工具名列表 `response.created.response.tools.require_approval.never.tool_names` 无需审批即可调用的工具名称列表。 **server_description** `string` | 服务描述 `response.created.response.tools.server_description` MCP Server 的描述信息,帮助模型理解何时使用该 Server。 知识库搜索 `object` 私域知识库搜索工具,让模型检索企业内部知识库中的文档内容。 **knowledge_resource_id** `string` | 知识库 ID `response.created.response.tools.knowledge_resource_id` **type** `string` | 类型 `response.created.response.tools.type` 工具类型标识,用于区分 Tool 的不同变体。 取值固定为 `knowledge_search`。 **dense_weight** `number` | 稠密权重 `response.created.response.tools.dense_weight` 混合检索中稠密向量(语义)检索的权重,值越大越偏向语义匹配,越小越偏向关键词匹配。 > **说明** > > 仅在混合检索(索引算法为 `hnsw_hybrid`)下生效。 **取值范围**:`[0.2, 1]` **description** `string` | 知识库描述 `response.created.response.tools.description` 知识库描述信息,帮助模型理解何时使用该知识库。 **doc_filter** `object` | 文档过滤 `response.created.response.tools.doc_filter` 设置文档字段级别的检索过滤条件,确保只在符合条件的文档中检索。 > **说明** > > * 支持用作过滤条件的文档字段: > * 系统字段:`doc_id`(仅手动创建的知识库)、`_sys_auto_doc_id`(手动 + API 创建均适用) > * 自定义字段:已为知识库文档添加的**文档标签**(对应知识库 `index_config.fields` 中的 `field`) > * 支持单一条件过滤和多条件组合过滤(支持 `And` / `Or` 逻辑运算)。 > * 详细使用方式和支持字段参见 [filter 表达式](https://docs.volcengine.com/docs/84313/1419289?lang=zh#filter-%E8%A1%A8%E8%BE%BE%E5%BC%8F)。 > * 若自定义字段类型为 `Boolean`,取值范围是 `True` / `False`,大小写规则:cURL 用 `true` / `false`,Python 用 `True` / `False`。 **limit** `integer` | 最大结果数 `response.created.response.tools.limit` 最大搜索结果数量。 **取值范围**:`[1, 200]` **max_keyword** `integer` | 最大关键词数 `response.created.response.tools.max_keyword` 最大并行搜索关键词数量。 **取值范围**:`[1, 50]` **ranking_options** `object` | 排序选项 `response.created.response.tools.ranking_options` 检索后处理选项。可参考 [知识库 API 文档](https://docs.volcengine.com/docs/84313/1350012?lang=zh) `post_processing` 字段。 **chunk_diffusion_count** `integer` | 切片扩散数 `response.created.response.tools.ranking_options.chunk_diffusion_count` 检索阶段返回命中切片的上下几片邻近切片。取 `0` 表示不进行 chunk diffusion。 **取值范围**:`[0, 5]` **chunk_group** `boolean` | 文本聚合 `response.created.response.tools.ranking_options.chunk_group` 文本聚合。 * 默认不聚合。 * 对于非结构化文件,可开启文本聚合以更好保留原文档内容语序。 * 开启后,会根据文档及文档顺序,对切片重新聚合排序返回。 **get_attachment_link** `boolean` | 获取附件链接 `response.created.response.tools.ranking_options.get_attachment_link` 是否获取切片中图片的临时下载链接。 **rerank_model** `string` | Rerank 模型 `response.created.response.tools.ranking_options.rerank_model` rerank 模型选择。默认值:`base-multilingual-rerank`。取值:`base-multilingual-rerank` / `m3-v2-rerank`。 > **说明** > > * 仅在 `rerank_switch` 为 `true` 时生效。 > * `base-multilingual-rerank`(推荐):速度快、长文本、支持 70+ 种语言。 > * `m3-v2-rerank`:常规文本、支持 100+ 种语言。 **rerank_only_chunk** `boolean` | 仅切片重排 `response.created.response.tools.ranking_options.rerank_only_chunk` 是否仅根据 chunk 内容计算重排分数。`true` 只根据 chunk 内容计算分;`false` 根据 chunk title + 内容一起计算排序分。 **rerank_switch** `boolean` | 开启重排 `response.created.response.tools.ranking_options.rerank_switch` 是否自动对检索结果做 rerank。若设置为 `true`,则会自动请求 rerank 模型排序。 **retrieve_count** `integer` | 重排切片数 `response.created.response.tools.ranking_options.retrieve_count` 进入重排的切片数量。 > **注意** > > * 仅在 `rerank_switch` 为 `true` 时生效。 > * `retrieve_count` 需要大于等于 `limit`,否则会抛出错误。 豆包助手 `object` 豆包助手工具,让模型使用豆包的聊天、深度思考、AI 搜索和推理搜索能力。 **feature** `object` | 功能配置 `response.created.response.tools.feature` 豆包助手的子功能配置,用于按需开启聊天、深度思考、AI 搜索、推理搜索四类能力并设置对应角色描述。 **ai_search** `object` | AI 搜索 `response.created.response.tools.feature.ai_search` AI 搜索功能配置。 **role_description** `string` | 角色描述 `response.created.response.tools.feature.ai_search.role_description` 使用豆包助手时修改角色设定。默认值:`你的名字是豆包,有很强的专业性。` > **注意** > > 此字段与 `system prompt`、`instructions` 互斥,同时配置时以本字段为准。 **type** `string` | 开关 `response.created.response.tools.feature.ai_search.type` 功能开关。可选值:`enabled`、`disabled`。 **chat** `object` | 普通聊天 `response.created.response.tools.feature.chat` 普通聊天功能配置。 **role_description** `string` | 角色描述 `response.created.response.tools.feature.chat.role_description` 使用豆包助手时修改角色设定。默认值:`你的名字是豆包,有很强的专业性。` > **注意** > > 此字段与 `system prompt`、`instructions` 互斥,同时配置时以本字段为准。 **type** `string` | 开关 `response.created.response.tools.feature.chat.type` 功能开关。可选值:`enabled`、`disabled`。 **deep_chat** `object` | 深度聊天 `response.created.response.tools.feature.deep_chat` 深度聊天功能配置。 **role_description** `string` | 角色描述 `response.created.response.tools.feature.deep_chat.role_description` 使用豆包助手时修改角色设定。默认值:`你的名字是豆包,有很强的专业性。` > **注意** > > 此字段与 `system prompt`、`instructions` 互斥,同时配置时以本字段为准。 **type** `string` | 开关 `response.created.response.tools.feature.deep_chat.type` 功能开关。可选值:`enabled`、`disabled`。 **reasoning_search** `object` | 推理搜索 `response.created.response.tools.feature.reasoning_search` 推理搜索功能配置。 **role_description** `string` | 角色描述 `response.created.response.tools.feature.reasoning_search.role_description` 使用豆包助手时修改角色设定。默认值:`你的名字是豆包,有很强的专业性。` > **注意** > > 此字段与 `system prompt`、`instructions` 互斥,同时配置时以本字段为准。 **type** `string` | 开关 `response.created.response.tools.feature.reasoning_search.type` 功能开关。可选值:`enabled`、`disabled`。 **type** `string` | 类型 `response.created.response.tools.type` 工具类型,此处固定为 `doubao_app` **user_location** `object` | 用户位置 `response.created.response.tools.user_location` 用户地理位置信息,用于搜索优化。 **type** `string` | 类型 `response.created.response.tools.user_location.type` 位置类型。 取值固定为 `approximate`。 **city** `string` | 城市 `response.created.response.tools.user_location.city` 用户所在城市。 **country** `string` | 国家 `response.created.response.tools.user_location.country` 用户所在国家。 **region** `string` | 地区 `response.created.response.tools.user_location.region` 用户所在地区。 **timezone** `number` | 时区 `response.created.response.tools.user_location.timezone` 用户所在时区。 **top_p** `number` | 采样阈值 `response.created.response.top_p` 本次请求实际使用的核采样概率阈值。 **usage** `object` | 用量统计 `response.created.response.usage` 本次响应的 token 用量统计,包含输入、输出与总计 token 数等明细。 **input_tokens** `integer` | 输入 token 数 `response.created.response.usage.input_tokens` 输入消耗的 token 数量。 **input_tokens_details** `object` | 输入明细 `response.created.response.usage.input_tokens_details` 输入 token 用量明细。 **cached_tokens** `integer` | 缓存 token `response.created.response.usage.input_tokens_details.cached_tokens` 命中缓存的 token 数量。 **audio_cached_tokens** `integer` | 音频缓存 Token 数 `response.created.response.usage.input_tokens_details.audio_cached_tokens` 缓存命中的音频输入内容所消耗的 token 数量。仅在隐式缓存模式且命中音频缓存时返回;开启显式缓存时该字段不返回。 **audio_tokens** `integer` | 音频 token `response.created.response.usage.input_tokens_details.audio_tokens` 音频输入消耗的 token 数量。 **output_tokens** `integer` | 输出 token 数 `response.created.response.usage.output_tokens` 输出消耗的 token 数量。 **output_tokens_details** `object` | 输出明细 `response.created.response.usage.output_tokens_details` 输出 token 用量明细。 **reasoning_tokens** `integer` | 思考 token `response.created.response.usage.output_tokens_details.reasoning_tokens` 深度思考消耗的 token 数量。 **total_tokens** `integer` | 总 token 数 `response.created.response.usage.total_tokens` 本次请求消耗的 token 总数。 **tool_usage** `object` | 工具用量 `response.created.response.usage.tool_usage` 工具调用用量统计。 **doubao_app** `integer` | 豆包次数 `response.created.response.usage.tool_usage.doubao_app` 豆包助手工具调用次数。 **knowledge_search** `integer` | 知识库次数 `response.created.response.usage.tool_usage.knowledge_search` 知识库搜索工具调用次数。 **mcp** `integer` | MCP 次数 `response.created.response.usage.tool_usage.mcp` MCP 工具调用次数。 **web_search** `integer` | 搜索次数 `response.created.response.usage.tool_usage.web_search` 联网搜索工具调用次数。 **tool_usage_details** `object` | 工具明细 `response.created.response.usage.tool_usage_details` 工具调用用量明细。 **doubao_app** `object` | 豆包明细 `response.created.response.usage.tool_usage_details.doubao_app` 豆包助手工具用量明细。 **knowledge_search** `object` | 知识库明细 `response.created.response.usage.tool_usage_details.knowledge_search` 知识库搜索工具用量明细。 **mcp** `object` | MCP 明细 `response.created.response.usage.tool_usage_details.mcp` MCP 工具用量明细。 **web_search** `object` | 搜索明细 `response.created.response.usage.tool_usage_details.web_search` 联网搜索工具用量明细。 **sequence_number** `integer` | 序列号 `response.created.sequence_number` 事件的序列号。 **type** `string` | 事件类型 `response.created.type` 事件的类型,总是 `response.created` ### response.in_progress > 当响应在进程中触发的事件。 **response** `object` | 响应对象 `response.in_progress.response` 进行中状态的响应。包含参数与非流式调用返回的参数一致。 **created_at** `integer` | 创建时间戳 `response.in_progress.response.created_at` 该 Response 创建时的 Unix 时间戳(单位:秒)。 **id** `string` | 响应 ID `response.in_progress.response.id` 本次 Response 的唯一标识,可用于后续查询、续接或删除该响应。 **model** `string` | 模型 ID `response.in_progress.response.model` 生成本次响应所使用的模型标识,回显请求中的 model 字段。 **object** `string` | 对象类型 `response.in_progress.response.object` 返回对象的类型标识,用于区分响应对象种类。 取值固定为 `response`。 **output** `object[]` | 输出内容 `response.in_progress.response.output` 模型本次响应产出的 Item 列表,按生成顺序排列,可能包含消息、工具调用、推理等不同类型条目。 消息输出 `object` 模型生成的消息输出,包含文本内容。 **content** `object[]` | 输出内容 `response.in_progress.response.output.content` 输出内容列表。 模型回答文本 `object` 模型生成的最终回答文本。 **type** `string` | 类型 `response.in_progress.response.output.content.type` 内容类型判别字段,用于区分 union 变体。 取值固定为 `output_text`。 **annotations** `object[]` | 标注列表 `response.in_progress.response.output.content.annotations` 文本附带的标注信息列表(如引用来源等) 网页引用 `object` 引用自互联网网页的标注信息。 **title** `string` | 标题 `response.in_progress.response.output.content.annotations.title` 引用网页的标题。 **type** `string` | 类型 `response.in_progress.response.output.content.annotations.type` 标注类型的判别字段(discriminator)。 取值固定为 `url_citation`。 **url** `string` | 网址 `response.in_progress.response.output.content.annotations.url` 引用网页的 URL 地址。 **cover_image** `object` | 封面图 `response.in_progress.response.output.content.annotations.cover_image` 网页封面图片信息。 **height** `integer` | 高度 `response.in_progress.response.output.content.annotations.cover_image.height` 封面图片高度(像素) **url** `string` | 图片地址 `response.in_progress.response.output.content.annotations.cover_image.url` 封面图片的 URL 地址。 **width** `integer` | 宽度 `response.in_progress.response.output.content.annotations.cover_image.width` 封面图片宽度(像素) **freshness_info** `string` | 新鲜度 `response.in_progress.response.output.content.annotations.freshness_info` 内容新鲜度信息。 **logo_url** `string` | Logo 地址 `response.in_progress.response.output.content.annotations.logo_url` 网站 Logo 图标地址。 **mobile_url** `string` | 移动端地址 `response.in_progress.response.output.content.annotations.mobile_url` 移动端访问地址。 **publish_time** `string` | 发布时间 `response.in_progress.response.output.content.annotations.publish_time` 网页发布时间。 **site_name** `string` | 站点名 `response.in_progress.response.output.content.annotations.site_name` 站点名称。 **summary** `string` | 摘要 `response.in_progress.response.output.content.annotations.summary` 网页内容摘要。 文档引用 `object` 引用自私域知识库文档的标注信息。 **type** `string` | 类型 `response.in_progress.response.output.content.annotations.type` 标注类型。 取值固定为 `doc_citation`。 **chunk_attachment** `object[]` | 分块附件 `response.in_progress.response.output.content.annotations.chunk_attachment` 引用分块附带的附件信息列表。 **chunk_id** `integer` | 分块 ID `response.in_progress.response.output.content.annotations.chunk_id` 引用文档分块的 ID。 **doc_id** `string` | 文档 ID `response.in_progress.response.output.content.annotations.doc_id` 引用文档的 ID。 **doc_name** `string` | 文档名 `response.in_progress.response.output.content.annotations.doc_name` 引用文档的名称。 **text** `string` | 文本内容 `response.in_progress.response.output.content.text` 模型生成的文本内容。 模型思维链文本 `object` 模型生成的思维链文本。 **type** `string` | 类型 `response.in_progress.response.output.content.type` 内容类型标识,用于区分 union 变体。 取值固定为 `reasoning_text`。 **annotations** `object[]` | 标注列表 `response.in_progress.response.output.content.annotations` 思维链附带的标注信息列表。 网页引用 `object` 引用自互联网网页的标注信息。 **title** `string` | 标题 `response.in_progress.response.output.content.annotations.title` 引用网页的标题。 **type** `string` | 类型 `response.in_progress.response.output.content.annotations.type` 标注类型的判别字段(discriminator)。 取值固定为 `url_citation`。 **url** `string` | 网址 `response.in_progress.response.output.content.annotations.url` 引用网页的 URL 地址。 **cover_image** `object` | 封面图 `response.in_progress.response.output.content.annotations.cover_image` 网页封面图片信息。 **height** `integer` | 高度 `response.in_progress.response.output.content.annotations.cover_image.height` 封面图片高度(像素) **url** `string` | 图片地址 `response.in_progress.response.output.content.annotations.cover_image.url` 封面图片的 URL 地址。 **width** `integer` | 宽度 `response.in_progress.response.output.content.annotations.cover_image.width` 封面图片宽度(像素) **freshness_info** `string` | 新鲜度 `response.in_progress.response.output.content.annotations.freshness_info` 内容新鲜度信息。 **logo_url** `string` | Logo 地址 `response.in_progress.response.output.content.annotations.logo_url` 网站 Logo 图标地址。 **mobile_url** `string` | 移动端地址 `response.in_progress.response.output.content.annotations.mobile_url` 移动端访问地址。 **publish_time** `string` | 发布时间 `response.in_progress.response.output.content.annotations.publish_time` 网页发布时间。 **site_name** `string` | 站点名 `response.in_progress.response.output.content.annotations.site_name` 站点名称。 **summary** `string` | 摘要 `response.in_progress.response.output.content.annotations.summary` 网页内容摘要。 文档引用 `object` 引用自私域知识库文档的标注信息。 **type** `string` | 类型 `response.in_progress.response.output.content.annotations.type` 标注类型。 取值固定为 `doc_citation`。 **chunk_attachment** `object[]` | 分块附件 `response.in_progress.response.output.content.annotations.chunk_attachment` 引用分块附带的附件信息列表。 **chunk_id** `integer` | 分块 ID `response.in_progress.response.output.content.annotations.chunk_id` 引用文档分块的 ID。 **doc_id** `string` | 文档 ID `response.in_progress.response.output.content.annotations.doc_id` 引用文档的 ID。 **doc_name** `string` | 文档名 `response.in_progress.response.output.content.annotations.doc_name` 引用文档的名称。 **text** `string` | 文本内容 `response.in_progress.response.output.content.text` 模型思维链文本内容。 **id** `string` | 条目 ID `response.in_progress.response.output.id` 输出条目唯一标识。 **role** `string` | 角色 `response.in_progress.response.output.role` 消息发送者的角色。 取值固定为 `assistant`。 **status** `string` | 状态 `response.in_progress.response.output.status` 消息输出条目的当前状态。 * `completed`:消息已生成完毕。 * `in_progress`:消息正在生成中(流式场景)。 * `incomplete`:消息未完整生成(例如达到 `max_output_tokens` 上限)。 * `failed`:消息生成失败。 **type** `string` | 类型 `response.in_progress.response.output.type` 输出条目的类型标识。 取值固定为 `message`。 **partial** `boolean` | 增量片段 `response.in_progress.response.output.partial` 是否为流式增量片段。 **phase** `string` | 消息阶段 `response.in_progress.response.output.phase` 标记 assistant 消息属于中间讲解还是最终回答。在回放 assistant 历史消息时,建议保留并原样回传该字段。可选值:`commentary`、`final_answer`。 函数调用输出 `object` 模型发起的函数调用请求。 **type** `string` | 类型 `response.in_progress.response.output.type` 输出条目类型标识,用于区分 OutputItem 变体。 取值固定为 `function_call`。 **arguments** `string` | 参数 `response.in_progress.response.output.arguments` 函数参数的 JSON 字符串。 **call_id** `string` | 调用 ID `response.in_progress.response.output.call_id` 函数调用的唯一标识 ID,用于将该 function_call 输出与后续回传的 function_call_output 关联匹配。 **id** `string` | 条目 ID `response.in_progress.response.output.id` 输出条目唯一标识。 **name** `string` | 函数名 `response.in_progress.response.output.name` 调用的函数名称。 **status** `string` | 状态 `response.in_progress.response.output.status` 函数调用条目的当前状态。 * `completed`:函数调用请求已生成完毕。 * `in_progress`:函数调用请求正在生成中(流式场景)。 * `incomplete`:函数调用请求未完整生成(例如达到 `max_output_tokens` 上限)。 * `failed`:函数调用生成失败。 思维链输出 `object` 模型的深度思考过程输出。 **status** `string` | 状态 `response.in_progress.response.output.status` 推理条目的处理状态,用于判断思维链是否生成完成。可选值:`completed`、`failed`、`in_progress`、`incomplete`。 **summary** `object[]` | 推理摘要 `response.in_progress.response.output.summary` 推理摘要内容列表。 **type** `string` | 类型 `response.in_progress.response.output.summary.type` 摘要片段类型标识。 取值固定为 `summary_text`。 **text** `string` | 摘要文本 `response.in_progress.response.output.summary.text` 思维链摘要文本内容。 **type** `string` | 类型 `response.in_progress.response.output.type` 输出条目类型标识,用于区分 OutputItem 变体。 取值固定为 `reasoning`。 **content** `object[]` | 推理内容 `response.in_progress.response.output.content` 思维链推理过程的内容元素列表。 模型回答文本 `object` 模型生成的最终回答文本。 **type** `string` | 类型 `response.in_progress.response.output.content.type` 内容类型判别字段,用于区分 union 变体。 取值固定为 `output_text`。 **annotations** `object[]` | 标注列表 `response.in_progress.response.output.content.annotations` 文本附带的标注信息列表(如引用来源等) 网页引用 `object` 引用自互联网网页的标注信息。 **title** `string` | 标题 `response.in_progress.response.output.content.annotations.title` 引用网页的标题。 **type** `string` | 类型 `response.in_progress.response.output.content.annotations.type` 标注类型的判别字段(discriminator)。 取值固定为 `url_citation`。 **url** `string` | 网址 `response.in_progress.response.output.content.annotations.url` 引用网页的 URL 地址。 **cover_image** `object` | 封面图 `response.in_progress.response.output.content.annotations.cover_image` 网页封面图片信息。 **height** `integer` | 高度 `response.in_progress.response.output.content.annotations.cover_image.height` 封面图片高度(像素) **url** `string` | 图片地址 `response.in_progress.response.output.content.annotations.cover_image.url` 封面图片的 URL 地址。 **width** `integer` | 宽度 `response.in_progress.response.output.content.annotations.cover_image.width` 封面图片宽度(像素) **freshness_info** `string` | 新鲜度 `response.in_progress.response.output.content.annotations.freshness_info` 内容新鲜度信息。 **logo_url** `string` | Logo 地址 `response.in_progress.response.output.content.annotations.logo_url` 网站 Logo 图标地址。 **mobile_url** `string` | 移动端地址 `response.in_progress.response.output.content.annotations.mobile_url` 移动端访问地址。 **publish_time** `string` | 发布时间 `response.in_progress.response.output.content.annotations.publish_time` 网页发布时间。 **site_name** `string` | 站点名 `response.in_progress.response.output.content.annotations.site_name` 站点名称。 **summary** `string` | 摘要 `response.in_progress.response.output.content.annotations.summary` 网页内容摘要。 文档引用 `object` 引用自私域知识库文档的标注信息。 **type** `string` | 类型 `response.in_progress.response.output.content.annotations.type` 标注类型。 取值固定为 `doc_citation`。 **chunk_attachment** `object[]` | 分块附件 `response.in_progress.response.output.content.annotations.chunk_attachment` 引用分块附带的附件信息列表。 **chunk_id** `integer` | 分块 ID `response.in_progress.response.output.content.annotations.chunk_id` 引用文档分块的 ID。 **doc_id** `string` | 文档 ID `response.in_progress.response.output.content.annotations.doc_id` 引用文档的 ID。 **doc_name** `string` | 文档名 `response.in_progress.response.output.content.annotations.doc_name` 引用文档的名称。 **text** `string` | 文本内容 `response.in_progress.response.output.content.text` 模型生成的文本内容。 模型思维链文本 `object` 模型生成的思维链文本。 **type** `string` | 类型 `response.in_progress.response.output.content.type` 内容类型标识,用于区分 union 变体。 取值固定为 `reasoning_text`。 **annotations** `object[]` | 标注列表 `response.in_progress.response.output.content.annotations` 思维链附带的标注信息列表。 网页引用 `object` 引用自互联网网页的标注信息。 **title** `string` | 标题 `response.in_progress.response.output.content.annotations.title` 引用网页的标题。 **type** `string` | 类型 `response.in_progress.response.output.content.annotations.type` 标注类型的判别字段(discriminator)。 取值固定为 `url_citation`。 **url** `string` | 网址 `response.in_progress.response.output.content.annotations.url` 引用网页的 URL 地址。 **cover_image** `object` | 封面图 `response.in_progress.response.output.content.annotations.cover_image` 网页封面图片信息。 **height** `integer` | 高度 `response.in_progress.response.output.content.annotations.cover_image.height` 封面图片高度(像素) **url** `string` | 图片地址 `response.in_progress.response.output.content.annotations.cover_image.url` 封面图片的 URL 地址。 **width** `integer` | 宽度 `response.in_progress.response.output.content.annotations.cover_image.width` 封面图片宽度(像素) **freshness_info** `string` | 新鲜度 `response.in_progress.response.output.content.annotations.freshness_info` 内容新鲜度信息。 **logo_url** `string` | Logo 地址 `response.in_progress.response.output.content.annotations.logo_url` 网站 Logo 图标地址。 **mobile_url** `string` | 移动端地址 `response.in_progress.response.output.content.annotations.mobile_url` 移动端访问地址。 **publish_time** `string` | 发布时间 `response.in_progress.response.output.content.annotations.publish_time` 网页发布时间。 **site_name** `string` | 站点名 `response.in_progress.response.output.content.annotations.site_name` 站点名称。 **summary** `string` | 摘要 `response.in_progress.response.output.content.annotations.summary` 网页内容摘要。 文档引用 `object` 引用自私域知识库文档的标注信息。 **type** `string` | 类型 `response.in_progress.response.output.content.annotations.type` 标注类型。 取值固定为 `doc_citation`。 **chunk_attachment** `object[]` | 分块附件 `response.in_progress.response.output.content.annotations.chunk_attachment` 引用分块附带的附件信息列表。 **chunk_id** `integer` | 分块 ID `response.in_progress.response.output.content.annotations.chunk_id` 引用文档分块的 ID。 **doc_id** `string` | 文档 ID `response.in_progress.response.output.content.annotations.doc_id` 引用文档的 ID。 **doc_name** `string` | 文档名 `response.in_progress.response.output.content.annotations.doc_name` 引用文档的名称。 **text** `string` | 文本内容 `response.in_progress.response.output.content.text` 模型思维链文本内容。 **encrypted_content** `string` | 加密思维链 `response.in_progress.response.output.encrypted_content` 思考内容加密原文。经加密及压缩处理后的思考内容原文。 相关文档: * [关键规则](/docs/agent-model-invocation-practice#key-rules) * [回传思考内容加密块使用示例](/docs/agent-model-invocation-practice#encrypted-thinking-block-examples) > **说明** > > 流式输出场景下,思考内容加密原文通过 `response.output_item.added`、`response.output_item.done`、`response.completed` 等相关事件下发,需要按事件中 `encrypted_content` 字段非空过滤获取。 **模型支持**: * `doubao-seed-2-0-lite-260428 及后续版本` **id** `string` | 条目 ID `response.in_progress.response.output.id` 输出条目唯一标识。 语音转写输出 `object` 模型返回的语音转写输出。 **status** `string` | 状态 `response.in_progress.response.output.status` 语音转写条目的当前状态。 * `completed`:转写已生成完毕。 * `in_progress`:转写正在生成中(流式场景)。 * `incomplete`:转写未完整生成(例如达到输出上限而截断)。 * `failed`:转写生成失败。 **type** `string` | 类型 `response.in_progress.response.output.type` 输出条目类型标识。 取值固定为 `transcription`。 **id** `string` | 条目 ID `response.in_progress.response.output.id` 输出条目唯一标识。 **transcription** `object[]` | 转写内容 `response.in_progress.response.output.transcription` 语音转写结果片段列表。 **type** `string` | 类型 `response.in_progress.response.output.transcription.type` 转写片段类型。 取值固定为 `transcription_text`。 **chunks** `object[]` | 音频小段 `response.in_progress.response.output.transcription.chunks` 当前片段对应的音频小段列表。 **end_time** `integer` | 结束时间 `response.in_progress.response.output.transcription.chunks.end_time` 片段结束时间(毫秒) **start_time** `integer` | 开始时间 `response.in_progress.response.output.transcription.chunks.start_time` 片段开始时间(毫秒) **text** `string` | 文字内容 `response.in_progress.response.output.transcription.chunks.text` 当前片段对应的文字内容。 **text** `string` | 转写文本 `response.in_progress.response.output.transcription.text` 当前片段的转写文本。 网页搜索调用 `object` 模型发起的网页搜索调用记录。 **id** `string` | 条目 ID `response.in_progress.response.output.id` 输出条目唯一标识。 **status** `string` | 状态 `response.in_progress.response.output.status` 网页搜索调用的当前状态。可选值:`in_progress`、`searching`、`completed`、`incomplete`、`failed`。 **type** `string` | 类型 `response.in_progress.response.output.type` 输出条目类型标识,用于区分 OutputItem 变体。 取值固定为 `web_search_call`。 **action** `object` | 搜索动作 `response.in_progress.response.output.action` 描述模型执行的网页搜索动作,包括搜索类型与查询关键字。 **query** `string` | 查询语句 `response.in_progress.response.output.action.query` 模型实际发起的搜索查询语句。 **type** `string` | 类型 `response.in_progress.response.output.action.type` 网页搜索动作的类型标识。 取值固定为 `search`。 **queries** `string[]` | 查询语句列表 `response.in_progress.response.output.action.queries` 本次网页搜索产生的查询语句列表。 图像处理调用 `object` 模型发起的图像处理调用记录。 **id** `string` | 条目 ID `response.in_progress.response.output.id` 输出条目唯一标识。 **status** `string` | 状态 `response.in_progress.response.output.status` 图像处理调用的当前状态。 * `completed`:图像处理已完成。 * `in_progress`:图像处理正在执行中。 * `incomplete`:图像处理未完整执行(例如被中断或截断)。 * `failed`:图像处理执行失败,具体原因见 `error` 字段。 **type** `string` | 类型 `response.in_progress.response.output.type` 输出条目类型标识,用于区分 OutputItem 变体。 取值固定为 `image_process`。 **action** `object` | 处理动作 `response.in_progress.response.output.action` 图像处理动作详情。 **type** `string` | 类型 `response.in_progress.response.output.action.type` 图像处理动作类型。 **result_image_url** `string` | 结果图地址 `response.in_progress.response.output.action.result_image_url` 处理后图像的 URL 地址。 **arguments** `object` | 处理参数 `response.in_progress.response.output.arguments` 图像处理动作的输入参数,以键值对形式承载具体处理选项。 **error** `object` | 图像处理错误 `response.in_progress.response.output.error` 图像处理失败时的错误信息。 **message** `string` | 错误描述 `response.in_progress.response.output.error.message` 错误的可读描述。 MCP 审批请求 `object` MCP 工具调用前的审批请求记录。 **arguments** `string` | 调用参数 `response.in_progress.response.output.arguments` 工具调用参数的 JSON 字符串。 **name** `string` | 工具名 `response.in_progress.response.output.name` 待运行的工具名称。 **server_label** `string` | 服务标签 `response.in_progress.response.output.server_label` 发起请求的 MCP Server 标签。 **type** `string` | 类型 `response.in_progress.response.output.type` 输出项类型标识符,用于区分 OutputItem 的变体。 取值固定为 `mcp_approval_request`。 **id** `string` | 请求 ID `response.in_progress.response.output.id` 审批请求的唯一 ID。 MCP 工具清单 `object` MCP Server 提供的工具清单输出。 **server_label** `string` | 服务标签 `response.in_progress.response.output.server_label` MCP Server 标签。 **type** `string` | 类型 `response.in_progress.response.output.type` 输出项类型标识。 取值固定为 `mcp_list_tools`。 **error** `string` | 错误信息 `response.in_progress.response.output.error` 当 MCP Server 无法返回工具列表时的错误信息。 **id** `string` | 列表 ID `response.in_progress.response.output.id` 工具列表的唯一 ID。 **tools** `object[]` | 工具列表 `response.in_progress.response.output.tools` 该 MCP Server 上可用的工具列表。 **name** `string` | 工具名 `response.in_progress.response.output.tools.name` 工具名称。 **annotations** `object` | 注解信息 `response.in_progress.response.output.tools.annotations` 工具的附加注解信息。 **description** `string` | 工具描述 `response.in_progress.response.output.tools.description` 工具的功能描述。 **input_schema** `object` | 入参 Schema `response.in_progress.response.output.tools.input_schema` 描述工具入参的 JSON Schema。 MCP 工具调用 `object` 模型对 MCP 工具的实际调用记录及结果。 **name** `string` | 工具名 `response.in_progress.response.output.name` 实际运行的工具名称。 **server_label** `string` | 服务标签 `response.in_progress.response.output.server_label` 运行工具的 MCP Server 标签。 **type** `string` | 类型 `response.in_progress.response.output.type` 标识该输出项为 MCP 工具调用记录。 取值固定为 `mcp_call`。 **arguments** `string` | 调用参数 `response.in_progress.response.output.arguments` 传递给 MCP 工具的调用参数,格式为 JSON 字符串。 > **说明** > > 该字段通过 `response.mcp_call_arguments.delta` 事件流式追加,初始 `output_item.added` 事件可能不携带该字段。 **error** `string` | 错误信息 `response.in_progress.response.output.error` 工具调用失败时的错误信息。 **id** `string` | 调用 ID `response.in_progress.response.output.id` 工具调用的唯一 ID。 **output** `string` | 返回结果 `response.in_progress.response.output.output` 工具调用的返回结果。 知识库检索调用 `object` 模型发起的私域知识库检索调用记录。 **knowledge_resource_id** `string` | 知识库 ID `response.in_progress.response.output.knowledge_resource_id` 检索使用的知识库 ID。 **queries** `string[]` | 查询语句 `response.in_progress.response.output.queries` 模型实际执行的检索查询语句。 **status** `string` | 状态 `response.in_progress.response.output.status` 知识库检索调用的执行状态。可选值:`in_progress`、`searching`、`completed`、`failed`、`incomplete`。 **type** `string` | 类型 `response.in_progress.response.output.type` 输出条目类型标识,用于区分不同类型的输出条目。 取值固定为 `knowledge_search_call`。 **id** `string` | 条目 ID `response.in_progress.response.output.id` 输出条目唯一标识。 豆包应用调用 `object` 模型对豆包助手能力的调用记录。 **type** `string` | 类型 `response.in_progress.response.output.type` 输出条目类型标识。 取值固定为 `doubao_app_call`。 **blocks** `object[]` | 内容块 `response.in_progress.response.output.blocks` 豆包应用调用产出的内容块列表。 文本输出 `object` 豆包应用产出的文本输出内容块。 **type** `string` | 类型 `response.in_progress.response.output.blocks.type` 内容块类型标识符。 取值固定为 `output_text`。 **id** `string` | 块 ID `response.in_progress.response.output.blocks.id` 内容块的唯一标识。 **parent_id** `string` | 父级 ID `response.in_progress.response.output.blocks.parent_id` 所属父级条目的 ID。 **status** `string` | 状态 `response.in_progress.response.output.blocks.status` 内容块状态。 **text** `string` | 文本内容 `response.in_progress.response.output.blocks.text` 思维链文本 `object` 豆包应用产出的思维链文本内容块。 **type** `string` | 类型 `response.in_progress.response.output.blocks.type` 内容块类型标识符。 取值固定为 `reasoning_text`。 **id** `string` | 块 ID `response.in_progress.response.output.blocks.id` 内容块的唯一标识。 **parent_id** `string` | 父级 ID `response.in_progress.response.output.blocks.parent_id` 所属父级条目的 ID。 **reasoning_text** `string` | 思考文本 `response.in_progress.response.output.blocks.reasoning_text` 思维链文本内容。 **status** `string` | 状态 `response.in_progress.response.output.blocks.status` 内容块状态。 搜索过程 `object` 豆包应用 AI 搜索过程产出的内容块。 **type** `string` | 类型 `response.in_progress.response.output.blocks.type` 内容块类型标识符。 取值固定为 `search`。 **id** `string` | 块 ID `response.in_progress.response.output.blocks.id` 内容块的唯一标识。 **parent_id** `string` | 父级 ID `response.in_progress.response.output.blocks.parent_id` 所属父级条目的 ID。 **queries** `string[]` | 查询语句 `response.in_progress.response.output.blocks.queries` 搜索查询语句列表。 **results** `object[]` | 搜索结果 `response.in_progress.response.output.blocks.results` 搜索结果列表。 **text_card** `object` | 文本卡片 `response.in_progress.response.output.blocks.results.text_card` 文本卡片形式的搜索结果。 **sitename** `string` | 站点名 `response.in_progress.response.output.blocks.results.text_card.sitename` 来源站点名称。 **title** `string` | 标题 `response.in_progress.response.output.blocks.results.text_card.title` 搜索结果标题。 **url** `string` | 网址 `response.in_progress.response.output.blocks.results.text_card.url` 搜索结果 URL 地址。 **status** `string` | 状态 `response.in_progress.response.output.blocks.status` 内容块状态。 **summary** `string` | 搜索总结 `response.in_progress.response.output.blocks.summary` AI 搜索过程中对本轮搜索结果的总结性文字,概括从搜索结果中提取的核心信息。 推理搜索过程 `object` 豆包应用推理搜索过程产出的内容块。 **type** `string` | 类型 `response.in_progress.response.output.blocks.type` 内容块类型。 取值固定为 `reasoning_search`。 **id** `string` | 块 ID `response.in_progress.response.output.blocks.id` 内容块的唯一标识。 **parent_id** `string` | 父级 ID `response.in_progress.response.output.blocks.parent_id` 所属父级条目的 ID。 **queries** `string[]` | 查询语句 `response.in_progress.response.output.blocks.queries` 搜索查询语句列表。 **results** `object[]` | 搜索结果 `response.in_progress.response.output.blocks.results` 搜索结果列表。 **text_card** `object` | 文本卡片 `response.in_progress.response.output.blocks.results.text_card` 文本卡片形式的搜索结果。 **sitename** `string` | 站点名 `response.in_progress.response.output.blocks.results.text_card.sitename` 来源站点名称。 **title** `string` | 标题 `response.in_progress.response.output.blocks.results.text_card.title` 搜索结果标题。 **url** `string` | 网址 `response.in_progress.response.output.blocks.results.text_card.url` 搜索结果 URL 地址。 **status** `string` | 状态 `response.in_progress.response.output.blocks.status` 推理搜索内容块的处理状态。可选值:`in_progress`、`searching`、`completed`、`incomplete`、`failed`。 **summary** `string` | 搜索总结 `response.in_progress.response.output.blocks.summary` 推理搜索过程中对本轮搜索结果的总结性文字,概括从搜索结果中提取的核心信息。 **feature** `string` | 功能名 `response.in_progress.response.output.feature` 本次调用触发的豆包子功能名称。可选值:`chat`、`deep_chat`、`ai_search`、`reasoning_search`。 **id** `string` | 条目 ID `response.in_progress.response.output.id` 输出条目唯一标识。 **status** `string` | 状态 `response.in_progress.response.output.status` 输出状态。可选值:`completed`、`failed`、`in_progress`、`incomplete`。 智能体工具调用 `object` 模型发起的智能体工具调用记录。 **name** `string` | 工具名 `response.in_progress.response.output.name` 被调用的智能体工具名称。 **status** `string` | 状态 `response.in_progress.response.output.status` 智能体工具调用的执行状态。可选值:`completed`、`failed`、`in_progress`、`incomplete`。 **type** `string` | 类型 `response.in_progress.response.output.type` 输出条目类型标识符,用于区分 OutputItem 的 variant。 取值固定为 `agent_tool_call`。 **id** `string` | 条目 ID `response.in_progress.response.output.id` 输出条目唯一标识。 **caching** `object` | 缓存配置 `response.in_progress.response.caching` 本次响应生效的上下文缓存配置,回显请求中的 caching 设置。 **prefix** `boolean` | 仅写缓存 `response.in_progress.response.caching.prefix` 是否仅写入前缀缓存,不生成回复。`true` 只写缓存,不返回模型输出;`false` 正常生成回复并写缓存。 **type** `string` | 缓存模式 `response.in_progress.response.caching.type` 缓存模式。 * `enabled`:开启上下文缓存。 * `disabled`:关闭上下文缓存。 **context_management** `object` | 上下文管理 `response.in_progress.response.context_management` 本次响应实际执行的上下文管理编辑操作,回显请求中 context_management 生效后的结果。 **applied_edits** `object[]` | 已应用编辑 `response.in_progress.response.context_management.applied_edits` 已应用的上下文编辑结果列表。 清理工具调用 `object` 已应用的清理工具调用编辑结果。 **cleared_tool_uses** `integer` | 清理次数 `response.in_progress.response.context_management.applied_edits.cleared_tool_uses` 已清理的工具调用数量。 **type** `string` | 类型 `response.in_progress.response.context_management.applied_edits.type` 编辑类型。 取值固定为 `clear_tool_uses`。 清理思维链 `object` 已应用的清理思维链编辑结果。 **cleared_thinking_turns** `integer` | 清理轮次 `response.in_progress.response.context_management.applied_edits.cleared_thinking_turns` 已清理的思维链轮次数量。 **type** `string` | 类型 `response.in_progress.response.context_management.applied_edits.type` 编辑类型。 取值固定为 `clear_thinking`。 **error** `object` | 错误信息 `response.in_progress.response.error` 模型响应过程发生错误时的错误信息。仅当 *status* 为 `failed` 时返回。 **code** `string` | 错误码 `response.in_progress.response.error.code` **message** `string` | 错误描述 `response.in_progress.response.error.message` 错误信息的可读描述。 **expire_at** `integer` | 过期时间戳 `response.in_progress.response.expire_at` 响应储存的过期时刻 Unix 时间戳(秒),回显请求中的 expire_at 设置,对 store 与 caching 均生效。 > **说明** > > 最多保留 7 天。 **incomplete_details** `object` | 未完成详情 `response.in_progress.response.incomplete_details` 响应未能完成的详细信息。仅当 *status* 为 `incomplete` 时返回。 **reason** `string` | 原因 `response.in_progress.response.incomplete_details.reason` 响应未完成的原因。 **content_filter** `object` | 内容过滤 `response.in_progress.response.incomplete_details.content_filter` 内容过滤详情。 **details** `string` | 详情 `response.in_progress.response.incomplete_details.content_filter.details` 内容过滤命中的详细描述。 **type** `string` | 类型 `response.in_progress.response.incomplete_details.content_filter.type` 内容过滤命中的类型。 **instructions** `string` | 系统指令 `response.in_progress.response.instructions` 本次响应生效的系统指令,回显请求中的 instructions 设置。 **max_output_tokens** `integer` | 最大输出长度 `response.in_progress.response.max_output_tokens` 回显请求中的 max_output_tokens 参数,即模型输出最大 token 数(含回答与思维链)。 **max_tool_calls** `integer` | 最大工具调用轮次 `response.in_progress.response.max_tool_calls` 本次响应生效的最大工具调用轮次,回显请求中的 max_tool_calls 设置。 **metadata** `object` | 自定义元数据 `response.in_progress.response.metadata` 回显请求中的 metadata 键值对元数据。最多支持 16 对键值,key 长度不超过 64 个字符,value 长度不超过 512 个字符,服务端不会解释其中内容。 **parallel_tool_calls** `boolean` | 并行工具调用 `response.in_progress.response.parallel_tool_calls` 本次请求实际生效的并行工具调用设置,回显请求中的 parallel_tool_calls 值。 **previous_response_id** `string` | 上轮响应 ID `response.in_progress.response.previous_response_id` 回显请求中的 previous_response_id,即前一轮响应的唯一标识。仅在请求传入该字段时返回。 **prompt_cache_key** `string` | 缓存分桶键 `response.in_progress.response.prompt_cache_key` 用于提升缓存命中率的分桶键,回显请求中的 prompt_cache_key 设置。 **reasoning** `object` | 推理配置 `response.in_progress.response.reasoning` 本次响应生效的深度思考工作量配置,回显请求中的 reasoning 设置。 **effort** `string` | 思考深度 `response.in_progress.response.reasoning.effort` 限制思考的工作量。减少思考深度可提升速度,思考花费的 token 更少。 * `none`:关闭思考。 * `minimal`:关闭思考,直接回答。 * `low`:轻量思考,侧重快速响应。 * `medium`:均衡模式,兼顾速度与深度。 * `high`:深度分析,处理复杂问题。 * `xhigh`:更高程度思考。 * `max`:最高程度思考,适配高难度推理任务。 > **注意:说明** > > 支持该字段的模型、默认取值、参数兼容映射规则,以及与 `thinking.type` 字段的关系,详见 [文档](/docs/responses-api-deep-thinking#dc4c1547)。 **safety_identifier** `string` | 安全标识 `response.in_progress.response.safety_identifier` 回显请求中传入的终端用户稳定标识,用于安全策略与违规行为追踪关联。 **service_tier** `string` | 推理模式 `response.in_progress.response.service_tier` 本次请求实际使用的推理模式。 * `fast`:本次请求使用 [在线推理(低延迟)](/docs/online-inference-low-latency) 模式。 * `auto`:本次请求使用 [在线推理(TPM 保障包)](/docs/tpm-guarantee-package) 模式。 * `default`:本次请求使用 [在线推理(常规)](/docs/online-inference-standard) 模式。 * `flex`:本次请求使用 [在线推理(低优)](/docs/online-inference-flex) 模式。 **session** `object` | 会话信息 `response.in_progress.response.session` 本次响应关联的会话信息,回显请求中 session 生效后的结果。 **id** `string` | 会话 ID `response.in_progress.response.session.id` 会话的唯一 ID。 **status** `string` | 响应状态 `response.in_progress.response.status` 本次响应的当前状态,标识生成流程处于进行中、已完成、未完成或已失败等阶段。 **store** `boolean` | 是否存储 `response.in_progress.response.store` 是否储存生成的模型响应以供后续通过 API 检索,回显请求中的 store 设置。 **temperature** `number` | 采样温度 `response.in_progress.response.temperature` 本次响应生效的采样温度,回显请求中的 temperature 设置。 **text** `object` | 输出格式 `response.in_progress.response.text` 本次响应生效的输出格式定义,回显请求中的 text 设置。 **format** `object` | 输出格式 `response.in_progress.response.text.format` 文本输出格式定义。 **type** `string` | 格式类型 `response.in_progress.response.text.format.type` 输出格式类型。可选值:`text`、`json_schema`、`json_object`。 > **注意** > > `json_object` / `json_schema` 能力尚在 beta 阶段,请谨慎在生产环境使用。 **description** `string` | 格式描述 `response.in_progress.response.text.format.description` 格式描述信息。 **name** `string` | 格式名称 `response.in_progress.response.text.format.name` 格式名称,作为 JSON Schema 输出格式的标识。 > **注意** > > 仅当 *type* 为 `json_schema` 时需要提供此字段。 **schema** `object` | Schema 定义 `response.in_progress.response.text.format.schema` JSON Schema 定义。当 *type* 为 `json_schema` 时必填。 **strict** `boolean` | 严格模式 `response.in_progress.response.text.format.strict` 是否严格按 JSON Schema 校验模型输出。 > **注意** > > 仅当 *type* 为 `json_schema` 时生效。 **thinking** `object` | 深度思考 `response.in_progress.response.thinking` 本次响应生效的深度思考配置,回显请求中的 thinking 设置。 **type** `string` | 思考模式 `response.in_progress.response.thinking.type` 深度思考模式。 * `enabled`:开启深度思考。 * `disabled`:关闭深度思考。 * `auto`:由模型自行判断是否需要深度思考。 **tool_choice** `string / object` | 工具调用策略 `response.in_progress.response.tool_choice` 本次请求实际生效的工具调用策略,回显请求中的 tool_choice 设置。 > **说明** > > 未指定工具时默认值为 `none`;存在工具时默认值为 `auto`。 简单策略 `string` 直接传入字符串 `none`、`auto` 或 `required`,控制工具调用整体策略。 指定工具 `object` 通过对象指定具体工具类型或工具名进行调用。 **type** `string` | 工具类型 `response.in_progress.response.tool_choice.type` 指定要调用的工具类型,用于精确路由到对应工具。可选值: * `function` * `web_search` * `image_process` * `mcp` * `knowledge_search` * `doubao_app` **name** `string` | 工具名称 `response.in_progress.response.tool_choice.name` 指定要调用的具体工具名,如函数名或 MCP 服务下的工具名。 **tools** `object[]` | 工具列表 `response.in_progress.response.tools` 本次响应生效的工具列表,回显请求中的 tools 设置。 函数调用 `object` 自定义函数调用(Function Calling),让模型生成结构化的函数参数。 **name** `string` | 函数名 `response.in_progress.response.tools.name` 供模型调用的函数名称,模型在 function_call 输出中以该名称回传,用于匹配对应函数。 **type** `string` | 类型 `response.in_progress.response.tools.type` 工具类型标识,用于在 union 中区分不同工具类别。 取值固定为 `function`。 **description** `string` | 函数描述 `response.in_progress.response.tools.description` 函数的描述信息,帮助模型理解何时使用该函数。 **parameters** `object` | 参数定义 `response.in_progress.response.tools.parameters` 函数参数定义,遵循 JSON Schema 格式。 联网搜索 `object` 联网搜索工具,让模型在需要时自动进行网页搜索获取实时信息。 **type** `string` | 类型 `response.in_progress.response.tools.type` 工具类型标识,用于区分 Tool 的不同变体。 取值固定为 `web_search`。 **limit** `integer` | 最大结果数 `response.in_progress.response.tools.limit` 每轮搜索最大返回结果数量。 > **说明** > > 单次搜索最多返回 20 条;单轮可能有多次搜索,最终召回条数受此参数限制影响。 **取值范围**:`[1, 50]` **max_keyword** `integer` | 最大关键词数 `response.in_progress.response.tools.max_keyword` 最大并行搜索关键词数量。 **取值范围**:`[1, 50]` **sources** `string[]` | 搜索来源 `response.in_progress.response.tools.sources` 搜索信息来源限制,指定模型可从哪些渠道检索网页内容。可选值:`toutiao`、`douyin`、`moji`、`search_engine`、`doubao`。 > **说明** > > `doubao` 不能与其他搜索来源同时配置。传入 `["doubao"]` 时,`tools.limit`、`tools.max_keyword`、`tools.user_location` 均不生效,向它们传入的值将被忽略。 **user_location** `object` | 用户位置 `response.in_progress.response.tools.user_location` 用户地理位置信息,用于搜索优化。 **type** `string` | 类型 `response.in_progress.response.tools.user_location.type` 位置类型。 取值固定为 `approximate`。 **city** `string` | 城市 `response.in_progress.response.tools.user_location.city` 用户所在城市。 **country** `string` | 国家 `response.in_progress.response.tools.user_location.country` 用户所在国家。 **region** `string` | 地区 `response.in_progress.response.tools.user_location.region` 用户所在地区。 **timezone** `number` | 时区 `response.in_progress.response.tools.user_location.timezone` 用户所在时区。 图像处理 `object` 图像处理工具,让模型对图片进行画点、选区、缩放、旋转等操作。 **type** `string` | 类型 `response.in_progress.response.tools.type` 工具类型标识,用于区分 Tool 的不同变体。 取值固定为 `image_process`。 **grounding** `object` | 选区功能 `response.in_progress.response.tools.grounding` 选区/裁切功能配置,启用后模型可返回图像中目标的检测框或裁切区域坐标。 **type** `string` | 开关 `response.in_progress.response.tools.grounding.type` 功能开关。可选值:`enabled`、`disabled`。 **point** `object` | 画点功能 `response.in_progress.response.tools.point` 画点/画线功能开关。 **type** `string` | 开关 `response.in_progress.response.tools.point.type` 功能开关。可选值:`enabled`、`disabled`。 **rotate** `object` | 旋转功能 `response.in_progress.response.tools.rotate` 旋转功能开关。启用后模型可请求对图片按指定角度进行旋转。 > **注意** > > 旋转角度支持范围为 0-359 度。 **type** `string` | 开关 `response.in_progress.response.tools.rotate.type` 功能开关。可选值:`enabled`、`disabled`。 **zoom** `object` | 缩放功能 `response.in_progress.response.tools.zoom` 缩放功能开关,启用后模型可对图像目标区域执行缩放操作。 > **说明** > > 缩放倍率支持范围 0.5-2.0 倍。 **type** `string` | 开关 `response.in_progress.response.tools.zoom.type` 功能开关。可选值:`enabled`、`disabled`。 MCP 工具 `object` MCP(Model Context Protocol)工具,让模型调用外部 MCP Server 提供的工具。 **server_label** `string` | 服务标签 `response.in_progress.response.tools.server_label` MCP Server 的唯一标识标签。模型在工具调用输出中通过该标签指向对应 Server,便于在多个 MCP Server 场景下区分调用来源。 **server_url** `string` | 服务地址 `response.in_progress.response.tools.server_url` MCP Server 的 HTTP(S) 访问地址,模型通过该地址向 Server 发起工具调用请求。 **type** `string` | 类型 `response.in_progress.response.tools.type` 工具类型标识,用于区分 Tool 的不同变体。 取值固定为 `mcp`。 **allowed_tools** `string[] / object` | 允许工具 `response.in_progress.response.tools.allowed_tools` 允许模型调用的工具范围。可传工具名称字符串数组,或包含 `tool_names` 字段的过滤器对象。 工具名数组 `string[]` 直接传入允许调用的工具名称数组。 工具过滤器 `object` 通过过滤器对象指定允许调用的工具范围。 **tool_names** `string[]` | 工具名列表 `response.in_progress.response.tools.allowed_tools.tool_names` 允许调用的工具名称列表。 **headers** `object` | 请求头 `response.in_progress.response.tools.headers` 调用 MCP Server 时附加的 HTTP 请求头,以字符串键值对形式指定 header 名与值。 > **说明** > > * 常用于传递鉴权信息(如 `Authorization`)。 > * `Authorization` 字段不会被服务端存储。 **require_approval** `string / object` | 审批策略 `response.in_progress.response.tools.require_approval` MCP 工具调用前的审批策略;支持简单模式(字符串)或按工具粒度控制(过滤器对象)。 简单策略 `string` 直接传入字符串 `always` 或 `never`,对所有工具应用统一审批策略。 工具过滤器 `object` 通过过滤器对象按工具粒度配置审批策略。 **always** `object` | 始终审批 `response.in_progress.response.tools.require_approval.always` 始终需要审批的工具过滤器。 **tool_names** `string[]` | 工具名列表 `response.in_progress.response.tools.require_approval.always.tool_names` 始终需要审批的工具名称列表。 **never** `object` | 无需审批 `response.in_progress.response.tools.require_approval.never` 无需审批的工具过滤器。 **tool_names** `string[]` | 工具名列表 `response.in_progress.response.tools.require_approval.never.tool_names` 无需审批即可调用的工具名称列表。 **server_description** `string` | 服务描述 `response.in_progress.response.tools.server_description` MCP Server 的描述信息,帮助模型理解何时使用该 Server。 知识库搜索 `object` 私域知识库搜索工具,让模型检索企业内部知识库中的文档内容。 **knowledge_resource_id** `string` | 知识库 ID `response.in_progress.response.tools.knowledge_resource_id` **type** `string` | 类型 `response.in_progress.response.tools.type` 工具类型标识,用于区分 Tool 的不同变体。 取值固定为 `knowledge_search`。 **dense_weight** `number` | 稠密权重 `response.in_progress.response.tools.dense_weight` 混合检索中稠密向量(语义)检索的权重,值越大越偏向语义匹配,越小越偏向关键词匹配。 > **说明** > > 仅在混合检索(索引算法为 `hnsw_hybrid`)下生效。 **取值范围**:`[0.2, 1]` **description** `string` | 知识库描述 `response.in_progress.response.tools.description` 知识库描述信息,帮助模型理解何时使用该知识库。 **doc_filter** `object` | 文档过滤 `response.in_progress.response.tools.doc_filter` 设置文档字段级别的检索过滤条件,确保只在符合条件的文档中检索。 > **说明** > > * 支持用作过滤条件的文档字段: > * 系统字段:`doc_id`(仅手动创建的知识库)、`_sys_auto_doc_id`(手动 + API 创建均适用) > * 自定义字段:已为知识库文档添加的**文档标签**(对应知识库 `index_config.fields` 中的 `field`) > * 支持单一条件过滤和多条件组合过滤(支持 `And` / `Or` 逻辑运算)。 > * 详细使用方式和支持字段参见 [filter 表达式](https://docs.volcengine.com/docs/84313/1419289?lang=zh#filter-%E8%A1%A8%E8%BE%BE%E5%BC%8F)。 > * 若自定义字段类型为 `Boolean`,取值范围是 `True` / `False`,大小写规则:cURL 用 `true` / `false`,Python 用 `True` / `False`。 **limit** `integer` | 最大结果数 `response.in_progress.response.tools.limit` 最大搜索结果数量。 **取值范围**:`[1, 200]` **max_keyword** `integer` | 最大关键词数 `response.in_progress.response.tools.max_keyword` 最大并行搜索关键词数量。 **取值范围**:`[1, 50]` **ranking_options** `object` | 排序选项 `response.in_progress.response.tools.ranking_options` 检索后处理选项。可参考 [知识库 API 文档](https://docs.volcengine.com/docs/84313/1350012?lang=zh) `post_processing` 字段。 **chunk_diffusion_count** `integer` | 切片扩散数 `response.in_progress.response.tools.ranking_options.chunk_diffusion_count` 检索阶段返回命中切片的上下几片邻近切片。取 `0` 表示不进行 chunk diffusion。 **取值范围**:`[0, 5]` **chunk_group** `boolean` | 文本聚合 `response.in_progress.response.tools.ranking_options.chunk_group` 文本聚合。 * 默认不聚合。 * 对于非结构化文件,可开启文本聚合以更好保留原文档内容语序。 * 开启后,会根据文档及文档顺序,对切片重新聚合排序返回。 **get_attachment_link** `boolean` | 获取附件链接 `response.in_progress.response.tools.ranking_options.get_attachment_link` 是否获取切片中图片的临时下载链接。 **rerank_model** `string` | Rerank 模型 `response.in_progress.response.tools.ranking_options.rerank_model` rerank 模型选择。默认值:`base-multilingual-rerank`。取值:`base-multilingual-rerank` / `m3-v2-rerank`。 > **说明** > > * 仅在 `rerank_switch` 为 `true` 时生效。 > * `base-multilingual-rerank`(推荐):速度快、长文本、支持 70+ 种语言。 > * `m3-v2-rerank`:常规文本、支持 100+ 种语言。 **rerank_only_chunk** `boolean` | 仅切片重排 `response.in_progress.response.tools.ranking_options.rerank_only_chunk` 是否仅根据 chunk 内容计算重排分数。`true` 只根据 chunk 内容计算分;`false` 根据 chunk title + 内容一起计算排序分。 **rerank_switch** `boolean` | 开启重排 `response.in_progress.response.tools.ranking_options.rerank_switch` 是否自动对检索结果做 rerank。若设置为 `true`,则会自动请求 rerank 模型排序。 **retrieve_count** `integer` | 重排切片数 `response.in_progress.response.tools.ranking_options.retrieve_count` 进入重排的切片数量。 > **注意** > > * 仅在 `rerank_switch` 为 `true` 时生效。 > * `retrieve_count` 需要大于等于 `limit`,否则会抛出错误。 豆包助手 `object` 豆包助手工具,让模型使用豆包的聊天、深度思考、AI 搜索和推理搜索能力。 **feature** `object` | 功能配置 `response.in_progress.response.tools.feature` 豆包助手的子功能配置,用于按需开启聊天、深度思考、AI 搜索、推理搜索四类能力并设置对应角色描述。 **ai_search** `object` | AI 搜索 `response.in_progress.response.tools.feature.ai_search` AI 搜索功能配置。 **role_description** `string` | 角色描述 `response.in_progress.response.tools.feature.ai_search.role_description` 使用豆包助手时修改角色设定。默认值:`你的名字是豆包,有很强的专业性。` > **注意** > > 此字段与 `system prompt`、`instructions` 互斥,同时配置时以本字段为准。 **type** `string` | 开关 `response.in_progress.response.tools.feature.ai_search.type` 功能开关。可选值:`enabled`、`disabled`。 **chat** `object` | 普通聊天 `response.in_progress.response.tools.feature.chat` 普通聊天功能配置。 **role_description** `string` | 角色描述 `response.in_progress.response.tools.feature.chat.role_description` 使用豆包助手时修改角色设定。默认值:`你的名字是豆包,有很强的专业性。` > **注意** > > 此字段与 `system prompt`、`instructions` 互斥,同时配置时以本字段为准。 **type** `string` | 开关 `response.in_progress.response.tools.feature.chat.type` 功能开关。可选值:`enabled`、`disabled`。 **deep_chat** `object` | 深度聊天 `response.in_progress.response.tools.feature.deep_chat` 深度聊天功能配置。 **role_description** `string` | 角色描述 `response.in_progress.response.tools.feature.deep_chat.role_description` 使用豆包助手时修改角色设定。默认值:`你的名字是豆包,有很强的专业性。` > **注意** > > 此字段与 `system prompt`、`instructions` 互斥,同时配置时以本字段为准。 **type** `string` | 开关 `response.in_progress.response.tools.feature.deep_chat.type` 功能开关。可选值:`enabled`、`disabled`。 **reasoning_search** `object` | 推理搜索 `response.in_progress.response.tools.feature.reasoning_search` 推理搜索功能配置。 **role_description** `string` | 角色描述 `response.in_progress.response.tools.feature.reasoning_search.role_description` 使用豆包助手时修改角色设定。默认值:`你的名字是豆包,有很强的专业性。` > **注意** > > 此字段与 `system prompt`、`instructions` 互斥,同时配置时以本字段为准。 **type** `string` | 开关 `response.in_progress.response.tools.feature.reasoning_search.type` 功能开关。可选值:`enabled`、`disabled`。 **type** `string` | 类型 `response.in_progress.response.tools.type` 工具类型,此处固定为 `doubao_app` **user_location** `object` | 用户位置 `response.in_progress.response.tools.user_location` 用户地理位置信息,用于搜索优化。 **type** `string` | 类型 `response.in_progress.response.tools.user_location.type` 位置类型。 取值固定为 `approximate`。 **city** `string` | 城市 `response.in_progress.response.tools.user_location.city` 用户所在城市。 **country** `string` | 国家 `response.in_progress.response.tools.user_location.country` 用户所在国家。 **region** `string` | 地区 `response.in_progress.response.tools.user_location.region` 用户所在地区。 **timezone** `number` | 时区 `response.in_progress.response.tools.user_location.timezone` 用户所在时区。 **top_p** `number` | 采样阈值 `response.in_progress.response.top_p` 本次请求实际使用的核采样概率阈值。 **usage** `object` | 用量统计 `response.in_progress.response.usage` 本次响应的 token 用量统计,包含输入、输出与总计 token 数等明细。 **input_tokens** `integer` | 输入 token 数 `response.in_progress.response.usage.input_tokens` 输入消耗的 token 数量。 **input_tokens_details** `object` | 输入明细 `response.in_progress.response.usage.input_tokens_details` 输入 token 用量明细。 **cached_tokens** `integer` | 缓存 token `response.in_progress.response.usage.input_tokens_details.cached_tokens` 命中缓存的 token 数量。 **audio_cached_tokens** `integer` | 音频缓存 Token 数 `response.in_progress.response.usage.input_tokens_details.audio_cached_tokens` 缓存命中的音频输入内容所消耗的 token 数量。仅在隐式缓存模式且命中音频缓存时返回;开启显式缓存时该字段不返回。 **audio_tokens** `integer` | 音频 token `response.in_progress.response.usage.input_tokens_details.audio_tokens` 音频输入消耗的 token 数量。 **output_tokens** `integer` | 输出 token 数 `response.in_progress.response.usage.output_tokens` 输出消耗的 token 数量。 **output_tokens_details** `object` | 输出明细 `response.in_progress.response.usage.output_tokens_details` 输出 token 用量明细。 **reasoning_tokens** `integer` | 思考 token `response.in_progress.response.usage.output_tokens_details.reasoning_tokens` 深度思考消耗的 token 数量。 **total_tokens** `integer` | 总 token 数 `response.in_progress.response.usage.total_tokens` 本次请求消耗的 token 总数。 **tool_usage** `object` | 工具用量 `response.in_progress.response.usage.tool_usage` 工具调用用量统计。 **doubao_app** `integer` | 豆包次数 `response.in_progress.response.usage.tool_usage.doubao_app` 豆包助手工具调用次数。 **knowledge_search** `integer` | 知识库次数 `response.in_progress.response.usage.tool_usage.knowledge_search` 知识库搜索工具调用次数。 **mcp** `integer` | MCP 次数 `response.in_progress.response.usage.tool_usage.mcp` MCP 工具调用次数。 **web_search** `integer` | 搜索次数 `response.in_progress.response.usage.tool_usage.web_search` 联网搜索工具调用次数。 **tool_usage_details** `object` | 工具明细 `response.in_progress.response.usage.tool_usage_details` 工具调用用量明细。 **doubao_app** `object` | 豆包明细 `response.in_progress.response.usage.tool_usage_details.doubao_app` 豆包助手工具用量明细。 **knowledge_search** `object` | 知识库明细 `response.in_progress.response.usage.tool_usage_details.knowledge_search` 知识库搜索工具用量明细。 **mcp** `object` | MCP 明细 `response.in_progress.response.usage.tool_usage_details.mcp` MCP 工具用量明细。 **web_search** `object` | 搜索明细 `response.in_progress.response.usage.tool_usage_details.web_search` 联网搜索工具用量明细。 **sequence_number** `integer` | 序列号 `response.in_progress.sequence_number` 事件的序列号。 **type** `string` | 事件类型 `response.in_progress.type` 事件的类型,总是 `response.in_progress` ### response.completed > 当响应已完成触发的事件。 **response** `object` | 响应对象 `response.completed.response` 已完成状态的响应。包含参数与非流式调用返回的参数一致。 **created_at** `integer` | 创建时间戳 `response.completed.response.created_at` 该 Response 创建时的 Unix 时间戳(单位:秒)。 **id** `string` | 响应 ID `response.completed.response.id` 本次 Response 的唯一标识,可用于后续查询、续接或删除该响应。 **model** `string` | 模型 ID `response.completed.response.model` 生成本次响应所使用的模型标识,回显请求中的 model 字段。 **object** `string` | 对象类型 `response.completed.response.object` 返回对象的类型标识,用于区分响应对象种类。 取值固定为 `response`。 **output** `object[]` | 输出内容 `response.completed.response.output` 模型本次响应产出的 Item 列表,按生成顺序排列,可能包含消息、工具调用、推理等不同类型条目。 消息输出 `object` 模型生成的消息输出,包含文本内容。 **content** `object[]` | 输出内容 `response.completed.response.output.content` 输出内容列表。 模型回答文本 `object` 模型生成的最终回答文本。 **type** `string` | 类型 `response.completed.response.output.content.type` 内容类型判别字段,用于区分 union 变体。 取值固定为 `output_text`。 **annotations** `object[]` | 标注列表 `response.completed.response.output.content.annotations` 文本附带的标注信息列表(如引用来源等) 网页引用 `object` 引用自互联网网页的标注信息。 **title** `string` | 标题 `response.completed.response.output.content.annotations.title` 引用网页的标题。 **type** `string` | 类型 `response.completed.response.output.content.annotations.type` 标注类型的判别字段(discriminator)。 取值固定为 `url_citation`。 **url** `string` | 网址 `response.completed.response.output.content.annotations.url` 引用网页的 URL 地址。 **cover_image** `object` | 封面图 `response.completed.response.output.content.annotations.cover_image` 网页封面图片信息。 **height** `integer` | 高度 `response.completed.response.output.content.annotations.cover_image.height` 封面图片高度(像素) **url** `string` | 图片地址 `response.completed.response.output.content.annotations.cover_image.url` 封面图片的 URL 地址。 **width** `integer` | 宽度 `response.completed.response.output.content.annotations.cover_image.width` 封面图片宽度(像素) **freshness_info** `string` | 新鲜度 `response.completed.response.output.content.annotations.freshness_info` 内容新鲜度信息。 **logo_url** `string` | Logo 地址 `response.completed.response.output.content.annotations.logo_url` 网站 Logo 图标地址。 **mobile_url** `string` | 移动端地址 `response.completed.response.output.content.annotations.mobile_url` 移动端访问地址。 **publish_time** `string` | 发布时间 `response.completed.response.output.content.annotations.publish_time` 网页发布时间。 **site_name** `string` | 站点名 `response.completed.response.output.content.annotations.site_name` 站点名称。 **summary** `string` | 摘要 `response.completed.response.output.content.annotations.summary` 网页内容摘要。 文档引用 `object` 引用自私域知识库文档的标注信息。 **type** `string` | 类型 `response.completed.response.output.content.annotations.type` 标注类型。 取值固定为 `doc_citation`。 **chunk_attachment** `object[]` | 分块附件 `response.completed.response.output.content.annotations.chunk_attachment` 引用分块附带的附件信息列表。 **chunk_id** `integer` | 分块 ID `response.completed.response.output.content.annotations.chunk_id` 引用文档分块的 ID。 **doc_id** `string` | 文档 ID `response.completed.response.output.content.annotations.doc_id` 引用文档的 ID。 **doc_name** `string` | 文档名 `response.completed.response.output.content.annotations.doc_name` 引用文档的名称。 **text** `string` | 文本内容 `response.completed.response.output.content.text` 模型生成的文本内容。 模型思维链文本 `object` 模型生成的思维链文本。 **type** `string` | 类型 `response.completed.response.output.content.type` 内容类型标识,用于区分 union 变体。 取值固定为 `reasoning_text`。 **annotations** `object[]` | 标注列表 `response.completed.response.output.content.annotations` 思维链附带的标注信息列表。 网页引用 `object` 引用自互联网网页的标注信息。 **title** `string` | 标题 `response.completed.response.output.content.annotations.title` 引用网页的标题。 **type** `string` | 类型 `response.completed.response.output.content.annotations.type` 标注类型的判别字段(discriminator)。 取值固定为 `url_citation`。 **url** `string` | 网址 `response.completed.response.output.content.annotations.url` 引用网页的 URL 地址。 **cover_image** `object` | 封面图 `response.completed.response.output.content.annotations.cover_image` 网页封面图片信息。 **height** `integer` | 高度 `response.completed.response.output.content.annotations.cover_image.height` 封面图片高度(像素) **url** `string` | 图片地址 `response.completed.response.output.content.annotations.cover_image.url` 封面图片的 URL 地址。 **width** `integer` | 宽度 `response.completed.response.output.content.annotations.cover_image.width` 封面图片宽度(像素) **freshness_info** `string` | 新鲜度 `response.completed.response.output.content.annotations.freshness_info` 内容新鲜度信息。 **logo_url** `string` | Logo 地址 `response.completed.response.output.content.annotations.logo_url` 网站 Logo 图标地址。 **mobile_url** `string` | 移动端地址 `response.completed.response.output.content.annotations.mobile_url` 移动端访问地址。 **publish_time** `string` | 发布时间 `response.completed.response.output.content.annotations.publish_time` 网页发布时间。 **site_name** `string` | 站点名 `response.completed.response.output.content.annotations.site_name` 站点名称。 **summary** `string` | 摘要 `response.completed.response.output.content.annotations.summary` 网页内容摘要。 文档引用 `object` 引用自私域知识库文档的标注信息。 **type** `string` | 类型 `response.completed.response.output.content.annotations.type` 标注类型。 取值固定为 `doc_citation`。 **chunk_attachment** `object[]` | 分块附件 `response.completed.response.output.content.annotations.chunk_attachment` 引用分块附带的附件信息列表。 **chunk_id** `integer` | 分块 ID `response.completed.response.output.content.annotations.chunk_id` 引用文档分块的 ID。 **doc_id** `string` | 文档 ID `response.completed.response.output.content.annotations.doc_id` 引用文档的 ID。 **doc_name** `string` | 文档名 `response.completed.response.output.content.annotations.doc_name` 引用文档的名称。 **text** `string` | 文本内容 `response.completed.response.output.content.text` 模型思维链文本内容。 **id** `string` | 条目 ID `response.completed.response.output.id` 输出条目唯一标识。 **role** `string` | 角色 `response.completed.response.output.role` 消息发送者的角色。 取值固定为 `assistant`。 **status** `string` | 状态 `response.completed.response.output.status` 消息输出条目的当前状态。 * `completed`:消息已生成完毕。 * `in_progress`:消息正在生成中(流式场景)。 * `incomplete`:消息未完整生成(例如达到 `max_output_tokens` 上限)。 * `failed`:消息生成失败。 **type** `string` | 类型 `response.completed.response.output.type` 输出条目的类型标识。 取值固定为 `message`。 **partial** `boolean` | 增量片段 `response.completed.response.output.partial` 是否为流式增量片段。 **phase** `string` | 消息阶段 `response.completed.response.output.phase` 标记 assistant 消息属于中间讲解还是最终回答。在回放 assistant 历史消息时,建议保留并原样回传该字段。可选值:`commentary`、`final_answer`。 函数调用输出 `object` 模型发起的函数调用请求。 **type** `string` | 类型 `response.completed.response.output.type` 输出条目类型标识,用于区分 OutputItem 变体。 取值固定为 `function_call`。 **arguments** `string` | 参数 `response.completed.response.output.arguments` 函数参数的 JSON 字符串。 **call_id** `string` | 调用 ID `response.completed.response.output.call_id` 函数调用的唯一标识 ID,用于将该 function_call 输出与后续回传的 function_call_output 关联匹配。 **id** `string` | 条目 ID `response.completed.response.output.id` 输出条目唯一标识。 **name** `string` | 函数名 `response.completed.response.output.name` 调用的函数名称。 **status** `string` | 状态 `response.completed.response.output.status` 函数调用条目的当前状态。 * `completed`:函数调用请求已生成完毕。 * `in_progress`:函数调用请求正在生成中(流式场景)。 * `incomplete`:函数调用请求未完整生成(例如达到 `max_output_tokens` 上限)。 * `failed`:函数调用生成失败。 思维链输出 `object` 模型的深度思考过程输出。 **status** `string` | 状态 `response.completed.response.output.status` 推理条目的处理状态,用于判断思维链是否生成完成。可选值:`completed`、`failed`、`in_progress`、`incomplete`。 **summary** `object[]` | 推理摘要 `response.completed.response.output.summary` 推理摘要内容列表。 **type** `string` | 类型 `response.completed.response.output.summary.type` 摘要片段类型标识。 取值固定为 `summary_text`。 **text** `string` | 摘要文本 `response.completed.response.output.summary.text` 思维链摘要文本内容。 **type** `string` | 类型 `response.completed.response.output.type` 输出条目类型标识,用于区分 OutputItem 变体。 取值固定为 `reasoning`。 **content** `object[]` | 推理内容 `response.completed.response.output.content` 思维链推理过程的内容元素列表。 模型回答文本 `object` 模型生成的最终回答文本。 **type** `string` | 类型 `response.completed.response.output.content.type` 内容类型判别字段,用于区分 union 变体。 取值固定为 `output_text`。 **annotations** `object[]` | 标注列表 `response.completed.response.output.content.annotations` 文本附带的标注信息列表(如引用来源等) 网页引用 `object` 引用自互联网网页的标注信息。 **title** `string` | 标题 `response.completed.response.output.content.annotations.title` 引用网页的标题。 **type** `string` | 类型 `response.completed.response.output.content.annotations.type` 标注类型的判别字段(discriminator)。 取值固定为 `url_citation`。 **url** `string` | 网址 `response.completed.response.output.content.annotations.url` 引用网页的 URL 地址。 **cover_image** `object` | 封面图 `response.completed.response.output.content.annotations.cover_image` 网页封面图片信息。 **height** `integer` | 高度 `response.completed.response.output.content.annotations.cover_image.height` 封面图片高度(像素) **url** `string` | 图片地址 `response.completed.response.output.content.annotations.cover_image.url` 封面图片的 URL 地址。 **width** `integer` | 宽度 `response.completed.response.output.content.annotations.cover_image.width` 封面图片宽度(像素) **freshness_info** `string` | 新鲜度 `response.completed.response.output.content.annotations.freshness_info` 内容新鲜度信息。 **logo_url** `string` | Logo 地址 `response.completed.response.output.content.annotations.logo_url` 网站 Logo 图标地址。 **mobile_url** `string` | 移动端地址 `response.completed.response.output.content.annotations.mobile_url` 移动端访问地址。 **publish_time** `string` | 发布时间 `response.completed.response.output.content.annotations.publish_time` 网页发布时间。 **site_name** `string` | 站点名 `response.completed.response.output.content.annotations.site_name` 站点名称。 **summary** `string` | 摘要 `response.completed.response.output.content.annotations.summary` 网页内容摘要。 文档引用 `object` 引用自私域知识库文档的标注信息。 **type** `string` | 类型 `response.completed.response.output.content.annotations.type` 标注类型。 取值固定为 `doc_citation`。 **chunk_attachment** `object[]` | 分块附件 `response.completed.response.output.content.annotations.chunk_attachment` 引用分块附带的附件信息列表。 **chunk_id** `integer` | 分块 ID `response.completed.response.output.content.annotations.chunk_id` 引用文档分块的 ID。 **doc_id** `string` | 文档 ID `response.completed.response.output.content.annotations.doc_id` 引用文档的 ID。 **doc_name** `string` | 文档名 `response.completed.response.output.content.annotations.doc_name` 引用文档的名称。 **text** `string` | 文本内容 `response.completed.response.output.content.text` 模型生成的文本内容。 模型思维链文本 `object` 模型生成的思维链文本。 **type** `string` | 类型 `response.completed.response.output.content.type` 内容类型标识,用于区分 union 变体。 取值固定为 `reasoning_text`。 **annotations** `object[]` | 标注列表 `response.completed.response.output.content.annotations` 思维链附带的标注信息列表。 网页引用 `object` 引用自互联网网页的标注信息。 **title** `string` | 标题 `response.completed.response.output.content.annotations.title` 引用网页的标题。 **type** `string` | 类型 `response.completed.response.output.content.annotations.type` 标注类型的判别字段(discriminator)。 取值固定为 `url_citation`。 **url** `string` | 网址 `response.completed.response.output.content.annotations.url` 引用网页的 URL 地址。 **cover_image** `object` | 封面图 `response.completed.response.output.content.annotations.cover_image` 网页封面图片信息。 **height** `integer` | 高度 `response.completed.response.output.content.annotations.cover_image.height` 封面图片高度(像素) **url** `string` | 图片地址 `response.completed.response.output.content.annotations.cover_image.url` 封面图片的 URL 地址。 **width** `integer` | 宽度 `response.completed.response.output.content.annotations.cover_image.width` 封面图片宽度(像素) **freshness_info** `string` | 新鲜度 `response.completed.response.output.content.annotations.freshness_info` 内容新鲜度信息。 **logo_url** `string` | Logo 地址 `response.completed.response.output.content.annotations.logo_url` 网站 Logo 图标地址。 **mobile_url** `string` | 移动端地址 `response.completed.response.output.content.annotations.mobile_url` 移动端访问地址。 **publish_time** `string` | 发布时间 `response.completed.response.output.content.annotations.publish_time` 网页发布时间。 **site_name** `string` | 站点名 `response.completed.response.output.content.annotations.site_name` 站点名称。 **summary** `string` | 摘要 `response.completed.response.output.content.annotations.summary` 网页内容摘要。 文档引用 `object` 引用自私域知识库文档的标注信息。 **type** `string` | 类型 `response.completed.response.output.content.annotations.type` 标注类型。 取值固定为 `doc_citation`。 **chunk_attachment** `object[]` | 分块附件 `response.completed.response.output.content.annotations.chunk_attachment` 引用分块附带的附件信息列表。 **chunk_id** `integer` | 分块 ID `response.completed.response.output.content.annotations.chunk_id` 引用文档分块的 ID。 **doc_id** `string` | 文档 ID `response.completed.response.output.content.annotations.doc_id` 引用文档的 ID。 **doc_name** `string` | 文档名 `response.completed.response.output.content.annotations.doc_name` 引用文档的名称。 **text** `string` | 文本内容 `response.completed.response.output.content.text` 模型思维链文本内容。 **encrypted_content** `string` | 加密思维链 `response.completed.response.output.encrypted_content` 思考内容加密原文。经加密及压缩处理后的思考内容原文。 相关文档: * [关键规则](/docs/agent-model-invocation-practice#key-rules) * [回传思考内容加密块使用示例](/docs/agent-model-invocation-practice#encrypted-thinking-block-examples) > **说明** > > 流式输出场景下,思考内容加密原文通过 `response.output_item.added`、`response.output_item.done`、`response.completed` 等相关事件下发,需要按事件中 `encrypted_content` 字段非空过滤获取。 **模型支持**: * `doubao-seed-2-0-lite-260428 及后续版本` **id** `string` | 条目 ID `response.completed.response.output.id` 输出条目唯一标识。 语音转写输出 `object` 模型返回的语音转写输出。 **status** `string` | 状态 `response.completed.response.output.status` 语音转写条目的当前状态。 * `completed`:转写已生成完毕。 * `in_progress`:转写正在生成中(流式场景)。 * `incomplete`:转写未完整生成(例如达到输出上限而截断)。 * `failed`:转写生成失败。 **type** `string` | 类型 `response.completed.response.output.type` 输出条目类型标识。 取值固定为 `transcription`。 **id** `string` | 条目 ID `response.completed.response.output.id` 输出条目唯一标识。 **transcription** `object[]` | 转写内容 `response.completed.response.output.transcription` 语音转写结果片段列表。 **type** `string` | 类型 `response.completed.response.output.transcription.type` 转写片段类型。 取值固定为 `transcription_text`。 **chunks** `object[]` | 音频小段 `response.completed.response.output.transcription.chunks` 当前片段对应的音频小段列表。 **end_time** `integer` | 结束时间 `response.completed.response.output.transcription.chunks.end_time` 片段结束时间(毫秒) **start_time** `integer` | 开始时间 `response.completed.response.output.transcription.chunks.start_time` 片段开始时间(毫秒) **text** `string` | 文字内容 `response.completed.response.output.transcription.chunks.text` 当前片段对应的文字内容。 **text** `string` | 转写文本 `response.completed.response.output.transcription.text` 当前片段的转写文本。 网页搜索调用 `object` 模型发起的网页搜索调用记录。 **id** `string` | 条目 ID `response.completed.response.output.id` 输出条目唯一标识。 **status** `string` | 状态 `response.completed.response.output.status` 网页搜索调用的当前状态。可选值:`in_progress`、`searching`、`completed`、`incomplete`、`failed`。 **type** `string` | 类型 `response.completed.response.output.type` 输出条目类型标识,用于区分 OutputItem 变体。 取值固定为 `web_search_call`。 **action** `object` | 搜索动作 `response.completed.response.output.action` 描述模型执行的网页搜索动作,包括搜索类型与查询关键字。 **query** `string` | 查询语句 `response.completed.response.output.action.query` 模型实际发起的搜索查询语句。 **type** `string` | 类型 `response.completed.response.output.action.type` 网页搜索动作的类型标识。 取值固定为 `search`。 **queries** `string[]` | 查询语句列表 `response.completed.response.output.action.queries` 本次网页搜索产生的查询语句列表。 图像处理调用 `object` 模型发起的图像处理调用记录。 **id** `string` | 条目 ID `response.completed.response.output.id` 输出条目唯一标识。 **status** `string` | 状态 `response.completed.response.output.status` 图像处理调用的当前状态。 * `completed`:图像处理已完成。 * `in_progress`:图像处理正在执行中。 * `incomplete`:图像处理未完整执行(例如被中断或截断)。 * `failed`:图像处理执行失败,具体原因见 `error` 字段。 **type** `string` | 类型 `response.completed.response.output.type` 输出条目类型标识,用于区分 OutputItem 变体。 取值固定为 `image_process`。 **action** `object` | 处理动作 `response.completed.response.output.action` 图像处理动作详情。 **type** `string` | 类型 `response.completed.response.output.action.type` 图像处理动作类型。 **result_image_url** `string` | 结果图地址 `response.completed.response.output.action.result_image_url` 处理后图像的 URL 地址。 **arguments** `object` | 处理参数 `response.completed.response.output.arguments` 图像处理动作的输入参数,以键值对形式承载具体处理选项。 **error** `object` | 图像处理错误 `response.completed.response.output.error` 图像处理失败时的错误信息。 **message** `string` | 错误描述 `response.completed.response.output.error.message` 错误的可读描述。 MCP 审批请求 `object` MCP 工具调用前的审批请求记录。 **arguments** `string` | 调用参数 `response.completed.response.output.arguments` 工具调用参数的 JSON 字符串。 **name** `string` | 工具名 `response.completed.response.output.name` 待运行的工具名称。 **server_label** `string` | 服务标签 `response.completed.response.output.server_label` 发起请求的 MCP Server 标签。 **type** `string` | 类型 `response.completed.response.output.type` 输出项类型标识符,用于区分 OutputItem 的变体。 取值固定为 `mcp_approval_request`。 **id** `string` | 请求 ID `response.completed.response.output.id` 审批请求的唯一 ID。 MCP 工具清单 `object` MCP Server 提供的工具清单输出。 **server_label** `string` | 服务标签 `response.completed.response.output.server_label` MCP Server 标签。 **type** `string` | 类型 `response.completed.response.output.type` 输出项类型标识。 取值固定为 `mcp_list_tools`。 **error** `string` | 错误信息 `response.completed.response.output.error` 当 MCP Server 无法返回工具列表时的错误信息。 **id** `string` | 列表 ID `response.completed.response.output.id` 工具列表的唯一 ID。 **tools** `object[]` | 工具列表 `response.completed.response.output.tools` 该 MCP Server 上可用的工具列表。 **name** `string` | 工具名 `response.completed.response.output.tools.name` 工具名称。 **annotations** `object` | 注解信息 `response.completed.response.output.tools.annotations` 工具的附加注解信息。 **description** `string` | 工具描述 `response.completed.response.output.tools.description` 工具的功能描述。 **input_schema** `object` | 入参 Schema `response.completed.response.output.tools.input_schema` 描述工具入参的 JSON Schema。 MCP 工具调用 `object` 模型对 MCP 工具的实际调用记录及结果。 **name** `string` | 工具名 `response.completed.response.output.name` 实际运行的工具名称。 **server_label** `string` | 服务标签 `response.completed.response.output.server_label` 运行工具的 MCP Server 标签。 **type** `string` | 类型 `response.completed.response.output.type` 标识该输出项为 MCP 工具调用记录。 取值固定为 `mcp_call`。 **arguments** `string` | 调用参数 `response.completed.response.output.arguments` 传递给 MCP 工具的调用参数,格式为 JSON 字符串。 > **说明** > > 该字段通过 `response.mcp_call_arguments.delta` 事件流式追加,初始 `output_item.added` 事件可能不携带该字段。 **error** `string` | 错误信息 `response.completed.response.output.error` 工具调用失败时的错误信息。 **id** `string` | 调用 ID `response.completed.response.output.id` 工具调用的唯一 ID。 **output** `string` | 返回结果 `response.completed.response.output.output` 工具调用的返回结果。 知识库检索调用 `object` 模型发起的私域知识库检索调用记录。 **knowledge_resource_id** `string` | 知识库 ID `response.completed.response.output.knowledge_resource_id` 检索使用的知识库 ID。 **queries** `string[]` | 查询语句 `response.completed.response.output.queries` 模型实际执行的检索查询语句。 **status** `string` | 状态 `response.completed.response.output.status` 知识库检索调用的执行状态。可选值:`in_progress`、`searching`、`completed`、`failed`、`incomplete`。 **type** `string` | 类型 `response.completed.response.output.type` 输出条目类型标识,用于区分不同类型的输出条目。 取值固定为 `knowledge_search_call`。 **id** `string` | 条目 ID `response.completed.response.output.id` 输出条目唯一标识。 豆包应用调用 `object` 模型对豆包助手能力的调用记录。 **type** `string` | 类型 `response.completed.response.output.type` 输出条目类型标识。 取值固定为 `doubao_app_call`。 **blocks** `object[]` | 内容块 `response.completed.response.output.blocks` 豆包应用调用产出的内容块列表。 文本输出 `object` 豆包应用产出的文本输出内容块。 **type** `string` | 类型 `response.completed.response.output.blocks.type` 内容块类型标识符。 取值固定为 `output_text`。 **id** `string` | 块 ID `response.completed.response.output.blocks.id` 内容块的唯一标识。 **parent_id** `string` | 父级 ID `response.completed.response.output.blocks.parent_id` 所属父级条目的 ID。 **status** `string` | 状态 `response.completed.response.output.blocks.status` 内容块状态。 **text** `string` | 文本内容 `response.completed.response.output.blocks.text` 思维链文本 `object` 豆包应用产出的思维链文本内容块。 **type** `string` | 类型 `response.completed.response.output.blocks.type` 内容块类型标识符。 取值固定为 `reasoning_text`。 **id** `string` | 块 ID `response.completed.response.output.blocks.id` 内容块的唯一标识。 **parent_id** `string` | 父级 ID `response.completed.response.output.blocks.parent_id` 所属父级条目的 ID。 **reasoning_text** `string` | 思考文本 `response.completed.response.output.blocks.reasoning_text` 思维链文本内容。 **status** `string` | 状态 `response.completed.response.output.blocks.status` 内容块状态。 搜索过程 `object` 豆包应用 AI 搜索过程产出的内容块。 **type** `string` | 类型 `response.completed.response.output.blocks.type` 内容块类型标识符。 取值固定为 `search`。 **id** `string` | 块 ID `response.completed.response.output.blocks.id` 内容块的唯一标识。 **parent_id** `string` | 父级 ID `response.completed.response.output.blocks.parent_id` 所属父级条目的 ID。 **queries** `string[]` | 查询语句 `response.completed.response.output.blocks.queries` 搜索查询语句列表。 **results** `object[]` | 搜索结果 `response.completed.response.output.blocks.results` 搜索结果列表。 **text_card** `object` | 文本卡片 `response.completed.response.output.blocks.results.text_card` 文本卡片形式的搜索结果。 **sitename** `string` | 站点名 `response.completed.response.output.blocks.results.text_card.sitename` 来源站点名称。 **title** `string` | 标题 `response.completed.response.output.blocks.results.text_card.title` 搜索结果标题。 **url** `string` | 网址 `response.completed.response.output.blocks.results.text_card.url` 搜索结果 URL 地址。 **status** `string` | 状态 `response.completed.response.output.blocks.status` 内容块状态。 **summary** `string` | 搜索总结 `response.completed.response.output.blocks.summary` AI 搜索过程中对本轮搜索结果的总结性文字,概括从搜索结果中提取的核心信息。 推理搜索过程 `object` 豆包应用推理搜索过程产出的内容块。 **type** `string` | 类型 `response.completed.response.output.blocks.type` 内容块类型。 取值固定为 `reasoning_search`。 **id** `string` | 块 ID `response.completed.response.output.blocks.id` 内容块的唯一标识。 **parent_id** `string` | 父级 ID `response.completed.response.output.blocks.parent_id` 所属父级条目的 ID。 **queries** `string[]` | 查询语句 `response.completed.response.output.blocks.queries` 搜索查询语句列表。 **results** `object[]` | 搜索结果 `response.completed.response.output.blocks.results` 搜索结果列表。 **text_card** `object` | 文本卡片 `response.completed.response.output.blocks.results.text_card` 文本卡片形式的搜索结果。 **sitename** `string` | 站点名 `response.completed.response.output.blocks.results.text_card.sitename` 来源站点名称。 **title** `string` | 标题 `response.completed.response.output.blocks.results.text_card.title` 搜索结果标题。 **url** `string` | 网址 `response.completed.response.output.blocks.results.text_card.url` 搜索结果 URL 地址。 **status** `string` | 状态 `response.completed.response.output.blocks.status` 推理搜索内容块的处理状态。可选值:`in_progress`、`searching`、`completed`、`incomplete`、`failed`。 **summary** `string` | 搜索总结 `response.completed.response.output.blocks.summary` 推理搜索过程中对本轮搜索结果的总结性文字,概括从搜索结果中提取的核心信息。 **feature** `string` | 功能名 `response.completed.response.output.feature` 本次调用触发的豆包子功能名称。可选值:`chat`、`deep_chat`、`ai_search`、`reasoning_search`。 **id** `string` | 条目 ID `response.completed.response.output.id` 输出条目唯一标识。 **status** `string` | 状态 `response.completed.response.output.status` 输出状态。可选值:`completed`、`failed`、`in_progress`、`incomplete`。 智能体工具调用 `object` 模型发起的智能体工具调用记录。 **name** `string` | 工具名 `response.completed.response.output.name` 被调用的智能体工具名称。 **status** `string` | 状态 `response.completed.response.output.status` 智能体工具调用的执行状态。可选值:`completed`、`failed`、`in_progress`、`incomplete`。 **type** `string` | 类型 `response.completed.response.output.type` 输出条目类型标识符,用于区分 OutputItem 的 variant。 取值固定为 `agent_tool_call`。 **id** `string` | 条目 ID `response.completed.response.output.id` 输出条目唯一标识。 **caching** `object` | 缓存配置 `response.completed.response.caching` 本次响应生效的上下文缓存配置,回显请求中的 caching 设置。 **prefix** `boolean` | 仅写缓存 `response.completed.response.caching.prefix` 是否仅写入前缀缓存,不生成回复。`true` 只写缓存,不返回模型输出;`false` 正常生成回复并写缓存。 **type** `string` | 缓存模式 `response.completed.response.caching.type` 缓存模式。 * `enabled`:开启上下文缓存。 * `disabled`:关闭上下文缓存。 **context_management** `object` | 上下文管理 `response.completed.response.context_management` 本次响应实际执行的上下文管理编辑操作,回显请求中 context_management 生效后的结果。 **applied_edits** `object[]` | 已应用编辑 `response.completed.response.context_management.applied_edits` 已应用的上下文编辑结果列表。 清理工具调用 `object` 已应用的清理工具调用编辑结果。 **cleared_tool_uses** `integer` | 清理次数 `response.completed.response.context_management.applied_edits.cleared_tool_uses` 已清理的工具调用数量。 **type** `string` | 类型 `response.completed.response.context_management.applied_edits.type` 编辑类型。 取值固定为 `clear_tool_uses`。 清理思维链 `object` 已应用的清理思维链编辑结果。 **cleared_thinking_turns** `integer` | 清理轮次 `response.completed.response.context_management.applied_edits.cleared_thinking_turns` 已清理的思维链轮次数量。 **type** `string` | 类型 `response.completed.response.context_management.applied_edits.type` 编辑类型。 取值固定为 `clear_thinking`。 **error** `object` | 错误信息 `response.completed.response.error` 模型响应过程发生错误时的错误信息。仅当 *status* 为 `failed` 时返回。 **code** `string` | 错误码 `response.completed.response.error.code` **message** `string` | 错误描述 `response.completed.response.error.message` 错误信息的可读描述。 **expire_at** `integer` | 过期时间戳 `response.completed.response.expire_at` 响应储存的过期时刻 Unix 时间戳(秒),回显请求中的 expire_at 设置,对 store 与 caching 均生效。 > **说明** > > 最多保留 7 天。 **incomplete_details** `object` | 未完成详情 `response.completed.response.incomplete_details` 响应未能完成的详细信息。仅当 *status* 为 `incomplete` 时返回。 **reason** `string` | 原因 `response.completed.response.incomplete_details.reason` 响应未完成的原因。 **content_filter** `object` | 内容过滤 `response.completed.response.incomplete_details.content_filter` 内容过滤详情。 **details** `string` | 详情 `response.completed.response.incomplete_details.content_filter.details` 内容过滤命中的详细描述。 **type** `string` | 类型 `response.completed.response.incomplete_details.content_filter.type` 内容过滤命中的类型。 **instructions** `string` | 系统指令 `response.completed.response.instructions` 本次响应生效的系统指令,回显请求中的 instructions 设置。 **max_output_tokens** `integer` | 最大输出长度 `response.completed.response.max_output_tokens` 回显请求中的 max_output_tokens 参数,即模型输出最大 token 数(含回答与思维链)。 **max_tool_calls** `integer` | 最大工具调用轮次 `response.completed.response.max_tool_calls` 本次响应生效的最大工具调用轮次,回显请求中的 max_tool_calls 设置。 **metadata** `object` | 自定义元数据 `response.completed.response.metadata` 回显请求中的 metadata 键值对元数据。最多支持 16 对键值,key 长度不超过 64 个字符,value 长度不超过 512 个字符,服务端不会解释其中内容。 **parallel_tool_calls** `boolean` | 并行工具调用 `response.completed.response.parallel_tool_calls` 本次请求实际生效的并行工具调用设置,回显请求中的 parallel_tool_calls 值。 **previous_response_id** `string` | 上轮响应 ID `response.completed.response.previous_response_id` 回显请求中的 previous_response_id,即前一轮响应的唯一标识。仅在请求传入该字段时返回。 **prompt_cache_key** `string` | 缓存分桶键 `response.completed.response.prompt_cache_key` 用于提升缓存命中率的分桶键,回显请求中的 prompt_cache_key 设置。 **reasoning** `object` | 推理配置 `response.completed.response.reasoning` 本次响应生效的深度思考工作量配置,回显请求中的 reasoning 设置。 **effort** `string` | 思考深度 `response.completed.response.reasoning.effort` 限制思考的工作量。减少思考深度可提升速度,思考花费的 token 更少。 * `none`:关闭思考。 * `minimal`:关闭思考,直接回答。 * `low`:轻量思考,侧重快速响应。 * `medium`:均衡模式,兼顾速度与深度。 * `high`:深度分析,处理复杂问题。 * `xhigh`:更高程度思考。 * `max`:最高程度思考,适配高难度推理任务。 > **注意:说明** > > 支持该字段的模型、默认取值、参数兼容映射规则,以及与 `thinking.type` 字段的关系,详见 [文档](/docs/responses-api-deep-thinking#dc4c1547)。 **safety_identifier** `string` | 安全标识 `response.completed.response.safety_identifier` 回显请求中传入的终端用户稳定标识,用于安全策略与违规行为追踪关联。 **service_tier** `string` | 推理模式 `response.completed.response.service_tier` 本次请求实际使用的推理模式。 * `fast`:本次请求使用 [在线推理(低延迟)](/docs/online-inference-low-latency) 模式。 * `auto`:本次请求使用 [在线推理(TPM 保障包)](/docs/tpm-guarantee-package) 模式。 * `default`:本次请求使用 [在线推理(常规)](/docs/online-inference-standard) 模式。 * `flex`:本次请求使用 [在线推理(低优)](/docs/online-inference-flex) 模式。 **session** `object` | 会话信息 `response.completed.response.session` 本次响应关联的会话信息,回显请求中 session 生效后的结果。 **id** `string` | 会话 ID `response.completed.response.session.id` 会话的唯一 ID。 **status** `string` | 响应状态 `response.completed.response.status` 本次响应的当前状态,标识生成流程处于进行中、已完成、未完成或已失败等阶段。 **store** `boolean` | 是否存储 `response.completed.response.store` 是否储存生成的模型响应以供后续通过 API 检索,回显请求中的 store 设置。 **temperature** `number` | 采样温度 `response.completed.response.temperature` 本次响应生效的采样温度,回显请求中的 temperature 设置。 **text** `object` | 输出格式 `response.completed.response.text` 本次响应生效的输出格式定义,回显请求中的 text 设置。 **format** `object` | 输出格式 `response.completed.response.text.format` 文本输出格式定义。 **type** `string` | 格式类型 `response.completed.response.text.format.type` 输出格式类型。可选值:`text`、`json_schema`、`json_object`。 > **注意** > > `json_object` / `json_schema` 能力尚在 beta 阶段,请谨慎在生产环境使用。 **description** `string` | 格式描述 `response.completed.response.text.format.description` 格式描述信息。 **name** `string` | 格式名称 `response.completed.response.text.format.name` 格式名称,作为 JSON Schema 输出格式的标识。 > **注意** > > 仅当 *type* 为 `json_schema` 时需要提供此字段。 **schema** `object` | Schema 定义 `response.completed.response.text.format.schema` JSON Schema 定义。当 *type* 为 `json_schema` 时必填。 **strict** `boolean` | 严格模式 `response.completed.response.text.format.strict` 是否严格按 JSON Schema 校验模型输出。 > **注意** > > 仅当 *type* 为 `json_schema` 时生效。 **thinking** `object` | 深度思考 `response.completed.response.thinking` 本次响应生效的深度思考配置,回显请求中的 thinking 设置。 **type** `string` | 思考模式 `response.completed.response.thinking.type` 深度思考模式。 * `enabled`:开启深度思考。 * `disabled`:关闭深度思考。 * `auto`:由模型自行判断是否需要深度思考。 **tool_choice** `string / object` | 工具调用策略 `response.completed.response.tool_choice` 本次请求实际生效的工具调用策略,回显请求中的 tool_choice 设置。 > **说明** > > 未指定工具时默认值为 `none`;存在工具时默认值为 `auto`。 简单策略 `string` 直接传入字符串 `none`、`auto` 或 `required`,控制工具调用整体策略。 指定工具 `object` 通过对象指定具体工具类型或工具名进行调用。 **type** `string` | 工具类型 `response.completed.response.tool_choice.type` 指定要调用的工具类型,用于精确路由到对应工具。可选值: * `function` * `web_search` * `image_process` * `mcp` * `knowledge_search` * `doubao_app` **name** `string` | 工具名称 `response.completed.response.tool_choice.name` 指定要调用的具体工具名,如函数名或 MCP 服务下的工具名。 **tools** `object[]` | 工具列表 `response.completed.response.tools` 本次响应生效的工具列表,回显请求中的 tools 设置。 函数调用 `object` 自定义函数调用(Function Calling),让模型生成结构化的函数参数。 **name** `string` | 函数名 `response.completed.response.tools.name` 供模型调用的函数名称,模型在 function_call 输出中以该名称回传,用于匹配对应函数。 **type** `string` | 类型 `response.completed.response.tools.type` 工具类型标识,用于在 union 中区分不同工具类别。 取值固定为 `function`。 **description** `string` | 函数描述 `response.completed.response.tools.description` 函数的描述信息,帮助模型理解何时使用该函数。 **parameters** `object` | 参数定义 `response.completed.response.tools.parameters` 函数参数定义,遵循 JSON Schema 格式。 联网搜索 `object` 联网搜索工具,让模型在需要时自动进行网页搜索获取实时信息。 **type** `string` | 类型 `response.completed.response.tools.type` 工具类型标识,用于区分 Tool 的不同变体。 取值固定为 `web_search`。 **limit** `integer` | 最大结果数 `response.completed.response.tools.limit` 每轮搜索最大返回结果数量。 > **说明** > > 单次搜索最多返回 20 条;单轮可能有多次搜索,最终召回条数受此参数限制影响。 **取值范围**:`[1, 50]` **max_keyword** `integer` | 最大关键词数 `response.completed.response.tools.max_keyword` 最大并行搜索关键词数量。 **取值范围**:`[1, 50]` **sources** `string[]` | 搜索来源 `response.completed.response.tools.sources` 搜索信息来源限制,指定模型可从哪些渠道检索网页内容。可选值:`toutiao`、`douyin`、`moji`、`search_engine`、`doubao`。 > **说明** > > `doubao` 不能与其他搜索来源同时配置。传入 `["doubao"]` 时,`tools.limit`、`tools.max_keyword`、`tools.user_location` 均不生效,向它们传入的值将被忽略。 **user_location** `object` | 用户位置 `response.completed.response.tools.user_location` 用户地理位置信息,用于搜索优化。 **type** `string` | 类型 `response.completed.response.tools.user_location.type` 位置类型。 取值固定为 `approximate`。 **city** `string` | 城市 `response.completed.response.tools.user_location.city` 用户所在城市。 **country** `string` | 国家 `response.completed.response.tools.user_location.country` 用户所在国家。 **region** `string` | 地区 `response.completed.response.tools.user_location.region` 用户所在地区。 **timezone** `number` | 时区 `response.completed.response.tools.user_location.timezone` 用户所在时区。 图像处理 `object` 图像处理工具,让模型对图片进行画点、选区、缩放、旋转等操作。 **type** `string` | 类型 `response.completed.response.tools.type` 工具类型标识,用于区分 Tool 的不同变体。 取值固定为 `image_process`。 **grounding** `object` | 选区功能 `response.completed.response.tools.grounding` 选区/裁切功能配置,启用后模型可返回图像中目标的检测框或裁切区域坐标。 **type** `string` | 开关 `response.completed.response.tools.grounding.type` 功能开关。可选值:`enabled`、`disabled`。 **point** `object` | 画点功能 `response.completed.response.tools.point` 画点/画线功能开关。 **type** `string` | 开关 `response.completed.response.tools.point.type` 功能开关。可选值:`enabled`、`disabled`。 **rotate** `object` | 旋转功能 `response.completed.response.tools.rotate` 旋转功能开关。启用后模型可请求对图片按指定角度进行旋转。 > **注意** > > 旋转角度支持范围为 0-359 度。 **type** `string` | 开关 `response.completed.response.tools.rotate.type` 功能开关。可选值:`enabled`、`disabled`。 **zoom** `object` | 缩放功能 `response.completed.response.tools.zoom` 缩放功能开关,启用后模型可对图像目标区域执行缩放操作。 > **说明** > > 缩放倍率支持范围 0.5-2.0 倍。 **type** `string` | 开关 `response.completed.response.tools.zoom.type` 功能开关。可选值:`enabled`、`disabled`。 MCP 工具 `object` MCP(Model Context Protocol)工具,让模型调用外部 MCP Server 提供的工具。 **server_label** `string` | 服务标签 `response.completed.response.tools.server_label` MCP Server 的唯一标识标签。模型在工具调用输出中通过该标签指向对应 Server,便于在多个 MCP Server 场景下区分调用来源。 **server_url** `string` | 服务地址 `response.completed.response.tools.server_url` MCP Server 的 HTTP(S) 访问地址,模型通过该地址向 Server 发起工具调用请求。 **type** `string` | 类型 `response.completed.response.tools.type` 工具类型标识,用于区分 Tool 的不同变体。 取值固定为 `mcp`。 **allowed_tools** `string[] / object` | 允许工具 `response.completed.response.tools.allowed_tools` 允许模型调用的工具范围。可传工具名称字符串数组,或包含 `tool_names` 字段的过滤器对象。 工具名数组 `string[]` 直接传入允许调用的工具名称数组。 工具过滤器 `object` 通过过滤器对象指定允许调用的工具范围。 **tool_names** `string[]` | 工具名列表 `response.completed.response.tools.allowed_tools.tool_names` 允许调用的工具名称列表。 **headers** `object` | 请求头 `response.completed.response.tools.headers` 调用 MCP Server 时附加的 HTTP 请求头,以字符串键值对形式指定 header 名与值。 > **说明** > > * 常用于传递鉴权信息(如 `Authorization`)。 > * `Authorization` 字段不会被服务端存储。 **require_approval** `string / object` | 审批策略 `response.completed.response.tools.require_approval` MCP 工具调用前的审批策略;支持简单模式(字符串)或按工具粒度控制(过滤器对象)。 简单策略 `string` 直接传入字符串 `always` 或 `never`,对所有工具应用统一审批策略。 工具过滤器 `object` 通过过滤器对象按工具粒度配置审批策略。 **always** `object` | 始终审批 `response.completed.response.tools.require_approval.always` 始终需要审批的工具过滤器。 **tool_names** `string[]` | 工具名列表 `response.completed.response.tools.require_approval.always.tool_names` 始终需要审批的工具名称列表。 **never** `object` | 无需审批 `response.completed.response.tools.require_approval.never` 无需审批的工具过滤器。 **tool_names** `string[]` | 工具名列表 `response.completed.response.tools.require_approval.never.tool_names` 无需审批即可调用的工具名称列表。 **server_description** `string` | 服务描述 `response.completed.response.tools.server_description` MCP Server 的描述信息,帮助模型理解何时使用该 Server。 知识库搜索 `object` 私域知识库搜索工具,让模型检索企业内部知识库中的文档内容。 **knowledge_resource_id** `string` | 知识库 ID `response.completed.response.tools.knowledge_resource_id` **type** `string` | 类型 `response.completed.response.tools.type` 工具类型标识,用于区分 Tool 的不同变体。 取值固定为 `knowledge_search`。 **dense_weight** `number` | 稠密权重 `response.completed.response.tools.dense_weight` 混合检索中稠密向量(语义)检索的权重,值越大越偏向语义匹配,越小越偏向关键词匹配。 > **说明** > > 仅在混合检索(索引算法为 `hnsw_hybrid`)下生效。 **取值范围**:`[0.2, 1]` **description** `string` | 知识库描述 `response.completed.response.tools.description` 知识库描述信息,帮助模型理解何时使用该知识库。 **doc_filter** `object` | 文档过滤 `response.completed.response.tools.doc_filter` 设置文档字段级别的检索过滤条件,确保只在符合条件的文档中检索。 > **说明** > > * 支持用作过滤条件的文档字段: > * 系统字段:`doc_id`(仅手动创建的知识库)、`_sys_auto_doc_id`(手动 + API 创建均适用) > * 自定义字段:已为知识库文档添加的**文档标签**(对应知识库 `index_config.fields` 中的 `field`) > * 支持单一条件过滤和多条件组合过滤(支持 `And` / `Or` 逻辑运算)。 > * 详细使用方式和支持字段参见 [filter 表达式](https://docs.volcengine.com/docs/84313/1419289?lang=zh#filter-%E8%A1%A8%E8%BE%BE%E5%BC%8F)。 > * 若自定义字段类型为 `Boolean`,取值范围是 `True` / `False`,大小写规则:cURL 用 `true` / `false`,Python 用 `True` / `False`。 **limit** `integer` | 最大结果数 `response.completed.response.tools.limit` 最大搜索结果数量。 **取值范围**:`[1, 200]` **max_keyword** `integer` | 最大关键词数 `response.completed.response.tools.max_keyword` 最大并行搜索关键词数量。 **取值范围**:`[1, 50]` **ranking_options** `object` | 排序选项 `response.completed.response.tools.ranking_options` 检索后处理选项。可参考 [知识库 API 文档](https://docs.volcengine.com/docs/84313/1350012?lang=zh) `post_processing` 字段。 **chunk_diffusion_count** `integer` | 切片扩散数 `response.completed.response.tools.ranking_options.chunk_diffusion_count` 检索阶段返回命中切片的上下几片邻近切片。取 `0` 表示不进行 chunk diffusion。 **取值范围**:`[0, 5]` **chunk_group** `boolean` | 文本聚合 `response.completed.response.tools.ranking_options.chunk_group` 文本聚合。 * 默认不聚合。 * 对于非结构化文件,可开启文本聚合以更好保留原文档内容语序。 * 开启后,会根据文档及文档顺序,对切片重新聚合排序返回。 **get_attachment_link** `boolean` | 获取附件链接 `response.completed.response.tools.ranking_options.get_attachment_link` 是否获取切片中图片的临时下载链接。 **rerank_model** `string` | Rerank 模型 `response.completed.response.tools.ranking_options.rerank_model` rerank 模型选择。默认值:`base-multilingual-rerank`。取值:`base-multilingual-rerank` / `m3-v2-rerank`。 > **说明** > > * 仅在 `rerank_switch` 为 `true` 时生效。 > * `base-multilingual-rerank`(推荐):速度快、长文本、支持 70+ 种语言。 > * `m3-v2-rerank`:常规文本、支持 100+ 种语言。 **rerank_only_chunk** `boolean` | 仅切片重排 `response.completed.response.tools.ranking_options.rerank_only_chunk` 是否仅根据 chunk 内容计算重排分数。`true` 只根据 chunk 内容计算分;`false` 根据 chunk title + 内容一起计算排序分。 **rerank_switch** `boolean` | 开启重排 `response.completed.response.tools.ranking_options.rerank_switch` 是否自动对检索结果做 rerank。若设置为 `true`,则会自动请求 rerank 模型排序。 **retrieve_count** `integer` | 重排切片数 `response.completed.response.tools.ranking_options.retrieve_count` 进入重排的切片数量。 > **注意** > > * 仅在 `rerank_switch` 为 `true` 时生效。 > * `retrieve_count` 需要大于等于 `limit`,否则会抛出错误。 豆包助手 `object` 豆包助手工具,让模型使用豆包的聊天、深度思考、AI 搜索和推理搜索能力。 **feature** `object` | 功能配置 `response.completed.response.tools.feature` 豆包助手的子功能配置,用于按需开启聊天、深度思考、AI 搜索、推理搜索四类能力并设置对应角色描述。 **ai_search** `object` | AI 搜索 `response.completed.response.tools.feature.ai_search` AI 搜索功能配置。 **role_description** `string` | 角色描述 `response.completed.response.tools.feature.ai_search.role_description` 使用豆包助手时修改角色设定。默认值:`你的名字是豆包,有很强的专业性。` > **注意** > > 此字段与 `system prompt`、`instructions` 互斥,同时配置时以本字段为准。 **type** `string` | 开关 `response.completed.response.tools.feature.ai_search.type` 功能开关。可选值:`enabled`、`disabled`。 **chat** `object` | 普通聊天 `response.completed.response.tools.feature.chat` 普通聊天功能配置。 **role_description** `string` | 角色描述 `response.completed.response.tools.feature.chat.role_description` 使用豆包助手时修改角色设定。默认值:`你的名字是豆包,有很强的专业性。` > **注意** > > 此字段与 `system prompt`、`instructions` 互斥,同时配置时以本字段为准。 **type** `string` | 开关 `response.completed.response.tools.feature.chat.type` 功能开关。可选值:`enabled`、`disabled`。 **deep_chat** `object` | 深度聊天 `response.completed.response.tools.feature.deep_chat` 深度聊天功能配置。 **role_description** `string` | 角色描述 `response.completed.response.tools.feature.deep_chat.role_description` 使用豆包助手时修改角色设定。默认值:`你的名字是豆包,有很强的专业性。` > **注意** > > 此字段与 `system prompt`、`instructions` 互斥,同时配置时以本字段为准。 **type** `string` | 开关 `response.completed.response.tools.feature.deep_chat.type` 功能开关。可选值:`enabled`、`disabled`。 **reasoning_search** `object` | 推理搜索 `response.completed.response.tools.feature.reasoning_search` 推理搜索功能配置。 **role_description** `string` | 角色描述 `response.completed.response.tools.feature.reasoning_search.role_description` 使用豆包助手时修改角色设定。默认值:`你的名字是豆包,有很强的专业性。` > **注意** > > 此字段与 `system prompt`、`instructions` 互斥,同时配置时以本字段为准。 **type** `string` | 开关 `response.completed.response.tools.feature.reasoning_search.type` 功能开关。可选值:`enabled`、`disabled`。 **type** `string` | 类型 `response.completed.response.tools.type` 工具类型,此处固定为 `doubao_app` **user_location** `object` | 用户位置 `response.completed.response.tools.user_location` 用户地理位置信息,用于搜索优化。 **type** `string` | 类型 `response.completed.response.tools.user_location.type` 位置类型。 取值固定为 `approximate`。 **city** `string` | 城市 `response.completed.response.tools.user_location.city` 用户所在城市。 **country** `string` | 国家 `response.completed.response.tools.user_location.country` 用户所在国家。 **region** `string` | 地区 `response.completed.response.tools.user_location.region` 用户所在地区。 **timezone** `number` | 时区 `response.completed.response.tools.user_location.timezone` 用户所在时区。 **top_p** `number` | 采样阈值 `response.completed.response.top_p` 本次请求实际使用的核采样概率阈值。 **usage** `object` | 用量统计 `response.completed.response.usage` 本次响应的 token 用量统计,包含输入、输出与总计 token 数等明细。 **input_tokens** `integer` | 输入 token 数 `response.completed.response.usage.input_tokens` 输入消耗的 token 数量。 **input_tokens_details** `object` | 输入明细 `response.completed.response.usage.input_tokens_details` 输入 token 用量明细。 **cached_tokens** `integer` | 缓存 token `response.completed.response.usage.input_tokens_details.cached_tokens` 命中缓存的 token 数量。 **audio_cached_tokens** `integer` | 音频缓存 Token 数 `response.completed.response.usage.input_tokens_details.audio_cached_tokens` 缓存命中的音频输入内容所消耗的 token 数量。仅在隐式缓存模式且命中音频缓存时返回;开启显式缓存时该字段不返回。 **audio_tokens** `integer` | 音频 token `response.completed.response.usage.input_tokens_details.audio_tokens` 音频输入消耗的 token 数量。 **output_tokens** `integer` | 输出 token 数 `response.completed.response.usage.output_tokens` 输出消耗的 token 数量。 **output_tokens_details** `object` | 输出明细 `response.completed.response.usage.output_tokens_details` 输出 token 用量明细。 **reasoning_tokens** `integer` | 思考 token `response.completed.response.usage.output_tokens_details.reasoning_tokens` 深度思考消耗的 token 数量。 **total_tokens** `integer` | 总 token 数 `response.completed.response.usage.total_tokens` 本次请求消耗的 token 总数。 **tool_usage** `object` | 工具用量 `response.completed.response.usage.tool_usage` 工具调用用量统计。 **doubao_app** `integer` | 豆包次数 `response.completed.response.usage.tool_usage.doubao_app` 豆包助手工具调用次数。 **knowledge_search** `integer` | 知识库次数 `response.completed.response.usage.tool_usage.knowledge_search` 知识库搜索工具调用次数。 **mcp** `integer` | MCP 次数 `response.completed.response.usage.tool_usage.mcp` MCP 工具调用次数。 **web_search** `integer` | 搜索次数 `response.completed.response.usage.tool_usage.web_search` 联网搜索工具调用次数。 **tool_usage_details** `object` | 工具明细 `response.completed.response.usage.tool_usage_details` 工具调用用量明细。 **doubao_app** `object` | 豆包明细 `response.completed.response.usage.tool_usage_details.doubao_app` 豆包助手工具用量明细。 **knowledge_search** `object` | 知识库明细 `response.completed.response.usage.tool_usage_details.knowledge_search` 知识库搜索工具用量明细。 **mcp** `object` | MCP 明细 `response.completed.response.usage.tool_usage_details.mcp` MCP 工具用量明细。 **web_search** `object` | 搜索明细 `response.completed.response.usage.tool_usage_details.web_search` 联网搜索工具用量明细。 **sequence_number** `integer` | 序列号 `response.completed.sequence_number` 事件的序列号。 **type** `string` | 事件类型 `response.completed.type` 事件的类型,总是 `response.completed` ### response.incomplete > 当响应以未完成状态结束时触发的事件。 **response** `object` | 响应对象 `response.incomplete.response` 未完成状态的响应。包含参数与非流式调用返回的参数一致。 **created_at** `integer` | 创建时间戳 `response.incomplete.response.created_at` 该 Response 创建时的 Unix 时间戳(单位:秒)。 **id** `string` | 响应 ID `response.incomplete.response.id` 本次 Response 的唯一标识,可用于后续查询、续接或删除该响应。 **model** `string` | 模型 ID `response.incomplete.response.model` 生成本次响应所使用的模型标识,回显请求中的 model 字段。 **object** `string` | 对象类型 `response.incomplete.response.object` 返回对象的类型标识,用于区分响应对象种类。 取值固定为 `response`。 **output** `object[]` | 输出内容 `response.incomplete.response.output` 模型本次响应产出的 Item 列表,按生成顺序排列,可能包含消息、工具调用、推理等不同类型条目。 消息输出 `object` 模型生成的消息输出,包含文本内容。 **content** `object[]` | 输出内容 `response.incomplete.response.output.content` 输出内容列表。 模型回答文本 `object` 模型生成的最终回答文本。 **type** `string` | 类型 `response.incomplete.response.output.content.type` 内容类型判别字段,用于区分 union 变体。 取值固定为 `output_text`。 **annotations** `object[]` | 标注列表 `response.incomplete.response.output.content.annotations` 文本附带的标注信息列表(如引用来源等) 网页引用 `object` 引用自互联网网页的标注信息。 **title** `string` | 标题 `response.incomplete.response.output.content.annotations.title` 引用网页的标题。 **type** `string` | 类型 `response.incomplete.response.output.content.annotations.type` 标注类型的判别字段(discriminator)。 取值固定为 `url_citation`。 **url** `string` | 网址 `response.incomplete.response.output.content.annotations.url` 引用网页的 URL 地址。 **cover_image** `object` | 封面图 `response.incomplete.response.output.content.annotations.cover_image` 网页封面图片信息。 **height** `integer` | 高度 `response.incomplete.response.output.content.annotations.cover_image.height` 封面图片高度(像素) **url** `string` | 图片地址 `response.incomplete.response.output.content.annotations.cover_image.url` 封面图片的 URL 地址。 **width** `integer` | 宽度 `response.incomplete.response.output.content.annotations.cover_image.width` 封面图片宽度(像素) **freshness_info** `string` | 新鲜度 `response.incomplete.response.output.content.annotations.freshness_info` 内容新鲜度信息。 **logo_url** `string` | Logo 地址 `response.incomplete.response.output.content.annotations.logo_url` 网站 Logo 图标地址。 **mobile_url** `string` | 移动端地址 `response.incomplete.response.output.content.annotations.mobile_url` 移动端访问地址。 **publish_time** `string` | 发布时间 `response.incomplete.response.output.content.annotations.publish_time` 网页发布时间。 **site_name** `string` | 站点名 `response.incomplete.response.output.content.annotations.site_name` 站点名称。 **summary** `string` | 摘要 `response.incomplete.response.output.content.annotations.summary` 网页内容摘要。 文档引用 `object` 引用自私域知识库文档的标注信息。 **type** `string` | 类型 `response.incomplete.response.output.content.annotations.type` 标注类型。 取值固定为 `doc_citation`。 **chunk_attachment** `object[]` | 分块附件 `response.incomplete.response.output.content.annotations.chunk_attachment` 引用分块附带的附件信息列表。 **chunk_id** `integer` | 分块 ID `response.incomplete.response.output.content.annotations.chunk_id` 引用文档分块的 ID。 **doc_id** `string` | 文档 ID `response.incomplete.response.output.content.annotations.doc_id` 引用文档的 ID。 **doc_name** `string` | 文档名 `response.incomplete.response.output.content.annotations.doc_name` 引用文档的名称。 **text** `string` | 文本内容 `response.incomplete.response.output.content.text` 模型生成的文本内容。 模型思维链文本 `object` 模型生成的思维链文本。 **type** `string` | 类型 `response.incomplete.response.output.content.type` 内容类型标识,用于区分 union 变体。 取值固定为 `reasoning_text`。 **annotations** `object[]` | 标注列表 `response.incomplete.response.output.content.annotations` 思维链附带的标注信息列表。 网页引用 `object` 引用自互联网网页的标注信息。 **title** `string` | 标题 `response.incomplete.response.output.content.annotations.title` 引用网页的标题。 **type** `string` | 类型 `response.incomplete.response.output.content.annotations.type` 标注类型的判别字段(discriminator)。 取值固定为 `url_citation`。 **url** `string` | 网址 `response.incomplete.response.output.content.annotations.url` 引用网页的 URL 地址。 **cover_image** `object` | 封面图 `response.incomplete.response.output.content.annotations.cover_image` 网页封面图片信息。 **height** `integer` | 高度 `response.incomplete.response.output.content.annotations.cover_image.height` 封面图片高度(像素) **url** `string` | 图片地址 `response.incomplete.response.output.content.annotations.cover_image.url` 封面图片的 URL 地址。 **width** `integer` | 宽度 `response.incomplete.response.output.content.annotations.cover_image.width` 封面图片宽度(像素) **freshness_info** `string` | 新鲜度 `response.incomplete.response.output.content.annotations.freshness_info` 内容新鲜度信息。 **logo_url** `string` | Logo 地址 `response.incomplete.response.output.content.annotations.logo_url` 网站 Logo 图标地址。 **mobile_url** `string` | 移动端地址 `response.incomplete.response.output.content.annotations.mobile_url` 移动端访问地址。 **publish_time** `string` | 发布时间 `response.incomplete.response.output.content.annotations.publish_time` 网页发布时间。 **site_name** `string` | 站点名 `response.incomplete.response.output.content.annotations.site_name` 站点名称。 **summary** `string` | 摘要 `response.incomplete.response.output.content.annotations.summary` 网页内容摘要。 文档引用 `object` 引用自私域知识库文档的标注信息。 **type** `string` | 类型 `response.incomplete.response.output.content.annotations.type` 标注类型。 取值固定为 `doc_citation`。 **chunk_attachment** `object[]` | 分块附件 `response.incomplete.response.output.content.annotations.chunk_attachment` 引用分块附带的附件信息列表。 **chunk_id** `integer` | 分块 ID `response.incomplete.response.output.content.annotations.chunk_id` 引用文档分块的 ID。 **doc_id** `string` | 文档 ID `response.incomplete.response.output.content.annotations.doc_id` 引用文档的 ID。 **doc_name** `string` | 文档名 `response.incomplete.response.output.content.annotations.doc_name` 引用文档的名称。 **text** `string` | 文本内容 `response.incomplete.response.output.content.text` 模型思维链文本内容。 **id** `string` | 条目 ID `response.incomplete.response.output.id` 输出条目唯一标识。 **role** `string` | 角色 `response.incomplete.response.output.role` 消息发送者的角色。 取值固定为 `assistant`。 **status** `string` | 状态 `response.incomplete.response.output.status` 消息输出条目的当前状态。 * `completed`:消息已生成完毕。 * `in_progress`:消息正在生成中(流式场景)。 * `incomplete`:消息未完整生成(例如达到 `max_output_tokens` 上限)。 * `failed`:消息生成失败。 **type** `string` | 类型 `response.incomplete.response.output.type` 输出条目的类型标识。 取值固定为 `message`。 **partial** `boolean` | 增量片段 `response.incomplete.response.output.partial` 是否为流式增量片段。 **phase** `string` | 消息阶段 `response.incomplete.response.output.phase` 标记 assistant 消息属于中间讲解还是最终回答。在回放 assistant 历史消息时,建议保留并原样回传该字段。可选值:`commentary`、`final_answer`。 函数调用输出 `object` 模型发起的函数调用请求。 **type** `string` | 类型 `response.incomplete.response.output.type` 输出条目类型标识,用于区分 OutputItem 变体。 取值固定为 `function_call`。 **arguments** `string` | 参数 `response.incomplete.response.output.arguments` 函数参数的 JSON 字符串。 **call_id** `string` | 调用 ID `response.incomplete.response.output.call_id` 函数调用的唯一标识 ID,用于将该 function_call 输出与后续回传的 function_call_output 关联匹配。 **id** `string` | 条目 ID `response.incomplete.response.output.id` 输出条目唯一标识。 **name** `string` | 函数名 `response.incomplete.response.output.name` 调用的函数名称。 **status** `string` | 状态 `response.incomplete.response.output.status` 函数调用条目的当前状态。 * `completed`:函数调用请求已生成完毕。 * `in_progress`:函数调用请求正在生成中(流式场景)。 * `incomplete`:函数调用请求未完整生成(例如达到 `max_output_tokens` 上限)。 * `failed`:函数调用生成失败。 思维链输出 `object` 模型的深度思考过程输出。 **status** `string` | 状态 `response.incomplete.response.output.status` 推理条目的处理状态,用于判断思维链是否生成完成。可选值:`completed`、`failed`、`in_progress`、`incomplete`。 **summary** `object[]` | 推理摘要 `response.incomplete.response.output.summary` 推理摘要内容列表。 **type** `string` | 类型 `response.incomplete.response.output.summary.type` 摘要片段类型标识。 取值固定为 `summary_text`。 **text** `string` | 摘要文本 `response.incomplete.response.output.summary.text` 思维链摘要文本内容。 **type** `string` | 类型 `response.incomplete.response.output.type` 输出条目类型标识,用于区分 OutputItem 变体。 取值固定为 `reasoning`。 **content** `object[]` | 推理内容 `response.incomplete.response.output.content` 思维链推理过程的内容元素列表。 模型回答文本 `object` 模型生成的最终回答文本。 **type** `string` | 类型 `response.incomplete.response.output.content.type` 内容类型判别字段,用于区分 union 变体。 取值固定为 `output_text`。 **annotations** `object[]` | 标注列表 `response.incomplete.response.output.content.annotations` 文本附带的标注信息列表(如引用来源等) 网页引用 `object` 引用自互联网网页的标注信息。 **title** `string` | 标题 `response.incomplete.response.output.content.annotations.title` 引用网页的标题。 **type** `string` | 类型 `response.incomplete.response.output.content.annotations.type` 标注类型的判别字段(discriminator)。 取值固定为 `url_citation`。 **url** `string` | 网址 `response.incomplete.response.output.content.annotations.url` 引用网页的 URL 地址。 **cover_image** `object` | 封面图 `response.incomplete.response.output.content.annotations.cover_image` 网页封面图片信息。 **height** `integer` | 高度 `response.incomplete.response.output.content.annotations.cover_image.height` 封面图片高度(像素) **url** `string` | 图片地址 `response.incomplete.response.output.content.annotations.cover_image.url` 封面图片的 URL 地址。 **width** `integer` | 宽度 `response.incomplete.response.output.content.annotations.cover_image.width` 封面图片宽度(像素) **freshness_info** `string` | 新鲜度 `response.incomplete.response.output.content.annotations.freshness_info` 内容新鲜度信息。 **logo_url** `string` | Logo 地址 `response.incomplete.response.output.content.annotations.logo_url` 网站 Logo 图标地址。 **mobile_url** `string` | 移动端地址 `response.incomplete.response.output.content.annotations.mobile_url` 移动端访问地址。 **publish_time** `string` | 发布时间 `response.incomplete.response.output.content.annotations.publish_time` 网页发布时间。 **site_name** `string` | 站点名 `response.incomplete.response.output.content.annotations.site_name` 站点名称。 **summary** `string` | 摘要 `response.incomplete.response.output.content.annotations.summary` 网页内容摘要。 文档引用 `object` 引用自私域知识库文档的标注信息。 **type** `string` | 类型 `response.incomplete.response.output.content.annotations.type` 标注类型。 取值固定为 `doc_citation`。 **chunk_attachment** `object[]` | 分块附件 `response.incomplete.response.output.content.annotations.chunk_attachment` 引用分块附带的附件信息列表。 **chunk_id** `integer` | 分块 ID `response.incomplete.response.output.content.annotations.chunk_id` 引用文档分块的 ID。 **doc_id** `string` | 文档 ID `response.incomplete.response.output.content.annotations.doc_id` 引用文档的 ID。 **doc_name** `string` | 文档名 `response.incomplete.response.output.content.annotations.doc_name` 引用文档的名称。 **text** `string` | 文本内容 `response.incomplete.response.output.content.text` 模型生成的文本内容。 模型思维链文本 `object` 模型生成的思维链文本。 **type** `string` | 类型 `response.incomplete.response.output.content.type` 内容类型标识,用于区分 union 变体。 取值固定为 `reasoning_text`。 **annotations** `object[]` | 标注列表 `response.incomplete.response.output.content.annotations` 思维链附带的标注信息列表。 网页引用 `object` 引用自互联网网页的标注信息。 **title** `string` | 标题 `response.incomplete.response.output.content.annotations.title` 引用网页的标题。 **type** `string` | 类型 `response.incomplete.response.output.content.annotations.type` 标注类型的判别字段(discriminator)。 取值固定为 `url_citation`。 **url** `string` | 网址 `response.incomplete.response.output.content.annotations.url` 引用网页的 URL 地址。 **cover_image** `object` | 封面图 `response.incomplete.response.output.content.annotations.cover_image` 网页封面图片信息。 **height** `integer` | 高度 `response.incomplete.response.output.content.annotations.cover_image.height` 封面图片高度(像素) **url** `string` | 图片地址 `response.incomplete.response.output.content.annotations.cover_image.url` 封面图片的 URL 地址。 **width** `integer` | 宽度 `response.incomplete.response.output.content.annotations.cover_image.width` 封面图片宽度(像素) **freshness_info** `string` | 新鲜度 `response.incomplete.response.output.content.annotations.freshness_info` 内容新鲜度信息。 **logo_url** `string` | Logo 地址 `response.incomplete.response.output.content.annotations.logo_url` 网站 Logo 图标地址。 **mobile_url** `string` | 移动端地址 `response.incomplete.response.output.content.annotations.mobile_url` 移动端访问地址。 **publish_time** `string` | 发布时间 `response.incomplete.response.output.content.annotations.publish_time` 网页发布时间。 **site_name** `string` | 站点名 `response.incomplete.response.output.content.annotations.site_name` 站点名称。 **summary** `string` | 摘要 `response.incomplete.response.output.content.annotations.summary` 网页内容摘要。 文档引用 `object` 引用自私域知识库文档的标注信息。 **type** `string` | 类型 `response.incomplete.response.output.content.annotations.type` 标注类型。 取值固定为 `doc_citation`。 **chunk_attachment** `object[]` | 分块附件 `response.incomplete.response.output.content.annotations.chunk_attachment` 引用分块附带的附件信息列表。 **chunk_id** `integer` | 分块 ID `response.incomplete.response.output.content.annotations.chunk_id` 引用文档分块的 ID。 **doc_id** `string` | 文档 ID `response.incomplete.response.output.content.annotations.doc_id` 引用文档的 ID。 **doc_name** `string` | 文档名 `response.incomplete.response.output.content.annotations.doc_name` 引用文档的名称。 **text** `string` | 文本内容 `response.incomplete.response.output.content.text` 模型思维链文本内容。 **encrypted_content** `string` | 加密思维链 `response.incomplete.response.output.encrypted_content` 思考内容加密原文。经加密及压缩处理后的思考内容原文。 相关文档: * [关键规则](/docs/agent-model-invocation-practice#key-rules) * [回传思考内容加密块使用示例](/docs/agent-model-invocation-practice#encrypted-thinking-block-examples) > **说明** > > 流式输出场景下,思考内容加密原文通过 `response.output_item.added`、`response.output_item.done`、`response.completed` 等相关事件下发,需要按事件中 `encrypted_content` 字段非空过滤获取。 **模型支持**: * `doubao-seed-2-0-lite-260428 及后续版本` **id** `string` | 条目 ID `response.incomplete.response.output.id` 输出条目唯一标识。 语音转写输出 `object` 模型返回的语音转写输出。 **status** `string` | 状态 `response.incomplete.response.output.status` 语音转写条目的当前状态。 * `completed`:转写已生成完毕。 * `in_progress`:转写正在生成中(流式场景)。 * `incomplete`:转写未完整生成(例如达到输出上限而截断)。 * `failed`:转写生成失败。 **type** `string` | 类型 `response.incomplete.response.output.type` 输出条目类型标识。 取值固定为 `transcription`。 **id** `string` | 条目 ID `response.incomplete.response.output.id` 输出条目唯一标识。 **transcription** `object[]` | 转写内容 `response.incomplete.response.output.transcription` 语音转写结果片段列表。 **type** `string` | 类型 `response.incomplete.response.output.transcription.type` 转写片段类型。 取值固定为 `transcription_text`。 **chunks** `object[]` | 音频小段 `response.incomplete.response.output.transcription.chunks` 当前片段对应的音频小段列表。 **end_time** `integer` | 结束时间 `response.incomplete.response.output.transcription.chunks.end_time` 片段结束时间(毫秒) **start_time** `integer` | 开始时间 `response.incomplete.response.output.transcription.chunks.start_time` 片段开始时间(毫秒) **text** `string` | 文字内容 `response.incomplete.response.output.transcription.chunks.text` 当前片段对应的文字内容。 **text** `string` | 转写文本 `response.incomplete.response.output.transcription.text` 当前片段的转写文本。 网页搜索调用 `object` 模型发起的网页搜索调用记录。 **id** `string` | 条目 ID `response.incomplete.response.output.id` 输出条目唯一标识。 **status** `string` | 状态 `response.incomplete.response.output.status` 网页搜索调用的当前状态。可选值:`in_progress`、`searching`、`completed`、`incomplete`、`failed`。 **type** `string` | 类型 `response.incomplete.response.output.type` 输出条目类型标识,用于区分 OutputItem 变体。 取值固定为 `web_search_call`。 **action** `object` | 搜索动作 `response.incomplete.response.output.action` 描述模型执行的网页搜索动作,包括搜索类型与查询关键字。 **query** `string` | 查询语句 `response.incomplete.response.output.action.query` 模型实际发起的搜索查询语句。 **type** `string` | 类型 `response.incomplete.response.output.action.type` 网页搜索动作的类型标识。 取值固定为 `search`。 **queries** `string[]` | 查询语句列表 `response.incomplete.response.output.action.queries` 本次网页搜索产生的查询语句列表。 图像处理调用 `object` 模型发起的图像处理调用记录。 **id** `string` | 条目 ID `response.incomplete.response.output.id` 输出条目唯一标识。 **status** `string` | 状态 `response.incomplete.response.output.status` 图像处理调用的当前状态。 * `completed`:图像处理已完成。 * `in_progress`:图像处理正在执行中。 * `incomplete`:图像处理未完整执行(例如被中断或截断)。 * `failed`:图像处理执行失败,具体原因见 `error` 字段。 **type** `string` | 类型 `response.incomplete.response.output.type` 输出条目类型标识,用于区分 OutputItem 变体。 取值固定为 `image_process`。 **action** `object` | 处理动作 `response.incomplete.response.output.action` 图像处理动作详情。 **type** `string` | 类型 `response.incomplete.response.output.action.type` 图像处理动作类型。 **result_image_url** `string` | 结果图地址 `response.incomplete.response.output.action.result_image_url` 处理后图像的 URL 地址。 **arguments** `object` | 处理参数 `response.incomplete.response.output.arguments` 图像处理动作的输入参数,以键值对形式承载具体处理选项。 **error** `object` | 图像处理错误 `response.incomplete.response.output.error` 图像处理失败时的错误信息。 **message** `string` | 错误描述 `response.incomplete.response.output.error.message` 错误的可读描述。 MCP 审批请求 `object` MCP 工具调用前的审批请求记录。 **arguments** `string` | 调用参数 `response.incomplete.response.output.arguments` 工具调用参数的 JSON 字符串。 **name** `string` | 工具名 `response.incomplete.response.output.name` 待运行的工具名称。 **server_label** `string` | 服务标签 `response.incomplete.response.output.server_label` 发起请求的 MCP Server 标签。 **type** `string` | 类型 `response.incomplete.response.output.type` 输出项类型标识符,用于区分 OutputItem 的变体。 取值固定为 `mcp_approval_request`。 **id** `string` | 请求 ID `response.incomplete.response.output.id` 审批请求的唯一 ID。 MCP 工具清单 `object` MCP Server 提供的工具清单输出。 **server_label** `string` | 服务标签 `response.incomplete.response.output.server_label` MCP Server 标签。 **type** `string` | 类型 `response.incomplete.response.output.type` 输出项类型标识。 取值固定为 `mcp_list_tools`。 **error** `string` | 错误信息 `response.incomplete.response.output.error` 当 MCP Server 无法返回工具列表时的错误信息。 **id** `string` | 列表 ID `response.incomplete.response.output.id` 工具列表的唯一 ID。 **tools** `object[]` | 工具列表 `response.incomplete.response.output.tools` 该 MCP Server 上可用的工具列表。 **name** `string` | 工具名 `response.incomplete.response.output.tools.name` 工具名称。 **annotations** `object` | 注解信息 `response.incomplete.response.output.tools.annotations` 工具的附加注解信息。 **description** `string` | 工具描述 `response.incomplete.response.output.tools.description` 工具的功能描述。 **input_schema** `object` | 入参 Schema `response.incomplete.response.output.tools.input_schema` 描述工具入参的 JSON Schema。 MCP 工具调用 `object` 模型对 MCP 工具的实际调用记录及结果。 **name** `string` | 工具名 `response.incomplete.response.output.name` 实际运行的工具名称。 **server_label** `string` | 服务标签 `response.incomplete.response.output.server_label` 运行工具的 MCP Server 标签。 **type** `string` | 类型 `response.incomplete.response.output.type` 标识该输出项为 MCP 工具调用记录。 取值固定为 `mcp_call`。 **arguments** `string` | 调用参数 `response.incomplete.response.output.arguments` 传递给 MCP 工具的调用参数,格式为 JSON 字符串。 > **说明** > > 该字段通过 `response.mcp_call_arguments.delta` 事件流式追加,初始 `output_item.added` 事件可能不携带该字段。 **error** `string` | 错误信息 `response.incomplete.response.output.error` 工具调用失败时的错误信息。 **id** `string` | 调用 ID `response.incomplete.response.output.id` 工具调用的唯一 ID。 **output** `string` | 返回结果 `response.incomplete.response.output.output` 工具调用的返回结果。 知识库检索调用 `object` 模型发起的私域知识库检索调用记录。 **knowledge_resource_id** `string` | 知识库 ID `response.incomplete.response.output.knowledge_resource_id` 检索使用的知识库 ID。 **queries** `string[]` | 查询语句 `response.incomplete.response.output.queries` 模型实际执行的检索查询语句。 **status** `string` | 状态 `response.incomplete.response.output.status` 知识库检索调用的执行状态。可选值:`in_progress`、`searching`、`completed`、`failed`、`incomplete`。 **type** `string` | 类型 `response.incomplete.response.output.type` 输出条目类型标识,用于区分不同类型的输出条目。 取值固定为 `knowledge_search_call`。 **id** `string` | 条目 ID `response.incomplete.response.output.id` 输出条目唯一标识。 豆包应用调用 `object` 模型对豆包助手能力的调用记录。 **type** `string` | 类型 `response.incomplete.response.output.type` 输出条目类型标识。 取值固定为 `doubao_app_call`。 **blocks** `object[]` | 内容块 `response.incomplete.response.output.blocks` 豆包应用调用产出的内容块列表。 文本输出 `object` 豆包应用产出的文本输出内容块。 **type** `string` | 类型 `response.incomplete.response.output.blocks.type` 内容块类型标识符。 取值固定为 `output_text`。 **id** `string` | 块 ID `response.incomplete.response.output.blocks.id` 内容块的唯一标识。 **parent_id** `string` | 父级 ID `response.incomplete.response.output.blocks.parent_id` 所属父级条目的 ID。 **status** `string` | 状态 `response.incomplete.response.output.blocks.status` 内容块状态。 **text** `string` | 文本内容 `response.incomplete.response.output.blocks.text` 思维链文本 `object` 豆包应用产出的思维链文本内容块。 **type** `string` | 类型 `response.incomplete.response.output.blocks.type` 内容块类型标识符。 取值固定为 `reasoning_text`。 **id** `string` | 块 ID `response.incomplete.response.output.blocks.id` 内容块的唯一标识。 **parent_id** `string` | 父级 ID `response.incomplete.response.output.blocks.parent_id` 所属父级条目的 ID。 **reasoning_text** `string` | 思考文本 `response.incomplete.response.output.blocks.reasoning_text` 思维链文本内容。 **status** `string` | 状态 `response.incomplete.response.output.blocks.status` 内容块状态。 搜索过程 `object` 豆包应用 AI 搜索过程产出的内容块。 **type** `string` | 类型 `response.incomplete.response.output.blocks.type` 内容块类型标识符。 取值固定为 `search`。 **id** `string` | 块 ID `response.incomplete.response.output.blocks.id` 内容块的唯一标识。 **parent_id** `string` | 父级 ID `response.incomplete.response.output.blocks.parent_id` 所属父级条目的 ID。 **queries** `string[]` | 查询语句 `response.incomplete.response.output.blocks.queries` 搜索查询语句列表。 **results** `object[]` | 搜索结果 `response.incomplete.response.output.blocks.results` 搜索结果列表。 **text_card** `object` | 文本卡片 `response.incomplete.response.output.blocks.results.text_card` 文本卡片形式的搜索结果。 **sitename** `string` | 站点名 `response.incomplete.response.output.blocks.results.text_card.sitename` 来源站点名称。 **title** `string` | 标题 `response.incomplete.response.output.blocks.results.text_card.title` 搜索结果标题。 **url** `string` | 网址 `response.incomplete.response.output.blocks.results.text_card.url` 搜索结果 URL 地址。 **status** `string` | 状态 `response.incomplete.response.output.blocks.status` 内容块状态。 **summary** `string` | 搜索总结 `response.incomplete.response.output.blocks.summary` AI 搜索过程中对本轮搜索结果的总结性文字,概括从搜索结果中提取的核心信息。 推理搜索过程 `object` 豆包应用推理搜索过程产出的内容块。 **type** `string` | 类型 `response.incomplete.response.output.blocks.type` 内容块类型。 取值固定为 `reasoning_search`。 **id** `string` | 块 ID `response.incomplete.response.output.blocks.id` 内容块的唯一标识。 **parent_id** `string` | 父级 ID `response.incomplete.response.output.blocks.parent_id` 所属父级条目的 ID。 **queries** `string[]` | 查询语句 `response.incomplete.response.output.blocks.queries` 搜索查询语句列表。 **results** `object[]` | 搜索结果 `response.incomplete.response.output.blocks.results` 搜索结果列表。 **text_card** `object` | 文本卡片 `response.incomplete.response.output.blocks.results.text_card` 文本卡片形式的搜索结果。 **sitename** `string` | 站点名 `response.incomplete.response.output.blocks.results.text_card.sitename` 来源站点名称。 **title** `string` | 标题 `response.incomplete.response.output.blocks.results.text_card.title` 搜索结果标题。 **url** `string` | 网址 `response.incomplete.response.output.blocks.results.text_card.url` 搜索结果 URL 地址。 **status** `string` | 状态 `response.incomplete.response.output.blocks.status` 推理搜索内容块的处理状态。可选值:`in_progress`、`searching`、`completed`、`incomplete`、`failed`。 **summary** `string` | 搜索总结 `response.incomplete.response.output.blocks.summary` 推理搜索过程中对本轮搜索结果的总结性文字,概括从搜索结果中提取的核心信息。 **feature** `string` | 功能名 `response.incomplete.response.output.feature` 本次调用触发的豆包子功能名称。可选值:`chat`、`deep_chat`、`ai_search`、`reasoning_search`。 **id** `string` | 条目 ID `response.incomplete.response.output.id` 输出条目唯一标识。 **status** `string` | 状态 `response.incomplete.response.output.status` 输出状态。可选值:`completed`、`failed`、`in_progress`、`incomplete`。 智能体工具调用 `object` 模型发起的智能体工具调用记录。 **name** `string` | 工具名 `response.incomplete.response.output.name` 被调用的智能体工具名称。 **status** `string` | 状态 `response.incomplete.response.output.status` 智能体工具调用的执行状态。可选值:`completed`、`failed`、`in_progress`、`incomplete`。 **type** `string` | 类型 `response.incomplete.response.output.type` 输出条目类型标识符,用于区分 OutputItem 的 variant。 取值固定为 `agent_tool_call`。 **id** `string` | 条目 ID `response.incomplete.response.output.id` 输出条目唯一标识。 **caching** `object` | 缓存配置 `response.incomplete.response.caching` 本次响应生效的上下文缓存配置,回显请求中的 caching 设置。 **prefix** `boolean` | 仅写缓存 `response.incomplete.response.caching.prefix` 是否仅写入前缀缓存,不生成回复。`true` 只写缓存,不返回模型输出;`false` 正常生成回复并写缓存。 **type** `string` | 缓存模式 `response.incomplete.response.caching.type` 缓存模式。 * `enabled`:开启上下文缓存。 * `disabled`:关闭上下文缓存。 **context_management** `object` | 上下文管理 `response.incomplete.response.context_management` 本次响应实际执行的上下文管理编辑操作,回显请求中 context_management 生效后的结果。 **applied_edits** `object[]` | 已应用编辑 `response.incomplete.response.context_management.applied_edits` 已应用的上下文编辑结果列表。 清理工具调用 `object` 已应用的清理工具调用编辑结果。 **cleared_tool_uses** `integer` | 清理次数 `response.incomplete.response.context_management.applied_edits.cleared_tool_uses` 已清理的工具调用数量。 **type** `string` | 类型 `response.incomplete.response.context_management.applied_edits.type` 编辑类型。 取值固定为 `clear_tool_uses`。 清理思维链 `object` 已应用的清理思维链编辑结果。 **cleared_thinking_turns** `integer` | 清理轮次 `response.incomplete.response.context_management.applied_edits.cleared_thinking_turns` 已清理的思维链轮次数量。 **type** `string` | 类型 `response.incomplete.response.context_management.applied_edits.type` 编辑类型。 取值固定为 `clear_thinking`。 **error** `object` | 错误信息 `response.incomplete.response.error` 模型响应过程发生错误时的错误信息。仅当 *status* 为 `failed` 时返回。 **code** `string` | 错误码 `response.incomplete.response.error.code` **message** `string` | 错误描述 `response.incomplete.response.error.message` 错误信息的可读描述。 **expire_at** `integer` | 过期时间戳 `response.incomplete.response.expire_at` 响应储存的过期时刻 Unix 时间戳(秒),回显请求中的 expire_at 设置,对 store 与 caching 均生效。 > **说明** > > 最多保留 7 天。 **incomplete_details** `object` | 未完成详情 `response.incomplete.response.incomplete_details` 响应未能完成的详细信息。仅当 *status* 为 `incomplete` 时返回。 **reason** `string` | 原因 `response.incomplete.response.incomplete_details.reason` 响应未完成的原因。 **content_filter** `object` | 内容过滤 `response.incomplete.response.incomplete_details.content_filter` 内容过滤详情。 **details** `string` | 详情 `response.incomplete.response.incomplete_details.content_filter.details` 内容过滤命中的详细描述。 **type** `string` | 类型 `response.incomplete.response.incomplete_details.content_filter.type` 内容过滤命中的类型。 **instructions** `string` | 系统指令 `response.incomplete.response.instructions` 本次响应生效的系统指令,回显请求中的 instructions 设置。 **max_output_tokens** `integer` | 最大输出长度 `response.incomplete.response.max_output_tokens` 回显请求中的 max_output_tokens 参数,即模型输出最大 token 数(含回答与思维链)。 **max_tool_calls** `integer` | 最大工具调用轮次 `response.incomplete.response.max_tool_calls` 本次响应生效的最大工具调用轮次,回显请求中的 max_tool_calls 设置。 **metadata** `object` | 自定义元数据 `response.incomplete.response.metadata` 回显请求中的 metadata 键值对元数据。最多支持 16 对键值,key 长度不超过 64 个字符,value 长度不超过 512 个字符,服务端不会解释其中内容。 **parallel_tool_calls** `boolean` | 并行工具调用 `response.incomplete.response.parallel_tool_calls` 本次请求实际生效的并行工具调用设置,回显请求中的 parallel_tool_calls 值。 **previous_response_id** `string` | 上轮响应 ID `response.incomplete.response.previous_response_id` 回显请求中的 previous_response_id,即前一轮响应的唯一标识。仅在请求传入该字段时返回。 **prompt_cache_key** `string` | 缓存分桶键 `response.incomplete.response.prompt_cache_key` 用于提升缓存命中率的分桶键,回显请求中的 prompt_cache_key 设置。 **reasoning** `object` | 推理配置 `response.incomplete.response.reasoning` 本次响应生效的深度思考工作量配置,回显请求中的 reasoning 设置。 **effort** `string` | 思考深度 `response.incomplete.response.reasoning.effort` 限制思考的工作量。减少思考深度可提升速度,思考花费的 token 更少。 * `none`:关闭思考。 * `minimal`:关闭思考,直接回答。 * `low`:轻量思考,侧重快速响应。 * `medium`:均衡模式,兼顾速度与深度。 * `high`:深度分析,处理复杂问题。 * `xhigh`:更高程度思考。 * `max`:最高程度思考,适配高难度推理任务。 > **注意:说明** > > 支持该字段的模型、默认取值、参数兼容映射规则,以及与 `thinking.type` 字段的关系,详见 [文档](/docs/responses-api-deep-thinking#dc4c1547)。 **safety_identifier** `string` | 安全标识 `response.incomplete.response.safety_identifier` 回显请求中传入的终端用户稳定标识,用于安全策略与违规行为追踪关联。 **service_tier** `string` | 推理模式 `response.incomplete.response.service_tier` 本次请求实际使用的推理模式。 * `fast`:本次请求使用 [在线推理(低延迟)](/docs/online-inference-low-latency) 模式。 * `auto`:本次请求使用 [在线推理(TPM 保障包)](/docs/tpm-guarantee-package) 模式。 * `default`:本次请求使用 [在线推理(常规)](/docs/online-inference-standard) 模式。 * `flex`:本次请求使用 [在线推理(低优)](/docs/online-inference-flex) 模式。 **session** `object` | 会话信息 `response.incomplete.response.session` 本次响应关联的会话信息,回显请求中 session 生效后的结果。 **id** `string` | 会话 ID `response.incomplete.response.session.id` 会话的唯一 ID。 **status** `string` | 响应状态 `response.incomplete.response.status` 本次响应的当前状态,标识生成流程处于进行中、已完成、未完成或已失败等阶段。 **store** `boolean` | 是否存储 `response.incomplete.response.store` 是否储存生成的模型响应以供后续通过 API 检索,回显请求中的 store 设置。 **temperature** `number` | 采样温度 `response.incomplete.response.temperature` 本次响应生效的采样温度,回显请求中的 temperature 设置。 **text** `object` | 输出格式 `response.incomplete.response.text` 本次响应生效的输出格式定义,回显请求中的 text 设置。 **format** `object` | 输出格式 `response.incomplete.response.text.format` 文本输出格式定义。 **type** `string` | 格式类型 `response.incomplete.response.text.format.type` 输出格式类型。可选值:`text`、`json_schema`、`json_object`。 > **注意** > > `json_object` / `json_schema` 能力尚在 beta 阶段,请谨慎在生产环境使用。 **description** `string` | 格式描述 `response.incomplete.response.text.format.description` 格式描述信息。 **name** `string` | 格式名称 `response.incomplete.response.text.format.name` 格式名称,作为 JSON Schema 输出格式的标识。 > **注意** > > 仅当 *type* 为 `json_schema` 时需要提供此字段。 **schema** `object` | Schema 定义 `response.incomplete.response.text.format.schema` JSON Schema 定义。当 *type* 为 `json_schema` 时必填。 **strict** `boolean` | 严格模式 `response.incomplete.response.text.format.strict` 是否严格按 JSON Schema 校验模型输出。 > **注意** > > 仅当 *type* 为 `json_schema` 时生效。 **thinking** `object` | 深度思考 `response.incomplete.response.thinking` 本次响应生效的深度思考配置,回显请求中的 thinking 设置。 **type** `string` | 思考模式 `response.incomplete.response.thinking.type` 深度思考模式。 * `enabled`:开启深度思考。 * `disabled`:关闭深度思考。 * `auto`:由模型自行判断是否需要深度思考。 **tool_choice** `string / object` | 工具调用策略 `response.incomplete.response.tool_choice` 本次请求实际生效的工具调用策略,回显请求中的 tool_choice 设置。 > **说明** > > 未指定工具时默认值为 `none`;存在工具时默认值为 `auto`。 简单策略 `string` 直接传入字符串 `none`、`auto` 或 `required`,控制工具调用整体策略。 指定工具 `object` 通过对象指定具体工具类型或工具名进行调用。 **type** `string` | 工具类型 `response.incomplete.response.tool_choice.type` 指定要调用的工具类型,用于精确路由到对应工具。可选值: * `function` * `web_search` * `image_process` * `mcp` * `knowledge_search` * `doubao_app` **name** `string` | 工具名称 `response.incomplete.response.tool_choice.name` 指定要调用的具体工具名,如函数名或 MCP 服务下的工具名。 **tools** `object[]` | 工具列表 `response.incomplete.response.tools` 本次响应生效的工具列表,回显请求中的 tools 设置。 函数调用 `object` 自定义函数调用(Function Calling),让模型生成结构化的函数参数。 **name** `string` | 函数名 `response.incomplete.response.tools.name` 供模型调用的函数名称,模型在 function_call 输出中以该名称回传,用于匹配对应函数。 **type** `string` | 类型 `response.incomplete.response.tools.type` 工具类型标识,用于在 union 中区分不同工具类别。 取值固定为 `function`。 **description** `string` | 函数描述 `response.incomplete.response.tools.description` 函数的描述信息,帮助模型理解何时使用该函数。 **parameters** `object` | 参数定义 `response.incomplete.response.tools.parameters` 函数参数定义,遵循 JSON Schema 格式。 联网搜索 `object` 联网搜索工具,让模型在需要时自动进行网页搜索获取实时信息。 **type** `string` | 类型 `response.incomplete.response.tools.type` 工具类型标识,用于区分 Tool 的不同变体。 取值固定为 `web_search`。 **limit** `integer` | 最大结果数 `response.incomplete.response.tools.limit` 每轮搜索最大返回结果数量。 > **说明** > > 单次搜索最多返回 20 条;单轮可能有多次搜索,最终召回条数受此参数限制影响。 **取值范围**:`[1, 50]` **max_keyword** `integer` | 最大关键词数 `response.incomplete.response.tools.max_keyword` 最大并行搜索关键词数量。 **取值范围**:`[1, 50]` **sources** `string[]` | 搜索来源 `response.incomplete.response.tools.sources` 搜索信息来源限制,指定模型可从哪些渠道检索网页内容。可选值:`toutiao`、`douyin`、`moji`、`search_engine`、`doubao`。 > **说明** > > `doubao` 不能与其他搜索来源同时配置。传入 `["doubao"]` 时,`tools.limit`、`tools.max_keyword`、`tools.user_location` 均不生效,向它们传入的值将被忽略。 **user_location** `object` | 用户位置 `response.incomplete.response.tools.user_location` 用户地理位置信息,用于搜索优化。 **type** `string` | 类型 `response.incomplete.response.tools.user_location.type` 位置类型。 取值固定为 `approximate`。 **city** `string` | 城市 `response.incomplete.response.tools.user_location.city` 用户所在城市。 **country** `string` | 国家 `response.incomplete.response.tools.user_location.country` 用户所在国家。 **region** `string` | 地区 `response.incomplete.response.tools.user_location.region` 用户所在地区。 **timezone** `number` | 时区 `response.incomplete.response.tools.user_location.timezone` 用户所在时区。 图像处理 `object` 图像处理工具,让模型对图片进行画点、选区、缩放、旋转等操作。 **type** `string` | 类型 `response.incomplete.response.tools.type` 工具类型标识,用于区分 Tool 的不同变体。 取值固定为 `image_process`。 **grounding** `object` | 选区功能 `response.incomplete.response.tools.grounding` 选区/裁切功能配置,启用后模型可返回图像中目标的检测框或裁切区域坐标。 **type** `string` | 开关 `response.incomplete.response.tools.grounding.type` 功能开关。可选值:`enabled`、`disabled`。 **point** `object` | 画点功能 `response.incomplete.response.tools.point` 画点/画线功能开关。 **type** `string` | 开关 `response.incomplete.response.tools.point.type` 功能开关。可选值:`enabled`、`disabled`。 **rotate** `object` | 旋转功能 `response.incomplete.response.tools.rotate` 旋转功能开关。启用后模型可请求对图片按指定角度进行旋转。 > **注意** > > 旋转角度支持范围为 0-359 度。 **type** `string` | 开关 `response.incomplete.response.tools.rotate.type` 功能开关。可选值:`enabled`、`disabled`。 **zoom** `object` | 缩放功能 `response.incomplete.response.tools.zoom` 缩放功能开关,启用后模型可对图像目标区域执行缩放操作。 > **说明** > > 缩放倍率支持范围 0.5-2.0 倍。 **type** `string` | 开关 `response.incomplete.response.tools.zoom.type` 功能开关。可选值:`enabled`、`disabled`。 MCP 工具 `object` MCP(Model Context Protocol)工具,让模型调用外部 MCP Server 提供的工具。 **server_label** `string` | 服务标签 `response.incomplete.response.tools.server_label` MCP Server 的唯一标识标签。模型在工具调用输出中通过该标签指向对应 Server,便于在多个 MCP Server 场景下区分调用来源。 **server_url** `string` | 服务地址 `response.incomplete.response.tools.server_url` MCP Server 的 HTTP(S) 访问地址,模型通过该地址向 Server 发起工具调用请求。 **type** `string` | 类型 `response.incomplete.response.tools.type` 工具类型标识,用于区分 Tool 的不同变体。 取值固定为 `mcp`。 **allowed_tools** `string[] / object` | 允许工具 `response.incomplete.response.tools.allowed_tools` 允许模型调用的工具范围。可传工具名称字符串数组,或包含 `tool_names` 字段的过滤器对象。 工具名数组 `string[]` 直接传入允许调用的工具名称数组。 工具过滤器 `object` 通过过滤器对象指定允许调用的工具范围。 **tool_names** `string[]` | 工具名列表 `response.incomplete.response.tools.allowed_tools.tool_names` 允许调用的工具名称列表。 **headers** `object` | 请求头 `response.incomplete.response.tools.headers` 调用 MCP Server 时附加的 HTTP 请求头,以字符串键值对形式指定 header 名与值。 > **说明** > > * 常用于传递鉴权信息(如 `Authorization`)。 > * `Authorization` 字段不会被服务端存储。 **require_approval** `string / object` | 审批策略 `response.incomplete.response.tools.require_approval` MCP 工具调用前的审批策略;支持简单模式(字符串)或按工具粒度控制(过滤器对象)。 简单策略 `string` 直接传入字符串 `always` 或 `never`,对所有工具应用统一审批策略。 工具过滤器 `object` 通过过滤器对象按工具粒度配置审批策略。 **always** `object` | 始终审批 `response.incomplete.response.tools.require_approval.always` 始终需要审批的工具过滤器。 **tool_names** `string[]` | 工具名列表 `response.incomplete.response.tools.require_approval.always.tool_names` 始终需要审批的工具名称列表。 **never** `object` | 无需审批 `response.incomplete.response.tools.require_approval.never` 无需审批的工具过滤器。 **tool_names** `string[]` | 工具名列表 `response.incomplete.response.tools.require_approval.never.tool_names` 无需审批即可调用的工具名称列表。 **server_description** `string` | 服务描述 `response.incomplete.response.tools.server_description` MCP Server 的描述信息,帮助模型理解何时使用该 Server。 知识库搜索 `object` 私域知识库搜索工具,让模型检索企业内部知识库中的文档内容。 **knowledge_resource_id** `string` | 知识库 ID `response.incomplete.response.tools.knowledge_resource_id` **type** `string` | 类型 `response.incomplete.response.tools.type` 工具类型标识,用于区分 Tool 的不同变体。 取值固定为 `knowledge_search`。 **dense_weight** `number` | 稠密权重 `response.incomplete.response.tools.dense_weight` 混合检索中稠密向量(语义)检索的权重,值越大越偏向语义匹配,越小越偏向关键词匹配。 > **说明** > > 仅在混合检索(索引算法为 `hnsw_hybrid`)下生效。 **取值范围**:`[0.2, 1]` **description** `string` | 知识库描述 `response.incomplete.response.tools.description` 知识库描述信息,帮助模型理解何时使用该知识库。 **doc_filter** `object` | 文档过滤 `response.incomplete.response.tools.doc_filter` 设置文档字段级别的检索过滤条件,确保只在符合条件的文档中检索。 > **说明** > > * 支持用作过滤条件的文档字段: > * 系统字段:`doc_id`(仅手动创建的知识库)、`_sys_auto_doc_id`(手动 + API 创建均适用) > * 自定义字段:已为知识库文档添加的**文档标签**(对应知识库 `index_config.fields` 中的 `field`) > * 支持单一条件过滤和多条件组合过滤(支持 `And` / `Or` 逻辑运算)。 > * 详细使用方式和支持字段参见 [filter 表达式](https://docs.volcengine.com/docs/84313/1419289?lang=zh#filter-%E8%A1%A8%E8%BE%BE%E5%BC%8F)。 > * 若自定义字段类型为 `Boolean`,取值范围是 `True` / `False`,大小写规则:cURL 用 `true` / `false`,Python 用 `True` / `False`。 **limit** `integer` | 最大结果数 `response.incomplete.response.tools.limit` 最大搜索结果数量。 **取值范围**:`[1, 200]` **max_keyword** `integer` | 最大关键词数 `response.incomplete.response.tools.max_keyword` 最大并行搜索关键词数量。 **取值范围**:`[1, 50]` **ranking_options** `object` | 排序选项 `response.incomplete.response.tools.ranking_options` 检索后处理选项。可参考 [知识库 API 文档](https://docs.volcengine.com/docs/84313/1350012?lang=zh) `post_processing` 字段。 **chunk_diffusion_count** `integer` | 切片扩散数 `response.incomplete.response.tools.ranking_options.chunk_diffusion_count` 检索阶段返回命中切片的上下几片邻近切片。取 `0` 表示不进行 chunk diffusion。 **取值范围**:`[0, 5]` **chunk_group** `boolean` | 文本聚合 `response.incomplete.response.tools.ranking_options.chunk_group` 文本聚合。 * 默认不聚合。 * 对于非结构化文件,可开启文本聚合以更好保留原文档内容语序。 * 开启后,会根据文档及文档顺序,对切片重新聚合排序返回。 **get_attachment_link** `boolean` | 获取附件链接 `response.incomplete.response.tools.ranking_options.get_attachment_link` 是否获取切片中图片的临时下载链接。 **rerank_model** `string` | Rerank 模型 `response.incomplete.response.tools.ranking_options.rerank_model` rerank 模型选择。默认值:`base-multilingual-rerank`。取值:`base-multilingual-rerank` / `m3-v2-rerank`。 > **说明** > > * 仅在 `rerank_switch` 为 `true` 时生效。 > * `base-multilingual-rerank`(推荐):速度快、长文本、支持 70+ 种语言。 > * `m3-v2-rerank`:常规文本、支持 100+ 种语言。 **rerank_only_chunk** `boolean` | 仅切片重排 `response.incomplete.response.tools.ranking_options.rerank_only_chunk` 是否仅根据 chunk 内容计算重排分数。`true` 只根据 chunk 内容计算分;`false` 根据 chunk title + 内容一起计算排序分。 **rerank_switch** `boolean` | 开启重排 `response.incomplete.response.tools.ranking_options.rerank_switch` 是否自动对检索结果做 rerank。若设置为 `true`,则会自动请求 rerank 模型排序。 **retrieve_count** `integer` | 重排切片数 `response.incomplete.response.tools.ranking_options.retrieve_count` 进入重排的切片数量。 > **注意** > > * 仅在 `rerank_switch` 为 `true` 时生效。 > * `retrieve_count` 需要大于等于 `limit`,否则会抛出错误。 豆包助手 `object` 豆包助手工具,让模型使用豆包的聊天、深度思考、AI 搜索和推理搜索能力。 **feature** `object` | 功能配置 `response.incomplete.response.tools.feature` 豆包助手的子功能配置,用于按需开启聊天、深度思考、AI 搜索、推理搜索四类能力并设置对应角色描述。 **ai_search** `object` | AI 搜索 `response.incomplete.response.tools.feature.ai_search` AI 搜索功能配置。 **role_description** `string` | 角色描述 `response.incomplete.response.tools.feature.ai_search.role_description` 使用豆包助手时修改角色设定。默认值:`你的名字是豆包,有很强的专业性。` > **注意** > > 此字段与 `system prompt`、`instructions` 互斥,同时配置时以本字段为准。 **type** `string` | 开关 `response.incomplete.response.tools.feature.ai_search.type` 功能开关。可选值:`enabled`、`disabled`。 **chat** `object` | 普通聊天 `response.incomplete.response.tools.feature.chat` 普通聊天功能配置。 **role_description** `string` | 角色描述 `response.incomplete.response.tools.feature.chat.role_description` 使用豆包助手时修改角色设定。默认值:`你的名字是豆包,有很强的专业性。` > **注意** > > 此字段与 `system prompt`、`instructions` 互斥,同时配置时以本字段为准。 **type** `string` | 开关 `response.incomplete.response.tools.feature.chat.type` 功能开关。可选值:`enabled`、`disabled`。 **deep_chat** `object` | 深度聊天 `response.incomplete.response.tools.feature.deep_chat` 深度聊天功能配置。 **role_description** `string` | 角色描述 `response.incomplete.response.tools.feature.deep_chat.role_description` 使用豆包助手时修改角色设定。默认值:`你的名字是豆包,有很强的专业性。` > **注意** > > 此字段与 `system prompt`、`instructions` 互斥,同时配置时以本字段为准。 **type** `string` | 开关 `response.incomplete.response.tools.feature.deep_chat.type` 功能开关。可选值:`enabled`、`disabled`。 **reasoning_search** `object` | 推理搜索 `response.incomplete.response.tools.feature.reasoning_search` 推理搜索功能配置。 **role_description** `string` | 角色描述 `response.incomplete.response.tools.feature.reasoning_search.role_description` 使用豆包助手时修改角色设定。默认值:`你的名字是豆包,有很强的专业性。` > **注意** > > 此字段与 `system prompt`、`instructions` 互斥,同时配置时以本字段为准。 **type** `string` | 开关 `response.incomplete.response.tools.feature.reasoning_search.type` 功能开关。可选值:`enabled`、`disabled`。 **type** `string` | 类型 `response.incomplete.response.tools.type` 工具类型,此处固定为 `doubao_app` **user_location** `object` | 用户位置 `response.incomplete.response.tools.user_location` 用户地理位置信息,用于搜索优化。 **type** `string` | 类型 `response.incomplete.response.tools.user_location.type` 位置类型。 取值固定为 `approximate`。 **city** `string` | 城市 `response.incomplete.response.tools.user_location.city` 用户所在城市。 **country** `string` | 国家 `response.incomplete.response.tools.user_location.country` 用户所在国家。 **region** `string` | 地区 `response.incomplete.response.tools.user_location.region` 用户所在地区。 **timezone** `number` | 时区 `response.incomplete.response.tools.user_location.timezone` 用户所在时区。 **top_p** `number` | 采样阈值 `response.incomplete.response.top_p` 本次请求实际使用的核采样概率阈值。 **usage** `object` | 用量统计 `response.incomplete.response.usage` 本次响应的 token 用量统计,包含输入、输出与总计 token 数等明细。 **input_tokens** `integer` | 输入 token 数 `response.incomplete.response.usage.input_tokens` 输入消耗的 token 数量。 **input_tokens_details** `object` | 输入明细 `response.incomplete.response.usage.input_tokens_details` 输入 token 用量明细。 **cached_tokens** `integer` | 缓存 token `response.incomplete.response.usage.input_tokens_details.cached_tokens` 命中缓存的 token 数量。 **audio_cached_tokens** `integer` | 音频缓存 Token 数 `response.incomplete.response.usage.input_tokens_details.audio_cached_tokens` 缓存命中的音频输入内容所消耗的 token 数量。仅在隐式缓存模式且命中音频缓存时返回;开启显式缓存时该字段不返回。 **audio_tokens** `integer` | 音频 token `response.incomplete.response.usage.input_tokens_details.audio_tokens` 音频输入消耗的 token 数量。 **output_tokens** `integer` | 输出 token 数 `response.incomplete.response.usage.output_tokens` 输出消耗的 token 数量。 **output_tokens_details** `object` | 输出明细 `response.incomplete.response.usage.output_tokens_details` 输出 token 用量明细。 **reasoning_tokens** `integer` | 思考 token `response.incomplete.response.usage.output_tokens_details.reasoning_tokens` 深度思考消耗的 token 数量。 **total_tokens** `integer` | 总 token 数 `response.incomplete.response.usage.total_tokens` 本次请求消耗的 token 总数。 **tool_usage** `object` | 工具用量 `response.incomplete.response.usage.tool_usage` 工具调用用量统计。 **doubao_app** `integer` | 豆包次数 `response.incomplete.response.usage.tool_usage.doubao_app` 豆包助手工具调用次数。 **knowledge_search** `integer` | 知识库次数 `response.incomplete.response.usage.tool_usage.knowledge_search` 知识库搜索工具调用次数。 **mcp** `integer` | MCP 次数 `response.incomplete.response.usage.tool_usage.mcp` MCP 工具调用次数。 **web_search** `integer` | 搜索次数 `response.incomplete.response.usage.tool_usage.web_search` 联网搜索工具调用次数。 **tool_usage_details** `object` | 工具明细 `response.incomplete.response.usage.tool_usage_details` 工具调用用量明细。 **doubao_app** `object` | 豆包明细 `response.incomplete.response.usage.tool_usage_details.doubao_app` 豆包助手工具用量明细。 **knowledge_search** `object` | 知识库明细 `response.incomplete.response.usage.tool_usage_details.knowledge_search` 知识库搜索工具用量明细。 **mcp** `object` | MCP 明细 `response.incomplete.response.usage.tool_usage_details.mcp` MCP 工具用量明细。 **web_search** `object` | 搜索明细 `response.incomplete.response.usage.tool_usage_details.web_search` 联网搜索工具用量明细。 **sequence_number** `integer` | 序列号 `response.incomplete.sequence_number` 事件的序列号。 **type** `string` | 事件类型 `response.incomplete.type` 事件的类型,总是 `response.incomplete` ### response.failed > 当响应失败触发的事件。 **response** `object` | 响应对象 `response.failed.response` 失败状态的响应。包含参数与非流式调用返回的参数一致。 **created_at** `integer` | 创建时间戳 `response.failed.response.created_at` 该 Response 创建时的 Unix 时间戳(单位:秒)。 **id** `string` | 响应 ID `response.failed.response.id` 本次 Response 的唯一标识,可用于后续查询、续接或删除该响应。 **model** `string` | 模型 ID `response.failed.response.model` 生成本次响应所使用的模型标识,回显请求中的 model 字段。 **object** `string` | 对象类型 `response.failed.response.object` 返回对象的类型标识,用于区分响应对象种类。 取值固定为 `response`。 **output** `object[]` | 输出内容 `response.failed.response.output` 模型本次响应产出的 Item 列表,按生成顺序排列,可能包含消息、工具调用、推理等不同类型条目。 消息输出 `object` 模型生成的消息输出,包含文本内容。 **content** `object[]` | 输出内容 `response.failed.response.output.content` 输出内容列表。 模型回答文本 `object` 模型生成的最终回答文本。 **type** `string` | 类型 `response.failed.response.output.content.type` 内容类型判别字段,用于区分 union 变体。 取值固定为 `output_text`。 **annotations** `object[]` | 标注列表 `response.failed.response.output.content.annotations` 文本附带的标注信息列表(如引用来源等) 网页引用 `object` 引用自互联网网页的标注信息。 **title** `string` | 标题 `response.failed.response.output.content.annotations.title` 引用网页的标题。 **type** `string` | 类型 `response.failed.response.output.content.annotations.type` 标注类型的判别字段(discriminator)。 取值固定为 `url_citation`。 **url** `string` | 网址 `response.failed.response.output.content.annotations.url` 引用网页的 URL 地址。 **cover_image** `object` | 封面图 `response.failed.response.output.content.annotations.cover_image` 网页封面图片信息。 **height** `integer` | 高度 `response.failed.response.output.content.annotations.cover_image.height` 封面图片高度(像素) **url** `string` | 图片地址 `response.failed.response.output.content.annotations.cover_image.url` 封面图片的 URL 地址。 **width** `integer` | 宽度 `response.failed.response.output.content.annotations.cover_image.width` 封面图片宽度(像素) **freshness_info** `string` | 新鲜度 `response.failed.response.output.content.annotations.freshness_info` 内容新鲜度信息。 **logo_url** `string` | Logo 地址 `response.failed.response.output.content.annotations.logo_url` 网站 Logo 图标地址。 **mobile_url** `string` | 移动端地址 `response.failed.response.output.content.annotations.mobile_url` 移动端访问地址。 **publish_time** `string` | 发布时间 `response.failed.response.output.content.annotations.publish_time` 网页发布时间。 **site_name** `string` | 站点名 `response.failed.response.output.content.annotations.site_name` 站点名称。 **summary** `string` | 摘要 `response.failed.response.output.content.annotations.summary` 网页内容摘要。 文档引用 `object` 引用自私域知识库文档的标注信息。 **type** `string` | 类型 `response.failed.response.output.content.annotations.type` 标注类型。 取值固定为 `doc_citation`。 **chunk_attachment** `object[]` | 分块附件 `response.failed.response.output.content.annotations.chunk_attachment` 引用分块附带的附件信息列表。 **chunk_id** `integer` | 分块 ID `response.failed.response.output.content.annotations.chunk_id` 引用文档分块的 ID。 **doc_id** `string` | 文档 ID `response.failed.response.output.content.annotations.doc_id` 引用文档的 ID。 **doc_name** `string` | 文档名 `response.failed.response.output.content.annotations.doc_name` 引用文档的名称。 **text** `string` | 文本内容 `response.failed.response.output.content.text` 模型生成的文本内容。 模型思维链文本 `object` 模型生成的思维链文本。 **type** `string` | 类型 `response.failed.response.output.content.type` 内容类型标识,用于区分 union 变体。 取值固定为 `reasoning_text`。 **annotations** `object[]` | 标注列表 `response.failed.response.output.content.annotations` 思维链附带的标注信息列表。 网页引用 `object` 引用自互联网网页的标注信息。 **title** `string` | 标题 `response.failed.response.output.content.annotations.title` 引用网页的标题。 **type** `string` | 类型 `response.failed.response.output.content.annotations.type` 标注类型的判别字段(discriminator)。 取值固定为 `url_citation`。 **url** `string` | 网址 `response.failed.response.output.content.annotations.url` 引用网页的 URL 地址。 **cover_image** `object` | 封面图 `response.failed.response.output.content.annotations.cover_image` 网页封面图片信息。 **height** `integer` | 高度 `response.failed.response.output.content.annotations.cover_image.height` 封面图片高度(像素) **url** `string` | 图片地址 `response.failed.response.output.content.annotations.cover_image.url` 封面图片的 URL 地址。 **width** `integer` | 宽度 `response.failed.response.output.content.annotations.cover_image.width` 封面图片宽度(像素) **freshness_info** `string` | 新鲜度 `response.failed.response.output.content.annotations.freshness_info` 内容新鲜度信息。 **logo_url** `string` | Logo 地址 `response.failed.response.output.content.annotations.logo_url` 网站 Logo 图标地址。 **mobile_url** `string` | 移动端地址 `response.failed.response.output.content.annotations.mobile_url` 移动端访问地址。 **publish_time** `string` | 发布时间 `response.failed.response.output.content.annotations.publish_time` 网页发布时间。 **site_name** `string` | 站点名 `response.failed.response.output.content.annotations.site_name` 站点名称。 **summary** `string` | 摘要 `response.failed.response.output.content.annotations.summary` 网页内容摘要。 文档引用 `object` 引用自私域知识库文档的标注信息。 **type** `string` | 类型 `response.failed.response.output.content.annotations.type` 标注类型。 取值固定为 `doc_citation`。 **chunk_attachment** `object[]` | 分块附件 `response.failed.response.output.content.annotations.chunk_attachment` 引用分块附带的附件信息列表。 **chunk_id** `integer` | 分块 ID `response.failed.response.output.content.annotations.chunk_id` 引用文档分块的 ID。 **doc_id** `string` | 文档 ID `response.failed.response.output.content.annotations.doc_id` 引用文档的 ID。 **doc_name** `string` | 文档名 `response.failed.response.output.content.annotations.doc_name` 引用文档的名称。 **text** `string` | 文本内容 `response.failed.response.output.content.text` 模型思维链文本内容。 **id** `string` | 条目 ID `response.failed.response.output.id` 输出条目唯一标识。 **role** `string` | 角色 `response.failed.response.output.role` 消息发送者的角色。 取值固定为 `assistant`。 **status** `string` | 状态 `response.failed.response.output.status` 消息输出条目的当前状态。 * `completed`:消息已生成完毕。 * `in_progress`:消息正在生成中(流式场景)。 * `incomplete`:消息未完整生成(例如达到 `max_output_tokens` 上限)。 * `failed`:消息生成失败。 **type** `string` | 类型 `response.failed.response.output.type` 输出条目的类型标识。 取值固定为 `message`。 **partial** `boolean` | 增量片段 `response.failed.response.output.partial` 是否为流式增量片段。 **phase** `string` | 消息阶段 `response.failed.response.output.phase` 标记 assistant 消息属于中间讲解还是最终回答。在回放 assistant 历史消息时,建议保留并原样回传该字段。可选值:`commentary`、`final_answer`。 函数调用输出 `object` 模型发起的函数调用请求。 **type** `string` | 类型 `response.failed.response.output.type` 输出条目类型标识,用于区分 OutputItem 变体。 取值固定为 `function_call`。 **arguments** `string` | 参数 `response.failed.response.output.arguments` 函数参数的 JSON 字符串。 **call_id** `string` | 调用 ID `response.failed.response.output.call_id` 函数调用的唯一标识 ID,用于将该 function_call 输出与后续回传的 function_call_output 关联匹配。 **id** `string` | 条目 ID `response.failed.response.output.id` 输出条目唯一标识。 **name** `string` | 函数名 `response.failed.response.output.name` 调用的函数名称。 **status** `string` | 状态 `response.failed.response.output.status` 函数调用条目的当前状态。 * `completed`:函数调用请求已生成完毕。 * `in_progress`:函数调用请求正在生成中(流式场景)。 * `incomplete`:函数调用请求未完整生成(例如达到 `max_output_tokens` 上限)。 * `failed`:函数调用生成失败。 思维链输出 `object` 模型的深度思考过程输出。 **status** `string` | 状态 `response.failed.response.output.status` 推理条目的处理状态,用于判断思维链是否生成完成。可选值:`completed`、`failed`、`in_progress`、`incomplete`。 **summary** `object[]` | 推理摘要 `response.failed.response.output.summary` 推理摘要内容列表。 **type** `string` | 类型 `response.failed.response.output.summary.type` 摘要片段类型标识。 取值固定为 `summary_text`。 **text** `string` | 摘要文本 `response.failed.response.output.summary.text` 思维链摘要文本内容。 **type** `string` | 类型 `response.failed.response.output.type` 输出条目类型标识,用于区分 OutputItem 变体。 取值固定为 `reasoning`。 **content** `object[]` | 推理内容 `response.failed.response.output.content` 思维链推理过程的内容元素列表。 模型回答文本 `object` 模型生成的最终回答文本。 **type** `string` | 类型 `response.failed.response.output.content.type` 内容类型判别字段,用于区分 union 变体。 取值固定为 `output_text`。 **annotations** `object[]` | 标注列表 `response.failed.response.output.content.annotations` 文本附带的标注信息列表(如引用来源等) 网页引用 `object` 引用自互联网网页的标注信息。 **title** `string` | 标题 `response.failed.response.output.content.annotations.title` 引用网页的标题。 **type** `string` | 类型 `response.failed.response.output.content.annotations.type` 标注类型的判别字段(discriminator)。 取值固定为 `url_citation`。 **url** `string` | 网址 `response.failed.response.output.content.annotations.url` 引用网页的 URL 地址。 **cover_image** `object` | 封面图 `response.failed.response.output.content.annotations.cover_image` 网页封面图片信息。 **height** `integer` | 高度 `response.failed.response.output.content.annotations.cover_image.height` 封面图片高度(像素) **url** `string` | 图片地址 `response.failed.response.output.content.annotations.cover_image.url` 封面图片的 URL 地址。 **width** `integer` | 宽度 `response.failed.response.output.content.annotations.cover_image.width` 封面图片宽度(像素) **freshness_info** `string` | 新鲜度 `response.failed.response.output.content.annotations.freshness_info` 内容新鲜度信息。 **logo_url** `string` | Logo 地址 `response.failed.response.output.content.annotations.logo_url` 网站 Logo 图标地址。 **mobile_url** `string` | 移动端地址 `response.failed.response.output.content.annotations.mobile_url` 移动端访问地址。 **publish_time** `string` | 发布时间 `response.failed.response.output.content.annotations.publish_time` 网页发布时间。 **site_name** `string` | 站点名 `response.failed.response.output.content.annotations.site_name` 站点名称。 **summary** `string` | 摘要 `response.failed.response.output.content.annotations.summary` 网页内容摘要。 文档引用 `object` 引用自私域知识库文档的标注信息。 **type** `string` | 类型 `response.failed.response.output.content.annotations.type` 标注类型。 取值固定为 `doc_citation`。 **chunk_attachment** `object[]` | 分块附件 `response.failed.response.output.content.annotations.chunk_attachment` 引用分块附带的附件信息列表。 **chunk_id** `integer` | 分块 ID `response.failed.response.output.content.annotations.chunk_id` 引用文档分块的 ID。 **doc_id** `string` | 文档 ID `response.failed.response.output.content.annotations.doc_id` 引用文档的 ID。 **doc_name** `string` | 文档名 `response.failed.response.output.content.annotations.doc_name` 引用文档的名称。 **text** `string` | 文本内容 `response.failed.response.output.content.text` 模型生成的文本内容。 模型思维链文本 `object` 模型生成的思维链文本。 **type** `string` | 类型 `response.failed.response.output.content.type` 内容类型标识,用于区分 union 变体。 取值固定为 `reasoning_text`。 **annotations** `object[]` | 标注列表 `response.failed.response.output.content.annotations` 思维链附带的标注信息列表。 网页引用 `object` 引用自互联网网页的标注信息。 **title** `string` | 标题 `response.failed.response.output.content.annotations.title` 引用网页的标题。 **type** `string` | 类型 `response.failed.response.output.content.annotations.type` 标注类型的判别字段(discriminator)。 取值固定为 `url_citation`。 **url** `string` | 网址 `response.failed.response.output.content.annotations.url` 引用网页的 URL 地址。 **cover_image** `object` | 封面图 `response.failed.response.output.content.annotations.cover_image` 网页封面图片信息。 **height** `integer` | 高度 `response.failed.response.output.content.annotations.cover_image.height` 封面图片高度(像素) **url** `string` | 图片地址 `response.failed.response.output.content.annotations.cover_image.url` 封面图片的 URL 地址。 **width** `integer` | 宽度 `response.failed.response.output.content.annotations.cover_image.width` 封面图片宽度(像素) **freshness_info** `string` | 新鲜度 `response.failed.response.output.content.annotations.freshness_info` 内容新鲜度信息。 **logo_url** `string` | Logo 地址 `response.failed.response.output.content.annotations.logo_url` 网站 Logo 图标地址。 **mobile_url** `string` | 移动端地址 `response.failed.response.output.content.annotations.mobile_url` 移动端访问地址。 **publish_time** `string` | 发布时间 `response.failed.response.output.content.annotations.publish_time` 网页发布时间。 **site_name** `string` | 站点名 `response.failed.response.output.content.annotations.site_name` 站点名称。 **summary** `string` | 摘要 `response.failed.response.output.content.annotations.summary` 网页内容摘要。 文档引用 `object` 引用自私域知识库文档的标注信息。 **type** `string` | 类型 `response.failed.response.output.content.annotations.type` 标注类型。 取值固定为 `doc_citation`。 **chunk_attachment** `object[]` | 分块附件 `response.failed.response.output.content.annotations.chunk_attachment` 引用分块附带的附件信息列表。 **chunk_id** `integer` | 分块 ID `response.failed.response.output.content.annotations.chunk_id` 引用文档分块的 ID。 **doc_id** `string` | 文档 ID `response.failed.response.output.content.annotations.doc_id` 引用文档的 ID。 **doc_name** `string` | 文档名 `response.failed.response.output.content.annotations.doc_name` 引用文档的名称。 **text** `string` | 文本内容 `response.failed.response.output.content.text` 模型思维链文本内容。 **encrypted_content** `string` | 加密思维链 `response.failed.response.output.encrypted_content` 思考内容加密原文。经加密及压缩处理后的思考内容原文。 相关文档: * [关键规则](/docs/agent-model-invocation-practice#key-rules) * [回传思考内容加密块使用示例](/docs/agent-model-invocation-practice#encrypted-thinking-block-examples) > **说明** > > 流式输出场景下,思考内容加密原文通过 `response.output_item.added`、`response.output_item.done`、`response.completed` 等相关事件下发,需要按事件中 `encrypted_content` 字段非空过滤获取。 **模型支持**: * `doubao-seed-2-0-lite-260428 及后续版本` **id** `string` | 条目 ID `response.failed.response.output.id` 输出条目唯一标识。 语音转写输出 `object` 模型返回的语音转写输出。 **status** `string` | 状态 `response.failed.response.output.status` 语音转写条目的当前状态。 * `completed`:转写已生成完毕。 * `in_progress`:转写正在生成中(流式场景)。 * `incomplete`:转写未完整生成(例如达到输出上限而截断)。 * `failed`:转写生成失败。 **type** `string` | 类型 `response.failed.response.output.type` 输出条目类型标识。 取值固定为 `transcription`。 **id** `string` | 条目 ID `response.failed.response.output.id` 输出条目唯一标识。 **transcription** `object[]` | 转写内容 `response.failed.response.output.transcription` 语音转写结果片段列表。 **type** `string` | 类型 `response.failed.response.output.transcription.type` 转写片段类型。 取值固定为 `transcription_text`。 **chunks** `object[]` | 音频小段 `response.failed.response.output.transcription.chunks` 当前片段对应的音频小段列表。 **end_time** `integer` | 结束时间 `response.failed.response.output.transcription.chunks.end_time` 片段结束时间(毫秒) **start_time** `integer` | 开始时间 `response.failed.response.output.transcription.chunks.start_time` 片段开始时间(毫秒) **text** `string` | 文字内容 `response.failed.response.output.transcription.chunks.text` 当前片段对应的文字内容。 **text** `string` | 转写文本 `response.failed.response.output.transcription.text` 当前片段的转写文本。 网页搜索调用 `object` 模型发起的网页搜索调用记录。 **id** `string` | 条目 ID `response.failed.response.output.id` 输出条目唯一标识。 **status** `string` | 状态 `response.failed.response.output.status` 网页搜索调用的当前状态。可选值:`in_progress`、`searching`、`completed`、`incomplete`、`failed`。 **type** `string` | 类型 `response.failed.response.output.type` 输出条目类型标识,用于区分 OutputItem 变体。 取值固定为 `web_search_call`。 **action** `object` | 搜索动作 `response.failed.response.output.action` 描述模型执行的网页搜索动作,包括搜索类型与查询关键字。 **query** `string` | 查询语句 `response.failed.response.output.action.query` 模型实际发起的搜索查询语句。 **type** `string` | 类型 `response.failed.response.output.action.type` 网页搜索动作的类型标识。 取值固定为 `search`。 **queries** `string[]` | 查询语句列表 `response.failed.response.output.action.queries` 本次网页搜索产生的查询语句列表。 图像处理调用 `object` 模型发起的图像处理调用记录。 **id** `string` | 条目 ID `response.failed.response.output.id` 输出条目唯一标识。 **status** `string` | 状态 `response.failed.response.output.status` 图像处理调用的当前状态。 * `completed`:图像处理已完成。 * `in_progress`:图像处理正在执行中。 * `incomplete`:图像处理未完整执行(例如被中断或截断)。 * `failed`:图像处理执行失败,具体原因见 `error` 字段。 **type** `string` | 类型 `response.failed.response.output.type` 输出条目类型标识,用于区分 OutputItem 变体。 取值固定为 `image_process`。 **action** `object` | 处理动作 `response.failed.response.output.action` 图像处理动作详情。 **type** `string` | 类型 `response.failed.response.output.action.type` 图像处理动作类型。 **result_image_url** `string` | 结果图地址 `response.failed.response.output.action.result_image_url` 处理后图像的 URL 地址。 **arguments** `object` | 处理参数 `response.failed.response.output.arguments` 图像处理动作的输入参数,以键值对形式承载具体处理选项。 **error** `object` | 图像处理错误 `response.failed.response.output.error` 图像处理失败时的错误信息。 **message** `string` | 错误描述 `response.failed.response.output.error.message` 错误的可读描述。 MCP 审批请求 `object` MCP 工具调用前的审批请求记录。 **arguments** `string` | 调用参数 `response.failed.response.output.arguments` 工具调用参数的 JSON 字符串。 **name** `string` | 工具名 `response.failed.response.output.name` 待运行的工具名称。 **server_label** `string` | 服务标签 `response.failed.response.output.server_label` 发起请求的 MCP Server 标签。 **type** `string` | 类型 `response.failed.response.output.type` 输出项类型标识符,用于区分 OutputItem 的变体。 取值固定为 `mcp_approval_request`。 **id** `string` | 请求 ID `response.failed.response.output.id` 审批请求的唯一 ID。 MCP 工具清单 `object` MCP Server 提供的工具清单输出。 **server_label** `string` | 服务标签 `response.failed.response.output.server_label` MCP Server 标签。 **type** `string` | 类型 `response.failed.response.output.type` 输出项类型标识。 取值固定为 `mcp_list_tools`。 **error** `string` | 错误信息 `response.failed.response.output.error` 当 MCP Server 无法返回工具列表时的错误信息。 **id** `string` | 列表 ID `response.failed.response.output.id` 工具列表的唯一 ID。 **tools** `object[]` | 工具列表 `response.failed.response.output.tools` 该 MCP Server 上可用的工具列表。 **name** `string` | 工具名 `response.failed.response.output.tools.name` 工具名称。 **annotations** `object` | 注解信息 `response.failed.response.output.tools.annotations` 工具的附加注解信息。 **description** `string` | 工具描述 `response.failed.response.output.tools.description` 工具的功能描述。 **input_schema** `object` | 入参 Schema `response.failed.response.output.tools.input_schema` 描述工具入参的 JSON Schema。 MCP 工具调用 `object` 模型对 MCP 工具的实际调用记录及结果。 **name** `string` | 工具名 `response.failed.response.output.name` 实际运行的工具名称。 **server_label** `string` | 服务标签 `response.failed.response.output.server_label` 运行工具的 MCP Server 标签。 **type** `string` | 类型 `response.failed.response.output.type` 标识该输出项为 MCP 工具调用记录。 取值固定为 `mcp_call`。 **arguments** `string` | 调用参数 `response.failed.response.output.arguments` 传递给 MCP 工具的调用参数,格式为 JSON 字符串。 > **说明** > > 该字段通过 `response.mcp_call_arguments.delta` 事件流式追加,初始 `output_item.added` 事件可能不携带该字段。 **error** `string` | 错误信息 `response.failed.response.output.error` 工具调用失败时的错误信息。 **id** `string` | 调用 ID `response.failed.response.output.id` 工具调用的唯一 ID。 **output** `string` | 返回结果 `response.failed.response.output.output` 工具调用的返回结果。 知识库检索调用 `object` 模型发起的私域知识库检索调用记录。 **knowledge_resource_id** `string` | 知识库 ID `response.failed.response.output.knowledge_resource_id` 检索使用的知识库 ID。 **queries** `string[]` | 查询语句 `response.failed.response.output.queries` 模型实际执行的检索查询语句。 **status** `string` | 状态 `response.failed.response.output.status` 知识库检索调用的执行状态。可选值:`in_progress`、`searching`、`completed`、`failed`、`incomplete`。 **type** `string` | 类型 `response.failed.response.output.type` 输出条目类型标识,用于区分不同类型的输出条目。 取值固定为 `knowledge_search_call`。 **id** `string` | 条目 ID `response.failed.response.output.id` 输出条目唯一标识。 豆包应用调用 `object` 模型对豆包助手能力的调用记录。 **type** `string` | 类型 `response.failed.response.output.type` 输出条目类型标识。 取值固定为 `doubao_app_call`。 **blocks** `object[]` | 内容块 `response.failed.response.output.blocks` 豆包应用调用产出的内容块列表。 文本输出 `object` 豆包应用产出的文本输出内容块。 **type** `string` | 类型 `response.failed.response.output.blocks.type` 内容块类型标识符。 取值固定为 `output_text`。 **id** `string` | 块 ID `response.failed.response.output.blocks.id` 内容块的唯一标识。 **parent_id** `string` | 父级 ID `response.failed.response.output.blocks.parent_id` 所属父级条目的 ID。 **status** `string` | 状态 `response.failed.response.output.blocks.status` 内容块状态。 **text** `string` | 文本内容 `response.failed.response.output.blocks.text` 思维链文本 `object` 豆包应用产出的思维链文本内容块。 **type** `string` | 类型 `response.failed.response.output.blocks.type` 内容块类型标识符。 取值固定为 `reasoning_text`。 **id** `string` | 块 ID `response.failed.response.output.blocks.id` 内容块的唯一标识。 **parent_id** `string` | 父级 ID `response.failed.response.output.blocks.parent_id` 所属父级条目的 ID。 **reasoning_text** `string` | 思考文本 `response.failed.response.output.blocks.reasoning_text` 思维链文本内容。 **status** `string` | 状态 `response.failed.response.output.blocks.status` 内容块状态。 搜索过程 `object` 豆包应用 AI 搜索过程产出的内容块。 **type** `string` | 类型 `response.failed.response.output.blocks.type` 内容块类型标识符。 取值固定为 `search`。 **id** `string` | 块 ID `response.failed.response.output.blocks.id` 内容块的唯一标识。 **parent_id** `string` | 父级 ID `response.failed.response.output.blocks.parent_id` 所属父级条目的 ID。 **queries** `string[]` | 查询语句 `response.failed.response.output.blocks.queries` 搜索查询语句列表。 **results** `object[]` | 搜索结果 `response.failed.response.output.blocks.results` 搜索结果列表。 **text_card** `object` | 文本卡片 `response.failed.response.output.blocks.results.text_card` 文本卡片形式的搜索结果。 **sitename** `string` | 站点名 `response.failed.response.output.blocks.results.text_card.sitename` 来源站点名称。 **title** `string` | 标题 `response.failed.response.output.blocks.results.text_card.title` 搜索结果标题。 **url** `string` | 网址 `response.failed.response.output.blocks.results.text_card.url` 搜索结果 URL 地址。 **status** `string` | 状态 `response.failed.response.output.blocks.status` 内容块状态。 **summary** `string` | 搜索总结 `response.failed.response.output.blocks.summary` AI 搜索过程中对本轮搜索结果的总结性文字,概括从搜索结果中提取的核心信息。 推理搜索过程 `object` 豆包应用推理搜索过程产出的内容块。 **type** `string` | 类型 `response.failed.response.output.blocks.type` 内容块类型。 取值固定为 `reasoning_search`。 **id** `string` | 块 ID `response.failed.response.output.blocks.id` 内容块的唯一标识。 **parent_id** `string` | 父级 ID `response.failed.response.output.blocks.parent_id` 所属父级条目的 ID。 **queries** `string[]` | 查询语句 `response.failed.response.output.blocks.queries` 搜索查询语句列表。 **results** `object[]` | 搜索结果 `response.failed.response.output.blocks.results` 搜索结果列表。 **text_card** `object` | 文本卡片 `response.failed.response.output.blocks.results.text_card` 文本卡片形式的搜索结果。 **sitename** `string` | 站点名 `response.failed.response.output.blocks.results.text_card.sitename` 来源站点名称。 **title** `string` | 标题 `response.failed.response.output.blocks.results.text_card.title` 搜索结果标题。 **url** `string` | 网址 `response.failed.response.output.blocks.results.text_card.url` 搜索结果 URL 地址。 **status** `string` | 状态 `response.failed.response.output.blocks.status` 推理搜索内容块的处理状态。可选值:`in_progress`、`searching`、`completed`、`incomplete`、`failed`。 **summary** `string` | 搜索总结 `response.failed.response.output.blocks.summary` 推理搜索过程中对本轮搜索结果的总结性文字,概括从搜索结果中提取的核心信息。 **feature** `string` | 功能名 `response.failed.response.output.feature` 本次调用触发的豆包子功能名称。可选值:`chat`、`deep_chat`、`ai_search`、`reasoning_search`。 **id** `string` | 条目 ID `response.failed.response.output.id` 输出条目唯一标识。 **status** `string` | 状态 `response.failed.response.output.status` 输出状态。可选值:`completed`、`failed`、`in_progress`、`incomplete`。 智能体工具调用 `object` 模型发起的智能体工具调用记录。 **name** `string` | 工具名 `response.failed.response.output.name` 被调用的智能体工具名称。 **status** `string` | 状态 `response.failed.response.output.status` 智能体工具调用的执行状态。可选值:`completed`、`failed`、`in_progress`、`incomplete`。 **type** `string` | 类型 `response.failed.response.output.type` 输出条目类型标识符,用于区分 OutputItem 的 variant。 取值固定为 `agent_tool_call`。 **id** `string` | 条目 ID `response.failed.response.output.id` 输出条目唯一标识。 **caching** `object` | 缓存配置 `response.failed.response.caching` 本次响应生效的上下文缓存配置,回显请求中的 caching 设置。 **prefix** `boolean` | 仅写缓存 `response.failed.response.caching.prefix` 是否仅写入前缀缓存,不生成回复。`true` 只写缓存,不返回模型输出;`false` 正常生成回复并写缓存。 **type** `string` | 缓存模式 `response.failed.response.caching.type` 缓存模式。 * `enabled`:开启上下文缓存。 * `disabled`:关闭上下文缓存。 **context_management** `object` | 上下文管理 `response.failed.response.context_management` 本次响应实际执行的上下文管理编辑操作,回显请求中 context_management 生效后的结果。 **applied_edits** `object[]` | 已应用编辑 `response.failed.response.context_management.applied_edits` 已应用的上下文编辑结果列表。 清理工具调用 `object` 已应用的清理工具调用编辑结果。 **cleared_tool_uses** `integer` | 清理次数 `response.failed.response.context_management.applied_edits.cleared_tool_uses` 已清理的工具调用数量。 **type** `string` | 类型 `response.failed.response.context_management.applied_edits.type` 编辑类型。 取值固定为 `clear_tool_uses`。 清理思维链 `object` 已应用的清理思维链编辑结果。 **cleared_thinking_turns** `integer` | 清理轮次 `response.failed.response.context_management.applied_edits.cleared_thinking_turns` 已清理的思维链轮次数量。 **type** `string` | 类型 `response.failed.response.context_management.applied_edits.type` 编辑类型。 取值固定为 `clear_thinking`。 **error** `object` | 错误信息 `response.failed.response.error` 模型响应过程发生错误时的错误信息。仅当 *status* 为 `failed` 时返回。 **code** `string` | 错误码 `response.failed.response.error.code` **message** `string` | 错误描述 `response.failed.response.error.message` 错误信息的可读描述。 **expire_at** `integer` | 过期时间戳 `response.failed.response.expire_at` 响应储存的过期时刻 Unix 时间戳(秒),回显请求中的 expire_at 设置,对 store 与 caching 均生效。 > **说明** > > 最多保留 7 天。 **incomplete_details** `object` | 未完成详情 `response.failed.response.incomplete_details` 响应未能完成的详细信息。仅当 *status* 为 `incomplete` 时返回。 **reason** `string` | 原因 `response.failed.response.incomplete_details.reason` 响应未完成的原因。 **content_filter** `object` | 内容过滤 `response.failed.response.incomplete_details.content_filter` 内容过滤详情。 **details** `string` | 详情 `response.failed.response.incomplete_details.content_filter.details` 内容过滤命中的详细描述。 **type** `string` | 类型 `response.failed.response.incomplete_details.content_filter.type` 内容过滤命中的类型。 **instructions** `string` | 系统指令 `response.failed.response.instructions` 本次响应生效的系统指令,回显请求中的 instructions 设置。 **max_output_tokens** `integer` | 最大输出长度 `response.failed.response.max_output_tokens` 回显请求中的 max_output_tokens 参数,即模型输出最大 token 数(含回答与思维链)。 **max_tool_calls** `integer` | 最大工具调用轮次 `response.failed.response.max_tool_calls` 本次响应生效的最大工具调用轮次,回显请求中的 max_tool_calls 设置。 **metadata** `object` | 自定义元数据 `response.failed.response.metadata` 回显请求中的 metadata 键值对元数据。最多支持 16 对键值,key 长度不超过 64 个字符,value 长度不超过 512 个字符,服务端不会解释其中内容。 **parallel_tool_calls** `boolean` | 并行工具调用 `response.failed.response.parallel_tool_calls` 本次请求实际生效的并行工具调用设置,回显请求中的 parallel_tool_calls 值。 **previous_response_id** `string` | 上轮响应 ID `response.failed.response.previous_response_id` 回显请求中的 previous_response_id,即前一轮响应的唯一标识。仅在请求传入该字段时返回。 **prompt_cache_key** `string` | 缓存分桶键 `response.failed.response.prompt_cache_key` 用于提升缓存命中率的分桶键,回显请求中的 prompt_cache_key 设置。 **reasoning** `object` | 推理配置 `response.failed.response.reasoning` 本次响应生效的深度思考工作量配置,回显请求中的 reasoning 设置。 **effort** `string` | 思考深度 `response.failed.response.reasoning.effort` 限制思考的工作量。减少思考深度可提升速度,思考花费的 token 更少。 * `none`:关闭思考。 * `minimal`:关闭思考,直接回答。 * `low`:轻量思考,侧重快速响应。 * `medium`:均衡模式,兼顾速度与深度。 * `high`:深度分析,处理复杂问题。 * `xhigh`:更高程度思考。 * `max`:最高程度思考,适配高难度推理任务。 > **注意:说明** > > 支持该字段的模型、默认取值、参数兼容映射规则,以及与 `thinking.type` 字段的关系,详见 [文档](/docs/responses-api-deep-thinking#dc4c1547)。 **safety_identifier** `string` | 安全标识 `response.failed.response.safety_identifier` 回显请求中传入的终端用户稳定标识,用于安全策略与违规行为追踪关联。 **service_tier** `string` | 推理模式 `response.failed.response.service_tier` 本次请求实际使用的推理模式。 * `fast`:本次请求使用 [在线推理(低延迟)](/docs/online-inference-low-latency) 模式。 * `auto`:本次请求使用 [在线推理(TPM 保障包)](/docs/tpm-guarantee-package) 模式。 * `default`:本次请求使用 [在线推理(常规)](/docs/online-inference-standard) 模式。 * `flex`:本次请求使用 [在线推理(低优)](/docs/online-inference-flex) 模式。 **session** `object` | 会话信息 `response.failed.response.session` 本次响应关联的会话信息,回显请求中 session 生效后的结果。 **id** `string` | 会话 ID `response.failed.response.session.id` 会话的唯一 ID。 **status** `string` | 响应状态 `response.failed.response.status` 本次响应的当前状态,标识生成流程处于进行中、已完成、未完成或已失败等阶段。 **store** `boolean` | 是否存储 `response.failed.response.store` 是否储存生成的模型响应以供后续通过 API 检索,回显请求中的 store 设置。 **temperature** `number` | 采样温度 `response.failed.response.temperature` 本次响应生效的采样温度,回显请求中的 temperature 设置。 **text** `object` | 输出格式 `response.failed.response.text` 本次响应生效的输出格式定义,回显请求中的 text 设置。 **format** `object` | 输出格式 `response.failed.response.text.format` 文本输出格式定义。 **type** `string` | 格式类型 `response.failed.response.text.format.type` 输出格式类型。可选值:`text`、`json_schema`、`json_object`。 > **注意** > > `json_object` / `json_schema` 能力尚在 beta 阶段,请谨慎在生产环境使用。 **description** `string` | 格式描述 `response.failed.response.text.format.description` 格式描述信息。 **name** `string` | 格式名称 `response.failed.response.text.format.name` 格式名称,作为 JSON Schema 输出格式的标识。 > **注意** > > 仅当 *type* 为 `json_schema` 时需要提供此字段。 **schema** `object` | Schema 定义 `response.failed.response.text.format.schema` JSON Schema 定义。当 *type* 为 `json_schema` 时必填。 **strict** `boolean` | 严格模式 `response.failed.response.text.format.strict` 是否严格按 JSON Schema 校验模型输出。 > **注意** > > 仅当 *type* 为 `json_schema` 时生效。 **thinking** `object` | 深度思考 `response.failed.response.thinking` 本次响应生效的深度思考配置,回显请求中的 thinking 设置。 **type** `string` | 思考模式 `response.failed.response.thinking.type` 深度思考模式。 * `enabled`:开启深度思考。 * `disabled`:关闭深度思考。 * `auto`:由模型自行判断是否需要深度思考。 **tool_choice** `string / object` | 工具调用策略 `response.failed.response.tool_choice` 本次请求实际生效的工具调用策略,回显请求中的 tool_choice 设置。 > **说明** > > 未指定工具时默认值为 `none`;存在工具时默认值为 `auto`。 简单策略 `string` 直接传入字符串 `none`、`auto` 或 `required`,控制工具调用整体策略。 指定工具 `object` 通过对象指定具体工具类型或工具名进行调用。 **type** `string` | 工具类型 `response.failed.response.tool_choice.type` 指定要调用的工具类型,用于精确路由到对应工具。可选值: * `function` * `web_search` * `image_process` * `mcp` * `knowledge_search` * `doubao_app` **name** `string` | 工具名称 `response.failed.response.tool_choice.name` 指定要调用的具体工具名,如函数名或 MCP 服务下的工具名。 **tools** `object[]` | 工具列表 `response.failed.response.tools` 本次响应生效的工具列表,回显请求中的 tools 设置。 函数调用 `object` 自定义函数调用(Function Calling),让模型生成结构化的函数参数。 **name** `string` | 函数名 `response.failed.response.tools.name` 供模型调用的函数名称,模型在 function_call 输出中以该名称回传,用于匹配对应函数。 **type** `string` | 类型 `response.failed.response.tools.type` 工具类型标识,用于在 union 中区分不同工具类别。 取值固定为 `function`。 **description** `string` | 函数描述 `response.failed.response.tools.description` 函数的描述信息,帮助模型理解何时使用该函数。 **parameters** `object` | 参数定义 `response.failed.response.tools.parameters` 函数参数定义,遵循 JSON Schema 格式。 联网搜索 `object` 联网搜索工具,让模型在需要时自动进行网页搜索获取实时信息。 **type** `string` | 类型 `response.failed.response.tools.type` 工具类型标识,用于区分 Tool 的不同变体。 取值固定为 `web_search`。 **limit** `integer` | 最大结果数 `response.failed.response.tools.limit` 每轮搜索最大返回结果数量。 > **说明** > > 单次搜索最多返回 20 条;单轮可能有多次搜索,最终召回条数受此参数限制影响。 **取值范围**:`[1, 50]` **max_keyword** `integer` | 最大关键词数 `response.failed.response.tools.max_keyword` 最大并行搜索关键词数量。 **取值范围**:`[1, 50]` **sources** `string[]` | 搜索来源 `response.failed.response.tools.sources` 搜索信息来源限制,指定模型可从哪些渠道检索网页内容。可选值:`toutiao`、`douyin`、`moji`、`search_engine`、`doubao`。 > **说明** > > `doubao` 不能与其他搜索来源同时配置。传入 `["doubao"]` 时,`tools.limit`、`tools.max_keyword`、`tools.user_location` 均不生效,向它们传入的值将被忽略。 **user_location** `object` | 用户位置 `response.failed.response.tools.user_location` 用户地理位置信息,用于搜索优化。 **type** `string` | 类型 `response.failed.response.tools.user_location.type` 位置类型。 取值固定为 `approximate`。 **city** `string` | 城市 `response.failed.response.tools.user_location.city` 用户所在城市。 **country** `string` | 国家 `response.failed.response.tools.user_location.country` 用户所在国家。 **region** `string` | 地区 `response.failed.response.tools.user_location.region` 用户所在地区。 **timezone** `number` | 时区 `response.failed.response.tools.user_location.timezone` 用户所在时区。 图像处理 `object` 图像处理工具,让模型对图片进行画点、选区、缩放、旋转等操作。 **type** `string` | 类型 `response.failed.response.tools.type` 工具类型标识,用于区分 Tool 的不同变体。 取值固定为 `image_process`。 **grounding** `object` | 选区功能 `response.failed.response.tools.grounding` 选区/裁切功能配置,启用后模型可返回图像中目标的检测框或裁切区域坐标。 **type** `string` | 开关 `response.failed.response.tools.grounding.type` 功能开关。可选值:`enabled`、`disabled`。 **point** `object` | 画点功能 `response.failed.response.tools.point` 画点/画线功能开关。 **type** `string` | 开关 `response.failed.response.tools.point.type` 功能开关。可选值:`enabled`、`disabled`。 **rotate** `object` | 旋转功能 `response.failed.response.tools.rotate` 旋转功能开关。启用后模型可请求对图片按指定角度进行旋转。 > **注意** > > 旋转角度支持范围为 0-359 度。 **type** `string` | 开关 `response.failed.response.tools.rotate.type` 功能开关。可选值:`enabled`、`disabled`。 **zoom** `object` | 缩放功能 `response.failed.response.tools.zoom` 缩放功能开关,启用后模型可对图像目标区域执行缩放操作。 > **说明** > > 缩放倍率支持范围 0.5-2.0 倍。 **type** `string` | 开关 `response.failed.response.tools.zoom.type` 功能开关。可选值:`enabled`、`disabled`。 MCP 工具 `object` MCP(Model Context Protocol)工具,让模型调用外部 MCP Server 提供的工具。 **server_label** `string` | 服务标签 `response.failed.response.tools.server_label` MCP Server 的唯一标识标签。模型在工具调用输出中通过该标签指向对应 Server,便于在多个 MCP Server 场景下区分调用来源。 **server_url** `string` | 服务地址 `response.failed.response.tools.server_url` MCP Server 的 HTTP(S) 访问地址,模型通过该地址向 Server 发起工具调用请求。 **type** `string` | 类型 `response.failed.response.tools.type` 工具类型标识,用于区分 Tool 的不同变体。 取值固定为 `mcp`。 **allowed_tools** `string[] / object` | 允许工具 `response.failed.response.tools.allowed_tools` 允许模型调用的工具范围。可传工具名称字符串数组,或包含 `tool_names` 字段的过滤器对象。 工具名数组 `string[]` 直接传入允许调用的工具名称数组。 工具过滤器 `object` 通过过滤器对象指定允许调用的工具范围。 **tool_names** `string[]` | 工具名列表 `response.failed.response.tools.allowed_tools.tool_names` 允许调用的工具名称列表。 **headers** `object` | 请求头 `response.failed.response.tools.headers` 调用 MCP Server 时附加的 HTTP 请求头,以字符串键值对形式指定 header 名与值。 > **说明** > > * 常用于传递鉴权信息(如 `Authorization`)。 > * `Authorization` 字段不会被服务端存储。 **require_approval** `string / object` | 审批策略 `response.failed.response.tools.require_approval` MCP 工具调用前的审批策略;支持简单模式(字符串)或按工具粒度控制(过滤器对象)。 简单策略 `string` 直接传入字符串 `always` 或 `never`,对所有工具应用统一审批策略。 工具过滤器 `object` 通过过滤器对象按工具粒度配置审批策略。 **always** `object` | 始终审批 `response.failed.response.tools.require_approval.always` 始终需要审批的工具过滤器。 **tool_names** `string[]` | 工具名列表 `response.failed.response.tools.require_approval.always.tool_names` 始终需要审批的工具名称列表。 **never** `object` | 无需审批 `response.failed.response.tools.require_approval.never` 无需审批的工具过滤器。 **tool_names** `string[]` | 工具名列表 `response.failed.response.tools.require_approval.never.tool_names` 无需审批即可调用的工具名称列表。 **server_description** `string` | 服务描述 `response.failed.response.tools.server_description` MCP Server 的描述信息,帮助模型理解何时使用该 Server。 知识库搜索 `object` 私域知识库搜索工具,让模型检索企业内部知识库中的文档内容。 **knowledge_resource_id** `string` | 知识库 ID `response.failed.response.tools.knowledge_resource_id` **type** `string` | 类型 `response.failed.response.tools.type` 工具类型标识,用于区分 Tool 的不同变体。 取值固定为 `knowledge_search`。 **dense_weight** `number` | 稠密权重 `response.failed.response.tools.dense_weight` 混合检索中稠密向量(语义)检索的权重,值越大越偏向语义匹配,越小越偏向关键词匹配。 > **说明** > > 仅在混合检索(索引算法为 `hnsw_hybrid`)下生效。 **取值范围**:`[0.2, 1]` **description** `string` | 知识库描述 `response.failed.response.tools.description` 知识库描述信息,帮助模型理解何时使用该知识库。 **doc_filter** `object` | 文档过滤 `response.failed.response.tools.doc_filter` 设置文档字段级别的检索过滤条件,确保只在符合条件的文档中检索。 > **说明** > > * 支持用作过滤条件的文档字段: > * 系统字段:`doc_id`(仅手动创建的知识库)、`_sys_auto_doc_id`(手动 + API 创建均适用) > * 自定义字段:已为知识库文档添加的**文档标签**(对应知识库 `index_config.fields` 中的 `field`) > * 支持单一条件过滤和多条件组合过滤(支持 `And` / `Or` 逻辑运算)。 > * 详细使用方式和支持字段参见 [filter 表达式](https://docs.volcengine.com/docs/84313/1419289?lang=zh#filter-%E8%A1%A8%E8%BE%BE%E5%BC%8F)。 > * 若自定义字段类型为 `Boolean`,取值范围是 `True` / `False`,大小写规则:cURL 用 `true` / `false`,Python 用 `True` / `False`。 **limit** `integer` | 最大结果数 `response.failed.response.tools.limit` 最大搜索结果数量。 **取值范围**:`[1, 200]` **max_keyword** `integer` | 最大关键词数 `response.failed.response.tools.max_keyword` 最大并行搜索关键词数量。 **取值范围**:`[1, 50]` **ranking_options** `object` | 排序选项 `response.failed.response.tools.ranking_options` 检索后处理选项。可参考 [知识库 API 文档](https://docs.volcengine.com/docs/84313/1350012?lang=zh) `post_processing` 字段。 **chunk_diffusion_count** `integer` | 切片扩散数 `response.failed.response.tools.ranking_options.chunk_diffusion_count` 检索阶段返回命中切片的上下几片邻近切片。取 `0` 表示不进行 chunk diffusion。 **取值范围**:`[0, 5]` **chunk_group** `boolean` | 文本聚合 `response.failed.response.tools.ranking_options.chunk_group` 文本聚合。 * 默认不聚合。 * 对于非结构化文件,可开启文本聚合以更好保留原文档内容语序。 * 开启后,会根据文档及文档顺序,对切片重新聚合排序返回。 **get_attachment_link** `boolean` | 获取附件链接 `response.failed.response.tools.ranking_options.get_attachment_link` 是否获取切片中图片的临时下载链接。 **rerank_model** `string` | Rerank 模型 `response.failed.response.tools.ranking_options.rerank_model` rerank 模型选择。默认值:`base-multilingual-rerank`。取值:`base-multilingual-rerank` / `m3-v2-rerank`。 > **说明** > > * 仅在 `rerank_switch` 为 `true` 时生效。 > * `base-multilingual-rerank`(推荐):速度快、长文本、支持 70+ 种语言。 > * `m3-v2-rerank`:常规文本、支持 100+ 种语言。 **rerank_only_chunk** `boolean` | 仅切片重排 `response.failed.response.tools.ranking_options.rerank_only_chunk` 是否仅根据 chunk 内容计算重排分数。`true` 只根据 chunk 内容计算分;`false` 根据 chunk title + 内容一起计算排序分。 **rerank_switch** `boolean` | 开启重排 `response.failed.response.tools.ranking_options.rerank_switch` 是否自动对检索结果做 rerank。若设置为 `true`,则会自动请求 rerank 模型排序。 **retrieve_count** `integer` | 重排切片数 `response.failed.response.tools.ranking_options.retrieve_count` 进入重排的切片数量。 > **注意** > > * 仅在 `rerank_switch` 为 `true` 时生效。 > * `retrieve_count` 需要大于等于 `limit`,否则会抛出错误。 豆包助手 `object` 豆包助手工具,让模型使用豆包的聊天、深度思考、AI 搜索和推理搜索能力。 **feature** `object` | 功能配置 `response.failed.response.tools.feature` 豆包助手的子功能配置,用于按需开启聊天、深度思考、AI 搜索、推理搜索四类能力并设置对应角色描述。 **ai_search** `object` | AI 搜索 `response.failed.response.tools.feature.ai_search` AI 搜索功能配置。 **role_description** `string` | 角色描述 `response.failed.response.tools.feature.ai_search.role_description` 使用豆包助手时修改角色设定。默认值:`你的名字是豆包,有很强的专业性。` > **注意** > > 此字段与 `system prompt`、`instructions` 互斥,同时配置时以本字段为准。 **type** `string` | 开关 `response.failed.response.tools.feature.ai_search.type` 功能开关。可选值:`enabled`、`disabled`。 **chat** `object` | 普通聊天 `response.failed.response.tools.feature.chat` 普通聊天功能配置。 **role_description** `string` | 角色描述 `response.failed.response.tools.feature.chat.role_description` 使用豆包助手时修改角色设定。默认值:`你的名字是豆包,有很强的专业性。` > **注意** > > 此字段与 `system prompt`、`instructions` 互斥,同时配置时以本字段为准。 **type** `string` | 开关 `response.failed.response.tools.feature.chat.type` 功能开关。可选值:`enabled`、`disabled`。 **deep_chat** `object` | 深度聊天 `response.failed.response.tools.feature.deep_chat` 深度聊天功能配置。 **role_description** `string` | 角色描述 `response.failed.response.tools.feature.deep_chat.role_description` 使用豆包助手时修改角色设定。默认值:`你的名字是豆包,有很强的专业性。` > **注意** > > 此字段与 `system prompt`、`instructions` 互斥,同时配置时以本字段为准。 **type** `string` | 开关 `response.failed.response.tools.feature.deep_chat.type` 功能开关。可选值:`enabled`、`disabled`。 **reasoning_search** `object` | 推理搜索 `response.failed.response.tools.feature.reasoning_search` 推理搜索功能配置。 **role_description** `string` | 角色描述 `response.failed.response.tools.feature.reasoning_search.role_description` 使用豆包助手时修改角色设定。默认值:`你的名字是豆包,有很强的专业性。` > **注意** > > 此字段与 `system prompt`、`instructions` 互斥,同时配置时以本字段为准。 **type** `string` | 开关 `response.failed.response.tools.feature.reasoning_search.type` 功能开关。可选值:`enabled`、`disabled`。 **type** `string` | 类型 `response.failed.response.tools.type` 工具类型,此处固定为 `doubao_app` **user_location** `object` | 用户位置 `response.failed.response.tools.user_location` 用户地理位置信息,用于搜索优化。 **type** `string` | 类型 `response.failed.response.tools.user_location.type` 位置类型。 取值固定为 `approximate`。 **city** `string` | 城市 `response.failed.response.tools.user_location.city` 用户所在城市。 **country** `string` | 国家 `response.failed.response.tools.user_location.country` 用户所在国家。 **region** `string` | 地区 `response.failed.response.tools.user_location.region` 用户所在地区。 **timezone** `number` | 时区 `response.failed.response.tools.user_location.timezone` 用户所在时区。 **top_p** `number` | 采样阈值 `response.failed.response.top_p` 本次请求实际使用的核采样概率阈值。 **usage** `object` | 用量统计 `response.failed.response.usage` 本次响应的 token 用量统计,包含输入、输出与总计 token 数等明细。 **input_tokens** `integer` | 输入 token 数 `response.failed.response.usage.input_tokens` 输入消耗的 token 数量。 **input_tokens_details** `object` | 输入明细 `response.failed.response.usage.input_tokens_details` 输入 token 用量明细。 **cached_tokens** `integer` | 缓存 token `response.failed.response.usage.input_tokens_details.cached_tokens` 命中缓存的 token 数量。 **audio_cached_tokens** `integer` | 音频缓存 Token 数 `response.failed.response.usage.input_tokens_details.audio_cached_tokens` 缓存命中的音频输入内容所消耗的 token 数量。仅在隐式缓存模式且命中音频缓存时返回;开启显式缓存时该字段不返回。 **audio_tokens** `integer` | 音频 token `response.failed.response.usage.input_tokens_details.audio_tokens` 音频输入消耗的 token 数量。 **output_tokens** `integer` | 输出 token 数 `response.failed.response.usage.output_tokens` 输出消耗的 token 数量。 **output_tokens_details** `object` | 输出明细 `response.failed.response.usage.output_tokens_details` 输出 token 用量明细。 **reasoning_tokens** `integer` | 思考 token `response.failed.response.usage.output_tokens_details.reasoning_tokens` 深度思考消耗的 token 数量。 **total_tokens** `integer` | 总 token 数 `response.failed.response.usage.total_tokens` 本次请求消耗的 token 总数。 **tool_usage** `object` | 工具用量 `response.failed.response.usage.tool_usage` 工具调用用量统计。 **doubao_app** `integer` | 豆包次数 `response.failed.response.usage.tool_usage.doubao_app` 豆包助手工具调用次数。 **knowledge_search** `integer` | 知识库次数 `response.failed.response.usage.tool_usage.knowledge_search` 知识库搜索工具调用次数。 **mcp** `integer` | MCP 次数 `response.failed.response.usage.tool_usage.mcp` MCP 工具调用次数。 **web_search** `integer` | 搜索次数 `response.failed.response.usage.tool_usage.web_search` 联网搜索工具调用次数。 **tool_usage_details** `object` | 工具明细 `response.failed.response.usage.tool_usage_details` 工具调用用量明细。 **doubao_app** `object` | 豆包明细 `response.failed.response.usage.tool_usage_details.doubao_app` 豆包助手工具用量明细。 **knowledge_search** `object` | 知识库明细 `response.failed.response.usage.tool_usage_details.knowledge_search` 知识库搜索工具用量明细。 **mcp** `object` | MCP 明细 `response.failed.response.usage.tool_usage_details.mcp` MCP 工具用量明细。 **web_search** `object` | 搜索明细 `response.failed.response.usage.tool_usage_details.web_search` 联网搜索工具用量明细。 **sequence_number** `integer` | 序列号 `response.failed.sequence_number` 事件的序列号。 **type** `string` | 事件类型 `response.failed.type` 事件的类型,总是 `response.failed` --- # Output Item 与文本回答 Source: https://ark.volcengine.com/region:cn-beijing/docs/output-and-text 输出项骨架、文本内容增量以及思维链推理相关的流式事件。 ## Output Item 骨架 ### response.output_item.added > 表示添加了新的输出项。 **item** `object` | 输出项 `response.output_item.added.item` 新增的输出项内容。 消息输出 `object` 模型生成的消息输出,包含文本内容。 **content** `object[]` | 输出内容 `response.output_item.added.item.content` 输出内容列表。 模型回答文本 `object` 模型生成的最终回答文本。 **type** `string` | 类型 `response.output_item.added.item.content.type` 内容类型判别字段,用于区分 union 变体。 取值固定为 `output_text`。 **annotations** `object[]` | 标注列表 `response.output_item.added.item.content.annotations` 文本附带的标注信息列表(如引用来源等) 网页引用 `object` 引用自互联网网页的标注信息。 **title** `string` | 标题 `response.output_item.added.item.content.annotations.title` 引用网页的标题。 **type** `string` | 类型 `response.output_item.added.item.content.annotations.type` 标注类型的判别字段(discriminator)。 取值固定为 `url_citation`。 **url** `string` | 网址 `response.output_item.added.item.content.annotations.url` 引用网页的 URL 地址。 **cover_image** `object` | 封面图 `response.output_item.added.item.content.annotations.cover_image` 网页封面图片信息。 **height** `integer` | 高度 `response.output_item.added.item.content.annotations.cover_image.height` 封面图片高度(像素) **url** `string` | 图片地址 `response.output_item.added.item.content.annotations.cover_image.url` 封面图片的 URL 地址。 **width** `integer` | 宽度 `response.output_item.added.item.content.annotations.cover_image.width` 封面图片宽度(像素) **freshness_info** `string` | 新鲜度 `response.output_item.added.item.content.annotations.freshness_info` 内容新鲜度信息。 **logo_url** `string` | Logo 地址 `response.output_item.added.item.content.annotations.logo_url` 网站 Logo 图标地址。 **mobile_url** `string` | 移动端地址 `response.output_item.added.item.content.annotations.mobile_url` 移动端访问地址。 **publish_time** `string` | 发布时间 `response.output_item.added.item.content.annotations.publish_time` 网页发布时间。 **site_name** `string` | 站点名 `response.output_item.added.item.content.annotations.site_name` 站点名称。 **summary** `string` | 摘要 `response.output_item.added.item.content.annotations.summary` 网页内容摘要。 文档引用 `object` 引用自私域知识库文档的标注信息。 **type** `string` | 类型 `response.output_item.added.item.content.annotations.type` 标注类型。 取值固定为 `doc_citation`。 **chunk_attachment** `object[]` | 分块附件 `response.output_item.added.item.content.annotations.chunk_attachment` 引用分块附带的附件信息列表。 **chunk_id** `integer` | 分块 ID `response.output_item.added.item.content.annotations.chunk_id` 引用文档分块的 ID。 **doc_id** `string` | 文档 ID `response.output_item.added.item.content.annotations.doc_id` 引用文档的 ID。 **doc_name** `string` | 文档名 `response.output_item.added.item.content.annotations.doc_name` 引用文档的名称。 **text** `string` | 文本内容 `response.output_item.added.item.content.text` 模型生成的文本内容。 模型思维链文本 `object` 模型生成的思维链文本。 **type** `string` | 类型 `response.output_item.added.item.content.type` 内容类型标识,用于区分 union 变体。 取值固定为 `reasoning_text`。 **annotations** `object[]` | 标注列表 `response.output_item.added.item.content.annotations` 思维链附带的标注信息列表。 网页引用 `object` 引用自互联网网页的标注信息。 **title** `string` | 标题 `response.output_item.added.item.content.annotations.title` 引用网页的标题。 **type** `string` | 类型 `response.output_item.added.item.content.annotations.type` 标注类型的判别字段(discriminator)。 取值固定为 `url_citation`。 **url** `string` | 网址 `response.output_item.added.item.content.annotations.url` 引用网页的 URL 地址。 **cover_image** `object` | 封面图 `response.output_item.added.item.content.annotations.cover_image` 网页封面图片信息。 **height** `integer` | 高度 `response.output_item.added.item.content.annotations.cover_image.height` 封面图片高度(像素) **url** `string` | 图片地址 `response.output_item.added.item.content.annotations.cover_image.url` 封面图片的 URL 地址。 **width** `integer` | 宽度 `response.output_item.added.item.content.annotations.cover_image.width` 封面图片宽度(像素) **freshness_info** `string` | 新鲜度 `response.output_item.added.item.content.annotations.freshness_info` 内容新鲜度信息。 **logo_url** `string` | Logo 地址 `response.output_item.added.item.content.annotations.logo_url` 网站 Logo 图标地址。 **mobile_url** `string` | 移动端地址 `response.output_item.added.item.content.annotations.mobile_url` 移动端访问地址。 **publish_time** `string` | 发布时间 `response.output_item.added.item.content.annotations.publish_time` 网页发布时间。 **site_name** `string` | 站点名 `response.output_item.added.item.content.annotations.site_name` 站点名称。 **summary** `string` | 摘要 `response.output_item.added.item.content.annotations.summary` 网页内容摘要。 文档引用 `object` 引用自私域知识库文档的标注信息。 **type** `string` | 类型 `response.output_item.added.item.content.annotations.type` 标注类型。 取值固定为 `doc_citation`。 **chunk_attachment** `object[]` | 分块附件 `response.output_item.added.item.content.annotations.chunk_attachment` 引用分块附带的附件信息列表。 **chunk_id** `integer` | 分块 ID `response.output_item.added.item.content.annotations.chunk_id` 引用文档分块的 ID。 **doc_id** `string` | 文档 ID `response.output_item.added.item.content.annotations.doc_id` 引用文档的 ID。 **doc_name** `string` | 文档名 `response.output_item.added.item.content.annotations.doc_name` 引用文档的名称。 **text** `string` | 文本内容 `response.output_item.added.item.content.text` 模型思维链文本内容。 **id** `string` | 条目 ID `response.output_item.added.item.id` 输出条目唯一标识。 **role** `string` | 角色 `response.output_item.added.item.role` 消息发送者的角色。 取值固定为 `assistant`。 **status** `string` | 状态 `response.output_item.added.item.status` 消息输出条目的当前状态。 * `completed`:消息已生成完毕。 * `in_progress`:消息正在生成中(流式场景)。 * `incomplete`:消息未完整生成(例如达到 `max_output_tokens` 上限)。 * `failed`:消息生成失败。 **type** `string` | 类型 `response.output_item.added.item.type` 输出条目的类型标识。 取值固定为 `message`。 **partial** `boolean` | 增量片段 `response.output_item.added.item.partial` 是否为流式增量片段。 **phase** `string` | 消息阶段 `response.output_item.added.item.phase` 标记 assistant 消息属于中间讲解还是最终回答。在回放 assistant 历史消息时,建议保留并原样回传该字段。可选值:`commentary`、`final_answer`。 函数调用输出 `object` 模型发起的函数调用请求。 **type** `string` | 类型 `response.output_item.added.item.type` 输出条目类型标识,用于区分 OutputItem 变体。 取值固定为 `function_call`。 **arguments** `string` | 参数 `response.output_item.added.item.arguments` 函数参数的 JSON 字符串。 **call_id** `string` | 调用 ID `response.output_item.added.item.call_id` 函数调用的唯一标识 ID,用于将该 function_call 输出与后续回传的 function_call_output 关联匹配。 **id** `string` | 条目 ID `response.output_item.added.item.id` 输出条目唯一标识。 **name** `string` | 函数名 `response.output_item.added.item.name` 调用的函数名称。 **status** `string` | 状态 `response.output_item.added.item.status` 函数调用条目的当前状态。 * `completed`:函数调用请求已生成完毕。 * `in_progress`:函数调用请求正在生成中(流式场景)。 * `incomplete`:函数调用请求未完整生成(例如达到 `max_output_tokens` 上限)。 * `failed`:函数调用生成失败。 思维链输出 `object` 模型的深度思考过程输出。 **status** `string` | 状态 `response.output_item.added.item.status` 推理条目的处理状态,用于判断思维链是否生成完成。可选值:`completed`、`failed`、`in_progress`、`incomplete`。 **summary** `object[]` | 推理摘要 `response.output_item.added.item.summary` 推理摘要内容列表。 **type** `string` | 类型 `response.output_item.added.item.summary.type` 摘要片段类型标识。 取值固定为 `summary_text`。 **text** `string` | 摘要文本 `response.output_item.added.item.summary.text` 思维链摘要文本内容。 **type** `string` | 类型 `response.output_item.added.item.type` 输出条目类型标识,用于区分 OutputItem 变体。 取值固定为 `reasoning`。 **content** `object[]` | 推理内容 `response.output_item.added.item.content` 思维链推理过程的内容元素列表。 模型回答文本 `object` 模型生成的最终回答文本。 **type** `string` | 类型 `response.output_item.added.item.content.type` 内容类型判别字段,用于区分 union 变体。 取值固定为 `output_text`。 **annotations** `object[]` | 标注列表 `response.output_item.added.item.content.annotations` 文本附带的标注信息列表(如引用来源等) 网页引用 `object` 引用自互联网网页的标注信息。 **title** `string` | 标题 `response.output_item.added.item.content.annotations.title` 引用网页的标题。 **type** `string` | 类型 `response.output_item.added.item.content.annotations.type` 标注类型的判别字段(discriminator)。 取值固定为 `url_citation`。 **url** `string` | 网址 `response.output_item.added.item.content.annotations.url` 引用网页的 URL 地址。 **cover_image** `object` | 封面图 `response.output_item.added.item.content.annotations.cover_image` 网页封面图片信息。 **height** `integer` | 高度 `response.output_item.added.item.content.annotations.cover_image.height` 封面图片高度(像素) **url** `string` | 图片地址 `response.output_item.added.item.content.annotations.cover_image.url` 封面图片的 URL 地址。 **width** `integer` | 宽度 `response.output_item.added.item.content.annotations.cover_image.width` 封面图片宽度(像素) **freshness_info** `string` | 新鲜度 `response.output_item.added.item.content.annotations.freshness_info` 内容新鲜度信息。 **logo_url** `string` | Logo 地址 `response.output_item.added.item.content.annotations.logo_url` 网站 Logo 图标地址。 **mobile_url** `string` | 移动端地址 `response.output_item.added.item.content.annotations.mobile_url` 移动端访问地址。 **publish_time** `string` | 发布时间 `response.output_item.added.item.content.annotations.publish_time` 网页发布时间。 **site_name** `string` | 站点名 `response.output_item.added.item.content.annotations.site_name` 站点名称。 **summary** `string` | 摘要 `response.output_item.added.item.content.annotations.summary` 网页内容摘要。 文档引用 `object` 引用自私域知识库文档的标注信息。 **type** `string` | 类型 `response.output_item.added.item.content.annotations.type` 标注类型。 取值固定为 `doc_citation`。 **chunk_attachment** `object[]` | 分块附件 `response.output_item.added.item.content.annotations.chunk_attachment` 引用分块附带的附件信息列表。 **chunk_id** `integer` | 分块 ID `response.output_item.added.item.content.annotations.chunk_id` 引用文档分块的 ID。 **doc_id** `string` | 文档 ID `response.output_item.added.item.content.annotations.doc_id` 引用文档的 ID。 **doc_name** `string` | 文档名 `response.output_item.added.item.content.annotations.doc_name` 引用文档的名称。 **text** `string` | 文本内容 `response.output_item.added.item.content.text` 模型生成的文本内容。 模型思维链文本 `object` 模型生成的思维链文本。 **type** `string` | 类型 `response.output_item.added.item.content.type` 内容类型标识,用于区分 union 变体。 取值固定为 `reasoning_text`。 **annotations** `object[]` | 标注列表 `response.output_item.added.item.content.annotations` 思维链附带的标注信息列表。 网页引用 `object` 引用自互联网网页的标注信息。 **title** `string` | 标题 `response.output_item.added.item.content.annotations.title` 引用网页的标题。 **type** `string` | 类型 `response.output_item.added.item.content.annotations.type` 标注类型的判别字段(discriminator)。 取值固定为 `url_citation`。 **url** `string` | 网址 `response.output_item.added.item.content.annotations.url` 引用网页的 URL 地址。 **cover_image** `object` | 封面图 `response.output_item.added.item.content.annotations.cover_image` 网页封面图片信息。 **height** `integer` | 高度 `response.output_item.added.item.content.annotations.cover_image.height` 封面图片高度(像素) **url** `string` | 图片地址 `response.output_item.added.item.content.annotations.cover_image.url` 封面图片的 URL 地址。 **width** `integer` | 宽度 `response.output_item.added.item.content.annotations.cover_image.width` 封面图片宽度(像素) **freshness_info** `string` | 新鲜度 `response.output_item.added.item.content.annotations.freshness_info` 内容新鲜度信息。 **logo_url** `string` | Logo 地址 `response.output_item.added.item.content.annotations.logo_url` 网站 Logo 图标地址。 **mobile_url** `string` | 移动端地址 `response.output_item.added.item.content.annotations.mobile_url` 移动端访问地址。 **publish_time** `string` | 发布时间 `response.output_item.added.item.content.annotations.publish_time` 网页发布时间。 **site_name** `string` | 站点名 `response.output_item.added.item.content.annotations.site_name` 站点名称。 **summary** `string` | 摘要 `response.output_item.added.item.content.annotations.summary` 网页内容摘要。 文档引用 `object` 引用自私域知识库文档的标注信息。 **type** `string` | 类型 `response.output_item.added.item.content.annotations.type` 标注类型。 取值固定为 `doc_citation`。 **chunk_attachment** `object[]` | 分块附件 `response.output_item.added.item.content.annotations.chunk_attachment` 引用分块附带的附件信息列表。 **chunk_id** `integer` | 分块 ID `response.output_item.added.item.content.annotations.chunk_id` 引用文档分块的 ID。 **doc_id** `string` | 文档 ID `response.output_item.added.item.content.annotations.doc_id` 引用文档的 ID。 **doc_name** `string` | 文档名 `response.output_item.added.item.content.annotations.doc_name` 引用文档的名称。 **text** `string` | 文本内容 `response.output_item.added.item.content.text` 模型思维链文本内容。 **encrypted_content** `string` | 加密思维链 `response.output_item.added.item.encrypted_content` 思考内容加密原文。经加密及压缩处理后的思考内容原文。 相关文档: * [关键规则](/docs/agent-model-invocation-practice#key-rules) * [回传思考内容加密块使用示例](/docs/agent-model-invocation-practice#encrypted-thinking-block-examples) > **说明** > > 流式输出场景下,思考内容加密原文通过 `response.output_item.added`、`response.output_item.done`、`response.completed` 等相关事件下发,需要按事件中 `encrypted_content` 字段非空过滤获取。 **模型支持**: * `doubao-seed-2-0-lite-260428 及后续版本` **id** `string` | 条目 ID `response.output_item.added.item.id` 输出条目唯一标识。 语音转写输出 `object` 模型返回的语音转写输出。 **status** `string` | 状态 `response.output_item.added.item.status` 语音转写条目的当前状态。 * `completed`:转写已生成完毕。 * `in_progress`:转写正在生成中(流式场景)。 * `incomplete`:转写未完整生成(例如达到输出上限而截断)。 * `failed`:转写生成失败。 **type** `string` | 类型 `response.output_item.added.item.type` 输出条目类型标识。 取值固定为 `transcription`。 **id** `string` | 条目 ID `response.output_item.added.item.id` 输出条目唯一标识。 **transcription** `object[]` | 转写内容 `response.output_item.added.item.transcription` 语音转写结果片段列表。 **type** `string` | 类型 `response.output_item.added.item.transcription.type` 转写片段类型。 取值固定为 `transcription_text`。 **chunks** `object[]` | 音频小段 `response.output_item.added.item.transcription.chunks` 当前片段对应的音频小段列表。 **end_time** `integer` | 结束时间 `response.output_item.added.item.transcription.chunks.end_time` 片段结束时间(毫秒) **start_time** `integer` | 开始时间 `response.output_item.added.item.transcription.chunks.start_time` 片段开始时间(毫秒) **text** `string` | 文字内容 `response.output_item.added.item.transcription.chunks.text` 当前片段对应的文字内容。 **text** `string` | 转写文本 `response.output_item.added.item.transcription.text` 当前片段的转写文本。 网页搜索调用 `object` 模型发起的网页搜索调用记录。 **id** `string` | 条目 ID `response.output_item.added.item.id` 输出条目唯一标识。 **status** `string` | 状态 `response.output_item.added.item.status` 网页搜索调用的当前状态。可选值:`in_progress`、`searching`、`completed`、`incomplete`、`failed`。 **type** `string` | 类型 `response.output_item.added.item.type` 输出条目类型标识,用于区分 OutputItem 变体。 取值固定为 `web_search_call`。 **action** `object` | 搜索动作 `response.output_item.added.item.action` 描述模型执行的网页搜索动作,包括搜索类型与查询关键字。 **query** `string` | 查询语句 `response.output_item.added.item.action.query` 模型实际发起的搜索查询语句。 **type** `string` | 类型 `response.output_item.added.item.action.type` 网页搜索动作的类型标识。 取值固定为 `search`。 **queries** `string[]` | 查询语句列表 `response.output_item.added.item.action.queries` 本次网页搜索产生的查询语句列表。 图像处理调用 `object` 模型发起的图像处理调用记录。 **id** `string` | 条目 ID `response.output_item.added.item.id` 输出条目唯一标识。 **status** `string` | 状态 `response.output_item.added.item.status` 图像处理调用的当前状态。 * `completed`:图像处理已完成。 * `in_progress`:图像处理正在执行中。 * `incomplete`:图像处理未完整执行(例如被中断或截断)。 * `failed`:图像处理执行失败,具体原因见 `error` 字段。 **type** `string` | 类型 `response.output_item.added.item.type` 输出条目类型标识,用于区分 OutputItem 变体。 取值固定为 `image_process`。 **action** `object` | 处理动作 `response.output_item.added.item.action` 图像处理动作详情。 **type** `string` | 类型 `response.output_item.added.item.action.type` 图像处理动作类型。 **result_image_url** `string` | 结果图地址 `response.output_item.added.item.action.result_image_url` 处理后图像的 URL 地址。 **arguments** `object` | 处理参数 `response.output_item.added.item.arguments` 图像处理动作的输入参数,以键值对形式承载具体处理选项。 **error** `object` | 图像处理错误 `response.output_item.added.item.error` 图像处理失败时的错误信息。 **message** `string` | 错误描述 `response.output_item.added.item.error.message` 错误的可读描述。 MCP 审批请求 `object` MCP 工具调用前的审批请求记录。 **arguments** `string` | 调用参数 `response.output_item.added.item.arguments` 工具调用参数的 JSON 字符串。 **name** `string` | 工具名 `response.output_item.added.item.name` 待运行的工具名称。 **server_label** `string` | 服务标签 `response.output_item.added.item.server_label` 发起请求的 MCP Server 标签。 **type** `string` | 类型 `response.output_item.added.item.type` 输出项类型标识符,用于区分 OutputItem 的变体。 取值固定为 `mcp_approval_request`。 **id** `string` | 请求 ID `response.output_item.added.item.id` 审批请求的唯一 ID。 MCP 工具清单 `object` MCP Server 提供的工具清单输出。 **server_label** `string` | 服务标签 `response.output_item.added.item.server_label` MCP Server 标签。 **type** `string` | 类型 `response.output_item.added.item.type` 输出项类型标识。 取值固定为 `mcp_list_tools`。 **error** `string` | 错误信息 `response.output_item.added.item.error` 当 MCP Server 无法返回工具列表时的错误信息。 **id** `string` | 列表 ID `response.output_item.added.item.id` 工具列表的唯一 ID。 **tools** `object[]` | 工具列表 `response.output_item.added.item.tools` 该 MCP Server 上可用的工具列表。 **name** `string` | 工具名 `response.output_item.added.item.tools.name` 工具名称。 **annotations** `object` | 注解信息 `response.output_item.added.item.tools.annotations` 工具的附加注解信息。 **description** `string` | 工具描述 `response.output_item.added.item.tools.description` 工具的功能描述。 **input_schema** `object` | 入参 Schema `response.output_item.added.item.tools.input_schema` 描述工具入参的 JSON Schema。 MCP 工具调用 `object` 模型对 MCP 工具的实际调用记录及结果。 **name** `string` | 工具名 `response.output_item.added.item.name` 实际运行的工具名称。 **server_label** `string` | 服务标签 `response.output_item.added.item.server_label` 运行工具的 MCP Server 标签。 **type** `string` | 类型 `response.output_item.added.item.type` 标识该输出项为 MCP 工具调用记录。 取值固定为 `mcp_call`。 **arguments** `string` | 调用参数 `response.output_item.added.item.arguments` 传递给 MCP 工具的调用参数,格式为 JSON 字符串。 > **说明** > > 该字段通过 `response.mcp_call_arguments.delta` 事件流式追加,初始 `output_item.added` 事件可能不携带该字段。 **error** `string` | 错误信息 `response.output_item.added.item.error` 工具调用失败时的错误信息。 **id** `string` | 调用 ID `response.output_item.added.item.id` 工具调用的唯一 ID。 **output** `string` | 返回结果 `response.output_item.added.item.output` 工具调用的返回结果。 知识库检索调用 `object` 模型发起的私域知识库检索调用记录。 **knowledge_resource_id** `string` | 知识库 ID `response.output_item.added.item.knowledge_resource_id` 检索使用的知识库 ID。 **queries** `string[]` | 查询语句 `response.output_item.added.item.queries` 模型实际执行的检索查询语句。 **status** `string` | 状态 `response.output_item.added.item.status` 知识库检索调用的执行状态。可选值:`in_progress`、`searching`、`completed`、`failed`、`incomplete`。 **type** `string` | 类型 `response.output_item.added.item.type` 输出条目类型标识,用于区分不同类型的输出条目。 取值固定为 `knowledge_search_call`。 **id** `string` | 条目 ID `response.output_item.added.item.id` 输出条目唯一标识。 豆包应用调用 `object` 模型对豆包助手能力的调用记录。 **type** `string` | 类型 `response.output_item.added.item.type` 输出条目类型标识。 取值固定为 `doubao_app_call`。 **blocks** `object[]` | 内容块 `response.output_item.added.item.blocks` 豆包应用调用产出的内容块列表。 文本输出 `object` 豆包应用产出的文本输出内容块。 **type** `string` | 类型 `response.output_item.added.item.blocks.type` 内容块类型标识符。 取值固定为 `output_text`。 **id** `string` | 块 ID `response.output_item.added.item.blocks.id` 内容块的唯一标识。 **parent_id** `string` | 父级 ID `response.output_item.added.item.blocks.parent_id` 所属父级条目的 ID。 **status** `string` | 状态 `response.output_item.added.item.blocks.status` 内容块状态。 **text** `string` | 文本内容 `response.output_item.added.item.blocks.text` 思维链文本 `object` 豆包应用产出的思维链文本内容块。 **type** `string` | 类型 `response.output_item.added.item.blocks.type` 内容块类型标识符。 取值固定为 `reasoning_text`。 **id** `string` | 块 ID `response.output_item.added.item.blocks.id` 内容块的唯一标识。 **parent_id** `string` | 父级 ID `response.output_item.added.item.blocks.parent_id` 所属父级条目的 ID。 **reasoning_text** `string` | 思考文本 `response.output_item.added.item.blocks.reasoning_text` 思维链文本内容。 **status** `string` | 状态 `response.output_item.added.item.blocks.status` 内容块状态。 搜索过程 `object` 豆包应用 AI 搜索过程产出的内容块。 **type** `string` | 类型 `response.output_item.added.item.blocks.type` 内容块类型标识符。 取值固定为 `search`。 **id** `string` | 块 ID `response.output_item.added.item.blocks.id` 内容块的唯一标识。 **parent_id** `string` | 父级 ID `response.output_item.added.item.blocks.parent_id` 所属父级条目的 ID。 **queries** `string[]` | 查询语句 `response.output_item.added.item.blocks.queries` 搜索查询语句列表。 **results** `object[]` | 搜索结果 `response.output_item.added.item.blocks.results` 搜索结果列表。 **text_card** `object` | 文本卡片 `response.output_item.added.item.blocks.results.text_card` 文本卡片形式的搜索结果。 **sitename** `string` | 站点名 `response.output_item.added.item.blocks.results.text_card.sitename` 来源站点名称。 **title** `string` | 标题 `response.output_item.added.item.blocks.results.text_card.title` 搜索结果标题。 **url** `string` | 网址 `response.output_item.added.item.blocks.results.text_card.url` 搜索结果 URL 地址。 **status** `string` | 状态 `response.output_item.added.item.blocks.status` 内容块状态。 **summary** `string` | 搜索总结 `response.output_item.added.item.blocks.summary` AI 搜索过程中对本轮搜索结果的总结性文字,概括从搜索结果中提取的核心信息。 推理搜索过程 `object` 豆包应用推理搜索过程产出的内容块。 **type** `string` | 类型 `response.output_item.added.item.blocks.type` 内容块类型。 取值固定为 `reasoning_search`。 **id** `string` | 块 ID `response.output_item.added.item.blocks.id` 内容块的唯一标识。 **parent_id** `string` | 父级 ID `response.output_item.added.item.blocks.parent_id` 所属父级条目的 ID。 **queries** `string[]` | 查询语句 `response.output_item.added.item.blocks.queries` 搜索查询语句列表。 **results** `object[]` | 搜索结果 `response.output_item.added.item.blocks.results` 搜索结果列表。 **text_card** `object` | 文本卡片 `response.output_item.added.item.blocks.results.text_card` 文本卡片形式的搜索结果。 **sitename** `string` | 站点名 `response.output_item.added.item.blocks.results.text_card.sitename` 来源站点名称。 **title** `string` | 标题 `response.output_item.added.item.blocks.results.text_card.title` 搜索结果标题。 **url** `string` | 网址 `response.output_item.added.item.blocks.results.text_card.url` 搜索结果 URL 地址。 **status** `string` | 状态 `response.output_item.added.item.blocks.status` 推理搜索内容块的处理状态。可选值:`in_progress`、`searching`、`completed`、`incomplete`、`failed`。 **summary** `string` | 搜索总结 `response.output_item.added.item.blocks.summary` 推理搜索过程中对本轮搜索结果的总结性文字,概括从搜索结果中提取的核心信息。 **feature** `string` | 功能名 `response.output_item.added.item.feature` 本次调用触发的豆包子功能名称。可选值:`chat`、`deep_chat`、`ai_search`、`reasoning_search`。 **id** `string` | 条目 ID `response.output_item.added.item.id` 输出条目唯一标识。 **status** `string` | 状态 `response.output_item.added.item.status` 输出状态。可选值:`completed`、`failed`、`in_progress`、`incomplete`。 智能体工具调用 `object` 模型发起的智能体工具调用记录。 **name** `string` | 工具名 `response.output_item.added.item.name` 被调用的智能体工具名称。 **status** `string` | 状态 `response.output_item.added.item.status` 智能体工具调用的执行状态。可选值:`completed`、`failed`、`in_progress`、`incomplete`。 **type** `string` | 类型 `response.output_item.added.item.type` 输出条目类型标识符,用于区分 OutputItem 的 variant。 取值固定为 `agent_tool_call`。 **id** `string` | 条目 ID `response.output_item.added.item.id` 输出条目唯一标识。 **output_index** `integer` | 输出项索引 `response.output_item.added.output_index` 被添加的输出项的索引。 **sequence_number** `integer` | 序列号 `response.output_item.added.sequence_number` 事件的序列号。 **type** `string` | 事件类型 `response.output_item.added.type` 事件的类型,总是 `response.output_item.added` ### response.output_item.done > 表示输出项已完成。 **item** `object` | 输出项 `response.output_item.done.item` 已完成的输出项内容。 消息输出 `object` 模型生成的消息输出,包含文本内容。 **content** `object[]` | 输出内容 `response.output_item.done.item.content` 输出内容列表。 模型回答文本 `object` 模型生成的最终回答文本。 **type** `string` | 类型 `response.output_item.done.item.content.type` 内容类型判别字段,用于区分 union 变体。 取值固定为 `output_text`。 **annotations** `object[]` | 标注列表 `response.output_item.done.item.content.annotations` 文本附带的标注信息列表(如引用来源等) 网页引用 `object` 引用自互联网网页的标注信息。 **title** `string` | 标题 `response.output_item.done.item.content.annotations.title` 引用网页的标题。 **type** `string` | 类型 `response.output_item.done.item.content.annotations.type` 标注类型的判别字段(discriminator)。 取值固定为 `url_citation`。 **url** `string` | 网址 `response.output_item.done.item.content.annotations.url` 引用网页的 URL 地址。 **cover_image** `object` | 封面图 `response.output_item.done.item.content.annotations.cover_image` 网页封面图片信息。 **height** `integer` | 高度 `response.output_item.done.item.content.annotations.cover_image.height` 封面图片高度(像素) **url** `string` | 图片地址 `response.output_item.done.item.content.annotations.cover_image.url` 封面图片的 URL 地址。 **width** `integer` | 宽度 `response.output_item.done.item.content.annotations.cover_image.width` 封面图片宽度(像素) **freshness_info** `string` | 新鲜度 `response.output_item.done.item.content.annotations.freshness_info` 内容新鲜度信息。 **logo_url** `string` | Logo 地址 `response.output_item.done.item.content.annotations.logo_url` 网站 Logo 图标地址。 **mobile_url** `string` | 移动端地址 `response.output_item.done.item.content.annotations.mobile_url` 移动端访问地址。 **publish_time** `string` | 发布时间 `response.output_item.done.item.content.annotations.publish_time` 网页发布时间。 **site_name** `string` | 站点名 `response.output_item.done.item.content.annotations.site_name` 站点名称。 **summary** `string` | 摘要 `response.output_item.done.item.content.annotations.summary` 网页内容摘要。 文档引用 `object` 引用自私域知识库文档的标注信息。 **type** `string` | 类型 `response.output_item.done.item.content.annotations.type` 标注类型。 取值固定为 `doc_citation`。 **chunk_attachment** `object[]` | 分块附件 `response.output_item.done.item.content.annotations.chunk_attachment` 引用分块附带的附件信息列表。 **chunk_id** `integer` | 分块 ID `response.output_item.done.item.content.annotations.chunk_id` 引用文档分块的 ID。 **doc_id** `string` | 文档 ID `response.output_item.done.item.content.annotations.doc_id` 引用文档的 ID。 **doc_name** `string` | 文档名 `response.output_item.done.item.content.annotations.doc_name` 引用文档的名称。 **text** `string` | 文本内容 `response.output_item.done.item.content.text` 模型生成的文本内容。 模型思维链文本 `object` 模型生成的思维链文本。 **type** `string` | 类型 `response.output_item.done.item.content.type` 内容类型标识,用于区分 union 变体。 取值固定为 `reasoning_text`。 **annotations** `object[]` | 标注列表 `response.output_item.done.item.content.annotations` 思维链附带的标注信息列表。 网页引用 `object` 引用自互联网网页的标注信息。 **title** `string` | 标题 `response.output_item.done.item.content.annotations.title` 引用网页的标题。 **type** `string` | 类型 `response.output_item.done.item.content.annotations.type` 标注类型的判别字段(discriminator)。 取值固定为 `url_citation`。 **url** `string` | 网址 `response.output_item.done.item.content.annotations.url` 引用网页的 URL 地址。 **cover_image** `object` | 封面图 `response.output_item.done.item.content.annotations.cover_image` 网页封面图片信息。 **height** `integer` | 高度 `response.output_item.done.item.content.annotations.cover_image.height` 封面图片高度(像素) **url** `string` | 图片地址 `response.output_item.done.item.content.annotations.cover_image.url` 封面图片的 URL 地址。 **width** `integer` | 宽度 `response.output_item.done.item.content.annotations.cover_image.width` 封面图片宽度(像素) **freshness_info** `string` | 新鲜度 `response.output_item.done.item.content.annotations.freshness_info` 内容新鲜度信息。 **logo_url** `string` | Logo 地址 `response.output_item.done.item.content.annotations.logo_url` 网站 Logo 图标地址。 **mobile_url** `string` | 移动端地址 `response.output_item.done.item.content.annotations.mobile_url` 移动端访问地址。 **publish_time** `string` | 发布时间 `response.output_item.done.item.content.annotations.publish_time` 网页发布时间。 **site_name** `string` | 站点名 `response.output_item.done.item.content.annotations.site_name` 站点名称。 **summary** `string` | 摘要 `response.output_item.done.item.content.annotations.summary` 网页内容摘要。 文档引用 `object` 引用自私域知识库文档的标注信息。 **type** `string` | 类型 `response.output_item.done.item.content.annotations.type` 标注类型。 取值固定为 `doc_citation`。 **chunk_attachment** `object[]` | 分块附件 `response.output_item.done.item.content.annotations.chunk_attachment` 引用分块附带的附件信息列表。 **chunk_id** `integer` | 分块 ID `response.output_item.done.item.content.annotations.chunk_id` 引用文档分块的 ID。 **doc_id** `string` | 文档 ID `response.output_item.done.item.content.annotations.doc_id` 引用文档的 ID。 **doc_name** `string` | 文档名 `response.output_item.done.item.content.annotations.doc_name` 引用文档的名称。 **text** `string` | 文本内容 `response.output_item.done.item.content.text` 模型思维链文本内容。 **id** `string` | 条目 ID `response.output_item.done.item.id` 输出条目唯一标识。 **role** `string` | 角色 `response.output_item.done.item.role` 消息发送者的角色。 取值固定为 `assistant`。 **status** `string` | 状态 `response.output_item.done.item.status` 消息输出条目的当前状态。 * `completed`:消息已生成完毕。 * `in_progress`:消息正在生成中(流式场景)。 * `incomplete`:消息未完整生成(例如达到 `max_output_tokens` 上限)。 * `failed`:消息生成失败。 **type** `string` | 类型 `response.output_item.done.item.type` 输出条目的类型标识。 取值固定为 `message`。 **partial** `boolean` | 增量片段 `response.output_item.done.item.partial` 是否为流式增量片段。 **phase** `string` | 消息阶段 `response.output_item.done.item.phase` 标记 assistant 消息属于中间讲解还是最终回答。在回放 assistant 历史消息时,建议保留并原样回传该字段。可选值:`commentary`、`final_answer`。 函数调用输出 `object` 模型发起的函数调用请求。 **type** `string` | 类型 `response.output_item.done.item.type` 输出条目类型标识,用于区分 OutputItem 变体。 取值固定为 `function_call`。 **arguments** `string` | 参数 `response.output_item.done.item.arguments` 函数参数的 JSON 字符串。 **call_id** `string` | 调用 ID `response.output_item.done.item.call_id` 函数调用的唯一标识 ID,用于将该 function_call 输出与后续回传的 function_call_output 关联匹配。 **id** `string` | 条目 ID `response.output_item.done.item.id` 输出条目唯一标识。 **name** `string` | 函数名 `response.output_item.done.item.name` 调用的函数名称。 **status** `string` | 状态 `response.output_item.done.item.status` 函数调用条目的当前状态。 * `completed`:函数调用请求已生成完毕。 * `in_progress`:函数调用请求正在生成中(流式场景)。 * `incomplete`:函数调用请求未完整生成(例如达到 `max_output_tokens` 上限)。 * `failed`:函数调用生成失败。 思维链输出 `object` 模型的深度思考过程输出。 **status** `string` | 状态 `response.output_item.done.item.status` 推理条目的处理状态,用于判断思维链是否生成完成。可选值:`completed`、`failed`、`in_progress`、`incomplete`。 **summary** `object[]` | 推理摘要 `response.output_item.done.item.summary` 推理摘要内容列表。 **type** `string` | 类型 `response.output_item.done.item.summary.type` 摘要片段类型标识。 取值固定为 `summary_text`。 **text** `string` | 摘要文本 `response.output_item.done.item.summary.text` 思维链摘要文本内容。 **type** `string` | 类型 `response.output_item.done.item.type` 输出条目类型标识,用于区分 OutputItem 变体。 取值固定为 `reasoning`。 **content** `object[]` | 推理内容 `response.output_item.done.item.content` 思维链推理过程的内容元素列表。 模型回答文本 `object` 模型生成的最终回答文本。 **type** `string` | 类型 `response.output_item.done.item.content.type` 内容类型判别字段,用于区分 union 变体。 取值固定为 `output_text`。 **annotations** `object[]` | 标注列表 `response.output_item.done.item.content.annotations` 文本附带的标注信息列表(如引用来源等) 网页引用 `object` 引用自互联网网页的标注信息。 **title** `string` | 标题 `response.output_item.done.item.content.annotations.title` 引用网页的标题。 **type** `string` | 类型 `response.output_item.done.item.content.annotations.type` 标注类型的判别字段(discriminator)。 取值固定为 `url_citation`。 **url** `string` | 网址 `response.output_item.done.item.content.annotations.url` 引用网页的 URL 地址。 **cover_image** `object` | 封面图 `response.output_item.done.item.content.annotations.cover_image` 网页封面图片信息。 **height** `integer` | 高度 `response.output_item.done.item.content.annotations.cover_image.height` 封面图片高度(像素) **url** `string` | 图片地址 `response.output_item.done.item.content.annotations.cover_image.url` 封面图片的 URL 地址。 **width** `integer` | 宽度 `response.output_item.done.item.content.annotations.cover_image.width` 封面图片宽度(像素) **freshness_info** `string` | 新鲜度 `response.output_item.done.item.content.annotations.freshness_info` 内容新鲜度信息。 **logo_url** `string` | Logo 地址 `response.output_item.done.item.content.annotations.logo_url` 网站 Logo 图标地址。 **mobile_url** `string` | 移动端地址 `response.output_item.done.item.content.annotations.mobile_url` 移动端访问地址。 **publish_time** `string` | 发布时间 `response.output_item.done.item.content.annotations.publish_time` 网页发布时间。 **site_name** `string` | 站点名 `response.output_item.done.item.content.annotations.site_name` 站点名称。 **summary** `string` | 摘要 `response.output_item.done.item.content.annotations.summary` 网页内容摘要。 文档引用 `object` 引用自私域知识库文档的标注信息。 **type** `string` | 类型 `response.output_item.done.item.content.annotations.type` 标注类型。 取值固定为 `doc_citation`。 **chunk_attachment** `object[]` | 分块附件 `response.output_item.done.item.content.annotations.chunk_attachment` 引用分块附带的附件信息列表。 **chunk_id** `integer` | 分块 ID `response.output_item.done.item.content.annotations.chunk_id` 引用文档分块的 ID。 **doc_id** `string` | 文档 ID `response.output_item.done.item.content.annotations.doc_id` 引用文档的 ID。 **doc_name** `string` | 文档名 `response.output_item.done.item.content.annotations.doc_name` 引用文档的名称。 **text** `string` | 文本内容 `response.output_item.done.item.content.text` 模型生成的文本内容。 模型思维链文本 `object` 模型生成的思维链文本。 **type** `string` | 类型 `response.output_item.done.item.content.type` 内容类型标识,用于区分 union 变体。 取值固定为 `reasoning_text`。 **annotations** `object[]` | 标注列表 `response.output_item.done.item.content.annotations` 思维链附带的标注信息列表。 网页引用 `object` 引用自互联网网页的标注信息。 **title** `string` | 标题 `response.output_item.done.item.content.annotations.title` 引用网页的标题。 **type** `string` | 类型 `response.output_item.done.item.content.annotations.type` 标注类型的判别字段(discriminator)。 取值固定为 `url_citation`。 **url** `string` | 网址 `response.output_item.done.item.content.annotations.url` 引用网页的 URL 地址。 **cover_image** `object` | 封面图 `response.output_item.done.item.content.annotations.cover_image` 网页封面图片信息。 **height** `integer` | 高度 `response.output_item.done.item.content.annotations.cover_image.height` 封面图片高度(像素) **url** `string` | 图片地址 `response.output_item.done.item.content.annotations.cover_image.url` 封面图片的 URL 地址。 **width** `integer` | 宽度 `response.output_item.done.item.content.annotations.cover_image.width` 封面图片宽度(像素) **freshness_info** `string` | 新鲜度 `response.output_item.done.item.content.annotations.freshness_info` 内容新鲜度信息。 **logo_url** `string` | Logo 地址 `response.output_item.done.item.content.annotations.logo_url` 网站 Logo 图标地址。 **mobile_url** `string` | 移动端地址 `response.output_item.done.item.content.annotations.mobile_url` 移动端访问地址。 **publish_time** `string` | 发布时间 `response.output_item.done.item.content.annotations.publish_time` 网页发布时间。 **site_name** `string` | 站点名 `response.output_item.done.item.content.annotations.site_name` 站点名称。 **summary** `string` | 摘要 `response.output_item.done.item.content.annotations.summary` 网页内容摘要。 文档引用 `object` 引用自私域知识库文档的标注信息。 **type** `string` | 类型 `response.output_item.done.item.content.annotations.type` 标注类型。 取值固定为 `doc_citation`。 **chunk_attachment** `object[]` | 分块附件 `response.output_item.done.item.content.annotations.chunk_attachment` 引用分块附带的附件信息列表。 **chunk_id** `integer` | 分块 ID `response.output_item.done.item.content.annotations.chunk_id` 引用文档分块的 ID。 **doc_id** `string` | 文档 ID `response.output_item.done.item.content.annotations.doc_id` 引用文档的 ID。 **doc_name** `string` | 文档名 `response.output_item.done.item.content.annotations.doc_name` 引用文档的名称。 **text** `string` | 文本内容 `response.output_item.done.item.content.text` 模型思维链文本内容。 **encrypted_content** `string` | 加密思维链 `response.output_item.done.item.encrypted_content` 思考内容加密原文。经加密及压缩处理后的思考内容原文。 相关文档: * [关键规则](/docs/agent-model-invocation-practice#key-rules) * [回传思考内容加密块使用示例](/docs/agent-model-invocation-practice#encrypted-thinking-block-examples) > **说明** > > 流式输出场景下,思考内容加密原文通过 `response.output_item.added`、`response.output_item.done`、`response.completed` 等相关事件下发,需要按事件中 `encrypted_content` 字段非空过滤获取。 **模型支持**: * `doubao-seed-2-0-lite-260428 及后续版本` **id** `string` | 条目 ID `response.output_item.done.item.id` 输出条目唯一标识。 语音转写输出 `object` 模型返回的语音转写输出。 **status** `string` | 状态 `response.output_item.done.item.status` 语音转写条目的当前状态。 * `completed`:转写已生成完毕。 * `in_progress`:转写正在生成中(流式场景)。 * `incomplete`:转写未完整生成(例如达到输出上限而截断)。 * `failed`:转写生成失败。 **type** `string` | 类型 `response.output_item.done.item.type` 输出条目类型标识。 取值固定为 `transcription`。 **id** `string` | 条目 ID `response.output_item.done.item.id` 输出条目唯一标识。 **transcription** `object[]` | 转写内容 `response.output_item.done.item.transcription` 语音转写结果片段列表。 **type** `string` | 类型 `response.output_item.done.item.transcription.type` 转写片段类型。 取值固定为 `transcription_text`。 **chunks** `object[]` | 音频小段 `response.output_item.done.item.transcription.chunks` 当前片段对应的音频小段列表。 **end_time** `integer` | 结束时间 `response.output_item.done.item.transcription.chunks.end_time` 片段结束时间(毫秒) **start_time** `integer` | 开始时间 `response.output_item.done.item.transcription.chunks.start_time` 片段开始时间(毫秒) **text** `string` | 文字内容 `response.output_item.done.item.transcription.chunks.text` 当前片段对应的文字内容。 **text** `string` | 转写文本 `response.output_item.done.item.transcription.text` 当前片段的转写文本。 网页搜索调用 `object` 模型发起的网页搜索调用记录。 **id** `string` | 条目 ID `response.output_item.done.item.id` 输出条目唯一标识。 **status** `string` | 状态 `response.output_item.done.item.status` 网页搜索调用的当前状态。可选值:`in_progress`、`searching`、`completed`、`incomplete`、`failed`。 **type** `string` | 类型 `response.output_item.done.item.type` 输出条目类型标识,用于区分 OutputItem 变体。 取值固定为 `web_search_call`。 **action** `object` | 搜索动作 `response.output_item.done.item.action` 描述模型执行的网页搜索动作,包括搜索类型与查询关键字。 **query** `string` | 查询语句 `response.output_item.done.item.action.query` 模型实际发起的搜索查询语句。 **type** `string` | 类型 `response.output_item.done.item.action.type` 网页搜索动作的类型标识。 取值固定为 `search`。 **queries** `string[]` | 查询语句列表 `response.output_item.done.item.action.queries` 本次网页搜索产生的查询语句列表。 图像处理调用 `object` 模型发起的图像处理调用记录。 **id** `string` | 条目 ID `response.output_item.done.item.id` 输出条目唯一标识。 **status** `string` | 状态 `response.output_item.done.item.status` 图像处理调用的当前状态。 * `completed`:图像处理已完成。 * `in_progress`:图像处理正在执行中。 * `incomplete`:图像处理未完整执行(例如被中断或截断)。 * `failed`:图像处理执行失败,具体原因见 `error` 字段。 **type** `string` | 类型 `response.output_item.done.item.type` 输出条目类型标识,用于区分 OutputItem 变体。 取值固定为 `image_process`。 **action** `object` | 处理动作 `response.output_item.done.item.action` 图像处理动作详情。 **type** `string` | 类型 `response.output_item.done.item.action.type` 图像处理动作类型。 **result_image_url** `string` | 结果图地址 `response.output_item.done.item.action.result_image_url` 处理后图像的 URL 地址。 **arguments** `object` | 处理参数 `response.output_item.done.item.arguments` 图像处理动作的输入参数,以键值对形式承载具体处理选项。 **error** `object` | 图像处理错误 `response.output_item.done.item.error` 图像处理失败时的错误信息。 **message** `string` | 错误描述 `response.output_item.done.item.error.message` 错误的可读描述。 MCP 审批请求 `object` MCP 工具调用前的审批请求记录。 **arguments** `string` | 调用参数 `response.output_item.done.item.arguments` 工具调用参数的 JSON 字符串。 **name** `string` | 工具名 `response.output_item.done.item.name` 待运行的工具名称。 **server_label** `string` | 服务标签 `response.output_item.done.item.server_label` 发起请求的 MCP Server 标签。 **type** `string` | 类型 `response.output_item.done.item.type` 输出项类型标识符,用于区分 OutputItem 的变体。 取值固定为 `mcp_approval_request`。 **id** `string` | 请求 ID `response.output_item.done.item.id` 审批请求的唯一 ID。 MCP 工具清单 `object` MCP Server 提供的工具清单输出。 **server_label** `string` | 服务标签 `response.output_item.done.item.server_label` MCP Server 标签。 **type** `string` | 类型 `response.output_item.done.item.type` 输出项类型标识。 取值固定为 `mcp_list_tools`。 **error** `string` | 错误信息 `response.output_item.done.item.error` 当 MCP Server 无法返回工具列表时的错误信息。 **id** `string` | 列表 ID `response.output_item.done.item.id` 工具列表的唯一 ID。 **tools** `object[]` | 工具列表 `response.output_item.done.item.tools` 该 MCP Server 上可用的工具列表。 **name** `string` | 工具名 `response.output_item.done.item.tools.name` 工具名称。 **annotations** `object` | 注解信息 `response.output_item.done.item.tools.annotations` 工具的附加注解信息。 **description** `string` | 工具描述 `response.output_item.done.item.tools.description` 工具的功能描述。 **input_schema** `object` | 入参 Schema `response.output_item.done.item.tools.input_schema` 描述工具入参的 JSON Schema。 MCP 工具调用 `object` 模型对 MCP 工具的实际调用记录及结果。 **name** `string` | 工具名 `response.output_item.done.item.name` 实际运行的工具名称。 **server_label** `string` | 服务标签 `response.output_item.done.item.server_label` 运行工具的 MCP Server 标签。 **type** `string` | 类型 `response.output_item.done.item.type` 标识该输出项为 MCP 工具调用记录。 取值固定为 `mcp_call`。 **arguments** `string` | 调用参数 `response.output_item.done.item.arguments` 传递给 MCP 工具的调用参数,格式为 JSON 字符串。 > **说明** > > 该字段通过 `response.mcp_call_arguments.delta` 事件流式追加,初始 `output_item.added` 事件可能不携带该字段。 **error** `string` | 错误信息 `response.output_item.done.item.error` 工具调用失败时的错误信息。 **id** `string` | 调用 ID `response.output_item.done.item.id` 工具调用的唯一 ID。 **output** `string` | 返回结果 `response.output_item.done.item.output` 工具调用的返回结果。 知识库检索调用 `object` 模型发起的私域知识库检索调用记录。 **knowledge_resource_id** `string` | 知识库 ID `response.output_item.done.item.knowledge_resource_id` 检索使用的知识库 ID。 **queries** `string[]` | 查询语句 `response.output_item.done.item.queries` 模型实际执行的检索查询语句。 **status** `string` | 状态 `response.output_item.done.item.status` 知识库检索调用的执行状态。可选值:`in_progress`、`searching`、`completed`、`failed`、`incomplete`。 **type** `string` | 类型 `response.output_item.done.item.type` 输出条目类型标识,用于区分不同类型的输出条目。 取值固定为 `knowledge_search_call`。 **id** `string` | 条目 ID `response.output_item.done.item.id` 输出条目唯一标识。 豆包应用调用 `object` 模型对豆包助手能力的调用记录。 **type** `string` | 类型 `response.output_item.done.item.type` 输出条目类型标识。 取值固定为 `doubao_app_call`。 **blocks** `object[]` | 内容块 `response.output_item.done.item.blocks` 豆包应用调用产出的内容块列表。 文本输出 `object` 豆包应用产出的文本输出内容块。 **type** `string` | 类型 `response.output_item.done.item.blocks.type` 内容块类型标识符。 取值固定为 `output_text`。 **id** `string` | 块 ID `response.output_item.done.item.blocks.id` 内容块的唯一标识。 **parent_id** `string` | 父级 ID `response.output_item.done.item.blocks.parent_id` 所属父级条目的 ID。 **status** `string` | 状态 `response.output_item.done.item.blocks.status` 内容块状态。 **text** `string` | 文本内容 `response.output_item.done.item.blocks.text` 思维链文本 `object` 豆包应用产出的思维链文本内容块。 **type** `string` | 类型 `response.output_item.done.item.blocks.type` 内容块类型标识符。 取值固定为 `reasoning_text`。 **id** `string` | 块 ID `response.output_item.done.item.blocks.id` 内容块的唯一标识。 **parent_id** `string` | 父级 ID `response.output_item.done.item.blocks.parent_id` 所属父级条目的 ID。 **reasoning_text** `string` | 思考文本 `response.output_item.done.item.blocks.reasoning_text` 思维链文本内容。 **status** `string` | 状态 `response.output_item.done.item.blocks.status` 内容块状态。 搜索过程 `object` 豆包应用 AI 搜索过程产出的内容块。 **type** `string` | 类型 `response.output_item.done.item.blocks.type` 内容块类型标识符。 取值固定为 `search`。 **id** `string` | 块 ID `response.output_item.done.item.blocks.id` 内容块的唯一标识。 **parent_id** `string` | 父级 ID `response.output_item.done.item.blocks.parent_id` 所属父级条目的 ID。 **queries** `string[]` | 查询语句 `response.output_item.done.item.blocks.queries` 搜索查询语句列表。 **results** `object[]` | 搜索结果 `response.output_item.done.item.blocks.results` 搜索结果列表。 **text_card** `object` | 文本卡片 `response.output_item.done.item.blocks.results.text_card` 文本卡片形式的搜索结果。 **sitename** `string` | 站点名 `response.output_item.done.item.blocks.results.text_card.sitename` 来源站点名称。 **title** `string` | 标题 `response.output_item.done.item.blocks.results.text_card.title` 搜索结果标题。 **url** `string` | 网址 `response.output_item.done.item.blocks.results.text_card.url` 搜索结果 URL 地址。 **status** `string` | 状态 `response.output_item.done.item.blocks.status` 内容块状态。 **summary** `string` | 搜索总结 `response.output_item.done.item.blocks.summary` AI 搜索过程中对本轮搜索结果的总结性文字,概括从搜索结果中提取的核心信息。 推理搜索过程 `object` 豆包应用推理搜索过程产出的内容块。 **type** `string` | 类型 `response.output_item.done.item.blocks.type` 内容块类型。 取值固定为 `reasoning_search`。 **id** `string` | 块 ID `response.output_item.done.item.blocks.id` 内容块的唯一标识。 **parent_id** `string` | 父级 ID `response.output_item.done.item.blocks.parent_id` 所属父级条目的 ID。 **queries** `string[]` | 查询语句 `response.output_item.done.item.blocks.queries` 搜索查询语句列表。 **results** `object[]` | 搜索结果 `response.output_item.done.item.blocks.results` 搜索结果列表。 **text_card** `object` | 文本卡片 `response.output_item.done.item.blocks.results.text_card` 文本卡片形式的搜索结果。 **sitename** `string` | 站点名 `response.output_item.done.item.blocks.results.text_card.sitename` 来源站点名称。 **title** `string` | 标题 `response.output_item.done.item.blocks.results.text_card.title` 搜索结果标题。 **url** `string` | 网址 `response.output_item.done.item.blocks.results.text_card.url` 搜索结果 URL 地址。 **status** `string` | 状态 `response.output_item.done.item.blocks.status` 推理搜索内容块的处理状态。可选值:`in_progress`、`searching`、`completed`、`incomplete`、`failed`。 **summary** `string` | 搜索总结 `response.output_item.done.item.blocks.summary` 推理搜索过程中对本轮搜索结果的总结性文字,概括从搜索结果中提取的核心信息。 **feature** `string` | 功能名 `response.output_item.done.item.feature` 本次调用触发的豆包子功能名称。可选值:`chat`、`deep_chat`、`ai_search`、`reasoning_search`。 **id** `string` | 条目 ID `response.output_item.done.item.id` 输出条目唯一标识。 **status** `string` | 状态 `response.output_item.done.item.status` 输出状态。可选值:`completed`、`failed`、`in_progress`、`incomplete`。 智能体工具调用 `object` 模型发起的智能体工具调用记录。 **name** `string` | 工具名 `response.output_item.done.item.name` 被调用的智能体工具名称。 **status** `string` | 状态 `response.output_item.done.item.status` 智能体工具调用的执行状态。可选值:`completed`、`failed`、`in_progress`、`incomplete`。 **type** `string` | 类型 `response.output_item.done.item.type` 输出条目类型标识符,用于区分 OutputItem 的 variant。 取值固定为 `agent_tool_call`。 **id** `string` | 条目 ID `response.output_item.done.item.id` 输出条目唯一标识。 **output_index** `integer` | 输出项索引 `response.output_item.done.output_index` 已完成的输出项的索引。 **sequence_number** `integer` | 序列号 `response.output_item.done.sequence_number` 事件的序列号。 **type** `string` | 事件类型 `response.output_item.done.type` 事件的类型,总是 `response.output_item.done` ## 文本回答 ### response.content_part.added > 当有新的内容部分被添加时触发。 **content_index** `integer` | 内容块索引 `response.content_part.added.content_index` 内容部分的索引。 **item_id** `string` | 输出项 ID `response.content_part.added.item_id` 内容部分所添加的输出项的 ID。 **output_index** `integer` | 输出项索引 `response.content_part.added.output_index` 内容部分所添加的输出项的索引。 **part** `object` | 内容部分 `response.content_part.added.part` 所添加的内容部分。 模型回答文本 `object` 模型生成的最终回答文本。 **type** `string` | 类型 `response.content_part.added.part.type` 内容类型判别字段,用于区分 union 变体。 取值固定为 `output_text`。 **annotations** `object[]` | 标注列表 `response.content_part.added.part.annotations` 文本附带的标注信息列表(如引用来源等) 网页引用 `object` 引用自互联网网页的标注信息。 **title** `string` | 标题 `response.content_part.added.part.annotations.title` 引用网页的标题。 **type** `string` | 类型 `response.content_part.added.part.annotations.type` 标注类型的判别字段(discriminator)。 取值固定为 `url_citation`。 **url** `string` | 网址 `response.content_part.added.part.annotations.url` 引用网页的 URL 地址。 **cover_image** `object` | 封面图 `response.content_part.added.part.annotations.cover_image` 网页封面图片信息。 **height** `integer` | 高度 `response.content_part.added.part.annotations.cover_image.height` 封面图片高度(像素) **url** `string` | 图片地址 `response.content_part.added.part.annotations.cover_image.url` 封面图片的 URL 地址。 **width** `integer` | 宽度 `response.content_part.added.part.annotations.cover_image.width` 封面图片宽度(像素) **freshness_info** `string` | 新鲜度 `response.content_part.added.part.annotations.freshness_info` 内容新鲜度信息。 **logo_url** `string` | Logo 地址 `response.content_part.added.part.annotations.logo_url` 网站 Logo 图标地址。 **mobile_url** `string` | 移动端地址 `response.content_part.added.part.annotations.mobile_url` 移动端访问地址。 **publish_time** `string` | 发布时间 `response.content_part.added.part.annotations.publish_time` 网页发布时间。 **site_name** `string` | 站点名 `response.content_part.added.part.annotations.site_name` 站点名称。 **summary** `string` | 摘要 `response.content_part.added.part.annotations.summary` 网页内容摘要。 文档引用 `object` 引用自私域知识库文档的标注信息。 **type** `string` | 类型 `response.content_part.added.part.annotations.type` 标注类型。 取值固定为 `doc_citation`。 **chunk_attachment** `object[]` | 分块附件 `response.content_part.added.part.annotations.chunk_attachment` 引用分块附带的附件信息列表。 **chunk_id** `integer` | 分块 ID `response.content_part.added.part.annotations.chunk_id` 引用文档分块的 ID。 **doc_id** `string` | 文档 ID `response.content_part.added.part.annotations.doc_id` 引用文档的 ID。 **doc_name** `string` | 文档名 `response.content_part.added.part.annotations.doc_name` 引用文档的名称。 **text** `string` | 文本内容 `response.content_part.added.part.text` 模型生成的文本内容。 模型思维链文本 `object` 模型生成的思维链文本。 **type** `string` | 类型 `response.content_part.added.part.type` 内容类型标识,用于区分 union 变体。 取值固定为 `reasoning_text`。 **annotations** `object[]` | 标注列表 `response.content_part.added.part.annotations` 思维链附带的标注信息列表。 网页引用 `object` 引用自互联网网页的标注信息。 **title** `string` | 标题 `response.content_part.added.part.annotations.title` 引用网页的标题。 **type** `string` | 类型 `response.content_part.added.part.annotations.type` 标注类型的判别字段(discriminator)。 取值固定为 `url_citation`。 **url** `string` | 网址 `response.content_part.added.part.annotations.url` 引用网页的 URL 地址。 **cover_image** `object` | 封面图 `response.content_part.added.part.annotations.cover_image` 网页封面图片信息。 **height** `integer` | 高度 `response.content_part.added.part.annotations.cover_image.height` 封面图片高度(像素) **url** `string` | 图片地址 `response.content_part.added.part.annotations.cover_image.url` 封面图片的 URL 地址。 **width** `integer` | 宽度 `response.content_part.added.part.annotations.cover_image.width` 封面图片宽度(像素) **freshness_info** `string` | 新鲜度 `response.content_part.added.part.annotations.freshness_info` 内容新鲜度信息。 **logo_url** `string` | Logo 地址 `response.content_part.added.part.annotations.logo_url` 网站 Logo 图标地址。 **mobile_url** `string` | 移动端地址 `response.content_part.added.part.annotations.mobile_url` 移动端访问地址。 **publish_time** `string` | 发布时间 `response.content_part.added.part.annotations.publish_time` 网页发布时间。 **site_name** `string` | 站点名 `response.content_part.added.part.annotations.site_name` 站点名称。 **summary** `string` | 摘要 `response.content_part.added.part.annotations.summary` 网页内容摘要。 文档引用 `object` 引用自私域知识库文档的标注信息。 **type** `string` | 类型 `response.content_part.added.part.annotations.type` 标注类型。 取值固定为 `doc_citation`。 **chunk_attachment** `object[]` | 分块附件 `response.content_part.added.part.annotations.chunk_attachment` 引用分块附带的附件信息列表。 **chunk_id** `integer` | 分块 ID `response.content_part.added.part.annotations.chunk_id` 引用文档分块的 ID。 **doc_id** `string` | 文档 ID `response.content_part.added.part.annotations.doc_id` 引用文档的 ID。 **doc_name** `string` | 文档名 `response.content_part.added.part.annotations.doc_name` 引用文档的名称。 **text** `string` | 文本内容 `response.content_part.added.part.text` 模型思维链文本内容。 **sequence_number** `integer` | 序列号 `response.content_part.added.sequence_number` 事件的序列号。 **type** `string` | 事件类型 `response.content_part.added.type` 事件的类型,总是 `response.content_part.added` ### response.content_part.done > 当内容完成时触发。 **content_index** `integer` | 内容块索引 `response.content_part.done.content_index` 内容部分的索引。 **item_id** `string` | 输出项 ID `response.content_part.done.item_id` 内容部分所添加的输出项的 ID。 **output_index** `integer` | 输出项索引 `response.content_part.done.output_index` 内容部分所添加的输出项的索引。 **part** `object` | 内容部分 `response.content_part.done.part` 所完成的内容部分。 模型回答文本 `object` 模型生成的最终回答文本。 **type** `string` | 类型 `response.content_part.done.part.type` 内容类型判别字段,用于区分 union 变体。 取值固定为 `output_text`。 **annotations** `object[]` | 标注列表 `response.content_part.done.part.annotations` 文本附带的标注信息列表(如引用来源等) 网页引用 `object` 引用自互联网网页的标注信息。 **title** `string` | 标题 `response.content_part.done.part.annotations.title` 引用网页的标题。 **type** `string` | 类型 `response.content_part.done.part.annotations.type` 标注类型的判别字段(discriminator)。 取值固定为 `url_citation`。 **url** `string` | 网址 `response.content_part.done.part.annotations.url` 引用网页的 URL 地址。 **cover_image** `object` | 封面图 `response.content_part.done.part.annotations.cover_image` 网页封面图片信息。 **height** `integer` | 高度 `response.content_part.done.part.annotations.cover_image.height` 封面图片高度(像素) **url** `string` | 图片地址 `response.content_part.done.part.annotations.cover_image.url` 封面图片的 URL 地址。 **width** `integer` | 宽度 `response.content_part.done.part.annotations.cover_image.width` 封面图片宽度(像素) **freshness_info** `string` | 新鲜度 `response.content_part.done.part.annotations.freshness_info` 内容新鲜度信息。 **logo_url** `string` | Logo 地址 `response.content_part.done.part.annotations.logo_url` 网站 Logo 图标地址。 **mobile_url** `string` | 移动端地址 `response.content_part.done.part.annotations.mobile_url` 移动端访问地址。 **publish_time** `string` | 发布时间 `response.content_part.done.part.annotations.publish_time` 网页发布时间。 **site_name** `string` | 站点名 `response.content_part.done.part.annotations.site_name` 站点名称。 **summary** `string` | 摘要 `response.content_part.done.part.annotations.summary` 网页内容摘要。 文档引用 `object` 引用自私域知识库文档的标注信息。 **type** `string` | 类型 `response.content_part.done.part.annotations.type` 标注类型。 取值固定为 `doc_citation`。 **chunk_attachment** `object[]` | 分块附件 `response.content_part.done.part.annotations.chunk_attachment` 引用分块附带的附件信息列表。 **chunk_id** `integer` | 分块 ID `response.content_part.done.part.annotations.chunk_id` 引用文档分块的 ID。 **doc_id** `string` | 文档 ID `response.content_part.done.part.annotations.doc_id` 引用文档的 ID。 **doc_name** `string` | 文档名 `response.content_part.done.part.annotations.doc_name` 引用文档的名称。 **text** `string` | 文本内容 `response.content_part.done.part.text` 模型生成的文本内容。 模型思维链文本 `object` 模型生成的思维链文本。 **type** `string` | 类型 `response.content_part.done.part.type` 内容类型标识,用于区分 union 变体。 取值固定为 `reasoning_text`。 **annotations** `object[]` | 标注列表 `response.content_part.done.part.annotations` 思维链附带的标注信息列表。 网页引用 `object` 引用自互联网网页的标注信息。 **title** `string` | 标题 `response.content_part.done.part.annotations.title` 引用网页的标题。 **type** `string` | 类型 `response.content_part.done.part.annotations.type` 标注类型的判别字段(discriminator)。 取值固定为 `url_citation`。 **url** `string` | 网址 `response.content_part.done.part.annotations.url` 引用网页的 URL 地址。 **cover_image** `object` | 封面图 `response.content_part.done.part.annotations.cover_image` 网页封面图片信息。 **height** `integer` | 高度 `response.content_part.done.part.annotations.cover_image.height` 封面图片高度(像素) **url** `string` | 图片地址 `response.content_part.done.part.annotations.cover_image.url` 封面图片的 URL 地址。 **width** `integer` | 宽度 `response.content_part.done.part.annotations.cover_image.width` 封面图片宽度(像素) **freshness_info** `string` | 新鲜度 `response.content_part.done.part.annotations.freshness_info` 内容新鲜度信息。 **logo_url** `string` | Logo 地址 `response.content_part.done.part.annotations.logo_url` 网站 Logo 图标地址。 **mobile_url** `string` | 移动端地址 `response.content_part.done.part.annotations.mobile_url` 移动端访问地址。 **publish_time** `string` | 发布时间 `response.content_part.done.part.annotations.publish_time` 网页发布时间。 **site_name** `string` | 站点名 `response.content_part.done.part.annotations.site_name` 站点名称。 **summary** `string` | 摘要 `response.content_part.done.part.annotations.summary` 网页内容摘要。 文档引用 `object` 引用自私域知识库文档的标注信息。 **type** `string` | 类型 `response.content_part.done.part.annotations.type` 标注类型。 取值固定为 `doc_citation`。 **chunk_attachment** `object[]` | 分块附件 `response.content_part.done.part.annotations.chunk_attachment` 引用分块附带的附件信息列表。 **chunk_id** `integer` | 分块 ID `response.content_part.done.part.annotations.chunk_id` 引用文档分块的 ID。 **doc_id** `string` | 文档 ID `response.content_part.done.part.annotations.doc_id` 引用文档的 ID。 **doc_name** `string` | 文档名 `response.content_part.done.part.annotations.doc_name` 引用文档的名称。 **text** `string` | 文本内容 `response.content_part.done.part.text` 模型思维链文本内容。 **sequence_number** `integer` | 序列号 `response.content_part.done.sequence_number` 事件的序列号。 **type** `string` | 事件类型 `response.content_part.done.type` 事件的类型,总是 `response.content_part.done` ### response.output_text.delta > 当有新增文本片段时触发。 **content_index** `integer` | 内容块索引 `response.output_text.delta.content_index` 增量文本所属内容块的索引。 **item_id** `string` | 输出项 ID `response.output_text.delta.item_id` 增量文本所属输出项的唯一 ID。 **output_index** `integer` | 输出项索引 `response.output_text.delta.output_index` 增量文本所属输出项的列表索引。 **sequence_number** `integer` | 序列号 `response.output_text.delta.sequence_number` 事件的序列号。 **type** `string` | 事件类型 `response.output_text.delta.type` 事件的类型,总是 `response.output_text.delta` **delta** `string` | 文本增量 `response.output_text.delta.delta` 新增的文本片段内容。 ### response.output_text.done > 文本内容完成时触发。 **content_index** `integer` | 内容块索引 `response.output_text.done.content_index` 文本内容所属内容块的索引。 **item_id** `string` | 输出项 ID `response.output_text.done.item_id` 文本内容所属输出项的唯一 ID。 **output_index** `integer` | 输出项索引 `response.output_text.done.output_index` 文本内容所属输出项的列表索引。 **sequence_number** `integer` | 序列号 `response.output_text.done.sequence_number` 事件的序列号。 **type** `string` | 事件类型 `response.output_text.done.type` 事件的类型,总是 `response.output_text.done` **text** `string` | 完成文本 `response.output_text.done.text` 完成的文本内容。 ### response.output_text.annotation.added > 当输出文本中有新的注解被添加时触发的事件。 **annotation** `object` | 注解内容 `response.output_text.annotation.added.annotation` 所添加的注解信息。 网页引用 `object` 引用自互联网网页的标注信息。 **title** `string` | 标题 `response.output_text.annotation.added.annotation.title` 引用网页的标题。 **type** `string` | 类型 `response.output_text.annotation.added.annotation.type` 标注类型的判别字段(discriminator)。 取值固定为 `url_citation`。 **url** `string` | 网址 `response.output_text.annotation.added.annotation.url` 引用网页的 URL 地址。 **cover_image** `object` | 封面图 `response.output_text.annotation.added.annotation.cover_image` 网页封面图片信息。 **height** `integer` | 高度 `response.output_text.annotation.added.annotation.cover_image.height` 封面图片高度(像素) **url** `string` | 图片地址 `response.output_text.annotation.added.annotation.cover_image.url` 封面图片的 URL 地址。 **width** `integer` | 宽度 `response.output_text.annotation.added.annotation.cover_image.width` 封面图片宽度(像素) **freshness_info** `string` | 新鲜度 `response.output_text.annotation.added.annotation.freshness_info` 内容新鲜度信息。 **logo_url** `string` | Logo 地址 `response.output_text.annotation.added.annotation.logo_url` 网站 Logo 图标地址。 **mobile_url** `string` | 移动端地址 `response.output_text.annotation.added.annotation.mobile_url` 移动端访问地址。 **publish_time** `string` | 发布时间 `response.output_text.annotation.added.annotation.publish_time` 网页发布时间。 **site_name** `string` | 站点名 `response.output_text.annotation.added.annotation.site_name` 站点名称。 **summary** `string` | 摘要 `response.output_text.annotation.added.annotation.summary` 网页内容摘要。 文档引用 `object` 引用自私域知识库文档的标注信息。 **type** `string` | 类型 `response.output_text.annotation.added.annotation.type` 标注类型。 取值固定为 `doc_citation`。 **chunk_attachment** `object[]` | 分块附件 `response.output_text.annotation.added.annotation.chunk_attachment` 引用分块附带的附件信息列表。 **chunk_id** `integer` | 分块 ID `response.output_text.annotation.added.annotation.chunk_id` 引用文档分块的 ID。 **doc_id** `string` | 文档 ID `response.output_text.annotation.added.annotation.doc_id` 引用文档的 ID。 **doc_name** `string` | 文档名 `response.output_text.annotation.added.annotation.doc_name` 引用文档的名称。 **content_index** `integer` | 内容块索引 `response.output_text.annotation.added.content_index` 注解所属内容块的索引。 **item_id** `string` | 输出项 ID `response.output_text.annotation.added.item_id` 注解所属输出项的唯一 ID。 **output_index** `integer` | 输出项索引 `response.output_text.annotation.added.output_index` 注解所属输出项的列表索引。 **sequence_number** `integer` | 序列号 `response.output_text.annotation.added.sequence_number` 事件的序列号。 **type** `string` | 事件类型 `response.output_text.annotation.added.type` 事件的类型,总是 `response.output_text.annotation.added` **annotation_index** `integer` | 注解索引 `response.output_text.annotation.added.annotation_index` 注解在内容块注解列表中的索引。 ## 思维链 ### response.reasoning_raw_text.delta > 当原始思维链文本片段新增时触发的事件。 **content_index** `integer` | 内容块索引 `response.reasoning_raw_text.delta.content_index` 原始推理文本片段所属内容块的索引。 **item_id** `string` | 输出项 ID `response.reasoning_raw_text.delta.item_id` 原始推理文本片段所属输出项的唯一 ID。 **output_index** `integer` | 输出项索引 `response.reasoning_raw_text.delta.output_index` 原始推理文本片段所属输出项的列表索引。 **sequence_number** `integer` | 序列号 `response.reasoning_raw_text.delta.sequence_number` 事件的序列号。 **type** `string` | 事件类型 `response.reasoning_raw_text.delta.type` 事件的类型,总是 `response.reasoning_raw_text.delta` **delta** `string` | 原始推理增量 `response.reasoning_raw_text.delta.delta` 本次新增的原始推理文本片段。 ### response.reasoning_raw_text.done > 当原始思维链文本内容完成时触发的事件。 **content_index** `integer` | 内容块索引 `response.reasoning_raw_text.done.content_index` 原始推理文本所属内容块的索引。 **item_id** `string` | 输出项 ID `response.reasoning_raw_text.done.item_id` 原始推理文本所属输出项的唯一 ID。 **output_index** `integer` | 输出项索引 `response.reasoning_raw_text.done.output_index` 原始推理文本所属输出项的列表索引。 **sequence_number** `integer` | 序列号 `response.reasoning_raw_text.done.sequence_number` 事件的序列号。 **type** `string` | 事件类型 `response.reasoning_raw_text.done.type` 事件的类型,总是 `response.reasoning_raw_text.done` **text** `string` | 原始推理文本 `response.reasoning_raw_text.done.text` 完整的原始推理文本内容。 ### response.reasoning_summary_part.added > 当存在思维链新增部分时触发。 **item_id** `string` | 输出项 ID `response.reasoning_summary_part.added.item_id` 所属输出项的 ID。 **output_index** `integer` | 输出项索引 `response.reasoning_summary_part.added.output_index` 所属输出项的索引。 **part** `object` | 摘要内容 `response.reasoning_summary_part.added.part` 所添加的内容部分。 **type** `string` | 类型 `response.reasoning_summary_part.added.part.type` 摘要片段类型标识。 取值固定为 `summary_text`。 **text** `string` | 摘要文本 `response.reasoning_summary_part.added.part.text` 思维链摘要文本内容。 **sequence_number** `integer` | 序列号 `response.reasoning_summary_part.added.sequence_number` 事件的序列号。 **summary_index** `integer` | 摘要索引 `response.reasoning_summary_part.added.summary_index` 输出项内推理总结部分的子索引。 **type** `string` | 事件类型 `response.reasoning_summary_part.added.type` 事件的类型,总是 `response.reasoning_summary_part.added` ### response.reasoning_summary_part.done > 当思维链部分完成时触发。 **item_id** `string` | 输出项 ID `response.reasoning_summary_part.done.item_id` 所属输出项的 ID。 **output_index** `integer` | 输出项索引 `response.reasoning_summary_part.done.output_index` 所属输出项的索引。 **part** `object` | 摘要内容 `response.reasoning_summary_part.done.part` 所完成的内容部分。 **type** `string` | 类型 `response.reasoning_summary_part.done.part.type` 摘要片段类型标识。 取值固定为 `summary_text`。 **text** `string` | 摘要文本 `response.reasoning_summary_part.done.part.text` 思维链摘要文本内容。 **sequence_number** `integer` | 序列号 `response.reasoning_summary_part.done.sequence_number` 事件的序列号。 **summary_index** `integer` | 摘要索引 `response.reasoning_summary_part.done.summary_index` 输出项内推理总结部分的子索引。 **type** `string` | 事件类型 `response.reasoning_summary_part.done.type` 事件的类型,总是 `response.reasoning_summary_part.done` ### response.reasoning_summary_text.delta > 当存在思维链新增文本时触发。 **item_id** `string` | 输出项 ID `response.reasoning_summary_text.delta.item_id` 所属输出项的 ID。 **output_index** `integer` | 输出项索引 `response.reasoning_summary_text.delta.output_index` 所属输出项的索引。 **sequence_number** `integer` | 序列号 `response.reasoning_summary_text.delta.sequence_number` 事件的序列号。 **summary_index** `integer` | 摘要索引 `response.reasoning_summary_text.delta.summary_index` 输出项内推理总结部分的子索引。 **type** `string` | 事件类型 `response.reasoning_summary_text.delta.type` 事件的类型,总是 `response.reasoning_summary_text.delta` **delta** `string` | 摘要增量 `response.reasoning_summary_text.delta.delta` 输出的思维链文本增量片段。 ### response.reasoning_summary_text.done > 思维链文本完成时触发。 **item_id** `string` | 输出项 ID `response.reasoning_summary_text.done.item_id` 所属输出项的 ID。 **output_index** `integer` | 输出项索引 `response.reasoning_summary_text.done.output_index` 所属输出项的索引。 **sequence_number** `integer` | 序列号 `response.reasoning_summary_text.done.sequence_number` 事件的序列号。 **summary_index** `integer` | 摘要索引 `response.reasoning_summary_text.done.summary_index` 输出项内推理总结部分的子索引。 **type** `string` | 事件类型 `response.reasoning_summary_text.done.type` 事件的类型,总是 `response.reasoning_summary_text.done` **text** `string` | 摘要文本 `response.reasoning_summary_text.done.text` 思维链文本完整内容。 ### response.reasoning_text.delta > 当推理文本片段新增时触发的事件。 **content_index** `integer` | 内容块索引 `response.reasoning_text.delta.content_index` 推理文本片段所属内容块的索引。 **item_id** `string` | 输出项 ID `response.reasoning_text.delta.item_id` 推理文本片段所属输出项的唯一 ID。 **output_index** `integer` | 输出项索引 `response.reasoning_text.delta.output_index` 推理文本片段所属输出项的列表索引。 **sequence_number** `integer` | 序列号 `response.reasoning_text.delta.sequence_number` 事件的序列号。 **type** `string` | 事件类型 `response.reasoning_text.delta.type` 事件的类型,总是 `response.reasoning_text.delta` **delta** `string` | 推理增量 `response.reasoning_text.delta.delta` 本次新增的推理文本片段。 ### response.reasoning_text.done > 当推理文本内容完成时触发的事件。 **content_index** `integer` | 内容块索引 `response.reasoning_text.done.content_index` 推理文本所属内容块的索引。 **item_id** `string` | 输出项 ID `response.reasoning_text.done.item_id` 推理文本所属输出项的唯一 ID。 **output_index** `integer` | 输出项索引 `response.reasoning_text.done.output_index` 推理文本所属输出项的列表索引。 **sequence_number** `integer` | 序列号 `response.reasoning_text.done.sequence_number` 事件的序列号。 **type** `string` | 事件类型 `response.reasoning_text.done.type` 事件的类型,总是 `response.reasoning_text.done` **text** `string` | 推理文本 `response.reasoning_text.done.text` 完整的推理文本内容。 --- # 工具调用事件 Source: https://ark.volcengine.com/region:cn-beijing/docs/streaming-responses-tools 函数调用、Web 搜索、图片处理、MCP、Knowledge 搜索及豆包应用调用相关的流式事件。 ## 工具调用(通用) ### response.agent_tool_call.in_progress > 当 Agent 工具调用进行中时触发的事件。 **item_id** `string` | 调用项 ID `response.agent_tool_call.in_progress.item_id` 正在处理的 Agent 工具调用项的 ID。 **name** `string` | 工具名称 `response.agent_tool_call.in_progress.name` Agent 工具的名称。 **output_index** `integer` | 输出项索引 `response.agent_tool_call.in_progress.output_index` 所属输出项的索引。 **sequence_number** `integer` | 序列号 `response.agent_tool_call.in_progress.sequence_number` 事件的序列号。 **type** `string` | 事件类型 `response.agent_tool_call.in_progress.type` 事件的类型,总是 `response.agent_tool_call.in_progress` ### response.agent_tool_call.completed > 当 Agent 工具调用完成时触发的事件。 **item_id** `string` | 调用项 ID `response.agent_tool_call.completed.item_id` 已完成的 Agent 工具调用项的 ID。 **name** `string` | 工具名称 `response.agent_tool_call.completed.name` Agent 工具的名称。 **output_index** `integer` | 输出项索引 `response.agent_tool_call.completed.output_index` 所属输出项的索引。 **sequence_number** `integer` | 序列号 `response.agent_tool_call.completed.sequence_number` 事件的序列号。 **type** `string` | 事件类型 `response.agent_tool_call.completed.type` 事件的类型,总是 `response.agent_tool_call.completed` ### response.function_call_arguments.delta > 存在函数调用参数片段时触发。 **item_id** `string` | 输出项 ID `response.function_call_arguments.delta.item_id` 所属输出项的唯一 ID。 **output_index** `integer` | 输出项索引 `response.function_call_arguments.delta.output_index` 所属输出项的列表索引。 **sequence_number** `integer` | 序列号 `response.function_call_arguments.delta.sequence_number` 事件的序列号。 **type** `string` | 事件类型 `response.function_call_arguments.delta.type` 事件的类型,总是 `response.function_call_arguments.delta` **delta** `string` | 参数增量 `response.function_call_arguments.delta.delta` 本次新增的函数调用参数增量片段。 ### response.function_call_arguments.done > 当函数调用参数完成时触发。 **item_id** `string` | 输出项 ID `response.function_call_arguments.done.item_id` 所属输出项的唯一 ID。 **output_index** `integer` | 输出项索引 `response.function_call_arguments.done.output_index` 所属输出项的列表索引。 **sequence_number** `integer` | 序列号 `response.function_call_arguments.done.sequence_number` 事件的序列号。 **type** `string` | 事件类型 `response.function_call_arguments.done.type` 事件的类型,总是 `response.function_call_arguments.done` **arguments** `string` | 函数参数 `response.function_call_arguments.done.arguments` 函数调用的完整参数。 ## 工具调用(web_search) ### response.web_search_call.in_progress > 当联网搜索工具调用进行中时触发的事件。 **item_id** `string` | 调用项 ID `response.web_search_call.in_progress.item_id` 本事件关联的调用项的 ID。 **output_index** `integer` | 输出项索引 `response.web_search_call.in_progress.output_index` 本事件关联的输出项的索引。 **sequence_number** `integer` | 序列号 `response.web_search_call.in_progress.sequence_number` 事件的序列号。 **type** `string` | 事件类型 `response.web_search_call.in_progress.type` 事件的类型,总是 `response.web_search_call.in_progress` ### response.web_search_call.searching > 当联网搜索工具正在执行搜索时触发的事件。 **item_id** `string` | 调用项 ID `response.web_search_call.searching.item_id` 本事件关联的调用项的 ID。 **output_index** `integer` | 输出项索引 `response.web_search_call.searching.output_index` 本事件关联的输出项的索引。 **sequence_number** `integer` | 序列号 `response.web_search_call.searching.sequence_number` 事件的序列号。 **type** `string` | 事件类型 `response.web_search_call.searching.type` 事件的类型,总是 `response.web_search_call.searching` ### response.web_search_call.completed > 当联网搜索工具调用完成时触发的事件。 **item_id** `string` | 调用项 ID `response.web_search_call.completed.item_id` 本事件关联的调用项的 ID。 **output_index** `integer` | 输出项索引 `response.web_search_call.completed.output_index` 本事件关联的输出项的索引。 **sequence_number** `integer` | 序列号 `response.web_search_call.completed.sequence_number` 事件的序列号。 **type** `string` | 事件类型 `response.web_search_call.completed.type` 事件的类型,总是 `response.web_search_call.completed` ## 工具调用(knowledge_search) ### response.knowledge_search_call.in_progress > 当知识库检索工具调用进行中时触发的事件。 **item_id** `string` | 调用项 ID `response.knowledge_search_call.in_progress.item_id` 正在处理的知识库检索调用项的 ID。 **output_index** `integer` | 输出项索引 `response.knowledge_search_call.in_progress.output_index` 正在处理的输出项的索引。 **sequence_number** `integer` | 序列号 `response.knowledge_search_call.in_progress.sequence_number` 事件的序列号。 **type** `string` | 事件类型 `response.knowledge_search_call.in_progress.type` 事件的类型,总是 `response.knowledge_search_call.in_progress` ### response.knowledge_search_call.searching > 当知识库检索工具正在执行检索时触发的事件。 **item_id** `string` | 调用项 ID `response.knowledge_search_call.searching.item_id` 正在执行检索的知识库检索调用项的 ID。 **output_index** `integer` | 输出项索引 `response.knowledge_search_call.searching.output_index` 正在执行检索的输出项的索引。 **sequence_number** `integer` | 序列号 `response.knowledge_search_call.searching.sequence_number` 事件的序列号。 **type** `string` | 事件类型 `response.knowledge_search_call.searching.type` 事件的类型,总是 `response.knowledge_search_call.searching` ### response.knowledge_search_call.completed > 当知识库检索工具调用完成时触发的事件。 **item_id** `string` | 调用项 ID `response.knowledge_search_call.completed.item_id` 已完成的知识库检索调用项的 ID。 **output_index** `integer` | 输出项索引 `response.knowledge_search_call.completed.output_index` 已完成的输出项的索引。 **sequence_number** `integer` | 序列号 `response.knowledge_search_call.completed.sequence_number` 事件的序列号。 **type** `string` | 事件类型 `response.knowledge_search_call.completed.type` 事件的类型,总是 `response.knowledge_search_call.completed` ### response.knowledge_search_call.failed > 当知识库检索工具调用失败时触发的事件。 **item_id** `string` | 调用项 ID `response.knowledge_search_call.failed.item_id` 失败的知识库检索调用项的 ID。 **output_index** `integer` | 输出项索引 `response.knowledge_search_call.failed.output_index` 失败的输出项的索引。 **sequence_number** `integer` | 序列号 `response.knowledge_search_call.failed.sequence_number` 事件的序列号。 **type** `string` | 事件类型 `response.knowledge_search_call.failed.type` 事件的类型,总是 `response.knowledge_search_call.failed` ## 工具调用(image_process) ### response.image_process_call.in_progress > 当图像处理工具调用进行中时触发的事件。 **item_id** `string` | 调用项 ID `response.image_process_call.in_progress.item_id` 本事件关联的调用项的 ID。 **output_index** `integer` | 输出项索引 `response.image_process_call.in_progress.output_index` 本事件关联的输出项的索引。 **sequence_number** `integer` | 序列号 `response.image_process_call.in_progress.sequence_number` 事件的序列号。 **type** `string` | 事件类型 `response.image_process_call.in_progress.type` 事件的类型,总是 `response.image_process_call.in_progress` ### response.image_process_call.progressing > 当图像处理工具正在处理图像时触发的事件。 **action** `object` | 处理动作 `response.image_process_call.progressing.action` 正在执行的图像处理动作信息。 **type** `string` | 类型 `response.image_process_call.progressing.action.type` 图像处理动作类型。 **result_image_url** `string` | 结果图地址 `response.image_process_call.progressing.action.result_image_url` 处理后图像的 URL 地址。 **arguments** `object` | 处理参数 `response.image_process_call.progressing.arguments` 图像处理动作的输入参数。 **item_id** `string` | 调用项 ID `response.image_process_call.progressing.item_id` 本事件关联的调用项的 ID。 **output_index** `integer` | 输出项索引 `response.image_process_call.progressing.output_index` 本事件关联的输出项的索引。 **sequence_number** `integer` | 序列号 `response.image_process_call.progressing.sequence_number` 事件的序列号。 **type** `string` | 事件类型 `response.image_process_call.progressing.type` 事件的类型,总是 `response.image_process_call.progressing` ### response.image_process_call.completed > 当图像处理工具调用完成时触发的事件。 **action** `object` | 处理动作 `response.image_process_call.completed.action` 已完成的图像处理动作信息。 **type** `string` | 类型 `response.image_process_call.completed.action.type` 图像处理动作类型。 **result_image_url** `string` | 结果图地址 `response.image_process_call.completed.action.result_image_url` 处理后图像的 URL 地址。 **arguments** `object` | 处理参数 `response.image_process_call.completed.arguments` 图像处理动作的输入参数。 **item_id** `string` | 调用项 ID `response.image_process_call.completed.item_id` 本事件关联的调用项的 ID。 **output_index** `integer` | 输出项索引 `response.image_process_call.completed.output_index` 本事件关联的输出项的索引。 **sequence_number** `integer` | 序列号 `response.image_process_call.completed.sequence_number` 事件的序列号。 **type** `string` | 事件类型 `response.image_process_call.completed.type` 事件的类型,总是 `response.image_process_call.completed` ## 工具调用(MCP) ### response.mcp_approval_request > 当 MCP 工具调用需要用户审批时触发的事件。 **function_mcp_approval_request** `object` | 审批请求 `response.mcp_approval_request.function_mcp_approval_request` 需要用户审批的 MCP 工具调用请求。 **arguments** `string` | 调用参数 `response.mcp_approval_request.function_mcp_approval_request.arguments` 工具调用的参数 JSON 字符串。 **name** `string` | 工具名称 `response.mcp_approval_request.function_mcp_approval_request.name` 要调用的工具名称。 **server_label** `string` | MCP 服务器标签 `response.mcp_approval_request.function_mcp_approval_request.server_label` 发起请求的 MCP 服务器的标签。 **type** `string` | 项类型 `response.mcp_approval_request.function_mcp_approval_request.type` 项的类型标识符,用于区分不同类型的输出项。 取值固定为 `mcp_approval_request`。 **id** `string` | 请求 ID `response.mcp_approval_request.function_mcp_approval_request.id` 审批请求的唯一标识。 **output_index** `integer` | 输出项索引 `response.mcp_approval_request.output_index` 审批请求所属输出项的索引。 **sequence_number** `integer` | 序列号 `response.mcp_approval_request.sequence_number` 事件的序列号。 **type** `string` | 事件类型 `response.mcp_approval_request.type` 事件的类型,总是 `response.mcp_approval_request` ### response.mcp_call.in_progress > 当 MCP 工具调用进行中时触发的事件。 **item_id** `string` | 调用项 ID `response.mcp_call.in_progress.item_id` 正在处理的 MCP 工具调用项的唯一标识。 **output_index** `integer` | 输出项索引 `response.mcp_call.in_progress.output_index` MCP 调用所在输出项数组中的索引。 **sequence_number** `integer` | 序列号 `response.mcp_call.in_progress.sequence_number` 事件的序列号。 **type** `string` | 事件类型 `response.mcp_call.in_progress.type` 事件的类型,总是 `response.mcp_call.in_progress` ### response.mcp_call.completed > 当 MCP 工具调用完成时触发的事件。 **item_id** `string` | 调用项 ID `response.mcp_call.completed.item_id` 已完成的 MCP 工具调用项的 ID。 **output_index** `integer` | 输出项索引 `response.mcp_call.completed.output_index` 已完成的输出项的索引。 **sequence_number** `integer` | 序列号 `response.mcp_call.completed.sequence_number` 事件的序列号。 **type** `string` | 事件类型 `response.mcp_call.completed.type` 事件的类型,总是 `response.mcp_call.completed` ### response.mcp_call.failed > 当 MCP 工具调用失败时触发的事件。 **item_id** `string` | 调用项 ID `response.mcp_call.failed.item_id` 失败的 MCP 工具调用项的 ID。 **output_index** `integer` | 输出项索引 `response.mcp_call.failed.output_index` 失败的输出项的索引。 **sequence_number** `integer` | 序列号 `response.mcp_call.failed.sequence_number` 事件的序列号。 **type** `string` | 事件类型 `response.mcp_call.failed.type` 事件的类型,总是 `response.mcp_call.failed` ### response.mcp_call_arguments.delta > 当 MCP 工具调用参数片段新增时触发的事件。 **delta** `string` | 参数增量 `response.mcp_call_arguments.delta.delta` 本次新增的 MCP 工具调用参数 JSON 字符串片段。 **item_id** `string` | 调用项 ID `response.mcp_call_arguments.delta.item_id` 正在处理的 MCP 工具调用项的唯一标识。 **output_index** `integer` | 输出项索引 `response.mcp_call_arguments.delta.output_index` MCP 调用所在输出项数组中的索引。 **sequence_number** `integer` | 序列号 `response.mcp_call_arguments.delta.sequence_number` 事件的序列号。 **type** `string` | 事件类型 `response.mcp_call_arguments.delta.type` 事件的类型,总是 `response.mcp_call_arguments.delta` ### response.mcp_call_arguments.done > 当 MCP 工具调用参数完成时触发的事件。 **arguments** `string` | 调用参数 `response.mcp_call_arguments.done.arguments` MCP 工具调用的完整参数 JSON 字符串。 **item_id** `string` | 调用项 ID `response.mcp_call_arguments.done.item_id` 正在处理的 MCP 工具调用项的唯一标识。 **output_index** `integer` | 输出项索引 `response.mcp_call_arguments.done.output_index` MCP 调用所在输出项数组中的索引。 **sequence_number** `integer` | 序列号 `response.mcp_call_arguments.done.sequence_number` 事件的序列号。 **type** `string` | 事件类型 `response.mcp_call_arguments.done.type` 事件的类型,总是 `response.mcp_call_arguments.done` ### response.mcp_list_tools.in_progress > 当 MCP 工具列表查询进行中时触发的事件。 **item_id** `string` | 调用项 ID `response.mcp_list_tools.in_progress.item_id` 正在处理的 MCP 工具列表项的 ID。 **output_index** `integer` | 输出项索引 `response.mcp_list_tools.in_progress.output_index` 正在处理的输出项的索引。 **sequence_number** `integer` | 序列号 `response.mcp_list_tools.in_progress.sequence_number` 事件的序列号。 **type** `string` | 事件类型 `response.mcp_list_tools.in_progress.type` 事件的类型,总是 `response.mcp_list_tools.in_progress` ### response.mcp_list_tools.completed > 当 MCP 工具列表查询完成时触发的事件。 **item_id** `string` | 调用项 ID `response.mcp_list_tools.completed.item_id` 已产出该输出的 MCP 工具列表项的 ID。 **output_index** `integer` | 输出项索引 `response.mcp_list_tools.completed.output_index` 已处理的输出项的索引。 **sequence_number** `integer` | 序列号 `response.mcp_list_tools.completed.sequence_number` 事件的序列号。 **type** `string` | 事件类型 `response.mcp_list_tools.completed.type` 事件的类型,总是 `response.mcp_list_tools.completed` ### response.mcp_list_tools.failed > 当 MCP 工具列表查询失败时触发的事件。 **item_id** `string` | 调用项 ID `response.mcp_list_tools.failed.item_id` 失败的 MCP 工具列表项的 ID。 **output_index** `integer` | 输出项索引 `response.mcp_list_tools.failed.output_index` 失败的输出项的索引。 **sequence_number** `integer` | 序列号 `response.mcp_list_tools.failed.sequence_number` 事件的序列号。 **type** `string` | 事件类型 `response.mcp_list_tools.failed.type` 事件的类型,总是 `response.mcp_list_tools.failed` ## 工具调用(doubao_app_call) ### response.doubao_app_call.in_progress > 当豆包应用调用进行中时触发的事件。 **feature** `string` | 调用功能 `response.doubao_app_call.in_progress.feature` 豆包应用调用所使用的功能名。 **item_id** `string` | 调用项 ID `response.doubao_app_call.in_progress.item_id` 正在处理的豆包应用调用项的 ID。 **output_index** `integer` | 输出项索引 `response.doubao_app_call.in_progress.output_index` 正在处理的输出项的索引。 **sequence_number** `integer` | 序列号 `response.doubao_app_call.in_progress.sequence_number` 事件的序列号。 **type** `string` | 事件类型 `response.doubao_app_call.in_progress.type` 事件的类型,总是 `response.doubao_app_call.in_progress` ### response.doubao_app_call.completed > 当豆包应用调用完成时触发的事件。 **blocks** `object[]` | 内容块列表 `response.doubao_app_call.completed.blocks` 豆包应用调用产出的全部内容块。 文本输出 `object` 豆包应用产出的文本输出内容块。 **type** `string` | 类型 `response.doubao_app_call.completed.blocks.type` 内容块类型标识符。 取值固定为 `output_text`。 **id** `string` | 块 ID `response.doubao_app_call.completed.blocks.id` 内容块的唯一标识。 **parent_id** `string` | 父级 ID `response.doubao_app_call.completed.blocks.parent_id` 所属父级条目的 ID。 **status** `string` | 状态 `response.doubao_app_call.completed.blocks.status` 内容块状态。 **text** `string` | 文本内容 `response.doubao_app_call.completed.blocks.text` 思维链文本 `object` 豆包应用产出的思维链文本内容块。 **type** `string` | 类型 `response.doubao_app_call.completed.blocks.type` 内容块类型标识符。 取值固定为 `reasoning_text`。 **id** `string` | 块 ID `response.doubao_app_call.completed.blocks.id` 内容块的唯一标识。 **parent_id** `string` | 父级 ID `response.doubao_app_call.completed.blocks.parent_id` 所属父级条目的 ID。 **reasoning_text** `string` | 思考文本 `response.doubao_app_call.completed.blocks.reasoning_text` 思维链文本内容。 **status** `string` | 状态 `response.doubao_app_call.completed.blocks.status` 内容块状态。 搜索过程 `object` 豆包应用 AI 搜索过程产出的内容块。 **type** `string` | 类型 `response.doubao_app_call.completed.blocks.type` 内容块类型标识符。 取值固定为 `search`。 **id** `string` | 块 ID `response.doubao_app_call.completed.blocks.id` 内容块的唯一标识。 **parent_id** `string` | 父级 ID `response.doubao_app_call.completed.blocks.parent_id` 所属父级条目的 ID。 **queries** `string[]` | 查询语句 `response.doubao_app_call.completed.blocks.queries` 搜索查询语句列表。 **results** `object[]` | 搜索结果 `response.doubao_app_call.completed.blocks.results` 搜索结果列表。 **text_card** `object` | 文本卡片 `response.doubao_app_call.completed.blocks.results.text_card` 文本卡片形式的搜索结果。 **sitename** `string` | 站点名 `response.doubao_app_call.completed.blocks.results.text_card.sitename` 来源站点名称。 **title** `string` | 标题 `response.doubao_app_call.completed.blocks.results.text_card.title` 搜索结果标题。 **url** `string` | 网址 `response.doubao_app_call.completed.blocks.results.text_card.url` 搜索结果 URL 地址。 **status** `string` | 状态 `response.doubao_app_call.completed.blocks.status` 内容块状态。 **summary** `string` | 搜索总结 `response.doubao_app_call.completed.blocks.summary` AI 搜索过程中对本轮搜索结果的总结性文字,概括从搜索结果中提取的核心信息。 推理搜索过程 `object` 豆包应用推理搜索过程产出的内容块。 **type** `string` | 类型 `response.doubao_app_call.completed.blocks.type` 内容块类型。 取值固定为 `reasoning_search`。 **id** `string` | 块 ID `response.doubao_app_call.completed.blocks.id` 内容块的唯一标识。 **parent_id** `string` | 父级 ID `response.doubao_app_call.completed.blocks.parent_id` 所属父级条目的 ID。 **queries** `string[]` | 查询语句 `response.doubao_app_call.completed.blocks.queries` 搜索查询语句列表。 **results** `object[]` | 搜索结果 `response.doubao_app_call.completed.blocks.results` 搜索结果列表。 **text_card** `object` | 文本卡片 `response.doubao_app_call.completed.blocks.results.text_card` 文本卡片形式的搜索结果。 **sitename** `string` | 站点名 `response.doubao_app_call.completed.blocks.results.text_card.sitename` 来源站点名称。 **title** `string` | 标题 `response.doubao_app_call.completed.blocks.results.text_card.title` 搜索结果标题。 **url** `string` | 网址 `response.doubao_app_call.completed.blocks.results.text_card.url` 搜索结果 URL 地址。 **status** `string` | 状态 `response.doubao_app_call.completed.blocks.status` 推理搜索内容块的处理状态。可选值:`in_progress`、`searching`、`completed`、`incomplete`、`failed`。 **summary** `string` | 搜索总结 `response.doubao_app_call.completed.blocks.summary` 推理搜索过程中对本轮搜索结果的总结性文字,概括从搜索结果中提取的核心信息。 **feature** `string` | 调用功能 `response.doubao_app_call.completed.feature` 豆包应用调用所使用的功能名。 **item_id** `string` | 调用项 ID `response.doubao_app_call.completed.item_id` 已完成的豆包应用调用项的 ID。 **output_index** `integer` | 输出项索引 `response.doubao_app_call.completed.output_index` 已完成的输出项的索引。 **sequence_number** `integer` | 序列号 `response.doubao_app_call.completed.sequence_number` 事件的序列号。 **type** `string` | 事件类型 `response.doubao_app_call.completed.type` 事件的类型,总是 `response.doubao_app_call.completed` ### response.doubao_app_call.failed > 当豆包应用调用失败时触发的事件。 **item_id** `string` | 调用项 ID `response.doubao_app_call.failed.item_id` 失败的豆包应用调用项的 ID。 **output_index** `integer` | 输出项索引 `response.doubao_app_call.failed.output_index` 失败的输出项的索引。 **sequence_number** `integer` | 序列号 `response.doubao_app_call.failed.sequence_number` 事件的序列号。 **type** `string` | 事件类型 `response.doubao_app_call.failed.type` 事件的类型,总是 `response.doubao_app_call.failed` **error_message** `string` | 错误信息 `response.doubao_app_call.failed.error_message` 失败原因的描述信息。 ### response.doubao_app_call_block.added > 当豆包应用调用新增一个内容块时触发的事件。 **block** `object` | 内容块 `response.doubao_app_call_block.added.block` 新增的内容块。 文本输出 `object` 豆包应用产出的文本输出内容块。 **type** `string` | 类型 `response.doubao_app_call_block.added.block.type` 内容块类型标识符。 取值固定为 `output_text`。 **id** `string` | 块 ID `response.doubao_app_call_block.added.block.id` 内容块的唯一标识。 **parent_id** `string` | 父级 ID `response.doubao_app_call_block.added.block.parent_id` 所属父级条目的 ID。 **status** `string` | 状态 `response.doubao_app_call_block.added.block.status` 内容块状态。 **text** `string` | 文本内容 `response.doubao_app_call_block.added.block.text` 思维链文本 `object` 豆包应用产出的思维链文本内容块。 **type** `string` | 类型 `response.doubao_app_call_block.added.block.type` 内容块类型标识符。 取值固定为 `reasoning_text`。 **id** `string` | 块 ID `response.doubao_app_call_block.added.block.id` 内容块的唯一标识。 **parent_id** `string` | 父级 ID `response.doubao_app_call_block.added.block.parent_id` 所属父级条目的 ID。 **reasoning_text** `string` | 思考文本 `response.doubao_app_call_block.added.block.reasoning_text` 思维链文本内容。 **status** `string` | 状态 `response.doubao_app_call_block.added.block.status` 内容块状态。 搜索过程 `object` 豆包应用 AI 搜索过程产出的内容块。 **type** `string` | 类型 `response.doubao_app_call_block.added.block.type` 内容块类型标识符。 取值固定为 `search`。 **id** `string` | 块 ID `response.doubao_app_call_block.added.block.id` 内容块的唯一标识。 **parent_id** `string` | 父级 ID `response.doubao_app_call_block.added.block.parent_id` 所属父级条目的 ID。 **queries** `string[]` | 查询语句 `response.doubao_app_call_block.added.block.queries` 搜索查询语句列表。 **results** `object[]` | 搜索结果 `response.doubao_app_call_block.added.block.results` 搜索结果列表。 **text_card** `object` | 文本卡片 `response.doubao_app_call_block.added.block.results.text_card` 文本卡片形式的搜索结果。 **sitename** `string` | 站点名 `response.doubao_app_call_block.added.block.results.text_card.sitename` 来源站点名称。 **title** `string` | 标题 `response.doubao_app_call_block.added.block.results.text_card.title` 搜索结果标题。 **url** `string` | 网址 `response.doubao_app_call_block.added.block.results.text_card.url` 搜索结果 URL 地址。 **status** `string` | 状态 `response.doubao_app_call_block.added.block.status` 内容块状态。 **summary** `string` | 搜索总结 `response.doubao_app_call_block.added.block.summary` AI 搜索过程中对本轮搜索结果的总结性文字,概括从搜索结果中提取的核心信息。 推理搜索过程 `object` 豆包应用推理搜索过程产出的内容块。 **type** `string` | 类型 `response.doubao_app_call_block.added.block.type` 内容块类型。 取值固定为 `reasoning_search`。 **id** `string` | 块 ID `response.doubao_app_call_block.added.block.id` 内容块的唯一标识。 **parent_id** `string` | 父级 ID `response.doubao_app_call_block.added.block.parent_id` 所属父级条目的 ID。 **queries** `string[]` | 查询语句 `response.doubao_app_call_block.added.block.queries` 搜索查询语句列表。 **results** `object[]` | 搜索结果 `response.doubao_app_call_block.added.block.results` 搜索结果列表。 **text_card** `object` | 文本卡片 `response.doubao_app_call_block.added.block.results.text_card` 文本卡片形式的搜索结果。 **sitename** `string` | 站点名 `response.doubao_app_call_block.added.block.results.text_card.sitename` 来源站点名称。 **title** `string` | 标题 `response.doubao_app_call_block.added.block.results.text_card.title` 搜索结果标题。 **url** `string` | 网址 `response.doubao_app_call_block.added.block.results.text_card.url` 搜索结果 URL 地址。 **status** `string` | 状态 `response.doubao_app_call_block.added.block.status` 推理搜索内容块的处理状态。可选值:`in_progress`、`searching`、`completed`、`incomplete`、`failed`。 **summary** `string` | 搜索总结 `response.doubao_app_call_block.added.block.summary` 推理搜索过程中对本轮搜索结果的总结性文字,概括从搜索结果中提取的核心信息。 **item_id** `string` | 调用项 ID `response.doubao_app_call_block.added.item_id` 豆包应用调用项的 ID。 **output_index** `integer` | 输出项索引 `response.doubao_app_call_block.added.output_index` 所属输出项的索引。 **sequence_number** `integer` | 序列号 `response.doubao_app_call_block.added.sequence_number` 事件的序列号。 **type** `string` | 事件类型 `response.doubao_app_call_block.added.type` 事件的类型,总是 `response.doubao_app_call_block.added` ### response.doubao_app_call_block.done > 当豆包应用调用的内容块完成时触发的事件。 **block** `object` | 内容块 `response.doubao_app_call_block.done.block` 已完成的内容块。 文本输出 `object` 豆包应用产出的文本输出内容块。 **type** `string` | 类型 `response.doubao_app_call_block.done.block.type` 内容块类型标识符。 取值固定为 `output_text`。 **id** `string` | 块 ID `response.doubao_app_call_block.done.block.id` 内容块的唯一标识。 **parent_id** `string` | 父级 ID `response.doubao_app_call_block.done.block.parent_id` 所属父级条目的 ID。 **status** `string` | 状态 `response.doubao_app_call_block.done.block.status` 内容块状态。 **text** `string` | 文本内容 `response.doubao_app_call_block.done.block.text` 思维链文本 `object` 豆包应用产出的思维链文本内容块。 **type** `string` | 类型 `response.doubao_app_call_block.done.block.type` 内容块类型标识符。 取值固定为 `reasoning_text`。 **id** `string` | 块 ID `response.doubao_app_call_block.done.block.id` 内容块的唯一标识。 **parent_id** `string` | 父级 ID `response.doubao_app_call_block.done.block.parent_id` 所属父级条目的 ID。 **reasoning_text** `string` | 思考文本 `response.doubao_app_call_block.done.block.reasoning_text` 思维链文本内容。 **status** `string` | 状态 `response.doubao_app_call_block.done.block.status` 内容块状态。 搜索过程 `object` 豆包应用 AI 搜索过程产出的内容块。 **type** `string` | 类型 `response.doubao_app_call_block.done.block.type` 内容块类型标识符。 取值固定为 `search`。 **id** `string` | 块 ID `response.doubao_app_call_block.done.block.id` 内容块的唯一标识。 **parent_id** `string` | 父级 ID `response.doubao_app_call_block.done.block.parent_id` 所属父级条目的 ID。 **queries** `string[]` | 查询语句 `response.doubao_app_call_block.done.block.queries` 搜索查询语句列表。 **results** `object[]` | 搜索结果 `response.doubao_app_call_block.done.block.results` 搜索结果列表。 **text_card** `object` | 文本卡片 `response.doubao_app_call_block.done.block.results.text_card` 文本卡片形式的搜索结果。 **sitename** `string` | 站点名 `response.doubao_app_call_block.done.block.results.text_card.sitename` 来源站点名称。 **title** `string` | 标题 `response.doubao_app_call_block.done.block.results.text_card.title` 搜索结果标题。 **url** `string` | 网址 `response.doubao_app_call_block.done.block.results.text_card.url` 搜索结果 URL 地址。 **status** `string` | 状态 `response.doubao_app_call_block.done.block.status` 内容块状态。 **summary** `string` | 搜索总结 `response.doubao_app_call_block.done.block.summary` AI 搜索过程中对本轮搜索结果的总结性文字,概括从搜索结果中提取的核心信息。 推理搜索过程 `object` 豆包应用推理搜索过程产出的内容块。 **type** `string` | 类型 `response.doubao_app_call_block.done.block.type` 内容块类型。 取值固定为 `reasoning_search`。 **id** `string` | 块 ID `response.doubao_app_call_block.done.block.id` 内容块的唯一标识。 **parent_id** `string` | 父级 ID `response.doubao_app_call_block.done.block.parent_id` 所属父级条目的 ID。 **queries** `string[]` | 查询语句 `response.doubao_app_call_block.done.block.queries` 搜索查询语句列表。 **results** `object[]` | 搜索结果 `response.doubao_app_call_block.done.block.results` 搜索结果列表。 **text_card** `object` | 文本卡片 `response.doubao_app_call_block.done.block.results.text_card` 文本卡片形式的搜索结果。 **sitename** `string` | 站点名 `response.doubao_app_call_block.done.block.results.text_card.sitename` 来源站点名称。 **title** `string` | 标题 `response.doubao_app_call_block.done.block.results.text_card.title` 搜索结果标题。 **url** `string` | 网址 `response.doubao_app_call_block.done.block.results.text_card.url` 搜索结果 URL 地址。 **status** `string` | 状态 `response.doubao_app_call_block.done.block.status` 推理搜索内容块的处理状态。可选值:`in_progress`、`searching`、`completed`、`incomplete`、`failed`。 **summary** `string` | 搜索总结 `response.doubao_app_call_block.done.block.summary` 推理搜索过程中对本轮搜索结果的总结性文字,概括从搜索结果中提取的核心信息。 **item_id** `string` | 调用项 ID `response.doubao_app_call_block.done.item_id` 豆包应用调用项的 ID。 **output_index** `integer` | 输出项索引 `response.doubao_app_call_block.done.output_index` 所属输出项的索引。 **sequence_number** `integer` | 序列号 `response.doubao_app_call_block.done.sequence_number` 事件的序列号。 **type** `string` | 事件类型 `response.doubao_app_call_block.done.type` 事件的类型,总是 `response.doubao_app_call_block.done` ### response.doubao_app_call_output_text.delta > 当豆包应用调用的输出文本片段新增时触发的事件。 **item_id** `string` | 调用项 ID `response.doubao_app_call_output_text.delta.item_id` 豆包应用调用项的 ID。 **output_index** `integer` | 输出项索引 `response.doubao_app_call_output_text.delta.output_index` 所属输出项的索引。 **sequence_number** `integer` | 序列号 `response.doubao_app_call_output_text.delta.sequence_number` 事件的序列号。 **type** `string` | 事件类型 `response.doubao_app_call_output_text.delta.type` 事件的类型,总是 `response.doubao_app_call_output_text.delta` **block_index** `integer` | 块索引 `response.doubao_app_call_output_text.delta.block_index` 所属内容块的索引。 **delta** `string` | 文本增量 `response.doubao_app_call_output_text.delta.delta` 本次新增的输出文本片段。 ### response.doubao_app_call_output_text.done > 当豆包应用调用的输出文本完成时触发的事件。 **item_id** `string` | 调用项 ID `response.doubao_app_call_output_text.done.item_id` 豆包应用调用项的 ID。 **output_index** `integer` | 输出项索引 `response.doubao_app_call_output_text.done.output_index` 所属输出项的索引。 **sequence_number** `integer` | 序列号 `response.doubao_app_call_output_text.done.sequence_number` 事件的序列号。 **type** `string` | 事件类型 `response.doubao_app_call_output_text.done.type` 事件的类型,总是 `response.doubao_app_call_output_text.done` **block_index** `integer` | 块索引 `response.doubao_app_call_output_text.done.block_index` 所属内容块的索引。 **text** `string` | 完整文本 `response.doubao_app_call_output_text.done.text` 完整的输出文本内容。 ### response.doubao_app_call_reasoning_search.in_progress > 当豆包应用调用的推理搜索进行中时触发的事件。 **item_id** `string` | 调用项 ID `response.doubao_app_call_reasoning_search.in_progress.item_id` 豆包应用调用项的 ID。 **output_index** `integer` | 输出项索引 `response.doubao_app_call_reasoning_search.in_progress.output_index` 所属输出项的索引。 **sequence_number** `integer` | 序列号 `response.doubao_app_call_reasoning_search.in_progress.sequence_number` 事件的序列号。 **type** `string` | 事件类型 `response.doubao_app_call_reasoning_search.in_progress.type` 事件的类型,总是 `response.doubao_app_call_reasoning_search.in_progress` **block_index** `integer` | 块索引 `response.doubao_app_call_reasoning_search.in_progress.block_index` 所属内容块的索引。 ### response.doubao_app_call_reasoning_search.searching > 当豆包应用调用的推理搜索正在执行时触发的事件。 **item_id** `string` | 调用项 ID `response.doubao_app_call_reasoning_search.searching.item_id` 豆包应用调用项的 ID。 **output_index** `integer` | 输出项索引 `response.doubao_app_call_reasoning_search.searching.output_index` 所属输出项的索引。 **sequence_number** `integer` | 序列号 `response.doubao_app_call_reasoning_search.searching.sequence_number` 事件的序列号。 **type** `string` | 事件类型 `response.doubao_app_call_reasoning_search.searching.type` 事件的类型,总是 `response.doubao_app_call_reasoning_search.searching` **block_index** `integer` | 块索引 `response.doubao_app_call_reasoning_search.searching.block_index` 所属内容块的索引。 **searching_state** `string` | 搜索状态 `response.doubao_app_call_reasoning_search.searching.searching_state` 搜索阶段的状态描述。 ### response.doubao_app_call_reasoning_search.completed > 当豆包应用调用的推理搜索完成时触发的事件。 **item_id** `string` | 调用项 ID `response.doubao_app_call_reasoning_search.completed.item_id` 豆包应用调用项的 ID。 **output_index** `integer` | 输出项索引 `response.doubao_app_call_reasoning_search.completed.output_index` 所属输出项的索引。 **queries** `string[]` | 查询语句 `response.doubao_app_call_reasoning_search.completed.queries` 执行的搜索查询。 **results** `object[]` | 搜索结果 `response.doubao_app_call_reasoning_search.completed.results` 搜索结果列表。 **text_card** `object` | 文本卡片 `response.doubao_app_call_reasoning_search.completed.results.text_card` 文本卡片形式的搜索结果。 **sitename** `string` | 站点名 `response.doubao_app_call_reasoning_search.completed.results.text_card.sitename` 来源站点名称。 **title** `string` | 标题 `response.doubao_app_call_reasoning_search.completed.results.text_card.title` 搜索结果标题。 **url** `string` | 网址 `response.doubao_app_call_reasoning_search.completed.results.text_card.url` 搜索结果 URL 地址。 **sequence_number** `integer` | 序列号 `response.doubao_app_call_reasoning_search.completed.sequence_number` 事件的序列号。 **type** `string` | 事件类型 `response.doubao_app_call_reasoning_search.completed.type` 事件的类型,总是 `response.doubao_app_call_reasoning_search.completed` **block_index** `integer` | 块索引 `response.doubao_app_call_reasoning_search.completed.block_index` 所属内容块的索引。 **summary** `string` | 搜索摘要 `response.doubao_app_call_reasoning_search.completed.summary` 推理搜索的摘要。 ### response.doubao_app_call_reasoning_text.delta > 当豆包应用调用的推理文本片段新增时触发的事件。 **item_id** `string` | 调用项 ID `response.doubao_app_call_reasoning_text.delta.item_id` 豆包应用调用项的 ID。 **output_index** `integer` | 输出项索引 `response.doubao_app_call_reasoning_text.delta.output_index` 所属输出项的索引。 **sequence_number** `integer` | 序列号 `response.doubao_app_call_reasoning_text.delta.sequence_number` 事件的序列号。 **type** `string` | 事件类型 `response.doubao_app_call_reasoning_text.delta.type` 事件的类型,总是 `response.doubao_app_call_reasoning_text.delta` **block_index** `integer` | 块索引 `response.doubao_app_call_reasoning_text.delta.block_index` 所属内容块的索引。 **delta** `string` | 推理增量 `response.doubao_app_call_reasoning_text.delta.delta` 本次新增的推理文本片段。 ### response.doubao_app_call_reasoning_text.done > 当豆包应用调用的推理文本完成时触发的事件。 **item_id** `string` | 调用项 ID `response.doubao_app_call_reasoning_text.done.item_id` 豆包应用调用项的 ID。 **output_index** `integer` | 输出项索引 `response.doubao_app_call_reasoning_text.done.output_index` 所属输出项的索引。 **sequence_number** `integer` | 序列号 `response.doubao_app_call_reasoning_text.done.sequence_number` 事件的序列号。 **type** `string` | 事件类型 `response.doubao_app_call_reasoning_text.done.type` 事件的类型,总是 `response.doubao_app_call_reasoning_text.done` **block_index** `integer` | 块索引 `response.doubao_app_call_reasoning_text.done.block_index` 所属内容块的索引。 **text** `string` | 推理文本 `response.doubao_app_call_reasoning_text.done.text` 完整的推理文本内容。 ### response.doubao_app_call_search.in_progress > 当豆包应用调用的搜索进行中时触发的事件。 **item_id** `string` | 调用项 ID `response.doubao_app_call_search.in_progress.item_id` 豆包应用调用项的 ID。 **output_index** `integer` | 输出项索引 `response.doubao_app_call_search.in_progress.output_index` 所属输出项的索引。 **sequence_number** `integer` | 序列号 `response.doubao_app_call_search.in_progress.sequence_number` 事件的序列号。 **type** `string` | 事件类型 `response.doubao_app_call_search.in_progress.type` 事件的类型,总是 `response.doubao_app_call_search.in_progress` **block_index** `integer` | 块索引 `response.doubao_app_call_search.in_progress.block_index` 所属内容块的索引。 ### response.doubao_app_call_search.searching > 当豆包应用调用的搜索正在执行时触发的事件。 **item_id** `string` | 调用项 ID `response.doubao_app_call_search.searching.item_id` 豆包应用调用项的 ID。 **output_index** `integer` | 输出项索引 `response.doubao_app_call_search.searching.output_index` 所属输出项的索引。 **sequence_number** `integer` | 序列号 `response.doubao_app_call_search.searching.sequence_number` 事件的序列号。 **type** `string` | 事件类型 `response.doubao_app_call_search.searching.type` 事件的类型,总是 `response.doubao_app_call_search.searching` **block_index** `integer` | 块索引 `response.doubao_app_call_search.searching.block_index` 所属内容块的索引。 **searching_state** `string` | 搜索状态 `response.doubao_app_call_search.searching.searching_state` 搜索阶段的状态描述。 ### response.doubao_app_call_search.completed > 当豆包应用调用的搜索完成时触发的事件。 **item_id** `string` | 调用项 ID `response.doubao_app_call_search.completed.item_id` 豆包应用调用项的 ID。 **output_index** `integer` | 输出项索引 `response.doubao_app_call_search.completed.output_index` 所属输出项的索引。 **queries** `string[]` | 查询语句 `response.doubao_app_call_search.completed.queries` 执行的搜索查询。 **results** `object[]` | 搜索结果 `response.doubao_app_call_search.completed.results` 搜索结果列表。 **text_card** `object` | 文本卡片 `response.doubao_app_call_search.completed.results.text_card` 文本卡片形式的搜索结果。 **sitename** `string` | 站点名 `response.doubao_app_call_search.completed.results.text_card.sitename` 来源站点名称。 **title** `string` | 标题 `response.doubao_app_call_search.completed.results.text_card.title` 搜索结果标题。 **url** `string` | 网址 `response.doubao_app_call_search.completed.results.text_card.url` 搜索结果 URL 地址。 **sequence_number** `integer` | 序列号 `response.doubao_app_call_search.completed.sequence_number` 事件的序列号。 **type** `string` | 事件类型 `response.doubao_app_call_search.completed.type` 事件的类型,总是 `response.doubao_app_call_search.completed` **block_index** `integer` | 块索引 `response.doubao_app_call_search.completed.block_index` 所属内容块的索引。 **summary** `string` | 搜索摘要 `response.doubao_app_call_search.completed.summary` 搜索结果的摘要。 --- # 语音转写与错误事件 Source: https://ark.volcengine.com/region:cn-beijing/docs/audio-and-errors 语音转写流式事件及错误事件。 ## 语音转写 ### response.transcription_part.added > 当转写内容新增部分时触发的事件。 **item_id** `string` | 输出项 ID `response.transcription_part.added.item_id` 所属输出项的唯一 ID。 **output_index** `integer` | 输出项索引 `response.transcription_part.added.output_index` 所属输出项的列表索引。 **part** `object` | 转写部分 `response.transcription_part.added.part` 所添加的转写部分。 **type** `string` | 类型 `response.transcription_part.added.part.type` 转写片段类型。 取值固定为 `transcription_text`。 **chunks** `object[]` | 音频小段 `response.transcription_part.added.part.chunks` 当前片段对应的音频小段列表。 **end_time** `integer` | 结束时间 `response.transcription_part.added.part.chunks.end_time` 片段结束时间(毫秒) **start_time** `integer` | 开始时间 `response.transcription_part.added.part.chunks.start_time` 片段开始时间(毫秒) **text** `string` | 文字内容 `response.transcription_part.added.part.chunks.text` 当前片段对应的文字内容。 **text** `string` | 转写文本 `response.transcription_part.added.part.text` 当前片段的转写文本。 **sequence_number** `integer` | 序列号 `response.transcription_part.added.sequence_number` 事件的序列号。 **transcription_index** `integer` | 转写索引 `response.transcription_part.added.transcription_index` 所属转写片段的索引。 **type** `string` | 事件类型 `response.transcription_part.added.type` 事件的类型,总是 `response.transcription_part.added` ### response.transcription_part.done > 当转写部分完成时触发的事件。 **item_id** `string` | 输出项 ID `response.transcription_part.done.item_id` 所属输出项的唯一 ID。 **output_index** `integer` | 输出项索引 `response.transcription_part.done.output_index` 所属输出项的列表索引。 **part** `object` | 转写部分 `response.transcription_part.done.part` 已完成的转写部分。 **type** `string` | 类型 `response.transcription_part.done.part.type` 转写片段类型。 取值固定为 `transcription_text`。 **chunks** `object[]` | 音频小段 `response.transcription_part.done.part.chunks` 当前片段对应的音频小段列表。 **end_time** `integer` | 结束时间 `response.transcription_part.done.part.chunks.end_time` 片段结束时间(毫秒) **start_time** `integer` | 开始时间 `response.transcription_part.done.part.chunks.start_time` 片段开始时间(毫秒) **text** `string` | 文字内容 `response.transcription_part.done.part.chunks.text` 当前片段对应的文字内容。 **text** `string` | 转写文本 `response.transcription_part.done.part.text` 当前片段的转写文本。 **sequence_number** `integer` | 序列号 `response.transcription_part.done.sequence_number` 事件的序列号。 **transcription_index** `integer` | 转写索引 `response.transcription_part.done.transcription_index` 所属转写片段的索引。 **type** `string` | 事件类型 `response.transcription_part.done.type` 事件的类型,总是 `response.transcription_part.done` ### response.transcription_text.delta > 当转写文本片段新增时触发的事件。 **end_time** `integer` | 结束时间 `response.transcription_text.delta.end_time` 本段转写片段的结束时间,单位为毫秒。 **item_id** `string` | 输出项 ID `response.transcription_text.delta.item_id` 所属输出项的唯一 ID。 **output_index** `integer` | 输出项索引 `response.transcription_text.delta.output_index` 所属输出项的列表索引。 **sequence_number** `integer` | 序列号 `response.transcription_text.delta.sequence_number` 事件的序列号。 **start_time** `integer` | 起始时间 `response.transcription_text.delta.start_time` 本段转写片段的起始时间,单位为毫秒。 **transcription_index** `integer` | 转写索引 `response.transcription_text.delta.transcription_index` 所属转写片段的索引。 **type** `string` | 事件类型 `response.transcription_text.delta.type` 事件的类型,总是 `response.transcription_text.delta` **delta** `string` | 转写增量 `response.transcription_text.delta.delta` 新增的转写文本片段。 ### response.transcription_text.done > 当转写文本内容完成时触发的事件。 **chunks** `object[]` | 音频片段 `response.transcription_text.done.chunks` 与本段完整转写关联的音频片段。 **end_time** `integer` | 结束时间 `response.transcription_text.done.chunks.end_time` 片段结束时间(毫秒) **start_time** `integer` | 开始时间 `response.transcription_text.done.chunks.start_time` 片段开始时间(毫秒) **text** `string` | 文字内容 `response.transcription_text.done.chunks.text` 当前片段对应的文字内容。 **end_time** `integer` | 结束时间 `response.transcription_text.done.end_time` 本段转写片段的结束时间,单位为毫秒。 **item_id** `string` | 输出项 ID `response.transcription_text.done.item_id` 所属输出项的唯一 ID。 **output_index** `integer` | 输出项索引 `response.transcription_text.done.output_index` 所属输出项的列表索引。 **sequence_number** `integer` | 序列号 `response.transcription_text.done.sequence_number` 事件的序列号。 **start_time** `integer` | 起始时间 `response.transcription_text.done.start_time` 本段转写片段的起始时间,单位为毫秒。 **transcription_index** `integer` | 转写索引 `response.transcription_text.done.transcription_index` 所属转写片段的索引。 **type** `string` | 事件类型 `response.transcription_text.done.type` 事件的类型,总是 `response.transcription_text.done` **text** `string` | 转写文本 `response.transcription_text.done.text` 完整的转写文本内容。 ## 错误事件 ### error > 发生错误时触发。 **message** `string` | 错误原因 `error.message` **sequence_number** `integer` | 序列号 `error.sequence_number` 事件的序列号。 **type** `string` | 事件类型 `error.type` 事件的类型,总是 `error` **code** `string` | 错误码 `error.code` **param** `string` | 错误参数 `error.param` 导致错误的参数名。 --- # 创建 Message Source: https://ark.volcengine.com/region:cn-beijing/docs/messages-api `POST https://ark.cn-beijing.volces.com/api/compatible/v1/messages` 根据输入的消息列表创建一条新的 Message,返回模型生成的下一条消息。本接口为无状态接口,多轮对话时每次请求都需传入完整的消息历史。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Body 参数 **messages** `object[]` `必选` | 消息列表 **role** `string` `必选` | 角色 `messages.role` 输入消息的角色,决定指令的优先级层级。可选值:`user`、`system`、`assistant`、`developer`。 **content** `string / object[] / null` | 消息内容 `messages.content` 对于 `user` 和 `assistant` 角色,省略、传入 `null` 或传入空数组时,服务端会按空字符串处理。对于其他角色,服务端要求传入该字段,但可以传入 `null`。 纯文本消息内容 `string` 结构化消息内容 `object[]` 文本内容块 `object` **text** `string` `必选` | 文本内容 `messages.content.text` **type** `string` `必选` | 内容块类型 `messages.content.type` 取值固定为 `text`。 思考内容块 `object` **type** `string` `必选` | 内容块类型 `messages.content.type` 取值固定为 `thinking`。 **signature** `string` | 用于回放思考内容的不透明签名 `messages.content.signature` 当 `type=thinking` 时必填,用于标识并校验该思考内容块。需将该字段与 `thinking` 字段一起完整回传,并保持字段值及内容块顺序不变。 **thinking** `string` | 模型的思考内容 `messages.content.thinking` 图片内容块 `object` **source** `object` `必选` | 图片来源 `messages.content.source` **type** `string` `必选` | 图片传入方式 `messages.content.source.type` * `type=url`:`url` 为必填。 * `type=base64`:`data` 和 `media_type` 为必填。 **data** `string` | 图片数据 `messages.content.source.data` 当 `type=base64` 时传入。 **media_type** `string` | 媒体类型 `messages.content.source.media_type` 当 `type=base64` 时,与 `data` 一起传入。 **url** `string` | 图片 URL `messages.content.source.url` 当 `type=url` 时传入。 **type** `string` `必选` | 内容块类型 `messages.content.type` 取值固定为 `image`。 文档内容块 `object` **source** `object` `必选` | 文档来源 `messages.content.source` **type** `string` `必选` | 文档传入方式 `messages.content.source.type` 支持通过 `url`、`base64`、`text` 或 `content` 四种方式传入文档。 * `type=url`:`url` 为必填。 * `type=base64` 或 `type=text`:`data` 为必填。 * `type=content`:`content` 为必填。 **content** `string / object[]` | 文档内容 `messages.content.source.content` 当 `type=content` 时传入。 该字段支持递归嵌套。为避免重复展示,此处不再继续展开。 **data** `string` | 文档数据 `messages.content.source.data` 当 `type` 为 `base64` 或 `text` 时传入。 **url** `string` | 文档 URL `messages.content.source.url` 当 `type=url` 时传入。 **type** `string` `必选` | 内容块类型 `messages.content.type` 取值固定为 `document`。 工具调用内容块 `object` **input** `object` `必选` | 模型为该工具生成的输入参数 `messages.content.input` **name** `string` `必选` | 被调用的工具名称 `messages.content.name` **type** `string` `必选` | 内容块类型 `messages.content.type` 取值固定为 `tool_use`。 **id** `string / null` | 工具调用的 ID `messages.content.id` 省略、传入 `null` 或传入空字符串时,服务端会兼容处理。 工具结果内容块 `object` **type** `string` `必选` | 内容块类型 `messages.content.type` 取值固定为 `tool_result`。 **content** `string / object[] / null` | 工具返回的内容 `messages.content.content` 省略或传入 `null` 时,服务端会按空字符串处理。 纯文本工具结果 `string` 结构化工具结果 `object[]` 文本内容块 `object` **text** `string` `必选` | 文本内容 `messages.content.content.text` **type** `string` `必选` | 内容块类型 `messages.content.content.type` 取值固定为 `text`。 图片内容块 `object` **source** `object` `必选` | 图片来源 `messages.content.content.source` **type** `string` `必选` | 图片传入方式 `messages.content.content.source.type` * `type=url`:`url` 为必填。 * `type=base64`:`data` 和 `media_type` 为必填。 **data** `string` | 图片数据 `messages.content.content.source.data` 当 `type=base64` 时传入。 **media_type** `string` | 媒体类型 `messages.content.content.source.media_type` 当 `type=base64` 时,与 `data` 一起传入。 **url** `string` | 图片 URL `messages.content.content.source.url` 当 `type=url` 时传入。 **type** `string` `必选` | 内容块类型 `messages.content.content.type` 取值固定为 `image`。 工具引用内容块 `object` **tool_name** `string` `必选` | 引用的工具名称 `messages.content.content.tool_name` **type** `string` `必选` | 内容块类型 `messages.content.content.type` 取值固定为 `tool_reference`。 空值工具结果 `null` **tool_use_id** `string / null` | 该结果所对应的工具调用 ID `messages.content.tool_use_id` 省略、传入 `null` 或传入空字符串时,服务端会兼容处理。 服务端工具调用内容块 `object` **id** `string` `必选` | 服务端托管工具调用的公开 ID `messages.content.id` **input** `object` `必选` | 模型为该工具生成的输入参数 `messages.content.input` **name** `string` `必选` | 被调用的服务端托管工具名称 `messages.content.name` **type** `string` `必选` | 内容块类型 `messages.content.type` 取值固定为 `server_tool_use`。 联网搜索结果内容块 `object` **content** `object[] / object` `必选` | 联网搜索结果内容 `messages.content.content` 联网搜索结果列表 `object[]` **encrypted_content** `string` `必选` | 加密内容 `messages.content.content.encrypted_content` **title** `string` `必选` | 结果标题 `messages.content.content.title` **type** `string` `必选` | 结果类型 `messages.content.content.type` 取值固定为 `web_search_result`。 **url** `string` `必选` | 结果 URL `messages.content.content.url` **page_age** `string` | 页面时效 `messages.content.content.page_age` 联网搜索错误结果 `object` **error_code** `string` `必选` | 错误码 `messages.content.content.error_code` **type** `string` `必选` | 结果类型 `messages.content.content.type` 取值固定为 `web_search_tool_result_error`。 **tool_use_id** `string` `必选` | 该结果所对应的服务端工具调用 ID `messages.content.tool_use_id` **type** `string` `必选` | 内容块类型 `messages.content.type` 取值固定为 `web_search_tool_result`。 **caller** `object` | 服务端调用方 `messages.content.caller` **type** `string` `必选` | 标识生成该结果的服务端调用方 `messages.content.caller.type` 空值消息内容 `null` **model** `string` `必选` | 模型 ID 本次请求调用的模型 ID(Model ID),用于指定处理输入内容的模型。 > **说明** > > - 开通模型服务并查询 Model ID,请参见 [模型列表](/docs/model-list)。 > - 若需要多个应用分别调用模型服务或做更细粒度的权限管理,可改传 Endpoint ID(在线推理接入点的 ID),详细请参考 [获取 Endpoint ID](/docs/online-inference-standard)。 **max_tokens** `integer` | 最大输出 token 数 **output_config** `object` | 输出配置 **effort** `string` | 思考深度 `output_config.effort` 限制思考的工作量。减少思考深度可提升速度,思考花费的 token 更少。 * `none`:关闭思考。 * `minimal`:关闭思考,直接回答。 * `low`:轻量思考,侧重快速响应。 * `medium`:均衡模式,兼顾速度与深度。 * `high`:深度分析,处理复杂问题。 * `xhigh`:更高程度思考。 * `max`:最高程度思考,适配高难度推理任务。 > **注意:说明** > > 支持该字段的模型、默认取值、参数兼容映射规则,以及与 `thinking.type` 字段的关系,详见 [文档](/docs/deep-thinking)。 **output_format** `object` | 输出格式 **type** `string` `必选` | 输出格式类型 `output_format.type` 支持 `text`、`json_object` 和 `json_schema` 三种输出格式。 * `text`:返回文本格式结果。 * `json_object`:返回 JSON 对象格式结果。 * `json_schema`:按 JSON Schema 约束返回结果,此时 `schema` 为必填。 **schema** `object` | JSON Schema `output_format.schema` 当 `type=json_schema` 时传入。 **service_tier** `string` `默认值 default` | 推理模式 控制使用的在线推理模式。 - `default`:使用 [在线推理(常规)](/docs/online-inference-standard)。 - `flex`:使用 [在线推理(低优)](/docs/online-inference-flex)。 **stop_sequences** `string / string[]` | 停止序列 支持传入单个字符串,或最多 `4` 个停止序列。 **stream** `boolean` | 响应内容是否流式返回 * `true`:按 SSE 协议逐块返回模型生成内容。 * `false`:模型生成完成后一次性返回结果。 **system** `string / object[]` | 系统提示词 支持直接传字符串,或传由 `text` 内容块组成的数组。 纯文本系统提示词 `string` 结构化系统提示词 `object[]` **text** `string` `必选` | 文本内容 `system.text` **type** `string` `必选` | 内容块类型 `system.type` 取值固定为 `text`。 **temperature** `number` | 采样温度 **取值范围**:`[0, 2]` **thinking** `object` | 深度思考配置 **type** `string` `必选` | 思考模式 `thinking.type` * `disabled`:关闭深度思考。 * `enabled`:开启深度思考。 * `adaptive`:由模型自动决定是否开启深度思考。 **tool_choice** `object` | 工具调用策略 配置 `tools` 后再设置该参数。 自动选择是否调用工具 `object` **type** `string` `必选` | 策略类型 `tool_choice.type` 取值固定为 `auto`。 **disable_parallel_tool_use** `boolean` | 是否禁用并行工具调用 `tool_choice.disable_parallel_tool_use` * `true`:模型在同一轮中不会并行调用多个工具。 * `false`:模型可在同一轮中并行调用多个工具。 当前不保证一定会调用工具,不同模型的保障效果不同 `object` **type** `string` `必选` | 策略类型 `tool_choice.type` 取值固定为 `any`。 **disable_parallel_tool_use** `boolean` | 是否禁用并行工具调用 `tool_choice.disable_parallel_tool_use` * `true`:模型在同一轮中不会并行调用多个工具。 * `false`:模型可在同一轮中并行调用多个工具。 不调用工具 `object` **type** `string` `必选` | 策略类型 `tool_choice.type` 取值固定为 `none`。 强制调用指定工具 `object` **name** `string` `必选` | 模型必须调用的工具名称 `tool_choice.name` **type** `string` `必选` | 策略类型 `tool_choice.type` 取值固定为 `tool`。 **disable_parallel_tool_use** `boolean` | 是否禁用并行工具调用 `tool_choice.disable_parallel_tool_use` * `true`:模型在同一轮中不会并行调用多个工具。 * `false`:模型可在同一轮中并行调用多个工具。 **tools** `object[]` | 工具列表 用户自定义工具 `object` **name** `string` `必选` | 工具名称 `tools.name` **description** `string` | 工具说明 `tools.description` 描述工具的用途以及模型应在何时调用。 **input_schema** `object` | 工具输入 Schema `tools.input_schema` 服务端工具 `object` 当前仅支持原生联网搜索 `web_search`。 **type** `string` `必选` | 工具类型 `tools.type` 兼容 Anthropic 原生 Web Search 工具的版本化类型值。例如:`web_search_20250305`。 具体可用版本请参见 [Anthropic Web Search 工具文档](https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-search-tool)。 **name** `string` | 工具名称 `tools.name` 当前服务端工具可填写 `web_search`。 **max_uses** `integer` | 最大调用次数 `tools.max_uses` **allowed_domains** `string[]` | 允许访问的域名列表 `tools.allowed_domains` **blocked_domains** `string[]` | 禁止访问的域名列表 `tools.blocked_domains` **user_location** `object` | 用户位置信息 `tools.user_location` 当前传入该参数会被忽略,不生效。 **top_p** `number` | 核采样概率 **取值范围**:`[0, 1]` ## 响应参数 ### 非流式调用响应 **content** `object[]` | 模型生成的内容 文本内容块 `object` **text** `string` | 文本内容 `content.text` **type** `string` | 内容块类型 `content.type` 取值固定为 `text`。 思考内容块 `object` **thinking** `string` | 思考内容 `content.thinking` **type** `string` | 内容块类型 `content.type` 取值固定为 `thinking`。 **signature** `string` | 用于回放思考内容的不透明签名 `content.signature` 当 `type=thinking` 时必填,用于标识并校验该思考内容块。需将该字段与 `thinking` 字段一起完整回传,并保持字段值及内容块顺序不变。 工具调用内容块 `object` **id** `string` | 工具调用 ID `content.id` **input** `object` | 工具输入参数 `content.input` **name** `string` | 工具名称 `content.name` **type** `string` | 内容块类型 `content.type` 取值固定为 `tool_use`。 服务端工具调用内容块 `object` **id** `string` | 服务端工具调用 ID `content.id` **input** `object` | 工具输入参数 `content.input` **name** `string` | 工具名称 `content.name` **type** `string` | 内容块类型 `content.type` 取值固定为 `server_tool_use`。 联网搜索结果内容块 `object` **content** `object[] / object` | 联网搜索结果内容 `content.content` 联网搜索结果列表 `object[]` **encrypted_content** `string` | 加密内容 `content.content.encrypted_content` **title** `string` | 结果标题 `content.content.title` **type** `string` | 结果类型 `content.content.type` 取值固定为 `web_search_result`。 **url** `string` | 结果 URL `content.content.url` **page_age** `string` | 页面时效 `content.content.page_age` 联网搜索错误结果 `object` **error_code** `string` | 错误码 `content.content.error_code` **type** `string` | 结果类型 `content.content.type` 取值固定为 `web_search_tool_result_error`。 **tool_use_id** `string` | 对应的工具调用 ID `content.tool_use_id` **type** `string` | 内容块类型 `content.type` 取值固定为 `web_search_tool_result`。 **caller** `object` | 服务端调用方 `content.caller` **type** `string` | 标识生成该结果的服务端调用方 `content.caller.type` **id** `string` | 响应对象的唯一标识 **model** `string` | 生成本次响应所使用的模型 **role** `string` | 响应角色 取值固定为 `assistant`。 **type** `string` | 响应对象类型 取值固定为 `message`。 **service_status** `object` | 服务状态信息 **model_fallback** `object` | 模型回退状态 `service_status.model_fallback` **fallback_triggered** `boolean` | 本次请求是否触发了模型回退 `service_status.model_fallback.fallback_triggered` * `true`:本次请求触发了模型回退,实际使用的模型可能与原始请求不同。 * `false`:本次请求未触发模型回退,按原始请求模型处理。 **original_model** `string` | 触发回退前原始请求的模型 `service_status.model_fallback.original_model` **stop_reason** `string` | 模型停止生成 token 的原因 **stop_sequence** `string` | 命中的停止序列 实际触发的自定义停止序列。若未命中,则不返回该字段。 **usage** `object` | 本次请求的用量统计信息 **cache_creation_input_tokens** `integer` | 创建缓存计费的tokens数 `usage.cache_creation_input_tokens` 创建缓存计费的tokens数,当前暂不支持该计费方式,因此该字段返回为0。 **cache_read_input_tokens** `integer` | 从预填充缓存中读取的提示词 token 数 `usage.cache_read_input_tokens` **input_tokens** `integer` | 提示词消耗的 token 数 `usage.input_tokens` **iterations** `object[]` | 每次模型迭代对应的一条 token 用量记录 `usage.iterations` **cache_read_input_tokens** `integer` | 当前模型迭代命中的缓存输入 token 数 `usage.iterations.cache_read_input_tokens` **input_tokens** `integer` | 当前模型迭代消耗的输入 token 数 `usage.iterations.input_tokens` **output_tokens** `integer` | 当前模型迭代生成的输出 token 数 `usage.iterations.output_tokens` **type** `string` | 单次迭代用量记录的类型 `usage.iterations.type` **output_tokens** `integer` | 生成内容消耗的输出 token 数 `usage.output_tokens` **server_tool_use** `object` | 服务端托管工具发起的请求次数统计 `usage.server_tool_use` **web_fetch_requests** `integer` | 服务端托管工具发起的网页抓取请求次数 `usage.server_tool_use.web_fetch_requests` **web_search_requests** `integer` | 服务端托管工具发起的联网搜索请求次数 `usage.server_tool_use.web_search_requests` ### 流式调用响应 **ContentBlockStart** `object` | 内容块开始事件 **content_block** `object` | 内容块起始数据 `ContentBlockStart.content_block` 文本内容块 `object` **text** `string` | 文本内容 `ContentBlockStart.content_block.text` **type** `string` | 内容块类型 `ContentBlockStart.content_block.type` 取值固定为 `text`。 思考内容块 `object` **thinking** `string` | 思考内容 `ContentBlockStart.content_block.thinking` **type** `string` | 内容块类型 `ContentBlockStart.content_block.type` 取值固定为 `thinking`。 **signature** `string` | 用于回放思考内容的不透明签名 `ContentBlockStart.content_block.signature` 当 `type=thinking` 时必填,用于标识并校验该思考内容块。需将该字段与 `thinking` 字段一起完整回传,并保持字段值及内容块顺序不变。 工具调用内容块 `object` **id** `string` | 工具调用 ID `ContentBlockStart.content_block.id` **input** `object` | 工具输入参数 `ContentBlockStart.content_block.input` **name** `string` | 工具名称 `ContentBlockStart.content_block.name` **type** `string` | 内容块类型 `ContentBlockStart.content_block.type` 取值固定为 `tool_use`。 服务端工具调用内容块 `object` **id** `string` | 服务端工具调用 ID `ContentBlockStart.content_block.id` **input** `object` | 工具输入参数 `ContentBlockStart.content_block.input` **name** `string` | 工具名称 `ContentBlockStart.content_block.name` **type** `string` | 内容块类型 `ContentBlockStart.content_block.type` 取值固定为 `server_tool_use`。 联网搜索结果内容块 `object` **content** `object[] / object` | 联网搜索结果内容 `ContentBlockStart.content_block.content` 联网搜索结果列表 `object[]` **encrypted_content** `string` | 加密内容 `ContentBlockStart.content_block.content.encrypted_content` **title** `string` | 结果标题 `ContentBlockStart.content_block.content.title` **type** `string` | 结果类型 `ContentBlockStart.content_block.content.type` 取值固定为 `web_search_result`。 **url** `string` | 结果 URL `ContentBlockStart.content_block.content.url` **page_age** `string` | 页面时效 `ContentBlockStart.content_block.content.page_age` 联网搜索错误结果 `object` **error_code** `string` | 错误码 `ContentBlockStart.content_block.content.error_code` **type** `string` | 结果类型 `ContentBlockStart.content_block.content.type` 取值固定为 `web_search_tool_result_error`。 **tool_use_id** `string` | 对应的工具调用 ID `ContentBlockStart.content_block.tool_use_id` **type** `string` | 内容块类型 `ContentBlockStart.content_block.type` 取值固定为 `web_search_tool_result`。 **caller** `object` | 服务端调用方 `ContentBlockStart.content_block.caller` **type** `string` | 标识生成该结果的服务端调用方 `ContentBlockStart.content_block.caller.type` **index** `integer` | 内容块在消息内容数组中的下标 `ContentBlockStart.index` **type** `string` | 事件类型 `ContentBlockStart.type` 取值固定为 `content_block_start`。 **MessagesErrorResponse** `object` | 错误事件 **error** `object` | 错误详情 `MessagesErrorResponse.error` **code** `string` | 机器可读的错误码 `MessagesErrorResponse.error.code` **message** `string` | 面向用户的错误描述 `MessagesErrorResponse.error.message` **param** `string` | 触发错误的参数名;如果不适用则不返回 `MessagesErrorResponse.error.param` **type** `string` | 错误类型 `MessagesErrorResponse.error.type` **type** `string` | 事件类型 `MessagesErrorResponse.type` 取值固定为 `error`。 > **说明** > > 当前仅 `deepseek-v4-1-flash-261017`、`deepseek-v4-1-flash-economy-261017` 模型支持返回该字段。 **request_id** `string` | 请求 ID `MessagesErrorResponse.request_id` 错误响应对应请求的唯一标识。 > **说明** > > 当前仅 `deepseek-v4-1-flash-261017`、`deepseek-v4-1-flash-economy-261017` 模型支持返回该字段。 **MessagesResponseContentBlock** `object` | 内容块增量事件 **delta** `object` | 内容块增量数据 `MessagesResponseContentBlock.delta` 文本增量 `object` **text** `string` | 本次追加的文本内容 `MessagesResponseContentBlock.delta.text` **type** `string` | 增量类型 `MessagesResponseContentBlock.delta.type` 取值固定为 `text_delta`。 思考内容增量 `object` **thinking** `string` | 本次追加的思考内容 `MessagesResponseContentBlock.delta.thinking` **type** `string` | 增量类型 `MessagesResponseContentBlock.delta.type` 取值固定为 `thinking_delta`。 思考签名增量 `object` **signature** `string` | 本次追加的签名内容 `MessagesResponseContentBlock.delta.signature` **type** `string` | 增量类型 `MessagesResponseContentBlock.delta.type` 取值固定为 `signature_delta`。 工具输入 JSON 增量 `object` **partial_json** `string` | 本次追加的 JSON 片段 `MessagesResponseContentBlock.delta.partial_json` **type** `string` | 增量类型 `MessagesResponseContentBlock.delta.type` 取值固定为 `input_json_delta`。 **index** `integer` | 内容块在消息内容数组中的下标 `MessagesResponseContentBlock.index` **type** `string` | 事件类型 `MessagesResponseContentBlock.type` 取值固定为 `content_block_delta`。 **MessagesResponseContentBlockStop** `object` | 内容块结束事件 **index** `integer` | 内容块在消息内容数组中的下标 `MessagesResponseContentBlockStop.index` **type** `string` | 事件类型 `MessagesResponseContentBlockStop.type` 取值固定为 `content_block_stop`。 **MessagesResponseStreamMessageDelta** `object` | 消息增量事件 **delta** `object` | 消息增量内容 `MessagesResponseStreamMessageDelta.delta` **stop_reason** `string` | 停止原因 `MessagesResponseStreamMessageDelta.delta.stop_reason` **stop_sequence** `object` | 命中的停止序列 `MessagesResponseStreamMessageDelta.delta.stop_sequence` **type** `string` | 事件类型 `MessagesResponseStreamMessageDelta.type` 取值固定为 `message_delta`。 **usage** `object` | 当前增量对应的用量信息 `MessagesResponseStreamMessageDelta.usage` **MessagesResponseStreamMessageStart** `object` | 消息开始事件 **message** `object` | 初始消息对象 `MessagesResponseStreamMessageStart.message` **content** `string[]` | 消息内容块列表 `MessagesResponseStreamMessageStart.message.content` **id** `string` | 消息 ID `MessagesResponseStreamMessageStart.message.id` **model** `string` | 实际使用的模型 `MessagesResponseStreamMessageStart.message.model` **role** `string` | 响应角色 `MessagesResponseStreamMessageStart.message.role` 取值固定为 `assistant`。 **stop_reason** `object` | 停止原因 `MessagesResponseStreamMessageStart.message.stop_reason` **stop_sequence** `object` | 命中的停止序列 `MessagesResponseStreamMessageStart.message.stop_sequence` **type** `string` | 对象类型 `MessagesResponseStreamMessageStart.message.type` 取值固定为 `message`。 **usage** `object` | 当前消息的用量统计 `MessagesResponseStreamMessageStart.message.usage` **service_status** `object` | 服务状态 `MessagesResponseStreamMessageStart.message.service_status` **model_fallback** `object` | 模型回退状态 `MessagesResponseStreamMessageStart.message.service_status.model_fallback` **fallback_triggered** `boolean` | 本次请求是否触发了模型回退 `MessagesResponseStreamMessageStart.message.service_status.model_fallback.fallback_triggered` * `true`:本次请求触发了模型回退,实际使用的模型可能与原始请求不同。 * `false`:本次请求未触发模型回退,按原始请求模型处理。 **original_model** `string` | 触发回退前原始请求的模型 `MessagesResponseStreamMessageStart.message.service_status.model_fallback.original_model` **type** `string` | 事件类型 `MessagesResponseStreamMessageStart.type` 取值固定为 `message_start`。 **MessagesResponseStreamMessageStop** `object` | 消息结束事件 **type** `string` | 事件类型 `MessagesResponseStreamMessageStop.type` 取值固定为 `message_stop`。 ## 代码示例 ## 基础文本对话 ### cURL #### Request ```bash curl https://ark.cn-beijing.volces.com/api/compatible/v1/messages \ -H "Content-Type: application/json" \ -H "x-api-key: $ARK_API_KEY" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "max_tokens": 256, "messages": [ { "role": "user", "content": "请用一句中文解释什么是向量数据库。" } ] }' ``` #### Response ``` { "id": "msg_0217****", "type": "message", "role": "assistant", "content": [ { "type": "text", "text": "向量数据库是一类专门存储、索引并检索向量嵌入的数据系统,常用于语义检索、RAG 和相似度匹配。" } ], "model": "doubao-seed-2-1-pro-260915", "stop_reason": "end_turn", "stop_sequence": null, "usage": { "input_tokens": 31, "output_tokens": 33, "cache_creation_input_tokens": 0, "cache_read_input_tokens": 139 } } ``` ## 流式输出 ### cURL #### Request ```bash curl -N https://ark.cn-beijing.volces.com/api/compatible/v1/messages \ -H "Content-Type: application/json" \ -H "x-api-key: $ARK_API_KEY" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "max_tokens": 256, "stream": true, "messages": [ { "role": "user", "content": "请用一句中文介绍什么是向量数据库。" } ] }' ``` #### Response ``` event: message_start data: {"type":"message_start","message":{"id":"msg_0217****","type":"message","role":"assistant","content":[],"model":"doubao-seed-2-1-pro-260915","stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":31,"output_tokens":0,"cache_creation_input_tokens":0,"cache_read_input_tokens":139}}} event: content_block_start data: {"type":"content_block_start","index":0,"content_block":{"type":"text","text":""}} event: content_block_delta data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"向量数据库是一类用于存储、索引和检索向量嵌入的数据系统。"}} event: content_block_stop data: {"type":"content_block_stop","index":0} event: message_delta data: {"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null},"usage":{"input_tokens":31,"output_tokens":30,"cache_creation_input_tokens":0,"cache_read_input_tokens":139}} event: message_stop data: {"type":"message_stop"} ``` ## 深度思考 ### cURL #### Request ```bash curl https://ark.cn-beijing.volces.com/api/compatible/v1/messages \ -H "Content-Type: application/json" \ -H "x-api-key: $ARK_API_KEY" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "max_tokens": 512, "thinking": { "type": "enabled" }, "output_config": { "effort": "medium" }, "messages": [ { "role": "user", "content": "请比较向量数据库和关系型数据库各自更适合哪些场景。" } ] }' ``` #### Response ``` { "id": "msg_0217****", "type": "message", "role": "assistant", "content": [ { "type": "thinking", "thinking": "用户在比较两类数据库的适用场景,需要先从数据结构、查询方式和典型用途几个维度来拆解。", "signature": "sig_0217****" }, { "type": "text", "text": "向量数据库更适合语义检索、RAG 和相似度匹配;关系型数据库更适合结构化数据存储、事务处理和精确条件查询。" } ], "model": "doubao-seed-2-1-pro-260915", "stop_reason": "end_turn", "stop_sequence": null, "usage": { "input_tokens": 48, "output_tokens": 82, "cache_creation_input_tokens": 0, "cache_read_input_tokens": 139 } } ``` ## 图片理解 ### cURL #### Request ```bash curl https://ark.cn-beijing.volces.com/api/compatible/v1/messages \ -H "Content-Type: application/json" \ -H "x-api-key: $ARK_API_KEY" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "max_tokens": 256, "messages": [ { "role": "user", "content": [ { "type": "image", "source": { "type": "url", "url": "https://arkdocs.tos-cn-beijing.volces.com/images/advanced-usage/view.jpeg" } }, { "type": "text", "text": "请描述这张图片中的主要内容。" } ] } ] }' ``` #### Response ``` { "id": "msg_0217****", "type": "message", "role": "assistant", "content": [ { "type": "text", "text": "图片展示了一名划着橙色皮划艇的人,周围是平静的湖面、树林和远处覆雪的山峰,整体是安静的自然风景。" } ], "model": "doubao-seed-2-1-pro-260915", "stop_reason": "end_turn", "stop_sequence": null, "usage": { "input_tokens": 521, "output_tokens": 47, "cache_creation_input_tokens": 0, "cache_read_input_tokens": 139 } } ``` ## Function Calling ### cURL #### Request ```bash curl https://ark.cn-beijing.volces.com/api/compatible/v1/messages \ -H "Content-Type: application/json" \ -H "x-api-key: $ARK_API_KEY" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "max_tokens": 512, "tool_choice": { "type": "auto" }, "tools": [ { "name": "get_weather", "description": "查询指定城市的天气信息", "input_schema": { "type": "object", "properties": { "location": { "type": "string", "description": "城市名称,例如北京" }, "unit": { "type": "string", "enum": [ "celsius", "fahrenheit" ] } }, "required": [ "location" ], "additionalProperties": false } } ], "messages": [ { "role": "user", "content": "请帮我查询北京今天的天气。" } ] }' ``` #### Response ``` { "id": "msg_0217****", "type": "message", "role": "assistant", "content": [ { "type": "tool_use", "id": "toolu_0217****", "name": "get_weather", "input": { "location": "北京", "unit": "celsius" } } ], "model": "doubao-seed-2-1-pro-260915", "stop_reason": "tool_use", "stop_sequence": null, "usage": { "input_tokens": 146, "output_tokens": 28, "cache_creation_input_tokens": 0, "cache_read_input_tokens": 139 } } ``` ## 结构化输出 ### cURL #### Request ```bash curl https://ark.cn-beijing.volces.com/api/compatible/v1/messages \ -H "Content-Type: application/json" \ -H "x-api-key: $ARK_API_KEY" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "max_tokens": 256, "output_format": { "type": "json_schema", "schema": { "type": "object", "properties": { "name": { "type": "string", "description": "书名" }, "author": { "type": "string", "description": "作者" }, "tags": { "type": "array", "items": { "type": "string" }, "description": "标签" } }, "required": [ "name", "author", "tags" ], "additionalProperties": false } }, "messages": [ { "role": "user", "content": "请将《三体》整理为 JSON,包含 name、author、tags 三个字段。" } ] }' ``` #### Response ``` { "id": "msg_0217****", "type": "message", "role": "assistant", "content": [ { "type": "text", "text": "{\"name\":\"三体\",\"author\":\"刘慈欣\",\"tags\":[\"科幻\",\"长篇小说\"]}" } ], "model": "doubao-seed-2-1-pro-260915", "stop_reason": "end_turn", "stop_sequence": null, "usage": { "input_tokens": 58, "output_tokens": 25, "cache_creation_input_tokens": 0, "cache_read_input_tokens": 139 } } ``` --- # 统计 Messages 请求 token 数 Source: https://ark.volcengine.com/region:cn-beijing/docs/messages-count-tokens-api `POST https://ark.cn-beijing.volces.com/api/compatible/v1/messages/count_tokens` 统计 Messages 请求的输入 token 数,可用于请求预估、配额控制和成本测算。实际用量以真实请求结果为准。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Body 参数 **messages** `object[]` `必选` | 消息列表 **role** `string` `必选` | 角色 `messages.role` 输入消息的角色,决定指令的优先级层级。可选值:`user`、`system`、`assistant`、`developer`。 **content** `string / object[] / null` | 消息内容 `messages.content` 对于 `user` 和 `assistant` 角色,省略、传入 `null` 或传入空数组时,服务端会按空字符串处理。对于其他角色,服务端要求传入该字段,但可以传入 `null`。 纯文本消息内容 `string` 结构化消息内容 `object[]` 文本内容块 `object` **text** `string` `必选` | 文本内容 `messages.content.text` **type** `string` `必选` | 内容块类型 `messages.content.type` 取值固定为 `text`。 思考内容块 `object` **type** `string` `必选` | 内容块类型 `messages.content.type` 取值固定为 `thinking`。 **signature** `string` | 用于回放思考内容的不透明签名 `messages.content.signature` 当 `type=thinking` 时必填,用于标识并校验该思考内容块。需将该字段与 `thinking` 字段一起完整回传,并保持字段值及内容块顺序不变。 **thinking** `string` | 模型的思考内容 `messages.content.thinking` 图片内容块 `object` **source** `object` `必选` | 图片来源 `messages.content.source` **type** `string` `必选` | 图片传入方式 `messages.content.source.type` * `type=url`:`url` 为必填。 * `type=base64`:`data` 和 `media_type` 为必填。 **data** `string` | 图片数据 `messages.content.source.data` 当 `type=base64` 时传入。 **media_type** `string` | 媒体类型 `messages.content.source.media_type` 当 `type=base64` 时,与 `data` 一起传入。 **url** `string` | 图片 URL `messages.content.source.url` 当 `type=url` 时传入。 **type** `string` `必选` | 内容块类型 `messages.content.type` 取值固定为 `image`。 文档内容块 `object` **source** `object` `必选` | 文档来源 `messages.content.source` **type** `string` `必选` | 文档传入方式 `messages.content.source.type` 支持通过 `url`、`base64`、`text` 或 `content` 四种方式传入文档。 * `type=url`:`url` 为必填。 * `type=base64` 或 `type=text`:`data` 为必填。 * `type=content`:`content` 为必填。 **content** `string / object[]` | 文档内容 `messages.content.source.content` 当 `type=content` 时传入。 该字段支持递归嵌套。为避免重复展示,此处不再继续展开。 **data** `string` | 文档数据 `messages.content.source.data` 当 `type` 为 `base64` 或 `text` 时传入。 **url** `string` | 文档 URL `messages.content.source.url` 当 `type=url` 时传入。 **type** `string` `必选` | 内容块类型 `messages.content.type` 取值固定为 `document`。 工具调用内容块 `object` **input** `object` `必选` | 模型为该工具生成的输入参数 `messages.content.input` **name** `string` `必选` | 被调用的工具名称 `messages.content.name` **type** `string` `必选` | 内容块类型 `messages.content.type` 取值固定为 `tool_use`。 **id** `string / null` | 工具调用的 ID `messages.content.id` 省略、传入 `null` 或传入空字符串时,服务端会兼容处理。 工具结果内容块 `object` **type** `string` `必选` | 内容块类型 `messages.content.type` 取值固定为 `tool_result`。 **content** `string / object[] / null` | 工具返回的内容 `messages.content.content` 省略或传入 `null` 时,服务端会按空字符串处理。 纯文本工具结果 `string` 结构化工具结果 `object[]` 文本内容块 `object` **text** `string` `必选` | 文本内容 `messages.content.content.text` **type** `string` `必选` | 内容块类型 `messages.content.content.type` 取值固定为 `text`。 图片内容块 `object` **source** `object` `必选` | 图片来源 `messages.content.content.source` **type** `string` `必选` | 图片传入方式 `messages.content.content.source.type` * `type=url`:`url` 为必填。 * `type=base64`:`data` 和 `media_type` 为必填。 **data** `string` | 图片数据 `messages.content.content.source.data` 当 `type=base64` 时传入。 **media_type** `string` | 媒体类型 `messages.content.content.source.media_type` 当 `type=base64` 时,与 `data` 一起传入。 **url** `string` | 图片 URL `messages.content.content.source.url` 当 `type=url` 时传入。 **type** `string` `必选` | 内容块类型 `messages.content.content.type` 取值固定为 `image`。 工具引用内容块 `object` **tool_name** `string` `必选` | 引用的工具名称 `messages.content.content.tool_name` **type** `string` `必选` | 内容块类型 `messages.content.content.type` 取值固定为 `tool_reference`。 空值工具结果 `null` **tool_use_id** `string / null` | 该结果所对应的工具调用 ID `messages.content.tool_use_id` 省略、传入 `null` 或传入空字符串时,服务端会兼容处理。 服务端工具调用内容块 `object` **id** `string` `必选` | 服务端托管工具调用的公开 ID `messages.content.id` **input** `object` `必选` | 模型为该工具生成的输入参数 `messages.content.input` **name** `string` `必选` | 被调用的服务端托管工具名称 `messages.content.name` **type** `string` `必选` | 内容块类型 `messages.content.type` 取值固定为 `server_tool_use`。 联网搜索结果内容块 `object` **content** `object[] / object` `必选` | 联网搜索结果内容 `messages.content.content` 联网搜索结果列表 `object[]` **encrypted_content** `string` `必选` | 加密内容 `messages.content.content.encrypted_content` **title** `string` `必选` | 结果标题 `messages.content.content.title` **type** `string` `必选` | 结果类型 `messages.content.content.type` 取值固定为 `web_search_result`。 **url** `string` `必选` | 结果 URL `messages.content.content.url` **page_age** `string` | 页面时效 `messages.content.content.page_age` 联网搜索错误结果 `object` **error_code** `string` `必选` | 错误码 `messages.content.content.error_code` **type** `string` `必选` | 结果类型 `messages.content.content.type` 取值固定为 `web_search_tool_result_error`。 **tool_use_id** `string` `必选` | 该结果所对应的服务端工具调用 ID `messages.content.tool_use_id` **type** `string` `必选` | 内容块类型 `messages.content.type` 取值固定为 `web_search_tool_result`。 **caller** `object` | 服务端调用方 `messages.content.caller` **type** `string` `必选` | 标识生成该结果的服务端调用方 `messages.content.caller.type` 空值消息内容 `null` **model** `string` `必选` | 模型 ID 本次请求调用的模型 ID(Model ID),用于指定处理输入内容的模型。 > **说明** > > - 开通模型服务并查询 Model ID,请参见 [模型列表](/docs/model-list)。 > - 若需要多个应用分别调用模型服务或做更细粒度的权限管理,可改传 Endpoint ID(在线推理接入点的 ID),详细请参考 [获取 Endpoint ID](/docs/online-inference-standard)。 **max_tokens** `integer` | 最大输出 token 数 **output_config** `object` | 输出配置 **effort** `string` | 思考深度 `output_config.effort` 限制思考的工作量。减少思考深度可提升速度,思考花费的 token 更少。 * `none`:关闭思考。 * `minimal`:关闭思考,直接回答。 * `low`:轻量思考,侧重快速响应。 * `medium`:均衡模式,兼顾速度与深度。 * `high`:深度分析,处理复杂问题。 * `xhigh`:更高程度思考。 * `max`:最高程度思考,适配高难度推理任务。 > **注意:说明** > > 支持该字段的模型、默认取值、参数兼容映射规则,以及与 `thinking.type` 字段的关系,详见 [文档](/docs/deep-thinking)。 **output_format** `object` | 输出格式 **type** `string` `必选` | 输出格式类型 `output_format.type` 支持 `text`、`json_object` 和 `json_schema` 三种输出格式。 * `text`:返回文本格式结果。 * `json_object`:返回 JSON 对象格式结果。 * `json_schema`:按 JSON Schema 约束返回结果,此时 `schema` 为必填。 **schema** `object` | JSON Schema `output_format.schema` 当 `type=json_schema` 时传入。 **service_tier** `string` `默认值 default` | 推理模式 控制使用的在线推理模式。 - `default`:使用 [在线推理(常规)](/docs/online-inference-standard)。 - `flex`:使用 [在线推理(低优)](/docs/online-inference-flex)。 **stop_sequences** `string / string[]` | 停止序列 支持传入单个字符串,或最多 `4` 个停止序列。 **stream** `boolean` | 响应内容是否流式返回 * `true`:按 SSE 协议逐块返回模型生成内容。 * `false`:模型生成完成后一次性返回结果。 **system** `string / object[]` | 系统提示词 支持直接传字符串,或传由 `text` 内容块组成的数组。 纯文本系统提示词 `string` 结构化系统提示词 `object[]` **text** `string` `必选` | 文本内容 `system.text` **type** `string` `必选` | 内容块类型 `system.type` 取值固定为 `text`。 **temperature** `number` | 采样温度 **取值范围**:`[0, 2]` **thinking** `object` | 深度思考配置 **type** `string` `必选` | 思考模式 `thinking.type` * `disabled`:关闭深度思考。 * `enabled`:开启深度思考。 * `adaptive`:由模型自动决定是否开启深度思考。 **tool_choice** `object` | 工具调用策略 配置 `tools` 后再设置该参数。 自动选择是否调用工具 `object` **type** `string` `必选` | 策略类型 `tool_choice.type` 取值固定为 `auto`。 **disable_parallel_tool_use** `boolean` | 是否禁用并行工具调用 `tool_choice.disable_parallel_tool_use` * `true`:模型在同一轮中不会并行调用多个工具。 * `false`:模型可在同一轮中并行调用多个工具。 当前不保证一定会调用工具,不同模型的保障效果不同 `object` **type** `string` `必选` | 策略类型 `tool_choice.type` 取值固定为 `any`。 **disable_parallel_tool_use** `boolean` | 是否禁用并行工具调用 `tool_choice.disable_parallel_tool_use` * `true`:模型在同一轮中不会并行调用多个工具。 * `false`:模型可在同一轮中并行调用多个工具。 不调用工具 `object` **type** `string` `必选` | 策略类型 `tool_choice.type` 取值固定为 `none`。 强制调用指定工具 `object` **name** `string` `必选` | 模型必须调用的工具名称 `tool_choice.name` **type** `string` `必选` | 策略类型 `tool_choice.type` 取值固定为 `tool`。 **disable_parallel_tool_use** `boolean` | 是否禁用并行工具调用 `tool_choice.disable_parallel_tool_use` * `true`:模型在同一轮中不会并行调用多个工具。 * `false`:模型可在同一轮中并行调用多个工具。 **tools** `object[]` | 工具列表 用户自定义工具 `object` **name** `string` `必选` | 工具名称 `tools.name` **description** `string` | 工具说明 `tools.description` 描述工具的用途以及模型应在何时调用。 **input_schema** `object` | 工具输入 Schema `tools.input_schema` 服务端工具 `object` 当前仅支持原生联网搜索 `web_search`。 **type** `string` `必选` | 工具类型 `tools.type` 兼容 Anthropic 原生 Web Search 工具的版本化类型值。例如:`web_search_20250305`。 具体可用版本请参见 [Anthropic Web Search 工具文档](https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-search-tool)。 **name** `string` | 工具名称 `tools.name` 当前服务端工具可填写 `web_search`。 **max_uses** `integer` | 最大调用次数 `tools.max_uses` **allowed_domains** `string[]` | 允许访问的域名列表 `tools.allowed_domains` **blocked_domains** `string[]` | 禁止访问的域名列表 `tools.blocked_domains` **user_location** `object` | 用户位置信息 `tools.user_location` 当前传入该参数会被忽略,不生效。 **top_p** `number` | 核采样概率 **取值范围**:`[0, 1]` ## 响应参数 **input_tokens** `integer` | 输入消息对应的 token 数 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl https://ark.cn-beijing.volces.com/api/compatible/v1/messages/count_tokens \ -H "Content-Type: application/json" \ -H "x-api-key: $ARK_API_KEY" \ -d '{ "model": "doubao-seed-2-1-pro-260915", "system": "You are a scientist.", "messages": [ { "role": "user", "content": "Hello, Ark" } ] }' ``` #### Response ``` { "input_tokens": 23 } ``` --- # System One API(beta) Source: https://ark.volcengine.com/region:cn-beijing/docs/system-one-api `POST https://ark.cn-beijing.volces.com/api/v1/systemone` 调用 System One API 对同一份输入执行一组结构化判定问题,并同步返回与问题 ID 对应的答案。该接口不支持流式输出。 > **说明** > > System One API 当前支持最大 128k 上下文窗口,单次请求中的 `state` 和 `questions` 共同占用上下文窗口。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Header 参数 > 在 HTTP 请求头中传入。 > **注意** > > System One API 当前处于 beta 测试阶段。调用该接口时,必须在 HTTP 请求头中传入 `ark-beta-systemone-api: true`。 **ark-beta-systemone-api** `string` `必选` | System One API 标识 调用 System One API 时,需将该请求头设置为 `true`。 ### Body 参数 **model** `string` `必选` | 模型 ID 本次评估使用的模型 ID 或推理接入点 ID,不可为空或仅包含空白字符。 当前支持的模型为 `doubao-seed-2-1-lite-260915`。 **questions** `object` `必选` | 问题集合 以自定义问题 ID 为键提交 `noul`、`choice`、`score` 三类可混用的问题配置。 > **说明** > > - `questions` 至少包含 1 个问题,各问题共享同一份 `state`,并独立评估。 > - 问题 ID 仅用于关联请求与响应,不参与模型评估。响应顺序不保证与请求顺序一致,请按问题 ID 读取对应结果。 **key** `object` `必选` | 问题配置 `questions.key` 调用方自定义问题 ID 对应的评估问题配置;每道问题均针对同一 `state` 独立评估。 是非判断 `object` 判断命题是否成立。 **type** `string` `必选` | 问题类型 `questions.key.type` 指定问题的类型。 取值固定为 `noul`。 **criteria** `object` | 结果说明 `questions.key.criteria` 为 `noul` 问题配置“是”和“否”两种结果的说明。`criteria` 不能传入 `null`;省略 `criteria` 或传入空对象时,表示不补充自定义结果说明。 **false** `string / object / array / null` | “否”说明 `questions.key.criteria.false` 回答为“否”时使用的结果说明。 **true** `string / object / array / null` | “是”说明 `questions.key.criteria.true` 回答为“是”时使用的结果说明。 **instructions** `string / object / array / null` | 判断指令 `questions.key.instructions` 定义本题的判断目标、范围和依据。省略或传入 `null` 时,模型使用默认判断方式。 分类选择 `object` 从调用方提供的候选选项中选择一项。 **criteria** `object` `必选` | 候选选项 `questions.key.criteria` 定义候选选项名称到选项说明的映射;选项名称参与模型推理。 > **注意** > > `criteria` 支持配置 `[1, 255]` 个候选选项。重复的 JSON 属性名以后一个值为准,建议使用唯一选项名。 **key** `string / object / array / null` `必选` | 选项说明 `questions.key.criteria.key` 用于帮助模型理解对应选项含义的说明内容。 **type** `string` `必选` | 问题类型 `questions.key.type` 指定问题的类型。 取值固定为 `choice`。 **instructions** `string / object / array / null` | 判断指令 `questions.key.instructions` 定义本题的判断目标、范围和依据。省略或传入 `null` 时,模型使用默认判断方式。 评分判断 `object` 根据调用方提供的有序评分档位进行评分判断。 **criteria** `string / object / array[]` `必选` | 评分标准 `questions.key.criteria` 定义按程度从低到高排列的评分档位标准,数组位置决定从 `0` 开始的档位编号。 > **注意** > > `criteria` 支持配置 `[1, 10]` 个评分档位。 **type** `string` `必选` | 问题类型 `questions.key.type` 指定问题的类型。 取值固定为 `score`。 **instructions** `string / object / array / null` | 判断指令 `questions.key.instructions` 定义本题的判断目标、范围和依据。省略或传入 `null` 时,模型使用默认判断方式。 **state** `string / object / string[] / object[]` `必选` | 评估内容 待评估内容,支持单个字符串、字符串数组、任意 JSON 对象或多模态内容对象数组。所有问题均基于同一份内容独立评估。 > **注意** > > 仅支持字符串数组或对象数组,不能混用字符串和对象,也不能包含数字、布尔值、`null` 或嵌套数组。空数组按文本输入处理。 单个字符串 `string` 单段纯文本。 JSON 对象 `object` 带自定义字段的结构化纯文本对象,允许嵌套值和显式 null 成员。 字符串数组 `string[]` 多段纯文本组成的字符串数组。 多模态数组 `object[]` 由文本、图片、视频或音频元素组成的多模态对象数组。 文本 `object` 文本内容元素。 **text** `string / string[] / object` `必选` | 文本内容 `state.text` 原生文本评估内容,支持字符串、仅包含字符串的数组或任意 JSON 对象。 **type** `string` `必选` | 内容类型 `state.type` 指定多模态内容的类型。 取值固定为 `text`。 图片 `object` 图片内容元素。 **type** `string` `必选` | 内容类型 `state.type` 指定多模态内容的类型。 取值固定为 `image`。 **detail** `string` `默认值 high` | 图片精细度 `state.detail` 指定图片输入的处理精细程度。可选值:`low`、`high`。 > **说明** > > 同时设置 `detail` 和 `image_pixel_limit` 时,以 `image_pixel_limit` 为准。 **file_id** `string` | 图片文件 ID `state.file_id` 通过图片文件 ID 提供待评估图片。与 `image_url` 必须且只能填写一个。 **image_pixel_limit** `object` | 像素限制 `state.image_pixel_limit` 设置图片下游处理的像素数量范围。与 `detail` 同时设置时,服务端使用 `image_pixel_limit`。 > **说明** > > 同时传入 `min_pixels` 和 `max_pixels` 时,`min_pixels` 不能大于 `max_pixels`。 **max_pixels** `integer` | 最大像素数 `state.image_pixel_limit.max_pixels` 指定图片处理的最大像素数。 **最小值**:`1` **min_pixels** `integer` | 最小像素数 `state.image_pixel_limit.min_pixels` 指定图片下游处理的最小像素数。 **最小值**:`1` **image_url** `string` | 图片地址 `state.image_url` 通过公网 URL 或 Base64 数据 URL 提供待评估图片。与 `file_id` 必须且只能填写一个。 视频 `object` 视频内容元素。 **type** `string` `必选` | 内容类型 `state.type` 指定多模态内容的类型。 取值固定为 `video`。 **file_id** `string` | 视频文件 ID `state.file_id` 通过视频文件 ID 提供待评估视频。与 `video_url` 必须且只能填写一个。 **fps** `number` `默认值 1.0` | 采样帧率 `state.fps` 指定视频帧采样频率,单位为帧/秒。 **取值范围**:`[0.2, 5]` **video_url** `string` | 视频地址 `state.video_url` 通过公网 URL 或 Base64 数据 URL 提供待评估视频。与 `file_id` 必须且只能填写一个。 音频 `object` 音频内容元素。 **type** `string` `必选` | 内容类型 `state.type` 指定多模态内容的类型。 取值固定为 `audio`。 **audio_url** `string` | 音频地址 `state.audio_url` 通过公网 URL 或 Base64 输入提供待评估音频。与 `file_id` 必须且只能填写一个。 **file_id** `string` | 音频文件 ID `state.file_id` 通过音频文件 ID 提供待评估音频。与 `audio_url` 必须且只能填写一个。 ## 响应参数 ### 响应头参数 > 在 HTTP 响应头中返回。 **X-Request-Id** `string` `必选` | 请求标识 成功响应的请求标识,用于排查和追踪请求;该字段通过 HTTP 响应头返回,不会出现在成功响应 JSON 中。 ### 响应体参数 **answers** `object` | 答案集合 按问题 ID 返回评估答案的映射。属性名与请求 `questions` 中的问题 ID 完全一致,属性值类型与对应问题类型一致。 **key** `object` | 评估答案 `answers.key` 请求 `questions` 中同名问题 ID 对应的评估答案;答案类型与对应问题的类型一致。 是非判断 `object` 是非判断结果。 **noul** `number` | 是的概率 `answers.key.noul` 结果符合 `criteria.true` 的概率。省略 `criteria` 时,表示判断条件成立的概率。 > **说明** > > 接近 `0.5` 表示模型不确定,不表示程度中等。`noul` 类型不返回 `confidence` 或 `probabilities`。 **取值范围**:`[0, 1]` **type** `string` | 回答类型 `answers.key.type` 指定回答结果的类型。 取值固定为 `noul`。 分类选择 `object` 分类选择结果。 **choice** `string` | 选择结果 `answers.key.choice` 概率最高的选项名称,取值来自请求 `criteria` 的属性名。 **confidence** `number` | 结果置信度 `answers.key.confidence` 模型返回的选择结果置信度。 **取值范围**:`[0, 1]` **probabilities** `object` | 选项概率 `answers.key.probabilities` 各候选选项到对应概率的映射。 > **说明** > > 该映射包含概率为 `0` 的选项;各项概率之和约为 `1`,可能存在浮点误差。 **key** `number` | 单项概率 `answers.key.probabilities.key` 对应候选选项的预测概率。 **取值范围**:`[0, 1]` **type** `string` | 回答类型 `answers.key.type` 指定回答结果的类型。 取值固定为 `choice`。 评分判断 `object` 评分判断结果。 **confidence** `number` | 结果置信度 `answers.key.confidence` 模型返回的评分判断结果置信度。 **取值范围**:`[0, 1]` **legend** `object` | 评分档位 `answers.key.legend` 使用从 `0` 开始的字符串编号,将各评分档位映射到请求 `criteria` 中对应的原始内容,并保留其字符串、对象或数组形态。 **key** `string / object / array` | 档位说明 `answers.key.legend.key` 对应评分档位的原始 `criteria` 内容,保留字符串、对象或数组形态及嵌套 JSON。 **probabilities** `object` | 档位概率 `answers.key.probabilities` 各评分档位对应的预测概率映射。 > **说明** > > 键为从 `0` 到 `N-1` 的评分档位编号,包含概率为 `0` 的档位;各项概率之和约为 `1`,可能存在浮点误差。 **key** `number` | 档位概率 `answers.key.probabilities.key` 对应评分档位的预测概率。 **取值范围**:`[0, 1]` **score** `number` | 期望分数 `answers.key.score` 各评分档位编号按对应预测概率加权求和得到的期望分数。结果支持小数,且不做归一化。 > **说明** > > 实际最大值由请求 `criteria` 的档位数 N 决定,为 N−1;该值不是概率最高档位的编号。 **取值范围**:`[0, 9]` **type** `string` | 回答类型 `answers.key.type` 指定回答结果的类型。 取值固定为 `score`。 **model** `string` | 模型 ID 执行本次评估的模型 ID。 **usage** `object` | token 用量 本次评估的 token 用量信息,包含输入 token 数和输出 token 数。 **input_tokens** `integer` | 输入 token 数 `usage.input_tokens` 本次评估请求消耗的输入 token 数量。 **最小值**:`0` **output_tokens** `integer` | 输出 token 数 `usage.output_tokens` 本次评估响应生成的输出 token 数量。取值固定为 `0`。 **最小值**:`0` ## 代码示例 ## 是非判断 ### cURL #### Request ```bash curl "https://ark.cn-beijing.volces.com/api/v1/systemone" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "ark-beta-systemone-api: true" \ -d '{ "model": "doubao-seed-2-1-lite-260915", "state": "客户反馈:收到的杯子裂了,请退回货款。", "questions": { "refund_requested_v1": { "type": "noul", "instructions": "客户是否明确要求退款?", "criteria": { "true": "客户明确提出退款、退回货款或拒绝换货。", "false": "客户未提出退款诉求,或仅咨询商品、物流、售后政策。" } } } }' ``` #### Response ``` { "model": "doubao-seed-2-1-lite-260915", "answers": { "refund_requested_v1": { "type": "noul", "noul": 0.96 } }, "usage": { "input_tokens": 76, "output_tokens": 0 } } ``` ## 分类选择 ### cURL #### Request ```bash curl "https://ark.cn-beijing.volces.com/api/v1/systemone" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "ark-beta-systemone-api: true" \ -d '{ "model": "doubao-seed-2-1-lite-260915", "state": "客户反馈:收到的杯子有裂纹,申请退款,不接受换货。", "questions": { "routing_team_v1": { "type": "choice", "instructions": "根据客户反馈的主要问题选择优先处理团队。", "criteria": { "财务": "扣款、发票或退款到账问题。", "质量": "商品损坏、质量缺陷或与描述不符。", "物流": "配送延迟、丢件或物流状态问题。", "信息不足": "缺少判断主要问题所需的信息。" } } } }' ``` #### Response ``` { "model": "doubao-seed-2-1-lite-260915", "answers": { "routing_team_v1": { "type": "choice", "choice": "质量", "confidence": 0.91, "probabilities": { "财务": 0.04, "质量": 0.91, "物流": 0.02, "信息不足": 0.03 } } }, "usage": { "input_tokens": 113, "output_tokens": 0 } } ``` ## 评分判断 ### cURL #### Request ```bash curl "https://ark.cn-beijing.volces.com/api/v1/systemone" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "ark-beta-systemone-api: true" \ -d '{ "model": "doubao-seed-2-1-lite-260915", "state": "客户反馈:退款金额一直不到账,我已经准备向监管平台投诉。", "questions": { "risk_level_v1": { "type": "score", "instructions": "该工单的处理风险等级是多少?", "criteria": [ "风险较低,不涉及资金、合规或客户投诉。", "存在一定风险,需要补充材料或人工确认。", "风险较高,涉及资金损失、投诉升级或合规问题。" ] } } }' ``` #### Response ``` { "model": "doubao-seed-2-1-lite-260915", "answers": { "risk_level_v1": { "type": "score", "score": 1.82, "confidence": 0.88, "probabilities": { "0": 0.03, "1": 0.12, "2": 0.85 }, "legend": { "0": "风险较低,不涉及资金、合规或客户投诉。", "1": "存在一定风险,需要补充材料或人工确认。", "2": "风险较高,涉及资金损失、投诉升级或合规问题。" } } }, "usage": { "input_tokens": 121, "output_tokens": 0 } } ``` --- # 上传文件 Source: https://ark.volcengine.com/region:cn-beijing/docs/upload-files-api `POST https://ark.cn-beijing.volces.com/api/v3/files` 上传文件到方舟平台,供后续模型调用作为输入(如图像、视频、文档等)。文件在一定时间后过期删除。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Body 参数 **file** `object` `必选` | 上传的文件 需要上传的文件,要求为二进制文件。具体限制请参见 Files API 教程 > **说明:注意** > > 文件上传支持二进制文件和文件 URL 两种传入方式,`file`、`url` 为二选一必填参数,不可同时传参。 **purpose** `string` `必选` | 文件用途 文件用途。 - `user_data`:可以灵活使用的文件,能够用于任意用途。 - `agent`:智能体(Agent)场景使用的文件。 **url** `string` | 文件 URL 文件 URL,支持以下两种 URL 类型: - HTTP/HTTPS URL:公网可直接访问的文件 URL,请确保文件 URL 可被访问。 - TOS URI:对象存储 TOS 专属的资源定位标识,格式为 `tos:////`。其中,``、`` 和 `` 分别表示存储桶名称、存储路径和文件名。详细使用说明可参考 [TOS URI 上传方式](/docs/file-api#tos-uri-upload) 部分,也可前往 [火山引擎对象存储 TOS Bucket](https://console.volcengine.com/tos/bucket?projectName=default) 中管理存储桶。 > **说明:注意** > > - 文件上传支持二进制文件和文件 URL 两种传入方式,`file`、`url` 为二选一必填参数,不可同时传参。 > > - 传入 TOS URI 时,必须将文件存储到火山引擎对象存储 TOS Bucket 中,此时 `tos.bucket`、`tos.prefix` 为必填参数。 **tos** `object` | TOS 存储配置 文件存储的 TOS 信息。TOS 即火山引擎对象存储服务;配置本参数后,上传文件将存储至用户指定的火山引擎对象存储 TOS Bucket 中,不再存入方舟平台默认托管存储空间。 > **说明** > > - 不传 `tos` 参数:文件存储在方舟平台托管的默认存储空间,单文件不超过 512 MB。已存入方舟平台托管存储的历史文件,不会自动迁移至其他存储位置。 > > - 传 `tos` 参数:文件存储在用户指定的火山引擎对象存储 TOS Bucket 中,视频文件不超过 2 GB,其他类型文件不超过 512 MB,支持格式详见 [文件类型](/docs/file-api#81920512)。授权写入用户指定 TOS Bucket 中的文件,不支持在 TOS 侧删除或修改;如需删除文件,可调用 Files API 删除,参考 [删除文件](/docs/delete-files-api)。 **bucket** `string` | 存储桶名称 `tos.bucket` 目标文件待写入的 TOS 存储桶名称,该存储桶需提前完成创建,参考 [创建存储桶](https://docs.volcengine.com/docs/6349/75024?lang=zh)。 **prefix** `string` | 存储路径前缀 `tos.prefix` 文件在目标 TOS 存储桶内的存放前缀路径,入参填写相对路径格式,上传后文件将落地至该前缀目录下。示例:`arkfiles/`。 **preprocess_configs** `object` | 预处理配置 用于设置不同文件类型的预处理规则。 **video** `object` | 视频预处理配置 `preprocess_configs.video` 视频预处理相关配置。 > **说明** > > 配置 `model` 字段后,系统将根据对应模型的抽帧策略,自动填充 `max_video_tokens`、`min_frame_tokens`、`max_frame_tokens`、`min_frames` 四个字段的默认值,具体取值参考 [模型抽帧策略说明](/docs/video-understanding#203baa92)。 **fps** `number` `默认值 1` | 抽帧帧率 `preprocess_configs.video.fps` 每秒钟从视频中抽取指定数量的图像。取值越高,对于视频中画面变化理解越精细;取值越低,对于视频中画面变化感知减弱,但是使用的 token 花费少,速度也更快。 > **说明:注意** > > 取值范围:`[0.2, 5]`。单视频 token 用量范围在 `[10k, 80k]`。 **取值范围**:`[0.2, 5]` **model** `string` | 预处理模型 `preprocess_configs.video.model` 使用该文件进行推理时,要使用的视频理解模型 ID(Model ID)或 Endpoint ID。 > **说明** > > Files API 中设置的模型 ID 与推理使用的模型 ID 不强耦合,只影响上传视频文件时预处理抽帧策略。关于预处理抽帧策略,参见 [抽帧策略](/docs/video-understanding#203baa92)。 > > - 传入模型 ID:传入不同的模型 ID 会采用不同的抽帧策略。 > - 传入 Endpoint ID:会按照上传时 Endpoint ID 映射的模型对应的抽帧策略进行抽帧。 > - 不传该参数时:默认采用 `doubao-seed-1.8` 之前的模型对应的抽帧策略。 > **说明:注意** > > 如需处理视频中的音频内容,该字段需指定为支持音频理解的模型,具体支持的模型可参见 [模型列表](/docs/model-list#9619c0ba)。 **max_video_tokens** `integer` | 视频最大 tokens 数 `preprocess_configs.video.max_video_tokens` 视频最大 tokens 数,值越大保留的视频信息越多。 **取值范围**:`[10240, 204800]` **min_frame_tokens** `integer` | 单帧最小 tokens 数 `preprocess_configs.video.min_frame_tokens` 单帧最小 tokens 数,用于控制单帧压缩的下限。值越小,允许对单帧进行更大的压缩,但单帧细节下降。 **取值范围**:`[16, 128]` **max_frame_tokens** `integer` | 单帧最大 tokens 数 `preprocess_configs.video.max_frame_tokens` 单帧最大 tokens 数,用于控制单帧质量的上限。值越大,允许对单帧保留更多的细节。 **取值范围**:`[128, 640]` **min_frames** `integer` | 最小抽帧数 `preprocess_configs.video.min_frames` 最小抽帧数,用于保证短视频具备足够的处理帧数。若 `fps` 字段抽帧总数小于 `min_frames`,则优先按照 `min_frames` 配置要求抽帧。 **取值范围**:`[5, 16]` **expire_at** `integer` | 文件过期时间 设置存储的有效期,需要传入 UTC Unix 时间戳(单位:秒)。最少保留 1 天,最多保留 30 天;不传时默认保留 7 天(当前时刻 + 604800) > **说明:注意** > > 取值范围:`[当前时刻+86400, 当前时刻+2592000]`,即最少保留 1 天,最多保留 30 天。不传时默认保留 7 天(当前时刻 + 604800)。 ## 响应参数 **object** `string` | 对象类型 对象类型,固定为 `file`。 **id** `string` | 文件 ID 文件的唯一标识符。 **purpose** `string` | 文件用途 文件用途。 - `user_data`:可以灵活使用的文件,能够用于任意用途。 - `agent`:智能体(Agent)场景使用的文件。 **scope** `object` | 文件所属作用域信息 文件所属作用域信息,用于标识该文件创建时归属的会话上下文。 **type** `string` | 作用域类型 `scope.type` 作用域类型,当前固定取值为 `session`。 **id** `string` | 作用域 ID `scope.id` 作用域 ID,返回对应的会话 ID。 **filename** `string` | 文件名 **tos** `object` | 文件存储的 TOS 信息 文件存储的 TOS 信息。TOS 即火山引擎对象存储服务,仅当用户传入 `tos` 参数时才会返回。 **bucket** `string` | 目标文件待写入的 TOS 存储桶名称 `tos.bucket` **object_key** `string` | 文件存储在 TOS 中的路径信息 `tos.object_key` **bytes** `integer` | 文件大小 文件大小,以 bytes 为单位。 **created_at** `integer` | 创建时间 本次请求上传文件时的 Unix 时间戳(秒)。 **expire_at** `integer` | 过期时间 文件过期时间的 Unix 时间戳(秒)。 **mime_type** `string` | MIME 类型 文件的 MIME 类型,如 `application/pdf`。 **status** `string` | 文件处理状态 文件处理状态。 - `processing`:文件正在预处理,无法使用。 - `active`:文件已处理完成,可以使用。 - `failed`:文件上传失败,错误详情查看 `error` 字段。 **error** `object` | 错误信息 文件上传失败时返回的错误对象,即 `status` 取值为 `failed` 时才会返回该字段。 **code** `string` | 错误码 `error.code` **message** `string` | 错误描述信息 `error.message` **preprocess_configs** `object` | 预处理配置 用于设置不同文件类型的预处理规则。 **video** `object` | 视频预处理配置 `preprocess_configs.video` 视频预处理相关配置。 **fps** `number` | 抽帧帧率 `preprocess_configs.video.fps` 每秒钟从视频中抽取指定数量的图像。取值越高,对于视频中画面变化理解越精细;取值越低,对于视频中画面变化感知减弱,但是使用的 token 花费少,速度也更快。 > **说明:注意** > > 取值范围:`[0.2, 5]`。单视频 token 用量范围在 `[10k, 80k]`。 **取值范围**:`[0.2, 5]` **model** `string` | 预处理模型 `preprocess_configs.video.model` 使用该文件进行推理时,要使用的视频理解模型 ID(Model ID)或 Endpoint ID。 > **说明** > > Files API 中设置的模型 ID 与推理使用的模型 ID 不强耦合,只影响上传视频文件时预处理抽帧策略。关于预处理抽帧策略,参见 [抽帧策略](/docs/video-understanding#203baa92)。 > > - 传入模型 ID:传入不同的模型 ID 会采用不同的抽帧策略。 > - 传入 Endpoint ID:会按照上传时 Endpoint ID 映射的模型对应的抽帧策略进行抽帧。 > - 不传该参数时:默认采用 `doubao-seed-1.8` 之前的模型对应的抽帧策略。 > **说明:注意** > > 如需处理视频中的音频内容,该字段需指定为支持音频理解的模型,具体支持的模型可参见 [模型列表](/docs/model-list#9619c0ba)。 **max_video_tokens** `integer` | 视频最大 tokens 数 `preprocess_configs.video.max_video_tokens` 视频最大 tokens 数,值越大保留的视频信息越多。 **取值范围**:`[10240, 204800]` **min_frame_tokens** `integer` | 单帧最小 tokens 数 `preprocess_configs.video.min_frame_tokens` 单帧最小 tokens 数,用于控制单帧压缩的下限。值越小,允许对单帧进行更大的压缩,但单帧细节下降。 **取值范围**:`[16, 128]` **max_frame_tokens** `integer` | 单帧最大 tokens 数 `preprocess_configs.video.max_frame_tokens` 单帧最大 tokens 数,用于控制单帧质量的上限。值越大,允许对单帧保留更多的细节。 **取值范围**:`[128, 640]` **min_frames** `integer` | 最小抽帧数 `preprocess_configs.video.min_frames` 最小抽帧数,用于保证短视频具备足够的处理帧数。若 `fps` 字段抽帧总数小于 `min_frames`,则优先按照 `min_frames` 配置要求抽帧。 **取值范围**:`[5, 16]` ## 代码示例 ## 文件上传 ### cURL #### Request ```bash curl https://ark.cn-beijing.volces.com/api/v3/files \ -H "Authorization: Bearer $ARK_API_KEY" \ -F 'purpose=user_data' \ -F 'file=@/root/projects/ark/ark_video.mp4' \ -F 'preprocess_configs[video][fps]=0.3' ``` #### Response ``` { "object": "file", "id": "file-20251018114827-6zgrb", "purpose": "user_data", "filename": "demo.mp4", "bytes": 695110, "mime_type": "video/mp4", "created_at": 1760759307, "expire_at": 1761364107, "status": "processing", "preprocess_configs": { "video": { "fps": 0.3 } } } ``` ### Python #### Request ```python import os from arkruntime import Ark client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=os.getenv('ARK_API_KEY') ) file = client.files.create( # replace with your local video path file=open("/root/projects/ark/ark_video.mp4", "rb"), purpose="user_data", preprocess_configs={ "video": { "fps": 0.3, # define the sampling fps of the video, default is 1.0 } } ) print(file) ``` #### Response ``` { "object": "file", "id": "file-20251018114827-6zgrb", "purpose": "user_data", "filename": "demo.mp4", "bytes": 695110, "mime_type": "video/mp4", "created_at": 1760759307, "expire_at": 1761364107, "status": "processing", "preprocess_configs": { "video": { "fps": 0.3 } } } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/file" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() data, err := os.Open("/root/projects/ark/ark_video.mp4") if err != nil { fmt.Printf("read file error: %v\n", err) return } fileInfo, err := client.UploadFile(ctx, &file.FileCreateRequest{ Purpose: file.PurposeUserData, PreprocessConfigs: file.NewOptPreprocessConfigs(file.PreprocessConfigs{ Video: file.NewOptVideo(file.Video{ Fps: file.NewOptFloat64(0.3), }), }), }, data) if err != nil { fmt.Printf("upload file error: %v", err) return } fmt.Printf("file info: %v\n", fileInfo) } ``` #### Response ``` { "object": "file", "id": "file-20251018114827-6zgrb", "purpose": "user_data", "filename": "demo.mp4", "bytes": 695110, "mime_type": "video/mp4", "created_at": 1760759307, "expire_at": 1761364107, "status": "processing", "preprocess_configs": { "video": { "fps": 0.3 } } } ``` ### Java #### Request ```java package com.ark.example; import com.volcengine.ark.runtime.models.file.*; import com.volcengine.ark.runtime.service.ArkService; import java.io.File; public class demo { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); ArkService service = ArkService.builder().apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); System.out.println("===== Upload File Example====="); FileObject fileMeta; fileMeta = service.uploadFile(FileCreateRequest.builder() // replace with your image file path .purpose(Purpose.USER_DATA) .preprocessConfigs(PreprocessConfigs.builder().video(Video.builder().fps(0.3).build()).build()) .build(), new File("/root/projects/ark/ark_video.mp4")); System.out.println("Uploaded file Meta: " + fileMeta); service.shutdownExecutor(); } } ``` #### Response ``` { "object": "file", "id": "file-20251018114827-6zgrb", "purpose": "user_data", "filename": "demo.mp4", "bytes": 695110, "mime_type": "video/mp4", "created_at": 1760759307, "expire_at": 1761364107, "status": "processing", "preprocess_configs": { "video": { "fps": 0.3 } } } ``` ### Python-OpenAI #### Request ```python import asyncio import os from openai import OpenAI client = OpenAI( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=os.getenv('ARK_API_KEY') ) file = client.files.create( # replace with your local video path file=open("/root/projects/ark/ark_video.mp4", "rb"), purpose="user_data", extra_body={ "preprocess_configs":{ "video": { "fps": 0.3 } } } ) print(file) ``` #### Response ``` { "object": "file", "id": "file-20251018114827-6zgrb", "purpose": "user_data", "filename": "demo.mp4", "bytes": 695110, "mime_type": "video/mp4", "created_at": 1760759307, "expire_at": 1761364107, "status": "processing", "preprocess_configs": { "video": { "fps": 0.3 } } } ``` ## URL 上传(HTTPS URL) ### cURL #### Request ```bash curl -X POST "https://ark.cn-beijing.volces.com/api/v3/files" \ -H "Authorization: Bearer $ARK_API_KEY" \ -F "purpose=user_data" \ -F "url=https://example.com/docs/demo_img.png" \ -F "tos[bucket]=my-bucket" \ -F "tos[prefix]=ark-files/" ``` #### Response ``` { "object": "file", "id": "file-20260529151145-hbh6r", "purpose": "user_data", "filename": "demo_img.png", "bytes": 84669, "mime_type": "image/png", "created_at": 1780038705, "expire_at": 1780643505, "status": "active", "tos": { "bucket": "my-bucket", "object_key": "ark-files/ark_processed/file-20260529151145-hbh6r/Image/demo_img.png" } } ``` ### Python #### Request ```python import os from arkruntime import Ark client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=os.getenv('ARK_API_KEY') ) file = client.files.create( url="https://example.com/docs/demo_img.png", purpose="user_data", tos={ "bucket": "my-bucket", "prefix": "ark-files/" } ) print(file) ``` #### Response ``` { "object": "file", "id": "file-20260529151145-hbh6r", "purpose": "user_data", "filename": "demo_img.png", "bytes": 84669, "mime_type": "image/png", "created_at": 1780038705, "expire_at": 1780643505, "status": "active", "tos": { "bucket": "my-bucket", "object_key": "ark-files/ark_processed/file-20260529151145-hbh6r/Image/demo_img.png" } } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/file" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() fileInfo, err := client.UploadFile(ctx, &file.FileCreateRequest{ Purpose: file.PurposeUserData, URL: file.NewOptString("https://example.com/docs/demo_img.png"), Tos: file.NewOptTosStorage(file.TosStorage{ Bucket: file.NewOptString("my-bucket"), Prefix: file.NewOptString("ark-files/"), }), }, nil) if err != nil { fmt.Printf("upload file error: %v", err) return } fmt.Printf("file info: %v\n", fileInfo) } ``` #### Response ``` { "object": "file", "id": "file-20260529151145-hbh6r", "purpose": "user_data", "filename": "demo_img.png", "bytes": 84669, "mime_type": "image/png", "created_at": 1780038705, "expire_at": 1780643505, "status": "active", "tos": { "bucket": "my-bucket", "object_key": "ark-files/ark_processed/file-20260529151145-hbh6r/Image/demo_img.png" } } ``` ### Java #### Request ```java package com.ark.sample; import com.volcengine.ark.runtime.model.files.*; import com.volcengine.ark.runtime.service.ArkService; public class demo { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); ArkService service = ArkService.builder() .apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); System.out.println("===== Upload File Example ====="); FileMeta fileMeta; fileMeta = service.uploadFile( UploadFileRequest.builder() .url("https://example.com/docs/demo_img.png") .purpose("user_data") .tos(TosStorage.builder() .bucket("my-bucket") .prefix("ark-files/") .build()) .build()); System.out.println("Uploaded file Meta: " + fileMeta); service.shutdownExecutor(); } } ``` #### Response ``` { "object": "file", "id": "file-20260529151145-hbh6r", "purpose": "user_data", "filename": "demo_img.png", "bytes": 84669, "mime_type": "image/png", "created_at": 1780038705, "expire_at": 1780643505, "status": "active", "tos": { "bucket": "my-bucket", "object_key": "ark-files/ark_processed/file-20260529151145-hbh6r/Image/demo_img.png" } } ``` ## URL 上传(TOS URI) ### cURL #### Request ```bash curl -X POST "https://ark.cn-beijing.volces.com/api/v3/files" \ -H "Authorization: Bearer $ARK_API_KEY" \ -F "purpose=user_data" \ -F "url=tos://my-bucket/source/raw_video.mp4" \ -F "tos[bucket]=my-bucket" \ -F "tos[prefix]=ark-files/" ``` #### Response ``` { "object": "file", "id": "file-20260529151702-wt2cd", "purpose": "user_data", "filename": "raw_video.mp4", "bytes": 11041468, "mime_type": "video/mp4", "created_at": 1780039022, "expire_at": 1780643822, "status": "processing", "tos": { "bucket": "my-bucket", "object_key": "ark-files/ark_processed/file-20260529151702-wt2cd/Video/raw_video.mp4" } } ``` ### Python #### Request ```python import os from arkruntime import Ark client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=os.getenv('ARK_API_KEY') ) file = client.files.create( url="tos://my-bucket/source/raw_video.mp4", purpose="user_data", tos={ "bucket": "my-bucket", "prefix": "ark-files/" } ) print(file) ``` #### Response ``` { "object": "file", "id": "file-20260529151702-wt2cd", "purpose": "user_data", "filename": "raw_video.mp4", "bytes": 11041468, "mime_type": "video/mp4", "created_at": 1780039022, "expire_at": 1780643822, "status": "processing", "tos": { "bucket": "my-bucket", "object_key": "ark-files/ark_processed/file-20260529151702-wt2cd/Video/raw_video.mp4" } } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/file" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() fileInfo, err := client.UploadFile(ctx, &file.FileCreateRequest{ Purpose: file.PurposeUserData, URL: file.NewOptString("tos://my-bucket/source/raw_video.mp4"), Tos: file.NewOptTosStorage(file.TosStorage{ Bucket: file.NewOptString("my-bucket"), Prefix: file.NewOptString("ark-files/"), }), }, nil) if err != nil { fmt.Printf("upload file error: %v", err) return } fmt.Printf("file info: %v\n", fileInfo) } ``` #### Response ``` { "object": "file", "id": "file-20260529151702-wt2cd", "purpose": "user_data", "filename": "raw_video.mp4", "bytes": 11041468, "mime_type": "video/mp4", "created_at": 1780039022, "expire_at": 1780643822, "status": "processing", "tos": { "bucket": "my-bucket", "object_key": "ark-files/ark_processed/file-20260529151702-wt2cd/Video/raw_video.mp4" } } ``` ### Java #### Request ```java package com.ark.sample; import com.volcengine.ark.runtime.model.files.*; import com.volcengine.ark.runtime.service.ArkService; public class demo { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); ArkService service = ArkService.builder() .apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); System.out.println("===== Upload File Example ====="); FileMeta fileMeta; fileMeta = service.uploadFile( UploadFileRequest.builder() .url("tos://my-bucket/source/raw_video.mp4") .purpose("user_data") .tos(TosStorage.builder() .bucket("my-bucket") .prefix("ark-files/") .build()) .build()); System.out.println("Uploaded file Meta: " + fileMeta); service.shutdownExecutor(); } } ``` #### Response ``` { "object": "file", "id": "file-20260529151702-wt2cd", "purpose": "user_data", "filename": "raw_video.mp4", "bytes": 11041468, "mime_type": "video/mp4", "created_at": 1780039022, "expire_at": 1780643822, "status": "processing", "tos": { "bucket": "my-bucket", "object_key": "ark-files/ark_processed/file-20260529151702-wt2cd/Video/raw_video.mp4" } } ``` ## 大视频文件上传 ### cURL #### Request ```bash curl -X POST "https://ark.cn-beijing.volces.com/api/v3/files" \ -H "Authorization: Bearer $ARK_API_KEY" \ -F "purpose=user_data" \ -F "url=tos://my-bucket/videos/long-video.mp4" \ -F "tos[bucket]=my-bucket" \ -F "tos[prefix]=ark-files/" \ -F "preprocess_configs[video][model]=doubao-seed-2-1-pro-260915" \ -F "preprocess_configs[video][max_video_tokens]=200000" \ -F "preprocess_configs[video][min_frames]=16" ``` #### Response ``` { "object": "file", "id": "file-20260529151956-v6xd7", "purpose": "user_data", "filename": "long-video.mp4", "bytes": 11041468, "mime_type": "video/mp4", "created_at": 1780039196, "expire_at": 1780643996, "status": "processing", "preprocess_configs": { "video": { "fps": 1, "max_video_tokens": 200000, "min_frames": 16 } }, "tos": { "bucket": "my-bucket", "object_key": "ark-files/ark_processed/file-20260529151956-v6xd7/Video/long-video.mp4" } } ``` ### Python #### Request ```python import os from arkruntime import Ark client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=os.getenv('ARK_API_KEY') ) file = client.files.create( url="tos://my-bucket/videos/long-video.mp4", purpose="user_data", tos={ "bucket": "my-bucket", "prefix": "ark-files/" }, preprocess_configs={ "video": { "model": "doubao-seed-2-1-pro-260915", "max_video_tokens": 200000, "min_frames": 16 } } ) print(file) ``` #### Response ``` { "object": "file", "id": "file-20260529151956-v6xd7", "purpose": "user_data", "filename": "long-video.mp4", "bytes": 11041468, "mime_type": "video/mp4", "created_at": 1780039196, "expire_at": 1780643996, "status": "processing", "preprocess_configs": { "video": { "fps": 1, "max_video_tokens": 200000, "min_frames": 16 } }, "tos": { "bucket": "my-bucket", "object_key": "ark-files/ark_processed/file-20260529151956-v6xd7/Video/long-video.mp4" } } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/volcengine-go-sdk/service/arkruntime" "github.com/volcengine/volcengine-go-sdk/service/arkruntime/model/file" "github.com/volcengine/volcengine-go-sdk/volcengine" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() fileInfo, err := client.UploadFile(ctx, &file.UploadFileRequest{ Purpose: file.PurposeUserData, URL: volcengine.String("tos://my-bucket/videos/long-video.mp4"), Tos: &file.TosStorage{ Bucket: volcengine.String("my-bucket"), Prefix: volcengine.String("ark-files/"), }, PreprocessConfigs: &file.PreprocessConfigs{ Video: &file.Video{ Model: volcengine.String("doubao-seed-2-1-pro-260915"), MaxVideoTokens: volcengine.Int64(200000), MinFrames: volcengine.Int64(16), }, }, }) if err != nil { fmt.Printf("upload file error: %v", err) return } fmt.Printf("file info: %v\n", fileInfo) } ``` #### Response ``` { "object": "file", "id": "file-20260529151956-v6xd7", "purpose": "user_data", "filename": "long-video.mp4", "bytes": 11041468, "mime_type": "video/mp4", "created_at": 1780039196, "expire_at": 1780643996, "status": "processing", "preprocess_configs": { "video": { "fps": 1, "max_video_tokens": 200000, "min_frames": 16 } }, "tos": { "bucket": "my-bucket", "object_key": "ark-files/ark_processed/file-20260529151956-v6xd7/Video/long-video.mp4" } } ``` ### Java #### Request ```java package com.ark.sample; import com.volcengine.ark.runtime.model.files.*; import com.volcengine.ark.runtime.service.ArkService; public class demo { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); ArkService service = ArkService.builder() .apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); System.out.println("===== Upload File Example ====="); FileMeta fileMeta; try { fileMeta = service.uploadFile( UploadFileRequest.builder() .url("tos://my-bucket/videos/long-video.mp4") .purpose("user_data") .tos(TosStorage.builder() .bucket("my-bucket") .prefix("ark-files/") .build()) .preprocessConfigs(PreprocessConfigs.builder() .video(Video.builder() .model("doubao-seed-2-1-pro-260915") .maxVideoTokens(200000L) .minFrames(16L) .build()) .build()) .build()); System.out.println("Uploaded file Meta: " + fileMeta); } catch (Exception e) { e.printStackTrace(); } service.shutdownExecutor(); } } ``` #### Response ``` { "object": "file", "id": "file-20260529151956-v6xd7", "purpose": "user_data", "filename": "long-video.mp4", "bytes": 11041468, "mime_type": "video/mp4", "created_at": 1780039196, "expire_at": 1780643996, "status": "processing", "preprocess_configs": { "video": { "fps": 1, "max_video_tokens": 200000, "min_frames": 16 } }, "tos": { "bucket": "my-bucket", "object_key": "ark-files/ark_processed/file-20260529151956-v6xd7/Video/long-video.mp4" } } ``` --- # 查询文件详情 Source: https://ark.volcengine.com/region:cn-beijing/docs/search-files-api `GET https://ark.cn-beijing.volces.com/api/v3/files/{file_id}` 通过文件 ID 查询指定文件的详细信息。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **file_id** `string` `必选` | 文件 ID 要查询的文件 ID ## 响应参数 **created_at** `integer` | 创建时间 文件上传时的 Unix 时间戳(秒) **expire_at** `integer` | 过期时间 文件过期时间的 Unix 时间戳(秒)。文件过期后将无法访问,需重新上传 **filename** `string` | 原始文件名 上传时的原始文件名 **id** `string` | 文件 ID 文件的唯一标识符 **object** `string` | 对象类型 对象类型,固定为 `file` **purpose** `string` | 文件用途 文件用途。 - `user_data`:可以灵活使用的文件,能够用于任意用途。 - `agent`:智能体(Agent)场景使用的文件。 **status** `string` | 文件状态 文件处理状态。常见取值为 `active`(处理完成,可用于推理)、`processing`(处理中)、`failed`(处理失败) **bytes** `integer` | 文件大小 文件大小,单位为字节(Bytes) > **说明:注意** > > 仅在文件处理状态 `status` 为 `active` 时返回。 **download_url** `string` | 下载 URL 服务端签发的临时预签名下载地址,可用于下载文件内容。 > **注意** > > 该地址包含临时访问凭证。请仅向已授权用户提供,并避免写入日志、长期缓存或公开分享。 **error** `object` | 错误信息 文件上传或处理失败时返回的错误信息对象,包含错误码、错误消息等字段 > **说明:注意** > > 仅在文件处理状态 `status` 为 `failed` 时返回。 **code** `string` | 错误码 `error.code` **message** `string` | 错误描述信息 `error.message` **mime_type** `string` | MIME 类型 文件的 MIME 类型,例如 `video/mp4`、`image/jpeg` **preprocess_configs** `object` | 预处理配置 上传文件时设置的预处理规则配置,按文件类型分组(如视频抽帧规则) **video** `object` | 视频预处理配置 `preprocess_configs.video` 视频文件的预处理配置 **fps** `number` | 抽帧帧率 `preprocess_configs.video.fps` 视频抽帧的帧率(Frames Per Second),用于设置视频预处理时每秒采样的画面帧数 **model** `string` | 预处理模型 `preprocess_configs.video.model` 视频预处理使用的模型标识符(可选) **scope** `object` | 文件所属作用域信息 文件所属作用域信息,用于标识该文件创建时归属的会话上下文。 **id** `string` | 作用域 ID `scope.id` 作用域 ID,返回对应的会话 ID。 **type** `string` | 作用域类型 `scope.type` 作用域类型,当前固定取值为 `session`。 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl https://ark.cn-beijing.volces.com/api/v3/files/file-20251119**** \ -H "Authorization: Bearer $ARK_API_KEY" ``` #### Response ``` { "object": "file", "id": "file-20251119****", "purpose": "user_data", "filename": "demo.mp4", "bytes": 18773126, "mime_type": "video/mp4", "created_at": 1763552708, "expire_at": 1764157507, "status": "active" } ``` ### Python #### Request ```python import os from arkruntime import Ark # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key = os.getenv('ARK_API_KEY') client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) # Retrieve file response = client.files.retrieve( file_id="file-20251119****" ) print(response) ``` #### Response ``` { "object": "file", "id": "file-20251119****", "purpose": "user_data", "filename": "demo.mp4", "bytes": 18773126, "mime_type": "video/mp4", "created_at": 1763552708, "expire_at": 1764157507, "status": "active" } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() fileInfo, err := client.RetrieveFile(ctx, "file-20251119****") if err != nil { fmt.Printf("get file status error: %v", err) return } fmt.Printf("file info: %v", fileInfo) } ``` #### Response ``` { "object": "file", "id": "file-20251119****", "purpose": "user_data", "filename": "demo.mp4", "bytes": 18773126, "mime_type": "video/mp4", "created_at": 1763552708, "expire_at": 1764157507, "status": "active" } ``` ### Java #### Request ```java package com.ark.sample; import com.volcengine.ark.runtime.models.file.*; import com.volcengine.ark.runtime.service.ArkService; public class demo { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); ArkService service = ArkService.builder().apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); // Retrieve the file metadata. FileObject fileMeta = service.retrieveFile("file-20251119****"); System.out.println("Retrieve File:" + fileMeta); service.shutdownExecutor(); } } ``` #### Response ``` { "object": "file", "id": "file-20251119****", "purpose": "user_data", "filename": "demo.mp4", "bytes": 18773126, "mime_type": "video/mp4", "created_at": 1763552708, "expire_at": 1764157507, "status": "active" } ``` ### Python-OpenAI #### Request ```python import os from openai import OpenAI api_key = os.getenv('ARK_API_KEY') client = OpenAI( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) # Retrieve the file metadata. response = client.files.retrieve( file_id="file-20251119****" ) print(response) ``` #### Response ``` { "object": "file", "id": "file-20251119****", "purpose": "user_data", "filename": "demo.mp4", "bytes": 18773126, "mime_type": "video/mp4", "created_at": 1763552708, "expire_at": 1764157507, "status": "active" } ``` --- # 查询文件列表 Source: https://ark.volcengine.com/region:cn-beijing/docs/list-files-api `GET https://ark.cn-beijing.volces.com/api/v3/files` 获取当前账号下已上传的文件列表,支持按用途筛选与基于游标的分页查询。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Query 参数 > 在 URL Query String 中传入。 **after** `string` | 分页游标 游标参数,返回该文件 ID 之后的文件,用于分页拉取下一页数据。通常传入上一页响应中的 `last_id` **limit** `integer` `默认值 100` | 单次返回数量 控制单次返回的最大文件数。 > **说明:注意** > > 取值范围:1~100。 **order** `string` `默认值 desc` | 排序方式 按照文件 `created_at` 的时间戳顺序,控制文件的排序方式: * `asc`:正序排列; * `desc`:倒序排列。 **purpose** `string` | 文件用途筛选 按文件用途进行筛选,仅返回具有指定用途的文件。 - `user_data`:可以灵活使用的文件,能够用于任意用途。 - `agent`:智能体(Agent)场景使用的文件。 **scope_id** `string` | 作用域 ID(Session 维度) 当前仅支持传入 Session ID,用于筛选该 Session 在 `/mnt/session/outputs/` 目录中生成的产物。 > **说明:注意** > > * 仅适用于 [Managed Agents](/docs/overview) 场景。 > > * 参数取值必须为合法有效的会话 ID。 ## 响应参数 **data** `object[]` | 文件列表 文件对象列表,元素结构与 [查询文件详情](/docs/search-files-api) 接口返回的单个文件对象一致 **created_at** `integer` | 创建时间 `data.created_at` 文件上传时的 Unix 时间戳(秒) **expire_at** `integer` | 过期时间 `data.expire_at` 文件过期时间的 Unix 时间戳(秒)。文件过期后将无法访问,需重新上传 **filename** `string` | 原始文件名 `data.filename` 上传时的原始文件名 **id** `string` | 文件 ID `data.id` 文件的唯一标识符 **object** `string` | 对象类型 `data.object` 对象类型,固定为 `file` **purpose** `string` | 文件用途 `data.purpose` 文件用途。 - `user_data`:可以灵活使用的文件,能够用于任意用途。 - `agent`:智能体(Agent)场景使用的文件。 **status** `string` | 文件状态 `data.status` 文件处理状态。常见取值为 `active`(处理完成,可用于推理)、`processing`(处理中)、`failed`(处理失败) **bytes** `integer` | 文件大小 `data.bytes` 文件大小,单位为字节(Bytes) > **说明:注意** > > 仅在文件处理状态 `status` 为 `active` 时返回。 **download_url** `string` | 下载 URL `data.download_url` 服务端签发的临时预签名下载地址,可用于下载文件内容。 > **注意** > > 该地址包含临时访问凭证。请仅向已授权用户提供,并避免写入日志、长期缓存或公开分享。 **error** `object` | 错误信息 `data.error` 文件上传或处理失败时返回的错误信息对象,包含错误码、错误消息等字段 > **说明:注意** > > 仅在文件处理状态 `status` 为 `failed` 时返回。 **code** `string` | 错误码 `data.error.code` 机器可读的错误码 **message** `string` | 错误消息 `data.error.message` 人类可读的错误描述信息 **param** `string` | 错误参数 `data.error.param` 触发该错误的请求参数名(如有) **type** `string` | 错误类型 `data.error.type` 错误类型标识 **mime_type** `string` | MIME 类型 `data.mime_type` 文件的 MIME 类型,例如 `video/mp4`、`image/jpeg` **preprocess_configs** `object` | 预处理配置 `data.preprocess_configs` 上传文件时设置的预处理规则配置,按文件类型分组(如视频抽帧规则) **video** `object` | 视频预处理配置 `data.preprocess_configs.video` 视频文件的预处理配置 **fps** `number` | 抽帧帧率 `data.preprocess_configs.video.fps` 视频抽帧的帧率(Frames Per Second),用于设置视频预处理时每秒采样的画面帧数 **model** `string` | 预处理模型 `data.preprocess_configs.video.model` 视频预处理使用的模型标识符(可选) **scope** `object` | 文件所属作用域信息 `data.scope` 文件所属作用域信息,用于标识该文件创建时归属的会话上下文。 **id** `string` | 作用域 ID `data.scope.id` 作用域 ID,返回对应的会话 ID。 **type** `string` | 作用域类型 `data.scope.type` 作用域类型,当前固定取值为 `session`。 **first_id** `string` | 首条文件 ID 当前响应中第一条文件数据的 ID **has_more** `boolean` | 是否有更多数据 标识是否还有更多数据未返回: * `true`:存在未返回的数据,可继续使用 `last_id` 作为 `after` 拉取下一页; * `false`:已返回全部数据 **last_id** `string` | 末条文件 ID 当前响应中最后一条文件数据的 ID,可用作下一页请求的 `after` 参数 **object** `string` | 对象类型 对象类型,固定为 `list` ## 代码示例 ## 默认 ### cURL #### Request ```bash curl https://ark.cn-beijing.volces.com/api/v3/files \ -H "Authorization: Bearer $ARK_API_KEY" ``` #### Response ``` { "object": "file", "data": [ { "object": "file", "id": "file-20251014203105-ll4pb", "purpose": "user_data", "filename": "demo.mp4", "bytes": 109322727, "mime_type": "video/mp4", "created_at": 1760445065, "expire_at": 1760704264, "status": "active" }, { "object": "file", "id": "file-20251014203036-24jvn", "purpose": "user_data", "filename": "demo.png", "bytes": 601, "mime_type": "image/png", "created_at": 1760445036, "expire_at": 1760704236, "status": "active" } ], "first_id": "file-20251014203105-ll4pb", "last_id": "file-20251014203036-24jvn", "has_more": false } ``` ### Python #### Request ```python import os from arkruntime import Ark api_key = os.getenv('ARK_API_KEY') client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) response = client.files.list() print(response) ``` #### Response ``` { "object": "file", "data": [ { "object": "file", "id": "file-20251014203105-ll4pb", "purpose": "user_data", "filename": "demo.mp4", "bytes": 109322727, "mime_type": "video/mp4", "created_at": 1760445065, "expire_at": 1760704264, "status": "active" }, { "object": "file", "id": "file-20251014203036-24jvn", "purpose": "user_data", "filename": "demo.png", "bytes": 601, "mime_type": "image/png", "created_at": 1760445036, "expire_at": 1760704236, "status": "active" } ], "first_id": "file-20251014203105-ll4pb", "last_id": "file-20251014203036-24jvn", "has_more": false } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/file" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() fileInfo, err := client.ListFiles(ctx, &file.FilesListParams{}) if err != nil { fmt.Printf("get file List error: %v", err) return } fmt.Printf("file List: %v", fileInfo) } ``` #### Response ``` { "object": "file", "data": [ { "object": "file", "id": "file-20251014203105-ll4pb", "purpose": "user_data", "filename": "demo.mp4", "bytes": 109322727, "mime_type": "video/mp4", "created_at": 1760445065, "expire_at": 1760704264, "status": "active" }, { "object": "file", "id": "file-20251014203036-24jvn", "purpose": "user_data", "filename": "demo.png", "bytes": 601, "mime_type": "image/png", "created_at": 1760445036, "expire_at": 1760704236, "status": "active" } ], "first_id": "file-20251014203105-ll4pb", "last_id": "file-20251014203036-24jvn", "has_more": false } ``` ### Java #### Request ```java package com.ark.sample; import com.volcengine.ark.runtime.models.file.*; import com.volcengine.ark.runtime.service.ArkService; public class demo { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); ArkService service = ArkService.builder().apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); FileListRequest request = new FileListRequest(); FileListResponse listFiles = service.listFiles(request); System.out.println("List Files:" + listFiles); service.shutdownExecutor(); } } ``` #### Response ``` { "object": "file", "data": [ { "object": "file", "id": "file-20251014203105-ll4pb", "purpose": "user_data", "filename": "demo.mp4", "bytes": 109322727, "mime_type": "video/mp4", "created_at": 1760445065, "expire_at": 1760704264, "status": "active" }, { "object": "file", "id": "file-20251014203036-24jvn", "purpose": "user_data", "filename": "demo.png", "bytes": 601, "mime_type": "image/png", "created_at": 1760445036, "expire_at": 1760704236, "status": "active" } ], "first_id": "file-20251014203105-ll4pb", "last_id": "file-20251014203036-24jvn", "has_more": false } ``` ### Python-OpenAI #### Request ```python import os from openai import OpenAI api_key = os.getenv('ARK_API_KEY') client = OpenAI( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) response = client.files.list() print(response) ``` #### Response ``` { "object": "file", "data": [ { "object": "file", "id": "file-20251014203105-ll4pb", "purpose": "user_data", "filename": "demo.mp4", "bytes": 109322727, "mime_type": "video/mp4", "created_at": 1760445065, "expire_at": 1760704264, "status": "active" }, { "object": "file", "id": "file-20251014203036-24jvn", "purpose": "user_data", "filename": "demo.png", "bytes": 601, "mime_type": "image/png", "created_at": 1760445036, "expire_at": 1760704236, "status": "active" } ], "first_id": "file-20251014203105-ll4pb", "last_id": "file-20251014203036-24jvn", "has_more": false } ``` --- # 删除文件 Source: https://ark.volcengine.com/region:cn-beijing/docs/delete-files-api `DELETE https://ark.cn-beijing.volces.com/api/v3/files/{file_id}` 根据文件 ID 删除已上传的文件,并将文件从存储空间中移除。删除后该文件无法再用于模型推理输入,且无法恢复。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **file_id** `string` `必选` | 文件 ID 要删除的文件 ID,可通过 [上传文件](/docs/upload-files-api) 接口返回的 `id` 字段获取 > **说明:注意** > > 文件删除后不可恢复,请确认该文件不再被推理任务引用后再执行删除。 ## 响应参数 **deleted** `boolean` | 删除结果 文件是否删除成功。取值 `true` 表示已成功从存储空间中移除 **id** `string` | 文件 ID 被删除文件的唯一标识符(ID),与请求中传入的 `file_id` 一致 **object** `string` | 对象类型 对象类型,固定为 `file`,用于标识返回结果对应的资源类型 ## 代码示例 ## 删除请求 ### cURL #### Request ```bash curl https://ark.cn-beijing.volces.com/api/v3/files/file-20251014**** \ -X DELETE \ -H "Authorization: Bearer $ARK_API_KEY" ``` #### Response ``` { "object": "file", "id": "file-20251014****", "deleted": true } ``` ### Python #### Request ```python import os from arkruntime import Ark api_key = os.getenv('ARK_API_KEY') client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) if __name__ == "__main__": try: response = client.files.delete( file_id="file-20251014****" ) print(response) except Exception as e: print(f"failed to delete response: {e}") ``` #### Response ``` { "object": "file", "id": "file-20251014****", "deleted": true } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() fileInfo, err := client.DeleteFile(ctx, "file-20251014****") if err != nil { fmt.Printf("delete file error: %v", err) return } fmt.Printf(" delete file: %v", fileInfo) } ``` #### Response ``` { "object": "file", "id": "file-20251014****", "deleted": true } ``` ### Java #### Request ```java package com.ark.sample; import com.volcengine.ark.runtime.models.file.*; import com.volcengine.ark.runtime.service.ArkService; public class demo { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); ArkService service = ArkService.builder().apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); // Delete the file. FileDeleted deleteFile = service.deleteFile("file-20251014****"); System.out.println("Delete File:" + deleteFile); service.shutdownExecutor(); } } ``` #### Response ``` { "object": "file", "id": "file-20251014****", "deleted": true } ``` ### Python-OpenAI #### Request ```python import os from openai import OpenAI api_key = os.getenv('ARK_API_KEY') client = OpenAI( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=api_key, ) if __name__ == "__main__": try: response = client.files.delete( file_id="file-20251014****" ) print(response) except Exception as e: print(f"failed to delete response: {e}") ``` #### Response ``` { "object": "file", "id": "file-20251014****", "deleted": true } ``` --- # 创建视频生成任务 Source: https://ark.volcengine.com/region:cn-beijing/docs/create-video-generation-task-api `POST https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks` 本文介绍创建视频生成任务 API 的输入输出参数,供您使用接口时查阅字段含义。模型会依据传入的图片及文本信息生成视频,待生成完成后,您可以按条件查询任务并获取生成的视频。 > **警告:使用必读** > > Seedance 2.5 已全面公开,您可在火山方舟平台调用 API 及在线体验。调用模型前,**请务必仔细查阅 [使用必读](/docs/seedance-2-5#2.5_compatibility),以确保正确设置任务类型和配置参数**。 **模型开通条件** 开通 Seedance 2.5、Seedance 2.0 系列模型前,请确保您**满足以下任一条件**: * **【推荐】账户余额 > 200 元**([前往充值](https://console.volcengine.com/finance/fund/recharge)) * **【推荐】购买 200 元档位及以上专属节省计划**,购买入口:[购买节省计划](https://console.volcengine.com/common-buy/AI-SavingsPlans%7C%7Cd682ppeeq1mp7kd5q0e0)。 * 已购买 Seedance 2.5、Seedance 2.0 系列资源包且有可用余量([前往购买](https://console.volcengine.com/common-buy/ark_bd%7C%7Cd9li7rchmjlhari755h0)) 详细规则见 [Seedance 2.5 与 Seedance 2.0 系列模型开通、使用与退订说明](/docs/seedance-model-activation-usage-and-refund)。 **模型能力** * **Doubao Seedance 2.5==new==**(有声视频 / 无声视频) * **全模态参考生视频**:输入参考图片(0-30 张)+ 参考视频(0-10 个)+ 参考音频(0-10 个)+ 文本提示词(可选)生成 1 个目标视频。支持仅传入音频。支持生成全新视频、编辑视频、延长视频,支持 30 秒视频连贯直出。 * **图生视频-首尾帧**:输入首帧图片 + 尾帧图片 + 文本提示词(可选)生成 1 个目标视频。 * **图生视频-首帧**:输入首帧图片 + 文本提示词(可选)生成 1 个目标视频。 * **文生视频**:输入文本提示词生成 1 个目标视频。 * **Doubao Seedance 2.0 系列**(有声视频 / 无声视频) * **全模态参考生视频**:输入参考图片(0-9 张)+ 参考视频(0-3 个)+ 参考音频(0-3 个)+ 文本提示词(可选)生成 1 个目标视频。注意不可单独输入音频,应至少包含 1 个参考视频或图片。支持生成全新视频、编辑视频、延长视频。 * **图生视频-首尾帧**:输入首帧图片 + 尾帧图片 + 文本提示词(可选)生成 1 个目标视频。 * **图生视频-首帧**:输入首帧图片 + 文本提示词(可选)生成 1 个目标视频。 * **文生视频**:输入文本提示词生成 1 个目标视频。 * **Doubao Seedance 1.0 pro** * 支持【图生视频-首尾帧】【图生视频-首帧】【文生视频】。 * **Doubao Seedance 1.0 pro fast** * 支持【图生视频-首帧】【文生视频】。 **参数传入方式说明** > **说明** > > * 对于 `resolution`、`ratio`、`duration`、`frames`、`seed`、`camera_fixed`、`watermark` 参数,除了在 request body 中直接传入,也支持在文本提示词后追加 `--[parameters]` 的弱校验方式传参,所有模型均兼容。 > * 不同模型对应支持不同的参数与取值,详见 [输出视频格式](/docs/video-generation-tutorial#9fe4cce0)。当输入的参数或取值不符合所选的模型时,该参数将被忽略或触发报错: > * **常规方式(推荐)**:在 request body 中直接传入参数。此方式为**强校验**,若参数填写错误,模型会返回错误提示。 > * **弱校验方式**:在文本提示词后追加 `--[parameters]`。若参数填写错误,该参数将被忽略或触发报错。 **常规方式(推荐):在 request body 中直接传入参数** ```JSON { "model": "doubao-seedance-1-0-pro-250528", "content": [ { "type": "text", "text": "小猫对着镜头打哈欠" } ], "resolution": "720p", "ratio": "16:9", "duration": 5, "seed": 11, "camera_fixed": false, "watermark": true } ``` **弱校验方式:在文本提示词后追加 `--[parameters]`** ```JSON { "model": "doubao-seedance-1-0-pro-250528", "content": [ { "type": "text", "text": "小猫对着镜头打哈欠 --rs 720p --rt 16:9 --dur 5 --seed 11 --cf false --wm true" } ] } ``` ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Body 参数 **model** `string` `必选` | 模型 ID 您需要调用的模型的 ID(Model ID)。[开通模型服务](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&OpenTokenDrawer=false) 后可 [查询 Model ID](/docs/model-list)。 您也可通过 Endpoint ID 来调用模型,获得限流、计费类型(前付费 / 后付费)、运行状态查询、监控、安全等高级能力,可参考 [获取 Endpoint ID](/docs/online-inference-standard)。 **content** `object[]` `必选` | 输入内容列表 输入给模型生成视频的信息,支持文本、图片、音频、视频、样片任务 ID 等多种类型的元素。 支持以下几种组合: * 纯文本 * 文本(可选)+ 图片 * 文本(可选)+ 视频 * 文本(可选)+ 音频(仅 Seedance 2.5 支持单独传入音频) * 文本(可选)+ 图片 + 音频 * 文本(可选)+ 图片 + 视频 * 文本(可选)+ 视频 + 音频 * 文本(可选)+ 图片 + 视频 + 音频 * 样片任务 ID:样片指使用 Seedance 模型成功生成的样片视频,模型可基于样片生成高质量正式视频 > **注意** > > Seedance 2.5、Seedance 2.0 系列模型不支持直接上传含有真人人脸的参考图 / 视频。 > > 为了便利创作者对肖像的使用,平台推出了以下解决方案,详情参见 [教程](/docs/seedance-2-0#5c67c9a1)。 > > * 支持使用部分模型的含人脸原始产物作为输入素材 > * 支持使用预置虚拟人像作为输入素材 > * 支持使用已授权真人素材作为输入 文本信息 `object` 文本部分,作为生成内容的文本提示词。 **type** `string` `必选` | 内容类型 `content.type` 输入内容的类型,此处固定为 `text`。 **text** `string` `必选` | 文本提示词 `content.text` 输入给模型的文本提示词,描述期望生成的视频。 > **说明** > > * **提示词语言支持**:所有模型均支持中英文提示词; > * **Seedance 2.5**:额外支持西班牙语、印度尼西亚语、葡萄牙语、日语、马来语、泰语、阿拉伯语、越南语、韩语; > * **Seedance 2.0 系列**:额外支持西班牙语、印度尼西亚语、葡萄牙语、日语。 > * **提示词字数建议**:中文提示词不超过 500 字,英文提示词不超过 1000 词。字数过多易导致信息分散,模型可能忽略细节、仅关注重点,进而造成视频缺失部分元素。 > * **更多使用技巧**:提示词的详细使用技巧,请参见 [Seedance 提示词指南](/docs/seedance-2-0-prompt-guide)。 图片信息 `object` 输入给模型的图片信息。 **type** `string` `必选` | 内容类型 `content.type` 输入内容的类型,此处固定为 `image_url`。 **image_url** `object` `必选` | 图片对象 `content.image_url` 输入给模型的图片对象。 **url** `string` `必选` | 图片来源 `content.image_url.url` 图片 URL、图片 Base64 编码、素材 ID。 * **图片 URL**:填入图片的公网 URL。 * **Base64 编码**:将本地文件转换为 Base64 编码字符串后提交给大模型,遵循格式 `data:image/<图片格式>;base64,`,注意 `<图片格式>` 需小写,如 `data:image/png;base64,{base64_image}`。 * **素材 ID**:用于视频生成的预置素材及虚拟人像的 ID,遵循格式 `asset://`。可从 [素材 & 虚拟人像库](https://ark.volcengine.com/region:cn-beijing/experience/gen_video?model=doubao-seedance) 获取。 > **说明:传入单张图片要求** > > * **格式**:`jpeg`、`png`、`webp`、`bmp`、`tiff`、`gif`。其中,Seedance 2.0 系列及以上模型版本额外支持 `heic`、`heif`。 > * **宽高比(宽/高)**:`[0.4, 2.5]` > * **宽高长度(px)**:`[300, 6000]` > * **大小**:单张图片小于 30 MB。请求体大小不超过 64 MB。大文件请勿使用 Base64 编码。 > * **图片数量**: > * **图生视频-首帧**:1 张 > * **图生视频-首尾帧**:2 张 > * **Seedance 2.5 全模态参考生视频**:1-30 张 > * **Seedance 2.0 系列全模态参考生视频**:1-9 张 **role** `string` | 角色/用途 `content.role` 图片的位置或用途。 图生视频-首帧 **字段 `role` 取值**:需要传入 1 个 `image_url` 对象,`role` 为 `first_frame` 或不填。 图生视频-首尾帧 **字段 `role` 取值**:需要传入 2 个 `image_url` 对象,且 `role` 必填。 * 首帧图片对应的 `role` 为 `first_frame` * 尾帧图片对应的 `role` 为 `last_frame` > **说明** > > 传入的首尾帧图片可相同。首尾帧图片的宽高比不一致时,以首帧图片为主,尾帧图片会自动裁剪适配。 **模型支持**: * `Seedance 2.5` * `Seedance 2.0 系列` * `Seedance 1.0 pro` 图生视频-参考图 **字段 `role` 取值**:必填,每张参考图对应的 `role` 均为 `reference_image`。 **模型支持**: * `Seedance 2.5` * `Seedance 2.0 系列` > **注意** > > * **图生视频-首帧**、**图生视频-首尾帧**、**全模态参考生视频**(包括参考图、视频、音频)为 3 种互斥场景,**不可混用**。 > * **全模态参考生视频**可通过提示词指定参考图片作为首帧 / 尾帧,间接实现「首尾帧 + 全模态参考」效果。若需严格保障首尾帧和指定图片一致,**优先使用图生视频-首尾帧**(配置 `role` 为 `first_frame` / `last_frame`)。 视频信息 `object` 输入给模型的视频信息。 方舟平台信任 Seedance 2.5、Seedance 2.0 系列模型生成的含人脸视频,您可使用**本账号下近 30 天内**由上述模型生成的含人脸原始视频,作为输入素材进行二次创作。 详情参见 [教程](/docs/seedance-portrait-asset-guide#trust-model-output)。 **模型支持**: * `Seedance 2.5` * `Seedance 2.0 系列` **type** `string` `必选` | 内容类型 `content.type` 输入内容的类型,此处固定为 `video_url`。 **video_url** `object` `必选` | 视频对象 `content.video_url` 输入给模型的视频对象。 **url** `string` `必选` | 视频来源 `content.video_url.url` 视频 URL、素材 ID。 * **视频 URL**:填入视频的公网 URL。 * **素材 ID**:用于视频生成的预置素材及虚拟人像视频的 ID,遵循格式 `asset://`。可从 [素材 & 虚拟人像库](https://ark.volcengine.com/region:cn-beijing/experience/gen_video?model=doubao-seedance) 获取。 > **说明:传入单个视频要求** > > * **视频格式**:`mp4`、`mov`,支持编码格式见下表。 > * **分辨率**:`480p`、`720p`、`1080p`、`4k` > * **时长**: > * **Seedance 2.5**: > * 非视频编辑任务:单个视频时长 `[2, 30]` s。 > * [视频编辑任务](/docs/seedance-2-5#2.5_task_type_intro):单个视频时长 `[4, 30]` s。 > * 最多传入 10 个参考视频,所有视频总时长不超过 30 s。 > * **Seedance 2.0 系列**:单个视频时长 `[2, 15]` s,最多传入 3 个参考视频,所有视频总时长不超过 15 s。 > * **尺寸**: > * **宽高比(宽/高)**:`[0.4, 2.5]` > * **宽高长度(px)**:`[300, 6000]` > * **总像素数**:`[614×664=407696, 3326×2494=8295044]`,即宽和高的乘积符合 `[407696, 8295044]` 的区间要求。 > * **大小**:单个视频不超过 200 MB。 > * **帧率(FPS)**:`[24, 60]` **支持的视频编码格式**: | 容器格式 | 常用文件扩展名 | MIME | 支持编码 | | --- | --- | --- | --- | | MP4 | .mp4 | video/mp4 | 视频:H.264/AVC、H.265/HEVC;音频:AAC、MP3 | | QuickTime | .mov | video/quicktime | 视频:H.264/AVC、H.265/HEVC;音频:AAC、MP3、PCM | **role** `string` `必选` | 角色/用途 `content.role` 视频的位置或用途,此处固定为 `reference_video`。 音频信息 `object` 用作参考音频。 **模型支持**: * **Seedance 2.5**:可仅传入音频,无需搭配图片 / 视频;也可配合图片 / 视频一起传入 * **Seedance 2.0 系列**:不可单独输入音频,应至少包含 1 个参考视频或图片。 **type** `string` `必选` | 内容类型 `content.type` 输入内容的类型,此处固定为 `audio_url`。 **audio_url** `object` `必选` | 音频对象 `content.audio_url` 输入给模型的音频对象。 **url** `string` `必选` | 音频来源 `content.audio_url.url` 音频 URL、音频 Base64 编码、素材 ID。 * **音频 URL**:填入音频的公网 URL。 * **Base64 编码**:将本地文件转换为 Base64 编码字符串后提交给大模型,遵循格式 `data:audio/<音频格式>;base64,`,注意 `<音频格式>` 需小写,如 `data:audio/wav;base64,{base64_audio}`。 * **素材 ID**:用于视频生成的虚拟人的音频素材 ID,遵循格式 `asset://`。可从 [素材 & 虚拟人像库](https://ark.volcengine.com/region:cn-beijing/experience/gen_video?model=doubao-seedance) 获取。 > **说明:传入单个音频要求** > > * **格式**:`wav`、`mp3` > * **时长**: > * **Seedance 2.5**:单个音频时长 `[2, 30]` s,最多传入 10 段参考音频,所有音频总时长不超过 30 s。 > * **Seedance 2.0 系列**:单个音频时长 `[2, 15]` s,最多传入 3 段参考音频,所有音频总时长不超过 15 s。 > * **大小**:单个音频不超过 15 MB,请求体大小不超过 64 MB。大文件请勿使用 Base64 编码。 **role** `string` `必选` | 角色/用途 `content.role` 音频的位置或用途,此处固定为 `reference_audio`。 样片信息 `object` 样片信息。基于样片任务 ID,生成正式视频。[阅读文档](/docs/video-generation-tutorial#5acd28c8) 获取 draft 功能的使用教程和注意事项。 **模型支持**: * `Seedance 2.5` **type** `string` `必选` | 内容类型 `content.type` 输入内容的类型,此处固定为 `draft_task`。 **draft_task** `object` `必选` | 样片任务对象 `content.draft_task` 输入给模型的样片任务对象。 **id** `string` `必选` | 样片任务 ID `content.draft_task.id` 样片任务 ID。 基于 Draft 视频生成正式视频时,部分参数由模型自动复用,部分参数禁止重复传入,部分参数可重新指定。详细规则参见 [Seedance 2.5 样片模式](/docs/seedance-2-5#2.5_draft_mode)。 使用分为两步: * **Step 1**:调用本接口生成 Draft 视频。 * **Step 2**:如果确认 Draft 视频符合预期,可基于 Step 1 返回的 Draft 视频任务 ID 调用本接口生成最终视频。 > **注意** > > Draft 视频任务 ID 的有效期为 7 天(从 `created_at` 时间戳开始计算),超时后将无法使用该 Draft 视频生成正式视频。 **omni_reference_task_type==new==** `string` `默认值 auto` | 任务类型引导 Seedance 2.5 **全模态参考生视频任务**包括参考生视频、视频编辑和视频延长 3 类子任务。不同任务类型对参数有特殊限制,为减少任务创建后异步报错的情况,可通过本参数指定子任务类型,以提前校验对应限制。 * 默认情况下,即 `omni_reference_task_type=auto`:模型根据输入素材和提示词自动判定任务类型,再校验参数取值。如果参数与实际任务类型不兼容,任务将触发 [异步报错](/docs/seedance-2-5#2.5_async_error)(错误码:[`InvalidParameter.TaskTypeConstraint`](/docs/error-codes))。 * 显式指定任务类型,即 `omni_reference_task_type` 为 `reference`、`edit` 或 `extend`:接口在提交任务时提前校验对应任务的特殊参数限制。不符合要求时,接口立即报错,任务不会创建。 > **注意** > > 实际处理任务时,模型仍会进一步结合提示词判断任务类型。若实际判定的任务类型和指定的不一致,仍会触发 [异步报错](/docs/seedance-2-5#2.5_async_error)(错误码:[`InvalidParameter.TaskTypeMismatch`](/docs/error-codes))。建议遵循各任务类型的 [提示词写法](/docs/seedance-2-5#2.5_param_constraints),降低报错概率。 **可选值:** * `auto`:由模型根据输入素材和提示词自动判定任务类型。 * `reference`:参考生视频任务,即基于参考图片、参考视频或参考音频生成新视频。设置 `reference` 时,`ratio` 或 `duration` 无特殊限制。 * `edit`:视频编辑任务,即对原视频的画面或音频进行编辑操作。设置 `edit` 时,`content` 中必须至少包含一个 `reference_video`,且视频时长必须为 4–30 秒;`ratio` 必须为 `adaptive`;`duration` 必须为 `-1`。 * `extend`:视频延长任务,即对原视频向前或向后延长。设置 `extend` 时,`content` 中必须至少包含一个 `reference_video`;`ratio` 必须为 `adaptive`。 **模型支持**: * `Seedance 2.5` **resolution** `string` | 视频分辨率 视频分辨率。可选值:`480p`、`720p`、`1080p`、`4k`。 > **说明** > > * `Seedance 2.5` 输出的 1080p 视频和 `Seedance 2.0` 输出的 4k 视频均采用 10bit 位深与 H.265/HEVC 编码。 > * 相较于一般的 8bit 位深,10bit 位深能够保留更丰富的色彩层次与更平滑的渐变过渡,满足专业影视制作与 HDR 视频内容的要求。 > * H.265/HEVC 编码在少数播放环境中可能不兼容。如遇问题,建议升级系统、更换设备,或使用 VLC、MPV、QuickTime Player 等播放器查看。播放兼容性说明详见 [10bit 位深与 H.265/HEVC 编码视频播放兼容性说明](/docs/seedance-2-0#4k_player)。 **模型支持**: * **Seedance 2.5**:默认值 `720p`;可选值 `480p`、`720p`、`1080p` * **Seedance 2.0**:默认值 `720p`;可选值 `480p`、`720p`、`1080p`、`4k` * **Seedance 2.0 fast**:默认值 `720p`;可选值 `480p`、`720p` * **Seedance 2.0 mini**:默认值 `720p`;可选值 `480p`、`720p` * **Seedance 1.0 pro**:默认值 `1080p`;可选值 `480p`、`720p`、`1080p` * **Seedance 1.0 pro fast**:默认值 `1080p`;可选值 `480p`、`720p`、`1080p` **ratio** `string` | 视频宽高比 生成视频的宽高比例。 * 可选值:`16:9`、`4:3`、`1:1`、`3:4`、`9:16`、`21:9`、`adaptive`(根据任务类型和输入内容自动适配宽高比) 不同模型的取值限制和 `adaptive` 适配规则 |任务类型 | |Seedance 2.5 |Seedance 2.0 系列 |Seedance 1.0 系列 | |---|---|---|---|---| |文生视频 | |支持在可选宽高比中自行设置,或由模型根据提示词在可选宽高比中自动选择 |支持在可选宽高比中自行设置,或由模型根据提示词在可选宽高比中自动选择 |仅支持在可选宽高比中自行设置 | \ | | |> 支持 `adaptive` 或指定宽高比 |> 支持 `adaptive` 或指定宽高比 |> 不支持 `adaptive` | |首帧或首尾帧生视频 | |**自动保持输出视频宽高比和 `first_frame` 指定的首帧图片一致** |支持在可选宽高比中自行设置,或由模型根据首帧图在可选宽高比中自动选择 |支持在可选宽高比中自行设置,或由模型根据首帧图在可选宽高比中自动选择 | \ | | |> 默认且仅支持 `adaptive` |> 支持 `adaptive` 或指定宽高比 |> 支持 `adaptive` 或指定宽高比 | |全模态参考生视频 |视频编辑 / 视频延长 |**模型根据提示词意图选定待编辑视频或待延长视频,并自动保持输出视频宽高比和待编辑视频或待延长视频一致,不支持另行设置** |支持在可选宽高比中自行设置,或由模型根据待编辑视频或待延长视频在可选宽高比中自动选择 |— | \ | | |> 默认且仅支持 `adaptive` |> 支持 `adaptive` 或指定宽高比 | | |^^ |参考生视频 |支持在可选宽高比中自行设置,或由模型根据提示词在可选宽高比中自动选择 |支持在可选宽高比中自行设置,或由模型根据提示词在可选宽高比中自动选择 |— | \ | | |> 支持 `adaptive` 或指定宽高比 |> 支持 `adaptive` 或指定宽高比 | | 不同宽高比对应的宽高像素值 图生视频,选择的宽高比与您上传的图片宽高比不一致时,方舟会对您的图片进行裁剪,裁剪时会居中裁剪,详细规则见 [图片裁剪规则](/docs/video-generation-tutorial#f76aafc8)。 | 分辨率 | 宽高比 | 宽高像素值 Seedance 2.5 | 宽高像素值 Seedance 2.0 系列 | 宽高像素值 Seedance 1.0 系列 | | --- | --- | --- | --- | --- | | 480p | `16:9` | 854×480 | 864×496 | 864×480 | | ^^ | `4:3` | 752×560 | 752×560 | 736×544 | | ^^ | `1:1` | 640×640 | 640×640 | 640×640 | | ^^ | `3:4` | 560×752 | 560×752 | 544×736 | | ^^ | `9:16` | 480×854 | 496×864 | 480×864 | | ^^ | `21:9` | 992×432 | 992×432 | 960×416 | | 720p | `16:9` | 1280×720 | 1280×720 | 1248×704 | | ^^ | `4:3` | 1112×834 | 1112×834 | 1120×832 | | ^^ | `1:1` | 960×960 | 960×960 | 960×960 | | ^^ | `3:4` | 834×1112 | 834×1112 | 832×1120 | | ^^ | `9:16` | 720×1280 | 720×1280 | 704×1248 | | ^^ | `21:9` | 1470×630 | 1470×630 | 1504×640 | | 1080p
    (Seedance 2.0 fast/mini 暂不支持) | `16:9` | 1920×1080 | 1920×1080 | 1920×1088 | | ^^ | `4:3` | 1664×1248 | 1664×1248 | 1664×1248 | | ^^ | `1:1` | 1440×1440 | 1440×1440 | 1440×1440 | | ^^ | `3:4` | 1248×1664 | 1248×1664 | 1248×1664 | | ^^ | `9:16` | 1080×1920 | 1080×1920 | 1088×1920 | | ^^ | `21:9` | 2206×946 | 2206×946 | 2176×928 | | 4k | `16:9` | — | 3840×2160 | — | | ^^ | `4:3` | — | 3326×2494 | — | | ^^ | `1:1` | — | 2880×2880 | — | | ^^ | `3:4` | — | 2494×3326 | — | | ^^ | `9:16` | — | 2160×3840 | — | | ^^ | `21:9` | — | 4398×1886 | — | > **注意** > > Seedance 2.5 模型在**视频编辑、视频延长、首帧 / 首尾帧生视频任务**(详见 [任务类型与判定条件](/docs/seedance-2-5#2.5_task_type_intro))存在特殊限制: > * 仅支持配置`ratio`为 `adaptive`,不支持指定具体宽高比。 > * 视频编辑 / 视频延长任务中,模型根据提示词意图选定待编辑视频或待延长视频,并自动保持输出视频宽高比和待编辑视频或待延长视频一致。 > * 首帧 / 首尾帧生视频任务中,模型自动保持输出视频宽高比和 `first_frame` 指定的首帧图片一致。 **模型支持**: * **Seedance 2.5**:默认值 `adaptive` * **Seedance 2.0 系列**:默认值 `adaptive` * **Seedance 1.0 pro**:文生视频默认 `16:9`,图生视频默认 `adaptive` * **Seedance 1.0 pro fast**:文生视频默认 `16:9`,图生视频默认 `adaptive` **duration** `integer` | 视频时长 生成视频时长(单位:秒)。 `duration` 和 `frames` 二选一即可,`frames` 优先级更高。如果您希望生成整数秒的视频,建议指定 `duration`。 不同模型的 `duration = -1` 适配规则 当 `duration` 设置为 `-1` 时,实际生成视频的时长可通过 [查询视频生成任务 API](/docs/get-video-generation-task-api) 返回的 `duration` 字段获取。视频时长与计费相关,请谨慎设置。 | 模型 | `duration = -1`取值规则 | | --- | --- | | Seedance 2.0 系列 | 模型在 `duration` 的有效取值范围内,自主选择合适的视频长度(整数秒)。 | | Seedance 2.5(视频编辑任务) | 模型根据提示词意图选定待编辑视频,并自动保持输出视频时长和待编辑视频基本一致,不支持另行设置。 | \ | |> 输出时长可能为非整数秒 | \ | |> 输出时长可能略短于待编辑视频,误差约 0.4 秒 | | Seedance 2.5(其他任务类型) | 模型在 `duration` 的有效取值范围内,自主选择合适的视频长度(整数秒)。 | > **说明:duration 返回值说明** > > 通过 [查询视频生成任务 API](/docs/get-video-generation-task-api) 接口返回的 `duration` 值为视频的时长约数(整数秒),与实际的视频时长可能不同。具体返回规则如下: > - 计算公式:接口返回的 `duration` = 实际总帧数 / 24(向下取整) > - 举例:若最终生成视频为 133 帧,视频实际时长为 133 / 24 = 5.54 秒;向下取整后,`duration` 最终返回值为 5 > **注意** > > Seedance 2.5 模型在**视频编辑任务**(详见 [任务类型与判定条件](/docs/seedance-2-5#2.5_task_type_intro))存在特殊限制: > * 仅支持配置`duration`为 `-1`,不支持指定具体输出时长。 > * 传入的待编辑视频时长需在 `[4, 30]s` 内,否则将触发报错。 **模型支持**: * **Seedance 2.5**:默认值 `-1`;取值范围 `[4, 30]`;或设置为 `-1`(智能选择) * **Seedance 2.0 系列**:取值范围 `[4, 15]`;或设置为 `-1`(智能选择) * **Seedance 1.0 pro**:取值范围 `[2, 12]` * **Seedance 1.0 pro fast**:取值范围 `[2, 12]` **frames** `integer` | 视频帧数 生成视频的帧数。通过指定帧数可以灵活控制生成视频的长度,生成小数秒的视频。 由于 `frames` 的取值限制,仅能支持有限小数秒,您需要根据公式推算最接近的帧数: * **计算公式**:帧数 = 时长 × 帧率(24) * **格式约束**:支持 `[29, 289]` 区间内所有满足 `25 + 4n` 格式的整数值,其中 n 为正整数 **举例**:假设需要生成 2.4 秒的视频,帧数 = 2.4 × 24 = 57.6。由于 `frames` 不支持 57.6,您只能选择一个最接近的值——根据 `25 + 4n` 计算出最接近的帧数为 57,实际生成的视频为 57 / 24 = 2.375 秒。 `duration` 和 `frames` 二选一即可,`frames` 优先级更高。 **取值范围**:`[29, 289]` **模型支持**: * `Seedance 1.0 pro` * `Seedance 1.0 pro fast` **generate_audio** `boolean` `默认值 true` | 生成有声视频 控制生成的视频是否包含与画面同步的声音。 * `true`:模型输出的视频包含同步音频,模型会基于文本提示词与视觉内容自动生成匹配的人声、音效及背景音乐。建议将对话部分置于双引号内以优化音频生成效果,例如:男人叫住女人说:"你记住,以后不可以用手指指月亮。" * `false`:模型输出的视频为无声视频。 > **注意** > > 生成的有声视频均为单声道,和传入的音频声道数无关。 **模型支持**: * `Seedance 2.5` * `Seedance 2.0 系列` **watermark** `boolean` `默认值 false` | 视频水印 生成视频是否包含水印。 * `true`:生成视频右下角会展示 `AI 生成` 水印。 * `false`:生成视频不含水印。 **output_format==new==** `string` `默认值 mp4` | 输出格式 输出视频的格式。 * `mp4`:通用格式,兼容性最好,采用标准色彩精度,可在网页、移动端、各类播放器及分发平台直接播放。 * `mov`:面向专业场景的高色彩精度格式,更好地保持画面色彩与亮度一致性、适用于调色、抠像、合成等对色彩还原要求高的专业后期加工。推荐在视频编辑、视频延长场景使用 mov 格式作为输入和输出。 > **说明:mov 格式播放兼容性** > > mov 格式采用专业编码(H.264 视频编码+yuv444p 色度采样+PCM 音频编码),部分播放器可能不兼容。以下为常见的支持播放 mov 格式的播放器: > > | 播放器 | macOS | Windows | > | --- | --- | --- | > | IINA | ✓ | ✕ | > | VLC | ✓ | ✓ | > | mpv | ✓ | ✓ | > | ffplay | ✓ | ✓ | **模型支持**: * `Seedance 2.5` **seed** `integer` `默认值 -1` | 随机种子 种子整数,用于控制生成内容的随机性。`-1` 表示使用随机数替代。 > **注意** > > * 相同的请求下,模型收到不同的 `seed` 值(不指定、令 `seed=-1` 或手动变更),将生成不同的结果。 > * 相同的请求下,模型收到相同的 `seed` 值,会生成类似的结果,但不保证完全一致。 **取值范围**:`[-1, 2147483647]` **模型支持**: * `Seedance 1.0 pro` * `Seedance 1.0 pro fast` **camera_fixed** `boolean` `默认值 false` | 固定摄像头 是否固定摄像头。 * `true`:固定摄像头。平台会在用户提示词中追加固定摄像头,实际效果不保证。 * `false`:不固定摄像头。 参考图场景不支持。 **模型支持**: * `Seedance 1.0 pro` * `Seedance 1.0 pro fast` **return_last_frame** `boolean` `默认值 false` | 返回尾帧 是否返回生成视频的尾帧图像。 * `true`:返回生成视频的尾帧图像,可通过 [查询视频生成任务接口](/docs/get-video-generation-task-api) 获取,尾帧图像的格式为 `jpeg`,宽高像素值与生成的视频保持一致,无水印。 * `false`:不返回生成视频的尾帧图像。 使用该参数可实现生成多个连续视频:以上一个生成视频的尾帧作为下一个视频任务的首帧,快速生成多个连续视频,调用示例详见 [教程](/docs/video-generation-tutorial#141cf7fa)。 **draft** `boolean` `默认值 false` | 样片模式 控制是否开启样片模式。[阅读文档](/docs/video-generation-tutorial#5acd28c8) 获取使用教程和注意事项。 * `true`:开启样片模式,生成一段预览视频,用于确认场景结构、镜头调度、主体动作与 Prompt 意图是否符合预期。 * `false`:关闭样片模式,正常生成一段视频。 > **说明** > > * 开启样片模式后,仅支持生成 480p 分辨率的 Draft 视频(使用其他分辨率会报错)。 > * 参数限制和计费方式详见 [Seedance 2.5 样片模式](/docs/seedance-2-5#2.5_draft_mode)。 **模型支持**: * `Seedance 2.5` **service_tier** `string` `默认值 default` | 服务等级 指定处理本次请求的服务等级类型。 * `default`:在线推理模式,RPM 和并发数配额较低(详见 [模型列表](/docs/model-list#7571da3f)),适合对推理时效性要求较高的场景。 * `flex`:离线推理模式,TPD 配额更高(详见 [模型列表](/docs/model-list#7571da3f)),价格为在线推理的 50%,适合对推理时延要求不高的场景。`Seedance 2.5`、`Seedance 2.0 系列`暂不支持。 > **注意** > > 不支持修改已提交任务的服务等级。 **模型支持**: * `Seedance 1.0 pro` * `Seedance 1.0 pro fast` **callback_url** `string` | 回调地址 填写本次生成任务结果的回调通知地址。当视频生成任务有状态变化时,方舟将向此地址推送 POST 请求,请求内容结构与 [查询任务 API](/docs/get-video-generation-task-api) 的返回体一致。 > **说明** > > 回调返回的 `status` 包括以下状态: > > * `queued`:排队中 > * `running`:任务运行中 > * `succeeded`:任务成功(如发送失败,即 5 秒内未接收到成功发送的信息,会回调三次) > * `failed`:任务失败(如发送失败,即 5 秒内未接收到成功发送的信息,会回调三次) > * `expired`:任务超时,即任务处于「运行中或排队中」状态超过过期时间,可通过 `execution_expires_after` 字段设置过期时间 **execution_expires_after** `integer` `默认值 172800` | 任务超时阈值 任务超时阈值。指定任务提交后的过期时间(单位:秒),从 `created_at` 时间戳开始计算,默认 48 小时。 超过该时间后任务会被自动终止,并标记为 `expired` 状态。 不论使用哪种 `service_tier`,都建议根据业务场景设置合适的超时时间。 **取值范围**:`[3600, 259200]` **priority** `integer` `默认值 0` | 执行优先级 设置当前请求的执行优先级,决定其在队列中的排序位置。数值越大,优先级越高。 默认情况下,请求按 FIFO(First In, First Out,先进先出)顺序执行;设置较高优先级后,该请求将插队到同 Endpoint(推理接入点)下所有低优先级请求之前。 **示例**:某 Endpoint 当前队列中有 3 个排队中(`status=queued`)任务,优先级均为 0(默认): ``` 队列:[任务 A: priority=0] → [任务 B: priority=0] → [任务 C: priority=0] ``` 此时提交一个 `priority=5` 的新请求,该请求将直接排到队首: ``` 队列:[新请求: priority=5] → [任务 A: priority=0] → [任务 B: priority=0] → [任务 C: priority=0] ``` > **说明** > > * 相同优先级的请求之间仍按 FIFO 排序。 > * 优先级仅影响排队顺序,不会中断正在执行中(`status=running`)的任务。 > * 优先级仅在同一 Endpoint 内生效,不影响其他 Endpoint。 > * 离线推理模式(`service_tier=flex`)不支持配置优先级。 **取值范围**:`[0, 9]` **模型支持**: * `Seedance 2.5` * `Seedance 2.0 系列` **safety_identifier** `string` | 用户标识 终端用户的唯一标识符,用于协助平台检测您的应用中可能违反火山方舟使用政策的用户。该标识符为英文字符串,需保证对单个用户固定且唯一,长度不超过 64 个字符。 推荐传入对用户名、用户 ID 或邮箱进行哈希处理后生成的字符串,避免泄露用户隐私信息。 **tools** `object[]` | 工具配置 配置模型要调用的工具。 **模型支持**: * `Seedance 2.5` * `Seedance 2.0 系列` **type** `string` `必选` | 工具类型 `tools.type` 指定使用的工具类型。 * `web_search`:联网搜索工具。开启联网搜索后,模型会根据用户的提示词自主判断是否搜索互联网内容(如商品、天气等)。可提升生成视频的时效性,但也会增加一定的时延。[阅读教程](/docs/seedance-2-0#c40ed3ef) 获取详细代码示例。 > **说明** > > 实际搜索次数可通过 [查询视频生成任务 API](/docs/get-video-generation-task-api) 返回的 `usage.tool_usage.web_search` 字段获取,如果为 0 表示未搜索。 ## 响应参数 **id** `string` | 任务 ID 视频生成任务 ID。仅保存 7 天(从 `created_at` 时间戳开始计算),超时后将自动清除。 * 设置 `"draft": true`,为 Draft 视频任务 ID。 * 设置 `"draft": false`,为正常视频任务 ID。 创建视频生成任务为**异步接口**,获取 ID 后需要通过 [查询视频生成任务 API](/docs/get-video-generation-task-api) 来查询任务状态。任务成功后会输出生成视频的 `video_url`。 ## 代码示例 ## 全模态参考 ### Python #### Request ```python import os import time # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark client = Ark( # The base URL for model invocation base_url='https://ark.cn-beijing.volces.com/api/v3', # Get API Key:https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.environ.get("ARK_API_KEY"), ) if __name__ == "__main__": print("----- create request -----") create_result = client.content_generation.tasks.create( model="doubao-seedance-2-5-260628", # Replace with Model ID content=[ { "type": "text", "text": "明亮多彩的广告片风格,果味饼干为主角,包含草莓、苹果、葡萄、橙子四种口味,草莓味参考@图像1,饼干与对应水果以强秩序感的几何阵列排布,整体画面干净、高级、节奏强。开场水果快速建立视觉聚焦,参考@视频1的构图,音乐重拍切入。随后不同口味饼干整齐排列,切特写,参考@视频2的动态和运镜。高潮段一块饼干被折断,瞬间进入慢动作,果味夹心爆开,碎屑飞溅,果汁感与颗粒冲击被放大展示,参考@视频3的冲击感。横向阵列,形成节奏抛物感,参考@视频4的运动,突出秩序美感与产品丰富度。随后迅速回到快节奏剪辑。结尾英文文字 One bite of crispness, a heart full of delight 快速分词切换入画,配合强节奏文字运动与产品定格,参考@视频5,最终品牌感收束,饼干和水果向四周发散,参考@视频6画面充满年轻、活力、好吃、想分享的广告氛围。", }, { "type": "image_url", "image_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_reference1.png" }, "role": "reference_image", }, { "type": "video_url", "video_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference2.mp4" }, "role": "reference_video", }, { "type": "video_url", "video_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference3.mp4" }, "role": "reference_video", }, { "type": "video_url", "video_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference4.mp4" }, "role": "reference_video", }, { "type": "video_url", "video_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference5.mp4" }, "role": "reference_video", }, { "type": "video_url", "video_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference6.mp4" }, "role": "reference_video", }, { "type": "video_url", "video_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference7.mp4" }, "role": "reference_video", }, ], generate_audio=True, ratio="16:9", duration=15, extra_body={ "omni_reference_task_type": "reference", "output_format": "mov", }, watermark=True, ) print(create_result) # Polling query section print("----- polling task status -----") task_id = create_result.id deadline = time.monotonic() + 30 * 60 while time.monotonic() < deadline: get_result = client.content_generation.tasks.get(task_id=task_id) status = get_result.status if status == "succeeded": print("----- task succeeded -----") print(get_result) break elif status == "failed": raise RuntimeError(f"Video generation task failed: {get_result.error}") else: print(f"Current status: {status}, Retrying after 10 seconds...") time.sleep(10) else: raise TimeoutError("Video generation task did not finish within 30 minutes") ``` #### Response ``` ----- create request ----- ContentGenerationTaskID(id='cgt-20260414114820-*****') ----- polling task status ----- Current status: running, Retrying after 10 seconds... Current status: running, Retrying after 10 seconds... Current status: running, Retrying after 10 seconds... ... ----- task succeeded ----- ContentGenerationTask(id='cgt-20260414114820-*****', model='doubao-seedance-2-5-260628', status='succeeded', error=None, content=Content(video_url='https://xxx', last_frame_url=None, file_url=None), usage=Usage(completion_tokens=411300, total_tokens=411300), frames=None, framespersecond=24, created_at=1776138520, updated_at=1776139219, seed=33608, service_tier='default', execution_expires_after=172800, generate_audio=True, duration=11, ratio='16:9', output_format='mov', resolution='720p', draft=False, draft_task_id=None) ``` ### Java #### Request ```java package com.ark.sample; import com.volcengine.ark.runtime.models.content_generation.*; import com.volcengine.ark.runtime.service.ArkService; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; import retrofit2.Call; import retrofit2.Retrofit; import retrofit2.http.Body; import retrofit2.http.POST; import java.io.IOException; import java.time.Duration; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; public class ContentGenerationTaskExample { interface ContentGenerationApi { @POST("contents/generations/tasks") Call create(@Body Map request); } // Client initialization static String apiKey = System.getenv("ARK_API_KEY"); static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); static Dispatcher dispatcher = new Dispatcher(); static ArkService service = ArkService.builder() .baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .build(); static Retrofit retrofit = ArkService.defaultRetrofit( ArkService.defaultApiKeyClient(apiKey, Duration.ofSeconds(180)), ArkService.defaultObjectMapper(), "https://ark.cn-beijing.volces.com/api/v3/", Runnable::run); static ContentGenerationApi contentGenerationApi = retrofit.create(ContentGenerationApi.class); public static void main(String[] args) throws IOException { // Model ID final String modelId = "doubao-seedance-2-5-260628"; // Text prompt final String prompt = "明亮多彩的广告片风格,果味饼干为主角,包含草莓、苹果、葡萄、橙子四种口味,草莓味参考@图像1,饼干与对应水果以强秩序感的几何阵列排布,整体画面干净、高级、节奏强。开场水果快速建立视觉聚焦,参考@视频1的构图,音乐重拍切入。随后不同口味饼干整齐排列,切特写,参考@视频2的动态和运镜。高潮段一块饼干被折断,瞬间进入慢动作,果味夹心爆开,碎屑飞溅,果汁感与颗粒冲击被放大展示,参考@视频3的冲击感。横向阵列,形成节奏抛物感,参考@视频4的运动,突出秩序美感与产品丰富度。随后迅速回到快节奏剪辑。结尾英文文字 One bite of crispness, a heart full of delight 快速分词切换入画,配合强节奏文字运动与产品定格,参考@视频5,最终品牌感收束,饼干和水果向四周发散,参考@视频6画面充满年轻、活力、好吃、想分享的广告氛围。"; // Example resource URLs final String refImage1 = "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_reference1.png"; final String refVideo1 = "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference2.mp4"; final String refVideo2 = "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference3.mp4"; final String refVideo3 = "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference4.mp4"; final String refVideo4 = "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference5.mp4"; final String refVideo5 = "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference6.mp4"; final String refVideo6 = "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference7.mp4"; // Output video parameters final boolean generateAudio = true; final String videoRatio = "16:9"; final long videoDuration = 15L; System.out.println("----- create request -----"); // Build request content List contents = new ArrayList<>(); // 1. Text prompt contents.add(ContentItem.builder() .type(ContentType.TEXT) .text(prompt) .build()); // 2. Reference image 1 contents.add(ContentItem.builder() .type(ContentType.IMAGE_URL) .imageUrl(ImageURL.builder() .url(refImage1) .build()) .role("reference_image") .build()); // 3. Reference video 1 contents.add(ContentItem.builder() .type(ContentType.VIDEO_URL) .videoUrl(VideoURL.builder() .url(refVideo1) .build()) .role("reference_video") .build()); // 4. Reference video 2 contents.add(ContentItem.builder() .type(ContentType.VIDEO_URL) .videoUrl(VideoURL.builder() .url(refVideo2) .build()) .role("reference_video") .build()); // 5. Reference video 3 contents.add(ContentItem.builder() .type(ContentType.VIDEO_URL) .videoUrl(VideoURL.builder() .url(refVideo3) .build()) .role("reference_video") .build()); // 6. Reference video 4 contents.add(ContentItem.builder() .type(ContentType.VIDEO_URL) .videoUrl(VideoURL.builder() .url(refVideo4) .build()) .role("reference_video") .build()); // 7. Reference video 5 contents.add(ContentItem.builder() .type(ContentType.VIDEO_URL) .videoUrl(VideoURL.builder() .url(refVideo5) .build()) .role("reference_video") .build()); // 8. Reference video 6 contents.add(ContentItem.builder() .type(ContentType.VIDEO_URL) .videoUrl(VideoURL.builder() .url(refVideo6) .build()) .role("reference_video") .build()); // Create video generation task Map createRequest = new LinkedHashMap<>(); createRequest.put("model", modelId); createRequest.put("content", contents); createRequest.put("generate_audio", generateAudio); createRequest.put("ratio", videoRatio); createRequest.put("duration", videoDuration); createRequest.put("omni_reference_task_type", "reference"); createRequest.put("output_format", "mov"); createRequest.put("watermark", true); retrofit2.Response response = contentGenerationApi.create(createRequest).execute(); if (!response.isSuccessful() || response.body() == null) { throw new IOException("Unexpected code " + response.code()); } CreateContentGenerationTaskResponse createResult = response.body(); System.out.println("Task Created: " + createResult); // Get task details and poll status String taskId = createResult.getId(); pollTaskStatus(taskId); } /** * Poll task status * @param taskId Task ID */ private static void pollTaskStatus(String taskId) { String getRequest = taskId; System.out.println("----- polling task status -----"); try { long deadlineNanos = System.nanoTime() + TimeUnit.MINUTES.toNanos(30); while (System.nanoTime() < deadlineNanos) { ContentGenerationTask getResponse = service.getContentGenerationTask(getRequest); String status = getResponse.getStatus().toString(); if ("succeeded".equalsIgnoreCase(status)) { System.out.println("----- task succeeded -----"); System.out.println(getResponse); return; } else if ("failed".equalsIgnoreCase(status)) { throw new IllegalStateException( "Video generation task failed: " + getResponse.getError()); } else { System.out.printf("Current status: %s, Retrying in 10 seconds...%n", status); TimeUnit.SECONDS.sleep(10); } } throw new IllegalStateException( "Video generation task did not finish within 30 minutes"); } catch (InterruptedException ie) { Thread.currentThread().interrupt(); throw new RuntimeException("Polling interrupted", ie); } catch (Exception e) { throw new RuntimeException("Error occurred while polling", e); } finally { service.shutdownExecutor(); } } } ``` #### Response ``` ----- create request ----- ContentGenerationTaskID(id='cgt-20260414114820-*****') ----- polling task status ----- Current status: running, Retrying after 10 seconds... Current status: running, Retrying after 10 seconds... Current status: running, Retrying after 10 seconds... ... ----- task succeeded ----- ContentGenerationTask(id='cgt-20260414114820-*****', model='doubao-seedance-2-5-260628', status='succeeded', error=None, content=Content(video_url='https://xxx', last_frame_url=None, file_url=None), usage=Usage(completion_tokens=411300, total_tokens=411300), frames=None, framespersecond=24, created_at=1776138520, updated_at=1776139219, seed=33608, service_tier='default', execution_expires_after=172800, generate_audio=True, duration=11, ratio='16:9', output_format='mov', resolution='720p', draft=False, draft_task_id=None) ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "time" "github.com/volcengine/ark-runtime-go/arkruntime" model "github.com/volcengine/ark-runtime-go/arkruntime/model/contentgeneration" ) func main() { // Initialize Ark client client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), // The base URL for model invocation arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute) defer cancel() // Model ID modelID := "doubao-seedance-2-5-260628" // Text prompt prompt := "明亮多彩的广告片风格,果味饼干为主角,包含草莓、苹果、葡萄、橙子四种口味,草莓味参考@图像1,饼干与对应水果以强秩序感的几何阵列排布,整体画面干净、高级、节奏强。开场水果快速建立视觉聚焦,参考@视频1的构图,音乐重拍切入。随后不同口味饼干整齐排列,切特写,参考@视频2的动态和运镜。高潮段一块饼干被折断,瞬间进入慢动作,果味夹心爆开,碎屑飞溅,果汁感与颗粒冲击被放大展示,参考@视频3的冲击感。横向阵列,形成节奏抛物感,参考@视频4的运动,突出秩序美感与产品丰富度。随后迅速回到快节奏剪辑。结尾英文文字 One bite of crispness, a heart full of delight 快速分词切换入画,配合强节奏文字运动与产品定格,参考@视频5,最终品牌感收束,饼干和水果向四周发散,参考@视频6画面充满年轻、活力、好吃、想分享的广告氛围。" // Example resource URLs refImage1 := "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_reference1.png" refVideo1 := "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference2.mp4" refVideo2 := "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference3.mp4" refVideo3 := "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference4.mp4" refVideo4 := "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference5.mp4" refVideo5 := "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference6.mp4" refVideo6 := "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference7.mp4" // Output video parameters generateAudio := true videoRatio := "16:9" videoDuration := int64(15) omniReferenceTaskType := "reference" outputFormat := "mov" // 1. Create video generation task fmt.Println("----- create request -----") createReq := &model.CreateContentGenerationTaskRequest{ Model: modelID, GenerateAudio: model.NewOptBool(generateAudio), Ratio: model.NewOptString(videoRatio), Duration: model.NewOptInt64(videoDuration), Content: []model.ContentItem{ { Type: model.ContentTypeText, Text: model.NewOptString(prompt), }, { Type: model.ContentTypeImageURL, ImageURL: model.NewOptImageURL(model.ImageURL{ URL: refImage1, }), Role: model.NewOptString("reference_image"), }, { Type: model.ContentTypeVideoURL, VideoURL: model.NewOptVideoURL(model.VideoURL{ URL: refVideo1, }), Role: model.NewOptString("reference_video"), }, { Type: model.ContentTypeVideoURL, VideoURL: model.NewOptVideoURL(model.VideoURL{ URL: refVideo2, }), Role: model.NewOptString("reference_video"), }, { Type: model.ContentTypeVideoURL, VideoURL: model.NewOptVideoURL(model.VideoURL{ URL: refVideo3, }), Role: model.NewOptString("reference_video"), }, { Type: model.ContentTypeVideoURL, VideoURL: model.NewOptVideoURL(model.VideoURL{ URL: refVideo4, }), Role: model.NewOptString("reference_video"), }, { Type: model.ContentTypeVideoURL, VideoURL: model.NewOptVideoURL(model.VideoURL{ URL: refVideo5, }), Role: model.NewOptString("reference_video"), }, { Type: model.ContentTypeVideoURL, VideoURL: model.NewOptVideoURL(model.VideoURL{ URL: refVideo6, }), Role: model.NewOptString("reference_video"), }, }, Watermark: model.NewOptBool(true), } createResp, err := client.CreateContentGenerationTask( ctx, createReq, arkruntime.WithExtraBody(map[string]interface{}{ "omni_reference_task_type": omniReferenceTaskType, "output_format": outputFormat, }), ) if err != nil { panic(fmt.Errorf("create content generation task: %w", err)) } taskID := createResp.ID fmt.Printf("Task Created with ID: %s\n", taskID) // 2. Poll task status pollTaskStatus(ctx, client, taskID) } // poll task status func pollTaskStatus(ctx context.Context, client *arkruntime.Client, taskID string) { fmt.Println("----- polling task status -----") for { getReq := taskID getResp, err := client.GetContentGenerationTask(ctx, getReq) if err != nil { panic(fmt.Errorf("get content generation task: %w", err)) } status := getResp.Status if status == "succeeded" { fmt.Println("----- task succeeded -----") fmt.Printf("Task ID: %s \n", getResp.ID) fmt.Printf("Model: %s \n", getResp.Model) fmt.Printf("Video URL: %s \n", getResp.Content.Or(model.TaskContent{}).VideoURL.Or("")) fmt.Printf("Completion Tokens: %d \n", getResp.Usage.Or(model.TaskUsage{}).CompletionTokens) fmt.Printf("Created At: %d, Updated At: %d\n", getResp.CreatedAt.Or(0), getResp.UpdatedAt.Or(0)) return } else if status == "failed" { if getResp.Error.IsSet() { panic(fmt.Errorf("video generation task failed: %s: %s", getResp.Error.Value.Code, getResp.Error.Value.Message)) } panic("video generation task failed") } else { fmt.Printf("Current status: %s, Retrying in 10 seconds... \n", status) time.Sleep(10 * time.Second) } } } ``` #### Response ``` ----- create request ----- ContentGenerationTaskID(id='cgt-20260414114820-*****') ----- polling task status ----- Current status: running, Retrying after 10 seconds... Current status: running, Retrying after 10 seconds... Current status: running, Retrying after 10 seconds... ... ----- task succeeded ----- ContentGenerationTask(id='cgt-20260414114820-*****', model='doubao-seedance-2-5-260628', status='succeeded', error=None, content=Content(video_url='https://xxx', last_frame_url=None, file_url=None), usage=Usage(completion_tokens=411300, total_tokens=411300), frames=None, framespersecond=24, created_at=1776138520, updated_at=1776139219, seed=33608, service_tier='default', execution_expires_after=172800, generate_audio=True, duration=11, ratio='16:9', output_format='mov', resolution='720p', draft=False, draft_task_id=None) ``` ### cURL #### Request ```bash curl -X POST https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seedance-2-5-260628", "content": [ { "type": "text", "text": "明亮多彩的广告片风格,果味饼干为主角,包含草莓、苹果、葡萄、橙子四种口味,草莓味参考@图像1,饼干与对应水果以强秩序感的几何阵列排布,整体画面干净、高级、节奏强。开场水果快速建立视觉聚焦,参考@视频1的构图,音乐重拍切入。随后不同口味饼干整齐排列,切特写,参考@视频2的动态和运镜。高潮段一块饼干被折断,瞬间进入慢动作,果味夹心爆开,碎屑飞溅,果汁感与颗粒冲击被放大展示,参考@视频3的冲击感。横向阵列,形成节奏抛物感,参考@视频4的运动,突出秩序美感与产品丰富度。随后迅速回到快节奏剪辑。结尾英文文字 One bite of crispness, a heart full of delight 快速分词切换入画,配合强节奏文字运动与产品定格,参考@视频5,最终品牌感收束,饼干和水果向四周发散,参考@视频6画面充满年轻、活力、好吃、想分享的广告氛围。" }, { "type": "image_url", "image_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seedance2.5_reference1.png" }, "role": "reference_image" }, { "type": "video_url", "video_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference2.mp4" }, "role": "reference_video" }, { "type": "video_url", "video_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference3.mp4" }, "role": "reference_video" }, { "type": "video_url", "video_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference4.mp4" }, "role": "reference_video" }, { "type": "video_url", "video_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference5.mp4" }, "role": "reference_video" }, { "type": "video_url", "video_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference6.mp4" }, "role": "reference_video" }, { "type": "video_url", "video_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_reference7.mp4" }, "role": "reference_video" } ], "generate_audio": true, "ratio": "16:9", "duration": 15, "omni_reference_task_type": "reference", "output_format": "mov", "watermark": true }' ``` #### Response ``` ----- create request ----- ContentGenerationTaskID(id='cgt-20260414114820-*****') ----- polling task status ----- Current status: running, Retrying after 10 seconds... Current status: running, Retrying after 10 seconds... Current status: running, Retrying after 10 seconds... ... ----- task succeeded ----- ContentGenerationTask(id='cgt-20260414114820-*****', model='doubao-seedance-2-5-260628', status='succeeded', error=None, content=Content(video_url='https://xxx', last_frame_url=None, file_url=None), usage=Usage(completion_tokens=411300, total_tokens=411300), frames=None, framespersecond=24, created_at=1776138520, updated_at=1776139219, seed=33608, service_tier='default', execution_expires_after=172800, generate_audio=True, duration=11, ratio='16:9', output_format='mov', resolution='720p', draft=False, draft_task_id=None) ``` ## 编辑视频 ### Python #### Request ```python import os import time # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark client = Ark( # The base URL for model invocation base_url='https://ark.cn-beijing.volces.com/api/v3', # Get API Key:https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.environ.get("ARK_API_KEY"), ) if __name__ == "__main__": print("----- create request -----") create_result = client.content_generation.tasks.create( model="doubao-seedance-2-5-260628", # Replace with Model ID content=[ { "type": "text", "text": "视频编辑:删除 @视频1中的所有人,除了主角。", }, { "type": "video_url", "video_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_edit_input.mov" }, "role": "reference_video", }, ], generate_audio=True, ratio="adaptive", duration=-1, extra_body={ "omni_reference_task_type": "edit", "output_format": "mov", }, watermark=True, ) print(create_result) # Polling query section print("----- polling task status -----") task_id = create_result.id deadline = time.monotonic() + 30 * 60 while time.monotonic() < deadline: get_result = client.content_generation.tasks.get(task_id=task_id) status = get_result.status if status == "succeeded": print("----- task succeeded -----") print(get_result) break elif status == "failed": raise RuntimeError(f"Video generation task failed: {get_result.error}") else: print(f"Current status: {status}, Retrying after 10 seconds...") time.sleep(10) else: raise TimeoutError("Video generation task did not finish within 30 minutes") ``` #### Response ``` ----- create request ----- ContentGenerationTaskID(id='cgt-20260414114820-*****') ----- polling task status ----- Current status: running, Retrying after 10 seconds... Current status: running, Retrying after 10 seconds... Current status: running, Retrying after 10 seconds... ... ----- task succeeded ----- ContentGenerationTask(id='cgt-20260414114820-*****', model='doubao-seedance-2-5-260628', status='succeeded', error=None, content=Content(video_url='https://xxx', last_frame_url=None, file_url=None), usage=Usage(completion_tokens=411300, total_tokens=411300), frames=None, framespersecond=24, created_at=1776138520, updated_at=1776139219, seed=33608, service_tier='default', execution_expires_after=172800, generate_audio=True, duration=16, ratio='5:4', output_format='mov', resolution='720p', draft=False, draft_task_id=None) ``` ### Java #### Request ```java package com.ark.sample; import com.volcengine.ark.runtime.models.content_generation.*; import com.volcengine.ark.runtime.service.ArkService; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; import retrofit2.Call; import retrofit2.Retrofit; import retrofit2.http.Body; import retrofit2.http.POST; import java.io.IOException; import java.time.Duration; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; public class ContentGenerationTaskExample { interface ContentGenerationApi { @POST("contents/generations/tasks") Call create(@Body Map request); } // Client initialization static String apiKey = System.getenv("ARK_API_KEY"); static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); static Dispatcher dispatcher = new Dispatcher(); static ArkService service = ArkService.builder() .baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .build(); static Retrofit retrofit = ArkService.defaultRetrofit( ArkService.defaultApiKeyClient(apiKey, Duration.ofSeconds(180)), ArkService.defaultObjectMapper(), "https://ark.cn-beijing.volces.com/api/v3/", Runnable::run); static ContentGenerationApi contentGenerationApi = retrofit.create(ContentGenerationApi.class); public static void main(String[] args) throws IOException { // Model ID final String modelId = "doubao-seedance-2-5-260628"; // Text prompt final String prompt = "视频编辑:删除 @视频1中的所有人,除了主角。"; // Example resource URLs final String refVideo = "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_edit_input.mov"; // Output video parameters final boolean generateAudio = true; final String videoRatio = "adaptive"; final long videoDuration = -1L; System.out.println("----- create request -----"); // Build request content List contents = new ArrayList<>(); // 1. Text prompt contents.add(ContentItem.builder() .type(ContentType.TEXT) .text(prompt) .build()); // 2. Reference video contents.add(ContentItem.builder() .type(ContentType.VIDEO_URL) .videoUrl(VideoURL.builder() .url(refVideo) .build()) .role("reference_video") .build()); // Create video generation task Map createRequest = new LinkedHashMap<>(); createRequest.put("model", modelId); createRequest.put("content", contents); createRequest.put("generate_audio", generateAudio); createRequest.put("ratio", videoRatio); createRequest.put("duration", videoDuration); createRequest.put("omni_reference_task_type", "edit"); createRequest.put("output_format", "mov"); createRequest.put("watermark", true); retrofit2.Response response = contentGenerationApi.create(createRequest).execute(); if (!response.isSuccessful() || response.body() == null) { throw new IOException("Unexpected code " + response.code()); } CreateContentGenerationTaskResponse createResult = response.body(); System.out.println("Task Created: " + createResult); // Get task details and poll status String taskId = createResult.getId(); pollTaskStatus(taskId); } /** * Poll task status * @param taskId Task ID */ private static void pollTaskStatus(String taskId) { String getRequest = taskId; System.out.println("----- polling task status -----"); try { long deadlineNanos = System.nanoTime() + TimeUnit.MINUTES.toNanos(30); while (System.nanoTime() < deadlineNanos) { ContentGenerationTask getResponse = service.getContentGenerationTask(getRequest); String status = getResponse.getStatus().toString(); if ("succeeded".equalsIgnoreCase(status)) { System.out.println("----- task succeeded -----"); System.out.println(getResponse); return; } else if ("failed".equalsIgnoreCase(status)) { throw new IllegalStateException( "Video generation task failed: " + getResponse.getError()); } else { System.out.printf("Current status: %s, Retrying in 10 seconds...%n", status); TimeUnit.SECONDS.sleep(10); } } throw new IllegalStateException( "Video generation task did not finish within 30 minutes"); } catch (InterruptedException ie) { Thread.currentThread().interrupt(); throw new RuntimeException("Polling interrupted", ie); } catch (Exception e) { throw new RuntimeException("Error occurred while polling", e); } finally { service.shutdownExecutor(); } } } ``` #### Response ``` ----- create request ----- ContentGenerationTaskID(id='cgt-20260414114820-*****') ----- polling task status ----- Current status: running, Retrying after 10 seconds... Current status: running, Retrying after 10 seconds... Current status: running, Retrying after 10 seconds... ... ----- task succeeded ----- ContentGenerationTask(id='cgt-20260414114820-*****', model='doubao-seedance-2-5-260628', status='succeeded', error=None, content=Content(video_url='https://xxx', last_frame_url=None, file_url=None), usage=Usage(completion_tokens=411300, total_tokens=411300), frames=None, framespersecond=24, created_at=1776138520, updated_at=1776139219, seed=33608, service_tier='default', execution_expires_after=172800, generate_audio=True, duration=16, ratio='5:4', output_format='mov', resolution='720p', draft=False, draft_task_id=None) ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "time" "github.com/volcengine/ark-runtime-go/arkruntime" model "github.com/volcengine/ark-runtime-go/arkruntime/model/contentgeneration" ) func main() { // Initialize Ark client client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), // The base URL for model invocation arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute) defer cancel() // Model ID modelID := "doubao-seedance-2-5-260628" // Text prompt prompt := "视频编辑:删除 @视频1中的所有人,除了主角。" // Example resource URLs refVideo := "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_edit_input.mov" // Output video parameters generateAudio := true videoRatio := "adaptive" videoDuration := int64(-1) omniReferenceTaskType := "edit" outputFormat := "mov" // 1. Create video generation task fmt.Println("----- create request -----") createReq := &model.CreateContentGenerationTaskRequest{ Model: modelID, GenerateAudio: model.NewOptBool(generateAudio), Ratio: model.NewOptString(videoRatio), Duration: model.NewOptInt64(videoDuration), Content: []model.ContentItem{ { Type: model.ContentTypeText, Text: model.NewOptString(prompt), }, { Type: model.ContentTypeVideoURL, VideoURL: model.NewOptVideoURL(model.VideoURL{ URL: refVideo, }), Role: model.NewOptString("reference_video"), }, }, Watermark: model.NewOptBool(true), } createResp, err := client.CreateContentGenerationTask( ctx, createReq, arkruntime.WithExtraBody(map[string]interface{}{ "omni_reference_task_type": omniReferenceTaskType, "output_format": outputFormat, }), ) if err != nil { panic(fmt.Errorf("create content generation task: %w", err)) } taskID := createResp.ID fmt.Printf("Task Created with ID: %s\n", taskID) // 2. Poll task status pollTaskStatus(ctx, client, taskID) } // poll task status func pollTaskStatus(ctx context.Context, client *arkruntime.Client, taskID string) { fmt.Println("----- polling task status -----") for { getReq := taskID getResp, err := client.GetContentGenerationTask(ctx, getReq) if err != nil { panic(fmt.Errorf("get content generation task: %w", err)) } status := getResp.Status if status == "succeeded" { fmt.Println("----- task succeeded -----") fmt.Printf("Task ID: %s \n", getResp.ID) fmt.Printf("Model: %s \n", getResp.Model) fmt.Printf("Video URL: %s \n", getResp.Content.Or(model.TaskContent{}).VideoURL.Or("")) fmt.Printf("Completion Tokens: %d \n", getResp.Usage.Or(model.TaskUsage{}).CompletionTokens) fmt.Printf("Created At: %d, Updated At: %d\n", getResp.CreatedAt.Or(0), getResp.UpdatedAt.Or(0)) return } else if status == "failed" { if getResp.Error.IsSet() { panic(fmt.Errorf("video generation task failed: %s: %s", getResp.Error.Value.Code, getResp.Error.Value.Message)) } panic("video generation task failed") } else { fmt.Printf("Current status: %s, Retrying in 10 seconds... \n", status) time.Sleep(10 * time.Second) } } } ``` #### Response ``` ----- create request ----- ContentGenerationTaskID(id='cgt-20260414114820-*****') ----- polling task status ----- Current status: running, Retrying after 10 seconds... Current status: running, Retrying after 10 seconds... Current status: running, Retrying after 10 seconds... ... ----- task succeeded ----- ContentGenerationTask(id='cgt-20260414114820-*****', model='doubao-seedance-2-5-260628', status='succeeded', error=None, content=Content(video_url='https://xxx', last_frame_url=None, file_url=None), usage=Usage(completion_tokens=411300, total_tokens=411300), frames=None, framespersecond=24, created_at=1776138520, updated_at=1776139219, seed=33608, service_tier='default', execution_expires_after=172800, generate_audio=True, duration=16, ratio='5:4', output_format='mov', resolution='720p', draft=False, draft_task_id=None) ``` ### cURL #### Request ```bash curl -X POST https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seedance-2-5-260628", "content": [ { "type": "text", "text": "视频编辑:删除 @视频1中的所有人,除了主角。" }, { "type": "video_url", "video_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/seedance2.5_edit_input.mov" }, "role": "reference_video" } ], "generate_audio": true, "ratio": "adaptive", "duration": -1, "omni_reference_task_type": "edit", "output_format": "mov", "watermark": true }' ``` #### Response ``` ----- create request ----- ContentGenerationTaskID(id='cgt-20260414114820-*****') ----- polling task status ----- Current status: running, Retrying after 10 seconds... Current status: running, Retrying after 10 seconds... Current status: running, Retrying after 10 seconds... ... ----- task succeeded ----- ContentGenerationTask(id='cgt-20260414114820-*****', model='doubao-seedance-2-5-260628', status='succeeded', error=None, content=Content(video_url='https://xxx', last_frame_url=None, file_url=None), usage=Usage(completion_tokens=411300, total_tokens=411300), frames=None, framespersecond=24, created_at=1776138520, updated_at=1776139219, seed=33608, service_tier='default', execution_expires_after=172800, generate_audio=True, duration=16, ratio='5:4', output_format='mov', resolution='720p', draft=False, draft_task_id=None) ``` ## 延长视频 ### Python #### Request ```python import os import time # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark client = Ark( # The base URL for model invocation base_url='https://ark.cn-beijing.volces.com/api/v3', # Get API Key:https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.environ.get("ARK_API_KEY"), ) if __name__ == "__main__": print("----- create request -----") create_result = client.content_generation.tasks.create( model="doubao-seedance-2-5-260628", # Replace with Model ID content=[ { "type": "text", "text": "延长@视频1,窗户打开后进入@视频2的美术馆室内,最后镜头进入@视频3的画内", }, { "type": "video_url", "video_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/r2v_extend_video1_75.mov" }, "role": "reference_video", }, { "type": "video_url", "video_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/r2v_extend_video2.mp4" }, "role": "reference_video", }, { "type": "video_url", "video_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/r2v_extend_video3.mp4" }, "role": "reference_video", }, ], generate_audio=True, ratio="adaptive", duration=11, extra_body={ "omni_reference_task_type": "extend", "output_format": "mov", }, watermark=True, ) print(create_result) # Polling query section print("----- polling task status -----") task_id = create_result.id deadline = time.monotonic() + 30 * 60 while time.monotonic() < deadline: get_result = client.content_generation.tasks.get(task_id=task_id) status = get_result.status if status == "succeeded": print("----- task succeeded -----") print(get_result) break elif status == "failed": raise RuntimeError(f"Video generation task failed: {get_result.error}") else: print(f"Current status: {status}, Retrying after 10 seconds...") time.sleep(10) else: raise TimeoutError("Video generation task did not finish within 30 minutes") ``` #### Response ``` ----- create request ----- ContentGenerationTaskID(id='cgt-20260414114820-*****') ----- polling task status ----- Current status: running, Retrying after 10 seconds... Current status: running, Retrying after 10 seconds... Current status: running, Retrying after 10 seconds... ... ----- task succeeded ----- ContentGenerationTask(id='cgt-20260414114820-*****', model='doubao-seedance-2-5-260628', status='succeeded', error=None, content=Content(video_url='https://xxx', last_frame_url=None, file_url=None), usage=Usage(completion_tokens=411300, total_tokens=411300), frames=None, framespersecond=24, created_at=1776138520, updated_at=1776139219, seed=33608, service_tier='default', execution_expires_after=172800, generate_audio=True, duration=11, ratio='7:5', output_format='mov', resolution='720p', draft=False, draft_task_id=None) ``` ### Java #### Request ```java package com.ark.sample; import com.volcengine.ark.runtime.models.content_generation.*; import com.volcengine.ark.runtime.service.ArkService; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; import retrofit2.Call; import retrofit2.Retrofit; import retrofit2.http.Body; import retrofit2.http.POST; import java.io.IOException; import java.time.Duration; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; public class ContentGenerationTaskExample { interface ContentGenerationApi { @POST("contents/generations/tasks") Call create(@Body Map request); } // Client initialization static String apiKey = System.getenv("ARK_API_KEY"); static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); static Dispatcher dispatcher = new Dispatcher(); static ArkService service = ArkService.builder() .baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .build(); static Retrofit retrofit = ArkService.defaultRetrofit( ArkService.defaultApiKeyClient(apiKey, Duration.ofSeconds(180)), ArkService.defaultObjectMapper(), "https://ark.cn-beijing.volces.com/api/v3/", Runnable::run); static ContentGenerationApi contentGenerationApi = retrofit.create(ContentGenerationApi.class); public static void main(String[] args) throws IOException { // Model ID final String modelId = "doubao-seedance-2-5-260628"; // Text prompt final String prompt = "延长@视频1,窗户打开后进入@视频2的美术馆室内,最后镜头进入@视频3的画内"; // Example resource URLs final String refVideo1 = "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/r2v_extend_video1_75.mov"; final String refVideo2 = "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/r2v_extend_video2.mp4"; final String refVideo3 = "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/r2v_extend_video3.mp4"; // Output video parameters final boolean generateAudio = true; final String videoRatio = "adaptive"; final long videoDuration = 11L; System.out.println("----- create request -----"); // Build request content List contents = new ArrayList<>(); // 1. Text prompt contents.add(ContentItem.builder() .type(ContentType.TEXT) .text(prompt) .build()); // 2. Reference video 1 contents.add(ContentItem.builder() .type(ContentType.VIDEO_URL) .videoUrl(VideoURL.builder() .url(refVideo1) .build()) .role("reference_video") .build()); // 3. Reference video 2 contents.add(ContentItem.builder() .type(ContentType.VIDEO_URL) .videoUrl(VideoURL.builder() .url(refVideo2) .build()) .role("reference_video") .build()); // 4. Reference video 3 contents.add(ContentItem.builder() .type(ContentType.VIDEO_URL) .videoUrl(VideoURL.builder() .url(refVideo3) .build()) .role("reference_video") .build()); // Create video generation task Map createRequest = new LinkedHashMap<>(); createRequest.put("model", modelId); createRequest.put("content", contents); createRequest.put("generate_audio", generateAudio); createRequest.put("ratio", videoRatio); createRequest.put("duration", videoDuration); createRequest.put("omni_reference_task_type", "extend"); createRequest.put("output_format", "mov"); createRequest.put("watermark", true); retrofit2.Response response = contentGenerationApi.create(createRequest).execute(); if (!response.isSuccessful() || response.body() == null) { throw new IOException("Unexpected code " + response.code()); } CreateContentGenerationTaskResponse createResult = response.body(); System.out.println("Task Created: " + createResult); // Get task details and poll status String taskId = createResult.getId(); pollTaskStatus(taskId); } /** * Poll task status * @param taskId Task ID */ private static void pollTaskStatus(String taskId) { String getRequest = taskId; System.out.println("----- polling task status -----"); try { long deadlineNanos = System.nanoTime() + TimeUnit.MINUTES.toNanos(30); while (System.nanoTime() < deadlineNanos) { ContentGenerationTask getResponse = service.getContentGenerationTask(getRequest); String status = getResponse.getStatus().toString(); if ("succeeded".equalsIgnoreCase(status)) { System.out.println("----- task succeeded -----"); System.out.println(getResponse); return; } else if ("failed".equalsIgnoreCase(status)) { throw new IllegalStateException( "Video generation task failed: " + getResponse.getError()); } else { System.out.printf("Current status: %s, Retrying in 10 seconds...%n", status); TimeUnit.SECONDS.sleep(10); } } throw new IllegalStateException( "Video generation task did not finish within 30 minutes"); } catch (InterruptedException ie) { Thread.currentThread().interrupt(); throw new RuntimeException("Polling interrupted", ie); } catch (Exception e) { throw new RuntimeException("Error occurred while polling", e); } finally { service.shutdownExecutor(); } } } ``` #### Response ``` ----- create request ----- ContentGenerationTaskID(id='cgt-20260414114820-*****') ----- polling task status ----- Current status: running, Retrying after 10 seconds... Current status: running, Retrying after 10 seconds... Current status: running, Retrying after 10 seconds... ... ----- task succeeded ----- ContentGenerationTask(id='cgt-20260414114820-*****', model='doubao-seedance-2-5-260628', status='succeeded', error=None, content=Content(video_url='https://xxx', last_frame_url=None, file_url=None), usage=Usage(completion_tokens=411300, total_tokens=411300), frames=None, framespersecond=24, created_at=1776138520, updated_at=1776139219, seed=33608, service_tier='default', execution_expires_after=172800, generate_audio=True, duration=11, ratio='7:5', output_format='mov', resolution='720p', draft=False, draft_task_id=None) ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "time" "github.com/volcengine/ark-runtime-go/arkruntime" model "github.com/volcengine/ark-runtime-go/arkruntime/model/contentgeneration" ) func main() { // Initialize Ark client client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), // The base URL for model invocation arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute) defer cancel() // Model ID modelID := "doubao-seedance-2-5-260628" // Text prompt prompt := "延长@视频1,窗户打开后进入@视频2的美术馆室内,最后镜头进入@视频3的画内" // Example resource URLs refVideo1 := "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/r2v_extend_video1_75.mov" refVideo2 := "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/r2v_extend_video2.mp4" refVideo3 := "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/r2v_extend_video3.mp4" // Output video parameters generateAudio := true videoRatio := "adaptive" videoDuration := int64(11) omniReferenceTaskType := "extend" outputFormat := "mov" // 1. Create video generation task fmt.Println("----- create request -----") createReq := &model.CreateContentGenerationTaskRequest{ Model: modelID, GenerateAudio: model.NewOptBool(generateAudio), Ratio: model.NewOptString(videoRatio), Duration: model.NewOptInt64(videoDuration), Content: []model.ContentItem{ { Type: model.ContentTypeText, Text: model.NewOptString(prompt), }, { Type: model.ContentTypeVideoURL, VideoURL: model.NewOptVideoURL(model.VideoURL{ URL: refVideo1, }), Role: model.NewOptString("reference_video"), }, { Type: model.ContentTypeVideoURL, VideoURL: model.NewOptVideoURL(model.VideoURL{ URL: refVideo2, }), Role: model.NewOptString("reference_video"), }, { Type: model.ContentTypeVideoURL, VideoURL: model.NewOptVideoURL(model.VideoURL{ URL: refVideo3, }), Role: model.NewOptString("reference_video"), }, }, Watermark: model.NewOptBool(true), } createResp, err := client.CreateContentGenerationTask( ctx, createReq, arkruntime.WithExtraBody(map[string]interface{}{ "omni_reference_task_type": omniReferenceTaskType, "output_format": outputFormat, }), ) if err != nil { panic(fmt.Errorf("create content generation task: %w", err)) } taskID := createResp.ID fmt.Printf("Task Created with ID: %s\n", taskID) // 2. Poll task status pollTaskStatus(ctx, client, taskID) } // poll task status func pollTaskStatus(ctx context.Context, client *arkruntime.Client, taskID string) { fmt.Println("----- polling task status -----") for { getReq := taskID getResp, err := client.GetContentGenerationTask(ctx, getReq) if err != nil { panic(fmt.Errorf("get content generation task: %w", err)) } status := getResp.Status if status == "succeeded" { fmt.Println("----- task succeeded -----") fmt.Printf("Task ID: %s \n", getResp.ID) fmt.Printf("Model: %s \n", getResp.Model) fmt.Printf("Video URL: %s \n", getResp.Content.Or(model.TaskContent{}).VideoURL.Or("")) fmt.Printf("Completion Tokens: %d \n", getResp.Usage.Or(model.TaskUsage{}).CompletionTokens) fmt.Printf("Created At: %d, Updated At: %d\n", getResp.CreatedAt.Or(0), getResp.UpdatedAt.Or(0)) return } else if status == "failed" { if getResp.Error.IsSet() { panic(fmt.Errorf("video generation task failed: %s: %s", getResp.Error.Value.Code, getResp.Error.Value.Message)) } panic("video generation task failed") } else { fmt.Printf("Current status: %s, Retrying in 10 seconds... \n", status) time.Sleep(10 * time.Second) } } } ``` #### Response ``` ----- create request ----- ContentGenerationTaskID(id='cgt-20260414114820-*****') ----- polling task status ----- Current status: running, Retrying after 10 seconds... Current status: running, Retrying after 10 seconds... Current status: running, Retrying after 10 seconds... ... ----- task succeeded ----- ContentGenerationTask(id='cgt-20260414114820-*****', model='doubao-seedance-2-5-260628', status='succeeded', error=None, content=Content(video_url='https://xxx', last_frame_url=None, file_url=None), usage=Usage(completion_tokens=411300, total_tokens=411300), frames=None, framespersecond=24, created_at=1776138520, updated_at=1776139219, seed=33608, service_tier='default', execution_expires_after=172800, generate_audio=True, duration=11, ratio='7:5', output_format='mov', resolution='720p', draft=False, draft_task_id=None) ``` ### cURL #### Request ```bash curl -X POST https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seedance-2-5-260628", "content": [ { "type": "text", "text": "延长@视频1,窗户打开后进入@视频2的美术馆室内,最后镜头进入@视频3的画内" }, { "type": "video_url", "video_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/r2v_extend_video1_75.mov" }, "role": "reference_video" }, { "type": "video_url", "video_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/r2v_extend_video2.mp4" }, "role": "reference_video" }, { "type": "video_url", "video_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/video-generation/r2v_extend_video3.mp4" }, "role": "reference_video" } ], "generate_audio": true, "ratio": "adaptive", "duration": 11, "omni_reference_task_type": "extend", "output_format": "mov", "watermark": true }' ``` #### Response ``` ----- create request ----- ContentGenerationTaskID(id='cgt-20260414114820-*****') ----- polling task status ----- Current status: running, Retrying after 10 seconds... Current status: running, Retrying after 10 seconds... Current status: running, Retrying after 10 seconds... ... ----- task succeeded ----- ContentGenerationTask(id='cgt-20260414114820-*****', model='doubao-seedance-2-5-260628', status='succeeded', error=None, content=Content(video_url='https://xxx', last_frame_url=None, file_url=None), usage=Usage(completion_tokens=411300, total_tokens=411300), frames=None, framespersecond=24, created_at=1776138520, updated_at=1776139219, seed=33608, service_tier='default', execution_expires_after=172800, generate_audio=True, duration=11, ratio='7:5', output_format='mov', resolution='720p', draft=False, draft_task_id=None) ``` ## 有声视频-首帧 ### cURL #### Request ```bash curl https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seedance-2-5-260628", "content": [ { "type": "text", "text": "女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动,可以听到风声" }, { "type": "image_url", "image_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/i2v_foxrgirl.png" } } ], "generate_audio": true, "ratio": "adaptive", "duration": 5, "watermark": true }' ``` #### Response ``` { "id": "cgt-2025******-****" } ``` ### Python #### Request ```python import os from arkruntime import Ark # Get API Key:https://ark.volcengine.com/region:cn-beijing/apikey client = Ark(base_url="https://ark.cn-beijing.volces.com/api/v3", api_key=os.environ.get("ARK_API_KEY")) if __name__ == "__main__": print("----- create request -----") resp = client.content_generation.tasks.create( model="doubao-seedance-2-5-260628", # Replace with Model ID content=[ { "text": ( "女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动,可以听到风声" ), "type": "text" }, { "image_url": { "url": ( "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/i2v_foxrgirl.png" ) }, "type": "image_url" } ], generate_audio=True, ratio="adaptive", duration=5, watermark=True, ) print(resp) ``` #### Response ``` { "id": "cgt-2025******-****" } ``` ### Java #### Request ```java package com.ark.sample; import com.volcengine.ark.runtime.models.content_generation.*; import com.volcengine.ark.runtime.service.ArkService; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; public class ContentGenerationTaskExample { // Make sure that you have stored the API Key in the environment variable ARK_API_KEY // Initialize the Ark client to read your API Key from an environment variable static String apiKey = System.getenv("ARK_API_KEY"); static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); static Dispatcher dispatcher = new Dispatcher(); static ArkService service = ArkService.builder() .baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .build(); public static void main(String[] args) { String model = "doubao-seedance-2-5-260628"; // Replace with Model ID Boolean generateAudio = true; String ratio = "adaptive"; Long duration = 5L; Boolean watermark = true; System.out.println("----- create request -----"); List contents = new ArrayList<>(); // Combination of text prompt and parameters contents.add(ContentItem.builder() .type(ContentType.TEXT) .text("女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动,可以听到风声") .build()); // The URL of the first frame image contents.add(ContentItem.builder() .type(ContentType.IMAGE_URL) .imageUrl(ImageURL.builder() .url("https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/i2v_foxrgirl.png") .build()) .build()); // Create a video generation task CreateContentGenerationTaskRequest createRequest = CreateContentGenerationTaskRequest.builder() .model(model) .content(contents) .generateAudio(generateAudio) .ratio(ratio) .duration(duration) .watermark(watermark) .build(); CreateContentGenerationTaskResponse createResult = service.createContentGenerationTask(createRequest); System.out.println(createResult); service.shutdownExecutor(); } } ``` #### Response ``` { "id": "cgt-2025******-****" } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" model "github.com/volcengine/ark-runtime-go/arkruntime/model/contentgeneration" ) func main() { // Make sure that you have stored the API Key in the environment variable ARK_API_KEY // Initialize the Ark client to read your API Key from an environment variable client := arkruntime.NewClientWithApiKey( // Get your API Key from the environment variable. This is the default mode and you can modify it as required os.Getenv("ARK_API_KEY"), // The base URL for model invocation arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() // Replace with Model ID modelEp := "doubao-seedance-2-5-260628" // Generate a task fmt.Println("----- create request -----") createReq := &model.CreateContentGenerationTaskRequest{ Model: modelEp, GenerateAudio: model.NewOptBool(true), Ratio: model.NewOptString("adaptive"), Duration: model.NewOptInt64(5), Watermark: model.NewOptBool(true), Content: []model.ContentItem{ { // Combination of text prompt and parameters Type: model.ContentTypeText, Text: model.NewOptString("女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动,可以听到风声"), }, { // The URL of the first frame image Type: model.ContentTypeImageURL, ImageURL: model.NewOptImageURL(model.ImageURL{ URL: "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/i2v_foxrgirl.png", }), }, }, } createResp, err := client.CreateContentGenerationTask(ctx, createReq) if err != nil { fmt.Printf("create content generation error: %v", err) return } taskID := createResp.ID fmt.Printf("Task Created with ID: %s", taskID) } ``` #### Response ``` { "id": "cgt-2025******-****" } ``` ## 有声视频-首尾帧 ### cURL #### Request ```bash curl -X POST https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seedance-2-0-260128", "content": [ { "type": "text", "text": "图中女孩对着镜头说“茄子”,360度环绕运镜" }, { "type": "image_url", "image_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seepro_first_frame.jpeg" }, "role": "first_frame" }, { "type": "image_url", "image_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seepro_last_frame.jpeg" }, "role": "last_frame" } ], "generate_audio":true, "ratio": "adaptive", "duration": 5, "watermark": true }' ``` #### Response ``` { "id": "cgt-2025******-****" } ``` ### Python #### Request ```python import os # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark # Make sure that you have stored the API Key in the environment variable ARK_API_KEY # Initialize the Ark client to read your API Key from an environment variable client = Ark( # This is the default path. You can configure it based on the service location base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key:https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.environ.get("ARK_API_KEY"), ) if __name__ == "__main__": print("----- create request -----") create_result = client.content_generation.tasks.create( model="doubao-seedance-2-0-260128", # Replace with Model ID content=[ { # Combination of text prompt and parameters "type": "text", "text": "图中女孩对着镜头说\"茄子\",360度环绕运镜" }, { # The URL of the first frame image "type": "image_url", "image_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seepro_first_frame.jpeg" }, "role": "first_frame" }, { # The URL of the last frame image "type": "image_url", "image_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seepro_last_frame.jpeg" }, "role": "last_frame" } ], generate_audio=True, ratio="adaptive", duration=5, watermark=True, ) print(create_result) ``` #### Response ``` { "id": "cgt-2025******-****" } ``` ### Java #### Request ```java package com.ark.sample; import com.volcengine.ark.runtime.models.content_generation.*; import com.volcengine.ark.runtime.service.ArkService; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; public class ContentGenerationTaskExample { // Make sure that you have stored the API Key in the environment variable ARK_API_KEY // Initialize the Ark client to read your API Key from an environment variable static String apiKey = System.getenv("ARK_API_KEY"); static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); static Dispatcher dispatcher = new Dispatcher(); static ArkService service = ArkService.builder() .baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .build(); public static void main(String[] args) { String model = "doubao-seedance-2-5-260628"; // Replace with Model ID Boolean generateAudio = true; String ratio = "adaptive"; Long duration = 5L; Boolean watermark = true; System.out.println("----- create request -----"); List contents = new ArrayList<>(); // Combination of text prompt and parameters contents.add(ContentItem.builder() .type(ContentType.TEXT) .text("图中女孩对着镜头说“茄子”,360度环绕运镜") .build()); // The URL of the first frame image contents.add(ContentItem.builder() .type(ContentType.IMAGE_URL) .imageUrl(ImageURL.builder() .url("https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seepro_first_frame.jpeg") .build()) .role("first_frame") .build()); // The URL of the last frame image contents.add(ContentItem.builder() .type(ContentType.IMAGE_URL) .imageUrl(ImageURL.builder() .url("https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seepro_last_frame.jpeg") .build()) .role("last_frame") .build()); // Create a video generation task CreateContentGenerationTaskRequest createRequest = CreateContentGenerationTaskRequest.builder() .model(model) .content(contents) .generateAudio(generateAudio) .ratio(ratio) .duration(duration) .watermark(watermark) .build(); CreateContentGenerationTaskResponse createResult = service.createContentGenerationTask(createRequest); System.out.println(createResult); // Get the details of the task String taskId = createResult.getId(); String getRequest = taskId; // Polling query section System.out.println("----- polling task status -----"); while (true) { try { ContentGenerationTask getResponse = service.getContentGenerationTask(getRequest); String status = getResponse.getStatus().toString(); if ("succeeded".equalsIgnoreCase(status)) { System.out.println("----- task succeeded -----"); System.out.println(getResponse); break; } else if ("failed".equalsIgnoreCase(status)) { System.out.println("----- task failed -----"); System.out.println("Error: " + getResponse.getStatus()); break; } else { System.out.printf("Current status: %s, Retrying in 10 seconds...", status); TimeUnit.SECONDS.sleep(10); } } catch (InterruptedException ie) { Thread.currentThread().interrupt(); System.err.println("Polling interrupted"); break; } } } } ``` #### Response ``` { "id": "cgt-2025******-****" } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "time" "github.com/volcengine/ark-runtime-go/arkruntime" model "github.com/volcengine/ark-runtime-go/arkruntime/model/contentgeneration" ) func main() { // Make sure that you have stored the API Key in the environment variable ARK_API_KEY // Initialize the Ark client to read your API Key from an environment variable client := arkruntime.NewClientWithApiKey( // Get your API Key from the environment variable. This is the default mode and you can modify it as required os.Getenv("ARK_API_KEY"), // The base URL for model invocation arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() // Replace with Model ID modelEp := "doubao-seedance-2-5-260628" // Generate a task fmt.Println("----- create request -----") createReq := &model.CreateContentGenerationTaskRequest{ Model: modelEp, GenerateAudio: model.NewOptBool(true), Ratio: model.NewOptString("adaptive"), Duration: model.NewOptInt64(5), Watermark: model.NewOptBool(true), Content: []model.ContentItem{ { // Combination of text prompt and parameters Type: model.ContentTypeText, Text: model.NewOptString("图中女孩对着镜头说“茄子”,360度环绕运镜"), }, { // The URL of the first frame image Type: model.ContentTypeImageURL, ImageURL: model.NewOptImageURL(model.ImageURL{ URL: "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seepro_first_frame.jpeg", }), Role: model.NewOptString("first_frame"), }, { // The URL of the last frame image Type: model.ContentTypeImageURL, ImageURL: model.NewOptImageURL(model.ImageURL{ URL: "https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/seepro_last_frame.jpeg", }), Role: model.NewOptString("last_frame"), }, }, } createResp, err := client.CreateContentGenerationTask(ctx, createReq) if err != nil { fmt.Printf("create content generation error: %v", err) return } taskID := createResp.ID fmt.Printf("Task Created with ID: %s", taskID) // Polling query section fmt.Println("----- polling task status -----") for { getReq := taskID getResp, err := client.GetContentGenerationTask(ctx, getReq) if err != nil { fmt.Printf("get content generation task error: %v", err) return } status := getResp.Status if status == "succeeded" { fmt.Println("----- task succeeded -----") fmt.Printf("Task ID: %s \n", getResp.ID) fmt.Printf("Model: %s \n", getResp.Model) fmt.Printf("Video URL: %s \n", getResp.Content.Or(model.TaskContent{}).VideoURL.Or("")) fmt.Printf("Completion Tokens: %d \n", getResp.Usage.Or(model.TaskUsage{}).CompletionTokens) fmt.Printf("Created At: %d, Updated At: %d", getResp.CreatedAt.Or(0), getResp.UpdatedAt.Or(0)) return } else if status == "failed" { fmt.Println("----- task failed -----") if getResp.Error.IsSet() { fmt.Printf("Error Code: %s, Message: %s", getResp.Error.Value.Code, getResp.Error.Value.Message) } return } else { fmt.Printf("Current status: %s, Retrying in 10 seconds... \n", status) time.Sleep(10 * time.Second) } } } ``` #### Response ``` { "id": "cgt-2025******-****" } ``` ## 图生视频-base64编码 ### cURL #### Request ```bash curl -X POST https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seedance-1-0-lite-i2v-250428", "content": [ { "type": "text", "text": "女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动" }, { "type": "image_url", "image_url": { "url": "data:image/png;base64,aHR0******cG5n" } } ], "ratio": "adaptive", "duration": 5, "watermark": true }' ``` #### Response ``` { "id": "cgt-2025******-****" } ``` ## 文生视频 ### cURL #### Request ```bash curl -X POST https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seedance-1-0-pro-250528", "content": [ { "type": "text", "text": "写实风格,晴朗的蓝天之下,一大片白色的雏菊花田,镜头逐渐拉近,最终定格在一朵雏菊花的特写上,花瓣上有几颗晶莹的露珠" } ], "ratio": "16:9", "duration": 5, "watermark": true }' ``` #### Response ``` { "id": "cgt-2026******-****" } ``` ### Python #### Request ```python import os # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark # Make sure that you have stored the API Key in the environment variable ARK_API_KEY # Initialize the Ark client to read your API Key from an environment variable client = Ark( # This is the default path. You can configure it based on the service location base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key:https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.environ.get("ARK_API_KEY"), ) if __name__ == "__main__": print("----- create request -----") create_result = client.content_generation.tasks.create( model="doubao-seedance-1-0-pro-250528", # Replace with Model ID content=[ { # Combination of text prompt and parameters "type": "text", "text": "写实风格,晴朗的蓝天之下,一大片白色的雏菊花田,镜头逐渐拉近,最终定格在一朵雏菊花的特写上,花瓣上有几颗晶莹的露珠" } ], ratio="16:9", duration=5, watermark=True, ) print(create_result) ``` #### Response ``` { "id": "cgt-2026******-****" } ``` ### Java #### Request ```java package com.ark.sample; import com.volcengine.ark.runtime.models.content_generation.*; import com.volcengine.ark.runtime.service.ArkService; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; public class ContentGenerationTaskExample { // Make sure that you have stored the API Key in the environment variable ARK_API_KEY // Initialize the Ark client to read your API Key from an environment variable static String apiKey = System.getenv("ARK_API_KEY"); static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); static Dispatcher dispatcher = new Dispatcher(); static ArkService service = ArkService.builder() .baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .build(); public static void main(String[] args) { String model = "doubao-seedance-1-0-pro-250528"; // Replace with Model ID String ratio = "16:9"; Long duration = 5L; Boolean watermark = true; System.out.println("----- create request -----"); List contents = new ArrayList<>(); // Combination of text prompt and parameters contents.add(ContentItem.builder() .type(ContentType.TEXT) .text("写实风格,晴朗的蓝天之下,一大片白色的雏菊花田,镜头逐渐拉近,最终定格在一朵雏菊花的特写上,花瓣上有几颗晶莹的露珠") .build()); // Create a video generation task CreateContentGenerationTaskRequest createRequest = CreateContentGenerationTaskRequest.builder() .model(model) .content(contents) .ratio(ratio) .duration(duration) .watermark(watermark) .build(); CreateContentGenerationTaskResponse createResult = service.createContentGenerationTask(createRequest); System.out.println(createResult); // shutdown service after all requests is finished service.shutdownExecutor(); } } ``` #### Response ``` { "id": "cgt-2026******-****" } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" model "github.com/volcengine/ark-runtime-go/arkruntime/model/contentgeneration" ) func main() { // Make sure that you have stored the API Key in the environment variable ARK_API_KEY // Initialize the Ark client to read your API Key from an environment variable client := arkruntime.NewClientWithApiKey( // Get your API Key from the environment variable. This is the default mode and you can modify it as required os.Getenv("ARK_API_KEY"), // The base URL for model invocation arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() // Replace with Model ID modelEp := "doubao-seedance-1-0-pro-250528" // Generate a task fmt.Println("----- create request -----") createReq := &model.CreateContentGenerationTaskRequest{ Model: modelEp, Ratio: model.NewOptString("16:9"), Duration: model.NewOptInt64(5), Watermark: model.NewOptBool(true), Content: []model.ContentItem{ { // Combination of text prompt and parameters Type: model.ContentTypeText, Text: model.NewOptString("写实风格,晴朗的蓝天之下,一大片白色的雏菊花田,镜头逐渐拉近,最终定格在一朵雏菊花的特写上,花瓣上有几颗晶莹的露珠"), }, }, } createResp, err := client.CreateContentGenerationTask(ctx, createReq) if err != nil { fmt.Printf("create content generation error: %v", err) return } taskID := createResp.ID fmt.Printf("Task Created with ID: %s", taskID) } ``` #### Response ``` { "id": "cgt-2026******-****" } ``` --- # 查询视频生成任务 Source: https://ark.volcengine.com/region:cn-beijing/docs/get-video-generation-task-api `GET https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks/{id}` 查询视频生成任务的状态。 > **说明** > > * 仅支持查询最近 7 天的任务记录,时间区间为 [T-7 天, T),其中 T 为请求发起时刻的 UTC 时间戳(精确到秒)。 > * 视频 URL 有效期为 24 小时,请及时下载或转存。 > * Seedance 2.5 模型生成的视频 URL 下载次数上限为 100 次。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **id** `string` `必选` | 任务 ID 您需要查询的视频生成任务的 ID ## 响应参数 **id** `string` | 任务 ID 视频生成任务 ID **model** `string` | 模型名称与版本 任务使用的模型名称和版本,格式为 `模型名称-版本` **status** `string` | 任务状态 任务状态,以及相关的信息: * `queued`:任务排队中。 * `running`:任务运行中。 * `cancelled`:任务已取消。取消状态 24h 自动删除(只支持 `queued` 状态的任务被取消)。 * `succeeded`:任务成功。 * `failed`:任务失败。 * `expired`:任务超时。 **content** `object` | 输出内容 视频生成任务的输出内容 **last_frame_url** `string` | 尾帧图像 URL `content.last_frame_url` 视频的尾帧图像 URL。有效期为 24 小时,请及时下载或转存。 Seedance 2.5 模型生成的视频 URL 下载次数上限为 100 次。 说明:[创建视频生成任务](/docs/create-video-generation-task-api) 时设置 `"return_last_frame": true` 时,会返回该参数。 **video_url** `string` | 视频 URL `content.video_url` 生成视频的 URL。有效期为 24 小时,请及时下载或转存。 Seedance 2.5 模型生成的视频 URL 下载次数上限为 100 次。 推荐配置火山引擎 TOS 提供的数据订阅功能,将您的模型推理产物自动转存到自己的 TOS 桶中,便于长期备份或二次加工。详细介绍请参见 [TOS 数据订阅](https://docs.volcengine.com/docs/TorchObjectStorage/Datasubscription-5?lang=zh)。 **created_at** `integer` | 创建时间 任务创建时间的 Unix 时间戳(秒) **draft** `boolean` | 是否为 Draft 视频 生成的视频是否为 Draft 视频。`true` 表示 Draft 视频,`false` 表示正式视频。 **模型支持**: * `Seedance 2.5` **duration** `integer` | 视频时长(秒) 生成视频的时长,单位:秒。 说明:**`duration` 和 `frames` 参数只会返回一个**。创建视频生成任务时未指定 `frames`,会返回 `duration`。 **error** `object` | 错误信息 错误提示信息。任务成功时返回 `null`,任务失败时返回错误数据,错误信息具体参见 [错误处理](/docs/error-codes#common-error-codes-agent)。 > **注意** > > Seedance 2.5 模型在特定的任务类型中,需排队等待到任务被消费时,才会返回报错信息。详情参考 [报错机制](/docs/seedance-2-5#2.5_error_handling)。 **code** `string` | 错误码 `error.code` **message** `string` | 错误提示信息 `error.message` **execution_expires_after** `integer` | 任务超时阈值(秒) 任务提交后的过期时间。任务超过该时间未完成会被自动终止,并标记为 `expired` 状态。 **frames** `integer` | 视频帧数 生成视频的帧数。 说明:**`duration` 和 `frames` 参数只会返回一个**。创建视频生成任务时指定了 `frames`,会返回 `frames`。 **framespersecond** `integer` | 视频帧率 生成视频的帧率 **generate_audio** `boolean` | 是否生成同步音频 生成的视频是否包含与画面同步的声音。 * `true`:模型输出的视频包含同步音频。 * `false`:模型输出的视频为无声视频。 **模型支持**: * `Seedance 2.5` * `Seedance 2.0 系列` **output_format** `string` | 输出格式 实际生成视频的格式(`mp4`或`mov`)。 **模型支持**: * `Seedance 2.5` **priority** `integer` | 执行优先级 当前任务的执行优先级,与创建任务时设置的 `priority` 一致。取值范围为 0~9,数值越大,优先级越高。 **模型支持**: * `Seedance 2.5` * `Seedance 2.0 系列` **ratio** `string` | 宽高比 生成视频的宽高比 **resolution** `string` | 分辨率 生成视频的分辨率 **safety_identifier** `string` | 终端用户标识 终端用户的唯一标识符。若创建任务时设置了该参数,接口会原样返回此信息 **seed** `integer` | 随机种子 本次请求使用的种子整数值 **service_tier** `string` | 服务等级 实际处理任务使用的服务等级 **tools** `object[]` | 实际使用的工具 本次请求模型实际使用的工具。未使用工具时不返回 **模型支持**: * `Seedance 2.5` * `Seedance 2.0 系列` **type** `string` | 工具类型 `tools.type` 实际使用的工具类型。 * `web_search`:联网搜索工具 **updated_at** `integer` | 更新时间 任务当前状态更新时间的 Unix 时间戳(秒) **usage** `object` | token 用量 本次请求的 token 用量 **completion_tokens** `integer` | 生成视频消耗的 token 数 `usage.completion_tokens` 模型生成视频消耗的 token 数量,可作为计费对账依据。 > **注意** > > `Seedance 2.0 系列`模型存在最低 token 用量限制,如果实际 token 用量 < 最低 token 用量,本字段会返回最低 token 用量,平台按最低 token 用量计费。 **total_tokens** `integer` | 总 token 数 `usage.total_tokens` 本次请求消耗的总 token 数量。视频生成模型不统计输入 token,输入 token 为 0,故 `total_tokens` = `completion_tokens` **tool_usage** `object` | 工具用量 `usage.tool_usage` 使用工具的用量信息 **web_search** `integer` | 联网搜索调用次数 `usage.tool_usage.web_search` 实际调用联网搜索工具的次数,仅开启联网搜索时返回 ## 代码示例 ## 默认 ### cURL #### Request ```bash TASK_ID="your_task_id" curl -X GET "https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks/$TASK_ID" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" ``` #### Response ``` { "id": "cgt-2026****-****", "model": "doubao-seedance-2-0-260128", "status": "succeeded", "content": { "video_url": "https://ark-content-generation-cn-beijing.tos-cn-beijing.volces.com/xxx" }, "usage": { "completion_tokens": 108900, "total_tokens": 108900 }, "created_at": 1779348818, "updated_at": 1779348874, "seed": 78674, "resolution": "720p", "ratio": "16:9", "duration": 5, "framespersecond": 24, "service_tier": "default", "execution_expires_after": 172800, "generate_audio": true, "draft": false, "priority": 0 } ``` ### Python #### Request ```python import os from arkruntime import Ark client = Ark( api_key=os.environ.get("ARK_API_KEY"), base_url="https://ark.cn-beijing.volces.com/api/v3", ) if __name__ == "__main__": resp = client.content_generation.tasks.get( task_id="cgt-2025****", ) print(resp) ``` #### Response ``` { "id": "cgt-2026****-****", "model": "doubao-seedance-2-0-260128", "status": "succeeded", "content": { "video_url": "https://ark-content-generation-cn-beijing.tos-cn-beijing.volces.com/xxx" }, "usage": { "completion_tokens": 108900, "total_tokens": 108900 }, "created_at": 1779348818, "updated_at": 1779348874, "seed": 78674, "resolution": "720p", "ratio": "16:9", "duration": 5, "framespersecond": 24, "service_tier": "default", "execution_expires_after": 172800, "generate_audio": true, "draft": false, "priority": 0 } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() req := "" resp, err := client.GetContentGenerationTask(ctx, req) if err != nil { fmt.Printf("get content generation task error: %v\n", err) return } fmt.Printf("%+v\n", resp) } ``` #### Response ``` { "id": "cgt-2026****-****", "model": "doubao-seedance-2-0-260128", "status": "succeeded", "content": { "video_url": "https://ark-content-generation-cn-beijing.tos-cn-beijing.volces.com/xxx" }, "usage": { "completion_tokens": 108900, "total_tokens": 108900 }, "created_at": 1779348818, "updated_at": 1779348874, "seed": 78674, "resolution": "720p", "ratio": "16:9", "duration": 5, "framespersecond": 24, "service_tier": "default", "execution_expires_after": 172800, "generate_audio": true, "draft": false, "priority": 0 } ``` ### Java #### Request ```java package com.ark.sample; import com.volcengine.ark.runtime.models.content_generation.*; import com.fasterxml.jackson.core.JsonProcessingException; import com.volcengine.ark.runtime.service.ArkService; import java.util.concurrent.TimeUnit; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; public class Sample { static String apiKey = System.getenv("ARK_API_KEY"); static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); static Dispatcher dispatcher = new Dispatcher(); static ArkService service = ArkService.builder() .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); public static void main(String[] args) throws JsonProcessingException { String taskId = ""; String req = taskId; service.getContentGenerationTask(req).toString(); System.out.println(service.getContentGenerationTask(req)); service.shutdownExecutor(); } } ``` #### Response ``` { "id": "cgt-2026****-****", "model": "doubao-seedance-2-0-260128", "status": "succeeded", "content": { "video_url": "https://ark-content-generation-cn-beijing.tos-cn-beijing.volces.com/xxx" }, "usage": { "completion_tokens": 108900, "total_tokens": 108900 }, "created_at": 1779348818, "updated_at": 1779348874, "seed": 78674, "resolution": "720p", "ratio": "16:9", "duration": 5, "framespersecond": 24, "service_tier": "default", "execution_expires_after": 172800, "generate_audio": true, "draft": false, "priority": 0 } ``` --- # 查询视频生成任务列表 Source: https://ark.volcengine.com/region:cn-beijing/docs/list-video-generation-tasks-api `GET https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks` 通过传入筛选参数,查询符合条件的视频生成任务。 > **说明** > > * 仅支持查询最近 7 天的任务记录,时间区间为 [T-7 天, T),其中 T 为请求发起时刻的 UTC 时间戳(精确到秒)。 > * 视频 URL 有效期为 24 小时,请及时下载或转存。 > * Seedance 2.5 模型生成的产物 URL 下载次数上限为 100 次。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Query 参数 > 在 URL Query String 中传入。 **filter** `object` | 筛选条件 用于筛选任务的参数。 **model** `string` | 推理接入点 ID 筛选 `filter.model` 任务使用的推理接入点(Endpoint)ID,精确搜索。可在控制台 [在线推理] → [自定义推理接入点] 页面复制推理接入点 ID (格式为 `ep-` 开头的字符串), 或通过创建推理接入点接口获取。 **service_tier** `string` `默认值 default` | 服务等级筛选 `filter.service_tier` 处理任务使用的服务等级。 * `default`:在线推理模式。 * `flex`:离线推理模式。 **status** `string` | 任务状态筛选 `filter.status` 过滤参数,查询某个任务状态。任务状态,以及相关的信息: * `queued`:任务排队中。 * `running`:任务运行中。 * `cancelled`:任务已取消。取消状态 24h 自动删除(只支持 `queued` 状态的任务被取消)。 * `succeeded`:任务成功。 * `failed`:任务失败。 * `expired`:任务超时。 **task_ids** `string[]` | 任务 ID 筛选 `filter.task_ids` 视频生成任务 ID,精确搜索,支持同时搜索多个任务 ID。需通过重复参数名的方式传递,示例:`filter.task_ids=id1&filter.task_ids=id2` **page_num** `integer` `默认值 1` | 页码 返回结果的页码。 **取值范围**:`[1, 500]` **page_size** `integer` `默认值 20` | 每页数量 每页显示的结果数量。 **取值范围**:`[1, 500]` ## 响应参数 **items** `object[]` | 任务列表 查询到的视频生成任务列表 **id** `string` | 任务 ID `items.id` 视频生成任务 ID **model** `string` | 模型名称与版本 `items.model` 任务使用的模型名称和版本,格式为 `模型名称-版本` **status** `string` | 任务状态 `items.status` 任务状态,以及相关的信息: * `queued`:任务排队中。 * `running`:任务运行中。 * `cancelled`:任务已取消。取消状态 24h 自动删除(只支持 `queued` 状态的任务被取消)。 * `succeeded`:任务成功。 * `failed`:任务失败。 * `expired`:任务超时。 **content** `object` | 输出内容 `items.content` 视频生成任务完成时返回的输出内容,包含生成视频下载的 URL **last_frame_url** `string` | 尾帧图像 URL `items.content.last_frame_url` 视频的尾帧图像 URL。有效期为 24 小时,请及时下载或转存。 Seedance 2.5 模型生成的视频 URL 下载次数上限为 100 次。 说明:[创建视频生成任务](/docs/create-video-generation-task-api) 时设置 `"return_last_frame": true` 时,会返回该参数。 **video_url** `string` | 视频 URL `items.content.video_url` 生成视频的 URL。有效期为 24 小时,请及时下载或转存。 Seedance 2.5 模型生成的视频 URL 下载次数上限为 100 次。 推荐配置火山引擎 TOS 提供的数据订阅功能,将您的模型推理产物自动转存到自己的 TOS 桶中,便于长期备份或二次加工。详细介绍请参见 [TOS 数据订阅](https://docs.volcengine.com/docs/TorchObjectStorage/Datasubscription-5?lang=zh)。 **created_at** `integer` | 创建时间 `items.created_at` 任务创建时间的 Unix 时间戳(秒) **draft** `boolean` | 是否为 Draft 视频 `items.draft` 生成的视频是否为 Draft 视频。`true` 表示 Draft 视频,`false` 表示正式视频。 **模型支持**: * `Seedance 2.5` **duration** `integer` | 视频时长(秒) `items.duration` 生成视频的时长,单位:秒。 说明:**`duration` 和 `frames` 参数只会返回一个**。创建视频生成任务时未指定 `frames`,会返回 `duration`。 **error** `object` | 错误信息 `items.error` 错误提示信息。任务成功时返回 `null`,任务失败时返回错误数据,错误信息具体参见 [错误处理](/docs/error-codes#common-error-codes-agent)。 > **注意** > > Seedance 2.5 模型在特定的任务类型中,需排队等待到任务被消费时,才会返回报错信息。详情参考 [报错机制](/docs/seedance-2-5#2.5_error_handling)。 **code** `string` | 错误码 `items.error.code` **message** `string` | 错误提示信息 `items.error.message` **execution_expires_after** `integer` | 任务超时阈值(秒) `items.execution_expires_after` 任务提交后的过期时间。任务超过该时间未完成会被自动终止,并标记为 `expired` 状态。 **frames** `integer` | 视频帧数 `items.frames` 生成视频的帧数。 说明:**`duration` 和 `frames` 参数只会返回一个**。创建视频生成任务时指定了 `frames`,会返回 `frames`。 **framespersecond** `integer` | 视频帧率 `items.framespersecond` 生成视频的帧率 **generate_audio** `boolean` | 是否生成同步音频 `items.generate_audio` 生成的视频是否包含与画面同步的声音。 * `true`:模型输出的视频包含同步音频。 * `false`:模型输出的视频为无声视频。 **模型支持**: * `Seedance 2.5` * `Seedance 2.0 系列` **output_format** `string` | 输出格式 `items.output_format` 实际生成视频的封装容器格式(`mp4`或`mov`)。 **模型支持**: * `Seedance 2.5` **priority** `integer` | 执行优先级 `items.priority` 当前任务的执行优先级,与创建任务时设置的 `priority` 一致。取值范围为 0~9,数值越大,优先级越高。 **模型支持**: * `Seedance 2.5` * `Seedance 2.0 系列` **ratio** `string` | 宽高比 `items.ratio` 生成视频的宽高比 **resolution** `string` | 分辨率 `items.resolution` 生成视频的分辨率 **safety_identifier** `string` | 终端用户标识 `items.safety_identifier` 终端用户的唯一标识符。若创建视频生成任务时设置了该参数,接口会原样返回此信息 **seed** `integer` | 随机种子 `items.seed` 本次请求使用的种子整数值 **service_tier** `string` | 服务等级 `items.service_tier` 实际处理任务使用的服务等级 **tools** `object[]` | 实际使用的工具 `items.tools` 本次请求模型实际使用的工具。未使用工具时不返回 **模型支持**: * `Seedance 2.5` * `Seedance 2.0 系列` **type** `string` | 工具类型 `items.tools.type` 实际使用的工具类型。 * `web_search`:联网搜索工具 **updated_at** `integer` | 更新时间 `items.updated_at` 任务当前状态更新时间的 Unix 时间戳(秒) **usage** `object` | token 用量 `items.usage` 本次请求的 token 用量 **completion_tokens** `integer` | 生成视频消耗的 token 数 `items.usage.completion_tokens` 模型生成视频消耗的 token 数量,可作为计费对账依据。 > **注意** > > `Seedance 2.0 系列`模型存在最低 token 用量限制,如果实际 token 用量 < 最低 token 用量,本字段会返回最低 token 用量,平台按最低 token 用量计费。 **total_tokens** `integer` | 总 token 数 `items.usage.total_tokens` 本次请求消耗的总 token 数量。视频生成模型不统计输入 token,输入 token 为 0,故 `total_tokens` = `completion_tokens` **tool_usage** `object` | 工具用量 `items.usage.tool_usage` 使用工具的用量信息 **web_search** `integer` | 联网搜索调用次数 `items.usage.tool_usage.web_search` 实际调用联网搜索工具的次数,仅开启联网搜索时返回 **total** `integer` | 任务总数 符合筛选条件的任务数量 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks?page_size=2&filter.status=succeeded& \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" ``` #### Response ``` { "total": 30, "items": [ { "id": "cgt-2026****-****", "model": "doubao-seedance-2-0-260128", "status": "succeeded", "content": { "video_url": "https://ark-acg-cn-beijing.tos-cn-beijing.volces.com/xxx" }, "usage": { "completion_tokens": 109586, "total_tokens": 109586 }, "created_at": 1779354227, "updated_at": 1779354426, "seed": 70172, "resolution": "720p", "ratio": "4:3", "duration": 5, "framespersecond": 24, "service_tier": "default", "execution_expires_after": 172800, "generate_audio": true, "draft": false, "priority": 0 }, { "id": "cgt-2026****-****", "model": "doubao-seedance-2-0-260128", "status": "succeeded", "content": { "video_url": "https://ark-acg-cn-beijing.tos-cn-beijing.volces.com/xxx" }, "usage": { "completion_tokens": 49761, "total_tokens": 49761 }, "created_at": 1779353985, "updated_at": 1779354268, "seed": 68292, "resolution": "480p", "ratio": "3:4", "duration": 5, "framespersecond": 24, "service_tier": "default", "execution_expires_after": 172800, "generate_audio": true, "draft": false, "priority": 0 }, { "id": "cgt-2026****-****", "model": "doubao-seedance-2-0-260128", "status": "succeeded", "content": { "video_url": "https://ark-acg-cn-beijing.tos-cn-beijing.volces.com/doubao-seedance-2-0/xxx" }, "usage": { "completion_tokens": 109586, "total_tokens": 109586 }, "created_at": 1779353885, "updated_at": 1779354215, "seed": 39832, "resolution": "720p", "ratio": "3:4", "duration": 5, "framespersecond": 24, "service_tier": "default", "execution_expires_after": 172800, "generate_audio": true, "draft": false, "priority": 0 } ] } ``` ### Python #### Request ```python import os from arkruntime import Ark client = Ark( api_key=os.environ.get("ARK_API_KEY"), base_url="https://ark.cn-beijing.volces.com/api/v3", ) if __name__ == "__main__": resp = client.content_generation.tasks.list( page_size=3, status="succeeded", ) print(resp) ``` #### Response ``` { "total": 30, "items": [ { "id": "cgt-2026****-****", "model": "doubao-seedance-2-0-260128", "status": "succeeded", "content": { "video_url": "https://ark-acg-cn-beijing.tos-cn-beijing.volces.com/xxx" }, "usage": { "completion_tokens": 109586, "total_tokens": 109586 }, "created_at": 1779354227, "updated_at": 1779354426, "seed": 70172, "resolution": "720p", "ratio": "4:3", "duration": 5, "framespersecond": 24, "service_tier": "default", "execution_expires_after": 172800, "generate_audio": true, "draft": false, "priority": 0 }, { "id": "cgt-2026****-****", "model": "doubao-seedance-2-0-260128", "status": "succeeded", "content": { "video_url": "https://ark-acg-cn-beijing.tos-cn-beijing.volces.com/xxx" }, "usage": { "completion_tokens": 49761, "total_tokens": 49761 }, "created_at": 1779353985, "updated_at": 1779354268, "seed": 68292, "resolution": "480p", "ratio": "3:4", "duration": 5, "framespersecond": 24, "service_tier": "default", "execution_expires_after": 172800, "generate_audio": true, "draft": false, "priority": 0 }, { "id": "cgt-2026****-****", "model": "doubao-seedance-2-0-260128", "status": "succeeded", "content": { "video_url": "https://ark-acg-cn-beijing.tos-cn-beijing.volces.com/doubao-seedance-2-0/xxx" }, "usage": { "completion_tokens": 109586, "total_tokens": 109586 }, "created_at": 1779353885, "updated_at": 1779354215, "seed": 39832, "resolution": "720p", "ratio": "3:4", "duration": 5, "framespersecond": 24, "service_tier": "default", "execution_expires_after": 172800, "generate_audio": true, "draft": false, "priority": 0 } ] } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" model "github.com/volcengine/ark-runtime-go/arkruntime/model/contentgeneration" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() req := &arkruntime.ListContentGenerationTasksRequest{ PageSize: int32Pointer(3), Status: taskStatusPointer(model.TaskStatus("succeeded")), } resp, err := client.ListContentGenerationTasks(ctx, req) if err != nil { fmt.Printf("failed to list content generation tasks: %v\n", err) return } fmt.Printf("%+v\n", resp) } func int32Pointer(value int32) *int32 { return &value } func taskStatusPointer(value model.TaskStatus) *model.TaskStatus { return &value } ``` #### Response ``` { "total": 30, "items": [ { "id": "cgt-2026****-****", "model": "doubao-seedance-2-0-260128", "status": "succeeded", "content": { "video_url": "https://ark-acg-cn-beijing.tos-cn-beijing.volces.com/xxx" }, "usage": { "completion_tokens": 109586, "total_tokens": 109586 }, "created_at": 1779354227, "updated_at": 1779354426, "seed": 70172, "resolution": "720p", "ratio": "4:3", "duration": 5, "framespersecond": 24, "service_tier": "default", "execution_expires_after": 172800, "generate_audio": true, "draft": false, "priority": 0 }, { "id": "cgt-2026****-****", "model": "doubao-seedance-2-0-260128", "status": "succeeded", "content": { "video_url": "https://ark-acg-cn-beijing.tos-cn-beijing.volces.com/xxx" }, "usage": { "completion_tokens": 49761, "total_tokens": 49761 }, "created_at": 1779353985, "updated_at": 1779354268, "seed": 68292, "resolution": "480p", "ratio": "3:4", "duration": 5, "framespersecond": 24, "service_tier": "default", "execution_expires_after": 172800, "generate_audio": true, "draft": false, "priority": 0 }, { "id": "cgt-2026****-****", "model": "doubao-seedance-2-0-260128", "status": "succeeded", "content": { "video_url": "https://ark-acg-cn-beijing.tos-cn-beijing.volces.com/doubao-seedance-2-0/xxx" }, "usage": { "completion_tokens": 109586, "total_tokens": 109586 }, "created_at": 1779353885, "updated_at": 1779354215, "seed": 39832, "resolution": "720p", "ratio": "3:4", "duration": 5, "framespersecond": 24, "service_tier": "default", "execution_expires_after": 172800, "generate_audio": true, "draft": false, "priority": 0 } ] } ``` ### Java #### Request ```java package com.ark.sample; import com.volcengine.ark.runtime.models.content_generation.*; import com.fasterxml.jackson.core.JsonProcessingException; import com.volcengine.ark.runtime.service.ArkService; import java.util.concurrent.TimeUnit; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; public class Sample { static String apiKey = System.getenv("ARK_API_KEY"); static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); static Dispatcher dispatcher = new Dispatcher(); static ArkService service = ArkService.builder() .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); public static void main(String[] args) throws JsonProcessingException { ListContentGenerationTasksRequest req = ListContentGenerationTasksRequest.builder().pageNum(1).pageSize(3).filterStatus(TaskStatus.SUCCEEDED).build(); System.out.println(service.listContentGenerationTasks(req)); // shutdown service after all requests is finished service.shutdownExecutor(); } } ``` #### Response ``` { "total": 30, "items": [ { "id": "cgt-2026****-****", "model": "doubao-seedance-2-0-260128", "status": "succeeded", "content": { "video_url": "https://ark-acg-cn-beijing.tos-cn-beijing.volces.com/xxx" }, "usage": { "completion_tokens": 109586, "total_tokens": 109586 }, "created_at": 1779354227, "updated_at": 1779354426, "seed": 70172, "resolution": "720p", "ratio": "4:3", "duration": 5, "framespersecond": 24, "service_tier": "default", "execution_expires_after": 172800, "generate_audio": true, "draft": false, "priority": 0 }, { "id": "cgt-2026****-****", "model": "doubao-seedance-2-0-260128", "status": "succeeded", "content": { "video_url": "https://ark-acg-cn-beijing.tos-cn-beijing.volces.com/xxx" }, "usage": { "completion_tokens": 49761, "total_tokens": 49761 }, "created_at": 1779353985, "updated_at": 1779354268, "seed": 68292, "resolution": "480p", "ratio": "3:4", "duration": 5, "framespersecond": 24, "service_tier": "default", "execution_expires_after": 172800, "generate_audio": true, "draft": false, "priority": 0 }, { "id": "cgt-2026****-****", "model": "doubao-seedance-2-0-260128", "status": "succeeded", "content": { "video_url": "https://ark-acg-cn-beijing.tos-cn-beijing.volces.com/doubao-seedance-2-0/xxx" }, "usage": { "completion_tokens": 109586, "total_tokens": 109586 }, "created_at": 1779353885, "updated_at": 1779354215, "seed": 39832, "resolution": "720p", "ratio": "3:4", "duration": 5, "framespersecond": 24, "service_tier": "default", "execution_expires_after": 172800, "generate_audio": true, "draft": false, "priority": 0 } ] } ``` ## 搜索多个任务 ID #### Request ```bash curl -X GET "https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks?filter.task_ids=cgt-20250730114109-xtv7k&filter.task_ids=cgt-20250730114109-jfd6d" \ --header "Content-Type: application/json" \ --header "Authorization: Bearer $ARK_API_KEY" ``` #### Response ``` //假设所查询的任务在7天内 { "total": 2, "items": [ { "id": "cgt-20260521165358-c9fpl", "model": "doubao-seedance-2-0-260128", "status": "succeeded", "content": { "video_url": "https://ark-acg-cn-beijing.tos-cn-beijing.volces.com/xxx" }, "usage": { "completion_tokens": 173700, "total_tokens": 173700 }, "created_at": 1779353641, "updated_at": 1779353917, "seed": 83959, "resolution": "720p", "ratio": "16:9", "duration": 8, "framespersecond": 24, "service_tier": "default", "execution_expires_after": 172800, "generate_audio": true, "draft": false, "priority": 0 }, { "id": "cgt-20260521165055-pxg74", "model": "doubao-seedance-2-0-260128", "status": "succeeded", "content": { "video_url": "https://ark-acg-cn-beijing.tos-cn-beijing.volces.com/xxx" }, "usage": { "completion_tokens": 108900, "total_tokens": 108900 }, "created_at": 1779353462, "updated_at": 1779353752, "seed": 14512, "resolution": "720p", "ratio": "16:9", "duration": 5, "framespersecond": 24, "service_tier": "default", "execution_expires_after": 172800, "generate_audio": true, "draft": false, "priority": 0 } ] } ``` --- # 取消或删除视频生成任务 Source: https://ark.volcengine.com/region:cn-beijing/docs/cancel-or-delete-video-generation-tasks-api `DELETE https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks/{id}` 取消排队中的视频生成任务,或者删除视频生成任务记录。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **id** `string` `必选` | 任务 ID 需要取消或者删除的视频生成任务 ID。 任务状态不同,调用 `DELETE` 接口,执行的操作有所不同,具体说明如下: | 当前任务状态 | 是否支持 DELETE 操作 | 操作含义 | DELETE 操作后任务状态 | | --- | --- | --- | --- | | `queued` | 是 | 任务取消排队,任务状态被变更为 `cancelled` | `cancelled` | | `running` | 否 | — | — | | `succeeded` | 是 | 删除视频生成任务记录,后续将不支持查询 | — | | `failed` | 是 | 删除视频生成任务记录,后续将不支持查询 | — | | `cancelled` | 否 | — | — | | `expired` | 是 | 删除视频生成任务记录,后续将不支持查询 | — | ## 响应参数 本接口无特有的返回参数,成功时 HTTP 状态码为 `200`,返回结构中 `Result` 为空对象 `{}`。 ## 代码示例 ## 默认 ### cURL #### Request ```bash TASK_ID="your_task_id" curl -X DELETE "https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks/$TASK_ID" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" ``` #### Response ``` {} ``` ### Python #### Request ```python import os from arkruntime import Ark client = Ark( api_key=os.environ.get("ARK_API_KEY"), base_url="https://ark.cn-beijing.volces.com/api/v3", ) if __name__ == "__main__": try: client.content_generation.tasks.delete( task_id="", ) except Exception as e: print(f"failed to delete task: {e}") ``` #### Response ``` {} ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() req := "" err := client.DeleteContentGenerationTask(ctx, req) if err != nil { fmt.Printf("delete content generation task error: %v\n", err) return } } ``` #### Response ``` {} ``` ### Java #### Request ```java package com.ark.sample; import com.volcengine.ark.runtime.models.content_generation.*; import com.fasterxml.jackson.core.JsonProcessingException; import com.volcengine.ark.runtime.service.ArkService; import java.util.concurrent.TimeUnit; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; public class Sample { static String apiKey = System.getenv("ARK_API_KEY"); static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); static Dispatcher dispatcher = new Dispatcher(); static ArkService service = ArkService.builder() .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); public static void main(String[] args) throws JsonProcessingException { String req = ""; service.deleteContentGenerationTask(req); service.shutdownExecutor(); } } ``` #### Response ``` {} ``` --- # 图片生成 API Source: https://ark.volcengine.com/region:cn-beijing/docs/image-generation-api `POST https://ark.cn-beijing.volces.com/api/v3/images/generations` 本文介绍 Doubao Seedream 5.0 pro、Doubao Seedream 5.0 flash、Doubao Seedream 5.0 lite、Doubao Seedream 4.5 及 Doubao Seedream 4.0 图片生成模型的调用 API,包括输入输出参数、取值范围、注意事项等信息,供您使用接口时查阅字段含义。 **模型能力** * **Seedream 5.0 pro==new==**、**Seedream 5.0 flash==new==** * 图层拆分:支持将单张图片拆解为底图(1 张)+ 多个图层输出(最多 16 个图层)。 * 交互编辑:支持通过坐标、框选、箭头等多种方式指定编辑位置,精准编辑图片。 * 生成单图(不支持配置 `sequential_image_generation`) * 多图生图:输入多张参考图片(2-10)+ 文本提示词,生成单张图片。 * 单图生图:输入单张参考图片 + 文本提示词,生成单张图片。 * 文生图:输入文本提示词,生成单张图片。 * 暂不支持组图生成、联网搜索、流式输出。 * **Seedream 5.0 lite**、**Seedream 4.5 / 4.0** * 生成组图(组图:基于您输入的内容,生成的一组内容关联的图片;需配置 `sequential_image_generation` 为 `auto`) * 多图生组图:输入多张参考图片(2-14)+ 文本提示词,生成一组内容关联的图片(输入的参考图数量 + 最终生成的图片数量 ≤ 15 张)。 * 单图生组图:输入单张参考图片 + 文本提示词,生成一组内容关联的图片(最多生成 14 张图片)。 * 文生组图:输入文本提示词,生成一组内容关联的图片(最多生成 15 张图片)。 * 生成单图(配置 `sequential_image_generation` 为 `disabled`) * 多图生图:输入多张参考图片(2-14)+ 文本提示词,生成单张图片。 * 单图生图:输入单张参考图片 + 文本提示词,生成单张图片。 * 文生图:输入文本提示词,生成单张图片。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Body 参数 **prompt** `string` | 提示词 用于生成图像或指定图层拆分意图的提示词。 > **说明** > > * **提示词语言支持**:所有模型均支持中英文提示词; > * `Seedream 5.0 pro` / `Seedream 5.0 flash` 额外支持俄语、阿拉伯语、菲律宾语、泰语、土耳其语、韩语、马来语、西班牙语、葡萄牙语、印尼语、法语、德语、越南语、日语。 > * **提示词字数建议**:中文提示词不超过 300 字,英文提示词不超过 600 词。字数过多信息容易分散,模型可能因此忽略细节,只关注重点,造成图片缺失部分元素。 **图片生成场景 `必选`** 用于描述生成图像的内容,模型根据提示词生成对应图像。(查看提示词指南:[Seedream 4.0-5.0 提示词指南](/docs/seedream-4-0-5-0-prompt-guide)) **图层拆分场景 `可选`** 用于指定图层拆分意图,模型根据提示词意图识别并拆分指定元素。 若不传入提示词,模型将自动识别图片中的所有主要元素并拆分为独立图层。 **image** `string / string[]` | 参考图片 输入的图片信息,支持 URL 或 Base64 编码。 * 图片 URL:请确保图片 URL 可被访问。 * Base64 编码:请遵循此格式 `data:image/<图片格式>;base64,`。注意 `<图片格式>` 需小写,如 `data:image/png;base64,`。 **图片生成场景 `可选`** Seedream 5.0 pro / Seedream 5.0 flash 最多支持传入 10 张参考图;Seedream 5.0 lite / 4.5 / 4.0 最多支持传入 14 张参考图。 **单张图片传入要求**: * 图片格式:jpeg、png、webp、bmp、tiff、gif、heic、heif * 宽高比(宽 / 高)范围:[1/16, 16] * 宽高长度(px)> 14 * 大小:不超过 30MB * 总像素:[196, `6000×6000`(3600万)](对单张图宽度和高度的像素乘积限制,而不是对宽度或高度的单独值进行限制) **图层拆分场景 `必选`** 当开启图层拆分模式时(`layer_decomposition` 为 `true`),`image` 为必选参数,且仅支持输入单张图片(传入多张报错)。 **单张图片传入要求**: * 图片格式:png、jpeg * 宽高比:[1/16, 16] * 大小:不超过 30MB * 总像素(宽×高)范围:[`512×512`(262144), `6000×6000`(3600万)](对单张图宽度和高度的像素乘积限制,而不是对宽度或高度的单独值进行限制) **layer_decomposition==new==** `boolean` `默认值 false` | 图层拆分开关 控制是否开启图层拆分功能。 图层拆分会将单张图片的主体、背景、文字等内容自动拆解为 1 张底图和最多 16 个可独立编辑的图层。每个图层为带透明通道的 PNG 图片。 * `true`:图层拆分模式。模型将输入图拆解为一张底图和多个图层。 * `false`:图片生成模式,不进行图层拆分。 > **说明:图层拆分模式使用说明** > > * 仅支持输入单张待拆分图,传入多张报错。 > * 任一图层生成失败,整体请求报错,不支持部分成功。 > * 若提示词要求的拆分数量超过上限,可能导致部分图层信息丢失。 > * 响应结构体 `data` 中,将返回每个产出图层的位置和内容信息,包括图层顺序(`z_index`)、边界框信息(`bounding_box`)、名称(`name`)和描述(`description`)。 **模型支持**: * `Seedream 5.0 pro` * `Seedream 5.0 flash` **size** `string` | 图像尺寸 指定生成图像的尺寸信息。对于不同模型和不同场景,参数的配置方式、可选分辨率、默认值、总像素取值范围、宽高比取值范围不同,请展开以下各模型对应说明查看。 **Seedream 5.0 pro / Seedream 5.0 flash(图片生成场景)** 支持以下两种方式,不可混用: * 方式 1(推荐):指定分辨率档位,并在 prompt 中用自然语言描述图片宽高比、图片形状或图片用途,最终由模型判断生成图片的大小。 * 默认值:`2K` * 可选值:`1K`、`1.5K`、`2K` > **注意:价格说明** > > `1.5K` 与 `1K` 价格相同(详情参见 [模型价格](/docs/model-pricing#457edfd0)),且图片生成效果更优。 * 方式 2:指定宽高像素值(`宽x高`)。 * 总像素取值范围:[`1280x720`(921600), `2048x2048x1.1025`(4624220)] * 宽高比取值范围:[1/16, 16] > **说明** > > 采用方式 2 时,需同时满足总像素取值范围和宽高比取值范围。其中,总像素是对单张图宽度和高度的像素乘积限制,而不是对宽度或高度的单独值进行限制。 > > * **有效示例**:`2048x1024`。总像素值 2048x1024=2097152,符合 [921600, 4624220] 的区间要求;宽高比 2048/1024=2,符合 [1/16, 16] 的区间要求,故该示例值有效。 > * **无效示例**:`512x512`。总像素值 512x512=262144,未达到 921600 的最低要求,故该示例值无效。 使用方式 1 时,模型实际映射的宽高像素参考值(不限于以下标准值,仅列常见): | 分辨率 | 宽高比 | 宽高像素值 | | --- | --- | --- | | 1K | 1:1 | 1024x1024 | |^^| 4:3 | 1152x864 | |^^| 3:4 | 864x1152 | |^^| 16:9 | 1424x800 | |^^| 9:16 | 800x1424 | |^^| 3:2 | 1248x832 | |^^| 2:3 | 832x1248 | |^^| 21:9 | 1568x672 | | 1.5K | 1:1 | 1536x1536 | |^^| 4:3 | 1792x1344 | |^^| 3:4 | 1344x1792 | |^^| 16:9 | 2048x1152 | |^^| 9:16 | 1152x2048 | |^^| 3:2 | 1872x1248 | |^^| 2:3 | 1248x1872 | |^^| 21:9 | 2352x1008 | | 2K | 1:1 | 2048x2048 | |^^| 4:3 | 2368x1776 | |^^| 3:4 | 1776x2368 | |^^| 16:9 | 2816x1584 | |^^| 9:16 | 1584x2816 | |^^| 3:2 | 2496x1664 | |^^| 2:3 | 1664x2496 | |^^| 21:9 | 3136x1344 | **Seedream 5.0 pro / Seedream 5.0 flash(图层拆分场景)** 仅支持通过指定分辨率档位的方式设置。输出图的分辨率规则如下: * **底图**:输出底图的分辨率和 `size` 指定的分辨率一致;输出底图和原待拆分图的宽高比一致。 * **各图层**:输出图层的分辨率和 `size` 指定的分辨率接近;每个输出图层和其在原图中的宽高比一致。 `size` 的默认值与可选值: * 默认值:`auto` * 可选值:`1K`、`1.5K`、`2K`、`auto`(根据输入图的尺寸和宽高比进行输出) > **注意:价格说明** > > `1.5K` 与 `1K` 价格相同(详情参见 [模型价格](/docs/model-pricing#457edfd0))。 > **说明:auto 适配规则** > > auto 模式下,模型将根据输入图片中底图和每个图层的原始尺寸进行输出: > > * 若输入图片中底图和每个图层的原始尺寸在 [`1280x720`(921600), `2048x2048x1.1025`(4624220)] 之间,按照原尺寸输出底图与每个图层;且各自保持其在原图中的宽高比。 > * 若输入图片中底图和每个图层的原始尺寸小于 1K,按 1K 输出底图与每个图层;且各自保持其在原图中的宽高比。 > * 若输入图片中底图和每个图层的原始尺寸大于 2K,按 2K 输出底图与每个图层;且各自保持其在原图中的宽高比。 模型实际映射的宽高像素参考值(不限于以下标准值,仅列常见): | 分辨率 | 宽高比 | 宽高像素值 | | --- | --- | --- | | 1K | 1:1 | 1024x1024 | |^^| 4:3 | 1152x864 | |^^| 3:4 | 864x1152 | |^^| 16:9 | 1424x800 | |^^| 9:16 | 800x1424 | |^^| 3:2 | 1248x832 | |^^| 2:3 | 832x1248 | |^^| 21:9 | 1568x672 | | 1.5K | 1:1 | 1536x1536 | |^^| 4:3 | 1792x1344 | |^^| 3:4 | 1344x1792 | |^^| 16:9 | 2048x1152 | |^^| 9:16 | 1152x2048 | |^^| 3:2 | 1872x1248 | |^^| 2:3 | 1248x1872 | |^^| 21:9 | 2352x1008 | | 2K | 1:1 | 2048x2048 | |^^| 4:3 | 2368x1776 | |^^| 3:4 | 1776x2368 | |^^| 16:9 | 2816x1584 | |^^| 9:16 | 1584x2816 | |^^| 3:2 | 2496x1664 | |^^| 2:3 | 1664x2496 | |^^| 21:9 | 3136x1344 | **Seedream 5.0 lite** 支持以下两种方式,不可混用: * 方式 1:指定分辨率,并在 prompt 中用自然语言描述图片宽高比、图片形状或图片用途,最终由模型判断生成图片的大小。 * 可选值:`2K`、`3K`、`4K` * 方式 2:指定生成图像的宽高像素值。 * 默认值:`2048x2048` * 总像素取值范围:[`2560x1440`(3686400), `4096x4096`(16777216)] * 宽高比取值范围:[1/16, 16] > **说明** > > 采用方式 2 时,需同时满足总像素取值范围和宽高比取值范围。其中,总像素是对单张图宽度和高度的像素乘积限制,而不是对宽度或高度的单独值进行限制。 > > * **有效示例**:`3750x1250`。总像素值 3750x1250=4687500,符合 [3686400, 16777216] 的区间要求;宽高比 3750/1250=3,符合 [1/16, 16] 的区间要求,故该示例值有效。 > * **无效示例**:`1500x1500`。总像素值 1500x1500=2250000,未达到 3686400 的最低要求;宽高 1500/1500=1,虽符合 [1/16, 16] 的区间要求,但未同时满足两项限制,故该示例值无效。 采用方式 1 时,模型实际映射的宽高像素参考值: | 分辨率 | 宽高比 | 宽高像素值 | | --- | --- | --- | | 2K | 1:1 | 2048x2048 | | | 4:3 | 2304x1728 | | | 3:4 | 1728x2304 | | | 16:9 | 2848x1600 | | | 9:16 | 1600x2848 | | | 3:2 | 2496x1664 | | | 2:3 | 1664x2496 | | | 21:9 | 3136x1344 | | 3K | 1:1 | 3072x3072 | | | 4:3 | 3456x2592 | | | 3:4 | 2592x3456 | | | 16:9 | 4096x2304 | | | 9:16 | 2304x4096 | | | 3:2 | 3744x2496 | | | 2:3 | 2496x3744 | | | 21:9 | 4704x2016 | | 4K | 1:1 | 4096x4096 | | | 4:3 | 4704x3520 | | | 3:4 | 3520x4704 | | | 16:9 | 5504x3040 | | | 9:16 | 3040x5504 | | | 3:2 | 4992x3328 | | | 2:3 | 3328x4992 | | | 21:9 | 6240x2656 | **Seedream 4.5** 支持以下两种方式,不可混用: * 方式 1:指定分辨率,并在 prompt 中用自然语言描述图片宽高比、图片形状或图片用途,最终由模型判断生成图片的大小。 * 可选值:`2K`、`4K` * 方式 2:指定生成图像的宽高像素值。 * 默认值:`2048x2048` * 总像素取值范围:[`2560x1440`(3686400), `4096x4096`(16777216)] * 宽高比取值范围:[1/16, 16] > **说明** > > 采用方式 2 时,需同时满足总像素取值范围和宽高比取值范围。其中,总像素是对单张图宽度和高度的像素乘积限制,而不是对宽度或高度的单独值进行限制。 > > * **有效示例**:`3750x1250`。总像素值 3750x1250=4687500,符合 [3686400, 16777216] 的区间要求;宽高比 3750/1250=3,符合 [1/16, 16] 的区间要求,故该示例值有效。 > * **无效示例**:`1500x1500`。总像素值 1500x1500=2250000,未达到 3686400 的最低要求;宽高 1500/1500=1,虽符合 [1/16, 16] 的区间要求,但未同时满足两项限制,故该示例值无效。 采用方式 1 时,模型实际映射的宽高像素参考值: | 分辨率 | 宽高比 | 宽高像素值 | | --- | --- | --- | | 2K | 1:1 | 2048x2048 | | | 4:3 | 2304x1728 | | | 3:4 | 1728x2304 | | | 16:9 | 2848x1600 | | | 9:16 | 1600x2848 | | | 3:2 | 2496x1664 | | | 2:3 | 1664x2496 | | | 21:9 | 3136x1344 | | 4K | 1:1 | 4096x4096 | | | 4:3 | 4704x3520 | | | 3:4 | 3520x4704 | | | 16:9 | 5504x3040 | | | 9:16 | 3040x5504 | | | 3:2 | 4992x3328 | | | 2:3 | 3328x4992 | | | 21:9 | 6240x2656 | **Seedream 4.0** 支持以下两种方式,不可混用: * 方式 1:指定分辨率,并在 prompt 中用自然语言描述图片宽高比、图片形状或图片用途,最终由模型判断生成图片的大小。 * 可选值:`1K`、`2K`、`4K` * 方式 2:指定生成图像的宽高像素值。 * 默认值:`2048x2048` * 总像素取值范围:[`1280x720`(921600), `4096x4096`(16777216)] * 宽高比取值范围:[1/16, 16] > **说明** > > 采用方式 2 时,需同时满足总像素取值范围和宽高比取值范围。其中,总像素是对单张图宽度和高度的像素乘积限制,而不是对宽度或高度的单独值进行限制。 > > * **有效示例**:`1600x600`。总像素值 1600x600=960000,符合 [921600, 16777216] 的区间要求;宽高比 1600/600=8/3,符合 [1/16, 16] 的区间要求,故该示例值有效。 > * **无效示例**:`800x800`。总像素值 800x800=640000,未达到 921600 的最低要求;宽高 800/800=1,虽符合 [1/16, 16] 的区间要求,但未同时满足两项限制,故该示例值无效。 采用方式 1 时,模型实际映射的宽高像素参考值: | 分辨率 | 宽高比 | 宽高像素值 | | --- | --- | --- | | 1K | 1:1 | 1024x1024 | | | 4:3 | 1152x864 | | | 3:4 | 864x1152 | | | 16:9 | 1280x720 | | | 9:16 | 720x1280 | | | 3:2 | 1248x832 | | | 2:3 | 832x1248 | | | 21:9 | 1512x648 | | 2K | 1:1 | 2048x2048 | | | 4:3 | 2304x1728 | | | 3:4 | 1728x2304 | | | 16:9 | 2848x1600 | | | 9:16 | 1600x2848 | | | 3:2 | 2496x1664 | | | 2:3 | 1664x2496 | | | 21:9 | 3136x1344 | | 4K | 1:1 | 4096x4096 | | | 4:3 | 4704x3520 | | | 3:4 | 3520x4704 | | | 16:9 | 5504x3040 | | | 9:16 | 3040x5504 | | | 3:2 | 4992x3328 | | | 2:3 | 3328x4992 | | | 21:9 | 6240x2656 | **optimize_prompt_options** `object` | 提示词优化配置 提示词优化功能的配置。 **mode** `string` `默认值 standard` | 优化模式 `optimize_prompt_options.mode` 设置提示词优化功能使用的模式。 * `standard`:标准模式,生成内容的质量更高,耗时较长。 * `fast`:快速模式,生成内容的耗时更短,效果略低于标准模式;Seedream 5.0 flash / lite / 4.5 当前不支持。 > **说明** > > 如您的业务对生成时延较为敏感,推荐使用 Seedream 5.0 pro 的 `fast` 模式或使用 Seedream 5.0 flash 以获得更快的图片生成速度。 **output_format** `string` `默认值 jpeg` | 图像格式 指定生成图像的文件格式。可选值: * `png` * `jpeg`。 > **注意** > > * 图层拆分场景下,`output_format` 仅控制底图的输出格式,图层始终以 `png` 格式输出。 **模型支持**: * `Seedream 5.0 pro` * `Seedream 5.0 flash` * `Seedream 5.0 lite` **background==new==** `string` `默认值 opaque` | 图片透明通道 用于控制是否生成带透明通道的图片。可选值: * `transparent`:透明背景模式,输出带有透明背景的图。 * `opaque`:不透明背景模式,生成常规的实体背景图。 > **注意:透明背景模式使用要求** > > * 仅支持图生图场景,且只支持输入 **1 张带透明通道**的图片; > * 输出图片默认为 `png` 格式,若同时配置 `output_format` 为 `jpeg`,将触发报错; > * 若传入了不支持透明通道的文件格式(如 `jpeg`),将触发报错。 **模型支持**: * `Seedream 5.0 pro` * `Seedream 5.0 flash` **response_format** `string` `默认值 url` | 返回格式 指定生成图像的返回格式。支持以下两种返回方式: * `url`:返回图片下载链接,**链接在图片生成后 24 小时内有效,请及时下载图片**。 * `b64_json`:以 Base64 编码字符串的 JSON 格式返回图像数据。 **sequential_image_generation** `string` `默认值 disabled` | 组图模式 控制是否关闭组图功能(组图:基于您输入的内容,生成的一组内容关联的图片)。 * `auto`:自动判断模式,模型会根据用户提供的提示词自主判断是否返回组图以及组图包含的图片数量。 * `disabled`:关闭组图功能,模型只会生成一张图。 组图输出示例详见 [Seedream 图像创作教程 - 组图输出](/docs/seedream-4-0-5-0#ec79cfda)。 **模型支持**: * `Seedream 5.0 lite` * `Seedream 4.5` * `Seedream 4.0` **sequential_image_generation_options** `object` | 组图配置 组图功能的配置。仅当 `sequential_image_generation` 为 `auto` 时生效。 **模型支持**: * `Seedream 5.0 lite` * `Seedream 4.5` * `Seedream 4.0` **max_images** `integer` `默认值 15` | 最大生成数量 `sequential_image_generation_options.max_images` 指定本次请求,最多可生成的图片数量。 > **说明** > > 实际可生成的图片数量,除受到 `max_images` 影响外,还受到输入的参考图数量影响。**输入的参考图数量+最终生成的图片数量≤15 张**。 **取值范围**:`[1, 15]` **stream** `boolean` `默认值 false` | 流式输出开关 控制是否开启流式输出模式。 * `false`:非流式输出模式,等待所有图片全部生成结束后再一次性返回所有信息。 * `true`:流式输出模式,即时返回每张图片输出的结果。在生成单图和组图的场景下,流式输出模式均生效。 流式输出示例详见 [Seedream 图像创作教程 - 流式输出](/docs/seedream-4-0-5-0#e5bef0d7)。 **模型支持**: * `Seedream 5.0 lite` * `Seedream 4.5` * `Seedream 4.0` **tools** `object[]` | 工具配置 配置模型要调用的工具。 **模型支持**: * `Seedream 5.0 lite` **type** `string` `必选` | 工具类型 `tools.type` 指定使用的工具类型。 * `web_search`:联网搜索功能。 > **说明** > > * 开启联网搜索后,模型会根据用户的提示词自主判断是否搜索互联网内容(如商品、天气等),提升生成图片的时效性,但也会增加一定的时延。 > * 实际搜索次数可通过字段 `usage.tool_usage.web_search` 查询,如果为 0 表示未搜索。 **watermark** `boolean` `默认值 true` | 水印开关 是否在生成的图片中添加水印。 * `false`:不添加水印。 * `true`:在图片右下角添加“AI 生成”字样的水印标识。 **model** `string` `必选` | 模型 ID 您需要调用的模型的 ID(Model ID),[开通模型服务](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&OpenTokenDrawer=false),并 [查询 Model ID](/docs/model-list#9df4d9fd)。 您也可通过 Endpoint ID 来调用模型,获得限流、计费类型(前付费 / 后付费)、运行状态查询、监控、安全等高级能力,可参考 [获取 Endpoint ID](/docs/online-inference-standard)。 ## 响应参数 ### 非流式调用响应 **created** `integer` | 创建时间 本次请求创建时间的 Unix 时间戳(秒) **model** `string` | 模型 ID 本次请求使用的模型 ID(模型名称-版本) **data** `object[]` | 图像数据 输出图像的信息。不同任务场景返回字段有所区别,其中 `url`、`b64_json`、`size`、`output_format` 为公共返回字段。 * 组图生成场景,若某张图生成失败,额外返回该图片的错误信息(`error`)。 * 图层拆分场景,额外返回每个图层的叠放顺序(`z_index`)、名称(`name`)、描述(`description`)、边界框坐标(`bounding_box`)。 **公共字段** **url** `string` | 图片 URL `data.url` 图片 URL,当 `response_format` 指定为 `url` 时返回。该链接将在生成后 **24 小时内失效**,请务必及时保存图像。 推荐配置火山引擎 TOS 提供的数据订阅功能,将您的模型推理产物自动转存到自己的 TOS 桶中,便于长期备份或二次加工。详细介绍请参见 [TOS 数据订阅](https://docs.volcengine.com/docs/TorchObjectStorage/Datasubscription-5?lang=zh)。 **b64_json** `string` | 图片 Base64 数据 `data.b64_json` 图片的 Base64 信息,当 `response_format` 指定为 `b64_json` 时返回 **size** `string` | 图像尺寸 `data.size` 图像的宽高像素值,格式 `<宽像素>x<高像素>`,例如 `2048x2048`。 **output_format==new==** `string` | 输出格式 `data.output_format` 输出图像的格式信息(`png` 或 `jpeg`)。 > **注意** > > * 图层拆分场景下,`output_format` 仅控制底图的输出格式,图层始终以 `png` 格式输出。 **模型支持**: * `Seedream 5.0 pro` * `Seedream 5.0 flash` **特殊字段(图层拆分场景)** **z_index==new==** `integer` | 图层叠放顺序 `data.z_index` 图层的叠放顺序索引。底图固定为 `0`,图层从 `1` 开始递增,数值越大越靠上层。 **模型支持**: * `Seedream 5.0 pro` * `Seedream 5.0 flash` **name==new==** `string` | 图层名称 `data.name` 当前图层拆分元素的名称/标签。由模型根据拆分出的主体特征自动生成,用于标识该图层的主体内容。 **模型支持**: * `Seedream 5.0 pro` * `Seedream 5.0 flash` **description==new==** `string` | 图层描述 `data.description` 当前图层拆分元素的详细描述。由模型生成的语义描述,提供比 `name` 更丰富的图层特征(如颜色、状态、材质等)。 **模型支持**: * `Seedream 5.0 pro` * `Seedream 5.0 flash` **bounding_box==new==** `object` | 图层边界框 `data.bounding_box` 输出图层在输出底图坐标系中所占区域的边界框信息。仅图层返回该字段;底图覆盖整张画布,不返回该字段。 > **说明:使用说明** > > * `bounding_box` 表示图层在待拆分图中的相对位置与宽高比,等比缩放至输出底图坐标系后的坐标。 > * 若需将图层还原到输出底图中,建议优先使用 `absolute` 坐标。 > * 若需将图层还原到任意自定义的画布中,可使用 `normalized` 坐标。 **模型支持**: * `Seedream 5.0 pro` * `Seedream 5.0 flash` **absolute** `array` | 绝对坐标 `data.bounding_box.absolute` 输出图层边界框在输出底图坐标系中的绝对像素坐标(单位:像素),输出底图左上角坐标为 `(0, 0)`。格式为由 4 个整数构成的数组:`[left, top, right, bottom]`。 * `left`:图层左边界到输出底图左边界的水平距离。 * `top`:图层上边界到输出底图上边界的垂直距离。 * `right`:图层右边界到输出底图左边界的水平距离。 * `bottom`:图层下边界到输出底图上边界的垂直距离。 > **说明:坐标示例** > > 例如 `[225, 442, 796, 1414]` 表示图层左上角坐标为 `(225, 442)`,右下角坐标为 `(796, 1414)`。 > **注意:使用 bounding_box.absolute 还原图层** > > 使用 `bounding_box.absolute` 可将输出图层还原到其在输出底图坐标系中的边界框区域。计算方式如下: > > * 图层在输出底图中的左上角坐标:`x = left`,`y = top`。 > * 图层在输出底图中的占用宽度:`w = right - left`。 > * 图层在输出底图中的占用高度:`h = bottom - top`。 > > 将输出图层缩放至 `w × h`,再放置到输出底图的 `(x, y)` 位置。多个图层需要组合时,按 `z_index` 从小到大依次叠放。 **normalized** `array` | 归一化坐标 `data.bounding_box.normalized` 图层边界框在输出底图坐标系中的归一化坐标,由绝对坐标按输出底图宽高换算至 `[0, 1000]` 的离散整数区间得到。格式为由 4 个整数构成的数组:`[left, top, right, bottom]`。 * `left`、`right`:图层左右边界在底图宽度方向上的相对位置。`0` 表示底图最左侧,`1000` 表示底图最右侧。 * `top`、`bottom`:图层上下边界在底图高度方向上的相对位置。`0` 表示底图最上方,`1000` 表示底图最下方。 > **说明:坐标示例** > > 例如 `[220, 432, 777, 1000]` 表示:图层左边界距离底图左边界 22.0% 底图宽度,上边界距离底图上边界 43.2% 底图高度,右边界距离底图左边界 77.7% 底图宽度,下边界与底图下边缘对齐。 > **注意:使用 bounding_box.normalized 还原图层** > > 使用 `bounding_box.normalized` 可将输出图层还原到目标画布中的边界框区域。设目标画布的宽高为 `W × H`: > > * 图层在目标画布中的左上角坐标:`x = left / 1000 × W`,`y = top / 1000 × H`。 > * 图层在目标画布中的占用宽度:`w = (right - left) / 1000 × W`。 > * 图层在目标画布中的占用高度:`h = (bottom - top) / 1000 × H`。 > > 将输出图层缩放至 `w × h`,再放置到目标画布的 `(x, y)` 位置。归一化坐标为整数,换算后可能存在取整误差。 **特殊字段(组图生成场景)** **error** `object` | 单图错误信息 `data.error` 某张图片生成失败时返回的错误信息。其他成功生成的图片不受影响 > **说明** > > 组图生成过程中某张图生成失败时: > > * 若失败原因为审核不通过:仍会继续请求下一个图片生成任务,即不影响同请求内其他图片的生成流程。 > * 若失败原因为内部服务异常(500):不会继续请求下一个图片生成任务。 **模型支持**: * `Seedream 5.0 lite` * `Seedream 4.5` * `Seedream 4.0` **code** `string` | 错误码 `data.error.code` 错误码,请参见 [错误码](/docs/error-codes) **message** `string` | 错误消息 `data.error.message` 错误提示信息,便于排查问题 **error** `object` | 错误信息 本次请求顶层错误信息。当整个请求未能生成任何图片时返回 **code** `string` | 错误码 `error.code` 错误码,请参见 [错误码](/docs/error-codes) **message** `string` | 错误消息 `error.message` 错误提示信息,便于排查问题 **tools** `object[]` | 工具调用列表 本次请求中配置并被模型调用的工具列表 **模型支持**: * `Seedream 5.0 lite` **type** `string` | 工具类型 `tools.type` 指定使用的工具类型。 * `web_search`:联网搜索功能。 > **说明** > > * 开启联网搜索后,模型会根据用户的提示词自主判断是否搜索互联网内容(如商品、天气等),提升生成图片的时效性,但也会增加一定的时延。 > * 实际搜索次数可通过字段 `usage.tool_usage.web_search` 查询,如果为 0 表示未搜索。 **usage** `object` | 用量信息 本次请求的用量信息,包括生成图片数量、消耗的 token 数量等 **generated_images** `integer` | 成功生成图片数 `usage.generated_images` 模型成功生成的图片张数,不包含生成失败的图片。仅对成功生成图片按张数进行计费 **input_images==new==** `integer` | 输入图片数 `usage.input_images` 输入模型的图片张数。 **模型支持**: * `Seedream 5.0 pro` * `Seedream 5.0 flash` **output_tokens** `integer` | 输出 token 数 `usage.output_tokens` 模型生成的图片花费的 token 数量。计算逻辑为:`sum(图片长 * 图片宽) / 256` 后取整 **tool_usage** `object` | 工具用量 `usage.tool_usage` 使用工具的用量信息 **模型支持**: * `Seedream 5.0 lite` **web_search** `integer` | 联网搜索次数 `usage.tool_usage.web_search` 调用联网搜索工具的次数,仅开启联网搜索时返回。如果为 0 表示未搜索 **total_tokens** `integer` | 总 token 数 `usage.total_tokens` 本次请求消耗的总 token 数量。当前不计算输入 token,故与 `output_tokens` 值一致 ### 流式调用响应 字段结构详见 [图片生成流式响应事件](/docs/image-generation-streaming-responses)。 ## 代码示例 ## 图层拆分 ### cURL #### Request ```bash curl https://ark.cn-beijing.volces.com/api/v3/images/generations \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seedream-5-0-pro-260628", "prompt": "将图片进行精确图层分离,需分离的文字坐标为180 64 812 198、757 210 939 280、63 212 320 282、178 714 826 810、814 819 949 894、326 824 669 930;鹦鹉的坐标为347 305 642 997。", "image": "https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream_50_pro_layer_input.png", "layer_decomposition": true, "size": "2K", "output_format": "jpeg", "response_format": "url", "watermark": true }' ``` #### Response ``` { "model": "doubao-seedream-5-0-pro-260628", "created": 1784696685, "data": [ { "url": "https://...", "size": "2048x2048", "output_format": "jpeg", "z_index": 0 }, { "url": "https://...", "size": "1273x265", "output_format": "png", "z_index": 1, "bounding_box": { "absolute": [383, 120, 1655, 384], "normalized": [187, 59, 808, 188] }, "name": "Seedream标题文字", "description": "黄色大号衬线字体的Seedream标题文字" } ], "usage": { "input_images": 1, "generated_images": 8, "output_tokens": 23107, "total_tokens": 23107 } } ``` ### Python #### Request ```python import os # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark client = Ark( # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv("ARK_API_KEY"), ) imagesResponse = client.images.generate( # Replace with Model ID model="doubao-seedream-5-0-pro-260628", prompt="将图片进行精确图层分离,需分离的文字坐标为180 64 812 198、757 210 939 280、63 212 320 282、178 714 826 810、814 819 949 894、326 824 669 930;鹦鹉的坐标为347 305 642 997。", image="https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream_50_pro_layer_input.png", layer_decomposition=True, size="2K", output_format="jpeg", response_format="url", watermark=True, ) for item in imagesResponse.data: print(item) ``` #### Response ``` { "model": "doubao-seedream-5-0-pro-260628", "created": 1784696685, "data": [ { "url": "https://...", "size": "2048x2048", "output_format": "jpeg", "z_index": 0 }, { "url": "https://...", "size": "1273x265", "output_format": "png", "z_index": 1, "bounding_box": { "absolute": [383, 120, 1655, 384], "normalized": [187, 59, 808, 188] }, "name": "Seedream标题文字", "description": "黄色大号衬线字体的Seedream标题文字" } ], "usage": { "input_images": 1, "generated_images": 8, "output_tokens": 23107, "total_tokens": 23107 } } ``` ### Java #### Request ```java package com.ark.sample; import com.volcengine.ark.runtime.models.images.*; import com.volcengine.ark.runtime.service.ArkService; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; import java.util.concurrent.TimeUnit; public class ImageGenerationsExample { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); Dispatcher dispatcher = new Dispatcher(); ArkService service = ArkService.builder() .baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .build(); // CreateImageGenerationRequestImage requires ark-runtime 0.6.0 or later. CreateImageGenerationRequest generateRequest = CreateImageGenerationRequest.builder() .model("doubao-seedream-5-0-pro-260628") // Replace with Model ID .prompt("将图片进行精确图层分离,需分离的文字坐标为180 64 812 198、757 210 939 280、63 212 320 282、178 714 826 810、814 819 949 894、326 824 669 930;鹦鹉的坐标为347 305 642 997。") .image(CreateImageGenerationRequestImage.ofString("https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream_50_pro_layer_input.png")) .layerDecomposition(true) .size("2K") .outputFormat(OutputFormat.JPEG) .responseFormat(ResponseFormat.URL) .watermark(true) .build(); ImageGenerationResponse imagesResponse = service.generateImages(generateRequest); imagesResponse.getData().forEach(item -> System.out.println(item)); service.shutdownExecutor(); } } ``` #### Response ``` { "model": "doubao-seedream-5-0-pro-260628", "created": 1784696685, "data": [ { "url": "https://...", "size": "2048x2048", "output_format": "jpeg", "z_index": 0 }, { "url": "https://...", "size": "1273x265", "output_format": "png", "z_index": 1, "bounding_box": { "absolute": [383, 120, 1655, 384], "normalized": [187, 59, 808, 188] }, "name": "Seedream标题文字", "description": "黄色大号衬线字体的Seedream标题文字" } ], "usage": { "input_images": 1, "generated_images": 8, "output_tokens": 23107, "total_tokens": 23107 } } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" model "github.com/volcengine/ark-runtime-go/arkruntime/model/images" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), // The base URL for model invocation arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() outputFormat := model.OutputFormatJpeg generateReq := &model.CreateImageGenerationRequest{ Model: "doubao-seedream-5-0-pro-260628", Prompt: model.NewOptString("将图片进行精确图层分离,需分离的文字坐标为180 64 812 198、757 210 939 280、63 212 320 282、178 714 826 810、814 819 949 894、326 824 669 930;鹦鹉的坐标为347 305 642 997。"), Image: model.NewOptCreateImageGenerationRequestImage(model.NewStringArrayCreateImageGenerationRequestImage([]string{"https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream_50_pro_layer_input.png"})), LayerDecomposition: model.NewOptBool(true), Size: model.NewOptString("2K"), OutputFormat: model.NewOptOutputFormat(outputFormat), ResponseFormat: model.NewOptResponseFormat(model.ResponseFormatURL), Watermark: model.NewOptBool(true), } imagesResponse, err := client.GenerateImages(ctx, generateReq) if err != nil { fmt.Printf("generate images error: %v\n", err) return } for _, item := range imagesResponse.Data { fmt.Printf("%+v\n", item) } } ``` #### Response ``` { "model": "doubao-seedream-5-0-pro-260628", "created": 1784696685, "data": [ { "url": "https://...", "size": "2048x2048", "output_format": "jpeg", "z_index": 0 }, { "url": "https://...", "size": "1273x265", "output_format": "png", "z_index": 1, "bounding_box": { "absolute": [383, 120, 1655, 384], "normalized": [187, 59, 808, 188] }, "name": "Seedream标题文字", "description": "黄色大号衬线字体的Seedream标题文字" } ], "usage": { "input_images": 1, "generated_images": 8, "output_tokens": 23107, "total_tokens": 23107 } } ``` ### Python-OpenAI #### Request ```python import os from openai import OpenAI client = OpenAI( # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv("ARK_API_KEY"), ) imagesResponse = client.images.generate( model="doubao-seedream-5-0-pro-260628", prompt="将图片进行精确图层分离,需分离的文字坐标为180 64 812 198、757 210 939 280、63 212 320 282、178 714 826 810、814 819 949 894、326 824 669 930;鹦鹉的坐标为347 305 642 997。", size="2K", output_format="jpeg", response_format="url", extra_body={ "image": "https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream_50_pro_layer_input.png", "layer_decomposition": True, "watermark": True, }, ) for item in imagesResponse.data: print(item) ``` #### Response ``` { "model": "doubao-seedream-5-0-pro-260628", "created": 1784696685, "data": [ { "url": "https://...", "size": "2048x2048", "output_format": "jpeg", "z_index": 0 }, { "url": "https://...", "size": "1273x265", "output_format": "png", "z_index": 1, "bounding_box": { "absolute": [383, 120, 1655, 384], "normalized": [187, 59, 808, 188] }, "name": "Seedream标题文字", "description": "黄色大号衬线字体的Seedream标题文字" } ], "usage": { "input_images": 1, "generated_images": 8, "output_tokens": 23107, "total_tokens": 23107 } } ``` ## 交互编辑 ### cURL #### Request ```bash curl https://ark.cn-beijing.volces.com/api/v3/images/generations \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seedream-5-0-pro-260628", "prompt": "根据手绘草图对图像进行编辑。在左下角标记区域添加一叠真实的杂志或艺术画册,并在右侧标记区域添加一个带杯碟的陶瓷杯咖啡。移除所有草图线条。保持构图不变。让新添加的物体自然融入原有场景中。", "image": "https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream_50_pro_input2.png", "size": "2K", "output_format": "png", "watermark": true }' ``` #### Response ``` { "model": "doubao-seedream-5-0-pro-260628", "created": 1757323224, "data": [ { "url": "https://...", "size": "2048x2048" } ], "usage": { "generated_images": 1, "output_tokens": 18000, "total_tokens": 18000 } } ``` ### Python #### Request ```python import os # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark client = Ark( # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv("ARK_API_KEY"), ) imagesResponse = client.images.generate( # Replace with Model ID model="doubao-seedream-5-0-pro-260628", prompt="根据手绘草图对图像进行编辑。在左下角标记区域添加一叠真实的杂志或艺术画册,并在右侧标记区域添加一个带杯碟的陶瓷杯咖啡。移除所有草图线条。保持构图不变。让新添加的物体自然融入原有场景中。", image="https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream_50_pro_input2.png", size="2K", output_format="png", response_format="url", watermark=True, ) print(imagesResponse.data[0].url) ``` #### Response ``` { "model": "doubao-seedream-5-0-pro-260628", "created": 1757323224, "data": [ { "url": "https://...", "size": "2048x2048" } ], "usage": { "generated_images": 1, "output_tokens": 18000, "total_tokens": 18000 } } ``` ### Java #### Request ```java package com.ark.sample; import com.volcengine.ark.runtime.models.images.*; import com.volcengine.ark.runtime.service.ArkService; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; import java.util.concurrent.TimeUnit; public class ImageGenerationsExample { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); Dispatcher dispatcher = new Dispatcher(); ArkService service = ArkService.builder() .baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .build(); // CreateImageGenerationRequestImage requires ark-runtime 0.6.0 or later. CreateImageGenerationRequest generateRequest = CreateImageGenerationRequest.builder() .model("doubao-seedream-5-0-pro-260628") // Replace with Model ID .prompt("根据手绘草图对图像进行编辑。在左下角标记区域添加一叠真实的杂志或艺术画册,并在右侧标记区域添加一个带杯碟的陶瓷杯咖啡。移除所有草图线条。保持构图不变。让新添加的物体自然融入原有场景中。") .image(CreateImageGenerationRequestImage.ofString("https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream_50_pro_input2.png")) .size("2K") .outputFormat(OutputFormat.PNG) .responseFormat(ResponseFormat.URL) .watermark(true) .build(); ImageGenerationResponse imagesResponse = service.generateImages(generateRequest); System.out.println(imagesResponse.getData().get(0).getUrl()); service.shutdownExecutor(); } } ``` #### Response ``` { "model": "doubao-seedream-5-0-pro-260628", "created": 1757323224, "data": [ { "url": "https://...", "size": "2048x2048" } ], "usage": { "generated_images": 1, "output_tokens": 18000, "total_tokens": 18000 } } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" model "github.com/volcengine/ark-runtime-go/arkruntime/model/images" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), // The base URL for model invocation arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() outputFormat := model.OutputFormatPNG generateReq := &model.CreateImageGenerationRequest{ Model: "doubao-seedream-5-0-pro-260628", Prompt: model.NewOptString("根据手绘草图对图像进行编辑。在左下角标记区域添加一叠真实的杂志或艺术画册,并在右侧标记区域添加一个带杯碟的陶瓷杯咖啡。移除所有草图线条。保持构图不变。让新添加的物体自然融入原有场景中。"), Image: model.NewOptCreateImageGenerationRequestImage(model.NewStringArrayCreateImageGenerationRequestImage([]string{"https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream_50_pro_input2.png"})), Size: model.NewOptString("2K"), OutputFormat: model.NewOptOutputFormat(outputFormat), ResponseFormat: model.NewOptResponseFormat(model.ResponseFormatURL), Watermark: model.NewOptBool(true), } imagesResponse, err := client.GenerateImages(ctx, generateReq) if err != nil { fmt.Printf("generate images error: %v\n", err) return } fmt.Printf("%s\n", imagesResponse.Data[0].URL.Or("")) } ``` #### Response ``` { "model": "doubao-seedream-5-0-pro-260628", "created": 1757323224, "data": [ { "url": "https://...", "size": "2048x2048" } ], "usage": { "generated_images": 1, "output_tokens": 18000, "total_tokens": 18000 } } ``` ### Python-OpenAI #### Request ```python import os from openai import OpenAI client = OpenAI( # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv("ARK_API_KEY"), ) imagesResponse = client.images.generate( model="doubao-seedream-5-0-pro-260628", prompt="根据手绘草图对图像进行编辑。在左下角标记区域添加一叠真实的杂志或艺术画册,并在右侧标记区域添加一个带杯碟的陶瓷杯咖啡。移除所有草图线条。保持构图不变。让新添加的物体自然融入原有场景中。", size="2K", output_format="png", response_format="url", extra_body={ "image": "https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream_50_pro_input2.png", "watermark": True, }, ) print(imagesResponse.data[0].url) ``` #### Response ``` { "model": "doubao-seedream-5-0-pro-260628", "created": 1757323224, "data": [ { "url": "https://...", "size": "2048x2048" } ], "usage": { "generated_images": 1, "output_tokens": 18000, "total_tokens": 18000 } } ``` ## 文生图 ### cURL #### Request ```bash curl https://ark.cn-beijing.volces.com/api/v3/images/generations \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seedream-5-0-pro-260628", "prompt": "充满活力的特写编辑肖像,模特眼神犀利,头戴雕塑感帽子,色彩拼接丰富,眼部焦点锐利,景深较浅,具有Vogue杂志封面的美学风格,采用中画幅拍摄,工作室灯光效果强烈。", "size": "2K", "output_format":"png", "watermark": true }' ``` #### Response ``` { "model": "doubao-seedream-5-0-pro-260628", "created": 1757321139, "data": [ { "url": "https://...", "size": "3104x1312" } ], "usage": { "generated_images": 1, "output_tokens": xxx, "total_tokens": xxx } } ``` ### Python #### Request ```python import os # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark client = Ark( # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key:https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv('ARK_API_KEY'), ) imagesResponse = client.images.generate( # Replace with Model ID model="doubao-seedream-5-0-pro-260628", prompt="充满活力的特写编辑肖像,模特眼神犀利,头戴雕塑感帽子,色彩拼接丰富,眼部焦点锐利,景深较浅,具有Vogue杂志封面的美学风格,采用中画幅拍摄,工作室灯光效果强烈。", size="2K", output_format="png", response_format="url", watermark=True ) print(imagesResponse.data[0].url) ``` #### Response ``` { "model": "doubao-seedream-5-0-pro-260628", "created": 1757321139, "data": [ { "url": "https://...", "size": "3104x1312" } ], "usage": { "generated_images": 1, "output_tokens": xxx, "total_tokens": xxx } } ``` ### Java #### Request ```java package com.ark.sample; import com.volcengine.ark.runtime.models.images.*; import com.volcengine.ark.runtime.service.ArkService; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; import java.util.Arrays; import java.util.List; import java.util.concurrent.TimeUnit; public class ImageGenerationsExample { public static void main(String[] args) { // Get API Key:https://ark.volcengine.com/region:cn-beijing/apikey String apiKey = System.getenv("ARK_API_KEY"); ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); Dispatcher dispatcher = new Dispatcher(); ArkService service = ArkService.builder() .baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .build(); CreateImageGenerationRequest generateRequest = CreateImageGenerationRequest.builder() .model("doubao-seedream-5-0-pro-260628") // Replace with Model ID .prompt("充满活力的特写编辑肖像,模特眼神犀利,头戴雕塑感帽子,色彩拼接丰富,眼部焦点锐利,景深较浅,具有Vogue杂志封面的美学风格,采用中画幅拍摄,工作室灯光效果强烈。") .size("2K") .outputFormat(OutputFormat.PNG) .responseFormat(ResponseFormat.URL) .watermark(true) .build(); ImageGenerationResponse imagesResponse = service.generateImages(generateRequest); System.out.println(imagesResponse.getData().get(0).getUrl()); service.shutdownExecutor(); } } ``` #### Response ``` { "model": "doubao-seedream-5-0-pro-260628", "created": 1757321139, "data": [ { "url": "https://...", "size": "3104x1312" } ], "usage": { "generated_images": 1, "output_tokens": xxx, "total_tokens": xxx } } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" model "github.com/volcengine/ark-runtime-go/arkruntime/model/images" ) func main() { client := arkruntime.NewClientWithApiKey( // Get API Key:https://ark.volcengine.com/region:cn-beijing/apikey os.Getenv("ARK_API_KEY"), // The base URL for model invocation arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() outputFormat := model.OutputFormatPNG generateReq := &model.CreateImageGenerationRequest{ Model: "doubao-seedream-5-0-pro-260628", // Replace with Model ID Prompt: model.NewOptString("充满活力的特写编辑肖像,模特眼神犀利,头戴雕塑感帽子,色彩拼接丰富,眼部焦点锐利,景深较浅,具有Vogue杂志封面的美学风格,采用中画幅拍摄,工作室灯光效果强烈。"), Size: model.NewOptString("2K"), OutputFormat: model.NewOptOutputFormat(outputFormat), ResponseFormat: model.NewOptResponseFormat(model.ResponseFormatURL), Watermark: model.NewOptBool(true), } imagesResponse, err := client.GenerateImages(ctx, generateReq) if err != nil { fmt.Printf("generate images error: %v\n", err) return } fmt.Printf("%s\n", imagesResponse.Data[0].URL.Or("")) } ``` #### Response ``` { "model": "doubao-seedream-5-0-pro-260628", "created": 1757321139, "data": [ { "url": "https://...", "size": "3104x1312" } ], "usage": { "generated_images": 1, "output_tokens": xxx, "total_tokens": xxx } } ``` ### Python-OpenAI #### Request ```python import os from openai import OpenAI client = OpenAI( # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key:https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv('ARK_API_KEY'), ) imagesResponse = client.images.generate( # Replace with Model ID model="doubao-seedream-5-0-pro-260628", prompt="充满活力的特写编辑肖像,模特眼神犀利,头戴雕塑感帽子,色彩拼接丰富,眼部焦点锐利,景深较浅,具有Vogue杂志封面的美学风格,采用中画幅拍摄,工作室灯光效果强烈。", size="2K", output_format="png", response_format="url", extra_body={ "watermark": True, }, ) print(imagesResponse.data[0].url) ``` #### Response ``` { "model": "doubao-seedream-5-0-pro-260628", "created": 1757321139, "data": [ { "url": "https://...", "size": "3104x1312" } ], "usage": { "generated_images": 1, "output_tokens": xxx, "total_tokens": xxx } } ``` ## 图生图 ### cURL #### Request ```bash curl https://ark.cn-beijing.volces.com/api/v3/images/generations \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seedream-5-0-pro-260628", "prompt": "保持模特姿势和液态服装的流动形状不变。将服装材质从银色金属改为完全透明的清水(或玻璃)。透过液态水流,可以看到模特的皮肤细节。光影从反射变为折射。", "image": "https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_5_imageToimage.png", "size": "2K", "output_format":"png", "watermark": true }' ``` #### Response ``` { "model": "doubao-seedream-5-0-pro-260628", "created": 1757323224, "data": [ { "url": "https://...", "size": "1760x2368" } ], "usage": { "generated_images": 1, "output_tokens": 16280, "total_tokens": 16280 } } ``` ### Python #### Request ```python import os # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark client = Ark( # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key:https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv('ARK_API_KEY'), ) imagesResponse = client.images.generate( # Replace with Model ID model="doubao-seedream-5-0-pro-260628", prompt="保持模特姿势和液态服装的流动形状不变。将服装材质从银色金属改为完全透明的清水(或玻璃)。透过液态水流,可以看到模特的皮肤细节。光影从反射变为折射。", image="https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_5_imageToimage.png", size="2K", output_format="png", response_format="url", watermark=True ) print(imagesResponse.data[0].url) ``` #### Response ``` { "model": "doubao-seedream-5-0-pro-260628", "created": 1757323224, "data": [ { "url": "https://...", "size": "1760x2368" } ], "usage": { "generated_images": 1, "output_tokens": 16280, "total_tokens": 16280 } } ``` ### Java #### Request ```java package com.ark.sample; import com.volcengine.ark.runtime.models.images.*; import com.volcengine.ark.runtime.service.ArkService; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; import java.util.Arrays; import java.util.List; import java.util.concurrent.TimeUnit; public class ImageGenerationsExample { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); Dispatcher dispatcher = new Dispatcher(); ArkService service = ArkService.builder() .baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .build(); // CreateImageGenerationRequestImage requires ark-runtime 0.6.0 or later. CreateImageGenerationRequest generateRequest = CreateImageGenerationRequest.builder() .model("doubao-seedream-5-0-pro-260628") // Replace with Model ID .prompt("保持模特姿势和液态服装的流动形状不变。将服装材质从银色金属改为完全透明的清水(或玻璃)。透过液态水流,可以看到模特的皮肤细节。光影从反射变为折射。") .image(CreateImageGenerationRequestImage.ofString("https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_5_imageToimage.png")) .size("2K") .outputFormat(OutputFormat.PNG) .responseFormat(ResponseFormat.URL) .watermark(true) .build(); ImageGenerationResponse imagesResponse = service.generateImages(generateRequest); System.out.println(imagesResponse.getData().get(0).getUrl()); service.shutdownExecutor(); } } ``` #### Response ``` { "model": "doubao-seedream-5-0-pro-260628", "created": 1757323224, "data": [ { "url": "https://...", "size": "1760x2368" } ], "usage": { "generated_images": 1, "output_tokens": 16280, "total_tokens": 16280 } } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" model "github.com/volcengine/ark-runtime-go/arkruntime/model/images" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), // The base URL for model invocation arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() outputFormat := model.OutputFormatPNG generateReq := &model.CreateImageGenerationRequest{ Model: "doubao-seedream-5-0-pro-260628", Prompt: model.NewOptString("保持模特姿势和液态服装的流动形状不变。将服装材质从银色金属改为完全透明的清水(或玻璃)。透过液态水流,可以看到模特的皮肤细节。光影从反射变为折射。"), Image: model.NewOptCreateImageGenerationRequestImage(model.NewStringArrayCreateImageGenerationRequestImage([]string{"https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_5_imageToimage.png"})), Size: model.NewOptString("2K"), OutputFormat: model.NewOptOutputFormat(outputFormat), ResponseFormat: model.NewOptResponseFormat(model.ResponseFormatURL), Watermark: model.NewOptBool(true), } imagesResponse, err := client.GenerateImages(ctx, generateReq) if err != nil { fmt.Printf("generate images error: %v\n", err) return } fmt.Printf("%s\n", imagesResponse.Data[0].URL.Or("")) } ``` #### Response ``` { "model": "doubao-seedream-5-0-pro-260628", "created": 1757323224, "data": [ { "url": "https://...", "size": "1760x2368" } ], "usage": { "generated_images": 1, "output_tokens": 16280, "total_tokens": 16280 } } ``` ### Python-OpenAI #### Request ```python import os from openai import OpenAI client = OpenAI( # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key:https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv('ARK_API_KEY'), ) imagesResponse = client.images.generate( model="doubao-seedream-5-0-pro-260628", prompt="保持模特姿势和液态服装的流动形状不变。将服装材质从银色金属改为完全透明的清水(或玻璃)。透过液态水流,可以看到模特的皮肤细节。光影从反射变为折射。", size="2K", output_format="png", response_format="url", extra_body = { "image": "https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_5_imageToimage.png", "watermark": True } ) print(imagesResponse.data[0].url) ``` #### Response ``` { "model": "doubao-seedream-5-0-pro-260628", "created": 1757323224, "data": [ { "url": "https://...", "size": "1760x2368" } ], "usage": { "generated_images": 1, "output_tokens": 16280, "total_tokens": 16280 } } ``` ## 多图融合 ### cURL #### Request ```bash curl https://ark.cn-beijing.volces.com/api/v3/images/generations \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seedream-5-0-pro-260628", "prompt": "将图1的服装换为图2的服装", "image": ["https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_imagesToimage_1.png", "https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_5_imagesToimage_2.png"], "size": "2K", "output_format":"png", "watermark": true }' ``` #### Response ``` { "model": "doubao-seedream-5-0-pro-260628", "created": 1757323224, "data": [ { "url": "https://...", "size": "1760x2368" } ], "usage": { "generated_images": 1, "output_tokens": 16280, "total_tokens": 16280 } } ``` ### Python #### Request ```python import os # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark client = Ark( # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key:https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv('ARK_API_KEY'), ) imagesResponse = client.images.generate( # Replace with Model ID model="doubao-seedream-5-0-pro-260628", prompt="将图1的服装换为图2的服装", image=["https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_imagesToimage_1.png", "https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_5_imagesToimage_2.png"], size="2K", output_format="png", response_format="url", watermark=True ) print(imagesResponse.data[0].url) ``` #### Response ``` { "model": "doubao-seedream-5-0-pro-260628", "created": 1757323224, "data": [ { "url": "https://...", "size": "1760x2368" } ], "usage": { "generated_images": 1, "output_tokens": 16280, "total_tokens": 16280 } } ``` ### Java #### Request ```java package com.ark.sample; import com.volcengine.ark.runtime.models.images.*; import com.volcengine.ark.runtime.service.ArkService; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; import java.util.Arrays; import java.util.List; import java.util.concurrent.TimeUnit; public class ImageGenerationsExample { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); Dispatcher dispatcher = new Dispatcher(); ArkService service = ArkService.builder() .baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .build(); // CreateImageGenerationRequestImage requires ark-runtime 0.6.0 or later. CreateImageGenerationRequest generateRequest = CreateImageGenerationRequest.builder() .model("doubao-seedream-5-0-pro-260628") // Replace with Model ID .prompt("将图1的服装换为图2的服装") .image(CreateImageGenerationRequestImage.ofList(Arrays.asList( "https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_imagesToimage_1.png", "https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_5_imagesToimage_2.png" ))) .size("2K") .outputFormat(OutputFormat.PNG) .responseFormat(ResponseFormat.URL) .watermark(true) .build(); ImageGenerationResponse imagesResponse = service.generateImages(generateRequest); System.out.println(imagesResponse.getData().get(0).getUrl()); service.shutdownExecutor(); } } ``` #### Response ``` { "model": "doubao-seedream-5-0-pro-260628", "created": 1757323224, "data": [ { "url": "https://...", "size": "1760x2368" } ], "usage": { "generated_images": 1, "output_tokens": 16280, "total_tokens": 16280 } } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" model "github.com/volcengine/ark-runtime-go/arkruntime/model/images" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), // The base URL for model invocation arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() outputFormat := model.OutputFormatPNG generateReq := &model.CreateImageGenerationRequest{ Model: "doubao-seedream-5-0-pro-260628", Prompt: model.NewOptString("将图1的服装换为图2的服装"), Image: model.NewOptCreateImageGenerationRequestImage(model.NewStringArrayCreateImageGenerationRequestImage([]string{ "https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_imagesToimage_1.png", "https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_5_imagesToimage_2.png", })), Size: model.NewOptString("2K"), OutputFormat: model.NewOptOutputFormat(outputFormat), ResponseFormat: model.NewOptResponseFormat(model.ResponseFormatURL), Watermark: model.NewOptBool(true), } imagesResponse, err := client.GenerateImages(ctx, generateReq) if err != nil { fmt.Printf("generate images error: %v\n", err) return } fmt.Printf("%s\n", imagesResponse.Data[0].URL.Or("")) } ``` #### Response ``` { "model": "doubao-seedream-5-0-pro-260628", "created": 1757323224, "data": [ { "url": "https://...", "size": "1760x2368" } ], "usage": { "generated_images": 1, "output_tokens": 16280, "total_tokens": 16280 } } ``` ### Python-OpenAI #### Request ```python import os from openai import OpenAI client = OpenAI( # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key:https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv('ARK_API_KEY'), ) imagesResponse = client.images.generate( model="doubao-seedream-5-0-pro-260628", prompt="将图1的服装换为图2的服装", size="2K", output_format="png", response_format="url", extra_body = { "image": ["https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_imagesToimage_1.png", "https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_5_imagesToimage_2.png"], "watermark": True, } ) print(imagesResponse.data[0].url) ``` #### Response ``` { "model": "doubao-seedream-5-0-pro-260628", "created": 1757323224, "data": [ { "url": "https://...", "size": "1760x2368" } ], "usage": { "generated_images": 1, "output_tokens": 16280, "total_tokens": 16280 } } ``` ## 多参考图生组图 ### cURL #### Request ```bash curl https://ark.cn-beijing.volces.com/api/v3/images/generations \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seedream-5-0-260128", "prompt": "生成3张女孩和奶牛玩偶在游乐园开心地坐过山车的图片,涵盖早晨、中午、晚上", "image": ["https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_imagesToimages_1.png", "https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_imagesToimages_2.png"], "sequential_image_generation": "auto", "sequential_image_generation_options": { "max_images": 3 }, "size": "2K", "output_format":"png", "watermark": true }' ``` #### Response ``` { "model": "doubao-seedream-5-0-260128", "created": 1757388756, "data": [ { "url": "https://...", "size": "2720x1536" }, { "url": "https://...", "size": "2720x1536" }, { "url": "https://...", "size": "2720x1536" } ], "usage": { "generated_images": 3, "output_tokens": 48960, "total_tokens": 48960 } } ``` ### Python #### Request ```python import os # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark from arkruntime.types.images import SequentialImageGenerationOptionsParam client = Ark( # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key:https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv('ARK_API_KEY'), ) imagesResponse = client.images.generate( # Replace with Model ID model="doubao-seedream-5-0-260128", prompt="生成3张女孩和奶牛玩偶在游乐园开心地坐过山车的图片,涵盖早晨、中午、晚上", image=["https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_imagesToimages_1.png", "https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_imagesToimages_2.png"], size="2K", sequential_image_generation="auto", sequential_image_generation_options=SequentialImageGenerationOptionsParam(max_images=3), output_format="png", response_format="url", watermark=True ) # Iterate through all image data for image in imagesResponse.data: # Output the current image's URL and size print(f"URL: {image.url}, Size: {image.size}") ``` #### Response ``` { "model": "doubao-seedream-5-0-260128", "created": 1757388756, "data": [ { "url": "https://...", "size": "2720x1536" }, { "url": "https://...", "size": "2720x1536" }, { "url": "https://...", "size": "2720x1536" } ], "usage": { "generated_images": 3, "output_tokens": 48960, "total_tokens": 48960 } } ``` ### Java #### Request ```java package com.ark.sample; import com.volcengine.ark.runtime.models.images.*; import com.volcengine.ark.runtime.service.ArkService; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; import java.util.Arrays; import java.util.List; import java.util.concurrent.TimeUnit; public class ImageGenerationsExample { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); Dispatcher dispatcher = new Dispatcher(); ArkService service = ArkService.builder() .baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .build(); SequentialImageGenerationOptions sequentialImageGenerationOptions = new SequentialImageGenerationOptions(); sequentialImageGenerationOptions.setMaxImages(3); // CreateImageGenerationRequestImage requires ark-runtime 0.6.0 or later. CreateImageGenerationRequest generateRequest = CreateImageGenerationRequest.builder() .model("doubao-seedream-5-0-260128") // Replace with Model ID .prompt("生成3张女孩和奶牛玩偶在游乐园开心地坐过山车的图片,涵盖早晨、中午、晚上") .image(CreateImageGenerationRequestImage.ofList(Arrays.asList( "https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_imagesToimages_1.png", "https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_imagesToimages_2.png" ))) .outputFormat(OutputFormat.PNG) .size("2K") .sequentialImageGeneration(SequentialImageGenerationMode.AUTO) .sequentialImageGenerationOptions(sequentialImageGenerationOptions) .responseFormat(ResponseFormat.URL) .stream(false) .watermark(true) .build(); ImageGenerationResponse imagesResponse = service.generateImages(generateRequest); // Iterate through all image data if (imagesResponse != null && imagesResponse.getData() != null) { for (int i = 0; i < imagesResponse.getData().size(); i++) { // Retrieve image information String url = imagesResponse.getData().get(i).getUrl(); String size = imagesResponse.getData().get(i).getSize(); System.out.printf("Image %d:%n", i + 1); System.out.printf(" URL: %s%n", url); System.out.printf(" Size: %s%n", size); System.out.println(); } service.shutdownExecutor(); } } } ``` #### Response ``` { "model": "doubao-seedream-5-0-260128", "created": 1757388756, "data": [ { "url": "https://...", "size": "2720x1536" }, { "url": "https://...", "size": "2720x1536" }, { "url": "https://...", "size": "2720x1536" } ], "usage": { "generated_images": 3, "output_tokens": 48960, "total_tokens": 48960 } } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" model "github.com/volcengine/ark-runtime-go/arkruntime/model/images" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), // The base URL for model invocation arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() outputFormat := model.OutputFormatPNG var sequentialImageGeneration model.SequentialImageGenerationMode = "auto" maxImages := 3 generateReq := &model.CreateImageGenerationRequest{ Model: "doubao-seedream-5-0-260128", Prompt: model.NewOptString("生成3张女孩和奶牛玩偶在游乐园开心地坐过山车的图片,涵盖早晨、中午、晚上"), Image: model.NewOptCreateImageGenerationRequestImage(model.NewStringArrayCreateImageGenerationRequestImage([]string{ "https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_imagesToimages_1.png", "https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_imagesToimages_2.png", })), Size: model.NewOptString("2K"), OutputFormat: model.NewOptOutputFormat(outputFormat), ResponseFormat: model.NewOptResponseFormat(model.ResponseFormatURL), Watermark: model.NewOptBool(true), SequentialImageGeneration: model.NewOptSequentialImageGenerationMode(sequentialImageGeneration), SequentialImageGenerationOptions: model.NewOptSequentialImageGenerationOptions(model.SequentialImageGenerationOptions{ MaxImages: model.NewOptInt32(int32(maxImages)), }), } resp, err := client.GenerateImages(ctx, generateReq) if err != nil { fmt.Printf("call GenerateImages error: %v\n", err) return } if resp.Error.IsSet() { fmt.Printf("API returned error: %s - %s\n", resp.Error.Value.Code, resp.Error.Value.Message) return } // Output the generated image information fmt.Printf("Generated %d images:\n", len(resp.Data)) for i, image := range resp.Data { var url string if image.URL.IsSet() { url = image.URL.Or("") } else { url = "N/A" } fmt.Printf("Image %d: Size: %s, URL: %s\n", i+1, image.Size.Or(""), url) } } ``` #### Response ``` { "model": "doubao-seedream-5-0-260128", "created": 1757388756, "data": [ { "url": "https://...", "size": "2720x1536" }, { "url": "https://...", "size": "2720x1536" }, { "url": "https://...", "size": "2720x1536" } ], "usage": { "generated_images": 3, "output_tokens": 48960, "total_tokens": 48960 } } ``` ### Python-OpenAI #### Request ```python import os from openai import OpenAI client = OpenAI( # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key:https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv('ARK_API_KEY'), ) imagesResponse = client.images.generate( model="doubao-seedream-5-0-260128", prompt="生成3张女孩和奶牛玩偶在游乐园开心地坐过山车的图片,涵盖早晨、中午、晚上", size="2K", output_format="png", response_format="url", extra_body={ "image": ["https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_imagesToimages_1.png", "https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_imagesToimages_2.png"], "watermark": True, "sequential_image_generation": "auto", "sequential_image_generation_options": { "max_images": 3 }, } ) # Iterate through all image data for image in imagesResponse.data: # Output the current image's URL and size print(f"URL: {image.url}, Size: {image.size}") ``` #### Response ``` { "model": "doubao-seedream-5-0-260128", "created": 1757388756, "data": [ { "url": "https://...", "size": "2720x1536" }, { "url": "https://...", "size": "2720x1536" }, { "url": "https://...", "size": "2720x1536" } ], "usage": { "generated_images": 3, "output_tokens": 48960, "total_tokens": 48960 } } ``` ## 流式输出 ### cURL #### Request ```bash curl https://ark.cn-beijing.volces.com/api/v3/images/generations \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seedream-5-0-260128", "prompt": "参考图1,生成四图片,图中人物分别带着墨镜,骑着摩托,带着帽子,拿着棒棒糖", "image": "https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_imageToimages_1.png", "sequential_image_generation": "auto", "sequential_image_generation_options": { "max_images": 4 }, "size": "2K", "stream": true, "output_format":"png", "watermark": true }' ``` #### Response ``` event: image_generation.partial_succeeded data: { "type": "image_generation.partial_succeeded", "model": "doubao-seedream-5-0-260128", "created": 1757396757, "image_index": 0, "url": "https://...", "size": "2496x1664" } event: image_generation.partial_succeeded data: { "type": "image_generation.partial_succeeded", "model": "doubao-seedream-5-0-260128", "created": 1757396785, "image_index": 1, "url": "https://...", "size": "2496x1664" } event: image_generation.partial_succeeded data: { "type": "image_generation.partial_succeeded", "model": "doubao-seedream-5-0-260128", "created": 1757396825, "image_index": 2, "url": "https://...", "size": "2496x1664" } event: image_generation.completed data: { "type": "image_generation.completed", "model": "doubao-seedream-5-0-260128", "created": 1757396825, "usage": { "generated_images": 3, "output_tokens": 48672, "total_tokens": 48672 } } data: [DONE] ``` ### Python #### Request ```python import os # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark from arkruntime.types.images import SequentialImageGenerationOptionsParam client = Ark( # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key:https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv('ARK_API_KEY'), ) if __name__ == "__main__": stream = client.images.generate( # Replace with Model ID model="doubao-seedream-5-0-260128", prompt="参考图1,生成四图片,图中人物分别带着墨镜,骑着摩托,带着帽子,拿着棒棒糖", image="https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_imageToimages_1.png", size="2K", sequential_image_generation="auto", sequential_image_generation_options=SequentialImageGenerationOptionsParam(max_images=4), output_format="png", response_format="url", stream=True, watermark=True ) for event in stream: if event is None: continue if event.type == "image_generation.partial_failed": print(f"Stream generate images error: {event.error}") if event.error is not None and event.error.code.equal("InternalServiceError"): break elif event.type == "image_generation.partial_succeeded": if event.error is None and event.url: print(f"recv.Size: {event.size}, recv.Url: {event.url}") elif event.type == "image_generation.completed": if event.error is None: print("Final completed event:") print("recv.Usage:", event.usage) elif event.type == "image_generation.partial_image": print(f"Partial image index={event.partial_image_index}, size={len(event.b64_json)}") ``` #### Response ``` event: image_generation.partial_succeeded data: { "type": "image_generation.partial_succeeded", "model": "doubao-seedream-5-0-260128", "created": 1757396757, "image_index": 0, "url": "https://...", "size": "2496x1664" } event: image_generation.partial_succeeded data: { "type": "image_generation.partial_succeeded", "model": "doubao-seedream-5-0-260128", "created": 1757396785, "image_index": 1, "url": "https://...", "size": "2496x1664" } event: image_generation.partial_succeeded data: { "type": "image_generation.partial_succeeded", "model": "doubao-seedream-5-0-260128", "created": 1757396825, "image_index": 2, "url": "https://...", "size": "2496x1664" } event: image_generation.completed data: { "type": "image_generation.completed", "model": "doubao-seedream-5-0-260128", "created": 1757396825, "usage": { "generated_images": 3, "output_tokens": 48672, "total_tokens": 48672 } } data: [DONE] ``` ### Java #### Request ```java package com.ark.sample; import com.volcengine.ark.runtime.models.images.*; import com.volcengine.ark.runtime.service.ArkService; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; import java.util.Arrays; import java.util.List; import java.util.concurrent.TimeUnit; public class ImageGenerationsExample { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); Dispatcher dispatcher = new Dispatcher(); ArkService service = ArkService.builder() .baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .build(); SequentialImageGenerationOptions sequentialImageGenerationOptions = new SequentialImageGenerationOptions(); sequentialImageGenerationOptions.setMaxImages(4); // CreateImageGenerationRequestImage requires ark-runtime 0.6.0 or later. CreateImageGenerationRequest generateRequest = CreateImageGenerationRequest.builder() .model("doubao-seedream-5-0-260128") //Replace with Model ID . .prompt("参考图1,生成四图片,图中人物分别带着墨镜,骑着摩托,带着帽子,拿着棒棒糖") .image(CreateImageGenerationRequestImage.ofString("https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_imageToimages_1.png")) .size("2K") .sequentialImageGeneration(SequentialImageGenerationMode.AUTO) .sequentialImageGenerationOptions(sequentialImageGenerationOptions) .outputFormat(OutputFormat.PNG) .responseFormat(ResponseFormat.URL) .stream(true) .watermark(true) .build(); System.out.println(generateRequest.toString()); service.streamGenerateImages(generateRequest) .doOnError(Throwable::printStackTrace) .blockingForEach( choice -> { if (choice == null) return; if (ImageGenerationStreamEventType.IMAGE_GENERATION_PARTIAL_FAILED.equals(choice.getType())) { if (choice.getError() != null) { System.err.println("Stream generate images error: " + choice.getError()); if (choice.getError().getCode() != null && choice.getError().getCode().equals("InternalServiceError")) { throw new RuntimeException("Server error, terminating stream."); } } } else if (ImageGenerationStreamEventType.IMAGE_GENERATION_PARTIAL_SUCCEEDED.equals(choice.getType())) { if (choice.getError() == null && choice.getUrl() != null && !choice.getUrl().isEmpty()) { System.out.printf("recv.Size: %s, recv.Url: %s%n", choice.getSize(), choice.getUrl()); } } else if (ImageGenerationStreamEventType.IMAGE_GENERATION_COMPLETED.equals(choice.getType())) { if (choice.getError() == null && choice.getUsage() != null) { System.out.println("recv.Usage: " + choice.getUsage().toString()); } } } ); service.shutdownExecutor(); } } ``` #### Response ``` event: image_generation.partial_succeeded data: { "type": "image_generation.partial_succeeded", "model": "doubao-seedream-5-0-260128", "created": 1757396757, "image_index": 0, "url": "https://...", "size": "2496x1664" } event: image_generation.partial_succeeded data: { "type": "image_generation.partial_succeeded", "model": "doubao-seedream-5-0-260128", "created": 1757396785, "image_index": 1, "url": "https://...", "size": "2496x1664" } event: image_generation.partial_succeeded data: { "type": "image_generation.partial_succeeded", "model": "doubao-seedream-5-0-260128", "created": 1757396825, "image_index": 2, "url": "https://...", "size": "2496x1664" } event: image_generation.completed data: { "type": "image_generation.completed", "model": "doubao-seedream-5-0-260128", "created": 1757396825, "usage": { "generated_images": 3, "output_tokens": 48672, "total_tokens": 48672 } } data: [DONE] ``` ### Go #### Request ```go package main import ( "context" "fmt" "io" "os" "strings" "github.com/volcengine/ark-runtime-go/arkruntime" model "github.com/volcengine/ark-runtime-go/arkruntime/model/images" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), // The base URL for model invocation arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() outputFormat := model.OutputFormatPNG var sequentialImageGeneration model.SequentialImageGenerationMode = "auto" maxImages := 4 generateReq := &model.CreateImageGenerationRequest{ Model: "doubao-seedream-5-0-260128", Prompt: model.NewOptString("参考图1,生成四图片,图中人物分别带着墨镜,骑着摩托,带着帽子,拿着棒棒糖"), Image: model.NewOptCreateImageGenerationRequestImage(model.NewStringArrayCreateImageGenerationRequestImage([]string{"https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_imageToimages_1.png"})), Size: model.NewOptString("2K"), OutputFormat: model.NewOptOutputFormat(outputFormat), ResponseFormat: model.NewOptResponseFormat(model.ResponseFormatURL), Watermark: model.NewOptBool(true), SequentialImageGeneration: model.NewOptSequentialImageGenerationMode(sequentialImageGeneration), SequentialImageGenerationOptions: model.NewOptSequentialImageGenerationOptions(model.SequentialImageGenerationOptions{ MaxImages: model.NewOptInt32(int32(maxImages)), }), } stream, err := client.GenerateImagesStreaming(ctx, generateReq) if err != nil { fmt.Printf("call GenerateImagesStreaming error: %v\n", err) return } defer stream.Close() for { recv, err := stream.Recv() if err == io.EOF { break } if err != nil { fmt.Printf("Stream generate images error: %v\n", err) break } if recv.Type == model.ImageGenerationStreamEventTypeImageGenerationPartialFailed { fmt.Printf("Stream generate images error: %v\n", recv.Error) if strings.EqualFold(recv.Error.Value.Code, "InternalServiceError") { break } } if recv.Type == model.ImageGenerationStreamEventTypeImageGenerationPartialSucceeded { if !recv.Error.IsSet() && recv.URL.IsSet() { fmt.Printf("recv.Size: %s, recv.Url: %s\n", recv.Size.Or(""), recv.URL.Or("")) } } if recv.Type == model.ImageGenerationStreamEventTypeImageGenerationCompleted { if !recv.Error.IsSet() { fmt.Printf("recv.Usage: %v\n", recv.Usage.Or(model.Usage{})) } } } } ``` #### Response ``` event: image_generation.partial_succeeded data: { "type": "image_generation.partial_succeeded", "model": "doubao-seedream-5-0-260128", "created": 1757396757, "image_index": 0, "url": "https://...", "size": "2496x1664" } event: image_generation.partial_succeeded data: { "type": "image_generation.partial_succeeded", "model": "doubao-seedream-5-0-260128", "created": 1757396785, "image_index": 1, "url": "https://...", "size": "2496x1664" } event: image_generation.partial_succeeded data: { "type": "image_generation.partial_succeeded", "model": "doubao-seedream-5-0-260128", "created": 1757396825, "image_index": 2, "url": "https://...", "size": "2496x1664" } event: image_generation.completed data: { "type": "image_generation.completed", "model": "doubao-seedream-5-0-260128", "created": 1757396825, "usage": { "generated_images": 3, "output_tokens": 48672, "total_tokens": 48672 } } data: [DONE] ``` ### Python-OpenAI #### Request ```python import os from openai import OpenAI client = OpenAI( # The base URL for model invocation . base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key:https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv('ARK_API_KEY'), ) if __name__ == "__main__": stream = client.images.generate( model="doubao-seedream-5-0-260128", prompt="参考图1,生成四图片,图中人物分别带着墨镜,骑着摩托,带着帽子,拿着棒棒糖", size="2K", output_format="png", response_format="b64_json", stream=True, extra_body={ "image": "https://arkdocs.tos-cn-beijing.volces.com/images/image-generation/seedream4_imageToimages_1.png", "watermark": True, "sequential_image_generation": "auto", "sequential_image_generation_options": { "max_images": 4 }, }, ) for event in stream: if event is None: continue elif event.type == "image_generation.partial_succeeded": if event.b64_json is not None: print(f"size={len(event.b64_json)}, base_64={event.b64_json}") elif event.type == "image_generation.completed": if event.usage is not None: print("Final completed event:") print("recv.Usage:", event.usage) ``` #### Response ``` event: image_generation.partial_succeeded data: { "type": "image_generation.partial_succeeded", "model": "doubao-seedream-5-0-260128", "created": 1757396757, "image_index": 0, "url": "https://...", "size": "2496x1664" } event: image_generation.partial_succeeded data: { "type": "image_generation.partial_succeeded", "model": "doubao-seedream-5-0-260128", "created": 1757396785, "image_index": 1, "url": "https://...", "size": "2496x1664" } event: image_generation.partial_succeeded data: { "type": "image_generation.partial_succeeded", "model": "doubao-seedream-5-0-260128", "created": 1757396825, "image_index": 2, "url": "https://...", "size": "2496x1664" } event: image_generation.completed data: { "type": "image_generation.completed", "model": "doubao-seedream-5-0-260128", "created": 1757396825, "usage": { "generated_images": 3, "output_tokens": 48672, "total_tokens": 48672 } } data: [DONE] ``` ## 联网搜索 ### cURL #### Request ```bash curl https://ark.cn-beijing.volces.com/api/v3/images/generations \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seedream-5-0-260128", "prompt": "制作一张上海未来5日的天气预报图,采用现代扁平化插画风格,清晰展示每日天气、温度和穿搭建议。 整体为横向排版,标题为“上海未来5日天气预报”,包含5个等宽的垂直卡片,从左到右依次排列。 整体风格为现代、干净、友好的扁平化矢量插画风格,线条清晰,色彩柔和。人物形象采用年轻男女的卡通插画,表情自然,姿态放松,服装细节清晰。", "size": "2048x2048", "tools": [ { "type": "web_search" } ], "output_format":"png", "response_format": "url", "watermark": true }' ``` #### Response ``` { "model": "doubao-seedream-5-0-260128", "created": 1757321139, "data": [ { "url": "https://...", "size": "3104x1312" } ], "usage": { "generated_images": 1, "output_tokens": xxx, "total_tokens": xxx, "tool_usage": { "web_search": 1 // 实际搜索次数 } } } ``` ### Python #### Request ```python import os # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark from arkruntime.types.images import ToolParam client = Ark( # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key:https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv('ARK_API_KEY'), ) imagesResponse = client.images.generate( # Replace with Model ID model="doubao-seedream-5-0-260128", prompt="制作一张上海未来5日的天气预报图,采用现代扁平化插画风格,清晰展示每日天气、温度和穿搭建议。 整体为横向排版,标题为“上海未来5日天气预报”,包含5个等宽的垂直卡片,从左到右依次排列。 整体风格为现代、干净、友好的扁平化矢量插画风格,线条清晰,色彩柔和。人物形象采用年轻男女的卡通插画,表情自然,姿态放松,服装细节清晰。", size="2048x2048", output_format="png", response_format="url", tools=[ToolParam(type="web_search")], watermark=True, ) print(imagesResponse.data[0].url) ``` #### Response ``` { "model": "doubao-seedream-5-0-260128", "created": 1757321139, "data": [ { "url": "https://...", "size": "3104x1312" } ], "usage": { "generated_images": 1, "output_tokens": xxx, "total_tokens": xxx, "tool_usage": { "web_search": 1 // 实际搜索次数 } } } ``` ### Java #### Request ```java package com.ark.sample; import com.volcengine.ark.runtime.models.images.*; import com.volcengine.ark.runtime.service.ArkService; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; import java.util.Arrays; import java.util.List; import java.util.concurrent.TimeUnit; public class ImageGenerationsExample { public static void main(String[] args) { // Get API Key:https://ark.volcengine.com/region:cn-beijing/apikey String apiKey = System.getenv("ARK_API_KEY"); ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); Dispatcher dispatcher = new Dispatcher(); ArkService service = ArkService.builder() .baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .build(); // Create ContentGenerationTool Tool contentGenerationTool = new Tool(); contentGenerationTool.setType(ToolType.WEB_SEARCH); // Create list of tools List tools = Arrays.asList(contentGenerationTool); CreateImageGenerationRequest generateRequest = CreateImageGenerationRequest.builder() .model("doubao-seedream-5-0-260128") // Replace with Model ID .prompt("制作一张上海未来5日的天气预报图,采用现代扁平化插画风格,清晰展示每日天气、温度和穿搭建议。 整体为横向排版,标题为“上海未来5日天气预报”,包含5个等宽的垂直卡片,从左到右依次排列。 整体风格为现代、干净、友好的扁平化矢量插画风格,线条清晰,色彩柔和。人物形象采用年轻男女的卡通插画,表情自然,姿态放松,服装细节清晰。") .size("2048x2048") .outputFormat(OutputFormat.PNG) .responseFormat(ResponseFormat.URL) .watermark(true) .tools(tools) .build(); ImageGenerationResponse imagesResponse = service.generateImages(generateRequest); System.out.println(imagesResponse.getData().get(0).getUrl()); service.shutdownExecutor(); } } ``` #### Response ``` { "model": "doubao-seedream-5-0-260128", "created": 1757321139, "data": [ { "url": "https://...", "size": "3104x1312" } ], "usage": { "generated_images": 1, "output_tokens": xxx, "total_tokens": xxx, "tool_usage": { "web_search": 1 // 实际搜索次数 } } } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" model "github.com/volcengine/ark-runtime-go/arkruntime/model/images" ) func main() { client := arkruntime.NewClientWithApiKey( // Get API Key:https://ark.volcengine.com/region:cn-beijing/apikey os.Getenv("ARK_API_KEY"), // The base URL for model invocation arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() outputFormat := model.OutputFormatPNG generateReq := &model.CreateImageGenerationRequest{ Model: "doubao-seedream-5-0-260128", // Replace with Model ID Prompt: model.NewOptString("制作一张上海未来5日的天气预报图,采用现代扁平化插画风格,清晰展示每日天气、温度和穿搭建议。 整体为横向排版,标题为“上海未来5日天气预报”,包含5个等宽的垂直卡片,从左到右依次排列。 整体风格为现代、干净、友好的扁平化矢量插画风格,线条清晰,色彩柔和。人物形象采用年轻男女的卡通插画,表情自然,姿态放松,服装细节清晰。"), Size: model.NewOptString("2048x2048"), OutputFormat: model.NewOptOutputFormat(outputFormat), ResponseFormat: model.NewOptResponseFormat(model.ResponseFormatURL), Watermark: model.NewOptBool(true), Tools: []model.Tool{ { Type: model.ToolTypeWebSearch, }, }, } imagesResponse, err := client.GenerateImages(ctx, generateReq) if err != nil { fmt.Printf("generate images error: %v\n", err) return } fmt.Printf("%s\n", imagesResponse.Data[0].URL.Or("")) } ``` #### Response ``` { "model": "doubao-seedream-5-0-260128", "created": 1757321139, "data": [ { "url": "https://...", "size": "3104x1312" } ], "usage": { "generated_images": 1, "output_tokens": xxx, "total_tokens": xxx, "tool_usage": { "web_search": 1 // 实际搜索次数 } } } ``` --- # 图片生成流式响应事件 Source: https://ark.volcengine.com/region:cn-beijing/docs/image-generation-streaming-responses 当请求时设置 `stream: true`,图片生成 API 会以 Server-Sent Events(SSE)的形式实时推送每张图片的生成结果。本节内容介绍服务器会推送的各类事件。 > **说明** > > 流式输出的示例代码及返回示例,详见 [流式输出](/docs/streaming-output) 教程。 ## error > 顶层错误事件 schema —— 当请求整体失败(如缺少必填参数、鉴权失败等)时返回。 **error** `object` | 错误信息 `error.error` 本次请求的错误对象,含错误码与可读信息。 **code** `string` | 错误码 `error.error.code` 错误码,请参见 [错误码](/docs/error-codes) **message** `string` | 错误消息 `error.error.message` 错误提示信息,便于排查问题 error 响应示例 ``` "error": { "code":"BadRequest", "message":"The request failed because it is missing one or multiple required parameters. Request ID: {id}" } ``` ## image_generation.completed > 流式响应结束事件 schema,携带本次请求汇总信息。 **created** `integer` | 事件时间 `image_generation.completed.created` 本次事件创建时间的 Unix 时间戳(秒)。 **model** `string` | 模型 ID `image_generation.completed.model` 本次请求使用的模型 ID,格式为 `<模型名称>-<版本>`。 **type** `string` | 事件类型 `image_generation.completed.type` 取值固定为 `image_generation.completed`。 **tools** `object[]` | 工具调用列表 `image_generation.completed.tools` 本次请求中配置并被模型调用的工具列表,仅在工具被实际调用时返回。 **type** `string` | 工具类型 `image_generation.completed.tools.type` 指定使用的工具类型。 * `web_search`:联网搜索功能。 > **说明** > > * 开启联网搜索后,模型会根据用户的提示词自主判断是否搜索互联网内容(如商品、天气等),提升生成图片的时效性,但也会增加一定的时延。 > * 实际搜索次数可通过字段 `usage.tool_usage.web_search` 查询,如果为 0 表示未搜索。 **usage** `object` | 用量信息 `image_generation.completed.usage` 本次请求的用量信息,包括生成图片数量、消耗的 token 数量等。 **generated_images** `integer` | 成功生成图片数 `image_generation.completed.usage.generated_images` 模型成功生成的图片张数,不包含生成失败的图片。仅对成功生成图片按张数进行计费 **input_images==new==** `integer` | 输入图片数 `image_generation.completed.usage.input_images` 输入模型的图片张数。 **模型支持**: * `Seedream 5.0 pro` * `Seedream 5.0 flash` **output_tokens** `integer` | 输出 token 数 `image_generation.completed.usage.output_tokens` 模型生成的图片花费的 token 数量。计算逻辑为:`sum(图片长 * 图片宽) / 256` 后取整 **tool_usage** `object` | 工具用量 `image_generation.completed.usage.tool_usage` 使用工具的用量信息 **模型支持**: * `Seedream 5.0 lite` **web_search** `integer` | 联网搜索次数 `image_generation.completed.usage.tool_usage.web_search` 调用联网搜索工具的次数,仅开启联网搜索时返回。如果为 0 表示未搜索 **total_tokens** `integer` | 总 token 数 `image_generation.completed.usage.total_tokens` 本次请求消耗的总 token 数量。当前不计算输入 token,故与 `output_tokens` 值一致 image_generation.completed 响应示例 ``` { "type": "image_generation.completed", "model": "doubao-seedream-5-0-260128", "created": 1589478378, "tools": [ { "type": "web_search", } ], "usage": { "generated_images": 2, "output_tokens": xx, "total_tokens": xx, "tool_usage":{ "web_search":1 } } } ``` ## image_generation.partial_failed > 单张图片生成失败的流式事件 schema。 **created** `integer` | 事件时间 `image_generation.partial_failed.created` 本次事件创建时间的 Unix 时间戳(秒)。 **model** `string` | 模型 ID `image_generation.partial_failed.model` 本次请求使用的模型 ID,格式为 `<模型名称>-<版本>`。 **type** `string` | 事件类型 `image_generation.partial_failed.type` 取值固定为 `image_generation.partial_failed`。 **error** `object` | 错误信息 `image_generation.partial_failed.error` 该张图片生成失败的具体错误信息。 **code** `string` | 错误码 `image_generation.partial_failed.error.code` 错误码,请参见 [错误码](/docs/error-codes) **message** `string` | 错误消息 `image_generation.partial_failed.error.message` 错误提示信息,便于排查问题 **image_index** `integer` | 图片序号 `image_generation.partial_failed.image_index` 失败图片在组图中的位置(从 0 开始计数)。 image_generation.partial_failed 响应示例 ``` { "type": "image_generation.partial_failed", "model": "doubao-seedream-5-0-260128", "created": 1589478378, "image_index": 2, "error": { "code":"OutputImageSensitiveContentDetected", "message":"The request failed because the output image may contain sensitive information." } } ``` ## image_generation.partial_succeeded > 单张图片生成成功的流式事件 schema。 **created** `integer` | 事件时间 `image_generation.partial_succeeded.created` 本次事件创建时间的 Unix 时间戳(秒)。 **model** `string` | 模型 ID `image_generation.partial_succeeded.model` 本次请求使用的模型 ID,格式为 `<模型名称>-<版本>`。 **type** `string` | 事件类型 `image_generation.partial_succeeded.type` 取值固定为 `image_generation.partial_succeeded`。 **b64_json** `string` | 图片 Base64 数据 `image_generation.partial_succeeded.b64_json` 该张图片的 Base64 编码字符串,仅当请求参数 `response_format=b64_json` 时返回。 **image_index** `integer` | 图片序号 `image_generation.partial_succeeded.image_index` 当前事件对应的图片在组图中的位置(从 0 开始计数)。 **size** `string` | 图像尺寸 `image_generation.partial_succeeded.size` 实际生成图像的尺寸,格式为 `<宽像素>x<高像素>`,如 `2048x2048`。 **url** `string` | 图片 URL `image_generation.partial_succeeded.url` 该张图片的下载链接,仅当请求参数 `response_format=url` 时返回。链接在生成后 **24 小时内有效**,请及时下载或转存。 image_generation.partial_succeeded 响应示例 ``` { "type": "image_generation.partial_succeeded", "model": "doubao-seedream-5-0-260128", "created": 1589478378, "image_index": 0, "url": "https://...", "size": "2048×2048" } ``` --- # 创建 3D 生成任务 API Source: https://ark.volcengine.com/region:cn-beijing/docs/create-3d-generation-task-api `POST https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks` 本文介绍创建 3D 生成任务 API 的输入输出参数,供您使用接口时查阅字段含义。模型会依据传入的图片信息生成 3D,待生成完成后,您可以按条件查询任务并获取生成的 3D 文件。 **模型能力** * **doubao-seed3d** * `doubao-seed3d-2-0-260328`:图生 3D,根据您输入图片(1 张)+ 参数(可选)生成一个带纹理和 PBR 材质的 3D 文件。 **参数传入方式说明** > **说明** > > `subdivisionlevel` 和 `fileformat` 参数支持在文本提示词后追加 `--[parameters]` 的弱校验方式传入。若参数填写错误,该参数将被忽略。 **弱校验方式:在文本提示词后追加参数** ```JSON { "model": "doubao-seed3d-2-0-260328", "content": [ { "type": "text", "text": "--subdivisionlevel medium --fileformat obj" }, { "type": "image_url", "image_url": { "url": "" } } ] } ``` ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Body 参数 **model** `string` `必选` | 模型 ID 您需要调用的模型的 ID(Model ID)。[开通模型服务](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&OpenTokenDrawer=false) 后可 [查询 Model ID](/docs/model-list)。 您也可通过 Endpoint ID 来调用模型,获得限流、计费类型(前付费 / 后付费)、运行状态查询、监控、安全等高级能力,可参考 [获取 Endpoint ID](/docs/online-inference-standard)。 **content** `object[]` `必选` | 输入内容列表 输入给模型生成 3D 内容的信息,支持文本、图片等类型的元素。 支持以下几种组合: * 纯文本 * 文本(可选)+ 图片 文本信息 `object` 文本部分,作为生成内容的文本提示词。 **type** `string` `必选` | 内容类型 `content.type` 输入内容的类型,此处固定为 `text`。 **text** `string` `必选` | 文本提示词 `content.text` 输入给模型的文本提示词,描述期望生成的 3D 内容。 图片信息 `object` 输入给模型的图片信息。 **type** `string` `必选` | 内容类型 `content.type` 输入内容的类型,此处固定为 `image_url`。 **image_url** `object` `必选` | 图片对象 `content.image_url` 输入给模型的图片对象。 **url** `string` `必选` | 图片来源 `content.image_url.url` 图片 URL、图片 Base64 编码。 * **图片 URL**:填入图片的公网 URL。 * **Base64 编码**:将本地文件转换为 Base64 编码字符串后提交给大模型,遵循格式 `data:image/<图片格式>;base64,`,注意 `<图片格式>` 需小写,如 `data:image/png;base64,{base64_image}`。 > **说明:传入单张图片要求** > > * **格式**:`jpeg`、`png`、`webp`、`bmp`、`tiff`、`gif` > * **宽高比(宽/高)**:`[0.4, 2.5]` > * **宽高长度(px)**:`[300, 6000]` > * **大小**:单张图片小于 30 MB。请求体大小不超过 64 MB。大文件请勿使用 Base64 编码。 > * **图片数量**:1 张 **file_format** `string` `默认值 glb` | 输出文件格式 生成的 3D 文件格式。可选值:`glb`、`obj`、`usd`、`usdz`。 **subdivision_level** `string` `默认值 medium` | 多边形面数 3D 文件中多边形面的数量。可选值: * `high`:1000000 * `medium`:500000 * `low`:100000。 ## 响应参数 **id** `string` | 任务 ID 3D 生成任务 ID。仅保存 7 天(从 `created_at` 时间戳开始计算),超时后将自动清除。 创建 3D 生成任务为**异步接口**,获取 ID 后需要通过 [查询 3D 生成任务 API](/docs/get-3d-generation-task-api) 来查询任务状态。任务成功后会输出生成 3D 内容的 `file_url`。 ## 代码示例 ## 图生3D ### cURL #### Request ```bash curl -X POST https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "doubao-seed3d-2-0-260328", "content": [ { "type": "text", "text": "--subdivisionlevel medium --fileformat glb" }, { "type": "image_url", "image_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/images/domain-models/seed3d_imageTo3d.png" } } ] }' ``` #### Response ``` { "id": "cgt-2025******-****" } ``` ### Python #### Request ```python import os # Install SDK: python -m pip install --upgrade arkruntime from arkruntime import Ark # 初始化Ark客户端 client = Ark( # The base URL for model invocation . base_url="https://ark.cn-beijing.volces.com/api/v3", # Get API Key:https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.getenv('ARK_API_KEY'), ) print("----- create request -----") # 创建3D生成任务 create_result = client.content_generation.tasks.create( # Replace with Model ID . model="doubao-seed3d-2-0-260328", content=[ { # 参数 "type": "text", "text": "--subdivisionlevel medium --fileformat glb" }, { # 图片URL "type": "image_url", "image_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/images/domain-models/seed3d_imageTo3d.png" } } ] ) print(create_result) ``` #### Response ``` { "id": "cgt-2025******-****" } ``` ### Java #### Request ```java package com.volcengine.ark.runtime; import com.volcengine.ark.runtime.models.content_generation.*; import com.volcengine.ark.runtime.service.ArkService; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; public class ContentGenerationTaskExample { // 请确保您已将 API Key 存储在环境变量 ARK_API_KEY 中 // 初始化Ark客户端,从环境变量中读取您的API Key static String apiKey = System.getenv("ARK_API_KEY"); static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); static Dispatcher dispatcher = new Dispatcher(); static ArkService service = ArkService.builder() .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation . .build(); public static void main(String[] args) { //Replace with Model ID . String model = "doubao-seed3d-2-0-260328"; System.out.println("----- CREATE Task Request -----"); List contents = new ArrayList<>(); // 参数 contents.add(ContentItem.builder() .type(ContentType.TEXT) .text("--subdivisionlevel medium --fileformat glb") .build()); // 图片URL contents.add(ContentItem.builder() .type(ContentType.IMAGE_URL) .imageUrl(ImageURL.builder() .url("https://arkdocs.tos-cn-beijing.volces.com/images/domain-models/seed3d_imageTo3d.png") .build()) .build()); // 创建3D生成任务 CreateContentGenerationTaskRequest createRequest = CreateContentGenerationTaskRequest.builder() .model(model) .content(contents) .build(); CreateContentGenerationTaskResponse createResult = service.createContentGenerationTask(createRequest); System.out.println(createResult); service.shutdownExecutor(); } } ``` #### Response ``` { "id": "cgt-2025******-****" } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" model "github.com/volcengine/ark-runtime-go/arkruntime/model/contentgeneration" ) func main() { // 请确保您已将 API Key 存储在环境变量 ARK_API_KEY 中 // 初始化Ark客户端,从环境变量中读取您的API Key client := arkruntime.NewClientWithApiKey( // 从环境变量中获取您的 API Key。此为默认方式,您可根据需要进行修改 os.Getenv("ARK_API_KEY"), // The base URL for model invocation . arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() // Replace with Model ID . modelEp := "doubao-seed3d-2-0-260328" fmt.Println("----- create content generation task -----") // 创建3D生成任务 createReq := &model.CreateContentGenerationTaskRequest{ Model: modelEp, Content: []model.ContentItem{ { // 参数 Type: model.ContentTypeText, Text: model.NewOptString("--subdivisionlevel medium --fileformat glb"), }, { // 图片URL Type: model.ContentTypeImageURL, ImageURL: model.NewOptImageURL(model.ImageURL{ URL: "https://arkdocs.tos-cn-beijing.volces.com/images/domain-models/seed3d_imageTo3d.png", }), }, }, } createResponse, err := client.CreateContentGenerationTask(ctx, createReq) if err != nil { fmt.Printf("create content generation error: %v", err) return } fmt.Printf("Task Created with ID: %s", createResponse.ID) } ``` #### Response ``` { "id": "cgt-2025******-****" } ``` --- # 查询 3D 生成任务 API Source: https://ark.volcengine.com/region:cn-beijing/docs/get-3d-generation-task-api `GET https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks/{id}` 查询 3D 生成任务的状态。 > **说明** > > 仅支持查询最近 7 天的历史数据。时间计算统一采用 UTC 时间戳,返回的 7 天历史数据范围以用户实际发起查询请求的时刻为基准(精确到秒),时间戳区间为 `[T-7 天, T)`。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **id** `string` `必选` | 任务 ID 您需要查询的 3D 生成任务的 ID ## 响应参数 **id** `string` | 任务 ID 3D 生成任务 ID **model** `string` | 模型名称与版本 任务使用的模型名称和版本,格式为 `模型名称-版本` **status** `string` | 任务状态 任务状态,以及相关的信息: * `queued`:排队中。 * `running`:任务运行中。 * `cancelled`:取消任务,取消状态 24h 自动删除(只支持 `queued` 状态的任务被取消)。 * `succeeded`:任务成功。 * `failed`:任务失败。 **content** `object` | 输出内容 3D 生成任务的输出内容 **file_url** `string` | 文件 URL `content.file_url` 生成的 3D 文件的 URL。为保障信息安全,生成的 3D 文件会在 24 小时后被清理,请及时转存。 > **说明** > > * 模型会自动将生成的 3D 文件打包为 .zip 格式以供下载,压缩包内文件的格式与您创建任务时所指定的格式一致。 > * 推荐配置火山引擎 TOS 提供的数据订阅功能,将您的模型推理产物自动转存到自己的 TOS 桶中,便于长期备份或二次加工。详细介绍请参见 [TOS 数据订阅](https://docs.volcengine.com/docs/6349/2280949?lang=zh)。 **created_at** `integer` | 创建时间 任务创建时间的 Unix 时间戳(秒) **error** `object` | 错误信息 错误提示信息。任务成功时返回 `null`,任务失败时返回错误数据,错误信息具体参见 [错误处理](https://ark.volcengine.com/region:cn-beijing/docs/error-codes) **code** `string` | 错误码 `error.code` **message** `string` | 错误提示信息 `error.message` **fileformat** `string` | 文件格式 生成的 3D 文件格式。 **subdivisionlevel** `string` | 多边形面数 3D 文件中多边形面的数量。 **updated_at** `integer` | 更新时间 任务当前状态更新时间的 Unix 时间戳(秒) **usage** `object` | token 用量 本次请求的 token 用量 **completion_tokens** `integer` | 生成 3D 内容消耗的 token 数 `usage.completion_tokens` 模型生成 3D 内容消耗的 token 数量,可作为计费对账依据。 **total_tokens** `integer` | 总 token 数 `usage.total_tokens` 本次请求消耗的总 token 数量。3D 生成模型不统计输入 token,输入 token 为 0,故 `total_tokens` = `completion_tokens` ## 代码示例 ## 默认 ### cURL #### Request ```bash TASK_ID="your_task_id" curl -X GET "https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks/$TASK_ID" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" ``` #### Response ``` { "id":"cgt-2025******-****", "model":"doubao-seed3d-2-0-260328", "status":"succeeded", "created_at":"1718049470", "updated_at":"1718049470", "content":{ "file_url":"https://xxx", }, "subdivisionlevel": "medium", "fileformat": "glb", "usage":{ "total_tokens":30000, "completion_tokens":30000, } } ``` ### Python #### Request ```python import os from arkruntime import Ark client = Ark( api_key=os.environ.get("ARK_API_KEY"), base_url="https://ark.cn-beijing.volces.com/api/v3", ) if __name__ == "__main__": resp = client.content_generation.tasks.get( task_id="cgt-2025****", ) print(resp) ``` #### Response ``` { "id":"cgt-2025******-****", "model":"doubao-seed3d-2-0-260328", "status":"succeeded", "created_at":"1718049470", "updated_at":"1718049470", "content":{ "file_url":"https://xxx", }, "subdivisionlevel": "medium", "fileformat": "glb", "usage":{ "total_tokens":30000, "completion_tokens":30000, } } ``` ### Java #### Request ```java package com.volcengine.sample; import com.volcengine.ark.runtime.models.content_generation.*; import com.fasterxml.jackson.core.JsonProcessingException; import com.volcengine.ark.runtime.service.ArkService; import java.util.concurrent.TimeUnit; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; public class Sample { static String apiKey = System.getenv("ARK_API_KEY"); static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); static Dispatcher dispatcher = new Dispatcher(); static ArkService service = ArkService.builder() .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); public static void main(String[] args) throws JsonProcessingException { String taskId = "cgt-2025****"; String req = taskId; service.getContentGenerationTask(req).toString(); System.out.println(service.getContentGenerationTask(req)); service.shutdownExecutor(); } } ``` #### Response ``` { "id":"cgt-2025******-****", "model":"doubao-seed3d-2-0-260328", "status":"succeeded", "created_at":"1718049470", "updated_at":"1718049470", "content":{ "file_url":"https://xxx", }, "subdivisionlevel": "medium", "fileformat": "glb", "usage":{ "total_tokens":30000, "completion_tokens":30000, } } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() req := "cgt-2026****" resp, err := client.GetContentGenerationTask(ctx, req) if err != nil { fmt.Printf("get content generation task error: %v\n", err) return } fmt.Printf("%+v\n", resp) } ``` #### Response ``` { "id":"cgt-2025******-****", "model":"doubao-seed3d-2-0-260328", "status":"succeeded", "created_at":"1718049470", "updated_at":"1718049470", "content":{ "file_url":"https://xxx", }, "subdivisionlevel": "medium", "fileformat": "glb", "usage":{ "total_tokens":30000, "completion_tokens":30000, } } ``` --- # 查询 3D 生成任务列表 Source: https://ark.volcengine.com/region:cn-beijing/docs/get-3d-generation-task-list-api `GET https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks` 当您要查询符合条件的任务,您可以传入条件筛选参数,返回符合要求的任务。 > **说明** > > 仅支持查询最近 7 天的历史数据。时间计算统一采用 UTC 时间戳,返回的 7 天历史数据范围以用户实际发起批量查询请求的时刻为基准(精确到秒),时间戳区间为 `[T-7 天, T)`。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Query 参数 > 在 URL Query String 中传入。 **filter** `object` | 筛选条件 用于筛选任务的参数。 **model** `string` | 推理接入点 ID 筛选 `filter.model` 任务使用的推理接入点(Endpoint)ID,精确搜索。可在控制台 [在线推理] → [自定义推理接入点] 页面复制推理接入点 ID (格式为 `ep-` 开头的字符串), 或通过创建推理接入点接口获取。 **status** `string` | 任务状态筛选 `filter.status` 过滤参数,查询某个任务状态。任务状态,以及相关的信息: * `queued`:排队中。 * `running`:任务运行中。 * `cancelled`:取消任务,取消状态 24h 自动删除(只支持 `queued` 状态的任务被取消)。 * `succeeded`:任务成功。 * `failed`:任务失败。 **task_ids** `string[]` | 任务 ID 筛选 `filter.task_ids` 3D 生成任务 ID,精确搜索,支持同时搜索多个任务 ID。需通过重复参数名的方式传递,示例:`filter.task_ids=id1&filter.task_ids=id2` **page_num** `integer` `默认值 1` | 页码 返回结果的页码。 **取值范围**:`[1, 500]` **page_size** `integer` `默认值 20` | 每页数量 每页显示的结果数量。 **取值范围**:`[1, 500]` ## 响应参数 **items** `object[]` | 任务列表 查询到的 3D 生成任务列表 **id** `string` | 任务 ID `items.id` 3D 生成任务 ID **model** `string` | 模型名称与版本 `items.model` 任务使用的模型名称和版本,格式为 `模型名称-版本` **status** `string` | 任务状态 `items.status` 任务状态,以及相关的信息: * `queued`:排队中。 * `running`:任务运行中。 * `cancelled`:取消任务,取消状态 24h 自动删除(只支持 `queued` 状态的任务被取消)。 * `succeeded`:任务成功。 * `failed`:任务失败。 **content** `object` | 输出内容 `items.content` 3D 生成任务完成时返回的输出内容,包含生成 3D 文件下载的 URL **file_url** `string` | 文件 URL `items.content.file_url` 生成的 3D 文件的 URL。为保障信息安全,生成的 3D 文件会在 24 小时后被清理,请及时转存。 > **说明** > > * 模型会自动将生成的 3D 文件打包为 .zip 格式以供下载,压缩包内文件的格式与您创建任务时所指定的格式一致。 > * 推荐配置火山引擎 TOS 提供的数据订阅功能,将您的模型推理产物自动转存到自己的 TOS 桶中,便于长期备份或二次加工。详细介绍请参见 [TOS 数据订阅](https://docs.volcengine.com/docs/6349/2280949?lang=zh)。 **created_at** `integer` | 创建时间 `items.created_at` 任务创建时间的 Unix 时间戳(秒) **error** `object` | 错误信息 `items.error` 错误提示信息。任务成功时返回 `null`,任务失败时返回错误数据,错误信息具体参见 [错误处理](https://ark.volcengine.com/region:cn-beijing/docs/error-codes) **code** `string` | 错误码 `items.error.code` **message** `string` | 错误提示信息 `items.error.message` **fileformat** `string` | 文件格式 `items.fileformat` 生成的 3D 文件格式。 **subdivisionlevel** `string` | 多边形面数 `items.subdivisionlevel` 3D 文件中多边形面的数量。 **updated_at** `integer` | 更新时间 `items.updated_at` 任务当前状态更新时间的 Unix 时间戳(秒) **usage** `object` | token 用量 `items.usage` 本次请求的 token 用量 **completion_tokens** `integer` | 生成 3D 内容消耗的 token 数 `items.usage.completion_tokens` 模型生成 3D 内容消耗的 token 数量,可作为计费对账依据。 **total_tokens** `integer` | 总 token 数 `items.usage.total_tokens` 本次请求消耗的总 token 数量。3D 生成模型不统计输入 token,输入 token 为 0,故 `total_tokens` = `completion_tokens` **total** `integer` | 任务总数 符合筛选条件的任务数量 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl -X GET "https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks?page_num=2&filter.status=succeeded" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" ``` #### Response ``` { "items": [ { "id":"cgt-2025****-**", "model":"doubao-seed3d-2-0-260328", "status":"succeeded", "created_at":"1718049470", "updated_at":"1718049470", "content":{ "file_url":"https://xxx", }, "subdivisionlevel": "medium", "fileformat": "glb", "usage":{ "completion_tokens":30000, "total_tokens":30000, } }, { "id":"cgt-2025****-**", "model":"doubao-seed3d-1-0-250928", "status":"succeeded", "created_at":"1718049870", "updated_at":"1718049870", "content":{ "file_url":"https://xxx", }, "subdivisionlevel": "medium", "fileformat": "glb", "usage":{ "completion_tokens":30000, "total_tokens":30000, } }, ] , "total": 2 } ``` ### Python #### Request ```python import os from arkruntime import Ark client = Ark( api_key=os.environ.get("ARK_API_KEY"), base_url="https://ark.cn-beijing.volces.com/api/v3", ) if __name__ == "__main__": resp = client.content_generation.tasks.list( page_size=2, status="succeeded", ) print(resp) ``` #### Response ``` { "items": [ { "id":"cgt-2025****-**", "model":"doubao-seed3d-2-0-260328", "status":"succeeded", "created_at":"1718049470", "updated_at":"1718049470", "content":{ "file_url":"https://xxx", }, "subdivisionlevel": "medium", "fileformat": "glb", "usage":{ "completion_tokens":30000, "total_tokens":30000, } }, { "id":"cgt-2025****-**", "model":"doubao-seed3d-1-0-250928", "status":"succeeded", "created_at":"1718049870", "updated_at":"1718049870", "content":{ "file_url":"https://xxx", }, "subdivisionlevel": "medium", "fileformat": "glb", "usage":{ "completion_tokens":30000, "total_tokens":30000, } }, ] , "total": 2 } ``` ### Java #### Request ```java package com.volcengine.sample; import com.volcengine.ark.runtime.models.content_generation.*; import com.fasterxml.jackson.core.JsonProcessingException; import com.volcengine.ark.runtime.service.ArkService; import java.util.concurrent.TimeUnit; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; public class Sample { static String apiKey = System.getenv("ARK_API_KEY"); static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); static Dispatcher dispatcher = new Dispatcher(); static ArkService service = ArkService.builder() .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); public static void main(String[] args) throws JsonProcessingException { ListContentGenerationTasksRequest req = ListContentGenerationTasksRequest.builder().pageNum(1).pageSize(2).filterStatus(TaskStatus.SUCCEEDED).build(); System.out.println(service.listContentGenerationTasks(req)); service.shutdownExecutor(); } } ``` #### Response ``` { "items": [ { "id":"cgt-2025****-**", "model":"doubao-seed3d-2-0-260328", "status":"succeeded", "created_at":"1718049470", "updated_at":"1718049470", "content":{ "file_url":"https://xxx", }, "subdivisionlevel": "medium", "fileformat": "glb", "usage":{ "completion_tokens":30000, "total_tokens":30000, } }, { "id":"cgt-2025****-**", "model":"doubao-seed3d-1-0-250928", "status":"succeeded", "created_at":"1718049870", "updated_at":"1718049870", "content":{ "file_url":"https://xxx", }, "subdivisionlevel": "medium", "fileformat": "glb", "usage":{ "completion_tokens":30000, "total_tokens":30000, } }, ] , "total": 2 } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" model "github.com/volcengine/ark-runtime-go/arkruntime/model/contentgeneration" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() req := &arkruntime.ListContentGenerationTasksRequest{ PageSize: int32Pointer(2), Status: taskStatusPointer(model.TaskStatus("succeeded")), } resp, err := client.ListContentGenerationTasks(ctx, req) if err != nil { fmt.Printf("failed to list content generation tasks: %v\n", err) return } fmt.Printf("%+v\n", resp) } func int32Pointer(value int32) *int32 { return &value } func taskStatusPointer(value model.TaskStatus) *model.TaskStatus { return &value } ``` #### Response ``` { "items": [ { "id":"cgt-2025****-**", "model":"doubao-seed3d-2-0-260328", "status":"succeeded", "created_at":"1718049470", "updated_at":"1718049470", "content":{ "file_url":"https://xxx", }, "subdivisionlevel": "medium", "fileformat": "glb", "usage":{ "completion_tokens":30000, "total_tokens":30000, } }, { "id":"cgt-2025****-**", "model":"doubao-seed3d-1-0-250928", "status":"succeeded", "created_at":"1718049870", "updated_at":"1718049870", "content":{ "file_url":"https://xxx", }, "subdivisionlevel": "medium", "fileformat": "glb", "usage":{ "completion_tokens":30000, "total_tokens":30000, } }, ] , "total": 2 } ``` ## 搜索多个任务 ID ### cURL #### Request ```bash TASK_ID_1="your_first_task_id" TASK_ID_2="your_second_task_id" curl -X GET "https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks?filter.task_ids=$TASK_ID_1&filter.task_ids=$TASK_ID_2" \ --header "Content-Type: application/json" \ --header "Authorization: Bearer $ARK_API_KEY" ``` #### Response ``` { "items": [ { "id":"cgt-20250730114109-xtv7k", "model":"doubao-seed3d-2-0-260328", "status":"succeeded", "created_at":"1718049470", "updated_at":"1718049470", "content":{ "file_url":"https://xxx", }, "subdivisionlevel": "medium", "fileformat": "glb", "usage":{ "completion_tokens":30000, "total_tokens":30000, } }, { "id":"cgt-20250730114109-jfd6d", "model":"doubao-seed3d-2-0-260328", "status":"succeeded", "created_at":"1718049870", "updated_at":"1718049870", "content":{ "file_url":"https://xxx", }, "subdivisionlevel": "medium", "fileformat": "glb", "usage":{ "completion_tokens":30000, "total_tokens":30000, } }, ] , "total": 2 } ``` --- # 取消或删除 3D 生成任务 Source: https://ark.volcengine.com/region:cn-beijing/docs/delete-3d-api `DELETE https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks/{id}` 取消排队中的 3D 生成任务,或者删除 3D 生成任务记录。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **id** `string` `必选` | 任务 ID 需要取消或者删除的 3D 生成任务 ID。 任务状态不同,调用 `DELETE` 接口,执行的操作有所不同,具体说明如下: | 当前任务状态 | 是否支持 DELETE 操作 | 操作含义 | DELETE 操作后任务状态 | | --- | --- | --- | --- | | `queued` | 是 | 任务取消排队,任务状态被变更为 `cancelled` | `cancelled` | | `running` | 否 | — | — | | `succeeded` | 是 | 删除 3D 生成任务记录,后续将不支持查询 | — | | `failed` | 是 | 删除 3D 生成任务记录,后续将不支持查询 | — | | `cancelled` | 否 | — | — | | `expired` | 是 | 删除 3D 生成任务记录,后续将不支持查询 | — | ## 响应参数 本接口无特有的返回参数,成功时 HTTP 状态码为 `200`,返回结构中 `Result` 为空对象 `{}`。 ## 代码示例 ## 默认 ### cURL #### Request ```bash TASK_ID="your_task_id" curl -X DELETE "https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks/$TASK_ID" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" ``` #### Response ``` {} ``` ### Python #### Request ```python import os from arkruntime import Ark client = Ark( api_key=os.environ.get("ARK_API_KEY"), base_url="https://ark.cn-beijing.volces.com/api/v3", ) if __name__ == "__main__": try: client.content_generation.tasks.delete( # 替换为您要删除/取消的生成任务的 ID task_id="cgt-2025****", ) except Exception as e: print(f"failed to delete task: {e}") ``` #### Response ``` {} ``` ### Java #### Request ```java package com.volcengine.sample; import com.volcengine.ark.runtime.models.content_generation.*; import com.fasterxml.jackson.core.JsonProcessingException; import com.volcengine.ark.runtime.service.ArkService; import java.util.concurrent.TimeUnit; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; public class Sample { static String apiKey = System.getenv("ARK_API_KEY"); static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); static Dispatcher dispatcher = new Dispatcher(); static ArkService service = ArkService.builder() .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); public static void main(String[] args) throws JsonProcessingException { String req = "cgt-2025****"; service.deleteContentGenerationTask(req); service.shutdownExecutor(); } } ``` #### Response ``` {} ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() req := "cgt-2025****" err := client.DeleteContentGenerationTask(ctx, req) if err != nil { fmt.Printf("delete content generation task error: %v\n", err) return } } ``` #### Response ``` {} ``` --- # 创建3D生成任务 Source: https://ark.volcengine.com/region:cn-beijing/docs/shadoweye-create-3d-generation-task-api `POST https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks` 本文介绍创建影眸 3D 生成任务 API 的输入输出参数,供您使用接口时查阅字段含义。模型会依据传入的图片信息生成 3D,待生成完成后,您可以按条件查询任务并获取生成的 3D 文件。 > **说明:计费说明** > > 调用本 API 时按输出 token 计费,单价为 0.06 元/千 token。每生成一个 3D 模型固定消耗 3 万 token,即 1.8 元/次。另有资源包可供选择,详情请参见 [模型价格](/docs/model-pricing)。 **模型能力** * **Hyper3d-Gen2** * 文生 3D:输入文本提示词 + 参数(可选),生成一个 3D 模型文件。 * 图生 3D:输入图片(1-5张)+文本提示词(可选)+ 参数(可选)生成一个 3D 模型文件。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Body 参数 **model** `string` `必选` | 模型 ID 您需要调用的模型的 ID(Model ID)。[开通模型服务](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&OpenTokenDrawer=false) 后可 [查询 Model ID](/docs/model-list)。 您也可通过 Endpoint ID 来调用模型,获得限流、计费类型(前付费 / 后付费)、运行状态查询、监控、安全等高级能力,可参考 [获取 Endpoint ID](/docs/online-inference-standard)。 **content** `object[]` `必选` | 输入内容列表 输入给模型生成 3D 内容的信息,支持文本、图片等类型的元素。 支持以下几种组合: **文生 3D** * 纯文本 * 文本 + 参数(可选) **图生 3D** * 图片 * 图片 + 文本(可选) * 图片 + 参数(可选) * 图片 + 文本(可选)+ 参数(可选) 文本信息 `object` 文本部分,作为生成内容的文本提示词。 **type** `string` `必选` | 内容类型 `content.type` 输入内容的类型,此处固定为 `text`。 **text** `string` `必选` | 文本提示词 `content.text` 输入给模型的文本内容,包括: * **文本提示词**:仅支持英文,长度不超过 400 字符,超过后将截断。 * **参数(选填)**:通过 --[parameters] 的方式,控制 3D 文件输出的规格,详情见 模型文本命令(选填)。 图片信息 `object` 输入给模型的图片信息。 **type** `string` `必选` | 内容类型 `content.type` 输入内容的类型,此处固定为 `image_url`。 **image_url** `object` `必选` | 图片对象 `content.image_url` 输入给模型的图片对象。 **url** `string` `必选` | 图片来源 `content.image_url.url` 图片 URL 或图片 Base64 编码。 * **图片 URL**:需确保图片 URL 可被访问。 * **Base64 编码**:需遵循此格式`data:image/<图片格式>;base64,`,注意 `<图片格式>` 需小写,如 `data:image/png;base64,{base64_image}`。 > **说明:传入图片要求** > > * **格式**:`jpg`、`jpeg`、`png` > * **总像素**:小于 `4096 × 4096` px > * **大小**:单张图片不超过 30 MB > * **数量**:最多上传 5 张图片 **seed** `integer` | 随机种子 种子整数,用于控制生成内容的随机性。 **取值范围**:`[0, 65535]` > **注意** > > * 相同的请求下,模型收到不同的 `seed` 值,将生成不同的结果。 > * 相同的请求下,模型收到相同的 `seed` 值,会生成类似的结果,但不保证完全一致。 **callback_url** `string` | 回调地址 填写本次生成任务结果的回调通知地址。当 3D 生成任务状态变化时,方舟将向此地址发送 POST 请求,请求内容结构与 [查询 3D 生成任务](/docs/shadoweye-get-3d-generation-task-api) 的响应体一致。 回调返回的 status 包括以下状态: * queued:排队中 * running:任务运行中 * succeeded: 任务成功(如发送失败,即5秒内没有接收到成功发送的信息,回调三次) * failed:任务失败(如发送失败,即5秒内没有接收到成功发送的信息,回调三次) ### 模型文本命令参数(选填) 以下参数通过 `content.text` ,以 `--<参数名> <参数值>` 形式传入。 **参数传入方式示例** ```JSON { "content": [ { "type": "text", "text": "Complete full-body quadrupedal mech robot, orange and black armored, rounded head with glowing blue sensors, 4 articulated mechanical legs, hard-surface sci-fi design, high-detail joints, photorealistic 8K, fully assembled, no missing parts. --mesh_mode Raw --hd_texture true --material PBR --addons HighPack --quality_override 1000000 --use_original_alpha false --bbox_condition [100,100,100] --TAPose false" } ] } ``` **material** `string` `默认值 PBR` | 材质类型 控制 3D 模型的材质类型。可选值: * `PBR`:物理基础材质,包括基础颜色纹理、金属度纹理、法线纹理和粗糙度纹理,提供高真实感并在动态光照下具有物理准确性。 * `Shaded`:风格化材质,包括基础颜色纹理和烘焙光照。 * `All`:同时生成 PBR 和 Shaded 材质。 * `None`:无纹理,即生成白模。 **mesh_mode** `string` `默认值 Quad` | 网格形状 控制生成模型的网格形状。可选值: * `Raw`:生成三角面模型。 * `Quad`:生成四边面模型。 **quality_override** `number` | 多边形面数 自定义 3D 模型的多边形面数。不同网格形状对应的取值存在差异: * 当 `mesh_mode=Raw` 时:取值范围为 `[500, 1000000]`,默认值为 `500000`。 * 当 `mesh_mode=Quad`时:取值范围为 `[1000, 200000]`,默认值为 `18000`。 > **说明** > > * `quality_override` 与 `subdivisionlevel` 同时设置时,`subdivisionlevel` 不生效。 > * 建议取值 ≥150000。 **addons** `string` | 纹理增强 增强纹理贴图分辨率。可选值: * `HighPack`:提供 4K 分辨率的纹理贴图。 > **说明** > > 不配置该参数时,默认生成 2K 分辨率的纹理贴图。 **use_original_alpha** `boolean` `默认值 false` | 透明区域处理 是否保留输入图片的透明区域。 * `true`:保留透明区域,生成的 3D 模型或贴图按原图透明轮廓处理。 * `false`:自动填充透明区域,可能丢失原始透明效果。 **bbox_condition** `integer[]` | 模型边界 指定模型边界的宽度、高度和长度,例如 `[100, 100, 100]`。 > **说明** > > 如无特殊需求,建议不设置,由模型自动判断边界。 **TAPose** `boolean` `默认值 false` | 标准绑定姿态 生成类人模型时,是否强制使用 T-Pose 或 A-Pose 标准绑定姿态。 * `true`:强制使用标准绑定姿态,由模型判断使用 T-Pose 或 A-Pose。 * `false`:不强制使用标准绑定姿态,由模型自行决定。 **subdivisionlevel** `string` `简写 sl` | 多边形面数等级 控制 3D 模型的多边形面数。不同网格形状对应的取值存在差异: * 当`mesh_mode=Raw`时,可选值: * `high`(默认值):500k * `medium`:150k * `low`:20k * 当`mesh_mode=Quad`时,可选值: * `high`:50k * `medium`(默认值):18k * `low`:8k **fileformat** `string` `默认值 glb` `简写 ff` | 文件格式 生成的有纹理 3D 模型文件格式,可选值: * `glb` * `obj` * `usdz` * `fbx` * `stl` **hd_texture** `boolean` `默认值 false` | HD 纹理 是否启用 HD 纹理。 * `true`:启用 HD 纹理。 * `false`:不启用 HD 纹理。 ## 响应参数 **id** `string` | 任务 ID 3D 生成任务 ID。仅保存 7 天(从 `created_at` 时间戳开始计算),超时后将自动清除。 创建 3D 生成任务为异步接口。获取 ID 后,需要通过 [查询 3D 生成任务](/docs/shadoweye-get-3d-generation-task-api) 查询任务状态;任务成功后,接口通过 `file_url` 返回生成文件。 ## 代码示例 ## 文生3D ### cURL #### Request ```bash curl -X POST https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "hyper3d-gen2-260112", "content": [ { "type": "text", "text": "Complete full-body quadrupedal mech robot, orange and black armored, rounded head with glowing blue sensors, 4 articulated mechanical legs, hard-surface sci-fi design, high-detail joints, photorealistic 8K, fully assembled, no missing parts. --mesh_mode Raw --hd_texture true --material PBR --addons HighPack --quality_override 1000000 --use_original_alpha false --bbox_condition [100,100,100] --TAPose false" } ], "seed": 8648 }' ``` #### Response ``` { "id": "cgt-2026******-****", } ``` ## 图生3D ### cURL #### Request ```bash curl -X POST https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "hyper3d-gen2-260112", "content": [ { "type": "text", "text": "Generate a 3D model from these three reference images showing front, side, and back views" }, { "type": "image_url", "image_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/images/domain-models/front_view.png" } }, { "type": "image_url", "image_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/images/domain-models/side_view.png" } }, { "type": "image_url", "image_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/images/domain-models/back_view.png" } } ], "seed": 8648 }' ``` #### Response ``` { "id": "cgt-2026******-****", } ``` --- # 查询3D生成任务 Source: https://ark.volcengine.com/region:cn-beijing/docs/shadoweye-get-3d-generation-task-api `GET https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks/{id}` 查询影眸 3D 生成任务的状态。 > **说明** > > 仅支持查询最近 7 天的历史数据。时间计算统一采用 UTC 时间戳,返回的 7 天历史数据范围以用户实际发起查询请求的时刻为基准(精确到秒),时间戳区间为 `[T-7 天, T)`。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **id** `string` `必选` | 任务 ID 您需要查询的影眸 3D 生成任务 ID,该 ID 由创建任务接口返回。 ## 响应参数 **id** `string` | 任务 ID 影眸 3D 生成任务 ID **model** `string` | 模型名称与版本 任务使用的模型名称和版本,格式为 `模型名称-版本` **status** `string` | 任务状态 任务状态,以及相关的信息: * `queued`:排队中。 * `running`:任务运行中。 * `cancelled`:取消任务,取消状态 24h 自动删除(只支持 `queued` 状态的任务被取消)。 * `succeeded`:任务成功。 * `failed`:任务失败。 **content** `object` | 输出内容 影眸 3D 生成任务的输出内容 **file_url** `string` | 文件 URL `content.file_url` 生成的 3D 文件的 URL。为保障信息安全,生成的 3D 模型文件会在 24 小时后被清理,请及时转存。 > **说明** > > * 模型会自动将生成的 3D 模型文件打包为 .zip 格式以供下载,压缩包内文件的格式与您创建任务时所指定的格式一致。 > * 推荐配置火山引擎 TOS 提供的数据订阅功能,将您的模型推理产物自动转存到自己的 TOS 桶中,便于长期备份或二次加工。详细介绍请参见 [TOS 数据订阅](https://docs.volcengine.com/docs/6349/2280949?lang=zh)。 **created_at** `integer` | 创建时间 任务创建时间的 Unix 时间戳(秒) **error** `object` | 错误信息 错误提示信息。任务成功时返回 `null`,任务失败时返回错误数据,错误信息具体参见 [错误处理](https://ark.volcengine.com/region:cn-beijing/docs/error-codes) **code** `string` | 错误码 `error.code` **message** `string` | 错误提示信息 `error.message` **updated_at** `integer` | 更新时间 任务当前状态更新时间的 Unix 时间戳(秒) **usage** `object` | token 用量 本次请求的 token 用量 **completion_tokens** `integer` | 生成 3D 内容消耗的 token 数 `usage.completion_tokens` 模型生成 3D 模型文件消耗的 token 数量,可作为计费对账依据。 **total_tokens** `integer` | 总 token 数 `usage.total_tokens` 本次请求消耗的总 token 数量。3D 生成模型不统计输入 token,输入 token 为 0,故 `total_tokens` = `completion_tokens` ## 代码示例 ## 默认 ### cURL #### Request ```bash TASK_ID="your_task_id" curl -X GET "https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks/$TASK_ID" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" ``` #### Response ``` { "id": "cgt-2026******-****", "model": "hyper3d-gen2-260112", "status": "succeeded", "content": { "file_url": "https://xxx" }, "usage": { "completion_tokens": 30000, "total_tokens": 30000 }, "created_at": 1775803769, "updated_at": 1775804381 } ``` --- # 查询3D生成任务列表 Source: https://ark.volcengine.com/region:cn-beijing/docs/shadoweye-get-3d-generation-task-list-api `GET https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks` 通过筛选参数查询符合条件的影眸 3D 生成任务。 > **说明** > > 仅支持查询最近 7 天的历史数据。时间计算统一采用 UTC 时间戳,返回的 7 天历史数据范围以用户实际发起批量查询请求的时刻为基准(精确到秒),时间戳区间为 `[T-7 天, T)`。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Query 参数 > 在 URL Query String 中传入。 **filter** `object` | 筛选条件 用于筛选任务的参数。 **model** `string` | 推理接入点 ID 筛选 `filter.model` 任务使用的推理接入点(Endpoint)ID,精确搜索。可在控制台 [在线推理] → [自定义推理接入点] 页面复制推理接入点 ID (格式为 `ep-` 开头的字符串), 或通过创建推理接入点接口获取。 **status** `string` | 任务状态筛选 `filter.status` 过滤参数,查询某个任务状态。任务状态,以及相关的信息: * `queued`:排队中。 * `running`:任务运行中。 * `cancelled`:取消任务,取消状态 24h 自动删除(只支持 `queued` 状态的任务被取消)。 * `succeeded`:任务成功。 * `failed`:任务失败。 **task_ids** `string[]` | 任务 ID 筛选 `filter.task_ids` 影眸 3D 生成任务 ID,精确搜索,支持同时搜索多个任务 ID。需通过重复参数名的方式传递,示例:`filter.task_ids=id1&filter.task_ids=id2` **page_num** `integer` `默认值 1` | 页码 返回结果的页码。 **取值范围**:`[1, 500]` **page_size** `integer` `默认值 20` | 每页数量 每页显示的结果数量。 **取值范围**:`[1, 500]` ## 响应参数 **items** `object[]` | 任务列表 查询到的影眸 3D 生成任务列表 **id** `string` | 任务 ID `items.id` 影眸 3D 生成任务 ID **model** `string` | 模型名称与版本 `items.model` 任务使用的模型名称和版本,格式为 `模型名称-版本` **status** `string` | 任务状态 `items.status` 任务状态,以及相关的信息: * `queued`:排队中。 * `running`:任务运行中。 * `cancelled`:取消任务,取消状态 24h 自动删除(只支持 `queued` 状态的任务被取消)。 * `succeeded`:任务成功。 * `failed`:任务失败。 **content** `object` | 输出内容 `items.content` 影眸 3D 生成任务完成时返回的输出内容,包含生成文件的下载 URL **file_url** `string` | 文件 URL `items.content.file_url` 生成的 3D 文件的 URL。为保障信息安全,生成的 3D 模型文件会在 24 小时后被清理,请及时转存。 > **说明** > > * 模型会自动将生成的 3D 模型文件打包为 .zip 格式以供下载,压缩包内文件的格式与您创建任务时所指定的格式一致。 > * 推荐配置火山引擎 TOS 提供的数据订阅功能,将您的模型推理产物自动转存到自己的 TOS 桶中,便于长期备份或二次加工。详细介绍请参见 [TOS 数据订阅](https://docs.volcengine.com/docs/6349/2280949?lang=zh)。 **created_at** `integer` | 创建时间 `items.created_at` 任务创建时间的 Unix 时间戳(秒) **error** `object` | 错误信息 `items.error` 错误提示信息。任务成功时返回 `null`,任务失败时返回错误数据,错误信息具体参见 [错误处理](https://ark.volcengine.com/region:cn-beijing/docs/error-codes) **code** `string` | 错误码 `items.error.code` **message** `string` | 错误提示信息 `items.error.message` **updated_at** `integer` | 更新时间 `items.updated_at` 任务当前状态更新时间的 Unix 时间戳(秒) **usage** `object` | token 用量 `items.usage` 本次请求的 token 用量 **completion_tokens** `integer` | 生成 3D 内容消耗的 token 数 `items.usage.completion_tokens` 模型生成 3D 内容消耗的 token 数量,可作为计费对账依据。 **total_tokens** `integer` | 总 token 数 `items.usage.total_tokens` 本次请求消耗的总 token 数量。3D 生成模型不统计输入 token,输入 token 为 0,故 `total_tokens` = `completion_tokens` **total** `integer` | 任务总数 符合筛选条件的任务数量 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl -X GET "https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks?page_num=2&filter.status=succeeded" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" ``` #### Response ``` { "items": [ { "id":"cgt-2026****-**", "model":"hyper3d-gen2-260112", "status":"succeeded", "content":{ "file_url":"https://xxx", }, "usage":{ "completion_tokens":30000, "total_tokens":30000, } , "created_at":1718049470, "updated_at":1718049470 }, { "id":"cgt-2026****-**", "model":"hyper3d-gen2-260112", "status":"succeeded", "content":{ "file_url":"https://xxx", }, "usage":{ "completion_tokens":30000, "total_tokens":30000, }, "created_at":1718049470, "updated_at":1718049470 }, ], "total":2 } ``` --- # 取消或删除3D生成任务 Source: https://ark.volcengine.com/region:cn-beijing/docs/shadoweye-delete-3d-api `DELETE https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks/{id}` 取消排队中的影眸 3D 生成任务,或者删除影眸 3D 生成任务记录。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **id** `string` `必选` | 任务 ID 需要取消或者删除的影眸 3D 生成任务 ID。 任务状态不同,调用 `DELETE` 接口执行的操作不同: | 当前任务状态 | 是否支持 DELETE 操作 | 操作含义 | DELETE 操作后任务状态 | | --- | --- | --- | --- | | `queued` | 是 | 任务取消排队,任务状态变更为 `cancelled` | `cancelled` | | `running` | 否 | — | — | | `succeeded` | 是 | 删除任务记录,后续不再支持查询 | — | | `failed` | 是 | 删除任务记录,后续不再支持查询 | — | | `cancelled` | 否,24 小时后自动删除 | — | — | ## 响应参数 本接口无特有的返回参数,成功时 HTTP 状态码为 `200`,返回结构中 `Result` 为空对象 `{}`。 ## 代码示例 ## 默认 ### cURL #### Request ```bash TASK_ID="your_task_id" curl -X DELETE "https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks/$TASK_ID" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" ``` #### Response ``` {} ``` --- # 创建3D生成任务 Source: https://ark.volcengine.com/region:cn-beijing/docs/shumei-create-3d-generation-task-api `POST https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks` 本文介绍创建数美 3D 生成任务 API 的输入输出参数,供您使用接口时查阅字段含义。模型会依据传入的图片信息生成 3D,待生成完成后,您可以按条件查询任务并获取生成的 3D 文件。 > **说明:计费说明** > > 调用本 API 时按输出 token 计费,单价为 0.08 元/千 token。每生成一个 3D 模型的费用为 5 元至 13 元,具体费用取决于生成模式。详情请参见 [模型价格](/docs/model-pricing)。 **模型能力** * **Hitem3d-2.0** * 图生 3D:输入图片( 1-4 张)+文本提示词(可选)+ 参数(可选),生成一个 3D 模型文件。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Body 参数 **model** `string` `必选` | 模型 ID 您需要调用的模型的 ID(Model ID)。[开通模型服务](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&OpenTokenDrawer=false) 后可 [查询 Model ID](/docs/model-list)。 您也可通过 Endpoint ID 来调用模型,获得限流、计费类型(前付费 / 后付费)、运行状态查询、监控、安全等高级能力,可参考 [获取 Endpoint ID](/docs/online-inference-standard)。 **content** `object[]` `必选` | 输入内容列表 输入给模型生成 3D 内容的信息,支持图片和模型文本命令。 支持以下几种组合: * 图片 * 图片 + 参数(可选) 文本信息 `object` 文本部分,作为生成内容的文本提示词。 **type** `string` `必选` | 内容类型 `content.type` 输入内容的类型,此处固定为 `text`。 **text** `string` `必选` | 文本提示词 `content.text` 输入给模型的模型文本命令,仅支持输入参数。 * **参数(选填)**:通过 --[parameters] 的方式,控制 3D 文件输出的规格,详情见 模型文本命令(选填)。 图片信息 `object` 输入给模型的图片信息。 **type** `string` `必选` | 内容类型 `content.type` 输入内容的类型,此处固定为 `image_url`。 **image_url** `object` `必选` | 图片对象 `content.image_url` 输入给模型的图片对象。 **url** `string` `必选` | 图片来源 `content.image_url.url` 图片 URL。请确保图片 URL 可访问。 > **说明:传入图片要求** > > * **格式**:`jpg`、`jpeg`、`png`、`webp` > * **大小**:单张图片不超过 10 MB > * **总像素**:小于 `4096 × 4096` > * **数量**:最多上传 4 张图片 **callback_url** `string` | 回调地址 填写本次生成任务结果的回调通知地址。当 3D 生成任务状态变化时,方舟将向此地址发送 POST 请求,请求内容结构与 [查询 3D 生成任务](/docs/shumei-get-3d-generation-task-api) 的响应体一致。 回调返回的 status 包括以下状态: * queued:排队中 * running:任务运行中 * succeeded: 任务成功(如发送失败,即5秒内没有接收到成功发送的信息,回调三次) * failed:任务失败(如发送失败,即5秒内没有接收到成功发送的信息,回调三次) ### 模型文本命令参数(选填) 以下参数通过 `content.text` ,以 `--<参数名> <参数值>` 形式传入。 **参数传入方式示例** ```JSON { "content": [ { "type": "text", "text": "--resolution 1536 --request_type 3 --ff 1 --face 2000000" } ] } ``` **resolution** `string` `默认值 1536` | 模型分辨率 控制 3D 模型的分辨率。可选值: * `1536` * `1536pro` **face** `integer` | 模型面数 自定义模型面数,取值范围为 `[100000, 2000000]`。 `1536` 和 `1536pro` 分辨率均推荐设置为 `2000000`。 **fileformat** `integer` `默认值 1` `简写 ff` | 文件格式 生成的有纹理 3D 模型文件格式。可选值: * `1`:对应的文件格式为 obj * `2`:对应的文件格式为 glb * `3`:对应的文件格式为 stl * `4`:对应的文件格式为 fbx * `5`:对应的文件格式为 usdz **request_type** `integer` `默认值 3` | 请求类型 请求类型。可选值: * `1`:仅生成纯几何模型。 * `3`:一次生成几何和纹理模型。 **multi_images_bit** `string` | 多视图位图标识 上传图像数组的位图标识,用于标记 `content.image_url` 中各图像的视图类型。字符串由 `0` 和 `1` 组成,视图顺序依次为前视图、后视图、左视图、右视图。 | 参数值 | 含义 | 数组内容顺序 | | --- | --- | --- | | `1010` | 存在前视图、左视图 | `[前视图, 左视图]` | | `1011` | 存在前视图、左视图、右视图 | `[前视图, 左视图, 右视图]` | | `1111` | 四个视图均存在 | `[前视图, 后视图, 左视图, 右视图]` | | `0101` | 存在后视图、右视图 | `[后视图, 右视图]` | ## 响应参数 **id** `string` | 任务 ID 3D 生成任务 ID。仅保存 7 天(从 `created_at` 时间戳开始计算),超时后将自动清除。 创建 3D 生成任务为异步接口。获取 ID 后,需要通过 [查询 3D 生成任务](/docs/shumei-get-3d-generation-task-api) 查询任务状态;任务成功后,接口通过 `file_url` 返回生成文件。 ## 代码示例 ## 图生3D ### cURL #### Request ```bash curl -X POST https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "hitem3d-2-0-251223", "content": [ { "type": "text", "text": "--ff 2 --resolution 1536pro" }, { "type": "image_url", "image_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/images/domain-models/cat.png" } } ] }' ``` #### Response ``` { "id": "cgt-2026******-****" } ``` --- # 查询3D生成任务 Source: https://ark.volcengine.com/region:cn-beijing/docs/shumei-get-3d-generation-task-api `GET https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks/{id}` 查询数美 3D 生成任务的状态。 > **说明** > > 仅支持查询最近 7 天的历史数据。时间计算统一采用 UTC 时间戳,返回的 7 天历史数据范围以用户实际发起查询请求的时刻为基准(精确到秒),时间戳区间为 `[T-7 天, T)`。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **id** `string` `必选` | 任务 ID 您需要查询的数美 3D 生成任务 ID,该 ID 由创建任务接口返回。 ## 响应参数 **id** `string` | 任务 ID 数美 3D 生成任务 ID **model** `string` | 模型名称与版本 任务使用的模型名称和版本,格式为 `模型名称-版本` **status** `string` | 任务状态 任务状态,以及相关的信息: * `queued`:排队中。 * `running`:任务运行中。 * `cancelled`:取消任务,取消状态 24h 自动删除(只支持 `queued` 状态的任务被取消)。 * `succeeded`:任务成功。 * `failed`:任务失败。 **content** `object` | 输出内容 数美 3D 生成任务的输出内容 **file_url** `string` | 文件 URL `content.file_url` 生成的 3D 模型文件的 URL。为保障信息安全,生成的 3D 模型文件会在 24 小时后被清理,请及时转存。 > **说明** > > * 模型会自动将生成的 3D 模型文件打包为 .zip 格式以供下载,压缩包内文件的格式与您创建任务时所指定的格式一致。 > * 推荐配置火山引擎 TOS 提供的数据订阅功能,将您的模型推理产物自动转存到自己的 TOS 桶中,便于长期备份或二次加工。详细介绍请参见 [TOS 数据订阅](https://docs.volcengine.com/docs/6349/2280949?lang=zh)。 **created_at** `integer` | 创建时间 任务创建时间的 Unix 时间戳(秒) **error** `object` | 错误信息 错误提示信息。任务成功时返回 `null`,任务失败时返回错误数据,错误信息具体参见 [错误处理](https://ark.volcengine.com/region:cn-beijing/docs/error-codes) **code** `string` | 错误码 `error.code` **message** `string` | 错误提示信息 `error.message` **updated_at** `integer` | 更新时间 任务当前状态更新时间的 Unix 时间戳(秒) **usage** `object` | token 用量 本次请求的 token 用量 **completion_tokens** `integer` | 生成 3D 内容消耗的 token 数 `usage.completion_tokens` 模型生成 3D 模型文件消耗的 token 数量,可作为计费对账依据。 **total_tokens** `integer` | 总 token 数 `usage.total_tokens` 本次请求消耗的总 token 数量。3D 生成模型不统计输入 token,输入 token 为 0,故 `total_tokens` = `completion_tokens` ## 代码示例 ## 默认 ### cURL #### Request ```bash TASK_ID="your_task_id" curl -X GET "https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks/$TASK_ID" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" ``` #### Response ``` { "id": "cgt-2026******-****", "model": "hitem3d-2-0-251223", "status": "succeeded", "content": { "file_url": "https://xxx" }, "usage": { "completion_tokens": 126875, "total_tokens": 126875 }, "created_at": 1775799170, "updated_at": 1775800281 } ``` --- # 查询3D生成任务列表 Source: https://ark.volcengine.com/region:cn-beijing/docs/shumei-get-3d-generation-task-list-api `GET https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks` 通过筛选参数查询符合条件的数美 3D 生成任务。 > **说明** > > 仅支持查询最近 7 天的历史数据。时间计算统一采用 UTC 时间戳,返回的 7 天历史数据范围以用户实际发起批量查询请求的时刻为基准(精确到秒),时间戳区间为 `[T-7 天, T)`。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Query 参数 > 在 URL Query String 中传入。 **filter** `object` | 筛选条件 用于筛选任务的参数。 **model** `string` | 推理接入点 ID 筛选 `filter.model` 任务使用的推理接入点(Endpoint)ID,精确搜索。可在控制台 [在线推理] → [自定义推理接入点] 页面复制推理接入点 ID (格式为 `ep-` 开头的字符串), 或通过创建推理接入点接口获取。 **status** `string` | 任务状态筛选 `filter.status` 过滤参数,查询某个任务状态。任务状态,以及相关的信息: * `queued`:排队中。 * `running`:任务运行中。 * `cancelled`:取消任务,取消状态 24h 自动删除(只支持 `queued` 状态的任务被取消)。 * `succeeded`:任务成功。 * `failed`:任务失败。 **task_ids** `string[]` | 任务 ID 筛选 `filter.task_ids` 数美 3D 生成任务 ID,精确搜索,支持同时搜索多个任务 ID。需通过重复参数名的方式传递,示例:`filter.task_ids=id1&filter.task_ids=id2` **page_num** `integer` `默认值 1` | 页码 返回结果的页码。 **取值范围**:`[1, 500]` **page_size** `integer` `默认值 20` | 每页数量 每页显示的结果数量。 **取值范围**:`[1, 500]` ## 响应参数 **items** `object[]` | 任务列表 查询到的数美 3D 生成任务列表 **id** `string` | 任务 ID `items.id` 数美 3D 生成任务 ID **model** `string` | 模型名称与版本 `items.model` 任务使用的模型名称和版本,格式为 `模型名称-版本` **status** `string` | 任务状态 `items.status` 任务状态,以及相关的信息: * `queued`:排队中。 * `running`:任务运行中。 * `cancelled`:取消任务,取消状态 24h 自动删除(只支持 `queued` 状态的任务被取消)。 * `succeeded`:任务成功。 * `failed`:任务失败。 **content** `object` | 输出内容 `items.content` 数美 3D 生成任务完成时返回的输出内容,包含生成文件的下载 URL **file_url** `string` | 文件 URL `items.content.file_url` 生成的 3D 文件的 URL。为保障信息安全,生成的 3D 文件会在 24 小时后被清理,请及时转存。 > **说明** > > * 模型会自动将生成的 3D 文件打包为 .zip 格式以供下载,压缩包内文件的格式与您创建任务时所指定的格式一致。 > * 推荐配置火山引擎 TOS 提供的数据订阅功能,将您的模型推理产物自动转存到自己的 TOS 桶中,便于长期备份或二次加工。详细介绍请参见 [TOS 数据订阅](https://docs.volcengine.com/docs/6349/2280949?lang=zh)。 **created_at** `integer` | 创建时间 `items.created_at` 任务创建时间的 Unix 时间戳(秒) **error** `object` | 错误信息 `items.error` 错误提示信息。任务成功时返回 `null`,任务失败时返回错误数据,错误信息具体参见 [错误处理](https://ark.volcengine.com/region:cn-beijing/docs/error-codes) **code** `string` | 错误码 `items.error.code` **message** `string` | 错误提示信息 `items.error.message` **updated_at** `integer` | 更新时间 `items.updated_at` 任务当前状态更新时间的 Unix 时间戳(秒) **usage** `object` | token 用量 `items.usage` 本次请求的 token 用量 **completion_tokens** `integer` | 生成 3D 内容消耗的 token 数 `items.usage.completion_tokens` 模型生成 3D 内容消耗的 token 数量,可作为计费对账依据。 **total_tokens** `integer` | 总 token 数 `items.usage.total_tokens` 本次请求消耗的总 token 数量。3D 生成模型不统计输入 token,输入 token 为 0,故 `total_tokens` = `completion_tokens` **total** `integer` | 任务总数 符合筛选条件的任务数量 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl -X GET "https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks?page_num=2&filter.status=succeeded" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" ``` #### Response ``` { "items": [ { "id":"cgt-2026****-**", "model":"hitem3d-2-0-251223", "status":"succeeded", "content":{ "file_url":"https://xxx", }, "usage":{ "completion_tokens":126875, "total_tokens":126875, }, "created_at":1718049470, "updated_at":1718049470 }, { "id":"cgt-2026****-**", "model":"hitem3d-2-0-251223", "status":"succeeded", "content":{ "file_url":"https://xxx", }, "usage":{ "completion_tokens":126875, "total_tokens":126875, }, "created_at":1718049470, "updated_at":1718049470 }, ], "total": 2 } ``` --- # 取消或删除3D生成任务 Source: https://ark.volcengine.com/region:cn-beijing/docs/shumei-delete-3d-api `DELETE https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks/{id}` 取消排队中的数美 3D 生成任务,或者删除数美 3D 生成任务记录。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **id** `string` `必选` | 任务 ID 需要取消或者删除的数美 3D 生成任务 ID。 任务状态不同,调用 `DELETE` 接口执行的操作不同: | 当前任务状态 | 是否支持 DELETE 操作 | 操作含义 | DELETE 操作后任务状态 | | --- | --- | --- | --- | | `queued` | 是 | 任务取消排队,任务状态变更为 `cancelled` | `cancelled` | | `running` | 否 | — | — | | `succeeded` | 是 | 删除任务记录,后续不再支持查询 | — | | `failed` | 是 | 删除任务记录,后续不再支持查询 | — | | `cancelled` | 否,24 小时后自动删除 | — | — | ## 响应参数 本接口无特有的返回参数,成功时 HTTP 状态码为 `200`,返回结构中 `Result` 为空对象 `{}`。 ## 代码示例 ## 默认 ### cURL #### Request ```bash TASK_ID="your_task_id" curl -X DELETE "https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks/$TASK_ID" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" ``` #### Response ``` {} ``` --- # 多模态向量化 API Source: https://ark.volcengine.com/region:cn-beijing/docs/multimodal-vectorization-api `POST https://ark.cn-beijing.volces.com/api/v3/embeddings/multimodal` 将视频、图像和文本转化为向量,用于以图搜图、语义检索、跨模态匹配等场景。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Body 参数 **input** `object[]` `必选` | 输入内容 需要向量化的内容列表。列表元素支持文本信息、图片信息以及视频信息。不同模型的支持情况不同 **type** `string` `必选` | 类型 `input.type` 输入内容的类型。取值范围:`text`、`image_url`、`video_url` **image_url** `object` | 图片对象 `input.image_url` 输入给模型的图片对象。当 `type` 为 `image_url` 时必填 **url** `string` `必选` | 图片地址 `input.image_url.url` 图片信息,可以是图片 URL 或图片 Base64 编码。图片 URL:请确保图片 URL 可被访问。Base64 编码:请遵循格式 `data:image/{图片格式};base64,{图片Base64编码}` **text** `string` | 文本内容 `input.text` 输入给模型的文本内容。当 `type` 为 `text` 时必填。单条文本以 utf-8 编码,长度不超过模型的最大输入 token 数 **video_url** `object` | 视频对象 `input.video_url` 输入给模型的视频对象。当 `type` 为 `video_url` 时必填 > **说明:注意** > > 传入视频需要满足以下条件: > - 格式:.mp4、.avi、.mov,视频格式需小写。 > - 传入 Base64 编码时使用:Base64 编码输入。 > - 单视频文件需在 50MB 以内。 > - 暂不支持对视频文件中的音频信息进行理解。 > > 视频自定义抽帧参数说明: > - 视频自定义抽帧参数 fps、max_video_tokens、min_frame_tokens、max_frame_tokens、min_frames 均为可选参数。 > - 仅 doubao-embedding-vision-251215 及后续版本支持这些参数。 > - 这些字段不传时,会根据模型对应的抽帧策略使用默认值。 > - 抽帧策略会综合这些参数协同生效:按 fps 抽帧后,每帧按 max_frame_tokens 控制 token 上限,总 token 数不超过 max_video_tokens,实际抽帧数不低于 min_frames。 > - 抽帧数量会直接影响视频 embedding 的 token 消耗,但并非帧数越多效果越好;若单帧 token 过少,视频 embedding 质量也会下降。 > - 建议结合 max_video_tokens 与 min_frame_tokens 进行权衡,在控制总 token 消耗的同时,保证单帧保留足够信息。 > - 当视频时长极短且 fps 过低,导致抽帧后实际帧数为 0 时,会以 min_frames 兜底,保证至少有帧送入编码器。 **url** `string` `必选` | 视频地址 `input.video_url.url` 支持传入视频链接或视频的 Base64 编码 **fps** `number` | 抽帧帧率 `input.video_url.fps` 每秒钟从视频中抽取指定数量的图像。取值越高,对于视频中画面变化理解越精细;取值越低,token 花费少,速度更快。该参数会直接影响视频 embedding 的抽帧数量与 token 消耗 **取值范围**:`[0.2, 5]` **max_frame_tokens** `integer` | 单帧最大 tokens 数 `input.video_url.max_frame_tokens` 单帧最大 tokens 数,用于控制单帧质量的上限。值越大,允许对单帧保留更多的细节;该参数会与 max_video_tokens 一起控制单帧和整体的 token 消耗。且必须大于等于 min_frame_tokens **取值范围**:`[128, 640]` **max_video_tokens** `integer` | 视频最大 tokens 数 `input.video_url.max_video_tokens` 视频最大 tokens 数,值越大保留的视频信息越多。该参数用于控制视频抽帧后最多送入模型的 token 数;超过此值时,会按帧数上限截断 **取值范围**:`[10240, 204800]` **min_frame_tokens** `integer` | 单帧最小 tokens 数 `input.video_url.min_frame_tokens` 单帧最小 tokens 数,用于控制单帧压缩的下限。值越小,允许对单帧进行更大的压缩,但单帧细节下降;若单帧 token 过少,也会影响最终向量表征质量 **取值范围**:`[16, 128]` **min_frames** `integer` | 最小抽帧数 `input.video_url.min_frames` 最小抽帧数,用于保证短视频具备足够的处理帧数。若 fps 字段抽帧总数小于 min_frames,则优先按照 min_frames 配置要求抽帧,以避免极短视频抽不到帧 **取值范围**:`[5, 16]` **model** `string` `必选` | 模型 ID 您需要调用的模型的 ID(Model ID),开通模型服务,并查询 Model ID。您也可通过 Endpoint ID 来调用模型,获得限流、计费类型、运行状态查询、监控、安全等高级能力 **dimensions** `integer` `默认值 2048` | 向量维度 用于指定输出的向量维度。取值范围:`1024` 或 `2048`。 **encoding_format** `string` `默认值 float` | 返回格式 embedding 返回的格式。取值范围:`float`、`base64`、`null`。 **instructions** `string` | 推理提示词 推理提示词,用户传入时直接使用,未传入时按输入模态生成默认值 **multi_embedding** `object` | 多向量配置 多向量(multi-vector)输出配置,控制是否输出多向量及其压缩方式。开启后,每个输入除返回稠密向量外,额外返回一组 token 级别的向量(二维数组) > **说明:注意** > > - 不允许传入空对象 {},需要至少包含 type 字段。 > - compression 与 encoding_format 正交,可独立设置: > - encoding_format 控制稠密向量返回格式(float / base64 / null)。 > - compression 控制 multi_embedding 字段的压缩格式(blosc2 / zstd / 不传)。 > - 当 type=disabled 时,compression 字段会被忽略。 **compression** `string` | 多向量压缩 `multi_embedding.compression` 多向量压缩方式(可选)。仅在 `type=enabled` 时生效: * `blosc2`:使用 `blosc2` 压缩; * `zstd`:使用 `zstd` 压缩;不传或留空则不压缩 **type** `string` `默认值 disabled` | 多向量开关 `multi_embedding.type` 多向量输出开关: * `disabled`:不输出多向量 * `enabled`:在稠密向量基础上额外返回 data.multi_embedding。 **sparse_embedding** `object` | 稀疏向量开关 稀疏向量开关配置,仅纯文本输入支持配置此字段 **type** `string` `默认值 disabled` | 稀疏向量开关 `sparse_embedding.type` 用于控制是否输出稀疏向量: * `disabled`:仅输出稠密向量 * `enabled`:同时输出稠密向量和稀疏向量。 ## 响应参数 **created** `integer` | 创建时间 本次请求创建时间的 Unix 时间戳(秒) **data** `object` | 向量化结果 向量化结果列表,与 `input` 中的元素一一对应 **embedding** `number[] / string` | 稠密向量 `data.embedding` 稠密向量结果(dense embedding)。返回 float 数组(`float[]`) **object** `string` | 对象类型 `data.object` 对象类型,固定为 `embedding` **multi_embedding** `number[] / string[]` | 多向量 `data.multi_embedding` 当请求开启多向量时返回的 token 级别向量列表,为二维 float 数组(fp16);当开启 `compression` 时返回 base64 字符串 > **说明:注意** > > 当请求带上 compression 时,data.multi_embedding 返回 base64 字符串,使用方需按以下方式解码: > 1. base64 解码得到二进制数据。 > 2. 数据使用 fp16 精度存储;按 fp16 类型解析。 > 3. 按 (token_count, embedding_dim) reshape 成二维数组。 > > 不带 compression 时,data.multi_embedding 直接返回二维 float 数组。 **sparse_embedding** `object[]` | 稀疏向量 `data.sparse_embedding` 当请求开启稀疏向量时返回的稀疏向量条目 **index** `integer` | 维度索引 `data.sparse_embedding.index` 非零维度的索引位置 **value** `number` | 维度数值 `data.sparse_embedding.value` 该维度对应的数值 **id** `string` | 请求 ID 本次请求的唯一标识 **model** `string` | 实际使用的模型 本次请求实际使用的模型名称和版本 **object** `string` | 对象类型 对象类型,固定为 `list` **usage** `object` | token 用量 本次请求的 token 用量信息 **prompt_tokens** `integer` | 输入 token 数 `usage.prompt_tokens` 输入消耗的 prompt token 总数 **prompt_tokens_details** `object` | token 用量明细 `usage.prompt_tokens_details` prompt token 用量的细分明细 **image_tokens** `integer` | 图片 token 数 `usage.prompt_tokens_details.image_tokens` 图片输入消耗的 prompt token 数量 **text_tokens** `integer` | 文本 token 数 `usage.prompt_tokens_details.text_tokens` 文本输入消耗的 prompt token 数量 **total_tokens** `integer` | 总 token 数 `usage.total_tokens` 本次请求消耗的 token 总数 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl https://ark.cn-beijing.volces.com/api/v3/embeddings/multimodal \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d $'{ "model": "doubao-embedding-vision-251215", "encoding_format": "float", "input": [ { "type": "video_url", "video_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/advanced-usage/ark_vlm_video_input.mp4" } }, { "type": "image_url", "image_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/images/domain-models/tower.png" } }, { "type": "text", "text": "视频和图片里有什么" } ] }' ``` #### Response ``` { "created": 1743575029, "data": { "embedding": [ -0.123046875, -0.35546875, -0.318359375, ..., -0.255859375 ], "object": "embedding" }, "id": "021743575029461acbe49a31755bec77b2f09448eb15fa9a88e47", "model": "doubao-embedding-vision-251215", "object": "list", "usage": { "prompt_tokens": 13987, "prompt_tokens_details": { "image_tokens": 13800, "text_tokens": 187 }, "total_tokens": 13987 } } ``` ### Python #### Request ```python import os from arkruntime import Ark client = Ark( api_key=os.environ.get("ARK_API_KEY"), base_url="https://ark.cn-beijing.volces.com/api/v3", ) resp = client.multimodal_embeddings.create( multi_embedding={"type": "disabled"}, model="doubao-embedding-vision-251215", encoding_format="float", input=[ { "type": "video_url", "video_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/advanced-usage/ark_vlm_video_input.mp4" } }, { "type": "image_url", "image_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/images/domain-models/tower.png" } }, { "type": "text", "text": "视频和图片里有什么" } ] ) print(resp) ``` #### Response ``` { "created": 1743575029, "data": { "embedding": [ -0.123046875, -0.35546875, -0.318359375, ..., -0.255859375 ], "object": "embedding" }, "id": "021743575029461acbe49a31755bec77b2f09448eb15fa9a88e47", "model": "doubao-embedding-vision-251215", "object": "list", "usage": { "prompt_tokens": 13987, "prompt_tokens_details": { "image_tokens": 13800, "text_tokens": 187 }, "total_tokens": 13987 } } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" model "github.com/volcengine/ark-runtime-go/arkruntime/model/multimodalembedding" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() encodingFormat := model.EncodingFormat("float") req := &model.MultiModalEmbeddingRequest{ Input: []model.EmbeddingInput{ { Type: model.EmbeddingInputTypeVideoURL, VideoURL: model.NewOptVideoURL(model.VideoURL{ URL: "https://arkdocs.tos-cn-beijing.volces.com/videos/advanced-usage/ark_vlm_video_input.mp4", }), }, model.EmbeddingInput{ Type: model.EmbeddingInputTypeImageURL, ImageURL: model.NewOptImageURL(model.ImageURL{ URL: "https://arkdocs.tos-cn-beijing.volces.com/images/domain-models/tower.png", }), }, model.EmbeddingInput{ Type: model.EmbeddingInputTypeText, Text: model.NewOptString("视频和图片里有什么"), }, }, Model: "doubao-embedding-vision-251215", EncodingFormat: model.NewOptEncodingFormat(encodingFormat), MultiEmbedding: model.NewOptMultiEmbeddingConfig(model.MultiEmbeddingConfig{Type: model.MultiEmbeddingModeDisabled}),} resp, err := client.CreateMultiModalEmbeddings(ctx, req) if err != nil { fmt.Printf("multimodal embeddings error: %v\n", err) return } fmt.Printf("%+v", resp) } ``` #### Response ``` { "created": 1743575029, "data": { "embedding": [ -0.123046875, -0.35546875, -0.318359375, ..., -0.255859375 ], "object": "embedding" }, "id": "021743575029461acbe49a31755bec77b2f09448eb15fa9a88e47", "model": "doubao-embedding-vision-251215", "object": "list", "usage": { "prompt_tokens": 13987, "prompt_tokens_details": { "image_tokens": 13800, "text_tokens": 187 }, "total_tokens": 13987 } } ``` ### Java #### Request ```java package com.example; import com.fasterxml.jackson.core.JsonProcessingException; import com.volcengine.ark.runtime.models.multimodal_embedding.*; import com.volcengine.ark.runtime.service.ArkService; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; /* # pom.xml com.volcengine ark-runtime // 替换正式版本号 0.9.0 */ public class Sample { static String apiKey = System.getenv("ARK_API_KEY"); static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); static Dispatcher dispatcher = new Dispatcher(); static ArkService service = ArkService.builder() .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); public static void main(String[] args) throws JsonProcessingException { List inputForReqList = new ArrayList<>(); VideoURL videoUrlForElementForInputForReqList0 = VideoURL.builder() .url("https://arkdocs.tos-cn-beijing.volces.com/videos/advanced-usage/ark_vlm_video_input.mp4") .build(); EmbeddingInput elementForInputForReqList0 = new EmbeddingInput(); elementForInputForReqList0.setType(EmbeddingInputType.VIDEO_URL); elementForInputForReqList0.setVideoUrl(videoUrlForElementForInputForReqList0); ImageURL imageUrlForElementForInputForReqList1 = ImageURL.builder().build(); imageUrlForElementForInputForReqList1.setUrl( "https://arkdocs.tos-cn-beijing.volces.com/images/domain-models/tower.png"); EmbeddingInput elementForInputForReqList1 = new EmbeddingInput(); elementForInputForReqList1.setType(EmbeddingInputType.IMAGE_URL); elementForInputForReqList1.setImageUrl(imageUrlForElementForInputForReqList1); EmbeddingInput elementForInputForReqList2 = new EmbeddingInput(); elementForInputForReqList2.setType(EmbeddingInputType.TEXT); elementForInputForReqList2.setText("视频和图片里有什么"); inputForReqList.add(elementForInputForReqList0); inputForReqList.add(elementForInputForReqList1); inputForReqList.add(elementForInputForReqList2); MultiModalEmbeddingRequest req = MultiModalEmbeddingRequest.builder() .model("doubao-embedding-vision-251215") .input(inputForReqList) .encodingFormat(EncodingFormat.FLOAT) .build(); service.createMultiModalEmbeddings(req).toString(); System.err.println(service.createMultiModalEmbeddings(req)); // shutdown service after all requests is finished service.shutdownExecutor(); } } ``` #### Response ``` { "created": 1743575029, "data": { "embedding": [ -0.123046875, -0.35546875, -0.318359375, ..., -0.255859375 ], "object": "embedding" }, "id": "021743575029461acbe49a31755bec77b2f09448eb15fa9a88e47", "model": "doubao-embedding-vision-251215", "object": "list", "usage": { "prompt_tokens": 13987, "prompt_tokens_details": { "image_tokens": 13800, "text_tokens": 187 }, "total_tokens": 13987 } } ``` ## 开启多向量输出 ### cURL #### Request ```bash curl https://ark.cn-beijing.volces.com/api/v3/embeddings/multimodal \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d $'{ "model": "doubao-embedding-vision-251215", "instructions": "Target_modality: text.\nInstruction: Compress the text into one word.\nQuery:", "encoding_format": "float", "input": [ { "type": "text", "text": "天很蓝,海很深" } ], "multi_embedding": { "type": "enabled", "compression": "blosc2" } }' ``` #### Response ``` { "created": 1752133360, "data": { "embedding": [ -0.046875, -0.048828125, 0.02001953125, ..., 0.003143310546875 ], "multi_embedding": "QklPUzIAAAAAAABkAAABAAEAAAB42mNgYGBgYAZiJiBmAWIA...", "object": "embedding" }, "id": "021752133360d2f2d0e4f4c9db4f6b5e7f9c31f0a9a87b1c", "model": "doubao-embedding-vision-251215", "object": "list", "usage": { "prompt_tokens": 25, "prompt_tokens_details": { "text_tokens": 25 }, "total_tokens": 25 } } ``` ### Python #### Request ```python import os from arkruntime import Ark client = Ark( api_key=os.environ.get("ARK_API_KEY"), base_url="https://ark.cn-beijing.volces.com/api/v3", ) resp = client.multimodal_embeddings.create( multi_embedding={ "type": "enabled", "compression": "blosc2" }, model="doubao-embedding-vision-251215", encoding_format="float", instructions="Target_modality: text.\nInstruction: Compress the text into one word.\nQuery:", input=[ { "type": "text", "text": "天很蓝,海很深" } ] ) multi_embedding = resp.data.multi_embedding multi_embeddings = ( [multi_embedding] if isinstance(multi_embedding, str) else (multi_embedding or []) ) print("multi_embedding_count:", len(multi_embeddings)) print("payload_lengths:", [len(value) for value in multi_embeddings]) print("usage:", resp.usage) ``` #### Response ``` { "created": 1752133360, "data": { "embedding": [ -0.046875, -0.048828125, 0.02001953125, ..., 0.003143310546875 ], "multi_embedding": "QklPUzIAAAAAAABkAAABAAEAAAB42mNgYGBgYAZiJiBmAWIA...", "object": "embedding" }, "id": "021752133360d2f2d0e4f4c9db4f6b5e7f9c31f0a9a87b1c", "model": "doubao-embedding-vision-251215", "object": "list", "usage": { "prompt_tokens": 25, "prompt_tokens_details": { "text_tokens": 25 }, "total_tokens": 25 } } ``` ## 自定义视频抽帧 ### cURL #### Request ```bash curl https://ark.cn-beijing.volces.com/api/v3/embeddings/multimodal \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d $'{ "model": "doubao-embedding-vision-251215", "encoding_format": "float", "input": [ { "type": "video_url", "video_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/advanced-usage/ark_vlm_video_input.mp4", "fps": 1, "max_video_tokens": 120000, "min_frame_tokens": 32, "max_frame_tokens": 640, "min_frames": 10 } }, { "type": "image_url", "image_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/images/domain-models/tower.png" } }, { "type": "text", "text": "视频和图片里有什么" } ] }' ``` #### Response ``` { "created": 1748234678, "data": { "embedding": [ -0.10546875, -0.251953125, -0.23828125, ..., -0.1796875 ], "object": "embedding" }, "id": "021748234678a18f6e14b7db42aa8d4bb8d7a0f652d91a3c6", "model": "doubao-embedding-vision-251215", "object": "list", "usage": { "prompt_tokens": 10802, "prompt_tokens_details": { "image_tokens": 10647, "text_tokens": 155 }, "total_tokens": 10802 } } ``` ### Python #### Request ```python import os from arkruntime import Ark client = Ark( api_key=os.environ.get("ARK_API_KEY"), base_url="https://ark.cn-beijing.volces.com/api/v3", ) resp = client.multimodal_embeddings.create( multi_embedding={"type": "disabled"}, model="doubao-embedding-vision-251215", encoding_format="float", input=[ { "type": "video_url", "video_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/videos/advanced-usage/ark_vlm_video_input.mp4", "fps": 1, "max_video_tokens": 120000, "min_frame_tokens": 32, "max_frame_tokens": 640, "min_frames": 10 } }, { "type": "image_url", "image_url": { "url": "https://arkdocs.tos-cn-beijing.volces.com/images/domain-models/tower.png" } }, { "type": "text", "text": "视频和图片里有什么" } ] ) print(resp) ``` #### Response ``` { "created": 1748234678, "data": { "embedding": [ -0.10546875, -0.251953125, -0.23828125, ..., -0.1796875 ], "object": "embedding" }, "id": "021748234678a18f6e14b7db42aa8d4bb8d7a0f652d91a3c6", "model": "doubao-embedding-vision-251215", "object": "list", "usage": { "prompt_tokens": 10802, "prompt_tokens_details": { "image_tokens": 10647, "text_tokens": 155 }, "total_tokens": 10802 } } ``` ## 开启稀疏向量输出 ### cURL #### Request ```bash curl https://ark.cn-beijing.volces.com/api/v3/embeddings/multimodal \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d $'{ "model": "doubao-embedding-vision-251215", "instructions": "Target_modality: text.\nInstruction: Compress the text into one word.\nQuery:", "encoding_format": "float", "input": [ { "type": "text", "text": "天很蓝" } ], "dimensions": 1024, "sparse_embedding": { "type": "enabled" } }' ``` #### Response ``` { "created": 1752133360, "data": { "embedding": [ -0.0341796875, -0.041015625, 0.017822265625, ..., 0.002777099609375 ], "sparse_embedding": [ { "index": 1296, "value": 0.2158203125 }, { "index": 2684, "value": 0.173828125 } ], "object": "embedding" }, "id": "021752133360a7cf5e1a5bb43c4a90672eb8c74b81d8f2a", "model": "doubao-embedding-vision-251215", "object": "list", "usage": { "prompt_tokens": 17, "prompt_tokens_details": { "text_tokens": 17 }, "total_tokens": 17 } } ``` ### Python #### Request ```python import os from arkruntime import Ark client = Ark( api_key=os.environ.get("ARK_API_KEY"), base_url="https://ark.cn-beijing.volces.com/api/v3", ) resp = client.multimodal_embeddings.create( multi_embedding={"type": "disabled"}, model="doubao-embedding-vision-251215", encoding_format="float", input=[ { "type": "text", "text": "天很蓝" } ], dimensions=1024, sparse_embedding={ "type": "enabled" }, extra_body={ "instructions": "Target_modality: text.\nInstruction: Compress the text into one word.\nQuery:" } ) print(resp) ``` #### Response ``` { "created": 1752133360, "data": { "embedding": [ -0.0341796875, -0.041015625, 0.017822265625, ..., 0.002777099609375 ], "sparse_embedding": [ { "index": 1296, "value": 0.2158203125 }, { "index": 2684, "value": 0.173828125 } ], "object": "embedding" }, "id": "021752133360a7cf5e1a5bb43c4a90672eb8c74b81d8f2a", "model": "doubao-embedding-vision-251215", "object": "list", "usage": { "prompt_tokens": 17, "prompt_tokens_details": { "text_tokens": 17 }, "total_tokens": 17 } } ``` --- # 创建智能体 Source: https://ark.volcengine.com/region:cn-beijing/docs/create-agent-api `POST https://ark.cn-beijing.volces.com/api/v3/agents` 创建一个可复用、可版本化的托管智能体。创建成功后返回智能体 ID,可用于创建会话。单个账号最多可创建 1000 个 Agent。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Body 参数 **model** `object` `必选` | 模型配置 智能体使用的模型配置。 * 各运行参数的支持范围和默认行为以所选模型为准。 * 传入模型不支持的取值时,服务端返回 400 `InvalidParameter`。 * 创建 Seedance Managed Agent 时,需满足以下模型要求: * 必须填写 `model.id`。可用模型以控制台的 Seedance Managed Agent 创建页面为准;本文不固定具体模型 ID。 * 所选模型必须支持 Managed Agent 推理和 `reasoning_effort: high`。`reasoning_effort` 省略时,服务端自动补齐为 `high`;填写其他值时,服务端返回 400 `InvalidParameter`。 * 详情请参见 [模型支持的参数列表](/docs/model-parameter-support)。 > **注意** > > 所填模型 ID 或推理接入点 ID 对应的模型请从 Managed Agents 控制台提供的模型中选择,或参见 [模型支持的参数列表](/docs/model-parameter-support)。使用推理接入点 ID 时,该接入点必须属于当前项目;否则,服务端返回 400 `InvalidParameter`。 **id** `string` `必选` | 模型或接入点 ID `model.id` 智能体调用的模型 ID 或推理接入点 ID。例如模型 ID `doubao-seed-2-1-pro-260628`,或推理接入点 ID `ep-20260907123456-abcd1`。 **reasoning_effort** `string` | 推理投入档位 `model.reasoning_effort` 模型在深度思考时使用的推理投入档位。可选值:`none`、`minimal`、`low`、`medium`、`high`、`xhigh`、`max`。 **service_tier** `string` | 推理服务档位 `model.service_tier` 模型调用使用的推理服务档位。可选值:`auto`、`default`、`fast`。 **speed** `string` | 推理速度档位 `model.speed` 模型使用的推理速度档位。 **thinking** `string` | 深度思考 `model.thinking` 模型的深度思考模式。`auto` 表示由模型决定是否启用深度思考。取值:`enabled` / `disabled` / `auto`。 **name** `string` `必选` | 智能体名称 智能体名称,用于识别和管理创建的智能体,长度为 1~256 个字符。 **base_agent** `string` `默认值 ark_agent_preview` | 基础 Agent 类型 基础 Agent 类型。 * `ark_agent_preview`:创建通用 Agent。 * `ultra_vision_agent_preview`:创建 Seedance Managed Agent。 该字段在创建后不能修改。 已创建的通用 Agent 不能直接变更为 Seedance Managed Agent,需要重新创建 Seedance Managed Agent。 > **注意** > > 设置为 `ultra_vision_agent_preview` 前,需要开通 Seedance Managed Agent 使用权限。 **description** `string` | 智能体描述 智能体描述,说明智能体的用途和能力,最大 2048 字符。 **display_name** `string` | 展示名称 智能体展示名称,最多 256 个字符。省略或传空字符串时,响应中不返回该字段。 **mcp_servers** `object[]` | MCP 服务配置 配置给智能体使用的 MCP 服务列表,最多 20 项。 **type** `string` `必选` | 接入方式 `mcp_servers.type` MCP 服务的接入方式。 取值固定为 `url`。 **url** `string` `必选` | 服务地址 `mcp_servers.url` MCP 服务的访问地址。同一智能体内不能配置重复的 MCP 服务地址。 **name** `string` | MCP 服务名称 `mcp_servers.name` MCP 服务名称,最长 255 个字符,用于在当前 Agent 中识别该服务;配置 MCP 工具集时,`tools[].mcp_server_name` 必须填写此名称。 * 省略名称或名称不符合命名规则时,服务端根据 `url` 生成名称。 * 服务端会将符合命名规则的名称转换为小写。 * 多个名称冲突时,服务端为后续名称添加数字后缀。 **metadata** `object` | 自定义元数据 用户自定义元数据,键值对形式,最多支持 16 个键;key 长度不超过 64 字符,value 长度不超过 512 字符。 **multiagent** `object` | 多智能体配置 多智能体协作配置,最多支持 20 个子智能体。 **agents** `object[]` `必选` | 子智能体列表 `multiagent.agents` 参与协作的子智能体列表。 **type** `string` `必选` | 子智能体来源 `multiagent.agents.type` 子智能体的来源。`agent` 表示引用已存在的智能体;`self` 表示复用当前智能体配置作为子智能体参与协作,但不会复用当前智能体的子智能体。 **id** `string` | 智能体 ID `multiagent.agents.id` 被引用智能体的 ID。`type` 为 `agent` 时,用于指定参与协作的已有智能体,必须填写;`type` 为 `self` 时,当前智能体使用自身配置参与协作,不填写该字段。 **version** `integer` | 智能体版本 `multiagent.agents.version` 被引用智能体的版本号。省略时使用最新版本。 **type** `string` `必选` | 协作模式 `multiagent.type` 多智能体协作模式,取值固定为 `coordinator`。当前智能体负责分配任务并汇总子智能体的结果。 **skills** `object[]` | 技能配置 绑定到智能体的技能列表,最多支持 50 个技能。未指定技能版本时,使用该技能的最新版本。 **skill_id** `string` `必选` | 技能 ID `skills.skill_id` 要绑定到智能体的技能 ID。 **type** `string` `必选` | 技能来源 `skills.type` 技能来源。 - `ark`:方舟预置技能。 - `skill_hub`:来自 SkillHub 的公共技能。 - `custom`:当前账号通过 Skills API 创建的自定义技能。 **version** `string` | 技能版本 `skills.version` 要绑定的技能版本号。省略时使用该技能的最新版本。 **system** `string` | 系统提示词 系统提示词,定义智能体的角色和行为规则,最大 100000 字符。 创建 Seedance Managed Agent 时,该字段用于定义视觉创作任务中的角色、工作方式和输出要求。 **tags** `object[]` | 标签列表 用户自定义标签列表,最多填写 50 项。同一请求内,标签键不能重复。 **key** `string` `必选` | 标签键 `tags.key` 标签键,用于分类和检索,长度为 1~128 个字符,且不能以 `volc:` 或 `maas:` 开头。 **value** `string` | 标签值 `tags.value` 标签对应的值,最长 256 个字符。 **tools** `object[]` | 工具配置 配置给智能体使用的工具列表,最多支持 128 个工具。 * 内置工具集和 MCP 工具可通过 `configs` 和 `default_config` 设置启用状态及权限策略。 * MCP 工具通过 `mcp_server_name` 关联 `mcp_servers[].name`。 * 自定义工具需填写名称、功能描述和输入参数定义。 * 创建 Seedance Managed Agent 时,必须同时配置基础工具集和多模态工具集。基础工具集使用 `agent_toolset_20260916`;多模态工具集使用 `agent_toolset_multimodal_20260825`。 * 多模态工具集中必须启用 `image_generate`、`visual_search`、`general_search` 和 `compose_video`;`video_generate` 可按需启用。 * 启用 `general_search` 时,必须关闭基础工具集中的 `web_search`。 **type** `string` `必选` | 工具类型 `tools.type` 工具类型。 - `agent_toolset_20260916`:使用方舟内置的 `bash`、`edit`、`read`、`write`、`glob`、`grep`、`web_fetch` 和 `web_search` 工具。 - `agent_toolset_multimodal_20260825`:使用 `image_generate`、`video_generate`、`visual_search`、`general_search`、`compose_video` 和 `todo_write` 工具。 - `mcp_toolset`:使用指定 MCP 服务提供的工具。 - `custom`:使用由客户端执行的自定义工具。 可选值:`agent_toolset_20260401`、`agent_toolset_20260701`、`agent_toolset_20260916`、`agent_toolset_multimodal_20260825`、`mcp_toolset`、`custom`。 **configs** `object[]` | 工具配置列表 `tools.configs` 按工具名称设置工具的启用状态和权限策略。 **name** `string` `必选` | 工具名称 `tools.configs.name` 工具配置对应的工具名称。 **enabled** `boolean` | 是否启用 `tools.configs.enabled` 是否启用此工具。 **models** `object[]` | 工具模型列表 `tools.configs.models` 图片生成或视频生成工具使用的模型 ID 或推理接入点 ID 列表。省略时,服务端为已启用的生成工具绑定平台默认模型,并在响应中返回实际绑定结果。 > **说明** > > 最多填写 10 项,且同一工具配置内的 ID 不能重复。配置多项时,必须且只能将一项的 `default` 设置为 `true`。 **id** `string` `必选` | 模型或接入点 ID `tools.configs.models.id` 图片生成或视频生成工具调用的模型 ID 或推理接入点 ID。 > **注意** > > 所填模型 ID 或推理接入点 ID 对应的模型必须支持当前图片生成或视频生成工具。使用推理接入点 ID 时,该接入点必须属于当前项目;否则,服务端返回 400 `InvalidParameter`。 **default** `boolean` `默认值 false` | 是否为默认模型 `tools.configs.models.default` 是否作为该工具的默认模型。配置多个模型或接入点时,必须且只能将一项设置为 `true`。 **permission_policy** `object` | 权限策略 `tools.configs.permission_policy` 该工具使用的权限策略。 **type** `string` `必选` | 策略类型 `tools.configs.permission_policy.type` 工具调用许可策略。 * `always_allow`:表示总是允许调用。 * `always_ask`:表示每次使用前需要确认。 **default_config** `object` | 默认工具配置 `tools.default_config` 未在 `configs` 中单独配置的工具所使用的默认启用状态和权限策略。 **enabled** `boolean` | 是否启用 `tools.default_config.enabled` 是否默认启用未在 `configs` 中单独配置的工具。 * `true`:表示默认启用。 * `false`:表示默认禁用。 **permission_policy** `object` | 权限策略 `tools.default_config.permission_policy` 未在 `configs` 中单独配置的工具所使用的默认权限策略。 **type** `string` `必选` | 策略类型 `tools.default_config.permission_policy.type` 工具调用许可策略。 * `always_allow`:表示总是允许调用。 * `always_ask`:表示每次使用前需要确认。 **description** `string` | 自定义工具描述 `tools.description` 说明自定义工具的功能和适用场景,供模型判断何时调用该工具。 > **说明** > > `type` 为 `custom` 时必填,长度为 1~10000 个字符。 **input_schema** `object` | 输入参数定义 `tools.input_schema` 定义自定义工具的输入参数及其约束。 > **注意** > > * 创建 Agent 时,服务端会确认 `input_schema.type` 为 `object`,并确认 `input_schema.properties` 是 JSON 对象,但不会逐项检查其中的属性定义。 > * 运行 Session 时,服务端会检查完整的 `input_schema` 是否为合法 JSON Schema。创建 Agent 成功不代表该 Schema 一定可以正常运行。 > * 模型生成的工具调用参数只会校验是否为合法 JSON。执行自定义工具前,你的应用应按 `input_schema` 再次校验参数。 **properties** `object` | 参数属性定义 `tools.input_schema.properties` 自定义工具输入参数的 JSON Schema 属性映射。键为参数名,值为对应参数的 JSON Schema 子对象。请确保每个属性定义均符合 JSON Schema。 常用关键字包括: * `type`:参数类型,如 `string`、`number`、`integer`、`boolean`、`array` 或 `object`。 * `description`:参数的用途说明,供模型理解并生成参数。 * `enum`:参数允许使用的值。 * `items`:数组元素的 JSON Schema。 * `properties`、`required`:对象的子字段及必填字段。 * `minimum`、`maximum`:数值参数的取值范围。 示例: ```JSON { "city": { "type": "string", "description": "城市名称" }, "hours": { "type": "integer", "description": "预报时长,单位为小时", "minimum": 1, "maximum": 72 } } ``` **required** `string[]` | 必填参数名称列表 `tools.input_schema.required` 自定义工具输入中必填的参数名称列表。列表中的每个名称必须与 `properties` 中定义的参数名称一致。 **type** `string` `默认值 object` | Schema 类型 `tools.input_schema.type` 指定 JSON Schema 的顶层类型,仅支持 `object`。 **mcp_server_name** `string` | MCP 服务名称 `tools.mcp_server_name` MCP 工具所属的 MCP 服务名称。 **name** `string` | 自定义工具名称 `tools.name` 自定义工具的名称。 > **说明** > > `type` 为 `custom` 时必填。长度为 1~128 个字符,只能包含字母、数字、下划线和连字符,且同一 Agent 内的自定义工具名称不能重复。 ## 响应参数 **created_at** `string` | 创建时间 智能体创建时间,采用 ISO 8601 格式。 **id** `string` | 智能体 ID 智能体唯一标识,以 `agent-` 开头。查询、更新或删除智能体,以及创建会话时,需要使用该值。 **name** `string` | 智能体名称 用于识别和管理智能体的名称。 **type** `string` | 对象类型 返回对象的类型,表示该对象为智能体。 取值固定为 `agent`。 **updated_at** `string` | 更新时间 智能体最后更新时间,采用 ISO 8601 格式。 **version** `integer` | 版本号 本次创建的智能体版本号。 **base_agent** `string` | 基础 Agent 类型 智能体使用的基础 Agent 类型。 Seedance Managed Agent 返回 `ultra_vision_agent_preview`。 可选值:`ark_agent_preview`、`ultra_vision_agent_preview`。 **description** `string` | 智能体描述 智能体的用途、能力范围和适用场景。 **display_name** `string` | 展示名称 智能体的展示名称。 **mcp_servers** `object[]` | MCP 服务列表 智能体已配置的 MCP 服务列表。 **name** `string` | MCP 服务名称 `mcp_servers.name` 用于标识 MCP 服务的名称。 **type** `string` | 接入方式 `mcp_servers.type` MCP 服务的接入方式。 取值固定为 `url`。 **url** `string` | 服务地址 `mcp_servers.url` MCP 服务的访问地址。 **metadata** `object` | 自定义元数据 智能体的自定义键值对元数据。 **model** `object` | 模型配置 智能体使用的模型配置。 **id** `string` | 模型或接入点 ID `model.id` 智能体调用的模型 ID 或推理接入点 ID。例如模型 ID `doubao-seed-2-1-pro-260628`,或推理接入点 ID `ep-20260907123456-abcd1`。 **reasoning_effort** `string` | 推理投入档位 `model.reasoning_effort` 模型在深度思考时使用的推理投入档位。可选值:`none`、`minimal`、`low`、`medium`、`high`、`xhigh`、`max`。 **service_tier** `string` | 推理服务档位 `model.service_tier` 模型调用使用的推理服务档位。可选值:`auto`、`default`、`fast`。 **speed** `string` | 推理速度档位 `model.speed` 模型使用的推理速度档位。 **thinking** `string` | 深度思考 `model.thinking` 模型的深度思考模式。`auto` 表示由模型决定是否启用深度思考。取值:`enabled` / `disabled` / `auto`。 **multiagent** `object` | 多智能体配置 智能体与子智能体之间的协作配置。 **agents** `object[]` | 子智能体列表 `multiagent.agents` 参与协作的子智能体列表。 **type** `string` | 子智能体来源 `multiagent.agents.type` 子智能体的来源。`agent` 表示引用已存在的智能体;`self` 表示复用当前智能体配置作为子智能体参与协作。 **id** `string` | 智能体 ID `multiagent.agents.id` 被引用智能体的 ID。 **version** `integer` | 智能体版本 `multiagent.agents.version` 被引用智能体的版本号。 **type** `string` | 协作模式 `multiagent.type` 多智能体协作模式,取值固定为 `coordinator`。当前智能体负责分配任务并汇总子智能体的结果。 **skills** `object[]` | 技能列表 智能体已绑定的技能列表。 **type** `string` | 技能来源 `skills.type` 技能来源。 - `ark`:方舟预置技能。 - `skill_hub`:来自 SkillHub 的公共技能。 - `custom`:当前账号通过 Skills API 创建的自定义技能。 **skill_id** `string` | 技能 ID `skills.skill_id` 绑定到智能体的技能 ID。 **version** `string` | 技能版本 `skills.version` 绑定到智能体的技能版本号。 **system** `string` | 系统提示词 您为智能体配置并保存的系统提示词,用于定义智能体的角色和行为要求。 **tags** `object[]` | 标签列表 智能体的标签列表。 **key** `string` | 标签键 `tags.key` 标签键,用于分类和检索。 **value** `string` | 标签值 `tags.value` 标签对应的值。 **tools** `object[]` | 工具列表 您为智能体配置的工具列表。 **type** `string` | 工具类型 `tools.type` 工具类型。各取值含义如下: - `agent_toolset_20260916`:使用方舟内置的 `bash`、`edit`、`read`、`write`、`glob`、`grep`、`web_fetch` 和 `web_search` 工具。 - `agent_toolset_multimodal_20260825`:使用 `image_generate`、`video_generate`、`visual_search`、`general_search`、`compose_video` 和 `todo_write` 工具。 - `mcp_toolset`:使用指定 MCP 服务提供的工具。 - `custom`:使用由客户端执行的自定义工具。 可选值:`agent_toolset_20260401`、`agent_toolset_20260701`、`agent_toolset_20260916`、`agent_toolset_multimodal_20260825`、`mcp_toolset`、`custom`。 **configs** `object[]` | 工具配置列表 `tools.configs` 按工具名称设置工具的启用状态和权限策略。 **name** `string` | 工具名称 `tools.configs.name` 工具配置对应的工具名称。 **enabled** `boolean` | 是否启用 `tools.configs.enabled` 是否启用此工具。 **models** `object[]` | 工具模型列表 `tools.configs.models` 服务端返回的图片生成或视频生成工具实际绑定模型列表。 **id** `string` | 模型或接入点 ID `tools.configs.models.id` 该工具绑定的模型 ID 或推理接入点 ID。 **default** `boolean` | 是否为默认模型 `tools.configs.models.default` 是否为该工具的默认模型。 **name** `string` | 模型名称 `tools.configs.models.name` 服务端根据模型 ID 或推理接入点 ID 返回的模型名称。 **version** `string` | 模型版本 `tools.configs.models.version` 服务端根据模型 ID 或推理接入点 ID 返回的模型版本。 **permission_policy** `object` | 权限策略 `tools.configs.permission_policy` 该工具使用的权限策略。 **type** `string` | 策略类型 `tools.configs.permission_policy.type` 工具调用许可策略。 * `always_allow`:表示总是允许调用。 * `always_ask`:表示每次使用前需要确认。 **default_config** `object` | 默认工具配置 `tools.default_config` 未在 `configs` 中单独配置的工具所使用的默认启用状态和权限策略。 **enabled** `boolean` | 是否启用 `tools.default_config.enabled` 是否默认启用未在 `configs` 中单独配置的工具。 * `true`:表示默认启用。 * `false`:表示默认禁用。 **permission_policy** `object` | 权限策略 `tools.default_config.permission_policy` 未在 `configs` 中单独配置的工具所使用的默认权限策略。 **type** `string` | 策略类型 `tools.default_config.permission_policy.type` 工具调用许可策略。 * `always_allow`:表示总是允许调用。 * `always_ask`:表示每次使用前需要确认。 **description** `string` | 自定义工具描述 `tools.description` 说明自定义工具的功能和适用场景,供模型判断何时调用该工具。 **input_schema** `object` | 输入参数定义 `tools.input_schema` 返回 Agent 中保存的自定义工具输入参数 JSON Schema。 **properties** `object` | 参数属性定义 `tools.input_schema.properties` 返回 Agent 中保存的 JSON Schema 属性映射。每个键为参数名,每个值为对应参数的 JSON Schema 子对象。 **required** `string[]` | 必填参数名称列表 `tools.input_schema.required` 返回调用自定义工具时必须提供的参数名称列表。 **type** `string` | Schema 类型 `tools.input_schema.type` 返回 JSON Schema 的顶层类型,固定为 `object`。 **mcp_server_name** `string` | MCP 服务名称 `tools.mcp_server_name` MCP 工具所属的 MCP 服务名称。 **name** `string` | 自定义工具名称 `tools.name` 自定义工具的名称。 ## 代码示例 ## 创建智能体 ### cURL #### Request ```Bash curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/agents" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d @- <<'EOF' { "name": "", "model": { "id": "doubao-seed-2-1-pro-260915" }, "system": "你是一个乐于助人的智能助手。" } EOF ``` #### Response ``` { "id": "agent-20260715083012-a3f7b", "type": "agent", "name": "", "model": { "id": "doubao-seed-2-1-pro-260915" }, "system": "你是一个乐于助人的智能助手。", "version": 1, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T08:00:00Z" } ``` ### Python #### Request ```python import os from arkruntime import Ark client = Ark( api_key=os.environ["ARK_API_KEY"], base_url="https://ark.cn-beijing.volces.com/api/v3", ) agent = client.agents.create( name="", model={"id": "doubao-seed-2-1-pro-260915"}, system="你是一个乐于助人的智能助手。", ) print(agent) ``` #### Response ``` { "id": "agent-20260715083012-a3f7b", "type": "agent", "name": "", "model": { "id": "doubao-seed-2-1-pro-260915" }, "system": "你是一个乐于助人的智能助手。", "version": 1, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T08:00:00Z" } ``` ### Java #### Request ```java // pom.xml 依赖: // // com.volcengine // ark-runtime // 0.9.0 // import com.volcengine.ark.runtime.models.agent.Agent; import com.volcengine.ark.runtime.models.agent.CreateAgentRequest; import com.volcengine.ark.runtime.models.agent.ModelConfig; import com.volcengine.ark.runtime.service.ArkService; public class Main { public static void main(String[] args) throws Exception { ArkService service = ArkService.builder() .apiKey(System.getenv("ARK_API_KEY")) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); Agent agent = service.createAgent( CreateAgentRequest.builder() .name("") .model(ModelConfig.builder().id("doubao-seed-2-1-pro-260915").build()) .system("你是一个乐于助人的智能助手。") .build()); System.out.println(agent); service.shutdownExecutor(); } } ``` #### Response ``` { "id": "agent-20260715083012-a3f7b", "type": "agent", "name": "", "model": { "id": "doubao-seed-2-1-pro-260915" }, "system": "你是一个乐于助人的智能助手。", "version": 1, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T08:00:00Z" } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" agentmodel "github.com/volcengine/ark-runtime-go/arkruntime/model/agent" ) func main() { ctx := context.Background() client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) agent, err := client.CreateAgent(ctx, &agentmodel.CreateAgentRequest{ Name: "", Model: agentmodel.ModelConfig{ID: "doubao-seed-2-1-pro-260915"}, System: agentmodel.NewOptString("你是一个乐于助人的智能助手。"), }) if err != nil { panic(err) } fmt.Println(agent) } ``` #### Response ``` { "id": "agent-20260715083012-a3f7b", "type": "agent", "name": "", "model": { "id": "doubao-seed-2-1-pro-260915" }, "system": "你是一个乐于助人的智能助手。", "version": 1, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T08:00:00Z" } ``` --- # 查询智能体列表 Source: https://ark.volcengine.com/region:cn-beijing/docs/list-agents-api `GET https://ark.cn-beijing.volces.com/api/v3/agents` 分页查询当前账号下的智能体。支持按创建时间、名称和展示名称筛选,结果按创建时间从新到旧排列。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Query 参数 > 在 URL Query String 中传入。 **created_at_gte** `string` | 创建时间下界 按创建时间筛选,返回创建时间大于等于该值的智能体。使用 ISO 8601 格式。 **created_at_lte** `string` | 创建时间上界 按创建时间筛选,返回创建时间小于等于该值的智能体。使用 ISO 8601 格式。 **display_name** `string` | 展示名称 按智能体展示名称模糊匹配。与其他筛选参数同时传入时,返回同时满足所有条件的智能体。 **limit** `integer` `默认值 20` | 每页数量 每页返回的数量。 **取值范围**:`[1, 100]` **name** `string` | 智能体名称 按智能体名称模糊匹配。与其他筛选参数同时传入时,返回同时满足所有条件的智能体。 **page** `string` | 下一页标识 下一页标识。 * 首次请求时省略。 * 后续请求将上一页响应中的 `next_page` 原样传入。 * 该值不是页码,请勿解析或修改。 * 连续翻页时,应保持其他筛选参数不变。 ## 响应参数 **data** `object[]` | 智能体列表 当前页返回的智能体列表;无命中时返回空数组`[]` **created_at** `string` | 创建时间 `data.created_at` 智能体创建时间,采用 RFC 3339 格式。 **id** `string` | 智能体 ID `data.id` 智能体唯一标识,以 `agent-` 开头。创建会话或管理智能体时,需要使用该值。 **name** `string` | 智能体名称 `data.name` 用于识别和管理智能体的名称。 **type** `string` | 对象类型 `data.type` 返回对象的类型,表示该对象为智能体。 取值固定为 `agent`。 **updated_at** `string` | 更新时间 `data.updated_at` 智能体最后更新时间,采用 RFC 3339 格式。 **version** `integer` | 版本号 `data.version` 智能体配置版本号。 **base_agent** `string` | 基础 Agent 类型 `data.base_agent` 智能体创建时确定的基础 Agent 类型。 Seedance Managed Agent 返回 `ultra_vision_agent_preview`。 可选值:`ark_agent_preview`、`ultra_vision_agent_preview`。 **description** `string` | 智能体描述 `data.description` 智能体的用途、能力范围和适用场景。 **display_name** `string` | 展示名称 `data.display_name` 智能体的展示名称。 **mcp_servers** `object[]` | MCP 服务列表 `data.mcp_servers` 智能体已配置的 MCP 服务列表。 **name** `string` | MCP 服务名称 `data.mcp_servers.name` 用于标识 MCP 服务的名称。 **type** `string` | 接入方式 `data.mcp_servers.type` MCP 服务的接入方式。 取值固定为 `url`。 **url** `string` | 服务地址 `data.mcp_servers.url` MCP 服务的访问地址。 **metadata** `object` | 自定义元数据 `data.metadata` 智能体的自定义键值对元数据。 **model** `object` | 模型配置 `data.model` 智能体使用的模型配置。 **id** `string` | 模型或接入点 ID `data.model.id` 智能体调用的模型 ID 或推理接入点 ID。例如模型 ID `doubao-seed-2-1-pro-260628`,或推理接入点 ID `ep-20260907123456-abcd1`。 **reasoning_effort** `string` | 推理投入档位 `data.model.reasoning_effort` 模型在深度思考时使用的推理投入档位。可选值:`none`、`minimal`、`low`、`medium`、`high`、`xhigh`、`max`。 **service_tier** `string` | 推理服务档位 `data.model.service_tier` 模型调用使用的推理服务档位。可选值:`auto`、`default`、`fast`。 **speed** `string` | 推理速度档位 `data.model.speed` 模型使用的推理速度档位。可选值:`standard`、`fast`。 **thinking** `string` | 深度思考 `data.model.thinking` 模型的深度思考模式。`auto` 表示由模型决定是否启用深度思考。取值:`enabled` / `disabled` / `auto`。 **multiagent** `object` | 多智能体配置 `data.multiagent` 智能体与子智能体之间的协作配置。 **agents** `object[]` | 子智能体列表 `data.multiagent.agents` 参与协作的子智能体列表。 **type** `string` | 子智能体来源 `data.multiagent.agents.type` 子智能体的来源。`agent` 表示引用已存在的智能体;`self` 表示复用当前智能体配置作为子智能体参与协作。 **id** `string` | 智能体 ID `data.multiagent.agents.id` 被引用智能体的 ID。 **version** `integer` | 智能体版本 `data.multiagent.agents.version` 被引用智能体的版本号。 **type** `string` | 协作模式 `data.multiagent.type` 多智能体协作模式,取值固定为 `coordinator`。当前智能体负责分配任务并汇总子智能体的结果。 **skills** `object[]` | 技能列表 `data.skills` 智能体已绑定的技能列表。 **type** `string` | 技能来源 `data.skills.type` 技能来源。 - `ark`:方舟预置技能。 - `skill_hub`:来自 SkillHub 的公共技能。 - `custom`:当前账号通过 Skills API 创建的自定义技能。 **skill_id** `string` | 技能 ID `data.skills.skill_id` 绑定到智能体的技能 ID。 **version** `string` | 技能版本 `data.skills.version` 绑定到智能体的技能版本号。 **system** `string` | 系统提示词 `data.system` 您为智能体配置并保存的系统提示词,用于定义智能体的角色和行为要求。 **tags** `object[]` | 标签列表 `data.tags` 智能体的标签列表。 **key** `string` | 标签键 `data.tags.key` 标签键,用于分类和检索。 **value** `string` | 标签值 `data.tags.value` 标签对应的值。 **tools** `object[]` | 工具列表 `data.tools` 您为智能体配置的工具列表。 **type** `string` | 工具类型 `data.tools.type` 工具类型。 - `agent_toolset_20260916`:使用方舟内置的 `bash`、`edit`、`read`、`write`、`glob`、`grep`、`web_fetch` 和 `web_search` 工具。 - `agent_toolset_multimodal_20260825`:使用 `image_generate`、`video_generate`、`visual_search`、`general_search`、`compose_video` 和 `todo_write` 工具。 - `mcp_toolset`:使用指定 MCP 服务提供的工具。 - `custom`:使用由客户端执行的自定义工具。 可选值:`agent_toolset_20260401`、`agent_toolset_20260701`、`agent_toolset_20260916`、`agent_toolset_multimodal_20260825`、`mcp_toolset`、`custom`。 **configs** `object[]` | 工具配置列表 `data.tools.configs` 按工具名称设置工具的启用状态和权限策略。 **name** `string` | 工具名称 `data.tools.configs.name` 工具配置对应的工具名称。 **enabled** `boolean` | 是否启用 `data.tools.configs.enabled` 是否启用此工具。 **models** `object[]` | 工具模型列表 `data.tools.configs.models` 图片生成或视频生成工具实际绑定模型列表。 **id** `string` | 模型或接入点 ID `data.tools.configs.models.id` 该工具绑定的模型 ID 或推理接入点 ID。 **default** `boolean` | 是否为默认模型 `data.tools.configs.models.default` 是否为该工具的默认模型。 **name** `string` | 模型名称 `data.tools.configs.models.name` 服务端根据模型 ID 或推理接入点 ID 返回的模型名称。 **version** `string` | 模型版本 `data.tools.configs.models.version` 服务端根据模型 ID 或推理接入点 ID 返回的模型版本。 **permission_policy** `object` | 权限策略 `data.tools.configs.permission_policy` 该工具使用的权限策略。 **type** `string` | 策略类型 `data.tools.configs.permission_policy.type` 工具调用许可策略。 * `always_allow`:表示总是允许调用。 * `always_ask`:表示每次使用前需要确认。 **default_config** `object` | 默认工具配置 `data.tools.default_config` 未在 `configs` 中单独配置的工具所使用的默认启用状态和权限策略。 **enabled** `boolean` | 默认是否启用 `data.tools.default_config.enabled` 是否默认启用未在 `configs` 中单独配置的工具。 * `true`:表示默认启用。 * `false`:表示默认禁用。 **permission_policy** `object` | 默认权限策略 `data.tools.default_config.permission_policy` 未在 `configs` 中单独配置的工具所使用的默认权限策略。 **type** `string` | 策略类型 `data.tools.default_config.permission_policy.type` 工具调用许可策略。 * `always_allow`:表示总是允许调用。 * `always_ask`:表示每次使用前需要确认。 **description** `string` | 自定义工具描述 `data.tools.description` 说明自定义工具的功能和适用场景,供模型判断何时调用该工具。 **input_schema** `object` | 输入参数定义 `data.tools.input_schema` 返回 Agent 中保存的自定义工具输入参数 JSON Schema。 **properties** `object` | 参数属性定义 `data.tools.input_schema.properties` 返回 Agent 中保存的 JSON Schema 属性映射。每个键为参数名,每个值为对应参数的 JSON Schema 子对象。 **required** `string[]` | 必填参数名称列表 `data.tools.input_schema.required` 返回调用自定义工具时必须提供的参数名称列表。 **type** `string` | Schema 类型 `data.tools.input_schema.type` 返回 JSON Schema 的顶层类型,固定为 `object`。 **mcp_server_name** `string` | MCP 服务名称 `data.tools.mcp_server_name` MCP 工具所属的 MCP 服务名称。 **name** `string` | 自定义工具名称 `data.tools.name` 自定义工具的名称。 **next_page** `string` | 下一页标识 下一页标识。将该值原样作为下一次请求的 `page` 参数;已到最后一页时不返回该字段。 ## 代码示例 ## 查询智能体列表 ### cURL #### Request ```Bash curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/agents?limit=20" \ -H "Authorization: Bearer $ARK_API_KEY" ``` #### Response ``` { "data": [ { "id": "agent-20260715083012-a3f7b", "type": "agent", "name": "", "model": { "id": "doubao-seed-2-1-pro-260915" }, "system": "你是一个乐于助人的智能助手。", "version": 1, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T08:00:00Z" } ] } ``` ### Python #### Request ```python import os from arkruntime import Ark client = Ark( api_key=os.environ["ARK_API_KEY"], base_url="https://ark.cn-beijing.volces.com/api/v3", ) page = client.agents.list(limit=20) print(page) ``` #### Response ``` { "data": [ { "id": "agent-20260715083012-a3f7b", "type": "agent", "name": "", "model": {"id": "doubao-seed-2-1-pro-260915"}, "system": "你是一个乐于助人的智能助手。", "version": 1, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T08:00:00Z" } ] } ``` ### Java #### Request ```java // pom.xml 依赖: // // com.volcengine // ark-runtime // 0.9.0 // import com.volcengine.ark.runtime.models.agent.ListAgentsResponse; import com.volcengine.ark.runtime.service.ArkService; public class Main { public static void main(String[] args) throws Exception { ArkService service = ArkService.builder() .apiKey(System.getenv("ARK_API_KEY")) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); ListAgentsResponse page = service.listAgents(20, null, null, null); System.out.println(page); service.shutdownExecutor(); } } ``` #### Response ``` { "data": [ { "id": "agent-20260715083012-a3f7b", "type": "agent", "name": "", "model": { "id": "doubao-seed-2-1-pro-260915" }, "system": "你是一个乐于助人的智能助手。", "version": 1, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T08:00:00Z" } ] } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" agentmodel "github.com/volcengine/ark-runtime-go/arkruntime/model/agent" ) func main() { ctx := context.Background() client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) resp, err := client.ListAgents(ctx, &agentmodel.AgentsListParams{ Limit: agentmodel.NewOptInt32(20), }) if err != nil { panic(err) } fmt.Println(resp) } ``` #### Response ``` { "data": [ { "id": "agent-20260715083012-a3f7b", "type": "agent", "name": "", "model": { "id": "doubao-seed-2-1-pro-260915" }, "system": "你是一个乐于助人的智能助手。", "version": 1, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T08:00:00Z" } ] } ``` --- # 查询智能体详情 Source: https://ark.volcengine.com/region:cn-beijing/docs/get-agent-api `GET https://ark.cn-beijing.volces.com/api/v3/agents/{agent_id}` 根据智能体 ID 获取配置详情。省略 `version` 时返回最新配置;指定 `version` 时返回对应的历史版本。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **agent_id** `string` `必选` | 智能体 ID 要查询的智能体 ID。通过创建智能体接口 (POST /agents) 返回, 或在控制台智能体列表页面获取。 ### Query 参数 > 在 URL Query String 中传入。 **version** `integer` | 版本号 要查询的智能体版本号。省略时返回最新配置;填写时返回对应的历史版本。 **最小值**:`1` ## 响应参数 **created_at** `string` | 创建时间 省略 `version` 时为智能体创建时间;指定 `version` 时为该版本的创建时间。采用 ISO 8601 格式。 **id** `string` | 智能体 ID 智能体唯一标识,以 `agent-` 开头。更新或删除智能体,以及创建会话时,需要使用该值。 **name** `string` | 智能体名称 用于识别和管理智能体的名称。 **type** `string` | 对象类型 返回对象的类型,表示该对象为智能体。 取值固定为 `agent`。 **updated_at** `string` | 更新时间 省略 `version` 时为智能体最后更新时间;指定 `version` 时与 `created_at` 相同,表示该历史版本的创建时间。采用 ISO 8601 格式。 **version** `integer` | 版本号 当前智能体配置的版本号。 **base_agent** `string` | 基础 Agent 类型 智能体创建时确定的基础 Agent 类型。 Seedance Managed Agent 返回 `ultra_vision_agent_preview`。 可选值:`ark_agent_preview`、`ultra_vision_agent_preview`。 **description** `string` | 智能体描述 智能体的用途、能力范围和适用场景。 **display_name** `string` | 展示名称 智能体的展示名称。 **mcp_servers** `object[]` | MCP 服务列表 智能体已配置的 MCP 服务列表。 **name** `string` | MCP 服务名称 `mcp_servers.name` 用于标识 MCP 服务的名称。 **type** `string` | 接入方式 `mcp_servers.type` MCP 服务的接入方式。 取值固定为 `url`。 **url** `string` | 服务地址 `mcp_servers.url` MCP 服务的访问地址。 **metadata** `object` | 自定义元数据 智能体的自定义键值对元数据。 **model** `object` | 模型配置 智能体使用的模型配置。 **id** `string` | 模型或接入点 ID `model.id` 智能体调用的模型 ID 或推理接入点 ID。例如模型 ID `doubao-seed-2-1-pro-260628`,或推理接入点 ID `ep-20260907123456-abcd1`。 **reasoning_effort** `string` | 推理投入档位 `model.reasoning_effort` 模型在深度思考时使用的推理投入档位。可选值:`none`、`minimal`、`low`、`medium`、`high`、`xhigh`、`max`。 **service_tier** `string` | 推理服务档位 `model.service_tier` 模型调用使用的推理服务档位。可选值:`auto`、`default`、`fast`。 **speed** `string` | 推理速度档位 `model.speed` 模型使用的推理速度档位。可选值:`standard`、`fast`。 **thinking** `string` | 深度思考 `model.thinking` 模型的深度思考模式。`auto` 表示由模型决定是否启用深度思考。取值:`enabled` / `disabled` / `auto`。 **multiagent** `object` | 多智能体配置 智能体与子智能体之间的协作配置。 **agents** `object[]` | 子智能体列表 `multiagent.agents` 参与协作的子智能体列表。 **type** `string` | 子智能体来源 `multiagent.agents.type` 子智能体的来源。`agent` 表示引用已存在的智能体;`self` 表示复用当前智能体配置作为子智能体参与协作。 **id** `string` | 智能体 ID `multiagent.agents.id` 被引用智能体的 ID。 **version** `integer` | 智能体版本 `multiagent.agents.version` 被引用智能体的版本号。 **type** `string` | 协作模式 `multiagent.type` 多智能体协作模式,取值固定为 `coordinator`。当前智能体负责分配任务并汇总子智能体的结果。 **skills** `object[]` | 技能列表 智能体已绑定的技能列表。 **type** `string` | 技能来源 `skills.type` 技能来源。 - `ark`:方舟预置技能。 - `skill_hub`:来自 SkillHub 的公共技能。 - `custom`:当前账号通过 Skills API 创建的自定义技能。 **skill_id** `string` | 技能 ID `skills.skill_id` 绑定到智能体的技能 ID。 **version** `string` | 技能版本 `skills.version` 绑定到智能体的技能版本号。 **system** `string` | 系统提示词 您为智能体配置并保存的系统提示词,用于定义智能体的角色和行为要求。 **tags** `object[]` | 标签列表 智能体的标签列表。省略 `version` 查询最新配置时可能返回;指定 `version` 查询历史版本时不返回该字段。 **key** `string` | 标签键 `tags.key` 标签键,用于分类和检索。 **value** `string` | 标签值 `tags.value` 标签对应的值。 **tools** `object[]` | 工具列表 您为智能体配置的工具列表。 **type** `string` | 工具类型 `tools.type` 工具类型。 - `agent_toolset_20260916`:使用方舟内置的 `bash`、`edit`、`read`、`write`、`glob`、`grep`、`web_fetch` 和 `web_search` 工具。 - `agent_toolset_multimodal_20260825`:使用 `image_generate`、`video_generate`、`visual_search`、`general_search`、`compose_video` 和 `todo_write` 工具。 - `mcp_toolset`:使用指定 MCP 服务提供的工具。 - `custom`:使用由客户端执行的自定义工具。 可选值:`agent_toolset_20260401`、`agent_toolset_20260701`、`agent_toolset_20260916`、`agent_toolset_multimodal_20260825`、`mcp_toolset`、`custom`。 **configs** `object[]` | 工具配置列表 `tools.configs` 按工具名称设置工具的启用状态和权限策略。 **name** `string` | 工具名称 `tools.configs.name` 工具配置对应的工具名称。 **enabled** `boolean` | 是否启用 `tools.configs.enabled` 是否启用此工具。 **models** `object[]` | 工具模型列表 `tools.configs.models` 图片生成或视频生成工具实际绑定模型列表。 **id** `string` | 模型或接入点 ID `tools.configs.models.id` 该工具绑定的模型 ID 或推理接入点 ID。 **default** `boolean` | 是否为默认模型 `tools.configs.models.default` 是否为该工具的默认模型。 **name** `string` | 模型名称 `tools.configs.models.name` 服务端根据模型 ID 或推理接入点 ID 返回的模型名称。 **version** `string` | 模型版本 `tools.configs.models.version` 服务端根据模型 ID 或推理接入点 ID 返回的模型版本。 **permission_policy** `object` | 权限策略 `tools.configs.permission_policy` 该工具使用的权限策略。 **type** `string` | 策略类型 `tools.configs.permission_policy.type` 工具调用许可策略。 * `always_allow`:表示总是允许调用。 * `always_ask`:表示每次使用前需要确认。 **default_config** `object` | 默认工具配置 `tools.default_config` 未在 `configs` 中单独配置的工具所使用的默认启用状态和权限策略。 **enabled** `boolean` | 默认是否启用 `tools.default_config.enabled` 是否默认启用未在 `configs` 中单独配置的工具。 * `true`:表示默认启用。 * `false`:表示默认禁用。 **permission_policy** `object` | 默认权限策略 `tools.default_config.permission_policy` 未在 `configs` 中单独配置的工具所使用的默认权限策略。 **type** `string` | 策略类型 `tools.default_config.permission_policy.type` 工具调用许可策略。 * `always_allow`:表示总是允许调用。 * `always_ask`:表示每次使用前需要确认。 **description** `string` | 自定义工具描述 `tools.description` 说明自定义工具的功能和适用场景,供模型判断何时调用该工具。 **input_schema** `object` | 输入参数定义 `tools.input_schema` 返回 Agent 中保存的自定义工具输入参数 JSON Schema。 **properties** `object` | 参数属性定义 `tools.input_schema.properties` 返回 Agent 中保存的 JSON Schema 属性映射。每个键为参数名,每个值为对应参数的 JSON Schema 子对象。 **required** `string[]` | 必填参数名称列表 `tools.input_schema.required` 返回调用自定义工具时必须提供的参数名称列表。 **type** `string` | Schema 类型 `tools.input_schema.type` 返回 JSON Schema 的顶层类型,固定为 `object`。 **mcp_server_name** `string` | MCP 服务名称 `tools.mcp_server_name` MCP 工具所属的 MCP 服务名称。 **name** `string` | 自定义工具名称 `tools.name` 自定义工具的名称。 ## 代码示例 ## 查询智能体详情 ### cURL #### Request ```Bash curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/agents/" \ -H "Authorization: Bearer $ARK_API_KEY" ``` #### Response ``` { "id": "", "type": "agent", "name": "", "model": { "id": "doubao-seed-2-1-pro-260915" }, "system": "你是一个乐于助人的智能助手。", "version": 1, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T08:00:00Z" } ``` ### Python #### Request ```python import os from arkruntime import Ark client = Ark( api_key=os.environ["ARK_API_KEY"], base_url="https://ark.cn-beijing.volces.com/api/v3", ) agent = client.agents.retrieve("") print(agent) ``` #### Response ``` { "id": "", "type": "agent", "name": "", "model": { "id": "doubao-seed-2-1-pro-260915" }, "system": "你是一个乐于助人的智能助手。", "version": 1, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T08:00:00Z" } ``` ### Java #### Request ```java // pom.xml 依赖: // // com.volcengine // ark-runtime // 0.9.0 // import com.volcengine.ark.runtime.models.agent.Agent; import com.volcengine.ark.runtime.service.ArkService; public class Main { public static void main(String[] args) throws Exception { ArkService service = ArkService.builder() .apiKey(System.getenv("ARK_API_KEY")) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); Agent agent = service.getAgent(""); System.out.println(agent); service.shutdownExecutor(); } } ``` #### Response ``` { "id": "", "type": "agent", "name": "", "model": { "id": "doubao-seed-2-1-pro-260915" }, "system": "你是一个乐于助人的智能助手。", "version": 1, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T08:00:00Z" } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" ) func main() { ctx := context.Background() client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) agent, err := client.GetAgent(ctx, "") if err != nil { panic(err) } fmt.Println(agent) } ``` #### Response ``` { "id": "", "type": "agent", "name": "", "model": { "id": "doubao-seed-2-1-pro-260915" }, "system": "你是一个乐于助人的智能助手。", "version": 1, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T08:00:00Z" } ``` --- # 更新智能体 Source: https://ark.volcengine.com/region:cn-beijing/docs/update-agent-api `POST https://ark.cn-beijing.volces.com/api/v3/agents/{agent_id}` 更新指定智能体的配置信息。请求中的 `version` 必须与智能体当前版本一致;不一致时,服务端拒绝本次更新并返回 400 `InvalidParameter`。 除 `version` 外,省略任一可选请求字段或传 `null` 时保留原值;各字段的清空和整体替换规则见请求参数。 * 仅更新 `display_name` 时不创建新版本,响应中的 `version` 保持不变;更新其他配置时会生成新版本。 * 创建智能体后,后续创建的会话会自动使用更新后的版本,但之前已创建的会话将继续使用创建时的智能体版本。 * `base_agent` 在创建后不能修改,已创建的通用 Agent 不能通过更新接口变更为 Seedance Managed Agent。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **agent_id** `string` `必选` | 智能体 ID 要更新的智能体 ID。通过创建智能体接口 (POST /agents) 返回, 或在控制台智能体列表页面获取。 ### Body 参数 **version** `integer` `必选` | 版本号 当前智能体的版本号。更新前可调用查询智能体详情接口获取最新版本号。 服务端会校验该值是否与当前版本一致;不一致时,服务端拒绝本次更新。 * 省略或不大于 `0`:返回 400 `MissingParameter`。 * 与智能体当前版本不一致:返回 400 `InvalidParameter`,错误消息为 `version: conflict`。 **description** `string` | 智能体描述 智能体描述,用于说明智能体的用途、能力范围和适用场景,最多 2048 字符。省略或传 `null` 时保留原值,传空字符串 `""` 时清空。 **display_name** `string` | 展示名称 智能体展示名称,最多 256 个字符。省略或传 `null` 时保留原值,传空字符串 `""` 时清空。 **mcp_servers** `object[]` | MCP 服务配置 MCP 服务配置列表,最多 20 项。 * 省略或传 `null`:保留原值。 * 传空数组 `[]`:清空。 * 传非空数组:整体替换。 **type** `string` `必选` | 接入方式 `mcp_servers.type` MCP 服务的接入方式。 取值固定为 `url`。 **url** `string` `必选` | 服务地址 `mcp_servers.url` MCP 服务的访问地址。同一智能体内不能配置重复的 MCP 服务地址。 **name** `string` | MCP 服务名称 `mcp_servers.name` MCP 服务名称,最长 255 个字符,用于在当前 Agent 中识别该服务;配置 MCP 工具集时,`tools[].mcp_server_name` 必须填写此名称。 * 省略名称或名称不符合命名规则时,服务端根据 `url` 生成名称。 * 服务端会将符合命名规则的名称转换为小写。 * 多个名称冲突时,服务端为后续名称添加数字后缀。 **metadata** `object` | 自定义元数据 用户自定义键值对元数据,最多 16 对,键最多 64 字符,值最多 512 字符。 * 省略或传 `null`:保留原值。 * 传入非空对象:整体替换;如需保留已有键,先查询并合并后再传。 * 传入空对象 `{}`:清空。 **model** `object` | 模型配置 智能体使用的模型配置,包含模型 ID 或推理接入点 ID,以及运行参数。 * 各运行参数的支持范围和默认行为以所选模型为准。 * 传入模型不支持的取值时,服务端返回 400 `InvalidParameter`。 * 省略或传 `null`:保留原配置。 * 不支持清空模型配置。 * 修改 Seedance Managed Agent 的 `model.id` 时,从控制台的 Seedance Managed Agent 创建页面展示的模型中选择;本文不固定具体模型 ID。 * 所选模型必须支持 Managed Agent 推理和 `reasoning_effort: high`。`reasoning_effort` 只能设置为 `high`;省略时保留当前的 `high`。 * 详情请参见 [模型支持的参数列表](/docs/model-parameter-support)。 > **注意** > > 所填模型 ID 或推理接入点 ID 对应的模型请从 Managed Agents 控制台提供的模型中选择,或参见 [模型支持的参数列表](/docs/model-parameter-support)。使用推理接入点 ID 时,该接入点必须属于当前项目;否则,服务端返回 400 `InvalidParameter`。 **id** `string` `必选` | 模型或接入点 ID `model.id` 智能体调用的模型 ID 或推理接入点 ID。例如模型 ID `doubao-seed-2-1-pro-260628`,或推理接入点 ID `ep-20260907123456-abcd1`。 **reasoning_effort** `string` | 推理投入档位 `model.reasoning_effort` 模型在深度思考时使用的推理投入档位。可选值:`none`、`minimal`、`low`、`medium`、`high`、`xhigh`、`max`。 **service_tier** `string` | 推理服务档位 `model.service_tier` 模型调用使用的推理服务档位。可选值:`auto`、`default`、`fast`。 **speed** `string` | 推理速度档位 `model.speed` 模型使用的推理速度档位。可选值:`standard`、`fast`。 **thinking** `string` | 深度思考 `model.thinking` 模型的深度思考模式。`auto` 表示由模型决定是否启用深度思考。取值:`enabled` / `disabled` / `auto`。 **multiagent** `object` | 多智能体配置 多智能体协作配置,最多支持 20 个子智能体。 省略或传 `null` 时保留原配置。 **agents** `object[]` `必选` | 子智能体列表 `multiagent.agents` 参与协作的子智能体列表。 **type** `string` `必选` | 子智能体来源 `multiagent.agents.type` 子智能体的来源。`agent` 表示引用已存在的智能体;`self` 表示复用当前智能体配置作为子智能体参与协作,但不会复用当前智能体的子智能体。 **id** `string` | 智能体 ID `multiagent.agents.id` 被引用智能体的 ID。`type` 为 `agent` 时,用于指定参与协作的已有智能体,必须填写;`type` 为 `self` 时,当前智能体使用自身配置参与协作,不填写该字段。 **version** `integer` | 智能体版本 `multiagent.agents.version` 被引用智能体的版本号。省略时使用最新版本。 **type** `string` `必选` | 协作模式 `multiagent.type` 多智能体协作模式,取值固定为 `coordinator`。当前智能体负责分配任务并汇总子智能体的结果。 **name** `string` | 智能体名称 智能体名称,长度为 1~256 个字符。省略或传 `null` 时保留原值,不支持清空。 **skills** `object[]` | 技能配置 技能配置列表,最多支持 50 个技能。未指定技能版本时,使用该技能的最新版本。 * 省略或传 `null`:保留原值。 * 传空数组 `[]`:清空。 * 传非空数组:整体替换。 **skill_id** `string` `必选` | 技能 ID `skills.skill_id` 要绑定到智能体的技能 ID。 **type** `string` `必选` | 技能来源 `skills.type` 技能来源。 - `ark`:方舟预置技能。 - `skill_hub`:来自 SkillHub 的公共技能。 - `custom`:当前账号通过 Skills API 创建的自定义技能。 **version** `string` | 技能版本 `skills.version` 要绑定的技能版本号。省略时使用该技能的最新版本。 **system** `string` | 系统提示词 系统提示词,定义智能体的角色和行为规则,最多 100000 字符。省略或传 `null` 时保留原值,传空字符串 `""` 时清空。 更新 Seedance Managed Agent 时,该字段用于调整视觉创作任务中的角色、工作方式和输出要求。 **tags** `object[]` | 标签列表 自定义标签列表,最多填写 50 项。同一请求内,标签键不能重复。 * 省略或传 `null`:保留原值。 * 传空数组 `[]`:清空。 * 传非空数组:整体替换。 **key** `string` `必选` | 标签键 `tags.key` 标签键,用于分类和检索,长度为 1~128 个字符,且不能以 `volc:` 或 `maas:` 开头。 **value** `string` | 标签值 `tags.value` 标签对应的值,最长 256 个字符。 **tools** `object[]` | 工具配置 工具配置列表,最多支持 128 个工具。 * 内置工具集和 MCP 工具可通过 `configs` 和 `default_config` 设置启用状态及权限策略。 * MCP 工具通过 `mcp_server_name` 关联 `mcp_servers[].name`。 * 自定义工具需填写名称、功能描述和输入参数定义。 * 省略或传 `null`:保留原值。 * 传空数组 `[]`:清空。 * 传非空数组:整体替换。 * 更新 Seedance Managed Agent 的工具配置时,更新后的完整配置仍须同时包含基础工具集和多模态工具集。基础工具集使用 `agent_toolset_20260916`;多模态工具集使用 `agent_toolset_multimodal_20260825`。 * 多模态工具集中必须启用 `image_generate`、`visual_search`、`general_search` 和 `compose_video`;`video_generate` 可按需启用。 * 启用 `general_search` 时,必须关闭基础工具集中的 `web_search`。 **type** `string` `必选` | 工具类型 `tools.type` 工具类型。 - `agent_toolset_20260916`:使用方舟内置的 `bash`、`edit`、`read`、`write`、`glob`、`grep`、`web_fetch` 和 `web_search` 工具。 - `agent_toolset_multimodal_20260825`:使用 `image_generate`、`video_generate`、`visual_search`、`general_search`、`compose_video` 和 `todo_write` 工具。 - `mcp_toolset`:使用指定 MCP 服务提供的工具。 - `custom`:使用由客户端执行的自定义工具。 可选值:`agent_toolset_20260401`、`agent_toolset_20260701`、`agent_toolset_20260916`、`agent_toolset_multimodal_20260825`、`mcp_toolset`、`custom`。 **configs** `object[]` | 工具配置列表 `tools.configs` 按工具名称设置工具的启用状态和权限策略。 **name** `string` `必选` | 工具名称 `tools.configs.name` 工具配置对应的工具名称。 **enabled** `boolean` | 是否启用 `tools.configs.enabled` 是否启用此工具。 **models** `object[]` | 工具模型列表 `tools.configs.models` 图片生成或视频生成工具绑定的模型 ID 或推理接入点 ID 列表。省略时,服务端为已启用但未指定模型的生成工具绑定平台默认模型,并在响应中返回实际绑定结果。 > **说明** > > 最多填写 10 项,且同一工具配置内的 ID 不能重复。配置多项时,必须且只能将一项的 `default` 设置为 `true`。 **id** `string` `必选` | 模型或接入点 ID `tools.configs.models.id` 图片生成或视频生成工具调用的模型 ID 或推理接入点 ID。 > **注意** > > 所填模型 ID 或推理接入点 ID 对应的模型必须支持当前图片生成或视频生成工具。使用推理接入点 ID 时,该接入点必须属于当前项目;否则,服务端返回 400 `InvalidParameter`。 **default** `boolean` `默认值 false` | 是否为默认模型 `tools.configs.models.default` 是否作为该工具的默认模型。配置多个模型或接入点时,必须且只能将一项设置为 `true`。 **permission_policy** `object` | 权限策略 `tools.configs.permission_policy` 该工具调用时使用的权限策略。 **type** `string` `必选` | 策略类型 `tools.configs.permission_policy.type` 工具调用许可策略。 * `always_allow`:表示总是允许调用。 * `always_ask`:表示每次使用前需要确认。 **default_config** `object` | 默认工具配置 `tools.default_config` 未在 `configs` 中单独配置的工具所使用的默认启用状态和权限策略。 **enabled** `boolean` `默认值 true` | 是否启用 `tools.default_config.enabled` 是否默认启用未在 `configs` 中单独配置的工具。 * `true`:表示默认启用。 * `false`:表示默认禁用。 **permission_policy** `object` | 权限策略 `tools.default_config.permission_policy` 未单独配置的工具所使用的默认权限策略。 **type** `string` `必选` | 策略类型 `tools.default_config.permission_policy.type` 工具调用许可策略。 * `always_allow`:表示总是允许调用。 * `always_ask`:表示每次使用前需要确认。 **description** `string` | 自定义工具描述 `tools.description` 说明自定义工具的功能和适用场景,供模型判断何时调用该工具。 > **说明** > > `type` 为 `custom` 时必填,长度为 1~10000 个字符。 **input_schema** `object` | 输入参数定义 `tools.input_schema` 定义自定义工具的输入参数及其约束。 > **注意** > > * 更新 Agent 时,服务端会确认 `input_schema.type` 为 `object`,并确认 `input_schema.properties` 是 JSON 对象,但不会逐项检查其中的属性定义。 > * 运行 Session 时,服务端会检查完整的 `input_schema` 是否为合法 JSON Schema。更新 Agent 成功不代表该 Schema 一定可以正常运行。 > * 模型生成的工具调用参数只会校验是否为合法 JSON。执行自定义工具前,你的应用应按 `input_schema` 再次校验参数。 **properties** `object` | 参数属性定义 `tools.input_schema.properties` 自定义工具输入参数的 JSON Schema 属性映射。键为参数名,值为对应参数的 JSON Schema 子对象。请确保每个属性定义均符合 JSON Schema。 常用关键字包括: * `type`:参数类型,如 `string`、`number`、`integer`、`boolean`、`array` 或 `object`。 * `description`:参数的用途说明,供模型理解并生成参数。 * `enum`:参数允许使用的值。 * `items`:数组元素的 JSON Schema。 * `properties`、`required`:对象的子字段及必填字段。 * `minimum`、`maximum`:数值参数的取值范围。 示例: ```JSON { "city": { "type": "string", "description": "城市名称" }, "hours": { "type": "integer", "description": "预报时长,单位为小时", "minimum": 1, "maximum": 72 } } ``` **required** `string[]` | 必填参数名称列表 `tools.input_schema.required` 自定义工具输入中必填的参数名称列表。列表中的每个名称必须与 `properties` 中定义的参数名称一致。 **type** `string` `默认值 object` | Schema 类型 `tools.input_schema.type` 指定 JSON Schema 的顶层类型,仅支持 `object`。 **mcp_server_name** `string` | MCP 服务名称 `tools.mcp_server_name` MCP 工具所属的 MCP 服务名称。 **name** `string` | 自定义工具名称 `tools.name` 自定义工具的名称。 > **说明** > > `type` 为 `custom` 时必填。长度为 1~128 个字符,只能包含字母、数字、下划线和连字符,且同一 Agent 内的自定义工具名称不能重复。 ## 响应参数 **created_at** `string` | 创建时间 智能体创建时间。 **id** `string` | 智能体 ID 智能体唯一标识,以 `agent-` 开头。查询、更新或删除智能体,以及创建会话时,需要使用该值。 **name** `string` | 智能体名称 用于识别和管理智能体的名称。 **type** `string` | 对象类型 返回对象的类型,表示该对象为智能体。 取值固定为 `agent`。 **updated_at** `string` | 更新时间 智能体最后更新时间。 **version** `integer` | 版本号 更新后的智能体配置版本号。 **base_agent** `string` | 基础 Agent 类型 智能体创建时确定的基础 Agent 类型。该字段不能通过更新接口修改。 Seedance Managed Agent 返回 `ultra_vision_agent_preview`。 可选值:`ark_agent_preview`、`ultra_vision_agent_preview`。 **description** `string` | 智能体描述 智能体的用途、能力范围和适用场景。 **display_name** `string` | 展示名称 智能体的展示名称。 **mcp_servers** `object[]` | MCP 服务列表 智能体已配置的 MCP 服务列表。 **name** `string` | MCP 服务名称 `mcp_servers.name` 用于标识 MCP 服务的名称。 **type** `string` | 接入方式 `mcp_servers.type` MCP 服务的接入方式。 取值固定为 `url`。 **url** `string` | 服务地址 `mcp_servers.url` MCP 服务的访问地址。 **metadata** `object` | 自定义元数据 智能体的自定义键值对元数据。 **model** `object` | 模型配置 智能体使用的模型配置。 **id** `string` | 模型或接入点 ID `model.id` 智能体调用的模型 ID 或推理接入点 ID。例如模型 ID `doubao-seed-2-1-pro-260628`,或推理接入点 ID `ep-20260907123456-abcd1`。 **reasoning_effort** `string` | 推理投入档位 `model.reasoning_effort` 模型在深度思考时使用的推理投入档位。可选值:`none`、`minimal`、`low`、`medium`、`high`、`xhigh`、`max`。 **service_tier** `string` | 推理服务档位 `model.service_tier` 模型调用使用的推理服务档位。可选值:`auto`、`default`、`fast`。 **speed** `string` | 推理速度档位 `model.speed` 模型使用的推理速度档位。可选值:`standard`、`fast`。 **thinking** `string` | 深度思考 `model.thinking` 模型的深度思考模式。`auto` 表示由模型决定是否启用深度思考。取值:`enabled` / `disabled` / `auto`。 **multiagent** `object` | 多智能体配置 智能体与子智能体之间的协作配置。 **agents** `object[]` | 子智能体列表 `multiagent.agents` 参与协作的子智能体列表。 **type** `string` | 子智能体来源 `multiagent.agents.type` 子智能体的来源。`agent` 表示引用已存在的智能体;`self` 表示复用当前智能体配置作为子智能体参与协作。 **id** `string` | 智能体 ID `multiagent.agents.id` 被引用智能体的 ID。 **version** `integer` | 智能体版本 `multiagent.agents.version` 被引用智能体的版本号。 **type** `string` | 协作模式 `multiagent.type` 多智能体协作模式,取值固定为 `coordinator`。当前智能体负责分配任务并汇总子智能体的结果。 **skills** `object[]` | 技能列表 智能体已绑定的技能列表。 **type** `string` | 技能来源 `skills.type` 技能来源。 - `ark`:方舟预置技能。 - `skill_hub`:来自 SkillHub 的公共技能。 - `custom`:当前账号通过 Skills API 创建的自定义技能。 **skill_id** `string` | 技能 ID `skills.skill_id` 绑定到智能体的技能 ID。 **version** `string` | 技能版本 `skills.version` 绑定到智能体的技能版本号。 **system** `string` | 系统提示词 您为智能体配置并保存的系统提示词,用于定义智能体的角色和行为要求。 **tags** `object[]` | 标签列表 智能体绑定的标签列表。 **key** `string` | 标签键 `tags.key` 标签键,用于分类和检索。 **value** `string` | 标签值 `tags.value` 标签对应的值。 **tools** `object[]` | 工具列表 您为智能体配置的工具列表。 **type** `string` | 工具类型 `tools.type` 工具类型。 - `agent_toolset_20260916`:使用方舟内置的 `bash`、`edit`、`read`、`write`、`glob`、`grep`、`web_fetch` 和 `web_search` 工具。 - `agent_toolset_multimodal_20260825`:使用 `image_generate`、`video_generate`、`visual_search`、`general_search`、`compose_video` 和 `todo_write` 工具。 - `mcp_toolset`:使用指定 MCP 服务提供的工具。 - `custom`:使用由客户端执行的自定义工具。 可选值:`agent_toolset_20260401`、`agent_toolset_20260701`、`agent_toolset_20260916`、`agent_toolset_multimodal_20260825`、`mcp_toolset`、`custom`。 **configs** `object[]` | 工具配置列表 `tools.configs` 按工具名称设置工具的启用状态和权限策略。 **name** `string` | 工具名称 `tools.configs.name` 工具配置对应的工具名称。 **enabled** `boolean` | 是否启用 `tools.configs.enabled` 是否启用此工具。 **models** `object[]` | 工具模型列表 `tools.configs.models` 图片生成或视频生成工具实际绑定模型列表。 **id** `string` | 模型或接入点 ID `tools.configs.models.id` 该工具绑定的模型 ID 或推理接入点 ID。 **default** `boolean` | 是否为默认模型 `tools.configs.models.default` 是否为该工具的默认模型。 **name** `string` | 模型名称 `tools.configs.models.name` 服务端根据模型 ID 或推理接入点 ID 返回的模型名称。 **version** `string` | 模型版本 `tools.configs.models.version` 服务端根据模型 ID 或推理接入点 ID 返回的模型版本。 **permission_policy** `object` | 权限策略 `tools.configs.permission_policy` 该工具调用时使用的权限策略。 **type** `string` | 策略类型 `tools.configs.permission_policy.type` 工具调用许可策略。 * `always_allow`:表示总是允许调用。 * `always_ask`:表示每次使用前需要确认。 **default_config** `object` | 默认工具配置 `tools.default_config` 未在 `configs` 中单独配置的工具所使用的默认启用状态和权限策略。 **enabled** `boolean` | 是否启用 `tools.default_config.enabled` 是否默认启用未在 `configs` 中单独配置的工具。 * `true`:表示默认启用。 * `false`:表示默认禁用。 **permission_policy** `object` | 权限策略 `tools.default_config.permission_policy` 未单独配置的工具所使用的默认权限策略。 **type** `string` | 策略类型 `tools.default_config.permission_policy.type` 工具调用许可策略。 * `always_allow`:表示总是允许调用。 * `always_ask`:表示每次使用前需要确认。 **description** `string` | 自定义工具描述 `tools.description` 说明自定义工具的功能和适用场景,供模型判断何时调用该工具。 **input_schema** `object` | 输入参数定义 `tools.input_schema` 返回 Agent 中保存的自定义工具输入参数 JSON Schema。 **properties** `object` | 参数属性定义 `tools.input_schema.properties` 返回 Agent 中保存的 JSON Schema 属性映射。每个键为参数名,每个值为对应参数的 JSON Schema 子对象。 **required** `string[]` | 必填参数名称列表 `tools.input_schema.required` 返回调用自定义工具时必须提供的参数名称列表。 **type** `string` | Schema 类型 `tools.input_schema.type` 返回 JSON Schema 的顶层类型,固定为 `object`。 **mcp_server_name** `string` | MCP 服务名称 `tools.mcp_server_name` MCP 工具所属的 MCP 服务名称。 **name** `string` | 自定义工具名称 `tools.name` 自定义工具的名称。 ## 代码示例 ## 更新智能体 ### cURL #### Request ```Bash curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/agents/" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d @- <<'EOF' { "version": 1, "system": "你是一个专注于代码审查的助手,请以简洁、专业的语气回复。" } EOF ``` #### Response ``` { "id": "", "type": "agent", "name": "", "model": { "id": "doubao-seed-2-1-pro-260915" }, "system": "你是一个专注于代码审查的助手,请以简洁、专业的语气回复。", "version": 2, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T09:00:00Z" } ``` ### Python #### Request ```python import os from arkruntime import Ark client = Ark( api_key=os.environ["ARK_API_KEY"], base_url="https://ark.cn-beijing.volces.com/api/v3", ) agent = client.agents.update( "", version=1, system="你是一个专注于代码审查的助手,请以简洁、专业的语气回复。", ) print(agent) ``` #### Response ``` { "id": "", "type": "agent", "name": "", "model": {"id": "doubao-seed-2-1-pro-260915"}, "system": "你是一个专注于代码审查的助手,请以简洁、专业的语气回复。", "version": 2, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T09:00:00Z" } ``` ### Java #### Request ```java // pom.xml 依赖: // // com.volcengine // ark-runtime // 0.9.0 // import com.volcengine.ark.runtime.models.agent.Agent; import com.volcengine.ark.runtime.models.agent.UpdateAgentRequest; import com.volcengine.ark.runtime.service.ArkService; public class Main { public static void main(String[] args) throws Exception { ArkService service = ArkService.builder() .apiKey(System.getenv("ARK_API_KEY")) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); Agent agent = service.updateAgent( "", UpdateAgentRequest.builder() .version(1) .system("你是一个专注于代码审查的助手,请以简洁、专业的语气回复。") .build()); System.out.println(agent); service.shutdownExecutor(); } } ``` #### Response ``` { "id": "", "type": "agent", "name": "", "model": { "id": "doubao-seed-2-1-pro-260915" }, "system": "你是一个专注于代码审查的助手,请以简洁、专业的语气回复。", "version": 2, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T09:00:00Z" } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" agentmodel "github.com/volcengine/ark-runtime-go/arkruntime/model/agent" ) func main() { ctx := context.Background() client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) agent, err := client.UpdateAgent(ctx, "", &agentmodel.UpdateAgentRequest{ Version: 1, System: agentmodel.NewOptString("你是一个专注于代码审查的助手,请以简洁、专业的语气回复。"), }) if err != nil { panic(err) } fmt.Println(agent) } ``` #### Response ``` { "id": "", "type": "agent", "name": "", "model": { "id": "doubao-seed-2-1-pro-260915" }, "system": "你是一个专注于代码审查的助手,请以简洁、专业的语气回复。", "version": 2, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T09:00:00Z" } ``` --- # 删除智能体 Source: https://ark.volcengine.com/region:cn-beijing/docs/delete-agent-api `DELETE https://ark.cn-beijing.volces.com/api/v3/agents/{agent_id}` 删除指定的智能体。删除后,无法再通过 API 查询或恢复该智能体及其历史版本。 * 存在 `running` 状态的会话时,删除请求返回 400 `InvalidAction`;其他状态的会话不阻止删除。 * 重复删除、智能体不存在或调用方无权访问时,返回 404 `InvalidAgent`。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **agent_id** `string` `必选` | 智能体 ID 要删除的智能体 ID,以 `agent-` 开头。该 ID 可通过创建智能体接口返回,或在控制台智能体列表页面获取。 ## 响应参数 **id** `string` | 智能体 ID 被删除的智能体 ID,以 `agent-` 开头,与请求中的 `agent_id` 相同。 ## 代码示例 ## 删除智能体 ### cURL #### Request ```Bash curl -sS --fail-with-body -X DELETE "https://ark.cn-beijing.volces.com/api/v3/agents/" \ -H "Authorization: Bearer $ARK_API_KEY" ``` #### Response ``` { "id": "" } ``` ### Python #### Request ```python import os from arkruntime import Ark client = Ark( api_key=os.environ["ARK_API_KEY"], base_url="https://ark.cn-beijing.volces.com/api/v3", ) response = client.agents.delete("") print(response) ``` #### Response ``` { "id": "" } ``` ### Java #### Request ```java // pom.xml 依赖: // // com.volcengine // ark-runtime // 0.9.0 // import com.volcengine.ark.runtime.service.ArkService; public class Main { public static void main(String[] args) throws Exception { ArkService service = ArkService.builder() .apiKey(System.getenv("ARK_API_KEY")) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); Object response = service.deleteAgent(""); System.out.println(response); service.shutdownExecutor(); } } ``` #### Response ``` { "id": "" } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" ) func main() { ctx := context.Background() client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) response, err := client.DeleteAgent(ctx, "") if err != nil { panic(err) } fmt.Println(response) } ``` #### Response ``` { "id": "" } ``` --- # 查询智能体版本列表 Source: https://ark.volcengine.com/region:cn-beijing/docs/list-agent-versions-api `GET https://ark.cn-beijing.volces.com/api/v3/agents/{agent_id}/versions` 分页查询指定智能体的历史版本,结果按版本号从大到小排列。本接口仅用于查询;如需恢复某个历史配置,请读取该版本并调用更新智能体接口。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **agent_id** `string` `必选` | 智能体 ID 要查询历史版本的智能体 ID。 ### Query 参数 > 在 URL Query String 中传入。 **limit** `integer` `默认值 20` | 每页数量 每页返回的数量。 **取值范围**:`[1, 100]` **page** `string` | 下一页标识 下一页标识。 * 首次请求时省略。 * 后续请求将上一页响应中的 `next_page` 原样传入。 * 请勿解析或修改该值。 ## 响应参数 **data** `object[]` | 版本列表 当前页返回的智能体历史版本列表。 **created_at** `string` | 版本生成时间 `data.created_at` 该智能体版本的生成时间,采用 RFC 3339 格式。 * 版本 1:对应智能体创建时间。 * 后续版本:对应配置更新并生成新版本的时间。 **id** `string` | 智能体 ID `data.id` 智能体唯一标识,以 `agent-` 开头,可用于创建会话。同一智能体的各个历史版本使用相同 ID,通过 `version` 区分。 **name** `string` | 智能体名称 `data.name` 用于识别和管理智能体的名称。 **type** `string` | 对象类型 `data.type` 返回对象的类型,表示该对象为智能体。 取值固定为 `agent`。 **updated_at** `string` | 版本生成时间 `data.updated_at` 与 `created_at` 相同,表示该智能体版本的生成时间。采用 RFC 3339 格式。 **version** `integer` | 版本号 `data.version` 智能体的历史版本号。 **base_agent** `string` | 基础 Agent 类型 `data.base_agent` 该历史版本保存的基础 Agent 类型。 Seedance Managed Agent 返回 `ultra_vision_agent_preview`。 可选值:`ark_agent_preview`、`ultra_vision_agent_preview`。 **description** `string` | 智能体描述 `data.description` 智能体的用途、能力范围和适用场景。 **display_name** `string` | 展示名称 `data.display_name` 智能体的展示名称。 **mcp_servers** `object[]` | MCP 服务列表 `data.mcp_servers` 智能体配置的 MCP 服务列表。 **name** `string` | MCP 服务名称 `data.mcp_servers.name` 用于标识 MCP 服务的名称。 **type** `string` | 接入方式 `data.mcp_servers.type` MCP 服务的接入方式。 取值固定为 `url`。 **url** `string` | 服务地址 `data.mcp_servers.url` MCP 服务的访问地址。 **metadata** `object` | 自定义元数据 `data.metadata` 智能体的自定义键值对元数据。 **model** `object` | 模型配置 `data.model` 智能体使用的模型配置。 **id** `string` | 模型或接入点 ID `data.model.id` 智能体调用的模型 ID 或推理接入点 ID。例如模型 ID `doubao-seed-2-1-pro-260628`,或推理接入点 ID `ep-20260907123456-abcd1`。 **reasoning_effort** `string` | 推理投入档位 `data.model.reasoning_effort` 模型在深度思考时使用的推理投入档位。可选值:`none`、`minimal`、`low`、`medium`、`high`、`xhigh`、`max`。 **service_tier** `string` | 推理服务档位 `data.model.service_tier` 模型调用使用的推理服务档位。可选值:`auto`、`default`、`fast`。 **speed** `string` | 推理速度档位 `data.model.speed` 模型使用的推理速度档位。可选值:`standard`、`fast`。 **thinking** `string` | 深度思考 `data.model.thinking` 模型的深度思考模式。`auto` 表示由模型决定是否启用深度思考。取值:`enabled` / `disabled` / `auto`。 **multiagent** `object` | 多智能体配置 `data.multiagent` 智能体与子智能体之间的协作配置。 **agents** `object[]` | 子智能体列表 `data.multiagent.agents` 参与协作的子智能体列表。 **type** `string` | 子智能体来源 `data.multiagent.agents.type` 子智能体的来源。`agent` 表示引用已存在的智能体;`self` 表示复用当前智能体配置作为子智能体参与协作。 **id** `string` | 智能体 ID `data.multiagent.agents.id` 被引用智能体的 ID。 **version** `integer` | 智能体版本 `data.multiagent.agents.version` 被引用智能体的版本号。 **type** `string` | 协作模式 `data.multiagent.type` 多智能体协作模式,取值固定为 `coordinator`。当前智能体负责分配任务并汇总子智能体的结果。 **skills** `object[]` | 技能列表 `data.skills` 智能体绑定的技能列表。 **type** `string` | 技能来源 `data.skills.type` 技能来源。 - `ark`:方舟预置技能。 - `skill_hub`:来自 SkillHub 的公共技能。 - `custom`:当前账号通过 Skills API 创建的自定义技能。 **skill_id** `string` | 技能 ID `data.skills.skill_id` 绑定到智能体的技能 ID。 **version** `string` | 技能版本 `data.skills.version` 绑定到智能体的技能版本号。 **system** `string` | 系统提示词 `data.system` 该历史版本中保存了您为智能体配置的系统提示词,用于定义该版本智能体的角色和行为要求。 **tools** `object[]` | 工具列表 `data.tools` 该历史版本中保存了您为智能体配置的工具列表。 **type** `string` | 工具类型 `data.tools.type` 工具类型。 - `agent_toolset_20260916`:使用方舟内置的 `bash`、`edit`、`read`、`write`、`glob`、`grep`、`web_fetch` 和 `web_search` 工具。 - `agent_toolset_multimodal_20260825`:使用 `image_generate`、`video_generate`、`visual_search`、`general_search`、`compose_video` 和 `todo_write` 工具。 - `mcp_toolset`:使用指定 MCP 服务提供的工具。 - `custom`:使用由客户端执行的自定义工具。 可选值:`agent_toolset_20260401`、`agent_toolset_20260701`、`agent_toolset_20260916`、`agent_toolset_multimodal_20260825`、`mcp_toolset`、`custom`。 **configs** `object[]` | 工具配置列表 `data.tools.configs` 按工具名称设置工具的启用状态和权限策略。 **name** `string` | 工具名称 `data.tools.configs.name` 工具配置对应的工具名称。 **enabled** `boolean` | 是否启用 `data.tools.configs.enabled` 是否启用此工具。 **models** `object[]` | 工具模型列表 `data.tools.configs.models` 图片生成或视频生成工具实际绑定模型列表。 **id** `string` | 模型或接入点 ID `data.tools.configs.models.id` 该工具绑定的模型 ID 或推理接入点 ID。 **default** `boolean` | 是否为默认模型 `data.tools.configs.models.default` 是否为该工具的默认模型。 **name** `string` | 模型名称 `data.tools.configs.models.name` 服务端根据模型 ID 或推理接入点 ID 返回的模型名称。 **version** `string` | 模型版本 `data.tools.configs.models.version` 服务端根据模型 ID 或推理接入点 ID 返回的模型版本。 **permission_policy** `object` | 权限策略 `data.tools.configs.permission_policy` 该工具使用的权限策略。 **type** `string` | 策略类型 `data.tools.configs.permission_policy.type` 工具调用许可策略。 * `always_allow`:表示总是允许调用。 * `always_ask`:表示每次使用前需要确认。 **default_config** `object` | 默认工具配置 `data.tools.default_config` 未在 `configs` 中单独配置的工具所使用的默认启用状态和权限策略。 **enabled** `boolean` | 是否启用 `data.tools.default_config.enabled` 是否默认启用未在 `configs` 中单独配置的工具。 * `true`:表示默认启用。 * `false`:表示默认禁用。 **permission_policy** `object` | 权限策略 `data.tools.default_config.permission_policy` 未在 `configs` 中单独配置的工具所使用的默认权限策略。 **type** `string` | 策略类型 `data.tools.default_config.permission_policy.type` 工具调用许可策略。 * `always_allow`:表示总是允许调用。 * `always_ask`:表示每次使用前需要确认。 **description** `string` | 自定义工具描述 `data.tools.description` 说明自定义工具的功能和适用场景,供模型判断何时调用该工具。 **input_schema** `object` | 输入参数定义 `data.tools.input_schema` 返回 Agent 版本中保存的自定义工具输入参数 JSON Schema。 **properties** `object` | 参数属性定义 `data.tools.input_schema.properties` 返回 Agent 版本中保存的 JSON Schema 属性映射。每个键为参数名,每个值为对应参数的 JSON Schema 子对象。 **required** `string[]` | 必填参数名称列表 `data.tools.input_schema.required` 返回调用自定义工具时必须提供的参数名称列表。 **type** `string` | Schema 类型 `data.tools.input_schema.type` 返回 JSON Schema 的顶层类型,固定为 `object`。 **mcp_server_name** `string` | MCP 服务名称 `data.tools.mcp_server_name` MCP 工具所属的 MCP 服务名称。 **name** `string` | 自定义工具名称 `data.tools.name` 自定义工具的名称。 **next_page** `string` | 下一页标识 下一页标识。将该值原样作为下一次请求的 `page` 参数;已到最后一页时不返回该字段。 ## 代码示例 ## 查询智能体版本列表 ### cURL #### Request ```Bash curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/agents//versions?limit=20" \ -H "Authorization: Bearer $ARK_API_KEY" ``` #### Response ``` { "data": [ { "id": "", "type": "agent", "name": "", "model": { "id": "doubao-seed-2-1-pro-260915" }, "system": "你是一个乐于助人的智能助手。", "version": 2, "created_at": "2026-07-15T09:00:00Z", "updated_at": "2026-07-15T09:00:00Z" }, { "id": "", "type": "agent", "name": "", "model": { "id": "doubao-seed-2-1-pro-260915" }, "version": 1, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T08:00:00Z" } ] } ``` ### Python #### Request ```python import os from arkruntime import Ark client = Ark( api_key=os.environ["ARK_API_KEY"], base_url="https://ark.cn-beijing.volces.com/api/v3", ) page = client.agents.list_versions("", limit=20) print(page) ``` #### Response ``` { "data": [ { "id": "", "type": "agent", "name": "", "model": {"id": "doubao-seed-2-1-pro-260915"}, "system": "你是一个乐于助人的智能助手。", "version": 2, "created_at": "2026-07-15T09:00:00Z", "updated_at": "2026-07-15T09:00:00Z" }, { "id": "", "type": "agent", "name": "", "model": {"id": "doubao-seed-2-1-pro-260915"}, "version": 1, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T08:00:00Z" } ] } ``` ### Java #### Request ```java // pom.xml 依赖: // // com.volcengine // ark-runtime // 0.9.0 // import com.volcengine.ark.runtime.models.agent.ListAgentsResponse; import com.volcengine.ark.runtime.service.ArkService; public class Main { public static void main(String[] args) throws Exception { ArkService service = ArkService.builder() .apiKey(System.getenv("ARK_API_KEY")) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); ListAgentsResponse page = service.listAgentVersions("", 20, null); System.out.println(page); service.shutdownExecutor(); } } ``` #### Response ``` { "data": [ { "id": "", "type": "agent", "name": "", "model": { "id": "doubao-seed-2-1-pro-260915" }, "system": "你是一个乐于助人的智能助手。", "version": 2, "created_at": "2026-07-15T09:00:00Z", "updated_at": "2026-07-15T09:00:00Z" }, { "id": "", "type": "agent", "name": "", "model": { "id": "doubao-seed-2-1-pro-260915" }, "version": 1, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T08:00:00Z" } ] } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" agentmodel "github.com/volcengine/ark-runtime-go/arkruntime/model/agent" ) func main() { ctx := context.Background() client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) resp, err := client.ListAgentVersions(ctx, "", &agentmodel.AgentsListVersionsParams{ Limit: agentmodel.NewOptInt32(20), }) if err != nil { panic(err) } fmt.Println(resp) } ``` #### Response ``` { "data": [ { "id": "", "type": "agent", "name": "", "model": { "id": "doubao-seed-2-1-pro-260915" }, "system": "你是一个乐于助人的智能助手。", "version": 2, "created_at": "2026-07-15T09:00:00Z", "updated_at": "2026-07-15T09:00:00Z" }, { "id": "", "type": "agent", "name": "", "model": { "id": "doubao-seed-2-1-pro-260915" }, "version": 1, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T08:00:00Z" } ] } ``` --- # 创建环境 Source: https://ark.volcengine.com/region:cn-beijing/docs/create-environment-api `POST https://ark.cn-beijing.volces.com/api/v3/environments` 创建 Environment,用于配置托管智能体的运行环境。创建成功后,可在创建 Session 时通过返回的 Environment ID 引用该环境。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Body 参数 **config** `object` `必选` | 环境配置 定义 Environment 的运行方式和启动配置。 > **说明** > > * 创建 `cloud` 环境时,必须提供 `networking`,且 `networking.type` 当前只能设为 `unrestricted`。 > * 创建 `self_hosted` 环境时,只能提供 `type`。 **type** `string` `必选` | 环境类型 `config.type` Environment 的运行方式。`cloud` 表示由火山方舟提供运行环境,`self_hosted` 表示由调用方提供运行环境。 **env** `object` | 环境变量 `config.env` Environment 运行时使用的环境变量,以变量名和变量值组成的字符串键值对形式传入。 > **说明** > > 最多包含 64 个键值对,所有键和值合计不超过 32 KiB。键不能为空且不能包含 `=` 或 NUL 字符,值不能包含 NUL 字符。 **networking** `object` | 出网策略 `config.networking` Environment 的出网配置。 **type** `string` `必选` | 出网策略类型 `config.networking.type` Environment 的出网方式。`unrestricted` 表示不限制出网目标。 **packages** `object` | 依赖包配置 `config.packages` Environment 启动时预装的依赖包。 > **说明** > > 每个依赖包名称去除首尾空白后不能为空,不能包含 NUL 字符,也不能以连字符开头。 **apt** `string[]` | apt 包 `config.packages.apt` Environment 启动时通过 apt 预装的系统包。 **cargo** `string[]` | Cargo 包 `config.packages.cargo` Environment 启动时通过 Cargo 预装的 Rust crate。 **gem** `string[]` | gem 包 `config.packages.gem` Environment 启动时通过 RubyGems 预装的 Ruby 包。 **go** `string[]` | go 包 `config.packages.go` Environment 启动时通过 Go 工具链预装的模块依赖。 **npm** `string[]` | npm 包 `config.packages.npm` Environment 启动时通过 npm 预装的 Node.js 包。 **pip** `string[]` | pip 包 `config.packages.pip` Environment 启动时通过 pip 预装的 Python 包。 **type** `string` | 配置类型 `config.packages.type` 依赖包配置的类型标识。 取值固定为 `packages`。 **setup_script** `string` | 启动脚本 `config.setup_script` Environment 启动时执行的初始化脚本。 **tos** `object` | 产物存储配置 `config.tos` 指定智能体产物的持久化存储位置。 > **说明** > > * 省略 `tos` 时,智能体产物存储于火山方舟默认存储。默认存储中的文件仅临时保留,请在平台 TTL 到期前下载;需要长期保存时,配置自己的 TOS Bucket 并自行管理对象生命周期。 > * 配置 `tos` 时,必须同时提供 `bucket` 和 `prefix`。 > * `bucket` 长度为 3~63 字节,仅支持小写字母、数字和连字符,首尾必须是小写字母或数字。 > * `prefix` 最长 512 字节,必须是相对目录,不能包含反斜杠、控制字符、空路径段、`.` 或 `..` 路径段。 > * 保存配置前,服务端会检查 Bucket 与 Prefix 已存在、Bucket 与当前 API 接入地域一致,并且方舟访问该 Bucket 的角色具有读写权限。 > * 配置 `tos` 后,平台从 outputs 目录注册产物时,会以 `{prefix}outputs/{env-id}/{session-id}/` 作为 Files API 写入前缀。最终对象路径以 Files API 响应中的 `tos.object_key` 为准,通常还会包含 `ark_processed/{file_id}/{file_type}/{filename}`。 > * 直接调用 Files API 并传入 `tos[prefix]` 时,不会追加 Environment ID 或 Session ID,但 Files API 仍会在该前缀下生成服务侧处理目录。该规则也不表示 `resources` 中 `type: tos` 的沙箱挂载目录。 **bucket** `string` | TOS 桶 `config.tos.bucket` 存储智能体产物的 TOS Bucket 名称。 **prefix** `string` | 对象前缀 `config.tos.prefix` 智能体产物在 TOS Bucket 内的基础目录前缀。平台注册 outputs 产物时,会以 `{prefix}outputs/{env-id}/{session-id}/` 作为 Files API 写入前缀。 最终对象路径以 Files API 响应中的 `tos.object_key` 为准,通常还会包含 `ark_processed/{file_id}/{file_type}/{filename}`。 **name** `string` `必选` | 环境名称 Environment 的名称,用于在当前项目中识别和管理该环境。 > **说明** > > 名称长度为 3~64 个字符,仅支持小写字母、数字、点、下划线和连字符,且必须以小写字母或数字开头。同一项目内不能重名。 **description** `string` | 环境描述 用于说明 Environment 的用途,最长 300 个字符。 **metadata** `object` | 自定义元数据 用于记录 Environment 的业务属性,以字符串键值对形式传入,便于关联和管理资源。 > **说明** > > 最多包含 16 个键值对。键最长 64 个字符,值最长 512 个字符。 ## 响应参数 **created_at** `string` | 创建时间 Environment 创建时间,采用 RFC 3339 格式的 UTC 时间。 **id** `string` | 环境 ID Environment ID,由服务端生成,以 `env-` 开头。 **name** `string` | 环境名称 Environment 的名称。 **type** `string` | 对象类型 对象类型,固定为 `environment`。 **updated_at** `string` | 更新时间 Environment 最后更新时间,采用 RFC 3339 格式的 UTC 时间。 **config** `object` | 环境配置 Environment 当前生效的运行配置。 **type** `string` | 环境类型 `config.type` Environment 的运行方式。`cloud` 表示由火山方舟提供运行环境,`self_hosted` 表示由调用方提供运行环境。 **env** `object` | 环境变量 `config.env` Environment 运行时使用的环境变量,以字符串键值对形式返回。 **networking** `object` | 出网策略 `config.networking` Environment 当前生效的出网配置。对于 `self_hosted` Environment,服务端固定返回 `type` 为 `unrestricted`。 **type** `string` | 出网策略类型 `config.networking.type` Environment 的出网方式。`unrestricted` 表示不限制出网目标。 **packages** `object` | 依赖包配置 `config.packages` Environment 启动时预装的依赖包。 **apt** `string[]` | apt 包 `config.packages.apt` Environment 启动时通过 apt 预装的系统包。 **cargo** `string[]` | Cargo 包 `config.packages.cargo` Environment 启动时通过 Cargo 预装的 Rust crate。 **gem** `string[]` | gem 包 `config.packages.gem` Environment 启动时通过 RubyGems 预装的 Ruby 包。 **go** `string[]` | go 包 `config.packages.go` Environment 启动时通过 Go 工具链预装的模块依赖。 **npm** `string[]` | npm 包 `config.packages.npm` Environment 启动时通过 npm 预装的 Node.js 包。 **pip** `string[]` | pip 包 `config.packages.pip` Environment 启动时通过 pip 预装的 Python 包。 **type** `string` | 配置类型 `config.packages.type` 依赖包配置的类型标识。 取值固定为 `packages`。 **setup_script** `string` | 启动脚本 `config.setup_script` Environment 启动时执行的初始化脚本。 **tos** `object` | 产物存储配置 `config.tos` 智能体产物的持久化存储位置。 **bucket** `string` | TOS 桶 `config.tos.bucket` 存储智能体产物的 TOS Bucket 名称。 **prefix** `string` | 对象前缀 `config.tos.prefix` 智能体产物在 TOS Bucket 内的基础目录前缀。平台注册 outputs 产物时,会以 `{prefix}outputs/{env-id}/{session-id}/` 作为 Files API 写入前缀。 最终对象路径以 Files API 响应中的 `tos.object_key` 为准,通常还会包含 `ark_processed/{file_id}/{file_type}/{filename}`。 **description** `string` | 环境描述 Environment 的用途说明。 **metadata** `object` | 自定义元数据 Environment 的自定义业务属性,以字符串键值对形式返回。 ## 代码示例 ## 创建环境 ### cURL #### Request ```Bash curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/environments" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d @- <<'EOF' { "name": "", "config": { "type": "cloud", "networking": { "type": "unrestricted" }, "packages": { "pip": ["pandas"], "apt": ["curl"] }, "env": { "MY_KEY_0": "value_0" } } } EOF ``` #### Response ``` { "id": "env-example", "type": "environment", "name": "", "config": { "type": "cloud", "networking": {"type": "unrestricted"}, "packages": {"pip": ["pandas"], "apt": ["curl"]}, "env": {"MY_KEY_0": "value_0"} }, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T08:00:00Z" } ``` ### Python #### Request ```python import os from arkruntime import Ark client = Ark( api_key=os.environ["ARK_API_KEY"], base_url="https://ark.cn-beijing.volces.com/api/v3", ) environment = client.environments.create( name="", config={ "type": "cloud", "networking": {"type": "unrestricted"}, "packages": {"pip": ["pandas"], "apt": ["curl"]}, "env": {"MY_KEY_0": "value_0"}, }, ) print(environment) ``` #### Response ``` { "id": "env-example", "type": "environment", "name": "", "config": { "type": "cloud", "networking": {"type": "unrestricted"}, "packages": {"pip": ["pandas"], "apt": ["curl"]}, "env": {"MY_KEY_0": "value_0"} }, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T08:00:00Z" } ``` ### Java #### Request ```java // pom.xml 依赖: // // com.volcengine // ark-runtime // 0.9.0 // import com.volcengine.ark.runtime.models.environment.CreateEnvironmentRequest; import com.volcengine.ark.runtime.models.environment.EnvConfig; import com.volcengine.ark.runtime.models.environment.EnvConfigType; import com.volcengine.ark.runtime.models.environment.Environment; import com.volcengine.ark.runtime.models.environment.NetworkingConfig; import com.volcengine.ark.runtime.models.environment.NetworkingType; import com.volcengine.ark.runtime.models.environment.PackagesConfig; import com.volcengine.ark.runtime.service.ArkService; import java.util.Arrays; import java.util.Collections; public class Main { public static void main(String[] args) throws Exception { ArkService service = ArkService.builder() .apiKey(System.getenv("ARK_API_KEY")) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); Environment env = service.createEnvironment( CreateEnvironmentRequest.builder() .name("") .config(EnvConfig.builder() .type(EnvConfigType.CLOUD) .networking(NetworkingConfig.builder() .type(NetworkingType.UNRESTRICTED) .build()) .packages(PackagesConfig.builder() .pip(Arrays.asList("pandas")) .apt(Arrays.asList("curl")) .build()) .env(Collections.singletonMap("MY_KEY_0", "value_0")) .build()) .build()); System.out.println(env); service.shutdownExecutor(); } } ``` #### Response ``` { "id": "env-example", "type": "environment", "name": "", "config": { "type": "cloud", "networking": {"type": "unrestricted"}, "packages": {"pip": ["pandas"], "apt": ["curl"]}, "env": {"MY_KEY_0": "value_0"} }, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T08:00:00Z" } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" envmodel "github.com/volcengine/ark-runtime-go/arkruntime/model/environment" ) func main() { ctx := context.Background() client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) env, err := client.CreateEnvironment(ctx, &envmodel.CreateEnvironmentRequest{ Name: "", Config: envmodel.NewOptEnvConfig(envmodel.EnvConfig{ Type: envmodel.EnvConfigTypeCloud, Networking: envmodel.NewOptNetworkingConfig(envmodel.NetworkingConfig{ Type: envmodel.NetworkingTypeUnrestricted, }), Packages: envmodel.NewOptPackagesConfig(envmodel.PackagesConfig{ Pip: []string{"pandas"}, Apt: []string{"curl"}, }), Env: envmodel.NewOptEnvConfigEnv(envmodel.EnvConfigEnv{"MY_KEY_0": "value_0"}), }), }) if err != nil { panic(err) } fmt.Println(env) } ``` #### Response ``` { "id": "env-example", "type": "environment", "name": "", "config": { "type": "cloud", "networking": {"type": "unrestricted"}, "packages": {"pip": ["pandas"], "apt": ["curl"]}, "env": {"MY_KEY_0": "value_0"} }, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T08:00:00Z" } ``` --- # 查询环境列表 Source: https://ark.volcengine.com/region:cn-beijing/docs/list-environments-api `GET https://ark.cn-beijing.volces.com/api/v3/environments` 查询当前项目下可用的 Environment 列表。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Query 参数 > 在 URL Query String 中传入。 **limit** `integer` `默认值 20` | 每页数量 控制单次请求返回的 Environment 数量。 **取值范围**:`[1, 100]` **page** `string` | 下一页标识 用于继续查询下一页。首次请求省略;后续请求原样传入上一次响应的 `next_page`。 > **说明** > > 不要解析或自行构造下一页标识。 ## 响应参数 **data** `object[]` | 环境列表 本次请求返回的 Environment 列表,服务端按创建时间降序排列。 > **说明** > > 当前项目中没有 Environment 时,返回空数组。 **created_at** `string` | 创建时间 `data.created_at` Environment 创建时间,采用 RFC 3339 格式的 UTC 时间。 **id** `string` | 环境 ID `data.id` Environment ID,由服务端生成,以 `env-` 开头。 **name** `string` | 环境名称 `data.name` Environment 的名称。 **type** `string` | 对象类型 `data.type` 对象类型,固定为 `environment`。 **updated_at** `string` | 更新时间 `data.updated_at` Environment 最后更新时间,采用 RFC 3339 格式的 UTC 时间。 **config** `object` | 环境配置 `data.config` Environment 当前生效的运行配置。 **type** `string` | 环境类型 `data.config.type` Environment 的运行方式。`cloud` 表示由火山方舟提供运行环境,`self_hosted` 表示由调用方提供运行环境。 **env** `object` | 环境变量 `data.config.env` Environment 运行时使用的环境变量,以字符串键值对形式返回。 **networking** `object` | 出网策略 `data.config.networking` Environment 当前生效的出网配置。对于 `self_hosted` Environment,服务端固定返回 `type` 为 `unrestricted`。 **type** `string` | 出网策略类型 `data.config.networking.type` Environment 的出网方式。`unrestricted` 表示不限制出网目标。 **packages** `object` | 依赖包配置 `data.config.packages` Environment 启动时预装的依赖包。 **apt** `string[]` | apt 包 `data.config.packages.apt` Environment 启动时通过 apt 预装的系统包。 **cargo** `string[]` | Cargo 包 `data.config.packages.cargo` Environment 启动时通过 Cargo 预装的 Rust crate。 **gem** `string[]` | gem 包 `data.config.packages.gem` Environment 启动时通过 RubyGems 预装的 Ruby 包。 **go** `string[]` | go 包 `data.config.packages.go` Environment 启动时通过 Go 工具链预装的模块依赖。 **npm** `string[]` | npm 包 `data.config.packages.npm` Environment 启动时通过 npm 预装的 Node.js 包。 **pip** `string[]` | pip 包 `data.config.packages.pip` Environment 启动时通过 pip 预装的 Python 包。 **type** `string` | 配置类型 `data.config.packages.type` 依赖包配置的类型标识。 取值固定为 `packages`。 **setup_script** `string` | 启动脚本 `data.config.setup_script` Environment 启动时执行的初始化脚本。 **tos** `object` | 产物存储配置 `data.config.tos` 智能体产物的持久化存储位置。 **bucket** `string` | TOS 桶 `data.config.tos.bucket` 存储智能体产物的 TOS Bucket 名称。 **prefix** `string` | 对象前缀 `data.config.tos.prefix` 智能体产物在 TOS Bucket 内的基础目录前缀。平台注册 outputs 产物时,会以 `{prefix}outputs/{env-id}/{session-id}/` 作为 Files API 写入前缀。 最终对象路径以 Files API 响应中的 `tos.object_key` 为准,通常还会包含 `ark_processed/{file_id}/{file_type}/{filename}`。 **description** `string` | 环境描述 `data.description` Environment 的用途说明。 **metadata** `object` | 自定义元数据 `data.metadata` Environment 的自定义业务属性,以字符串键值对形式返回。 **next_page** `string` | 下一页标识 下一页标识。无更多数据时不返回该字段。 ## 代码示例 ## 查询环境列表 ### cURL #### Request ```Bash curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/environments?limit=20" \ -H "Authorization: Bearer $ARK_API_KEY" ``` #### Response ``` { "data": [ { "id": "env-example", "type": "environment", "name": "", "config": { "type": "cloud", "networking": {"type": "unrestricted"}, "packages": {"pip": ["pandas"]} }, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T08:00:00Z" } ], "next_page": "next-page-example" } ``` #### 查询下一页 将上一页响应中的 `next_page` 原样作为 `page` 传入: ```Bash curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/environments?limit=20&page=" \ -H "Authorization: Bearer $ARK_API_KEY" ``` ### Python #### Request ```python import os from arkruntime import Ark client = Ark( api_key=os.environ["ARK_API_KEY"], base_url="https://ark.cn-beijing.volces.com/api/v3", ) page = client.environments.list(limit=20) print(page) ``` #### Response ``` { "data": [ { "id": "env-example", "type": "environment", "name": "", "config": { "type": "cloud", "networking": {"type": "unrestricted"}, "packages": {"pip": ["pandas"]} }, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T08:00:00Z" } ], "next_page": "next-page-example" } ``` ### Java #### Request ```java // pom.xml 依赖: // // com.volcengine // ark-runtime // 0.9.0 // import com.volcengine.ark.runtime.models.environment.ListEnvironmentsResponse; import com.volcengine.ark.runtime.service.ArkService; public class Main { public static void main(String[] args) throws Exception { ArkService service = ArkService.builder() .apiKey(System.getenv("ARK_API_KEY")) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); ListEnvironmentsResponse page = service.listEnvironments(20, null); System.out.println(page); service.shutdownExecutor(); } } ``` #### Response ``` { "data": [ { "id": "env-example", "type": "environment", "name": "", "config": { "type": "cloud", "networking": {"type": "unrestricted"}, "packages": {"pip": ["pandas"]} }, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T08:00:00Z" } ], "next_page": "next-page-example" } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" envmodel "github.com/volcengine/ark-runtime-go/arkruntime/model/environment" ) func main() { ctx := context.Background() client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) resp, err := client.ListEnvironments(ctx, &envmodel.EnvironmentsListParams{ Limit: envmodel.NewOptInt32(20), }) if err != nil { panic(err) } fmt.Println(resp) } ``` #### Response ``` { "data": [ { "id": "env-example", "type": "environment", "name": "", "config": { "type": "cloud", "networking": {"type": "unrestricted"}, "packages": {"pip": ["pandas"]} }, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T08:00:00Z" } ], "next_page": "next-page-example" } ``` --- # 查询环境详情 Source: https://ark.volcengine.com/region:cn-beijing/docs/get-environment-api `GET https://ark.cn-beijing.volces.com/api/v3/environments/{environment_id}` 查询当前项目中指定 Environment 的详细信息。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **environment_id** `string` `必选` | 环境 ID 要查询的 Environment ID,以 `env-` 开头。可从创建环境或查询环境列表接口的响应中获取。 > **说明** > > 本接口仅查询当前 API Key 所属项目中的 Environment。其他项目的 ID 与不存在的 ID 均返回 HTTP 404 `InvalidEnvironment.NotFound`。 ## 响应参数 **created_at** `string` | 创建时间 Environment 创建时间,采用 RFC 3339 格式的 UTC 时间。 **id** `string` | 环境 ID Environment ID,由服务端生成,以 `env-` 开头。 **name** `string` | 环境名称 Environment 的名称。 **type** `string` | 对象类型 对象类型,固定为 `environment`。 **updated_at** `string` | 更新时间 Environment 最后更新时间,采用 RFC 3339 格式的 UTC 时间。 **config** `object` | 环境配置 Environment 当前生效的运行配置。 **type** `string` | 环境类型 `config.type` Environment 的运行方式。`cloud` 表示由火山方舟提供运行环境,`self_hosted` 表示由调用方提供运行环境。 **env** `object` | 环境变量 `config.env` Environment 运行时使用的环境变量,以字符串键值对形式返回。 **networking** `object` | 出网策略 `config.networking` Environment 当前生效的出网配置。对于 `self_hosted` Environment,服务端固定返回 `type` 为 `unrestricted`。 **type** `string` | 出网策略类型 `config.networking.type` Environment 的出网方式。`unrestricted` 表示不限制出网目标。 **packages** `object` | 依赖包配置 `config.packages` Environment 启动时预装的依赖包。 **apt** `string[]` | apt 包 `config.packages.apt` Environment 启动时通过 apt 预装的系统包。 **cargo** `string[]` | Cargo 包 `config.packages.cargo` Environment 启动时通过 Cargo 预装的 Rust crate。 **gem** `string[]` | gem 包 `config.packages.gem` Environment 启动时通过 RubyGems 预装的 Ruby 包。 **go** `string[]` | go 包 `config.packages.go` Environment 启动时通过 Go 工具链预装的模块依赖。 **npm** `string[]` | npm 包 `config.packages.npm` Environment 启动时通过 npm 预装的 Node.js 包。 **pip** `string[]` | pip 包 `config.packages.pip` Environment 启动时通过 pip 预装的 Python 包。 **type** `string` | 配置类型 `config.packages.type` 依赖包配置的类型标识。 取值固定为 `packages`。 **setup_script** `string` | 启动脚本 `config.setup_script` Environment 启动时执行的初始化脚本。 **tos** `object` | 产物存储配置 `config.tos` 智能体产物的持久化存储位置。 **bucket** `string` | TOS 桶 `config.tos.bucket` 存储智能体产物的 TOS Bucket 名称。 **prefix** `string` | 对象前缀 `config.tos.prefix` 智能体产物在 TOS Bucket 内的基础目录前缀。平台注册 outputs 产物时,会以 `{prefix}outputs/{env-id}/{session-id}/` 作为 Files API 写入前缀。 最终对象路径以 Files API 响应中的 `tos.object_key` 为准,通常还会包含 `ark_processed/{file_id}/{file_type}/{filename}`。 **description** `string` | 环境描述 Environment 的用途说明。 **metadata** `object` | 自定义元数据 Environment 的自定义业务属性,以字符串键值对形式返回。 ## 代码示例 ## 查询环境详情 ### cURL #### Request ```Bash curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/environments/" \ -H "Authorization: Bearer $ARK_API_KEY" ``` #### Response ``` { "id": "env-example", "type": "environment", "name": "", "config": { "type": "cloud", "networking": {"type": "unrestricted"}, "packages": {"pip": ["pandas"], "apt": ["curl"]}, "env": {"MY_KEY_0": "value_0"} }, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T08:00:00Z" } ``` ### Python #### Request ```python import os from arkruntime import Ark client = Ark( api_key=os.environ["ARK_API_KEY"], base_url="https://ark.cn-beijing.volces.com/api/v3", ) environment = client.environments.retrieve("") print(environment) ``` #### Response ``` { "id": "env-example", "type": "environment", "name": "", "config": { "type": "cloud", "networking": {"type": "unrestricted"}, "packages": {"pip": ["pandas"], "apt": ["curl"]}, "env": {"MY_KEY_0": "value_0"} }, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T08:00:00Z" } ``` ### Java #### Request ```java // pom.xml 依赖: // // com.volcengine // ark-runtime // 0.9.0 // import com.volcengine.ark.runtime.models.environment.Environment; import com.volcengine.ark.runtime.service.ArkService; public class Main { public static void main(String[] args) throws Exception { ArkService service = ArkService.builder() .apiKey(System.getenv("ARK_API_KEY")) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); Environment env = service.getEnvironment(""); System.out.println(env); service.shutdownExecutor(); } } ``` #### Response ``` { "id": "env-example", "type": "environment", "name": "", "config": { "type": "cloud", "networking": {"type": "unrestricted"}, "packages": {"pip": ["pandas"], "apt": ["curl"]}, "env": {"MY_KEY_0": "value_0"} }, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T08:00:00Z" } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" ) func main() { ctx := context.Background() client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) env, err := client.GetEnvironment(ctx, "") if err != nil { panic(err) } fmt.Println(env) } ``` #### Response ``` { "id": "env-example", "type": "environment", "name": "", "config": { "type": "cloud", "networking": {"type": "unrestricted"}, "packages": {"pip": ["pandas"], "apt": ["curl"]}, "env": {"MY_KEY_0": "value_0"} }, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T08:00:00Z" } ``` --- # 更新环境 Source: https://ark.volcengine.com/region:cn-beijing/docs/update-environment-api `POST https://ark.cn-beijing.volces.com/api/v3/environments/{environment_id}` 更新指定 Environment 的描述、运行配置或自定义元数据。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **environment_id** `string` `必选` | 环境 ID 要更新的 Environment ID,以 `env-` 开头。可从创建环境或查询环境列表接口的响应中获取。 ### Body 参数 **config** `object` | 环境配置 指定需要更新的 Environment 运行配置。 > **说明** > > * 省略整个 `config` 或传 `null` 时,不修改 Environment 的运行配置。 > * `self_hosted` Environment 不支持修改运行时配置。 **env** `object` | 环境变量 `config.env` Environment 运行时使用的环境变量,以变量名和变量值组成的字符串键值对形式传入。 > **说明** > > * 省略或传 `null` 时保留原有环境变量;传入对象时整体替换现有 `env` 映射,传入空对象 `{}` 时清空环境变量。 > * 最多包含 64 个键值对,所有键和值合计不超过 32 KiB。键不能为空且不能包含 `=` 或 NUL 字符,值不能包含 NUL 字符。 **networking** `object` | 出网策略 `config.networking` Environment 的出网配置。 > **说明** > > 省略或传 `null` 时保留原有出网策略;传入对象时整体替换现有 `networking` 配置。 **type** `string` `必选` | 出网策略类型 `config.networking.type` Environment 的出网方式。`unrestricted` 表示不限制出网目标。 **packages** `object` | 依赖包配置 `config.packages` Environment 启动时预装的依赖包。 > **说明** > > * 省略或传 `null` 时保留原有依赖包配置;传入对象时整体替换现有 `packages` 配置;传入空对象 `{}` 时清空全部依赖包配置。 > * 需要追加依赖时,先读取现有配置,在本地合并后完整传入。 > * 每个依赖包名称去除首尾空白后不能为空,不能包含 NUL 字符,也不能以连字符开头。 **apt** `string[]` | apt 包 `config.packages.apt` Environment 启动时通过 apt 预装的系统包。 **cargo** `string[]` | Cargo 包 `config.packages.cargo` Environment 启动时通过 Cargo 预装的 Rust crate。 **gem** `string[]` | gem 包 `config.packages.gem` Environment 启动时通过 RubyGems 预装的 Ruby 包。 **go** `string[]` | go 包 `config.packages.go` Environment 启动时通过 Go 工具链预装的模块依赖。 **npm** `string[]` | npm 包 `config.packages.npm` Environment 启动时通过 npm 预装的 Node.js 包。 **pip** `string[]` | pip 包 `config.packages.pip` Environment 启动时通过 pip 预装的 Python 包。 **type** `string` | 配置类型 `config.packages.type` 依赖包配置的类型标识。 取值固定为 `packages`。 **setup_script** `string` | 启动脚本 `config.setup_script` Environment 启动时执行的初始化脚本。 > **说明** > > 省略或传 `null` 时保留原有启动脚本;传入字符串时替换原值,传入空字符串 `""` 时清空。 **tos** `object` | 产物存储配置 `config.tos` 指定智能体产物的持久化存储位置。 > **说明** > > - 省略或传 `null` 时保留原有产物存储配置。 > - 显式传入时整体替换现有 `tos` 配置,并且必须同时提供 `bucket` 和 `prefix`;空对象 `{}` 或仅提供一个字段会被拒绝。 > - `bucket` 长度为 3~63 字节,仅支持小写字母、数字和连字符,首尾必须是小写字母或数字。 > - `prefix` 最长 512 字节,必须是相对目录,不能包含反斜杠、控制字符、空路径段、`.` 或 `..` 路径段。 > - 保存配置前,服务端会检查 Bucket 与 Prefix 已存在、Bucket 与当前 API 接入地域一致,并且方舟访问该 Bucket 的角色具有读写权限。 > - 更新 Environment 只影响之后创建的 Session,已有 Session 继续使用创建时保存的 Environment 配置。 **bucket** `string` | TOS 桶 `config.tos.bucket` 存储智能体产物的 TOS Bucket 名称。 **prefix** `string` | 对象前缀 `config.tos.prefix` 智能体产物在 TOS Bucket 内的基础目录前缀。平台注册 outputs 产物时,会以 `{prefix}outputs/{env-id}/{session-id}/` 作为 Files API 写入前缀。 最终对象路径以 Files API 响应中的 `tos.object_key` 为准,通常还会包含 `ark_processed/{file_id}/{file_type}/{filename}`。 **type** `string` | 环境类型 `config.type` Environment 的运行方式。`cloud` 表示由火山方舟提供运行环境,`self_hosted` 表示由调用方提供运行环境。 > **说明** > > 省略或传 `null` 时保留当前类型。提供时必须设为 `cloud` 或 `self_hosted`,服务端会按合并后的类型校验完整配置。 **description** `string` | 环境描述 用于说明 Environment 的用途,最长 300 个字符。省略或传 `null` 时保留原值,传空字符串 `""` 时清空。 **metadata** `object` | 自定义元数据 用于记录 Environment 的业务属性,以字符串键值对形式传入,便于关联和管理资源。 > **说明** > > * 省略、传 `null` 或传空对象 `{}` 时,不修改自定义元数据。 > * 按键更新:非空值用于新增或覆盖,空字符串用于删除对应键。更新后最多包含 16 个键值对,键最长 64 个字符,值最长 512 个字符。 **name** `string` | 环境名称 Environment 的名称。该字段仅用于兼容回传当前值;Environment 名称创建后不可修改,传入不同名称时服务端返回 HTTP 409 `Conflict`。 ## 响应参数 **created_at** `string` | 创建时间 Environment 创建时间,采用 RFC 3339 格式的 UTC 时间。 **id** `string` | 环境 ID Environment ID,由服务端生成,以 `env-` 开头。 **name** `string` | 环境名称 Environment 的名称。 **type** `string` | 对象类型 对象类型,固定为 `environment`。 **updated_at** `string` | 更新时间 Environment 最后更新时间,采用 RFC 3339 格式的 UTC 时间。 **config** `object` | 环境配置 Environment 当前生效的运行配置。 **type** `string` | 环境类型 `config.type` Environment 的运行方式。`cloud` 表示由火山方舟提供运行环境,`self_hosted` 表示由调用方提供运行环境。 **env** `object` | 环境变量 `config.env` Environment 运行时使用的环境变量,以字符串键值对形式返回。 **networking** `object` | 出网策略 `config.networking` Environment 当前生效的出网配置。对于 `self_hosted` Environment,服务端固定返回 `type` 为 `unrestricted`。 **type** `string` | 出网策略类型 `config.networking.type` Environment 的出网方式。`unrestricted` 表示不限制出网目标。 **packages** `object` | 依赖包配置 `config.packages` Environment 启动时预装的依赖包。 **apt** `string[]` | apt 包 `config.packages.apt` Environment 启动时通过 apt 预装的系统包。 **cargo** `string[]` | Cargo 包 `config.packages.cargo` Environment 启动时通过 Cargo 预装的 Rust crate。 **gem** `string[]` | gem 包 `config.packages.gem` Environment 启动时通过 RubyGems 预装的 Ruby 包。 **go** `string[]` | go 包 `config.packages.go` Environment 启动时通过 Go 工具链预装的模块依赖。 **npm** `string[]` | npm 包 `config.packages.npm` Environment 启动时通过 npm 预装的 Node.js 包。 **pip** `string[]` | pip 包 `config.packages.pip` Environment 启动时通过 pip 预装的 Python 包。 **type** `string` | 配置类型 `config.packages.type` 依赖包配置的类型标识。 取值固定为 `packages`。 **setup_script** `string` | 启动脚本 `config.setup_script` Environment 启动时执行的初始化脚本。 **tos** `object` | 产物存储配置 `config.tos` 智能体产物的持久化存储位置。 **bucket** `string` | TOS 桶 `config.tos.bucket` 存储智能体产物的 TOS Bucket 名称。 **prefix** `string` | 对象前缀 `config.tos.prefix` 智能体产物在 TOS Bucket 内的基础目录前缀。平台注册 outputs 产物时,会以 `{prefix}outputs/{env-id}/{session-id}/` 作为 Files API 写入前缀。 最终对象路径以 Files API 响应中的 `tos.object_key` 为准,通常还会包含 `ark_processed/{file_id}/{file_type}/{filename}`。 **description** `string` | 环境描述 Environment 的用途说明。 **metadata** `object` | 自定义元数据 Environment 的自定义业务属性,以字符串键值对形式返回。 ## 代码示例 ## 更新环境 ### cURL #### Request ```Bash curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/environments/" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d @- <<'EOF' { "description": "预装 pandas 与 numpy 的通用数据分析环境", "config": { "packages": { "pip": ["pandas", "numpy"] } } } EOF ``` #### Response ``` { "id": "env-example", "type": "environment", "name": "", "description": "预装 pandas 与 numpy 的通用数据分析环境", "config": { "type": "cloud", "networking": {"type": "unrestricted"}, "packages": {"pip": ["pandas", "numpy"]} }, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T09:00:00Z" } ``` ### Python #### Request ```python import os from arkruntime import Ark client = Ark( api_key=os.environ["ARK_API_KEY"], base_url="https://ark.cn-beijing.volces.com/api/v3", ) environment = client.environments.update( "", description="预装 pandas 与 numpy 的通用数据分析环境", config={"packages": {"pip": ["pandas", "numpy"]}}, ) print(environment) ``` #### Response ``` { "id": "env-example", "type": "environment", "name": "", "description": "预装 pandas 与 numpy 的通用数据分析环境", "config": { "type": "cloud", "networking": {"type": "unrestricted"}, "packages": {"pip": ["pandas", "numpy"]} }, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T09:00:00Z" } ``` ### Java #### Request ```java // pom.xml 依赖: // // com.volcengine // ark-runtime // 0.9.0 // import com.volcengine.ark.runtime.models.environment.EnvConfig; import com.volcengine.ark.runtime.models.environment.Environment; import com.volcengine.ark.runtime.models.environment.PackagesConfig; import com.volcengine.ark.runtime.models.environment.UpdateEnvironmentRequest; import com.volcengine.ark.runtime.service.ArkService; import java.util.Arrays; public class Main { public static void main(String[] args) throws Exception { ArkService service = ArkService.builder() .apiKey(System.getenv("ARK_API_KEY")) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); Environment env = service.updateEnvironment( "", UpdateEnvironmentRequest.builder() .description("预装 pandas 与 numpy 的通用数据分析环境") .config(EnvConfig.builder() .packages(PackagesConfig.builder() .pip(Arrays.asList("pandas", "numpy")) .build()) .build()) .build()); System.out.println(env); service.shutdownExecutor(); } } ``` #### Response ``` { "id": "env-example", "type": "environment", "name": "", "description": "预装 pandas 与 numpy 的通用数据分析环境", "config": { "type": "cloud", "networking": {"type": "unrestricted"}, "packages": {"pip": ["pandas", "numpy"]} }, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T09:00:00Z" } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" envmodel "github.com/volcengine/ark-runtime-go/arkruntime/model/environment" ) func main() { ctx := context.Background() client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) env, err := client.UpdateEnvironment(ctx, "", &envmodel.UpdateEnvironmentRequest{ Description: envmodel.NewOptString("预装 pandas 与 numpy 的通用数据分析环境"), Config: envmodel.NewOptEnvConfig(envmodel.EnvConfig{ Packages: envmodel.NewOptPackagesConfig(envmodel.PackagesConfig{ Pip: []string{"pandas", "numpy"}, }), }), }) if err != nil { panic(err) } fmt.Println(env) } ``` #### Response ``` { "id": "env-example", "type": "environment", "name": "", "description": "预装 pandas 与 numpy 的通用数据分析环境", "config": { "type": "cloud", "networking": {"type": "unrestricted"}, "packages": {"pip": ["pandas", "numpy"]} }, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T09:00:00Z" } ``` --- # 删除环境 Source: https://ark.volcengine.com/region:cn-beijing/docs/delete-environment-api `DELETE https://ark.cn-beijing.volces.com/api/v3/environments/{environment_id}` 永久删除当前项目中指定的 Environment。 > **注意:删除条件** > > 当 Environment 仍被 `idle` 或 `running` 状态的 Session 使用时,服务端返回 HTTP 400 `InvalidAction`。先结束相关 Session,再删除 Environment。 > > 删除操作不可撤销。重复删除已不存在的 Environment 会返回 HTTP 404 `InvalidEnvironment.NotFound`;超时重试时,可将该结果视为资源已经删除。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **environment_id** `string` `必选` | 环境 ID 要删除的 Environment ID,以 `env-` 开头。可从创建环境或查询环境列表接口的响应中获取。 ## 响应参数 **id** `string` | 环境 ID 已删除的 Environment ID,以 `env-` 开头,与路径参数中的值相同。 **type** `string` | 对象类型 对象类型,固定为 `environment_deleted`。 ## 代码示例 ## 删除环境 ### cURL #### Request ```Bash curl -sS --fail-with-body -X DELETE "https://ark.cn-beijing.volces.com/api/v3/environments/" \ -H "Authorization: Bearer $ARK_API_KEY" ``` #### Response ``` { "id": "env-example", "type": "environment_deleted" } ``` ### Python #### Request ```python import os from arkruntime import Ark client = Ark( api_key=os.environ["ARK_API_KEY"], base_url="https://ark.cn-beijing.volces.com/api/v3", ) response = client.environments.delete("") print(response) ``` #### Response ``` { "id": "env-example", "type": "environment_deleted" } ``` ### Java #### Request ```java // pom.xml 依赖: // // com.volcengine // ark-runtime // 0.9.0 // import com.volcengine.ark.runtime.service.ArkService; public class Main { public static void main(String[] args) throws Exception { ArkService service = ArkService.builder() .apiKey(System.getenv("ARK_API_KEY")) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); Object response = service.deleteEnvironment(""); System.out.println(response); service.shutdownExecutor(); } } ``` #### Response ``` { "id": "env-example", "type": "environment_deleted" } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" ) func main() { ctx := context.Background() client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) response, err := client.DeleteEnvironment(ctx, "") if err != nil { panic(err) } fmt.Println(response) } ``` #### Response ``` { "id": "env-example", "type": "environment_deleted" } ``` --- # 长轮询拉取待执行 Work Source: https://ark.volcengine.com/region:cn-beijing/docs/poll-work-api `GET https://ark.cn-beijing.volces.com/api/v3/environments/{environment_id}/work/poll` 自托管 Worker 按以下顺序处理 Work: 1. 拉取待执行 Work。 2. 调用认领 Work 接口。 3. 执行期间定期续租 Work。 4. 完成或终止任务时停止 Work。 本接口负责长轮询拉取待执行 Work: - 命中时,返回仍为 `queued` 的 Work。 - 未命中、长轮询到期或请求在等待期间结束时,返回 HTTP 200 和空对象 `{}`。 - 客户端根据响应中是否存在 `id` 判断是否获取到 Work。 拉取到 Work 仅表示临时获取。请立即调用认领 Work 接口。 超过认领超时阈值(`reclaim_older_than_ms`)仍未认领时,该 Work 可被其他 Worker 再次获取。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **environment_id** `string` `必选` | 环境 ID 要操作的 Environment ID,以 `env-` 开头。填写创建环境或查询环境列表接口取得的 ID。 ### Query 参数 > 在 URL Query String 中传入。 **block_ms** `integer` `默认值 0` | 长轮询等待时间 没有可分配 Work 时服务端继续等待的最长时间,单位为毫秒;省略或传非正数时不等待,无 Work 则返回 HTTP 200 和空对象 `{}`。取值 1~999,大于 999 按 999 处理。 **reclaim_older_than_ms** `integer` `默认值 5000` | 认领超时阈值 拉取 Work 后等待完成认领的时长,单位为毫秒;超时未认领时,其他 Worker 可再次获取该 Work。 > **说明** > > 省略或传入非正数时,服务端按 5000 毫秒计算认领超时。 ### Header 参数 > 在 HTTP 请求头中传入。 **Ark-Worker-ID** `string` | Worker 实例 ID 发起本次 Work 拉取请求的 Worker 实例 ID。认领完成前,同一 ID 再次发起请求时,服务端会优先返回此前获取的 Work。 > **说明** > > 非空值还用于统计 `workers_polling`。建议每个 Worker 实例使用一个稳定值;省略或传空字符串仍可获取 Work,但重复拉取 Work 不会被识别为同一 Worker,活跃 Worker 数也可能低于实际值。 ## 响应参数 **acknowledged_at** `string` | 认领时间 Work 被 Worker 成功认领的时间,格式为 RFC 3339;尚未认领时不返回该字段。 **created_at** `string` | 创建时间 服务端创建 Work 时记录的时间,格式为 RFC 3339。 **data** `object` | 工作载荷 Work 对应的 Session 信息。 **id** `string` | Session ID `data.id` Work 对应的 Session ID,可用于调用 Session 相关接口。 **type** `string` | 载荷类型 `data.type` 当前固定为 `session`,表示 `data.id` 指向一个 Session。 **environment_id** `string` | 环境 ID Work 所属的环境 ID,以 `env-` 开头。 **id** `string` | Work 标识符 Work ID,以 `sesn-` 开头。 **latest_heartbeat_at** `string` | 最近心跳时间 服务端最近一次接受 Work 心跳的时间,格式为 RFC 3339;尚未收到心跳时不返回该字段。 **started_at** `string` | 开始时间 Work 开始执行的时间,格式为 RFC 3339;尚未开始执行时不返回该字段。 **state** `string` | 当前状态 命中 Work 时固定为 `queued`,表示该 Work 正在等待完成认领。 **stop_requested_at** `string` | 停止请求时间 服务端首次处理停止 Work 请求的时间,格式为 RFC 3339。未调用停止 Work 接口,或 Work 因心跳租约超时停止时,不返回该字段。 **stopped_at** `string` | 停止时间 Work 进入 `stopped` 状态的时间,格式为 RFC 3339;尚未停止时不返回该字段。 **tags** `object[]` | 资源标签 与当前 Work 关联的资源标签列表。 **key** `string` | 标签键 `tags.key` 资源标签的键,用于标识当前 Work 关联的标签。 **value** `string` | 标签值 `tags.value` 资源标签的值,用于描述当前 Work 在该标签键下的取值;未设置值时不返回该字段。 **type** `string` | 对象类型 类型标识,固定为 `work`。 **updated_at** `string` | 更新时间 Work 最近一次状态迁移的时间,格式为 RFC 3339。 ## 代码示例 ## 长轮询拉取待执行 Work ### cURL #### Request ```bash curl -sS --fail-with-body \ "https://ark.cn-beijing.volces.com/api/v3/environments//work/poll?block_ms=999&reclaim_older_than_ms=5000" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Ark-Worker-ID: worker-01" ``` #### Response ``` { "id": "", "environment_id": "", "state": "queued", "type": "work", "data": { "id": "", "type": "session" }, "created_at": "2026-10-19T08:30:00Z", "updated_at": "2026-10-19T08:30:00Z" } ``` --- # 认领 Work Source: https://ark.volcengine.com/region:cn-beijing/docs/acknowledge-work-api `POST https://ark.cn-beijing.volces.com/api/v3/environments/{environment_id}/work/{work_id}/ack` 向服务端确认由当前 Worker 执行拉取 Work 接口返回的 Work。认领成功后,Work 状态从 `queued` 更新为 `starting`,并且不会再分配给其他 Worker。 认领 Work 时,请注意: - 只有 `queued` 状态的 Work 可以被认领。 - 多个 Worker 并发认领同一个 Work 时,只有一个请求成功。 - 其余请求返回 HTTP 409 `Conflict`,错误消息包含当前状态。收到 409 后不要执行该 Work,应继续轮询其他 Work。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **environment_id** `string` `必选` | 环境 ID 要操作的 Environment ID,以 `env-` 开头。填写创建环境或查询环境列表接口取得的 ID。 **work_id** `string` `必选` | Work 标识符 要认领的 Work 唯一标识,取自拉取 Work 接口响应中的 `id`,以 `sesn-` 开头。 ### Header 参数 > 在 HTTP 请求头中传入。 **Ark-Worker-ID** `string` | Worker 实例 ID 执行该 Work 的 Worker 实例 ID。建议传入拉取 Work 时使用的实例 ID。省略或传空字符串时,服务端按匿名 Worker 处理认领请求。 ## 响应参数 **acknowledged_at** `string` | 认领时间 本次成功认领 Work 的时间,格式为 RFC 3339。 **created_at** `string` | 创建时间 服务端创建 Work 时记录的时间,格式为 RFC 3339。 **data** `object` | 工作载荷 Work 对应的 Session 信息。 **id** `string` | Session ID `data.id` Work 对应的 Session ID,可用于调用 Session 相关接口。 **type** `string` | 载荷类型 `data.type` 当前固定为 `session`,表示 `data.id` 指向一个 Session。 **environment_id** `string` | 环境 ID Work 所属的环境 ID,以 `env-` 开头。 **id** `string` | Work 标识符 Work ID,以 `sesn-` 开头。 **state** `string` | 当前状态 认领成功后的 Work 状态,固定为 `starting`。 **type** `string` | 对象类型 类型标识,固定为 `work`。 **updated_at** `string` | 更新时间 Work 最近一次状态迁移的时间,格式为 RFC 3339。 **latest_heartbeat_at** `string` | 最近心跳时间 服务端最近一次接受 Work 心跳的时间,格式为 RFC 3339;尚未收到心跳时不返回该字段。 **started_at** `string` | 开始时间 Work 开始执行的时间,格式为 RFC 3339;尚未开始执行时不返回该字段。 **stop_requested_at** `string` | 停止请求时间 服务端首次处理停止 Work 请求的时间,格式为 RFC 3339。未调用停止 Work 接口,或 Work 因心跳租约超时停止时,不返回该字段。 **stopped_at** `string` | 停止时间 Work 进入 `stopped` 状态的时间,格式为 RFC 3339;尚未停止时不返回该字段。 **tags** `object[]` | 资源标签 与当前 Work 关联的资源标签列表。 **key** `string` | 标签键 `tags.key` 资源标签的键,用于标识当前 Work 关联的标签。 **value** `string` | 标签值 `tags.value` 资源标签的值,用于描述当前 Work 在该标签键下的取值;未设置值时不返回该字段。 ## 代码示例 ## 认领 Work ### cURL #### Request ```bash curl -sS --fail-with-body -X POST \ "https://ark.cn-beijing.volces.com/api/v3/environments//work//ack" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Ark-Worker-ID: worker-01" ``` #### Response ``` { "id": "", "environment_id": "", "state": "starting", "type": "work", "data": { "id": "", "type": "session" }, "created_at": "2026-10-19T08:30:00Z", "updated_at": "2026-10-19T08:30:02Z", "acknowledged_at": "2026-10-19T08:30:02Z" } ``` --- # 续租 Work Source: https://ark.volcengine.com/region:cn-beijing/docs/record-work-heartbeat-api `POST https://ark.cn-beijing.volces.com/api/v3/environments/{environment_id}/work/{work_id}/heartbeat` 执行 Work 期间,Worker 应每 30~60 秒调用本接口续租。 认领后的第一次心跳会将 Work 状态从 `starting` 更新为 `active`。 后续请求应将上一次响应的 `last_heartbeat` 原样传入 `expected_last_heartbeat`。 多个 Worker 同时为同一 Work 续租,或 `expected_last_heartbeat` 不是最近一次返回值时,服务端返回 HTTP 412 `PreconditionFailed`。 收到该错误后,应先查询 Work 的最新状态。 确认仍由当前 Worker 执行后,再发送心跳。 若心跳中断,Work 会在最近一次成功心跳的租约到期并经过 60 秒宽限期后进入 `stopped`。 若响应的 `lease_extended` 为 `false`,Worker 应停止执行并退出心跳循环。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **environment_id** `string` `必选` | 环境 ID 要操作的 Environment ID,以 `env-` 开头。填写创建环境或查询环境列表接口取得的 ID。 **work_id** `string` `必选` | Work 标识符 要续租的 Work 唯一标识,取自拉取 Work 接口响应中的 `id`,以 `sesn-` 开头。 ### Query 参数 > 在 URL Query String 中传入。 **desired_ttl_seconds** `integer` `默认值 300` | 期望租约 TTL Worker 期望本次续租采用的租约 TTL,单位为秒。 > **说明** > > 传入正数时使用请求值;省略或传入非正数时,服务端按 300 秒处理。 **expected_last_heartbeat** `string` | 乐观并发校验值 用于防止多个 Worker 同时续租同一 Work。第一次心跳可省略,也可传 `NO_HEARTBEAT`;后续请求必须原样传入上一次响应的 `last_heartbeat`。默认值:`NO_HEARTBEAT` ## 响应参数 **last_heartbeat** `string` | 最近心跳时间 服务端记录的本次心跳时间,格式为 RFC 3339。发送下一次心跳时,将该值原样传入 `expected_last_heartbeat`。 **lease_extended** `boolean` | 租约是否续上 本次心跳是否延长 Work 租约:`true` 表示已延长;`false` 表示 Work 正在停止或已经停止,租约未延长。是否继续执行需结合 `state` 判断。 **state** `string` | 当前状态 Work 当前状态。可选值:`queued`、`active`、`stopping`、`stopped`。 > **说明** > > - `queued`:Work 仍处于待认领状态,应先调用认领 Work 接口,不应开始执行。 > - `active`:Work 正在执行,可以继续发送心跳。 > - `stopping`:已收到停止请求,应停止当前任务。 > - `stopped`:Work 已停止,不应继续执行或发送心跳。 **ttl_seconds** `integer` | 实际生效 TTL 服务端为当前 Work 记录的租约 TTL,单位为秒。 **type** `string` | 对象类型 类型标识,固定为 `work_heartbeat`。 ## 代码示例 ## 续租 Work ### cURL #### Request ```bash curl -sS --fail-with-body -X POST \ "https://ark.cn-beijing.volces.com/api/v3/environments//work//heartbeat?desired_ttl_seconds=300&expected_last_heartbeat=NO_HEARTBEAT" \ -H "Authorization: Bearer $ARK_API_KEY" ``` #### Response ``` { "last_heartbeat": "2026-10-19T08:30:35Z", "lease_extended": true, "state": "active", "ttl_seconds": 300, "type": "work_heartbeat" } ``` --- # 查询 Work 队列状态 Source: https://ark.volcengine.com/region:cn-beijing/docs/get-work-queue-stats-api `GET https://ark.cn-beijing.volces.com/api/v3/environments/{environment_id}/work/stats` 查询自托管 Environment 中待拉取、待认领的 Work 数量、活跃 Worker 数及最早入队时间。 本接口仅用于观测 Work 队列,不执行 Work 的拉取、认领、续租或停止。 `queued` 状态的 Work 由以下两部分构成: - `depth`:尚未被拉取的 Work 数量。 - `pending`:已被拉取但尚未认领的 Work 数量。 其他状态请通过查询 Work 列表查看。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **environment_id** `string` `必选` | 环境 ID 要操作的 Environment ID,以 `env-` 开头。填写创建环境或查询环境列表接口取得的 ID。 ## 响应参数 **depth** `integer` | 待拉取条数 尚未被任何 Worker 通过拉取 Work 接口获取的 `queued` 状态 Work 数量。 **pending** `integer` | 待认领条数 已由拉取接口返回给 Worker、但尚未通过认领接口确认的 `queued` 状态 Work 数量。 **type** `string` | 对象类型 类型标识,固定为 `work_queue_stats`。 **workers_polling** `integer` | 活跃 Worker 数 最近 30 秒内携带非空 `Ark-Worker-ID` 发起过 Work 拉取请求的 Worker 数。未携带该请求头的 Worker 不计入本字段,因此该值可能低于实际运行的 Worker 数。 **oldest_queued_at** `string` | 最早入队时间 最早一条 `queued` 状态 Work 的创建时间,采用 UTC RFC 3339 格式。队列无待处理 Work 时不返回该字段。 ## 代码示例 ## 查询 Work 队列状态 ### cURL #### Request ```bash curl -sS --fail-with-body \ "https://ark.cn-beijing.volces.com/api/v3/environments//work/stats" \ -H "Authorization: Bearer $ARK_API_KEY" ``` #### Response ``` { "depth": 3, "pending": 1, "workers_polling": 2, "oldest_queued_at": "2026-10-19T08:29:30Z", "type": "work_queue_stats" } ``` --- # 停止 Work Source: https://ark.volcengine.com/region:cn-beijing/docs/stop-work-api `POST https://ark.cn-beijing.volces.com/api/v3/environments/{environment_id}/work/{work_id}/stop` 请求停止指定 Work。`force` 取值决定停止方式: - `false`:服务端先将 Work 状态更新为 `stopping`,让 Worker 在约 60 秒内停止当前任务;等待结束后,Work 状态变为 `stopped`。 - `true`:服务端不等待 Worker 结束任务,直接将 Work 状态更新为 `stopped`。 本接口支持幂等调用。重复停止不会重置已记录的停止状态和时间,接口返回该 Work 的最新状态。 Work 仍处于 `stopping` 时,可以再次传入 `force=true` 立即停止。 正在执行的 Worker 会在后续心跳响应中看到 `state` 为 `stopping` 或 `stopped`,且 `lease_extended` 为 `false`。 收到该结果后,应终止当前任务进程,并释放该任务占用的本地资源。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **environment_id** `string` `必选` | 环境 ID 要操作的 Environment ID,以 `env-` 开头。填写创建环境或查询环境列表接口取得的 ID。 **work_id** `string` `必选` | Work 标识符 要停止的 Work 唯一标识,取自拉取 Work 接口响应中的 `id`,以 `sesn-` 开头。 ### Body 参数 **force** `boolean` `默认值 false` | 是否强制停止 是否要求服务端立即停止 Work。`false` 表示先进入 `stopping`,约 60 秒后停止;`true` 表示立即进入 `stopped`。 ## 响应参数 **created_at** `string` | 创建时间 服务端创建 Work 时记录的时间,格式为 RFC 3339。 **data** `object` | 工作载荷 Work 对应的 Session 信息。 **id** `string` | Session ID `data.id` Work 对应的 Session ID,可用于调用 Session 相关接口。 **type** `string` | 载荷类型 `data.type` 当前固定为 `session`,表示 `data.id` 指向一个 Session。 **environment_id** `string` | 环境 ID Work 所属的环境 ID,以 `env-` 开头。 **id** `string` | Work 标识符 Work ID,以 `sesn-` 开头。 **state** `string` | 当前状态 Work 当前状态。`stopping` 表示停止请求处理中;`stopped` 表示已停止。 **type** `string` | 对象类型 类型标识,固定为 `work`。 **updated_at** `string` | 更新时间 Work 最近一次状态迁移的时间,格式为 RFC 3339。 **acknowledged_at** `string` | 认领时间 Work 被 Worker 成功认领的时间,格式为 RFC 3339;尚未认领时不返回该字段。 **latest_heartbeat_at** `string` | 最近心跳时间 服务端最近一次接受 Work 心跳的时间,格式为 RFC 3339;尚未收到心跳时不返回该字段。 **started_at** `string` | 开始时间 Work 开始执行的时间,格式为 RFC 3339;尚未开始执行时不返回该字段。 **stop_requested_at** `string` | 停止请求时间 第一次停止请求的时间,格式为 RFC 3339。重复调用不会覆盖该值。 **stopped_at** `string` | 停止时间 Work 进入 `stopped` 状态的时间,格式为 RFC 3339。`force` 为 `true` 时立即返回;`force` 为 `false` 的首次响应不返回该字段,Work 停止后再次查询时返回。 **tags** `object[]` | 资源标签 与当前 Work 关联的资源标签列表。 **key** `string` | 标签键 `tags.key` 资源标签的键,用于标识当前 Work 关联的标签。 **value** `string` | 标签值 `tags.value` 资源标签的值,用于描述当前 Work 在该标签键下的取值;未设置值时不返回该字段。 ## 代码示例 ## 停止 Work ### cURL #### Request ```bash curl -sS --fail-with-body \ "https://ark.cn-beijing.volces.com/api/v3/environments//work//stop" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{"force": false}' ``` #### Response ``` { "id": "", "environment_id": "", "state": "stopping", "type": "work", "data": { "id": "", "type": "session" }, "created_at": "2026-10-19T08:30:00Z", "updated_at": "2026-10-19T08:31:00Z", "acknowledged_at": "2026-10-19T08:30:02Z", "started_at": "2026-10-19T08:30:05Z", "latest_heartbeat_at": "2026-10-19T08:30:35Z", "stop_requested_at": "2026-10-19T08:31:00Z" } ``` --- # 查询 Work 列表 Source: https://ark.volcengine.com/region:cn-beijing/docs/list-work-items-api `GET https://ark.cn-beijing.volces.com/api/v3/environments/{environment_id}/work` 分页查询指定自托管 Environment 中的 Work,适用于查看 Work 状态和排查任务。结果按创建时间从新到旧排列。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **environment_id** `string` `必选` | 环境 ID 要操作的 Environment ID,以 `env-` 开头。填写创建环境或查询环境列表接口取得的 ID。 ### Query 参数 > 在 URL Query String 中传入。 **limit** `integer` `默认值 50` | 每页数量 单页返回的最大条数;大于 200 时按 200 处理。 > **说明** > > 省略或传入非正数时,服务端每页最多返回 50 条。 **page** `string` | 下一页标识 用于告诉服务端从上一页结束的位置继续返回数据。该值由服务端生成,不是页码。 > **说明** > > 1. 首次请求不传 `page`,例如 `GET /api/v3/environments/{environment_id}/work?limit=20`。 > 2. 响应包含 `next_page` 时,将其原样传入下一次请求,例如 `GET /api/v3/environments/{environment_id}/work?limit=20&page=`。 > 3. 响应不包含 `next_page` 时,表示没有更多结果。请勿自行生成或修改该值。 ## 响应参数 **data** `object[]` | Work 列表 当前页的 Work 列表。 **created_at** `string` | 创建时间 `data.created_at` 服务端创建 Work 时记录的时间,格式为 RFC 3339。 **data** `object` | 工作载荷 `data.data` Work 对应的 Session 信息。 **id** `string` | Session ID `data.data.id` Work 对应的 Session ID,可用于调用 Session 相关接口。 **type** `string` | 载荷类型 `data.data.type` 当前固定为 `session`,表示 `data.id` 指向一个 Session。 **environment_id** `string` | 环境 ID `data.environment_id` Work 所属的环境 ID,以 `env-` 开头。 **id** `string` | Work 标识符 `data.id` Work ID,以 `sesn-` 开头。 **state** `string` | 当前状态 `data.state` Work 当前状态:`queued` 为已入队,`starting` 为启动中,`active` 为执行中,`stopping` 为停止中,`stopped` 为已停止。 **type** `string` | 对象类型 `data.type` 类型标识,固定为 `work`。 **updated_at** `string` | 更新时间 `data.updated_at` Work 最近一次状态迁移的时间,格式为 RFC 3339。 **acknowledged_at** `string` | 认领时间 `data.acknowledged_at` Work 被 Worker 成功认领的时间,格式为 RFC 3339;尚未认领时不返回该字段。 **latest_heartbeat_at** `string` | 最近心跳时间 `data.latest_heartbeat_at` 服务端最近一次接受 Work 心跳的时间,格式为 RFC 3339;尚未收到心跳时不返回该字段。 **started_at** `string` | 开始时间 `data.started_at` Work 开始执行的时间,格式为 RFC 3339;尚未开始执行时不返回该字段。 **stop_requested_at** `string` | 停止请求时间 `data.stop_requested_at` 服务端收到 Work 停止请求的时间,格式为 RFC 3339;尚未收到停止请求时不返回该字段。 **stopped_at** `string` | 停止时间 `data.stopped_at` Work 进入 `stopped` 状态的时间,格式为 RFC 3339;尚未停止时不返回该字段。 **tags** `object[]` | 资源标签 `data.tags` 与当前 Work 关联的资源标签列表。 **key** `string` | 标签键 `data.tags.key` 资源标签的键,用于标识当前 Work 关联的标签。 **value** `string` | 标签值 `data.tags.value` 资源标签的值,用于描述当前 Work 在该标签键下的取值;未设置值时不返回该字段。 **next_page** `string` | 下一页标识 服务端生成的下一页标识。返回该字段表示还有更多结果;不返回表示已到最后一页。 > **说明** > > 将该值原样传入下一次请求的 `page` 参数。 ## 代码示例 ## 查询 Work 列表 ### cURL #### Request ```bash curl -sS --fail-with-body \ "https://ark.cn-beijing.volces.com/api/v3/environments//work?limit=20" \ -H "Authorization: Bearer $ARK_API_KEY" ``` #### Response ``` { "data": [ { "id": "", "environment_id": "", "state": "active", "type": "work", "data": { "id": "", "type": "session" }, "created_at": "2026-10-19T08:30:00Z", "updated_at": "2026-10-19T08:30:05Z", "acknowledged_at": "2026-10-19T08:30:02Z", "started_at": "2026-10-19T08:30:05Z", "latest_heartbeat_at": "2026-10-19T08:30:35Z" } ] } ``` --- # 查询 Work 详情 Source: https://ark.volcengine.com/region:cn-beijing/docs/get-work-item-api `GET https://ark.cn-beijing.volces.com/api/v3/environments/{environment_id}/work/{work_id}` 查询指定 Work 的详细信息,包括当前状态、关联的 Session、资源标签和生命周期时间。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **environment_id** `string` `必选` | 环境 ID 要操作的 Environment ID,以 `env-` 开头。填写创建环境或查询环境列表接口取得的 ID。 **work_id** `string` `必选` | Work 标识符 要查询的 Work 唯一标识,取自拉取 Work 接口或查询 Work 列表接口响应中的 `id`,以 `sesn-` 开头。 ## 响应参数 **created_at** `string` | 创建时间 服务端创建 Work 时记录的时间,格式为 RFC 3339。 **data** `object` | 载荷 Work 对应的 Session 信息。 **id** `string` | Session ID `data.id` Work 对应的 Session ID,可用于调用 Session 相关接口。 **type** `string` | 类型 `data.type` 当前固定为 `session`,表示 `data.id` 指向一个 Session。 **environment_id** `string` | 环境 ID Work 所属的环境 ID,以 `env-` 开头。 **id** `string` | Work 标识符 Work ID,以 `sesn-` 开头。 **state** `string` | 当前状态 Work 当前状态:`queued` 表示已入队,`starting` 表示启动中,`active` 表示执行中,`stopping` 表示停止中,`stopped` 表示已停止。 **type** `string` | 对象类型 类型标识,固定为 `work`。 **updated_at** `string` | 更新时间 Work 最近一次状态迁移的时间,格式为 RFC 3339。 **acknowledged_at** `string` | 认领时间 Work 被 Worker 成功认领的时间,格式为 RFC 3339;Work 尚未被认领时不返回该字段。 **latest_heartbeat_at** `string` | 最近心跳时间 服务端最近一次收到 Work 心跳的时间,格式为 RFC 3339;尚未收到心跳时不返回该字段。 **started_at** `string` | 开始时间 Work 开始执行的时间,格式为 RFC 3339;尚未开始执行时不返回该字段。 **stop_requested_at** `string` | 停止请求时间 服务端首次处理停止 Work 请求的时间,格式为 RFC 3339。以下任一情况不返回该字段:未调用停止 Work 接口;Work 因心跳租约超时停止。 **stopped_at** `string` | 停止时间 Work 进入 `stopped` 状态的时间,格式为 RFC 3339;尚未停止时不返回该字段。 **tags** `object[]` | 资源标签 与当前 Work 关联的资源标签列表。 **key** `string` | 标签键 `tags.key` 资源标签的键,用于标识当前 Work 关联的标签。 **value** `string` | 标签值 `tags.value` 资源标签的值,用于描述当前 Work 在该标签键下的取值;未设置值时不返回该字段。 ## 代码示例 ## 查询 Work 详情 ### cURL #### Request ```bash curl -sS --fail-with-body \ "https://ark.cn-beijing.volces.com/api/v3/environments//work/" \ -H "Authorization: Bearer $ARK_API_KEY" ``` #### Response ``` { "id": "", "environment_id": "", "state": "active", "type": "work", "data": { "id": "", "type": "session" }, "created_at": "2026-10-19T08:30:00Z", "updated_at": "2026-10-19T08:30:05Z", "acknowledged_at": "2026-10-19T08:30:02Z", "started_at": "2026-10-19T08:30:05Z", "latest_heartbeat_at": "2026-10-19T08:30:35Z" } ``` --- # 创建会话 Source: https://ark.volcengine.com/region:cn-beijing/docs/create-session-api `POST https://ark.cn-beijing.volces.com/api/v3/sessions` 创建会话并绑定指定的智能体与环境。创建时可为本次会话覆写智能体或 Environment 的部分配置。创建成功后,可使用返回的会话 ID 发送事件、查询状态、升级配置或删除会话。 调用前需先准备智能体和环境。如需挂载文件、记忆库或凭证,还需先通过对应接口创建资源并取得其 ID。 根据目标选择接口: - 需要新会话或更换绑定的智能体、环境时,使用本接口。 - 只修改标题或标签时,使用 [更新会话标题和标签](/docs/update-session-api)。 - 保留同一会话并刷新当前智能体、环境或保管库配置时,使用 [升级会话](/docs/upgrade-session-api)。 单个智能体默认最多可同时拥有 1000 个活跃会话;达到配额时,创建会话接口返回 HTTP 429 `SessionQuotaExceeded`。实际配额可能因账号配置而不同。 > **说明** > > - `resources` 中可通过 `file_id` 挂载 Files API 已上传的文件,`purpose` 为 `agent` 或 `user_data` 的文件均可使用;文件能否直接进入模型上下文,由后续 `user.message` 内容块和模型能力决定。 > - 传入 `agent_with_overrides` 对象可在本次会话中临时调整所引用 Agent 的模型、系统提示词、工具、MCP 服务、技能或多智能体协作配置。覆写不会创建新的 Agent 版本。 > - 传入 `environment` 覆写对象可在本次会话中临时调整所引用 Environment 的部分运行配置。覆写不会修改原 Environment,也不影响其他会话。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Body 参数 **agent** `string / object` `必选` | 智能体标识 指定会话使用的智能体。可直接传入智能体 ID;需要固定智能体版本时,传入智能体引用对象并设置 `id` 和 `version`。 需要为本次会话临时调整 Agent 配置时,传入 `agent_with_overrides` 对象。覆写仅写入会话的智能体快照,不修改基础 Agent。 智能体 ID `string` 直接传入智能体 ID,会话启动时使用该智能体的最新版本。 智能体引用 `object` 智能体引用对象。通过 `id` 指定智能体,通过 `version` 指定会话使用的智能体版本;省略 `version` 时使用最新版本。 **id** `string` `必选` | 智能体 ID `agent.id` 要用于创建会话的智能体 ID。 **type** `string` `必选` | 引用类型 `agent.type` 引用类型,固定为 `agent` **version** `integer` | 版本号 `agent.version` 智能体版本号;省略时使用最新版本 智能体配置覆写 `object` 智能体配置覆写对象。以 `id` 指定的智能体版本为基础,覆写仅影响本次会话,不会创建新版本或修改基础 Agent。 * 省略字段时,沿用基础 Agent 的对应配置。 * 传入 `system` 时,替换本次会话中的系统提示词。 * 传入 `model` 时,仅覆写其中已提供的子字段;省略的模型子字段沿用基础 Agent 的配置。 * `tools`、`mcp_servers` 或 `skills` 传入 `[]` 时清空对应列表,传入非空数组时整体替换,不与基础配置合并。 * 传入 `multiagent` 时,整体替换多智能体协作配置;其中 `agents` 传入 `[]` 时清空子智能体列表。 **id** `string` `必选` | 智能体 ID `agent.id` 基础智能体 ID。缺失或为空时返回 HTTP 400 `MissingParameter`。 **type** `string` `必选` | 覆写类型 `agent.type` 覆写类型,固定为 `agent_with_overrides` **mcp_servers** `object[]` | MCP 服务列表 `agent.mcp_servers` 本次会话使用的 MCP 服务列表。省略时保留原配置,传入 `[]` 时清空,传入非空数组时整体替换。 **type** `string` `必选` | 接入方式 `agent.mcp_servers.type` MCP 服务的接入方式。 取值固定为 `url`。 **url** `string` `必选` | 服务地址 `agent.mcp_servers.url` MCP 服务的访问地址。同一智能体内不能配置重复的 MCP 服务地址。 **name** `string` | MCP 服务名称 `agent.mcp_servers.name` MCP 服务名称,最长 255 个字符,用于在当前 Agent 中识别该服务;配置 MCP 工具集时,`tools[].mcp_server_name` 必须填写此名称。 * 省略名称或名称不符合命名规则时,服务端根据 `url` 生成名称。 * 服务端会将符合命名规则的名称转换为小写。 * 多个名称冲突时,服务端为后续名称添加数字后缀。 **model** `object` | 模型运行参数覆写 `agent.model` 仅对本次会话生效的模型配置。支持设置 `id`、`speed`、`service_tier`、`thinking` 和 `reasoning_effort`;省略子字段时沿用基础智能体的对应配置。 **id** `string` | 模型 ID 覆写 `agent.model.id` 本次会话使用的模型 ID。省略时沿用基础智能体的模型;指定时仅影响本次会话,不修改基础智能体。 模型必须已在当前项目中开通,并支持用于智能体。模型 ID 无效或不支持用于智能体时返回 HTTP 400;模型未开通时返回 HTTP 403 `ModelNotOpen`。 **reasoning_effort** `string` | 推理投入档位 `agent.model.reasoning_effort` 推理投入档位。省略时沿用基础智能体的配置;传空字符串时使用当前模型的默认配置。 传入不支持的取值时返回 HTTP 400 `InvalidParameter`。各模型支持的取值和默认值,请参见 [模型支持的参数列表](/docs/model-parameter-support)。取值:`none` / `minimal` / `low` / `medium` / `high` / `xhigh` / `max`。 **service_tier** `string` | 推理服务档位 `agent.model.service_tier` 推理服务档位。省略时沿用基础智能体的配置;传空字符串时使用当前模型的默认配置。 传入不支持的取值时返回 HTTP 400 `InvalidParameter`。各模型支持的取值和默认值,请参见 [模型支持的参数列表](/docs/model-parameter-support)。取值:`auto` / `default` / `fast`。 **speed** `string` | 推理速度 `agent.model.speed` 模型推理速度档位。省略时沿用基础智能体的配置;传空字符串时使用模型服务的默认配置。 并非所有模型都支持 `fast`,传入不支持的取值时返回 HTTP 400 `InvalidParameter`。取值:`standard` / `fast`。 **thinking** `string` | 思考模式 `agent.model.thinking` 思考模式。`auto` 表示由模型判断是否启用思考;省略时沿用基础智能体的配置;传空字符串时使用当前模型的默认配置。 传入不支持的取值时返回 HTTP 400 `InvalidParameter`。各模型支持的取值和默认值,请参见 [模型支持的参数列表](/docs/model-parameter-support)。取值:`enabled` / `disabled` / `auto`。 **multiagent** `object` | 多智能体配置 `agent.multiagent` 本次会话使用的多智能体协作配置。省略时保留基础 Agent 的配置;提供时整体替换,`agents` 传入 `[]` 时清空子智能体列表。 **agents** `object[]` `必选` | 子智能体列表 `agent.multiagent.agents` 子智能体列表,最多 20 项。传入 `[]` 时清空基础 Agent 的子智能体列表。 **type** `string` `必选` | 子智能体来源 `agent.multiagent.agents.type` 子智能体来源。`agent` 表示引用当前账号和项目中的已有 Agent;`self` 表示复用当前主 Agent 的配置。 **id** `string` | 子智能体 ID `agent.multiagent.agents.id` 子智能体 ID。当 `type` 为 `agent` 时必填;当 `type` 为 `self` 时省略。 **version** `integer` | 子智能体版本 `agent.multiagent.agents.version` 子智能体版本号,仅当 `type` 为 `agent` 时生效。省略时使用该子智能体的最新版本。 **type** `string` `必选` | 协作模式 `agent.multiagent.type` 多智能体协作模式,固定为 `coordinator`。当前智能体负责任务分配并汇总子智能体的结果。 **skills** `object[]` | 技能列表 `agent.skills` 本次会话使用的技能列表。省略时保留原配置,传入 `[]` 时清空,传入非空数组时整体替换。 **skill_id** `string` `必选` | 技能 ID `agent.skills.skill_id` 要绑定到智能体的技能 ID。 **type** `string` `必选` | 技能来源 `agent.skills.type` 技能来源。 - `ark`:方舟预置技能。 - `skill_hub`:来自 SkillHub 的公共技能。 - `custom`:当前账号通过 Skills API 创建的自定义技能。 **version** `string` | 技能版本 `agent.skills.version` 要绑定的技能版本号。省略时使用该技能的最新版本。 **system** `string` | 系统提示词覆写 `agent.system` 本次会话使用的系统提示词。省略时沿用基础智能体的配置。 **tools** `object[]` | 工具列表 `agent.tools` 本次会话使用的工具列表。省略时保留原配置,传入 `[]` 时清空,传入非空数组时整体替换。 **type** `string` `必选` | 工具类型 `agent.tools.type` 工具类型。 - `agent_toolset_20260916`:使用方舟内置的 `bash`、`edit`、`read`、`write`、`glob`、`grep`、`web_fetch` 和 `web_search` 工具。 - `agent_toolset_multimodal_20260825`:使用 `image_generate`、`video_generate`、`visual_search`、`general_search`、`compose_video` 和 `todo_write` 工具。 - `mcp_toolset`:使用指定 MCP 服务提供的工具。 - `custom`:使用由客户端执行的自定义工具。 可选值:`agent_toolset_20260401`、`agent_toolset_20260701`、`agent_toolset_20260916`、`agent_toolset_multimodal_20260825`、`mcp_toolset`、`custom`。 **configs** `object[]` | 工具配置列表 `agent.tools.configs` 按工具名称设置工具的启用状态和权限策略。 **name** `string` `必选` | 工具名称 `agent.tools.configs.name` 工具配置对应的工具名称。 **enabled** `boolean` | 是否启用 `agent.tools.configs.enabled` 是否启用此工具。 **models** `object[]` | 工具模型列表 `agent.tools.configs.models` 图片生成或视频生成工具使用的模型 ID 或推理接入点 ID 列表。 > **说明** > > 最多填写 10 项,且同一工具配置内的模型 ID 或推理接入点 ID 不能重复。配置多项时,必须且只能将一项的 `default` 设置为 `true`。 **id** `string` `必选` | 模型或接入点 ID `agent.tools.configs.models.id` 图片生成或视频生成工具调用的模型 ID 或推理接入点 ID。 **default** `boolean` `默认值 false` | 是否为默认模型 `agent.tools.configs.models.default` 是否作为该工具的默认模型。配置多个模型或推理接入点时,必须且只能将一项设置为 `true`。 **permission_policy** `object` | 权限策略 `agent.tools.configs.permission_policy` 该工具使用的权限策略。 **type** `string` `必选` | 策略类型 `agent.tools.configs.permission_policy.type` 工具调用许可策略。 * `always_allow`:表示总是允许调用。 * `always_ask`:表示每次使用前需要确认。 **default_config** `object` | 默认工具配置 `agent.tools.default_config` 未在 `configs` 中单独配置的工具所使用的默认启用状态和权限策略。 **enabled** `boolean` | 是否启用 `agent.tools.default_config.enabled` 是否默认启用未在 `configs` 中单独配置的工具。 * `true`:表示默认启用。 * `false`:表示默认禁用。 **permission_policy** `object` | 权限策略 `agent.tools.default_config.permission_policy` 未在 `configs` 中单独配置的工具所使用的默认权限策略。 **type** `string` `必选` | 策略类型 `agent.tools.default_config.permission_policy.type` 工具调用许可策略。 * `always_allow`:表示总是允许调用。 * `always_ask`:表示每次使用前需要确认。 **description** `string` | 自定义工具描述 `agent.tools.description` 说明自定义工具的功能和适用场景,供模型判断何时调用该工具。 > **说明** > > `type` 为 `custom` 时必填,长度为 1~10000 个字符。 **input_schema** `object` | 输入参数定义 `agent.tools.input_schema` 定义自定义工具的输入参数及其约束。 > **注意** > > * 创建 Agent 时,服务端会确认 `input_schema.type` 为 `object`,并确认 `input_schema.properties` 是 JSON 对象,但不会逐项检查其中的属性定义。 > * 运行 Session 时,服务端会检查完整的 `input_schema` 是否为合法 JSON Schema。创建 Agent 成功不代表该 Schema 一定可以正常运行。 > * 模型生成的工具调用参数只会校验是否为合法 JSON。执行自定义工具前,你的应用应按 `input_schema` 再次校验参数。 **properties** `object` | 参数属性定义 `agent.tools.input_schema.properties` 自定义工具输入参数的 JSON Schema `properties` 对象。键为参数名,值为对应参数的 JSON Schema 子对象。 **required** `string[]` | 必填参数名称列表 `agent.tools.input_schema.required` 自定义工具输入中必填的参数名称列表。列表中的每个名称必须与 `properties` 中定义的参数名称一致。 **type** `string` `默认值 object` | Schema 类型 `agent.tools.input_schema.type` 指定 JSON Schema 的顶层类型,仅支持 `object`。 **mcp_server_name** `string` | MCP 服务名称 `agent.tools.mcp_server_name` MCP 工具所属的 MCP 服务名称。 **name** `string` | 自定义工具名称 `agent.tools.name` 自定义工具的名称。 > **说明** > > `type` 为 `custom` 时必填。长度为 1~128 个字符,只能包含字母、数字、下划线和连字符,且同一 Agent 内的自定义工具名称不能重复。 **version** `integer` | 版本号 `agent.version` 基础智能体版本号。省略时使用最新版本;指定版本时,以该版本保存的配置为基础应用本次覆写。 **environment_id** `string` | 环境 ID 直接使用已创建的 Environment 运行会话时,填写该 Environment 的 ID。需要为本次会话临时调整已开放的运行配置时,改用 `environment`。 **environment** `object` | 环境覆写 需要为本次会话临时调整已有 Environment 的运行配置时,使用该对象。 > **说明** > > 通过 `id` 指定基础 Environment。配置仅对本次会话生效,不修改原 Environment。若同时提供 `environment_id`,两者的环境 ID 必须相同。 **id** `string` `必选` | 环境 ID `environment.id` 要作为本次配置覆写基础的 Environment ID。 **type** `string` `必选` | 对象类型 `environment.type` 对象类型,固定为 `environment_with_overrides` **config** `object` | 覆写后的运行配置 `environment.config` 本次会话使用的 Environment 运行配置覆写;省略时沿用原 Environment 的配置。 **type** `string` `必选` | 环境类型 `environment.config.type` 运行环境类型:`cloud` 表示平台托管的云端运行环境,`self_hosted` 表示用户自托管环境。覆写时必须与基础 Environment 保持一致。 **env** `object` | 环境变量 `environment.config.env` 本次 Session 使用的环境变量,以变量名和变量值组成的字符串键值对形式传入。 > **说明** > > * 省略 *env* 时沿用基础 Environment 的环境变量;传入对象时整体替换;传入空对象 `{}` 时清空全部环境变量。 > * 最多包含 64 个键值对,所有键和值合计不超过 32 KiB。键不能为空且不能包含 `=` 或 NUL 字符,值不能包含 NUL 字符。 **packages** `object` | 依赖包配置 `environment.config.packages` 本次 Session 启动时预装的依赖包。 > **说明** > > * 省略 *packages* 时沿用基础 Environment 的依赖包配置;传入对象时整体替换;传入空对象 `{}` 时清空全部依赖包配置。 > * 每个依赖包名称去除首尾空白后不能为空,不能包含 NUL 字符,也不能以连字符开头。 **apt** `string[]` | APT 软件包 `environment.config.packages.apt` apt 依赖。 **cargo** `string[]` | Cargo 包 `environment.config.packages.cargo` cargo 依赖。 **gem** `string[]` | Ruby Gem 包 `environment.config.packages.gem` gem 依赖。 **go** `string[]` | Go 模块 `environment.config.packages.go` go module 依赖。 **npm** `string[]` | npm 包 `environment.config.packages.npm` npm 依赖。 **pip** `string[]` | Python 包 `environment.config.packages.pip` pip 依赖。 **type** `string` | 配置类型 `environment.config.packages.type` 固定为 `packages`。 **setup_script** `string` | 初始化脚本 `environment.config.setup_script` 本次 Session 启动时执行的初始化脚本。 > **说明** > > 省略 *setup_script* 时沿用基础 Environment 的初始化脚本;传入非空字符串时替换原值;传入空字符串 `""` 时清空。 > **注意** > > * 脚本以 Bash 在 `/workspace` 目录中执行,内容不能超过 256 KiB(262144 字节)。超过限制时,脚本不会执行,但 Session 仍可能继续运行。 > * 脚本以非零状态码退出时,退出前已完成的文件写入等操作不会自动回滚,Session 仍可能继续运行。创建后应检查脚本准备的依赖、目录或标记文件,不要只根据 Session 状态判断初始化是否成功。 **tos** `object` | 产物存储覆写 `environment.config.tos` 会话级产物存储覆写,`tos` 对象整体生效。 省略 `tos` 时保留基础 Environment 的配置;传入 `{}` 时清空配置并使用默认存储;传入非空对象时,必须同时提供 `bucket` 和 `prefix`。 **bucket** `string` | TOS 桶 `environment.config.tos.bucket` 用户 TOS 存储桶名称。Bucket 必须与当前方舟 API 接入地域一致,否则请求会被拒绝。 **prefix** `string` | 对象前缀 `environment.config.tos.prefix` 智能体产物在用户 Bucket 中的存储目录前缀。 **resources** `object[]` | 初始资源 会话启动时挂载到运行环境的文件、记忆库或 TOS 目录。 > **说明** > > 当会话所用 Environment 的 `config.type` 为 `self_hosted` 时,不能传入 `resources`。 文件资源 `object` 通过 Files API 上传并挂载到会话的文件。 **type** `string` `必选` | 资源类型 `resources.type` 资源类型,固定为 `file`。 **file_id** `string` `必选` | 文件 ID `resources.file_id` 要挂载到会话的文件 ID,通过 Files API 上传文件后获得。 > **说明** > > 同一请求中,`file_id` 和最终生效的 `mount_path` 均相同的文件资源视为重复,不能同时挂载。 **mount_path** `string` | 挂载路径 `resources.mount_path` 文件在会话运行环境中的挂载路径。省略或传入空值时,使用文件上传时的原始文件名,最终路径为 `/mnt/session/uploads/`。 > **说明** > > 路径开头的 `/` 会自动移除。路径不得包含 `..`、`.` 路径段、反斜杠、连续的 `//` 或控制字符,也不得以 `/` 结尾。 记忆库资源 `object` 挂载到会话的记忆库。 **type** `string` `必选` | 资源类型 `resources.type` 资源类型,固定为 `memory_store`。 **memory_store_id** `string` `必选` | 记忆库 ID `resources.memory_store_id` 要挂载到会话的记忆库 ID,由创建记忆库接口返回,形如 `memstore-...`。 > **说明** > > - 同一请求中,同一个 `memory_store_id` 只能挂载一次。 > - `memory_store` 类型的资源最多添加 10 项。 **instructions** `string` | 使用指导 `resources.instructions` 会话使用该记忆库时遵循的指导,最多 4096 个字符。 **access** `string` `默认值 read_write` | 访问权限 `resources.access` 会话对记忆库的访问权限: - `read_only`:智能体可以读取记忆库,但不能写入。 - `read_write`:智能体可以读取和写入记忆库。 TOS 资源 `object` 挂载到会话的 TOS 对象目录。 **type** `string` `必选` | 资源类型 `resources.type` 资源类型,固定为 `tos`。 **tos_bucket** `string` `必选` | TOS 存储桶 `resources.tos_bucket` 待挂载目录所在的 TOS 存储桶名称。 **tos_region** `string` | TOS 地域 `resources.tos_region` 源存储桶所在地域的 Region ID。省略时使用当前服务地域;显式提供时必须与当前服务地域一致。 **tos_key** `string` `必选` | TOS 目录前缀 `resources.tos_key` TOS 中待挂载目录的对象前缀。 > **说明** > > - 前缀必须以 `/` 结尾,不能为 `/` 或以 `/` 开头,也不能包含反斜杠、连续的 `//`、`.` 或 `..` 路径段以及控制字符。 > - 同一请求中,`tos_bucket`、`tos_key` 和 `tos_region` 三项组合相同的 TOS 资源视为重复,不能同时挂载。 **access** `string` `默认值 read_only` | 访问权限 `resources.access` 会话对 TOS 目录的访问权限: - `read_only`:智能体可以读取目录内容,但不能修改。 - `read_write`:智能体可以读取和修改目录内容。 **mount_path** `string` | 挂载路径 `resources.mount_path` TOS 目录在会话运行环境中的挂载路径。默认值:`/mnt/session/storage` **tags** `object[]` | 标签列表 会话关联的标签列表,用于分类检索,最多 20 项。同一请求中的标签键不可重复。 **key** `string` `必选` | 标签键 `tags.key` 标签键,用于分类和检索。必填,最长 128 个字符;支持字母、数字、空格及 `_ . : / = + - @`。 **value** `string` | 标签值 `tags.value` 用于记录该标签分类的具体内容。 **title** `string` | 会话标题 会话标题,便于用户识别和管理,最长 255 个字符 **vault_ids** `string[]` | 保管库 ID 列表 绑定到会话的保管库 ID 列表 **scene** `string` `默认值 default` | 会话场景 会话场景标记。 - `default`:普通会话。 - `dreams`:用于 Dream 记忆整理任务的会话。 ## 响应参数 **agent** `object` | 智能体信息 创建会话时保存的智能体配置快照,包含该会话实际使用的模型、系统提示词、工具、MCP 服务和技能等配置。后续更新智能体不会影响该会话中的快照。 **created_at** `string` | 创建时间 `agent.created_at` 智能体创建完成的时间,采用 RFC 3339 格式。 **id** `string` | 智能体 ID `agent.id` 会话当前使用的智能体 ID。 **name** `string` | 智能体名称 `agent.name` 会话当前使用的智能体名称。 **type** `string` | 对象类型 `agent.type` 对象类型,固定为 `agent`。 **updated_at** `string` | 更新时间 `agent.updated_at` 智能体配置最后更新的时间,采用 RFC 3339 格式。 **version** `integer` | 版本号 `agent.version` 会话当前使用的智能体版本号。 **base_agent** `string` | 基础智能体类型 `agent.base_agent` 会话当前使用的基础 Agent 类型。 - `ark_agent_preview`:通用 Agent。 - `ultra_vision_agent_preview`:Seedance Managed Agent。 **description** `string` | 智能体说明 `agent.description` 会话当前使用的智能体说明。 **display_name** `string` | 显示名称 `agent.display_name` 会话当前使用的智能体显示名称。 **mcp_servers** `object[]` | MCP 服务列表 `agent.mcp_servers` 会话当前使用的 MCP 服务配置列表。 **name** `string` | MCP 服务名称 `agent.mcp_servers.name` MCP 服务名称,供 `tools[].mcp_server_name` 引用。 **type** `string` | MCP 接入方式 `agent.mcp_servers.type` MCP 服务接入方式,固定为 `url`。 **url** `string` | MCP 服务地址 `agent.mcp_servers.url` 会话创建时冻结的 MCP 服务访问地址。 **metadata** `object` | 自定义元数据 `agent.metadata` 创建智能体时设置的自定义键值对,服务端不定义固定子字段。 **model** `object` | 模型配置 `agent.model` 会话当前使用的模型配置。 **id** `string` | 模型或接入点 ID `agent.model.id` 会话当前使用的模型 ID 或推理接入点 ID。 **protocol** `string` | 调用协议 `agent.model.protocol` 会话模型调用使用的协议: - `ark_responses`:方舟 Responses 协议。 - `openai_chat_completions`:OpenAI Chat Completions 兼容协议。 - `openai_responses`:OpenAI Responses 兼容协议。 - `anthropic_messages`:Anthropic Messages 兼容协议。 **reasoning_effort** `string` | 推理投入档位 `agent.model.reasoning_effort` 会话当前使用的推理投入档位。 **service_tier** `string` | 推理服务档位 `agent.model.service_tier` 会话当前使用的推理服务档位。 **speed** `string` | 推理速度 `agent.model.speed` 模型推理速度档位。 **thinking** `string` | 思考模式 `agent.model.thinking` 会话当前使用的思考模式。 **multiagent** `object` | 多智能体配置 `agent.multiagent` 会话当前使用的多智能体配置。 **agents** `object[]` | 成员智能体 `agent.multiagent.agents` 会话创建时冻结的成员智能体列表。 **type** `string` | 引用类型 `agent.multiagent.agents.type` 成员引用类型: - `agent`:引用其他智能体。 - `self`:引用当前智能体。 **description** `string` | 智能体说明 `agent.multiagent.agents.description` 会话创建时冻结的成员智能体说明。 **display_name** `string` | 显示名称 `agent.multiagent.agents.display_name` 会话创建时冻结的成员智能体显示名称。 **id** `string` | 智能体 ID `agent.multiagent.agents.id` 成员智能体的 ID;当 `type` 为 `self` 时,返回当前智能体的 ID。 **mcp_servers** `object[]` | MCP 服务列表 `agent.multiagent.agents.mcp_servers` 会话创建时冻结的成员智能体 MCP 服务配置列表。 **name** `string` | MCP 服务名称 `agent.multiagent.agents.mcp_servers.name` MCP 服务名称,供 `tools[].mcp_server_name` 引用。 **type** `string` | MCP 接入方式 `agent.multiagent.agents.mcp_servers.type` MCP 服务接入方式,固定为 `url`。 **url** `string` | MCP 服务地址 `agent.multiagent.agents.mcp_servers.url` 会话创建时冻结的 MCP 服务访问地址。 **model** `object` | 模型配置 `agent.multiagent.agents.model` 会话创建时冻结的成员智能体模型配置。 **id** `string` | 模型或接入点 ID `agent.multiagent.agents.model.id` 成员智能体使用的模型 ID 或推理接入点 ID。 **speed** `string` | 推理速度 `agent.multiagent.agents.model.speed` 成员智能体使用的模型推理速度档位。 **name** `string` | 智能体名称 `agent.multiagent.agents.name` 会话创建时冻结的成员智能体名称。 **skills** `object[]` | Skill 列表 `agent.multiagent.agents.skills` 会话创建时冻结的成员智能体 Skill 配置列表。 **type** `string` | Skill 类型 `agent.multiagent.agents.skills.type` Skill 来源类型: - `ark`:方舟平台预置 Skill。 - `skill_hub`:Skill Hub 中的公共 Skill。 - `custom`:当前账号创建的自定义 Skill。 **display_name** `string` | Skill 名称 `agent.multiagent.agents.skills.display_name` 会话创建时记录的 Skill 展示名称。 **skill_id** `string` | Skill ID `agent.multiagent.agents.skills.skill_id` 会话使用的 Skill ID。 **use_latest** `boolean` | 使用最新版本 `agent.multiagent.agents.skills.use_latest` 是否在创建会话时选择该 Skill 的最新版本。`true` 表示选择当时的最新版本,`false` 表示使用 `version` 指定的版本。 **version** `string` | Skill 版本 `agent.multiagent.agents.skills.version` 会话创建时冻结的 Skill 版本号。 **system** `string` | 系统提示词 `agent.multiagent.agents.system` 会话创建时冻结的成员智能体系统提示词。 **tools** `object[]` | 工具列表 `agent.multiagent.agents.tools` 会话创建时冻结的成员智能体工具配置列表。 **type** `string` | 工具类型 `agent.multiagent.agents.tools.type` 工具类型: - `agent_toolset_20260916`:当前版本的方舟内置工具集。 - `agent_toolset_multimodal_20260825`:使用 `image_generate`、`video_generate`、`visual_search`、`general_search`、`compose_video` 和 `todo_write` 工具。 - `mcp_toolset`:指定 MCP 服务提供的工具集。 - `custom`:由客户端执行的自定义工具。 可选值:`agent_toolset_20260916`、`agent_toolset_20260701`、`agent_toolset_multimodal_20260825`、`mcp_toolset`、`custom`。 **configs** `object[]` | 工具配置 `agent.multiagent.agents.tools.configs` 会话创建时冻结的逐项工具配置。 **name** `string` | 工具名称 `agent.multiagent.agents.tools.configs.name` 会话快照中记录的工具名称。 **enabled** `boolean` | 是否启用 `agent.multiagent.agents.tools.configs.enabled` 工具是否启用。 **models** `object[]` | 工具模型列表 `agent.multiagent.agents.tools.configs.models` 会话快照中记录的图片生成或视频生成工具模型 ID 或推理接入点 ID 列表。 **id** `string` | 模型或接入点 ID `agent.multiagent.agents.tools.configs.models.id` 该工具绑定的模型 ID 或推理接入点 ID。 **default** `boolean` | 是否为默认模型 `agent.multiagent.agents.tools.configs.models.default` 是否为该工具的默认模型。 **name** `string` | 模型名称 `agent.multiagent.agents.tools.configs.models.name` 服务端根据模型 ID 或推理接入点 ID 返回的模型名称。 **version** `string` | 模型版本 `agent.multiagent.agents.tools.configs.models.version` 服务端根据模型 ID 或推理接入点 ID 返回的模型版本。 **permission_policy** `object` | 权限策略 `agent.multiagent.agents.tools.configs.permission_policy` 工具使用的调用许可策略。 **type** `string` | 策略类型 `agent.multiagent.agents.tools.configs.permission_policy.type` 策略类型,`always_allow` 表示允许直接调用,`always_ask` 表示每次调用前需要用户确认。 **default_config** `object` | 默认工具配置 `agent.multiagent.agents.tools.default_config` 未在 `configs` 中单独列出的工具所使用的默认配置。 **enabled** `boolean` | 是否启用 `agent.multiagent.agents.tools.default_config.enabled` 未单独配置的工具是否默认启用。 **permission_policy** `object` | 权限策略 `agent.multiagent.agents.tools.default_config.permission_policy` 未单独配置的工具使用的调用许可策略。 **type** `string` | 策略类型 `agent.multiagent.agents.tools.default_config.permission_policy.type` 策略类型,`always_allow` 表示允许直接调用,`always_ask` 表示每次调用前需要用户确认。 **description** `string` | 自定义工具说明 `agent.multiagent.agents.tools.description` 会话创建时冻结的自定义工具说明,用于记录工具的功能和适用场景。 **input_schema** `object` | 输入参数定义 `agent.multiagent.agents.tools.input_schema` 返回 Session 的 Agent 快照中记录的自定义工具输入参数 JSON Schema。 **properties** `object` | 参数属性定义 `agent.multiagent.agents.tools.input_schema.properties` 返回 Session 的 Agent 快照中记录的 JSON Schema 属性映射。每个键为参数名,每个值为对应参数的 JSON Schema 子对象。 **required** `string[]` | 必填参数名称列表 `agent.multiagent.agents.tools.input_schema.required` 返回调用自定义工具时必须提供的参数名称列表。 **type** `string` | Schema 类型 `agent.multiagent.agents.tools.input_schema.type` 返回 JSON Schema 的顶层类型,固定为 `object`。 **mcp_server_name** `string` | MCP 服务名称 `agent.multiagent.agents.tools.mcp_server_name` 会话中 `mcp_toolset` 引用的 MCP 服务名称。 **name** `string` | 自定义工具名称 `agent.multiagent.agents.tools.name` 会话创建时冻结的自定义工具名称。 **version** `integer` | 版本号 `agent.multiagent.agents.version` 会话创建时冻结的成员智能体版本号。 **type** `string` | 协作模式 `agent.multiagent.type` 多智能体协作模式,固定为 `coordinator`。 **skills** `object[]` | Skill 列表 `agent.skills` 会话当前使用的 Skill 配置列表。 **type** `string` | Skill 类型 `agent.skills.type` Skill 来源类型: - `ark`:方舟平台预置 Skill。 - `skill_hub`:Skill Hub 中的公共 Skill。 - `custom`:当前账号创建的自定义 Skill。 **display_name** `string` | Skill 名称 `agent.skills.display_name` 会话创建时记录的 Skill 展示名称。 **skill_id** `string` | Skill ID `agent.skills.skill_id` 会话使用的 Skill ID。 **use_latest** `boolean` | 使用最新版本 `agent.skills.use_latest` 是否在创建会话时选择该 Skill 的最新版本。`true` 表示选择当时的最新版本,`false` 表示使用 `version` 指定的版本。 **version** `string` | Skill 版本 `agent.skills.version` 会话创建时冻结的 Skill 版本号。 **system** `string` | 系统提示词 `agent.system` 会话当前使用的系统提示词。 **tools** `object[]` | 工具列表 `agent.tools` 会话当前使用的工具配置列表。 **type** `string` | 工具类型 `agent.tools.type` 工具类型: - `agent_toolset_20260916`:当前版本的方舟内置工具集。 - `agent_toolset_multimodal_20260825`:使用 `image_generate`、`video_generate`、`visual_search`、`general_search`、`compose_video` 和 `todo_write` 工具。 - `mcp_toolset`:指定 MCP 服务提供的工具集。 - `custom`:由客户端执行的自定义工具。 可选值:`agent_toolset_20260916`、`agent_toolset_20260701`、`agent_toolset_multimodal_20260825`、`mcp_toolset`、`custom`。 **configs** `object[]` | 工具配置 `agent.tools.configs` 会话创建时冻结的逐项工具配置。 **name** `string` | 工具名称 `agent.tools.configs.name` 会话快照中记录的工具名称。 **enabled** `boolean` | 是否启用 `agent.tools.configs.enabled` 工具是否启用。 **models** `object[]` | 工具模型列表 `agent.tools.configs.models` 会话快照中记录的图片生成或视频生成工具模型 ID 或推理接入点 ID 列表。 **id** `string` | 模型或接入点 ID `agent.tools.configs.models.id` 该工具绑定的模型 ID 或推理接入点 ID。 **default** `boolean` | 是否为默认模型 `agent.tools.configs.models.default` 是否为该工具的默认模型。 **name** `string` | 模型名称 `agent.tools.configs.models.name` 服务端根据模型 ID 或推理接入点 ID 返回的模型名称。 **version** `string` | 模型版本 `agent.tools.configs.models.version` 服务端根据模型 ID 或推理接入点 ID 返回的模型版本。 **permission_policy** `object` | 权限策略 `agent.tools.configs.permission_policy` 工具使用的调用许可策略。 **type** `string` | 策略类型 `agent.tools.configs.permission_policy.type` 策略类型,`always_allow` 表示允许直接调用,`always_ask` 表示每次调用前需要用户确认。 **default_config** `object` | 默认工具配置 `agent.tools.default_config` 未在 `configs` 中单独列出的工具所使用的默认配置。 **enabled** `boolean` | 是否启用 `agent.tools.default_config.enabled` 未单独配置的工具是否默认启用。 **permission_policy** `object` | 权限策略 `agent.tools.default_config.permission_policy` 未单独配置的工具使用的调用许可策略。 **type** `string` | 策略类型 `agent.tools.default_config.permission_policy.type` 策略类型,`always_allow` 表示允许直接调用,`always_ask` 表示每次调用前需要用户确认。 **description** `string` | 自定义工具说明 `agent.tools.description` 会话创建时冻结的自定义工具说明,用于记录工具的功能和适用场景。 **input_schema** `object` | 输入参数定义 `agent.tools.input_schema` 返回 Session 的 Agent 快照中记录的自定义工具输入参数 JSON Schema。 **properties** `object` | 参数属性定义 `agent.tools.input_schema.properties` 返回 Session 的 Agent 快照中记录的 JSON Schema 属性映射。每个键为参数名,每个值为对应参数的 JSON Schema 子对象。 **required** `string[]` | 必填参数名称列表 `agent.tools.input_schema.required` 返回调用自定义工具时必须提供的参数名称列表。 **type** `string` | Schema 类型 `agent.tools.input_schema.type` 返回 JSON Schema 的顶层类型,固定为 `object`。 **mcp_server_name** `string` | MCP 服务名称 `agent.tools.mcp_server_name` 会话中 `mcp_toolset` 引用的 MCP 服务名称。 **name** `string` | 自定义工具名称 `agent.tools.name` 会话创建时冻结的自定义工具名称。 **created_at** `string` | 创建时间 会话创建完成的时间,采用 RFC 3339 格式。 **environment_id** `string` | 环境 ID 会话实际使用的 Environment ID。 **id** `string` | 会话 ID 会话唯一标识符,格式为 `sesn-` 开头的字符串 **status** `string` | 会话状态 会话运行状态。普通创建成功后,初始状态为 `idle`,可继续发送事件。取值:`idle` / `running` / `terminated` / `rescheduling` / `initializing` / `failed` / `upgrading`。 **type** `string` | 对象类型 对象类型,固定为`session` **updated_at** `string` | 更新时间 会话信息最后更新的时间,采用 RFC 3339 格式。 **archived_at** `string` | 归档时间 会话归档的时间,采用 RFC 3339 格式。会话未归档时,服务端不返回该字段。 **environment** `object` | 环境信息 会话实际使用的环境配置快照。后续修改原 Environment 不会改变该快照。 **created_at** `string` | 创建时间 `environment.created_at` 环境创建完成的时间,采用 RFC 3339 格式。 **id** `string` | 环境 ID `environment.id` 环境唯一标识符 **name** `string` | 环境名称 `environment.name` 环境名称,用于在环境列表和会话配置中区分该环境。 **type** `string` | 对象类型 `environment.type` 会话环境快照类型。`environment` 表示直接使用基础 Environment;`environment_with_overrides` 表示当前会话使用了环境配置覆写。 **updated_at** `string` | 更新时间 `environment.updated_at` 环境配置最后更新的时间,采用 RFC 3339 格式。 **config** `object` | 环境配置 `environment.config` 环境运行配置,包含运行类型、网络策略、依赖包与环境变量 **type** `string` | 环境类型 `environment.config.type` 运行环境类型:`cloud` 表示平台托管环境,`self_hosted` 表示用户自托管环境。 **env** `object` | 环境变量 `environment.config.env` 会话运行环境中的环境变量键值对 **networking** `object` | 出网策略 `environment.config.networking` 容器出网策略配置 **type** `string` | 出网策略类型 `environment.config.networking.type` 会话当前使用的出网策略。`unrestricted` 表示不限制出网目标。 **packages** `object` | 依赖包配置 `environment.config.packages` 启动时预装的依赖包配置 **apt** `string[]` | apt 包 `environment.config.packages.apt` 会话环境启动时通过 apt 预装的系统包列表。 **cargo** `string[]` | Cargo 包 `environment.config.packages.cargo` 会话环境启动时通过 Cargo 预装的 Rust crate 列表。 **gem** `string[]` | gem 包 `environment.config.packages.gem` 会话环境启动时通过 RubyGems 预装的 Ruby 包列表。 **go** `string[]` | Go 模块 `environment.config.packages.go` 会话环境启动时通过 Go 工具链预装的模块依赖列表。 **npm** `string[]` | npm 包 `environment.config.packages.npm` 会话环境启动时通过 npm 预装的 Node.js 包列表。 **pip** `string[]` | pip 包 `environment.config.packages.pip` 会话环境启动时通过 pip 预装的 Python 包列表。 **type** `string` | 配置类型 `environment.config.packages.type` 依赖包配置的类型标识,固定为 `packages`。 **setup_script** `string` | 启动脚本 `environment.config.setup_script` 会话运行环境启动时执行的初始化脚本;留空或未设置表示不执行任何脚本 **tos** `object` | 产物存储配置 `environment.config.tos` 智能体产物持久化存储配置。为空表示未配置用户 Bucket,产物落到方舟公共 TOS **bucket** `string` | TOS 桶 `environment.config.tos.bucket` 会话环境快照中保存的用户 TOS 存储桶名称。 **prefix** `string` | 对象前缀 `environment.config.tos.prefix` 会话环境快照中保存的对象存储目录前缀。 **description** `string` | 环境描述 `environment.description` 环境描述,用于说明环境的用途、网络策略、依赖包等配置 **metadata** `object` | 自定义元数据 `environment.metadata` 用户自定义元数据 **overridden_fields** `string[]` | 覆写字段 `environment.overridden_fields` 当前会话相对基础 Environment 实际覆写的 `config` 子字段名称列表。仅在 *type* 为 `environment_with_overrides` 且存在覆写字段时返回。 **scope** `string` | 作用域 `environment.scope` 环境作用域:`organization` 表示组织内共享;`account` 表示账号内可见。 **resources** `object[]` | 资源列表 会话创建后实际挂载到运行环境的资源列表。 文件资源 `object` 通过 Files API 上传并挂载到会话的文件。 **created_at** `string` | 挂载时间 `resources.created_at` 资源挂载到会话的时间,采用 RFC 3339 格式。 **id** `string` | 资源 ID `resources.id` 会话资源 ID。 **type** `string` | 资源类型 `resources.type` 资源类型,固定为 `file`。 **updated_at** `string` | 更新时间 `resources.updated_at` 会话资源信息最后更新的时间,采用 RFC 3339 格式。 **access** `string` | 访问权限 `resources.access` 文件访问权限,固定为 `read_only`。 **file_id** `string` | 文件 ID `resources.file_id` 当前可用的文件 ID。 **mount_path** `string` | 挂载路径 `resources.mount_path` 文件在会话运行环境中的完整挂载路径。 记忆库资源 `object` 挂载到会话的记忆库。 **created_at** `string` | 挂载时间 `resources.created_at` 资源挂载到会话的时间,采用 RFC 3339 格式。 **id** `string` | 资源 ID `resources.id` 会话资源 ID。 **type** `string` | 资源类型 `resources.type` 资源类型,固定为 `memory_store`。 **updated_at** `string` | 更新时间 `resources.updated_at` 会话资源信息最后更新的时间,采用 RFC 3339 格式。 **access** `string` | 访问权限 `resources.access` 会话对记忆库的访问权限。可选值:`read_only`、`read_write`。 **instructions** `string` | 使用指导 `resources.instructions` 会话当前用于该记忆库的使用指导。 **memory_store_id** `string` | 记忆库 ID `resources.memory_store_id` 挂载到会话的记忆库 ID。 TOS 资源 `object` 挂载到会话的 TOS 对象目录。 **created_at** `string` | 挂载时间 `resources.created_at` 资源挂载到会话的时间,采用 RFC 3339 格式。 **id** `string` | 资源 ID `resources.id` 会话资源 ID。 **type** `string` | 资源类型 `resources.type` 资源类型,固定为 `tos`。 **updated_at** `string` | 更新时间 `resources.updated_at` 会话资源信息最后更新的时间,采用 RFC 3339 格式。 **access** `string` | 访问权限 `resources.access` 会话对 TOS 目录的访问权限。可选值:`read_only`、`read_write`。 **mount_path** `string` | 挂载路径 `resources.mount_path` TOS 目录在会话运行环境中的挂载路径。创建会话时未指定挂载路径,则不返回该字段。 **tos_bucket** `string` | TOS 存储桶 `resources.tos_bucket` TOS 挂载源所在的存储桶名称。 **tos_key** `string` | TOS 目录前缀 `resources.tos_key` TOS 中已挂载目录的对象前缀。 **tos_region** `string` | TOS 地域 `resources.tos_region` TOS 挂载源所在地域的 Region ID。 **scene** `string` | 会话场景 会话场景标记。 - `default`:普通会话。 - `dreams`:用于 Dream 记忆整理任务的会话。 **tags** `object[]` | 标签列表 会话关联的标签列表,用于分类检索 **key** `string` | 标签键 `tags.key` 标签键,用于分类和检索。必填,最长 128 个字符;支持字母、数字、空格及 `_ . : / = + - @`。 **value** `string` | 标签值 `tags.value` 用于记录该标签分类的具体内容。 **title** `string` | 会话标题 会话标题,便于用户在会话列表中识别 **vault_ids** `string[] / null` | 保管库 ID 列表 会话可访问的保管库 ID 列表。智能体可在运行过程中使用其中的凭证。 ## 代码示例 ## 创建会话 ### cURL #### Request ```Bash curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/sessions" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d @- <<'EOF' { "agent": "", "environment_id": "", "title": "Q3 规划头脑风暴", "tags": [ {"key": "team", "value": "agent-infra"}, {"key": "quarter", "value": "2026Q3"} ] } EOF ``` #### Response ``` { "id": "sesn-20260715083012-a3f7b", "type": "session", "agent": { "id": "", "type": "agent", "name": "", "version": 1, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T08:00:00Z" }, "environment_id": "", "title": "Q3 规划头脑风暴", "vault_ids": [], "resources": [], "status": "idle", "created_at": "2026-07-15T08:30:12.000Z", "updated_at": "2026-07-15T08:30:12.000Z", "tags": [ {"key": "team", "value": "agent-infra"}, {"key": "quarter", "value": "2026Q3"} ] } ``` ### Python #### Request ```python import os from arkruntime import Ark client = Ark( api_key=os.environ["ARK_API_KEY"], base_url="https://ark.cn-beijing.volces.com/api/v3", ) session = client.sessions.create( agent="", environment_id="", title="Q3 规划头脑风暴", tags=[ {"key": "team", "value": "agent-infra"}, {"key": "quarter", "value": "2026Q3"}, ], ) print(session) ``` #### Response ``` { "id": "sesn-20260715083012-a3f7b", "type": "session", "agent": { "id": "", "type": "agent", "name": "", "version": 1, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T08:00:00Z" }, "environment_id": "", "title": "Q3 规划头脑风暴", "vault_ids": [], "resources": [], "status": "idle", "created_at": "2026-07-15T08:30:12.000Z", "updated_at": "2026-07-15T08:30:12.000Z", "tags": [ {"key": "team", "value": "agent-infra"}, {"key": "quarter", "value": "2026Q3"} ] } ``` ### Java #### Request ```java // pom.xml 依赖: // // com.volcengine // ark-runtime // 0.9.0 // import com.volcengine.ark.runtime.models.session.AgentIdentifier; import com.volcengine.ark.runtime.models.session.CreateSessionRequest; import com.volcengine.ark.runtime.models.session.Session; import com.volcengine.ark.runtime.models.session.Tag; import com.volcengine.ark.runtime.service.ArkService; import java.util.Arrays; public class Main { public static void main(String[] args) throws Exception { ArkService service = ArkService.builder() .apiKey(System.getenv("ARK_API_KEY")) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); Session session = service.createSession( CreateSessionRequest.builder() .agent(AgentIdentifier.ofString("")) .environmentId("") .title("Q3 规划头脑风暴") .tags(Arrays.asList( Tag.builder().key("team").value("agent-infra").build(), Tag.builder().key("quarter").value("2026Q3").build())) .build()); System.out.println(session); service.shutdownExecutor(); } } ``` #### Response ``` { "id": "sesn-20260715083012-a3f7b", "type": "session", "agent": { "id": "", "type": "agent", "name": "", "version": 1, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T08:00:00Z" }, "environment_id": "", "title": "Q3 规划头脑风暴", "vault_ids": [], "resources": [], "status": "idle", "created_at": "2026-07-15T08:30:12.000Z", "updated_at": "2026-07-15T08:30:12.000Z", "tags": [ {"key": "team", "value": "agent-infra"}, {"key": "quarter", "value": "2026Q3"} ] } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" sessionmodel "github.com/volcengine/ark-runtime-go/arkruntime/model/session" ) func main() { ctx := context.Background() client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) s, err := client.CreateSession(ctx, &sessionmodel.CreateSessionRequest{ Agent: sessionmodel.NewStringAgentIdentifier(""), EnvironmentID: sessionmodel.NewOptString(""), Title: sessionmodel.NewOptString("Q3 规划头脑风暴"), Tags: []sessionmodel.Tag{ {Key: "team", Value: sessionmodel.NewOptString("agent-infra")}, {Key: "quarter", Value: sessionmodel.NewOptString("2026Q3")}, }, }) if err != nil { panic(err) } fmt.Println(s) } ``` #### Response ``` { "id": "sesn-20260715083012-a3f7b", "type": "session", "agent": { "id": "", "type": "agent", "name": "", "version": 1, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T08:00:00Z" }, "environment_id": "", "title": "Q3 规划头脑风暴", "vault_ids": [], "resources": [], "status": "idle", "created_at": "2026-07-15T08:30:12.000Z", "updated_at": "2026-07-15T08:30:12.000Z", "tags": [ {"key": "team", "value": "agent-infra"}, {"key": "quarter", "value": "2026Q3"} ] } ``` --- # 查询会话列表 Source: https://ark.volcengine.com/region:cn-beijing/docs/list-sessions-api `GET https://ark.cn-beijing.volces.com/api/v3/sessions` 分页查询当前账号下的会话列表,支持按智能体、状态、标签和创建时间过滤。每条结果包含该会话当前可见的智能体、环境、资源和标签信息。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Query 参数 > 在 URL Query String 中传入。 **agent_id** `string` | 智能体 ID 按智能体 ID 过滤,只返回指定智能体的会话 **created_at_gt** `string` | 创建时间下界(不含) 创建时间大于此值(ISO 8601),不含边界 **created_at_gte** `string` | 创建时间下界(含) 创建时间大于等于此值(ISO 8601),含边界 **created_at_lt** `string` | 创建时间上界(不含) 创建时间小于此值(ISO 8601),不含边界 **created_at_lte** `string` | 创建时间上界(含) 创建时间小于等于此值(ISO 8601),含边界 **limit** `integer` `默认值 20` | 每页数量 单页返回的会话数量。 **取值范围**:`[1, 100]` **memory_store_id** `string` | 记忆库 ID 按已挂载的记忆库筛选,仅返回资源列表中包含指定 `memory_store_id` 的会话。 **order** `string` `默认值 desc` | 排序方向 排序方向。`asc` 表示按创建时间升序,`desc` 表示按创建时间降序。 **page** `string` | 下一页标识 下一页标识。首次请求时省略;后续将上一次响应的 `next_page` 原样传入,并保持 `order` 与过滤条件不变。 **scene** `string` | 会话场景 按会话场景标记过滤。省略或传空值时不过滤。 常用值为 `default` 和 `dreams`。传入其他值不会报错,但会返回空列表。 **status** `string[]` | 会话状态 按会话运行状态过滤。可重复传入该参数;服务端返回匹配任一状态的会话。可选值:`idle`、`running`、`terminated`、`rescheduling`、`initializing`、`failed`、`upgrading`。 **tags** `object[]` | 标签过滤 按标签过滤,格式为 `tags[]=`,例如 `tags[team]=agent-infra`。多个不同标签之间取交集;值为空时仅按标签键匹配。 **key** `string` `必选` | 标签键 `tags.key` 标签键,用于分类和检索 **value** `string` | 标签值 `tags.value` 用于记录该标签分类的具体内容。 ## 响应参数 **data** `object[]` | 会话列表 匹配查询条件的会话列表,按 `order` 指定的方向排序。默认按创建时间降序返回,即最新创建的会话在前;无匹配结果时返回空数组 `[]`。 **agent** `object` | 智能体信息 `data.agent` 会话创建时保存的智能体配置快照。后续更新智能体不会影响该会话中的快照。 **created_at** `string` | 创建时间 `data.agent.created_at` 智能体创建完成的时间,采用 RFC 3339 格式。 **id** `string` | 智能体 ID `data.agent.id` 智能体唯一标识符 **name** `string` | 智能体名称 `data.agent.name` 智能体名称,用于用户识别和管理 **type** `string` | 对象类型 `data.agent.type` 对象类型,固定为`agent` **updated_at** `string` | 更新时间 `data.agent.updated_at` 智能体配置最后更新的时间,采用 RFC 3339 格式。 **version** `integer` | 版本号 `data.agent.version` 会话创建时冻结的智能体版本号。 **base_agent** `string` | 基础智能体类型 `data.agent.base_agent` 会话当前使用的基础 Agent 类型。 - `ark_agent_preview`:通用 Agent。 - `ultra_vision_agent_preview`:Seedance Managed Agent。 **description** `string` | 智能体描述 `data.agent.description` 智能体描述,用于说明智能体的用途、能力范围、适用场景等 **display_name** `string` | 显示名称 `data.agent.display_name` 会话当前使用的智能体显示名称。 **mcp_servers** `object[]` | MCP 服务列表 `data.agent.mcp_servers` 已配置的 MCP 服务列表 **name** `string` | MCP 服务名称 `data.agent.mcp_servers.name` MCP 服务名称,供 `tools[].mcp_server_name` 引用。 **type** `string` | MCP 接入方式 `data.agent.mcp_servers.type` MCP 服务接入方式,固定为 `url`。 **url** `string` | MCP 服务地址 `data.agent.mcp_servers.url` 会话创建时冻结的 MCP 服务访问地址。 **metadata** `object` | 自定义元数据 `data.agent.metadata` 创建智能体时设置的自定义键值对,服务端不定义固定子字段。 **model** `object` | 模型配置 `data.agent.model` 智能体使用的模型配置,包含模型或推理接入点 ID 与推理速度档位。 **id** `string` | 模型或接入点 ID `data.agent.model.id` 智能体调用的模型 ID 或推理接入点 ID。例如模型 ID `doubao-seed-2-1-pro-260628`,或推理接入点 ID `ep-20260907123456-abcd1`。 **protocol** `string` | 调用协议 `data.agent.model.protocol` 会话模型调用使用的协议: - `ark_responses`:方舟 Responses 协议。 - `openai_chat_completions`:OpenAI Chat Completions 兼容协议。 - `openai_responses`:OpenAI Responses 兼容协议。 - `anthropic_messages`:Anthropic Messages 兼容协议。 **reasoning_effort** `string` | 推理投入档位 `data.agent.model.reasoning_effort` 会话当前使用的推理投入档位。 **service_tier** `string` | 推理服务档位 `data.agent.model.service_tier` 会话当前使用的推理服务档位。 **speed** `string` | 推理速度 `data.agent.model.speed` 推理速度模式。可选值:`standard`、`fast`。 **thinking** `string` | 思考模式 `data.agent.model.thinking` 会话当前使用的思考模式。 **multiagent** `object` | 多智能体配置 `data.agent.multiagent` 会话当前使用的多智能体配置。 **agents** `object[]` | 成员智能体 `data.agent.multiagent.agents` 会话创建时冻结的成员智能体列表。 **type** `string` | 引用类型 `data.agent.multiagent.agents.type` 成员引用类型: - `agent`:引用其他智能体。 - `self`:引用当前智能体。 **description** `string` | 智能体说明 `data.agent.multiagent.agents.description` 会话创建时冻结的成员智能体说明。 **display_name** `string` | 显示名称 `data.agent.multiagent.agents.display_name` 会话创建时冻结的成员智能体显示名称。 **id** `string` | 智能体 ID `data.agent.multiagent.agents.id` 成员智能体的 ID;当 `type` 为 `self` 时,返回当前智能体的 ID。 **mcp_servers** `object[]` | MCP 服务列表 `data.agent.multiagent.agents.mcp_servers` 会话创建时冻结的成员智能体 MCP 服务配置列表。 **name** `string` | MCP 服务名称 `data.agent.multiagent.agents.mcp_servers.name` MCP 服务名称,供 `tools[].mcp_server_name` 引用。 **type** `string` | MCP 接入方式 `data.agent.multiagent.agents.mcp_servers.type` MCP 服务接入方式,固定为 `url`。 **url** `string` | MCP 服务地址 `data.agent.multiagent.agents.mcp_servers.url` 会话创建时冻结的 MCP 服务访问地址。 **model** `object` | 模型配置 `data.agent.multiagent.agents.model` 会话创建时冻结的成员智能体模型配置。 **id** `string` | 模型或接入点 ID `data.agent.multiagent.agents.model.id` 成员智能体使用的模型 ID 或推理接入点 ID。 **speed** `string` | 推理速度 `data.agent.multiagent.agents.model.speed` 成员智能体使用的模型推理速度档位。 **name** `string` | 智能体名称 `data.agent.multiagent.agents.name` 会话创建时冻结的成员智能体名称。 **skills** `object[]` | Skill 列表 `data.agent.multiagent.agents.skills` 会话创建时冻结的成员智能体 Skill 配置列表。 **type** `string` | Skill 类型 `data.agent.multiagent.agents.skills.type` Skill 来源类型: - `ark`:方舟平台预置 Skill。 - `skill_hub`:Skill Hub 中的公共 Skill。 - `custom`:当前账号创建的自定义 Skill。 **display_name** `string` | Skill 名称 `data.agent.multiagent.agents.skills.display_name` 会话创建时记录的 Skill 展示名称。 **skill_id** `string` | Skill ID `data.agent.multiagent.agents.skills.skill_id` 会话使用的 Skill ID。 **use_latest** `boolean` | 使用最新版本 `data.agent.multiagent.agents.skills.use_latest` 是否在创建会话时选择该 Skill 的最新版本。`true` 表示选择当时的最新版本,`false` 表示使用 `version` 指定的版本。 **version** `string` | Skill 版本 `data.agent.multiagent.agents.skills.version` 会话创建时冻结的 Skill 版本号。 **system** `string` | 系统提示词 `data.agent.multiagent.agents.system` 会话创建时冻结的成员智能体系统提示词。 **tools** `object[]` | 工具列表 `data.agent.multiagent.agents.tools` 会话创建时冻结的成员智能体工具配置列表。 **type** `string` | 工具类型 `data.agent.multiagent.agents.tools.type` 工具类型: - `agent_toolset_20260916`:当前版本的方舟内置工具集。 - `agent_toolset_multimodal_20260825`:使用 `image_generate`、`video_generate`、`visual_search`、`general_search`、`compose_video` 和 `todo_write` 工具。 - `mcp_toolset`:指定 MCP 服务提供的工具集。 - `custom`:由客户端执行的自定义工具。 可选值:`agent_toolset_20260916`、`agent_toolset_20260701`、`agent_toolset_multimodal_20260825`、`mcp_toolset`、`custom`。 **configs** `object[]` | 工具配置 `data.agent.multiagent.agents.tools.configs` 会话创建时冻结的逐项工具配置。 **name** `string` | 工具名称 `data.agent.multiagent.agents.tools.configs.name` 会话快照中记录的工具名称。 **enabled** `boolean` | 是否启用 `data.agent.multiagent.agents.tools.configs.enabled` 工具是否启用。 **models** `object[]` | 工具模型列表 `data.agent.multiagent.agents.tools.configs.models` 会话快照中记录的图片生成或视频生成工具模型 ID 或推理接入点 ID 列表。 **id** `string` | 模型或接入点 ID `data.agent.multiagent.agents.tools.configs.models.id` 该工具绑定的模型 ID 或推理接入点 ID。 **default** `boolean` | 是否为默认模型 `data.agent.multiagent.agents.tools.configs.models.default` 是否为该工具的默认模型。 **name** `string` | 模型名称 `data.agent.multiagent.agents.tools.configs.models.name` 服务端根据模型 ID 或推理接入点 ID 返回的模型名称。 **version** `string` | 模型版本 `data.agent.multiagent.agents.tools.configs.models.version` 服务端根据模型 ID 或推理接入点 ID 返回的模型版本。 **permission_policy** `object` | 权限策略 `data.agent.multiagent.agents.tools.configs.permission_policy` 工具使用的调用许可策略。 **type** `string` | 策略类型 `data.agent.multiagent.agents.tools.configs.permission_policy.type` 策略类型,`always_allow` 表示允许直接调用,`always_ask` 表示每次调用前需要用户确认。 **default_config** `object` | 默认工具配置 `data.agent.multiagent.agents.tools.default_config` 未在 `configs` 中单独列出的工具所使用的默认配置。 **enabled** `boolean` | 是否启用 `data.agent.multiagent.agents.tools.default_config.enabled` 未单独配置的工具是否默认启用。 **permission_policy** `object` | 权限策略 `data.agent.multiagent.agents.tools.default_config.permission_policy` 未单独配置的工具使用的调用许可策略。 **type** `string` | 策略类型 `data.agent.multiagent.agents.tools.default_config.permission_policy.type` 策略类型,`always_allow` 表示允许直接调用,`always_ask` 表示每次调用前需要用户确认。 **description** `string` | 自定义工具说明 `data.agent.multiagent.agents.tools.description` 会话创建时冻结的自定义工具说明,用于记录工具的功能和适用场景。 **input_schema** `object` | 输入参数定义 `data.agent.multiagent.agents.tools.input_schema` 返回 Session 的 Agent 快照中记录的自定义工具输入参数 JSON Schema。 **properties** `object` | 参数属性定义 `data.agent.multiagent.agents.tools.input_schema.properties` 返回 Session 的 Agent 快照中记录的 JSON Schema 属性映射。每个键为参数名,每个值为对应参数的 JSON Schema 子对象。 **required** `string[]` | 必填参数名称列表 `data.agent.multiagent.agents.tools.input_schema.required` 返回调用自定义工具时必须提供的参数名称列表。 **type** `string` | Schema 类型 `data.agent.multiagent.agents.tools.input_schema.type` 返回 JSON Schema 的顶层类型,固定为 `object`。 **mcp_server_name** `string` | MCP 服务名称 `data.agent.multiagent.agents.tools.mcp_server_name` 会话中 `mcp_toolset` 引用的 MCP 服务名称。 **name** `string` | 自定义工具名称 `data.agent.multiagent.agents.tools.name` 会话创建时冻结的自定义工具名称。 **version** `integer` | 版本号 `data.agent.multiagent.agents.version` 会话创建时冻结的成员智能体版本号。 **type** `string` | 协作模式 `data.agent.multiagent.type` 多智能体协作模式,固定为 `coordinator`。 **skills** `object[]` | 技能列表 `data.agent.skills` 会话创建时冻结的 Skill 配置列表。 **type** `string` | Skill 类型 `data.agent.skills.type` Skill 来源类型: - `ark`:方舟平台预置 Skill。 - `skill_hub`:Skill Hub 中的公共 Skill。 - `custom`:当前账号创建的自定义 Skill。 **display_name** `string` | Skill 名称 `data.agent.skills.display_name` 会话创建时记录的 Skill 展示名称。 **skill_id** `string` | Skill ID `data.agent.skills.skill_id` 会话使用的 Skill ID。 **use_latest** `boolean` | 使用最新版本 `data.agent.skills.use_latest` 是否在创建会话时选择该 Skill 的最新版本。`true` 表示选择当时的最新版本,`false` 表示使用 `version` 指定的版本。 **version** `string` | Skill 版本 `data.agent.skills.version` 会话创建时冻结的 Skill 版本号。 **system** `string` | 系统提示词 `data.agent.system` 系统提示词,定义智能体的角色和行为规则 **tools** `object[]` | 工具列表 `data.agent.tools` 已配置的工具列表 **type** `string` | 工具类型 `data.agent.tools.type` 工具类型: - `agent_toolset_20260916`:当前版本的方舟内置工具集。 - `agent_toolset_multimodal_20260825`:使用 `image_generate`、`video_generate`、`visual_search`、`general_search`、`compose_video` 和 `todo_write` 工具。 - `mcp_toolset`:指定 MCP 服务提供的工具集。 - `custom`:由客户端执行的自定义工具。 可选值:`agent_toolset_20260916`、`agent_toolset_20260701`、`agent_toolset_multimodal_20260825`、`mcp_toolset`、`custom`。 **configs** `object[]` | 工具配置 `data.agent.tools.configs` 会话创建时冻结的逐项工具配置。 **name** `string` | 工具名称 `data.agent.tools.configs.name` 会话快照中记录的工具名称。 **enabled** `boolean` | 是否启用 `data.agent.tools.configs.enabled` 工具是否启用。 **models** `object[]` | 工具模型列表 `data.agent.tools.configs.models` 会话快照中记录的图片生成或视频生成工具模型 ID 或推理接入点 ID 列表。 **id** `string` | 模型或接入点 ID `data.agent.tools.configs.models.id` 该工具绑定的模型 ID 或推理接入点 ID。 **default** `boolean` | 是否为默认模型 `data.agent.tools.configs.models.default` 是否为该工具的默认模型。 **name** `string` | 模型名称 `data.agent.tools.configs.models.name` 服务端根据模型 ID 或推理接入点 ID 返回的模型名称。 **version** `string` | 模型版本 `data.agent.tools.configs.models.version` 服务端根据模型 ID 或推理接入点 ID 返回的模型版本。 **permission_policy** `object` | 权限策略 `data.agent.tools.configs.permission_policy` 工具使用的调用许可策略。 **type** `string` | 策略类型 `data.agent.tools.configs.permission_policy.type` 策略类型,`always_allow` 表示允许直接调用,`always_ask` 表示每次调用前需要用户确认。 **default_config** `object` | 默认工具配置 `data.agent.tools.default_config` 未在 `configs` 中单独列出的工具所使用的默认配置。 **enabled** `boolean` | 是否启用 `data.agent.tools.default_config.enabled` 未单独配置的工具是否默认启用。 **permission_policy** `object` | 权限策略 `data.agent.tools.default_config.permission_policy` 未单独配置的工具使用的调用许可策略。 **type** `string` | 策略类型 `data.agent.tools.default_config.permission_policy.type` 策略类型,`always_allow` 表示允许直接调用,`always_ask` 表示每次调用前需要用户确认。 **description** `string` | 自定义工具说明 `data.agent.tools.description` 会话创建时冻结的自定义工具说明,用于记录工具的功能和适用场景。 **input_schema** `object` | 输入参数定义 `data.agent.tools.input_schema` 返回 Session 的 Agent 快照中记录的自定义工具输入参数 JSON Schema。 **properties** `object` | 参数属性定义 `data.agent.tools.input_schema.properties` 返回 Session 的 Agent 快照中记录的 JSON Schema 属性映射。每个键为参数名,每个值为对应参数的 JSON Schema 子对象。 **required** `string[]` | 必填参数名称列表 `data.agent.tools.input_schema.required` 返回调用自定义工具时必须提供的参数名称列表。 **type** `string` | Schema 类型 `data.agent.tools.input_schema.type` 返回 JSON Schema 的顶层类型,固定为 `object`。 **mcp_server_name** `string` | MCP 服务名称 `data.agent.tools.mcp_server_name` 会话中 `mcp_toolset` 引用的 MCP 服务名称。 **name** `string` | 自定义工具名称 `data.agent.tools.name` 会话创建时冻结的自定义工具名称。 **created_at** `string` | 创建时间 `data.created_at` 会话创建完成的时间,采用 RFC 3339 格式。 **environment_id** `string` | 环境 ID `data.environment_id` 会话实际使用的 Environment ID。 **id** `string` | 会话 ID `data.id` 会话唯一标识符,格式为 `sesn-xxxxx`。 **status** `string` | 会话状态 `data.status` 会话运行状态。可选值:`idle`、`running`、`terminated`、`rescheduling`、`initializing`、`failed`、`upgrading`。 **type** `string` | 对象类型 `data.type` 对象类型,固定为`session` **updated_at** `string` | 更新时间 `data.updated_at` 会话信息最后更新的时间,采用 RFC 3339 格式。 **archived_at** `string` | 归档时间 `data.archived_at` 会话归档的时间,采用 RFC 3339 格式。会话未归档时,服务端不返回该字段。 **environment** `object` | 环境信息 `data.environment` 会话实际使用的环境配置快照。后续修改原 Environment 不会改变该快照。 **created_at** `string` | 创建时间 `data.environment.created_at` 环境创建完成的时间,采用 RFC 3339 格式。 **id** `string` | 环境 ID `data.environment.id` 环境唯一标识符 **name** `string` | 环境名称 `data.environment.name` 环境名称,用于在环境列表和会话配置中区分该环境。 **type** `string` | 对象类型 `data.environment.type` 会话环境快照类型。`environment` 表示直接使用基础 Environment;`environment_with_overrides` 表示当前会话使用了环境配置覆写。 **updated_at** `string` | 更新时间 `data.environment.updated_at` 环境配置最后更新的时间,采用 RFC 3339 格式。 **config** `object` | 环境配置 `data.environment.config` 环境运行配置,包含运行类型、网络策略、依赖包与环境变量 **type** `string` | 环境类型 `data.environment.config.type` 运行环境类型:`cloud` 表示平台托管环境,`self_hosted` 表示用户自托管环境。 **env** `object` | 环境变量 `data.environment.config.env` 会话运行环境中的环境变量键值对 **networking** `object` | 出网策略 `data.environment.config.networking` 容器出网策略配置 **type** `string` | 出网策略类型 `data.environment.config.networking.type` 会话当前使用的出网策略。`unrestricted` 表示不限制出网目标。 **packages** `object` | 依赖包配置 `data.environment.config.packages` 启动时预装的依赖包配置 **apt** `string[]` | apt 包 `data.environment.config.packages.apt` 会话环境启动时通过 apt 预装的系统包列表。 **cargo** `string[]` | Cargo 包 `data.environment.config.packages.cargo` 会话环境启动时通过 Cargo 预装的 Rust crate 列表。 **gem** `string[]` | gem 包 `data.environment.config.packages.gem` 会话环境启动时通过 RubyGems 预装的 Ruby 包列表。 **go** `string[]` | Go 模块 `data.environment.config.packages.go` 会话环境启动时通过 Go 工具链预装的模块依赖列表。 **npm** `string[]` | npm 包 `data.environment.config.packages.npm` 会话环境启动时通过 npm 预装的 Node.js 包列表。 **pip** `string[]` | pip 包 `data.environment.config.packages.pip` 会话环境启动时通过 pip 预装的 Python 包列表。 **type** `string` | 配置类型 `data.environment.config.packages.type` 依赖包配置的类型标识,固定为 `packages`。 **setup_script** `string` | 启动脚本 `data.environment.config.setup_script` 会话运行环境启动时执行的初始化脚本;留空或未设置表示不执行任何脚本 **tos** `object` | 产物存储配置 `data.environment.config.tos` 智能体产物持久化存储配置。为空表示未配置用户 Bucket,产物落到方舟公共 TOS **bucket** `string` | TOS 桶 `data.environment.config.tos.bucket` 会话环境快照中保存的用户 TOS 存储桶名称。 **prefix** `string` | 对象前缀 `data.environment.config.tos.prefix` 会话环境快照中保存的对象存储目录前缀。 **description** `string` | 环境描述 `data.environment.description` 环境描述,用于说明环境的用途、网络策略、依赖包等配置 **metadata** `object` | 自定义元数据 `data.environment.metadata` 用户自定义元数据 **overridden_fields** `string[]` | 覆写字段 `data.environment.overridden_fields` 当前会话相对基础 Environment 实际覆写的 `config` 子字段名称列表。仅在 *type* 为 `environment_with_overrides` 且存在覆写字段时返回。 **scope** `string` | 作用域 `data.environment.scope` 环境作用域:`organization` 表示组织内共享;`account` 表示账号内可见。 **resources** `object[]` | 资源列表 `data.resources` 会话当前挂载到运行环境的资源列表。 文件资源 `object` 通过 Files API 上传并挂载到会话的文件。 **created_at** `string` | 挂载时间 `data.resources.created_at` 资源挂载到会话的时间,采用 RFC 3339 格式。 **id** `string` | 资源 ID `data.resources.id` 会话资源 ID。 **type** `string` | 资源类型 `data.resources.type` 资源类型,固定为 `file`。 **updated_at** `string` | 更新时间 `data.resources.updated_at` 会话资源信息最后更新的时间,采用 RFC 3339 格式。 **access** `string` | 访问权限 `data.resources.access` 文件访问权限,固定为 `read_only`。 **file_id** `string` | 文件 ID `data.resources.file_id` 当前可用的文件 ID。 **mount_path** `string` | 挂载路径 `data.resources.mount_path` 文件在会话运行环境中的完整挂载路径。 记忆库资源 `object` 挂载到会话的记忆库。 **created_at** `string` | 挂载时间 `data.resources.created_at` 资源挂载到会话的时间,采用 RFC 3339 格式。 **id** `string` | 资源 ID `data.resources.id` 会话资源 ID。 **type** `string` | 资源类型 `data.resources.type` 资源类型,固定为 `memory_store`。 **updated_at** `string` | 更新时间 `data.resources.updated_at` 会话资源信息最后更新的时间,采用 RFC 3339 格式。 **access** `string` | 访问权限 `data.resources.access` 会话对记忆库的访问权限。可选值:`read_only`、`read_write`。 **instructions** `string` | 使用指导 `data.resources.instructions` 会话当前用于该记忆库的使用指导。 **memory_store_id** `string` | 记忆库 ID `data.resources.memory_store_id` 挂载到会话的记忆库 ID。 TOS 资源 `object` 挂载到会话的 TOS 对象目录。 **created_at** `string` | 挂载时间 `data.resources.created_at` 资源挂载到会话的时间,采用 RFC 3339 格式。 **id** `string` | 资源 ID `data.resources.id` 会话资源 ID。 **type** `string` | 资源类型 `data.resources.type` 资源类型,固定为 `tos`。 **updated_at** `string` | 更新时间 `data.resources.updated_at` 会话资源信息最后更新的时间,采用 RFC 3339 格式。 **access** `string` | 访问权限 `data.resources.access` 会话对 TOS 目录的访问权限。可选值:`read_only`、`read_write`。 **mount_path** `string` | 挂载路径 `data.resources.mount_path` TOS 目录在会话运行环境中的挂载路径。创建会话时未指定挂载路径,则不返回该字段。 **tos_bucket** `string` | TOS 存储桶 `data.resources.tos_bucket` TOS 挂载源所在的存储桶名称。 **tos_key** `string` | TOS 目录前缀 `data.resources.tos_key` TOS 中已挂载目录的对象前缀。 **tos_region** `string` | TOS 地域 `data.resources.tos_region` TOS 挂载源所在地域的 Region ID。 **scene** `string` | 会话场景 `data.scene` 会话场景标记。 - `default`:普通会话。 - `dreams`:用于 Dream 记忆整理任务的会话。 **tags** `object[]` | 标签列表 `data.tags` 会话标签列表,每项包含 `key` 和可选的 `value`。 **key** `string` | 标签键 `data.tags.key` 标签键,用于分类和检索 **value** `string` | 标签值 `data.tags.value` 用于记录该标签分类的具体内容。 **title** `string` | 会话标题 `data.title` 会话标题,便于用户在会话列表中识别 **vault_ids** `string[] / null` | 保管库 ID 列表 `data.vault_ids` 会话绑定的保管库 ID 列表,智能体可访问其中的凭据 **next_page** `string` | 下一页标识 服务端返回的下一页标识。客户端无需解析,将此值原样作为下一次请求的 `page` 参数即可继续翻页;未返回此字段时表示已到最后一页。 ## 代码示例 ## 查询会话列表 ### cURL #### Request ```Bash curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/sessions?limit=20&order=desc&status=idle" \ -H "Authorization: Bearer $ARK_API_KEY" ``` #### Response ``` { "data": [ { "id": "sesn-20260715083012-a3f7b", "type": "session", "agent": { "id": "", "type": "agent", "name": "", "version": 1, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T08:00:00Z" }, "environment_id": "", "title": "Q3 规划头脑风暴", "status": "idle", "created_at": "2026-07-15T08:30:12.000Z", "updated_at": "2026-07-15T09:00:00.000Z", "tags": [ {"key": "team", "value": "agent-infra"} ] } ], "next_page": "page_xxxxxxxx" } ``` ### Python #### Request ```python import os from arkruntime import Ark client = Ark( api_key=os.environ["ARK_API_KEY"], base_url="https://ark.cn-beijing.volces.com/api/v3", ) page = client.sessions.list( limit=20, order="desc", status=["idle"], ) print(page) ``` #### Response ``` { "data": [ { "id": "sesn-20260715083012-a3f7b", "type": "session", "agent": { "id": "", "type": "agent", "name": "", "version": 1, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T08:00:00Z" }, "environment_id": "", "title": "Q3 规划头脑风暴", "status": "idle", "created_at": "2026-07-15T08:30:12.000Z", "updated_at": "2026-07-15T09:00:00.000Z", "tags": [ {"key": "team", "value": "agent-infra"} ] } ], "next_page": "page_xxxxxxxx" } ``` ### Java #### Request ```java // pom.xml 依赖: // // com.volcengine // ark-runtime // 0.9.0 // import com.volcengine.ark.runtime.models.session.ListSessionsResponse; import com.volcengine.ark.runtime.service.ArkService; import java.util.Collections; public class Main { public static void main(String[] args) throws Exception { ArkService service = ArkService.builder() .apiKey(System.getenv("ARK_API_KEY")) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); ListSessionsResponse page = service.listSessions( null, null, null, null, null, null, 20, null, "desc", null, Collections.singletonList("idle")); System.out.println(page); service.shutdownExecutor(); } } ``` #### Response ``` { "data": [ { "id": "sesn-20260715083012-a3f7b", "type": "session", "agent": { "id": "", "type": "agent", "name": "", "version": 1, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T08:00:00Z" }, "environment_id": "", "title": "Q3 规划头脑风暴", "status": "idle", "created_at": "2026-07-15T08:30:12.000Z", "updated_at": "2026-07-15T09:00:00.000Z", "tags": [ {"key": "team", "value": "agent-infra"} ] } ], "next_page": "page_xxxxxxxx" } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" sessionmodel "github.com/volcengine/ark-runtime-go/arkruntime/model/session" ) func main() { ctx := context.Background() client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) resp, err := client.ListSessions(ctx, &sessionmodel.SessionsListParams{ Limit: sessionmodel.NewOptInt32(20), Order: sessionmodel.NewOptListSessionsOrder(sessionmodel.ListSessionsOrderDesc), Status: []sessionmodel.SessionStatus{sessionmodel.SessionStatusIdle}, }) if err != nil { panic(err) } fmt.Println(resp) } ``` #### Response ``` { "data": [ { "id": "sesn-20260715083012-a3f7b", "type": "session", "agent": { "id": "", "type": "agent", "name": "", "version": 1, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T08:00:00Z" }, "environment_id": "", "title": "Q3 规划头脑风暴", "status": "idle", "created_at": "2026-07-15T08:30:12.000Z", "updated_at": "2026-07-15T09:00:00.000Z", "tags": [ {"key": "team", "value": "agent-infra"} ] } ], "next_page": "page_xxxxxxxx" } ``` --- # 查询会话详情 Source: https://ark.volcengine.com/region:cn-beijing/docs/get-session-api `GET https://ark.cn-beijing.volces.com/api/v3/sessions/{session_id}` 查询指定会话的详细信息,包括智能体、会话运行环境、资源、状态和标签等。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **session_id** `string` `必选` | 会话 ID 要查询的会话 ID,来自创建会话响应的 `id`,或查询会话列表中某一项的 `id`。 ## 响应参数 **agent** `object` | 智能体信息 创建会话时保存的智能体配置快照,包含该会话实际使用的模型、系统提示词、工具、MCP 服务和技能等配置。后续更新智能体不会影响该会话中的快照。 **created_at** `string` | 创建时间 `agent.created_at` 智能体创建完成的时间,采用 RFC 3339 格式。 **id** `string` | 智能体 ID `agent.id` 会话当前使用的智能体 ID。 **name** `string` | 智能体名称 `agent.name` 会话当前使用的智能体名称。 **type** `string` | 对象类型 `agent.type` 对象类型,固定为 `agent`。 **updated_at** `string` | 更新时间 `agent.updated_at` 智能体配置最后更新的时间,采用 RFC 3339 格式。 **version** `integer` | 版本号 `agent.version` 会话当前使用的智能体版本号。 **base_agent** `string` | 基础智能体类型 `agent.base_agent` 会话当前使用的基础 Agent 类型。 - `ark_agent_preview`:通用 Agent。 - `ultra_vision_agent_preview`:Seedance Managed Agent。 **description** `string` | 智能体说明 `agent.description` 会话当前使用的智能体说明。 **display_name** `string` | 显示名称 `agent.display_name` 会话当前使用的智能体显示名称。 **mcp_servers** `object[]` | MCP 服务列表 `agent.mcp_servers` 会话当前使用的 MCP 服务配置列表。 **name** `string` | MCP 服务名称 `agent.mcp_servers.name` MCP 服务名称,供 `tools[].mcp_server_name` 引用。 **type** `string` | MCP 接入方式 `agent.mcp_servers.type` MCP 服务接入方式,固定为 `url`。 **url** `string` | MCP 服务地址 `agent.mcp_servers.url` 会话创建时冻结的 MCP 服务访问地址。 **metadata** `object` | 自定义元数据 `agent.metadata` 创建智能体时设置的自定义键值对,服务端不定义固定子字段。 **model** `object` | 模型配置 `agent.model` 会话当前使用的模型配置。 **id** `string` | 模型或接入点 ID `agent.model.id` 会话当前使用的模型 ID 或推理接入点 ID。 **protocol** `string` | 调用协议 `agent.model.protocol` 会话模型调用使用的协议: - `ark_responses`:方舟 Responses 协议。 - `openai_chat_completions`:OpenAI Chat Completions 兼容协议。 - `openai_responses`:OpenAI Responses 兼容协议。 - `anthropic_messages`:Anthropic Messages 兼容协议。 **reasoning_effort** `string` | 推理投入档位 `agent.model.reasoning_effort` 会话当前使用的推理投入档位。 **service_tier** `string` | 推理服务档位 `agent.model.service_tier` 会话当前使用的推理服务档位。 **speed** `string` | 推理速度 `agent.model.speed` 模型推理速度档位。 **thinking** `string` | 思考模式 `agent.model.thinking` 会话当前使用的思考模式。 **multiagent** `object` | 多智能体配置 `agent.multiagent` 会话当前使用的多智能体配置。 **agents** `object[]` | 成员智能体 `agent.multiagent.agents` 会话创建时冻结的成员智能体列表。 **type** `string` | 引用类型 `agent.multiagent.agents.type` 成员引用类型: - `agent`:引用其他智能体。 - `self`:引用当前智能体。 **description** `string` | 智能体说明 `agent.multiagent.agents.description` 会话创建时冻结的成员智能体说明。 **display_name** `string` | 显示名称 `agent.multiagent.agents.display_name` 会话创建时冻结的成员智能体显示名称。 **id** `string` | 智能体 ID `agent.multiagent.agents.id` 成员智能体的 ID;当 `type` 为 `self` 时,返回当前智能体的 ID。 **mcp_servers** `object[]` | MCP 服务列表 `agent.multiagent.agents.mcp_servers` 会话创建时冻结的成员智能体 MCP 服务配置列表。 **name** `string` | MCP 服务名称 `agent.multiagent.agents.mcp_servers.name` MCP 服务名称,供 `tools[].mcp_server_name` 引用。 **type** `string` | MCP 接入方式 `agent.multiagent.agents.mcp_servers.type` MCP 服务接入方式,固定为 `url`。 **url** `string` | MCP 服务地址 `agent.multiagent.agents.mcp_servers.url` 会话创建时冻结的 MCP 服务访问地址。 **model** `object` | 模型配置 `agent.multiagent.agents.model` 会话创建时冻结的成员智能体模型配置。 **id** `string` | 模型或接入点 ID `agent.multiagent.agents.model.id` 成员智能体使用的模型 ID 或推理接入点 ID。 **speed** `string` | 推理速度 `agent.multiagent.agents.model.speed` 成员智能体使用的模型推理速度档位。 **name** `string` | 智能体名称 `agent.multiagent.agents.name` 会话创建时冻结的成员智能体名称。 **skills** `object[]` | Skill 列表 `agent.multiagent.agents.skills` 会话创建时冻结的成员智能体 Skill 配置列表。 **type** `string` | Skill 类型 `agent.multiagent.agents.skills.type` Skill 来源类型: - `ark`:方舟平台预置 Skill。 - `skill_hub`:Skill Hub 中的公共 Skill。 - `custom`:当前账号创建的自定义 Skill。 **display_name** `string` | Skill 名称 `agent.multiagent.agents.skills.display_name` 会话创建时记录的 Skill 展示名称。 **skill_id** `string` | Skill ID `agent.multiagent.agents.skills.skill_id` 会话使用的 Skill ID。 **use_latest** `boolean` | 使用最新版本 `agent.multiagent.agents.skills.use_latest` 是否在创建会话时选择该 Skill 的最新版本。`true` 表示选择当时的最新版本,`false` 表示使用 `version` 指定的版本。 **version** `string` | Skill 版本 `agent.multiagent.agents.skills.version` 会话创建时冻结的 Skill 版本号。 **system** `string` | 系统提示词 `agent.multiagent.agents.system` 会话创建时冻结的成员智能体系统提示词。 **tools** `object[]` | 工具列表 `agent.multiagent.agents.tools` 会话创建时冻结的成员智能体工具配置列表。 **type** `string` | 工具类型 `agent.multiagent.agents.tools.type` 工具类型: - `agent_toolset_20260916`:当前版本的方舟内置工具集。 - `agent_toolset_multimodal_20260825`:使用 `image_generate`、`video_generate`、`visual_search`、`general_search`、`compose_video` 和 `todo_write` 工具。 - `mcp_toolset`:指定 MCP 服务提供的工具集。 - `custom`:由客户端执行的自定义工具。 可选值:`agent_toolset_20260916`、`agent_toolset_20260701`、`agent_toolset_multimodal_20260825`、`mcp_toolset`、`custom`。 **configs** `object[]` | 工具配置 `agent.multiagent.agents.tools.configs` 会话创建时冻结的逐项工具配置。 **name** `string` | 工具名称 `agent.multiagent.agents.tools.configs.name` 会话快照中记录的工具名称。 **enabled** `boolean` | 是否启用 `agent.multiagent.agents.tools.configs.enabled` 工具是否启用。 **models** `object[]` | 工具模型列表 `agent.multiagent.agents.tools.configs.models` 会话快照中记录的图片生成或视频生成工具模型 ID 或推理接入点 ID 列表。 **id** `string` | 模型或接入点 ID `agent.multiagent.agents.tools.configs.models.id` 该工具绑定的模型 ID 或推理接入点 ID。 **default** `boolean` | 是否为默认模型 `agent.multiagent.agents.tools.configs.models.default` 是否为该工具的默认模型。 **name** `string` | 模型名称 `agent.multiagent.agents.tools.configs.models.name` 服务端根据模型 ID 或推理接入点 ID 返回的模型名称。 **version** `string` | 模型版本 `agent.multiagent.agents.tools.configs.models.version` 服务端根据模型 ID 或推理接入点 ID 返回的模型版本。 **permission_policy** `object` | 权限策略 `agent.multiagent.agents.tools.configs.permission_policy` 工具使用的调用许可策略。 **type** `string` | 策略类型 `agent.multiagent.agents.tools.configs.permission_policy.type` 策略类型,`always_allow` 表示允许直接调用,`always_ask` 表示每次调用前需要用户确认。 **default_config** `object` | 默认工具配置 `agent.multiagent.agents.tools.default_config` 未在 `configs` 中单独列出的工具所使用的默认配置。 **enabled** `boolean` | 是否启用 `agent.multiagent.agents.tools.default_config.enabled` 未单独配置的工具是否默认启用。 **permission_policy** `object` | 权限策略 `agent.multiagent.agents.tools.default_config.permission_policy` 未单独配置的工具使用的调用许可策略。 **type** `string` | 策略类型 `agent.multiagent.agents.tools.default_config.permission_policy.type` 策略类型,`always_allow` 表示允许直接调用,`always_ask` 表示每次调用前需要用户确认。 **description** `string` | 自定义工具说明 `agent.multiagent.agents.tools.description` 会话创建时冻结的自定义工具说明,用于记录工具的功能和适用场景。 **input_schema** `object` | 输入参数定义 `agent.multiagent.agents.tools.input_schema` 返回 Session 的 Agent 快照中记录的自定义工具输入参数 JSON Schema。 **properties** `object` | 参数属性定义 `agent.multiagent.agents.tools.input_schema.properties` 返回 Session 的 Agent 快照中记录的 JSON Schema 属性映射。每个键为参数名,每个值为对应参数的 JSON Schema 子对象。 **required** `string[]` | 必填参数名称列表 `agent.multiagent.agents.tools.input_schema.required` 返回调用自定义工具时必须提供的参数名称列表。 **type** `string` | Schema 类型 `agent.multiagent.agents.tools.input_schema.type` 返回 JSON Schema 的顶层类型,固定为 `object`。 **mcp_server_name** `string` | MCP 服务名称 `agent.multiagent.agents.tools.mcp_server_name` 会话中 `mcp_toolset` 引用的 MCP 服务名称。 **name** `string` | 自定义工具名称 `agent.multiagent.agents.tools.name` 会话创建时冻结的自定义工具名称。 **version** `integer` | 版本号 `agent.multiagent.agents.version` 会话创建时冻结的成员智能体版本号。 **type** `string` | 协作模式 `agent.multiagent.type` 多智能体协作模式,固定为 `coordinator`。 **skills** `object[]` | Skill 列表 `agent.skills` 会话当前使用的 Skill 配置列表。 **type** `string` | Skill 类型 `agent.skills.type` Skill 来源类型: - `ark`:方舟平台预置 Skill。 - `skill_hub`:Skill Hub 中的公共 Skill。 - `custom`:当前账号创建的自定义 Skill。 **display_name** `string` | Skill 名称 `agent.skills.display_name` 会话创建时记录的 Skill 展示名称。 **skill_id** `string` | Skill ID `agent.skills.skill_id` 会话使用的 Skill ID。 **use_latest** `boolean` | 使用最新版本 `agent.skills.use_latest` 是否在创建会话时选择该 Skill 的最新版本。`true` 表示选择当时的最新版本,`false` 表示使用 `version` 指定的版本。 **version** `string` | Skill 版本 `agent.skills.version` 会话创建时冻结的 Skill 版本号。 **system** `string` | 系统提示词 `agent.system` 会话当前使用的系统提示词。 **tools** `object[]` | 工具列表 `agent.tools` 会话当前使用的工具配置列表。 **type** `string` | 工具类型 `agent.tools.type` 工具类型: - `agent_toolset_20260916`:当前版本的方舟内置工具集。 - `agent_toolset_multimodal_20260825`:使用 `image_generate`、`video_generate`、`visual_search`、`general_search`、`compose_video` 和 `todo_write` 工具。 - `mcp_toolset`:指定 MCP 服务提供的工具集。 - `custom`:由客户端执行的自定义工具。 可选值:`agent_toolset_20260916`、`agent_toolset_20260701`、`agent_toolset_multimodal_20260825`、`mcp_toolset`、`custom`。 **configs** `object[]` | 工具配置 `agent.tools.configs` 会话创建时冻结的逐项工具配置。 **name** `string` | 工具名称 `agent.tools.configs.name` 会话快照中记录的工具名称。 **enabled** `boolean` | 是否启用 `agent.tools.configs.enabled` 工具是否启用。 **models** `object[]` | 工具模型列表 `agent.tools.configs.models` 会话快照中记录的图片生成或视频生成工具模型 ID 或推理接入点 ID 列表。 **id** `string` | 模型或接入点 ID `agent.tools.configs.models.id` 该工具绑定的模型 ID 或推理接入点 ID。 **default** `boolean` | 是否为默认模型 `agent.tools.configs.models.default` 是否为该工具的默认模型。 **name** `string` | 模型名称 `agent.tools.configs.models.name` 服务端根据模型 ID 或推理接入点 ID 返回的模型名称。 **version** `string` | 模型版本 `agent.tools.configs.models.version` 服务端根据模型 ID 或推理接入点 ID 返回的模型版本。 **permission_policy** `object` | 权限策略 `agent.tools.configs.permission_policy` 工具使用的调用许可策略。 **type** `string` | 策略类型 `agent.tools.configs.permission_policy.type` 策略类型,`always_allow` 表示允许直接调用,`always_ask` 表示每次调用前需要用户确认。 **default_config** `object` | 默认工具配置 `agent.tools.default_config` 未在 `configs` 中单独列出的工具所使用的默认配置。 **enabled** `boolean` | 是否启用 `agent.tools.default_config.enabled` 未单独配置的工具是否默认启用。 **permission_policy** `object` | 权限策略 `agent.tools.default_config.permission_policy` 未单独配置的工具使用的调用许可策略。 **type** `string` | 策略类型 `agent.tools.default_config.permission_policy.type` 策略类型,`always_allow` 表示允许直接调用,`always_ask` 表示每次调用前需要用户确认。 **description** `string` | 自定义工具说明 `agent.tools.description` 会话创建时冻结的自定义工具说明,用于记录工具的功能和适用场景。 **input_schema** `object` | 输入参数定义 `agent.tools.input_schema` 返回 Session 的 Agent 快照中记录的自定义工具输入参数 JSON Schema。 **properties** `object` | 参数属性定义 `agent.tools.input_schema.properties` 返回 Session 的 Agent 快照中记录的 JSON Schema 属性映射。每个键为参数名,每个值为对应参数的 JSON Schema 子对象。 **required** `string[]` | 必填参数名称列表 `agent.tools.input_schema.required` 返回调用自定义工具时必须提供的参数名称列表。 **type** `string` | Schema 类型 `agent.tools.input_schema.type` 返回 JSON Schema 的顶层类型,固定为 `object`。 **mcp_server_name** `string` | MCP 服务名称 `agent.tools.mcp_server_name` 会话中 `mcp_toolset` 引用的 MCP 服务名称。 **name** `string` | 自定义工具名称 `agent.tools.name` 会话创建时冻结的自定义工具名称。 **created_at** `string` | 创建时间 会话创建完成的时间,采用 RFC 3339 格式。 **environment_id** `string` | 环境 ID 会话创建时绑定的环境 ID。 **id** `string` | 会话 ID 会话唯一标识符,格式为 `sesn-xxxxx`。 **status** `string` | 会话状态 会话运行状态。可选值:`idle`、`running`、`terminated`、`rescheduling`、`initializing`、`failed`、`upgrading`。 **type** `string` | 对象类型 对象类型,固定为`session` **updated_at** `string` | 更新时间 会话信息最后更新的时间,采用 RFC 3339 格式。 **archived_at** `string` | 归档时间 会话归档的时间,采用 RFC 3339 格式。会话未归档时,服务端不返回该字段。 **environment** `object` | 环境信息 会话实际使用的环境配置。后续修改原环境不会自动改变该会话。 **created_at** `string` | 创建时间 `environment.created_at` 环境创建完成的时间,采用 RFC 3339 格式。 **id** `string` | 环境 ID `environment.id` 环境唯一标识符 **name** `string` | 环境名称 `environment.name` 环境名称,用于在环境列表和会话配置中区分该环境。 **type** `string` | 对象类型 `environment.type` 会话环境快照类型。`environment` 表示直接使用基础 Environment;`environment_with_overrides` 表示当前会话使用了环境配置覆写。 **updated_at** `string` | 更新时间 `environment.updated_at` 环境配置最后更新的时间,采用 RFC 3339 格式。 **config** `object` | 环境配置 `environment.config` 环境运行配置,包含运行类型、网络策略、依赖包与环境变量 **type** `string` | 环境类型 `environment.config.type` 会话运行环境类型:`cloud` 表示平台托管环境,`self_hosted` 表示用户自托管环境。 **env** `object` | 环境变量 `environment.config.env` 会话运行环境中的环境变量键值对 **networking** `object` | 出网策略 `environment.config.networking` 容器出网策略配置 **type** `string` | 出网策略类型 `environment.config.networking.type` 会话当前使用的出网策略。`unrestricted` 表示不限制出网目标。 **packages** `object` | 依赖包配置 `environment.config.packages` 启动时预装的依赖包配置 **apt** `string[]` | apt 包 `environment.config.packages.apt` 会话环境启动时通过 apt 预装的系统包列表。 **cargo** `string[]` | Cargo 包 `environment.config.packages.cargo` 会话环境启动时通过 Cargo 预装的 Rust crate 列表。 **gem** `string[]` | gem 包 `environment.config.packages.gem` 会话环境启动时通过 RubyGems 预装的 Ruby 包列表。 **go** `string[]` | Go 模块 `environment.config.packages.go` 会话环境启动时通过 Go 工具链预装的模块依赖列表。 **npm** `string[]` | npm 包 `environment.config.packages.npm` 会话环境启动时通过 npm 预装的 Node.js 包列表。 **pip** `string[]` | pip 包 `environment.config.packages.pip` 会话环境启动时通过 pip 预装的 Python 包列表。 **type** `string` | 配置类型 `environment.config.packages.type` 依赖包配置的类型标识,固定为 `packages`。 **setup_script** `string` | 启动脚本 `environment.config.setup_script` 会话运行环境启动时执行的初始化脚本;留空或未设置表示不执行脚本 **tos** `object` | 产物存储配置 `environment.config.tos` 智能体产物持久化存储配置。为空表示未配置用户 Bucket,产物落到方舟公共 TOS **bucket** `string` | TOS 桶 `environment.config.tos.bucket` 会话环境快照中保存的用户 TOS 存储桶名称。 **prefix** `string` | 对象前缀 `environment.config.tos.prefix` 会话环境快照中保存的对象存储目录前缀。 **description** `string` | 环境描述 `environment.description` 环境描述,用于说明环境的用途、网络策略、依赖包等配置 **metadata** `object` | 自定义元数据 `environment.metadata` 用户自定义元数据 **overridden_fields** `string[]` | 覆写字段 `environment.overridden_fields` 当前会话相对基础 Environment 实际覆写的 `config` 子字段名称列表。仅在 *type* 为 `environment_with_overrides` 且存在覆写字段时返回。 **scope** `string` | 作用域 `environment.scope` 环境作用域:`organization` 表示组织内共享;`account` 表示账号内可见。 **resources** `object[]` | 资源列表 当前挂载的资源数组。资源 `type` 可为 `file`、`memory_store` 或 `tos`,`access` 可为 `read_only` 或 `read_write`。 文件资源 `object` 通过 Files API 上传并挂载到会话的文件。 **created_at** `string` | 挂载时间 `resources.created_at` 资源挂载到会话的时间,采用 RFC 3339 格式。 **id** `string` | 资源 ID `resources.id` 会话资源 ID。 **type** `string` | 资源类型 `resources.type` 资源类型,固定为 `file`。 **updated_at** `string` | 更新时间 `resources.updated_at` 会话资源信息最后更新的时间,采用 RFC 3339 格式。 **access** `string` | 访问权限 `resources.access` 文件访问权限,固定为 `read_only`。 **file_id** `string` | 文件 ID `resources.file_id` 当前可用的文件 ID。 **mount_path** `string` | 挂载路径 `resources.mount_path` 文件在会话运行环境中的完整挂载路径。 记忆库资源 `object` 挂载到会话的记忆库。 **created_at** `string` | 挂载时间 `resources.created_at` 资源挂载到会话的时间,采用 RFC 3339 格式。 **id** `string` | 资源 ID `resources.id` 会话资源 ID。 **type** `string` | 资源类型 `resources.type` 资源类型,固定为 `memory_store`。 **updated_at** `string` | 更新时间 `resources.updated_at` 会话资源信息最后更新的时间,采用 RFC 3339 格式。 **access** `string` | 访问权限 `resources.access` 会话对记忆库的访问权限。可选值:`read_only`、`read_write`。 **instructions** `string` | 使用指导 `resources.instructions` 会话当前用于该记忆库的使用指导。 **memory_store_id** `string` | 记忆库 ID `resources.memory_store_id` 挂载到会话的记忆库 ID。 TOS 资源 `object` 挂载到会话的 TOS 对象目录。 **created_at** `string` | 挂载时间 `resources.created_at` 资源挂载到会话的时间,采用 RFC 3339 格式。 **id** `string` | 资源 ID `resources.id` 会话资源 ID。 **type** `string` | 资源类型 `resources.type` 资源类型,固定为 `tos`。 **updated_at** `string` | 更新时间 `resources.updated_at` 会话资源信息最后更新的时间,采用 RFC 3339 格式。 **access** `string` | 访问权限 `resources.access` 会话对 TOS 目录的访问权限。可选值:`read_only`、`read_write`。 **mount_path** `string` | 挂载路径 `resources.mount_path` TOS 目录在会话运行环境中的挂载路径。创建会话时未指定挂载路径,则不返回该字段。 **tos_bucket** `string` | TOS 存储桶 `resources.tos_bucket` TOS 挂载源所在的存储桶名称。 **tos_key** `string` | TOS 目录前缀 `resources.tos_key` TOS 中已挂载目录的对象前缀。 **tos_region** `string` | TOS 地域 `resources.tos_region` TOS 挂载源所在地域的 Region ID。 **scene** `string` | 会话场景 会话场景标记。 - `default`:普通会话。 - `dreams`:用于 Dream 记忆整理任务的会话。 **tags** `object[]` | 标签列表 会话标签数组,每项包含 `key` 和可选的 `value`。 **key** `string` | 标签键 `tags.key` 标签的键,用于标识分类维度。 **value** `string` | 标签值 `tags.value` 用于记录该标签分类的具体内容。 **title** `string` | 会话标题 会话标题,用于快速识别和检索 **usage** `object` | 用量统计 会话累计的输入、输出和缓存读取 token 用量。会话尚未产生模型调用,或用量统计暂不可用时,服务端不返回该字段。 **cache_read_input_tokens** `integer` | 缓存读取 token 数 `usage.cache_read_input_tokens` 会话累计从缓存读取的输入 token 数。 **input_tokens** `integer` | 输入 token 数 `usage.input_tokens` 会话累计消耗的输入 token 数。 **output_tokens** `integer` | 输出 token 数 `usage.output_tokens` 会话累计生成的输出 token 数。 **vault_ids** `string[] / null` | 保管库 ID 列表 会话可访问的保管库 ID 列表。智能体可在运行过程中使用其中的凭证。 ## 代码示例 ## 查询会话详情 ### cURL #### Request ```Bash curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/sessions/" \ -H "Authorization: Bearer $ARK_API_KEY" ``` #### Response ``` { "id": "", "type": "session", "agent": { "id": "", "type": "agent", "name": "", "version": 1, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T08:00:00Z" }, "environment_id": "", "title": "Q3 规划头脑风暴", "vault_ids": [], "resources": [], "status": "idle", "created_at": "2026-07-15T08:30:12.000Z", "updated_at": "2026-07-15T09:00:00.000Z", "usage": { "input_tokens": 1287, "output_tokens": 964, "cache_read_input_tokens": 512, "cache_creation": { "ephemeral_5m_input_tokens": 256 } }, "tags": [ {"key": "team", "value": "agent-infra"} ] } ``` ### Python #### Request ```python import os from arkruntime import Ark client = Ark( api_key=os.environ["ARK_API_KEY"], base_url="https://ark.cn-beijing.volces.com/api/v3", ) session = client.sessions.retrieve("") print(session) ``` #### Response ``` { "id": "", "type": "session", "agent": { "id": "", "type": "agent", "name": "", "version": 1, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T08:00:00Z" }, "environment_id": "", "title": "Q3 规划头脑风暴", "vault_ids": [], "resources": [], "status": "idle", "created_at": "2026-07-15T08:30:12.000Z", "updated_at": "2026-07-15T09:00:00.000Z", "usage": { "input_tokens": 1287, "output_tokens": 964, "cache_read_input_tokens": 512, "cache_creation": { "ephemeral_5m_input_tokens": 256 } }, "tags": [ {"key": "team", "value": "agent-infra"} ] } ``` ### Java #### Request ```java // pom.xml 依赖: // // com.volcengine // ark-runtime // 0.9.0 // import com.volcengine.ark.runtime.models.session.Session; import com.volcengine.ark.runtime.service.ArkService; public class Main { public static void main(String[] args) throws Exception { ArkService service = ArkService.builder() .apiKey(System.getenv("ARK_API_KEY")) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); Session session = service.getSession(""); System.out.println(session); service.shutdownExecutor(); } } ``` #### Response ``` { "id": "", "type": "session", "agent": { "id": "", "type": "agent", "name": "", "version": 1, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T08:00:00Z" }, "environment_id": "", "title": "Q3 规划头脑风暴", "vault_ids": [], "resources": [], "status": "idle", "created_at": "2026-07-15T08:30:12.000Z", "updated_at": "2026-07-15T09:00:00.000Z", "usage": { "input_tokens": 1287, "output_tokens": 964, "cache_read_input_tokens": 512, "cache_creation": { "ephemeral_5m_input_tokens": 256 } }, "tags": [ {"key": "team", "value": "agent-infra"} ] } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" ) func main() { ctx := context.Background() client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) s, err := client.GetSession(ctx, "") if err != nil { panic(err) } fmt.Println(s) } ``` #### Response ``` { "id": "", "type": "session", "agent": { "id": "", "type": "agent", "name": "", "version": 1, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T08:00:00Z" }, "environment_id": "", "title": "Q3 规划头脑风暴", "vault_ids": [], "resources": [], "status": "idle", "created_at": "2026-07-15T08:30:12.000Z", "updated_at": "2026-07-15T09:00:00.000Z", "usage": { "input_tokens": 1287, "output_tokens": 964, "cache_read_input_tokens": 512, "cache_creation": { "ephemeral_5m_input_tokens": 256 } }, "tags": [ {"key": "team", "value": "agent-infra"} ] } ``` --- # 更新会话标题和标签 Source: https://ark.volcengine.com/region:cn-beijing/docs/update-session-api `POST https://ark.cn-beijing.volces.com/api/v3/sessions/{session_id}` 修改会话的 `title` 和 `tags`: - 省略字段时保留原值。 - `title` 传空白字符串时清空标题。 - `tags` 传 `[]` 时清空自定义标签,服务端维护的保留标签不受影响。 根据目标选择接口: - 只修改标题或标签时,使用本接口。 - 保留同一会话并刷新当前智能体、环境或保管库配置时,使用 [升级会话](/docs/upgrade-session-api)。 - 需要新会话或更换绑定的智能体、环境时,使用 [创建会话](/docs/create-session-api)。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **session_id** `string` `必选` | 会话 ID 要更新的会话 ID,格式为 `sesn-` 开头的字符串。 ### Body 参数 **tags** `object[]` | 标签列表 更新后的会话标签列表,最多 20 项。省略时保留原值,传 `[]` 时清空自定义标签,传非空数组时整体替换自定义标签;服务端维护的保留标签不受影响。 **key** `string` `必选` | 标签键 `tags.key` 标签的键,用于标识分类维度。 **value** `string` | 标签值 `tags.value` 用于记录该标签分类的具体内容。 **title** `string` | 会话标题 新的会话标题,最长 255 个字符。省略时保留原值;传入去除首尾空白后为空的字符串时清空标题 ## 响应参数 **agent** `object` | 智能体信息 创建会话时保存的智能体配置快照,包含该会话实际使用的模型、系统提示词、工具、MCP 服务和技能等配置。后续更新智能体不会影响该会话中的快照。 **created_at** `string` | 创建时间 `agent.created_at` 智能体创建完成的时间,采用 RFC 3339 格式。 **id** `string` | 智能体 ID `agent.id` 会话当前使用的智能体 ID。 **name** `string` | 智能体名称 `agent.name` 会话当前使用的智能体名称。 **type** `string` | 对象类型 `agent.type` 对象类型,固定为 `agent`。 **updated_at** `string` | 更新时间 `agent.updated_at` 智能体配置最后更新的时间,采用 RFC 3339 格式。 **version** `integer` | 版本号 `agent.version` 会话当前使用的智能体版本号。 **base_agent** `string` | 基础智能体类型 `agent.base_agent` 会话当前使用的基础 Agent 类型。 - `ark_agent_preview`:通用 Agent。 - `ultra_vision_agent_preview`:Seedance Managed Agent。 **description** `string` | 智能体说明 `agent.description` 会话当前使用的智能体说明。 **display_name** `string` | 显示名称 `agent.display_name` 会话当前使用的智能体显示名称。 **mcp_servers** `object[]` | MCP 服务列表 `agent.mcp_servers` 会话当前使用的 MCP 服务配置列表。 **name** `string` | MCP 服务名称 `agent.mcp_servers.name` MCP 服务名称,供 `tools[].mcp_server_name` 引用。 **type** `string` | MCP 接入方式 `agent.mcp_servers.type` MCP 服务接入方式,固定为 `url`。 **url** `string` | MCP 服务地址 `agent.mcp_servers.url` 会话创建时冻结的 MCP 服务访问地址。 **metadata** `object` | 自定义元数据 `agent.metadata` 创建智能体时设置的自定义键值对,服务端不定义固定子字段。 **model** `object` | 模型配置 `agent.model` 会话当前使用的模型配置。 **id** `string` | 模型或接入点 ID `agent.model.id` 会话当前使用的模型 ID 或推理接入点 ID。 **protocol** `string` | 调用协议 `agent.model.protocol` 会话模型调用使用的协议: - `ark_responses`:方舟 Responses 协议。 - `openai_chat_completions`:OpenAI Chat Completions 兼容协议。 - `openai_responses`:OpenAI Responses 兼容协议。 - `anthropic_messages`:Anthropic Messages 兼容协议。 **reasoning_effort** `string` | 推理投入档位 `agent.model.reasoning_effort` 会话当前使用的推理投入档位。 **service_tier** `string` | 推理服务档位 `agent.model.service_tier` 会话当前使用的推理服务档位。 **speed** `string` | 推理速度 `agent.model.speed` 模型推理速度档位。 **thinking** `string` | 思考模式 `agent.model.thinking` 会话当前使用的思考模式。 **multiagent** `object` | 多智能体配置 `agent.multiagent` 会话当前使用的多智能体配置。 **agents** `object[]` | 成员智能体 `agent.multiagent.agents` 会话创建时冻结的成员智能体列表。 **type** `string` | 引用类型 `agent.multiagent.agents.type` 成员引用类型: - `agent`:引用其他智能体。 - `self`:引用当前智能体。 **description** `string` | 智能体说明 `agent.multiagent.agents.description` 会话创建时冻结的成员智能体说明。 **display_name** `string` | 显示名称 `agent.multiagent.agents.display_name` 会话创建时冻结的成员智能体显示名称。 **id** `string` | 智能体 ID `agent.multiagent.agents.id` 成员智能体的 ID;当 `type` 为 `self` 时,返回当前智能体的 ID。 **mcp_servers** `object[]` | MCP 服务列表 `agent.multiagent.agents.mcp_servers` 会话创建时冻结的成员智能体 MCP 服务配置列表。 **name** `string` | MCP 服务名称 `agent.multiagent.agents.mcp_servers.name` MCP 服务名称,供 `tools[].mcp_server_name` 引用。 **type** `string` | MCP 接入方式 `agent.multiagent.agents.mcp_servers.type` MCP 服务接入方式,固定为 `url`。 **url** `string` | MCP 服务地址 `agent.multiagent.agents.mcp_servers.url` 会话创建时冻结的 MCP 服务访问地址。 **model** `object` | 模型配置 `agent.multiagent.agents.model` 会话创建时冻结的成员智能体模型配置。 **id** `string` | 模型或接入点 ID `agent.multiagent.agents.model.id` 成员智能体使用的模型 ID 或推理接入点 ID。 **speed** `string` | 推理速度 `agent.multiagent.agents.model.speed` 成员智能体使用的模型推理速度档位。 **name** `string` | 智能体名称 `agent.multiagent.agents.name` 会话创建时冻结的成员智能体名称。 **skills** `object[]` | Skill 列表 `agent.multiagent.agents.skills` 会话创建时冻结的成员智能体 Skill 配置列表。 **type** `string` | Skill 类型 `agent.multiagent.agents.skills.type` Skill 来源类型: - `ark`:方舟平台预置 Skill。 - `skill_hub`:Skill Hub 中的公共 Skill。 - `custom`:当前账号创建的自定义 Skill。 **display_name** `string` | Skill 名称 `agent.multiagent.agents.skills.display_name` 会话创建时记录的 Skill 展示名称。 **skill_id** `string` | Skill ID `agent.multiagent.agents.skills.skill_id` 会话使用的 Skill ID。 **use_latest** `boolean` | 使用最新版本 `agent.multiagent.agents.skills.use_latest` 是否在创建会话时选择该 Skill 的最新版本。`true` 表示选择当时的最新版本,`false` 表示使用 `version` 指定的版本。 **version** `string` | Skill 版本 `agent.multiagent.agents.skills.version` 会话创建时冻结的 Skill 版本号。 **system** `string` | 系统提示词 `agent.multiagent.agents.system` 会话创建时冻结的成员智能体系统提示词。 **tools** `object[]` | 工具列表 `agent.multiagent.agents.tools` 会话创建时冻结的成员智能体工具配置列表。 **type** `string` | 工具类型 `agent.multiagent.agents.tools.type` 工具类型: - `agent_toolset_20260916`:当前版本的方舟内置工具集。 - `agent_toolset_multimodal_20260825`:使用 `image_generate`、`video_generate`、`visual_search`、`general_search`、`compose_video` 和 `todo_write` 工具。 - `mcp_toolset`:指定 MCP 服务提供的工具集。 - `custom`:由客户端执行的自定义工具。 可选值:`agent_toolset_20260916`、`agent_toolset_20260701`、`agent_toolset_multimodal_20260825`、`mcp_toolset`、`custom`。 **configs** `object[]` | 工具配置 `agent.multiagent.agents.tools.configs` 会话创建时冻结的逐项工具配置。 **name** `string` | 工具名称 `agent.multiagent.agents.tools.configs.name` 会话快照中记录的工具名称。 **enabled** `boolean` | 是否启用 `agent.multiagent.agents.tools.configs.enabled` 工具是否启用。 **models** `object[]` | 工具模型列表 `agent.multiagent.agents.tools.configs.models` 会话快照中记录的图片生成或视频生成工具模型 ID 或推理接入点 ID 列表。 **id** `string` | 模型或接入点 ID `agent.multiagent.agents.tools.configs.models.id` 该工具绑定的模型 ID 或推理接入点 ID。 **default** `boolean` | 是否为默认模型 `agent.multiagent.agents.tools.configs.models.default` 是否为该工具的默认模型。 **name** `string` | 模型名称 `agent.multiagent.agents.tools.configs.models.name` 服务端根据模型 ID 或推理接入点 ID 返回的模型名称。 **version** `string` | 模型版本 `agent.multiagent.agents.tools.configs.models.version` 服务端根据模型 ID 或推理接入点 ID 返回的模型版本。 **permission_policy** `object` | 权限策略 `agent.multiagent.agents.tools.configs.permission_policy` 工具使用的调用许可策略。 **type** `string` | 策略类型 `agent.multiagent.agents.tools.configs.permission_policy.type` 策略类型,`always_allow` 表示允许直接调用,`always_ask` 表示每次调用前需要用户确认。 **default_config** `object` | 默认工具配置 `agent.multiagent.agents.tools.default_config` 未在 `configs` 中单独列出的工具所使用的默认配置。 **enabled** `boolean` | 是否启用 `agent.multiagent.agents.tools.default_config.enabled` 未单独配置的工具是否默认启用。 **permission_policy** `object` | 权限策略 `agent.multiagent.agents.tools.default_config.permission_policy` 未单独配置的工具使用的调用许可策略。 **type** `string` | 策略类型 `agent.multiagent.agents.tools.default_config.permission_policy.type` 策略类型,`always_allow` 表示允许直接调用,`always_ask` 表示每次调用前需要用户确认。 **description** `string` | 自定义工具说明 `agent.multiagent.agents.tools.description` 会话创建时冻结的自定义工具说明,用于记录工具的功能和适用场景。 **input_schema** `object` | 输入参数定义 `agent.multiagent.agents.tools.input_schema` 返回 Session 的 Agent 快照中记录的自定义工具输入参数 JSON Schema。 **properties** `object` | 参数属性定义 `agent.multiagent.agents.tools.input_schema.properties` 返回 Session 的 Agent 快照中记录的 JSON Schema 属性映射。每个键为参数名,每个值为对应参数的 JSON Schema 子对象。 **required** `string[]` | 必填参数名称列表 `agent.multiagent.agents.tools.input_schema.required` 返回调用自定义工具时必须提供的参数名称列表。 **type** `string` | Schema 类型 `agent.multiagent.agents.tools.input_schema.type` 返回 JSON Schema 的顶层类型,固定为 `object`。 **mcp_server_name** `string` | MCP 服务名称 `agent.multiagent.agents.tools.mcp_server_name` 会话中 `mcp_toolset` 引用的 MCP 服务名称。 **name** `string` | 自定义工具名称 `agent.multiagent.agents.tools.name` 会话创建时冻结的自定义工具名称。 **version** `integer` | 版本号 `agent.multiagent.agents.version` 会话创建时冻结的成员智能体版本号。 **type** `string` | 协作模式 `agent.multiagent.type` 多智能体协作模式,固定为 `coordinator`。 **skills** `object[]` | Skill 列表 `agent.skills` 会话当前使用的 Skill 配置列表。 **type** `string` | Skill 类型 `agent.skills.type` Skill 来源类型: - `ark`:方舟平台预置 Skill。 - `skill_hub`:Skill Hub 中的公共 Skill。 - `custom`:当前账号创建的自定义 Skill。 **display_name** `string` | Skill 名称 `agent.skills.display_name` 会话创建时记录的 Skill 展示名称。 **skill_id** `string` | Skill ID `agent.skills.skill_id` 会话使用的 Skill ID。 **use_latest** `boolean` | 使用最新版本 `agent.skills.use_latest` 是否在创建会话时选择该 Skill 的最新版本。`true` 表示选择当时的最新版本,`false` 表示使用 `version` 指定的版本。 **version** `string` | Skill 版本 `agent.skills.version` 会话创建时冻结的 Skill 版本号。 **system** `string` | 系统提示词 `agent.system` 会话当前使用的系统提示词。 **tools** `object[]` | 工具列表 `agent.tools` 会话当前使用的工具配置列表。 **type** `string` | 工具类型 `agent.tools.type` 工具类型: - `agent_toolset_20260916`:当前版本的方舟内置工具集。 - `agent_toolset_multimodal_20260825`:使用 `image_generate`、`video_generate`、`visual_search`、`general_search`、`compose_video` 和 `todo_write` 工具。 - `mcp_toolset`:指定 MCP 服务提供的工具集。 - `custom`:由客户端执行的自定义工具。 可选值:`agent_toolset_20260916`、`agent_toolset_20260701`、`agent_toolset_multimodal_20260825`、`mcp_toolset`、`custom`。 **configs** `object[]` | 工具配置 `agent.tools.configs` 会话创建时冻结的逐项工具配置。 **name** `string` | 工具名称 `agent.tools.configs.name` 会话快照中记录的工具名称。 **enabled** `boolean` | 是否启用 `agent.tools.configs.enabled` 工具是否启用。 **models** `object[]` | 工具模型列表 `agent.tools.configs.models` 会话快照中记录的图片生成或视频生成工具模型 ID 或推理接入点 ID 列表。 **id** `string` | 模型或接入点 ID `agent.tools.configs.models.id` 该工具绑定的模型 ID 或推理接入点 ID。 **default** `boolean` | 是否为默认模型 `agent.tools.configs.models.default` 是否为该工具的默认模型。 **name** `string` | 模型名称 `agent.tools.configs.models.name` 服务端根据模型 ID 或推理接入点 ID 返回的模型名称。 **version** `string` | 模型版本 `agent.tools.configs.models.version` 服务端根据模型 ID 或推理接入点 ID 返回的模型版本。 **permission_policy** `object` | 权限策略 `agent.tools.configs.permission_policy` 工具使用的调用许可策略。 **type** `string` | 策略类型 `agent.tools.configs.permission_policy.type` 策略类型,`always_allow` 表示允许直接调用,`always_ask` 表示每次调用前需要用户确认。 **default_config** `object` | 默认工具配置 `agent.tools.default_config` 未在 `configs` 中单独列出的工具所使用的默认配置。 **enabled** `boolean` | 是否启用 `agent.tools.default_config.enabled` 未单独配置的工具是否默认启用。 **permission_policy** `object` | 权限策略 `agent.tools.default_config.permission_policy` 未单独配置的工具使用的调用许可策略。 **type** `string` | 策略类型 `agent.tools.default_config.permission_policy.type` 策略类型,`always_allow` 表示允许直接调用,`always_ask` 表示每次调用前需要用户确认。 **description** `string` | 自定义工具说明 `agent.tools.description` 会话创建时冻结的自定义工具说明,用于记录工具的功能和适用场景。 **input_schema** `object` | 输入参数定义 `agent.tools.input_schema` 返回 Session 的 Agent 快照中记录的自定义工具输入参数 JSON Schema。 **properties** `object` | 参数属性定义 `agent.tools.input_schema.properties` 返回 Session 的 Agent 快照中记录的 JSON Schema 属性映射。每个键为参数名,每个值为对应参数的 JSON Schema 子对象。 **required** `string[]` | 必填参数名称列表 `agent.tools.input_schema.required` 返回调用自定义工具时必须提供的参数名称列表。 **type** `string` | Schema 类型 `agent.tools.input_schema.type` 返回 JSON Schema 的顶层类型,固定为 `object`。 **mcp_server_name** `string` | MCP 服务名称 `agent.tools.mcp_server_name` 会话中 `mcp_toolset` 引用的 MCP 服务名称。 **name** `string` | 自定义工具名称 `agent.tools.name` 会话创建时冻结的自定义工具名称。 **created_at** `string` | 创建时间 会话创建完成的时间,采用 RFC 3339 格式。 **environment_id** `string` | 环境 ID 会话实际使用的 Environment ID。 **id** `string` | 会话 ID 会话唯一标识符,格式为 `sesn-xxxxx`。 **status** `string` | 会话状态 会话运行状态。可选值:`idle`、`running`、`terminated`、`rescheduling`、`initializing`、`failed`、`upgrading`。 **type** `string` | 对象类型 对象类型,固定为`session` **updated_at** `string` | 更新时间 会话信息最后更新的时间,采用 RFC 3339 格式。 **archived_at** `string` | 归档时间 会话归档的时间,采用 RFC 3339 格式。会话未归档时,服务端不返回该字段。 **environment** `object` | 环境信息 当前会话实际使用的环境配置。后续修改原环境不会自动改变该会话。 **created_at** `string` | 创建时间 `environment.created_at` 环境创建完成的时间,采用 RFC 3339 格式。 **id** `string` | 环境 ID `environment.id` 环境唯一标识符 **name** `string` | 环境名称 `environment.name` 环境名称,用于在环境列表和会话配置中区分该环境。 **type** `string` | 对象类型 `environment.type` 会话环境快照类型。`environment` 表示直接使用基础 Environment;`environment_with_overrides` 表示当前会话使用了环境配置覆写。 **updated_at** `string` | 更新时间 `environment.updated_at` 环境配置最后更新的时间,采用 RFC 3339 格式。 **config** `object` | 环境配置 `environment.config` 环境运行配置,包含运行类型、网络策略、依赖包与环境变量 **type** `string` | 环境类型 `environment.config.type` 会话运行环境类型:`cloud` 表示平台托管环境,`self_hosted` 表示用户自托管环境。 **env** `object` | 环境变量 `environment.config.env` 会话运行环境中的环境变量键值对 **networking** `object` | 出网策略 `environment.config.networking` 容器出网策略配置 **type** `string` | 出网策略类型 `environment.config.networking.type` 会话当前使用的出网策略。`unrestricted` 表示不限制出网目标。 **packages** `object` | 依赖包配置 `environment.config.packages` 启动时预装的依赖包配置 **apt** `string[]` | apt 包 `environment.config.packages.apt` 会话环境启动时通过 apt 预装的系统包列表。 **cargo** `string[]` | Cargo 包 `environment.config.packages.cargo` 会话环境启动时通过 Cargo 预装的 Rust crate 列表。 **gem** `string[]` | gem 包 `environment.config.packages.gem` 会话环境启动时通过 RubyGems 预装的 Ruby 包列表。 **go** `string[]` | Go 模块 `environment.config.packages.go` 会话环境启动时通过 Go 工具链预装的模块依赖列表。 **npm** `string[]` | npm 包 `environment.config.packages.npm` 会话环境启动时通过 npm 预装的 Node.js 包列表。 **pip** `string[]` | pip 包 `environment.config.packages.pip` 会话环境启动时通过 pip 预装的 Python 包列表。 **type** `string` | 配置类型 `environment.config.packages.type` 依赖包配置的类型标识,固定为 `packages`。 **setup_script** `string` | 启动脚本 `environment.config.setup_script` 会话运行环境启动时执行的初始化脚本;留空或未设置表示不执行脚本 **tos** `object` | 产物存储配置 `environment.config.tos` 智能体产物持久化存储配置。为空表示未配置用户 Bucket,产物落到方舟公共 TOS **bucket** `string` | TOS 桶 `environment.config.tos.bucket` 会话环境快照中保存的用户 TOS 存储桶名称。 **prefix** `string` | 对象前缀 `environment.config.tos.prefix` 会话环境快照中保存的对象存储目录前缀。 **description** `string` | 环境描述 `environment.description` 环境描述,用于说明环境的用途、网络策略、依赖包等配置 **metadata** `object` | 自定义元数据 `environment.metadata` 用户自定义元数据 **overridden_fields** `string[]` | 覆写字段 `environment.overridden_fields` 当前会话相对基础 Environment 实际覆写的 `config` 子字段名称列表。仅在 *type* 为 `environment_with_overrides` 且存在覆写字段时返回。 **scope** `string` | 作用域 `environment.scope` 环境作用域:`organization` 表示组织内共享;`account` 表示账号内可见。 **resources** `object[]` | 资源列表 更新后会话当前挂载到运行环境的资源列表。 文件资源 `object` 通过 Files API 上传并挂载到会话的文件。 **created_at** `string` | 挂载时间 `resources.created_at` 资源挂载到会话的时间,采用 RFC 3339 格式。 **id** `string` | 资源 ID `resources.id` 会话资源 ID。 **type** `string` | 资源类型 `resources.type` 资源类型,固定为 `file`。 **updated_at** `string` | 更新时间 `resources.updated_at` 会话资源信息最后更新的时间,采用 RFC 3339 格式。 **access** `string` | 访问权限 `resources.access` 文件访问权限,固定为 `read_only`。 **file_id** `string` | 文件 ID `resources.file_id` 当前可用的文件 ID。 **mount_path** `string` | 挂载路径 `resources.mount_path` 文件在会话运行环境中的完整挂载路径。 记忆库资源 `object` 挂载到会话的记忆库。 **created_at** `string` | 挂载时间 `resources.created_at` 资源挂载到会话的时间,采用 RFC 3339 格式。 **id** `string` | 资源 ID `resources.id` 会话资源 ID。 **type** `string` | 资源类型 `resources.type` 资源类型,固定为 `memory_store`。 **updated_at** `string` | 更新时间 `resources.updated_at` 会话资源信息最后更新的时间,采用 RFC 3339 格式。 **access** `string` | 访问权限 `resources.access` 会话对记忆库的访问权限。可选值:`read_only`、`read_write`。 **instructions** `string` | 使用指导 `resources.instructions` 会话当前用于该记忆库的使用指导。 **memory_store_id** `string` | 记忆库 ID `resources.memory_store_id` 挂载到会话的记忆库 ID。 TOS 资源 `object` 挂载到会话的 TOS 对象目录。 **created_at** `string` | 挂载时间 `resources.created_at` 资源挂载到会话的时间,采用 RFC 3339 格式。 **id** `string` | 资源 ID `resources.id` 会话资源 ID。 **type** `string` | 资源类型 `resources.type` 资源类型,固定为 `tos`。 **updated_at** `string` | 更新时间 `resources.updated_at` 会话资源信息最后更新的时间,采用 RFC 3339 格式。 **access** `string` | 访问权限 `resources.access` 会话对 TOS 目录的访问权限。可选值:`read_only`、`read_write`。 **mount_path** `string` | 挂载路径 `resources.mount_path` TOS 目录在会话运行环境中的挂载路径。创建会话时未指定挂载路径,则不返回该字段。 **tos_bucket** `string` | TOS 存储桶 `resources.tos_bucket` TOS 挂载源所在的存储桶名称。 **tos_key** `string` | TOS 目录前缀 `resources.tos_key` TOS 中已挂载目录的对象前缀。 **tos_region** `string` | TOS 地域 `resources.tos_region` TOS 挂载源所在地域的 Region ID。 **scene** `string` | 会话场景 会话场景标记。 - `default`:普通会话。 - `dreams`:用于 Dream 记忆整理任务的会话。 **tags** `object[]` | 标签列表 当前完整标签数组,每项包含 `key` 和可选的 `value`。 **key** `string` | 标签键 `tags.key` 标签的键,用于标识分类维度。 **value** `string` | 标签值 `tags.value` 用于记录该标签分类的具体内容。 **title** `string` | 会话标题 会话标题,用于快速识别和检索 **vault_ids** `string[] / null` | 保管库 ID 列表 会话可访问的保管库 ID 数组 ## 代码示例 ## 更新会话 ### cURL #### Request ```Bash curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/sessions/" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d @- <<'EOF' { "title": "Q3 规划头脑风暴(已归档)", "tags": [ {"key": "team", "value": "agent-infra"}, {"key": "state", "value": "archived"} ] } EOF ``` #### Response ``` { "id": "", "type": "session", "agent": { "id": "", "type": "agent", "name": "", "version": 1, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T08:00:00Z" }, "environment_id": "", "title": "Q3 规划头脑风暴(已归档)", "vault_ids": [], "resources": [], "status": "idle", "created_at": "2026-07-15T08:30:12.000Z", "updated_at": "2026-07-15T10:00:00.000Z", "tags": [ {"key": "team", "value": "agent-infra"}, {"key": "state", "value": "archived"} ] } ``` ### Python #### Request ```python import os from arkruntime import Ark client = Ark( api_key=os.environ["ARK_API_KEY"], base_url="https://ark.cn-beijing.volces.com/api/v3", ) session = client.sessions.update( "", title="Q3 规划头脑风暴(已归档)", tags=[ {"key": "team", "value": "agent-infra"}, {"key": "state", "value": "archived"}, ], ) print(session) ``` #### Response ``` { "id": "", "type": "session", "agent": { "id": "", "type": "agent", "name": "", "version": 1, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T08:00:00Z" }, "environment_id": "", "title": "Q3 规划头脑风暴(已归档)", "vault_ids": [], "resources": [], "status": "idle", "created_at": "2026-07-15T08:30:12.000Z", "updated_at": "2026-07-15T10:00:00.000Z", "tags": [ {"key": "team", "value": "agent-infra"}, {"key": "state", "value": "archived"} ] } ``` ### Java #### Request ```java // pom.xml 依赖: // // com.volcengine // ark-runtime // 0.9.0 // import com.volcengine.ark.runtime.models.session.Session; import com.volcengine.ark.runtime.models.session.Tag; import com.volcengine.ark.runtime.models.session.UpdateSessionRequest; import com.volcengine.ark.runtime.service.ArkService; import java.util.Arrays; public class Main { public static void main(String[] args) throws Exception { ArkService service = ArkService.builder() .apiKey(System.getenv("ARK_API_KEY")) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); Session session = service.updateSession( "", UpdateSessionRequest.builder() .title("Q3 规划头脑风暴(已归档)") .tags(Arrays.asList( Tag.builder().key("team").value("agent-infra").build(), Tag.builder().key("state").value("archived").build())) .build()); System.out.println(session); service.shutdownExecutor(); } } ``` #### Response ``` { "id": "", "type": "session", "agent": { "id": "", "type": "agent", "name": "", "version": 1, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T08:00:00Z" }, "environment_id": "", "title": "Q3 规划头脑风暴(已归档)", "vault_ids": [], "resources": [], "status": "idle", "created_at": "2026-07-15T08:30:12.000Z", "updated_at": "2026-07-15T10:00:00.000Z", "tags": [ {"key": "team", "value": "agent-infra"}, {"key": "state", "value": "archived"} ] } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" sessionmodel "github.com/volcengine/ark-runtime-go/arkruntime/model/session" ) func main() { ctx := context.Background() client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) s, err := client.UpdateSession(ctx, "", &sessionmodel.UpdateSessionRequest{ Title: sessionmodel.NewOptString("Q3 规划头脑风暴(已归档)"), Tags: []sessionmodel.Tag{ {Key: "team", Value: sessionmodel.NewOptString("agent-infra")}, {Key: "state", Value: sessionmodel.NewOptString("archived")}, }, }) if err != nil { panic(err) } fmt.Println(s) } ``` #### Response ``` { "id": "", "type": "session", "agent": { "id": "", "type": "agent", "name": "", "version": 1, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T08:00:00Z" }, "environment_id": "", "title": "Q3 规划头脑风暴(已归档)", "vault_ids": [], "resources": [], "status": "idle", "created_at": "2026-07-15T08:30:12.000Z", "updated_at": "2026-07-15T10:00:00.000Z", "tags": [ {"key": "team", "value": "agent-infra"}, {"key": "state", "value": "archived"} ] } ``` --- # 升级会话 Source: https://ark.volcengine.com/region:cn-beijing/docs/upgrade-session-api `POST https://ark.cn-beijing.volces.com/api/v3/sessions/{session_id}/upgrades` 保留同一会话并刷新其当前使用的智能体、环境或保管库配置。升级会保留原会话 ID 和已有会话内容,不能换绑其他智能体、环境或保管库。 会话必须满足以下条件才能升级: - 当前状态为 `idle`。 - 上一轮以 `end_turn` 结束。 - 当前没有其他升级请求。 请求受理后,会话状态变为 `upgrading`。请轮询 [查询会话详情](/docs/get-session-api),等待状态恢复为 `idle` 后再继续发送事件。 根据目标选择接口: - 保留同一会话并刷新当前智能体、环境或保管库配置时,使用本接口。 - 只修改标题或标签时,使用 [更新会话标题和标签](/docs/update-session-api)。 - 需要新会话或更换绑定的智能体、环境时,使用 [创建会话](/docs/create-session-api)。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **session_id** `string` `必选` | 会话 ID 要升级的会话 ID,形如 `sesn-...`。 ### Body 参数 **agent** `object` | 智能体配置 会话升级后使用的智能体配置。`id` 必须与当前会话的智能体 ID 相同,形如 `agent-...`。 **id** `string` `必选` | 智能体 ID `agent.id` 智能体 ID,形如 `agent-...`;必须与当前会话的智能体 ID 一致。 **type** `string` `必选` | 对象类型 `agent.type` 固定为 `agent_with_upgrades`。 **display_name** `string` | 显示名称 `agent.display_name` 升级后使用的智能体展示名称。省略时保留当前值。 **mcp_servers** `object[]` | 升级后使用的 MCP 服务列表 `agent.mcp_servers` 省略时保留当前配置,传入 `[]` 时清空,传入非空数组时整体替换。 **name** `string` `必选` | MCP 服务名称 `agent.mcp_servers.name` MCP 服务名称,供 `tools[].mcp_server_name` 引用。 **type** `string` `必选` | MCP 接入方式 `agent.mcp_servers.type` MCP 服务接入方式,固定为 `url`。 **url** `string` `必选` | MCP 服务地址 `agent.mcp_servers.url` MCP 服务访问地址。同一智能体内不能配置重复的地址。 **model** `object` | 会话升级后使用的模型配置 `agent.model` 支持切换模型或推理接入点,以及调整运行参数和自定义模型服务配置;省略子字段时保留当前值。 **base_url** `string` | 模型服务地址 `agent.model.base_url` 非方舟模型服务的 OpenAI 或 Anthropic 兼容 API 地址。使用方舟模型服务时省略。 **headers** `object` | 自定义请求头 `agent.model.headers` 调用非方舟模型服务时附加的 HTTP 请求头,以字符串键值对形式传入。 **id** `string` | 模型或接入点 ID `agent.model.id` 目标模型 ID 或推理接入点 ID,例如 `doubao-seed-2-0-pro-260215` 或 `ep-20260907123456-abcd1`。 目标模型或推理接入点必须属于当前项目,并支持用于智能体。以下情况返回 400: - ID 为空。 - 资源不可用、元信息缺失或不属于当前项目。 - 目标模型不支持用于智能体。 目标模型未开通时返回 403 `ModelNotOpen`。 变更 `id` 时,服务端会重新校验模型参数。未指定的参数继续使用升级前的值。 **input_modalities** `string[]` | 输入模态 `agent.model.input_modalities` 非方舟模型服务支持的输入模态列表,例如 `text`、`image` 或 `video`。 **protocol** `string` | 调用协议 `agent.model.protocol` 模型调用协议。 - `ark_responses`:方舟 Responses 协议。 - `openai_chat_completions`:OpenAI Chat Completions 兼容协议。 - `openai_responses`:OpenAI Responses 兼容协议。 - `anthropic_messages`:Anthropic Messages 兼容协议。 **provider** `string` | 模型服务提供方 `agent.model.provider` 模型服务提供方。切换为非方舟模型服务时,需要同时提供与该服务匹配的 `protocol` 和 `base_url`。 **reasoning_effort** `string` | 推理努力程度 `agent.model.reasoning_effort` 升级后模型使用的推理努力程度。 **service_tier** `string` | 服务档位 `agent.model.service_tier` 升级后模型调用使用的推理服务档位。 **speed** `string` | 推理速度 `agent.model.speed` 模型推理速度档位。省略时保留当前值。可选值:`standard`、`fast`。 **thinking** `string` | 思考配置 `agent.model.thinking` 升级后模型使用的思考模式配置。 **token_limits** `object` | Token 限制 `agent.model.token_limits` 非方舟模型服务使用的 Token 长度限制。使用方舟模型服务时不能传入。 **context_window** `integer` | 上下文窗口 `agent.model.token_limits.context_window` 模型上下文窗口可容纳的最大 Token 数。 **max_input_token_length** `integer` | 最大输入长度 `agent.model.token_limits.max_input_token_length` 单次模型调用允许的最大输入 Token 数。 **max_output_token_length** `integer` | 最大输出长度 `agent.model.token_limits.max_output_token_length` 单次模型调用允许的最大输出 Token 数。 **multiagent** `object` | 升级后使用的多 Agent 配置 `agent.multiagent` 省略时保留当前配置;提供时整体替换,`agents` 传入 `[]` 时清空成员智能体列表。 **agents** `object[]` `必选` | 成员智能体 `agent.multiagent.agents` 成员智能体列表,最多 20 项。传入 `[]` 时清空当前成员列表。 **type** `string` `必选` | 成员来源 `agent.multiagent.agents.type` 成员来源。`agent` 表示引用当前账号和项目中的已有 Agent;`self` 表示复用当前主 Agent。 **id** `string` | 智能体 ID `agent.multiagent.agents.id` 成员智能体 ID。当 `type` 为 `agent` 时必填;当 `type` 为 `self` 时省略。 **version** `integer` | 智能体版本 `agent.multiagent.agents.version` 成员智能体版本号,仅当 `type` 为 `agent` 时生效。省略时使用最新版本。 **type** `string` `必选` | 协作模式 `agent.multiagent.type` 多 Agent 协作模式,固定为 `coordinator`。 **skills** `object[]` | 升级后使用的 Skill 列表 `agent.skills` 省略时保留当前配置,传入 `[]` 时清空,传入非空数组时整体替换。 **type** `string` `必选` | Skill 来源 `agent.skills.type` Skill 来源。 - `ark`:方舟预置 Skill。 - `skill_hub`:来自 Skill Hub 的公共 Skill。 - `custom`:当前账号通过 Skills API 创建的自定义 Skill。 **skill_id** `string` | Skill ID `agent.skills.skill_id` 要绑定的 Skill ID。 **version** `string` | Skill 版本 `agent.skills.version` 要绑定的 Skill 版本号。省略时使用该 Skill 的最新版本。 **system** `string` | 升级后使用的系统提示词 `agent.system` 省略时保留当前值。 **tools** `object[]` | 升级后使用的工具列表 `agent.tools` 省略时保留当前配置,传入 `[]` 时清空,传入非空数组时整体替换。 **type** `string` `必选` | 工具类型 `agent.tools.type` 工具类型。 - `agent_toolset_20260916`:使用方舟内置的基础工具集。 - `agent_toolset_multimodal_20260825`:使用多模态生成与搜索工具。 - `mcp_toolset`:使用指定 MCP 服务提供的工具。 - `custom`:使用由客户端执行的自定义工具。 可选值:`agent_toolset_20260401`、`agent_toolset_20260701`、`agent_toolset_20260916`、`agent_toolset_multimodal_20260825`、`mcp_toolset`、`custom`。 **configs** `object[]` | 工具配置列表 `agent.tools.configs` 按工具名称设置工具的启用状态、权限策略和工具模型。 **name** `string` `必选` | 工具名称 `agent.tools.configs.name` 工具配置对应的工具名称。 **enabled** `boolean` | 是否启用 `agent.tools.configs.enabled` 是否启用此工具。 **models** `object[]` | 工具模型列表 `agent.tools.configs.models` 图片生成或视频生成工具使用的模型 ID 或推理接入点 ID 列表。目标模型必须已在当前项目中开通,并支持对应工具。 > **说明** > > 最多填写 10 项,且同一工具配置内的模型 ID 或推理接入点 ID 不能重复。配置多项时,必须且只能将一项的 `default` 设置为 `true`。 **id** `string` `必选` | 模型或接入点 ID `agent.tools.configs.models.id` 图片生成或视频生成工具调用的模型 ID 或推理接入点 ID。 **default** `boolean` `默认值 false` | 是否为默认模型 `agent.tools.configs.models.default` 是否作为该工具的默认模型。配置多项时,必须且只能将一项设置为 `true`。 **permission_policy** `object` | 权限策略 `agent.tools.configs.permission_policy` 该工具使用的调用许可策略。 **type** `string` `必选` | 策略类型 `agent.tools.configs.permission_policy.type` 策略类型,`always_allow` 表示允许直接调用,`always_ask` 表示每次调用前需要用户确认。 **default_config** `object` | 默认工具配置 `agent.tools.default_config` 未在 `configs` 中单独配置的工具所使用的默认启用状态和权限策略。 **enabled** `boolean` | 是否启用 `agent.tools.default_config.enabled` 未单独配置的工具是否默认启用。 **permission_policy** `object` | 权限策略 `agent.tools.default_config.permission_policy` 未单独配置的工具使用的调用许可策略。 **type** `string` `必选` | 策略类型 `agent.tools.default_config.permission_policy.type` 策略类型,`always_allow` 表示允许直接调用,`always_ask` 表示每次调用前需要用户确认。 **description** `string` | 自定义工具描述 `agent.tools.description` 说明自定义工具的功能和适用场景,供模型判断何时调用该工具。 **input_schema** `object` | 输入参数定义 `agent.tools.input_schema` 定义自定义工具的输入参数及其约束。 **properties** `object` | 参数属性定义 `agent.tools.input_schema.properties` 自定义工具输入参数的 JSON Schema `properties` 对象。键为参数名,值为对应参数的 JSON Schema 子对象。 **required** `string[]` | 必填参数名称列表 `agent.tools.input_schema.required` 自定义工具输入中必填的参数名称列表。每个名称必须与 `properties` 中定义的参数名称一致。 **type** `string` `默认值 object` | Schema 类型 `agent.tools.input_schema.type` JSON Schema 的顶层类型,仅支持 `object`。 **mcp_server_name** `string` | MCP 服务名称 `agent.tools.mcp_server_name` `mcp_toolset` 工具引用的 MCP 服务名称,必须与 `mcp_servers[].name` 一致。 **name** `string` | 自定义工具名称 `agent.tools.name` > **说明** > > `type` 为 `custom` 时必填。只能包含字母、数字、下划线和连字符,且同一 Agent 内不能重复。 **version** `integer` | 版本号 `agent.version` 目标智能体版本号。与创建会话不同,省略或传入 `0` 表示继续使用当前会话的智能体配置,不会自动切换到最新版本。 - 如需切换,请显式提供正整数版本号。 - 指定版本时,先使用该版本保存的配置,再应用本次请求中提供的同名字段。 **environment** `object` | 环境配置 当前会话所用环境的引用,用于刷新该环境的最新配置。`id` 用于确认要刷新的环境,必须与会话当前绑定的环境 ID 相同。 **id** `string` `必选` | 环境 ID `environment.id` 环境 ID,形如 `env-...`;必须与当前会话的环境 ID 一致。 **type** `string` `必选` | 对象类型 `environment.type` 固定为 `environment_with_upgrades`。 **config** `object` | 会话运行环境的配置变更 `environment.config` 云端环境支持追加依赖包、合并环境变量和替换初始化脚本;自托管环境不接受这些运行时字段。 **env** `object` | 要追加或更新的环境变量,以字符串键值对形式传入 `environment.config.env` 服务端与当前配置合并,同名变量使用本次请求中的值。 **packages** `object` | 要追加或更新的依赖包 `environment.config.packages` 服务端按包名与当前配置合并:同名包使用本次请求中的版本,新包追加到现有列表。 **apt** `string[]` | APT 软件包 `environment.config.packages.apt` apt 依赖。 **cargo** `string[]` | Cargo 包 `environment.config.packages.cargo` cargo 依赖。 **gem** `string[]` | Ruby Gem 包 `environment.config.packages.gem` gem 依赖。 **go** `string[]` | Go 模块 `environment.config.packages.go` go module 依赖。 **npm** `string[]` | npm 包 `environment.config.packages.npm` npm 依赖。 **pip** `string[]` | Python 包 `environment.config.packages.pip` pip 依赖。 **type** `string` | 配置类型 `environment.config.packages.type` 固定为 `packages`。 **setup_script** `string` | 升级后使用的初始化脚本 `environment.config.setup_script` 省略时保留当前值,传入空字符串时清空。 **vault_ids** `string[]` | 保管库 ID 列表 当前会话绑定的保管库 ID 列表,用于重新加载这些保管库中的凭证配置,不会改变会话与保管库的绑定关系。 传入的 ID 集合必须与当前绑定一致,不考虑顺序和重复项。 省略该字段表示保持现有绑定不变。传入 `[]` 仅适用于当前会话未绑定 Vault 的情况。 ## 响应参数 **agent** `object` | 智能体配置 会话升级后的智能体配置。请求中包含 `agent` 时返回刷新后的配置;未包含 `agent` 时返回升级前沿用的配置。 **created_at** `string` | 创建时间 `agent.created_at` 智能体创建完成的时间,采用 RFC 3339 格式。 **id** `string` | 智能体 ID `agent.id` 会话当前使用的智能体 ID。 **name** `string` | 智能体名称 `agent.name` 会话当前使用的智能体名称。 **type** `string` | 对象类型 `agent.type` 对象类型,固定为 `agent`。 **updated_at** `string` | 更新时间 `agent.updated_at` 智能体配置最后更新的时间,采用 RFC 3339 格式。 **version** `integer` | 版本号 `agent.version` 会话当前使用的智能体版本号。 **base_agent** `string` | 基础智能体类型 `agent.base_agent` 当前配置使用的基础 Agent 类型。 - `ark_agent_preview`:通用 Agent。 - `ultra_vision_agent_preview`:Seedance Managed Agent。 **description** `string` | 智能体说明 `agent.description` 会话当前使用的智能体说明。 **display_name** `string` | 显示名称 `agent.display_name` 会话当前使用的智能体显示名称。 **mcp_servers** `object[]` | MCP 服务列表 `agent.mcp_servers` 当前 Session 使用的 MCP server 配置列表。 **name** `string` | MCP 服务名称 `agent.mcp_servers.name` MCP 服务名称,供 `tools[].mcp_server_name` 引用。 **type** `string` | MCP 接入方式 `agent.mcp_servers.type` MCP 服务接入方式,固定为 `url`。 **url** `string` | MCP 服务地址 `agent.mcp_servers.url` 会话创建时冻结的 MCP 服务访问地址。 **metadata** `object` | 自定义元数据 `agent.metadata` 创建智能体时设置的自定义键值对,服务端不定义固定子字段。 **model** `object` | 模型配置 `agent.model` 当前 Session 实际使用的模型配置。 **id** `string` | 模型或接入点 ID `agent.model.id` 会话当前使用的模型 ID 或推理接入点 ID。 **protocol** `string` | 调用协议 `agent.model.protocol` 会话模型调用使用的协议: - `ark_responses`:方舟 Responses 协议。 - `openai_chat_completions`:OpenAI Chat Completions 兼容协议。 - `openai_responses`:OpenAI Responses 兼容协议。 - `anthropic_messages`:Anthropic Messages 兼容协议。 **reasoning_effort** `string` | 推理投入档位 `agent.model.reasoning_effort` 会话当前使用的推理投入档位。 **service_tier** `string` | 推理服务档位 `agent.model.service_tier` 会话当前使用的推理服务档位。 **speed** `string` | 推理速度 `agent.model.speed` 模型推理速度档位。 **thinking** `string` | 思考模式 `agent.model.thinking` 会话当前使用的思考模式。 **multiagent** `object` | 多智能体配置 `agent.multiagent` 当前 Session 使用的多 Agent 配置。 **agents** `object[]` | 成员智能体 `agent.multiagent.agents` 会话创建时冻结的成员智能体列表。 **type** `string` | 引用类型 `agent.multiagent.agents.type` 成员引用类型: - `agent`:引用其他智能体。 - `self`:引用当前智能体。 **description** `string` | 智能体说明 `agent.multiagent.agents.description` 会话创建时冻结的成员智能体说明。 **display_name** `string` | 显示名称 `agent.multiagent.agents.display_name` 会话创建时冻结的成员智能体显示名称。 **id** `string` | 智能体 ID `agent.multiagent.agents.id` 成员智能体的 ID;当 `type` 为 `self` 时,返回当前智能体的 ID。 **mcp_servers** `object[]` | MCP 服务列表 `agent.multiagent.agents.mcp_servers` 会话创建时冻结的成员智能体 MCP 服务配置列表。 **name** `string` | MCP 服务名称 `agent.multiagent.agents.mcp_servers.name` MCP 服务名称,供 `tools[].mcp_server_name` 引用。 **type** `string` | MCP 接入方式 `agent.multiagent.agents.mcp_servers.type` MCP 服务接入方式,固定为 `url`。 **url** `string` | MCP 服务地址 `agent.multiagent.agents.mcp_servers.url` 会话创建时冻结的 MCP 服务访问地址。 **model** `object` | 模型配置 `agent.multiagent.agents.model` 会话创建时冻结的成员智能体模型配置。 **id** `string` | 模型或接入点 ID `agent.multiagent.agents.model.id` 成员智能体使用的模型 ID 或推理接入点 ID。 **speed** `string` | 推理速度 `agent.multiagent.agents.model.speed` 成员智能体使用的模型推理速度档位。 **name** `string` | 智能体名称 `agent.multiagent.agents.name` 会话创建时冻结的成员智能体名称。 **skills** `object[]` | Skill 列表 `agent.multiagent.agents.skills` 会话创建时冻结的成员智能体 Skill 配置列表。 **type** `string` | Skill 类型 `agent.multiagent.agents.skills.type` Skill 来源类型: - `ark`:方舟平台预置 Skill。 - `skill_hub`:Skill Hub 中的公共 Skill。 - `custom`:当前账号创建的自定义 Skill。 **display_name** `string` | Skill 名称 `agent.multiagent.agents.skills.display_name` 会话创建时记录的 Skill 展示名称。 **skill_id** `string` | Skill ID `agent.multiagent.agents.skills.skill_id` 会话使用的 Skill ID。 **use_latest** `boolean` | 使用最新版本 `agent.multiagent.agents.skills.use_latest` 是否在创建会话时选择该 Skill 的最新版本。`true` 表示选择当时的最新版本,`false` 表示使用 `version` 指定的版本。 **version** `string` | Skill 版本 `agent.multiagent.agents.skills.version` 会话创建时冻结的 Skill 版本号。 **system** `string` | 系统提示词 `agent.multiagent.agents.system` 会话创建时冻结的成员智能体系统提示词。 **tools** `object[]` | 工具列表 `agent.multiagent.agents.tools` 会话创建时冻结的成员智能体工具配置列表。 **type** `string` | 工具类型 `agent.multiagent.agents.tools.type` 工具类型: - `agent_toolset_20260916`:当前版本的方舟内置工具集。 - `agent_toolset_multimodal_20260825`:使用 `image_generate`、`video_generate`、`visual_search`、`general_search`、`compose_video` 和 `todo_write` 工具。 - `mcp_toolset`:指定 MCP 服务提供的工具集。 - `custom`:由客户端执行的自定义工具。 可选值:`agent_toolset_20260916`、`agent_toolset_20260701`、`agent_toolset_multimodal_20260825`、`mcp_toolset`、`custom`。 **configs** `object[]` | 工具配置 `agent.multiagent.agents.tools.configs` 会话创建时冻结的逐项工具配置。 **name** `string` | 工具名称 `agent.multiagent.agents.tools.configs.name` 会话快照中记录的工具名称。 **enabled** `boolean` | 是否启用 `agent.multiagent.agents.tools.configs.enabled` 工具是否启用。 **models** `object[]` | 工具模型列表 `agent.multiagent.agents.tools.configs.models` 会话快照中记录的图片生成或视频生成工具模型 ID 或推理接入点 ID 列表。 **id** `string` | 模型或接入点 ID `agent.multiagent.agents.tools.configs.models.id` 该工具绑定的模型 ID 或推理接入点 ID。 **default** `boolean` | 是否为默认模型 `agent.multiagent.agents.tools.configs.models.default` 是否为该工具的默认模型。 **name** `string` | 模型名称 `agent.multiagent.agents.tools.configs.models.name` 服务端根据模型 ID 或推理接入点 ID 返回的模型名称。 **version** `string` | 模型版本 `agent.multiagent.agents.tools.configs.models.version` 服务端根据模型 ID 或推理接入点 ID 返回的模型版本。 **permission_policy** `object` | 权限策略 `agent.multiagent.agents.tools.configs.permission_policy` 工具使用的调用许可策略。 **type** `string` | 策略类型 `agent.multiagent.agents.tools.configs.permission_policy.type` 策略类型,`always_allow` 表示允许直接调用,`always_ask` 表示每次调用前需要用户确认。 **default_config** `object` | 默认工具配置 `agent.multiagent.agents.tools.default_config` 未在 `configs` 中单独列出的工具所使用的默认配置。 **enabled** `boolean` | 是否启用 `agent.multiagent.agents.tools.default_config.enabled` 未单独配置的工具是否默认启用。 **permission_policy** `object` | 权限策略 `agent.multiagent.agents.tools.default_config.permission_policy` 未单独配置的工具使用的调用许可策略。 **type** `string` | 策略类型 `agent.multiagent.agents.tools.default_config.permission_policy.type` 策略类型,`always_allow` 表示允许直接调用,`always_ask` 表示每次调用前需要用户确认。 **description** `string` | 自定义工具说明 `agent.multiagent.agents.tools.description` 会话创建时冻结的自定义工具说明,用于记录工具的功能和适用场景。 **input_schema** `object` | 输入参数定义 `agent.multiagent.agents.tools.input_schema` 返回 Session 的 Agent 快照中记录的自定义工具输入参数 JSON Schema。 **properties** `object` | 参数属性定义 `agent.multiagent.agents.tools.input_schema.properties` 返回 Session 的 Agent 快照中记录的 JSON Schema 属性映射。每个键为参数名,每个值为对应参数的 JSON Schema 子对象。 **required** `string[]` | 必填参数名称列表 `agent.multiagent.agents.tools.input_schema.required` 返回调用自定义工具时必须提供的参数名称列表。 **type** `string` | Schema 类型 `agent.multiagent.agents.tools.input_schema.type` 返回 JSON Schema 的顶层类型,固定为 `object`。 **mcp_server_name** `string` | MCP 服务名称 `agent.multiagent.agents.tools.mcp_server_name` 会话中 `mcp_toolset` 引用的 MCP 服务名称。 **name** `string` | 自定义工具名称 `agent.multiagent.agents.tools.name` 会话创建时冻结的自定义工具名称。 **version** `integer` | 版本号 `agent.multiagent.agents.version` 会话创建时冻结的成员智能体版本号。 **type** `string` | 协作模式 `agent.multiagent.type` 多智能体协作模式,固定为 `coordinator`。 **skills** `object[]` | Skill 列表 `agent.skills` 当前 Session 使用的 Skill 配置列表。 **type** `string` | Skill 类型 `agent.skills.type` Skill 来源类型: - `ark`:方舟平台预置 Skill。 - `skill_hub`:Skill Hub 中的公共 Skill。 - `custom`:当前账号创建的自定义 Skill。 **display_name** `string` | Skill 名称 `agent.skills.display_name` 会话创建时记录的 Skill 展示名称。 **skill_id** `string` | Skill ID `agent.skills.skill_id` 会话使用的 Skill ID。 **use_latest** `boolean` | 使用最新版本 `agent.skills.use_latest` 是否在创建会话时选择该 Skill 的最新版本。`true` 表示选择当时的最新版本,`false` 表示使用 `version` 指定的版本。 **version** `string` | Skill 版本 `agent.skills.version` 会话创建时冻结的 Skill 版本号。 **system** `string` | 系统提示词 `agent.system` 会话当前使用的系统提示词。 **tools** `object[]` | 工具列表 `agent.tools` 当前 Session 使用的工具配置列表,字段结构与 Agent 对象中的 `tools` 一致。 **type** `string` | 工具类型 `agent.tools.type` 工具类型: - `agent_toolset_20260916`:当前版本的方舟内置工具集。 - `agent_toolset_multimodal_20260825`:使用 `image_generate`、`video_generate`、`visual_search`、`general_search`、`compose_video` 和 `todo_write` 工具。 - `mcp_toolset`:指定 MCP 服务提供的工具集。 - `custom`:由客户端执行的自定义工具。 可选值:`agent_toolset_20260916`、`agent_toolset_20260701`、`agent_toolset_multimodal_20260825`、`mcp_toolset`、`custom`。 **configs** `object[]` | 工具配置 `agent.tools.configs` 会话创建时冻结的逐项工具配置。 **name** `string` | 工具名称 `agent.tools.configs.name` 会话快照中记录的工具名称。 **enabled** `boolean` | 是否启用 `agent.tools.configs.enabled` 工具是否启用。 **models** `object[]` | 工具模型列表 `agent.tools.configs.models` 会话快照中记录的图片生成或视频生成工具模型 ID 或推理接入点 ID 列表。 **id** `string` | 模型或接入点 ID `agent.tools.configs.models.id` 该工具绑定的模型 ID 或推理接入点 ID。 **default** `boolean` | 是否为默认模型 `agent.tools.configs.models.default` 是否为该工具的默认模型。 **name** `string` | 模型名称 `agent.tools.configs.models.name` 服务端根据模型 ID 或推理接入点 ID 返回的模型名称。 **version** `string` | 模型版本 `agent.tools.configs.models.version` 服务端根据模型 ID 或推理接入点 ID 返回的模型版本。 **permission_policy** `object` | 权限策略 `agent.tools.configs.permission_policy` 工具使用的调用许可策略。 **type** `string` | 策略类型 `agent.tools.configs.permission_policy.type` 策略类型,`always_allow` 表示允许直接调用,`always_ask` 表示每次调用前需要用户确认。 **default_config** `object` | 默认工具配置 `agent.tools.default_config` 未在 `configs` 中单独列出的工具所使用的默认配置。 **enabled** `boolean` | 是否启用 `agent.tools.default_config.enabled` 未单独配置的工具是否默认启用。 **permission_policy** `object` | 权限策略 `agent.tools.default_config.permission_policy` 未单独配置的工具使用的调用许可策略。 **type** `string` | 策略类型 `agent.tools.default_config.permission_policy.type` 策略类型,`always_allow` 表示允许直接调用,`always_ask` 表示每次调用前需要用户确认。 **description** `string` | 自定义工具说明 `agent.tools.description` 会话创建时冻结的自定义工具说明,用于记录工具的功能和适用场景。 **input_schema** `object` | 输入参数定义 `agent.tools.input_schema` 返回 Session 的 Agent 快照中记录的自定义工具输入参数 JSON Schema。 **properties** `object` | 参数属性定义 `agent.tools.input_schema.properties` 返回 Session 的 Agent 快照中记录的 JSON Schema 属性映射。每个键为参数名,每个值为对应参数的 JSON Schema 子对象。 **required** `string[]` | 必填参数名称列表 `agent.tools.input_schema.required` 返回调用自定义工具时必须提供的参数名称列表。 **type** `string` | Schema 类型 `agent.tools.input_schema.type` 返回 JSON Schema 的顶层类型,固定为 `object`。 **mcp_server_name** `string` | MCP 服务名称 `agent.tools.mcp_server_name` 会话中 `mcp_toolset` 引用的 MCP 服务名称。 **name** `string` | 自定义工具名称 `agent.tools.name` 会话创建时冻结的自定义工具名称。 **created_at** `string` | 创建时间 会话创建完成的时间,采用 RFC 3339 格式。 **environment_id** `string` | 环境 ID 升级后会话实际使用的 Environment ID。 **id** `string` | 会话 ID 会话 ID,形如 `sesn-...`,与请求中的 `session_id` 相同。 **status** `string` | 会话状态 会话运行状态。请求受理后返回 `upgrading`;等待状态恢复为 `idle` 后再继续发送事件。取值:`idle` / `running` / `terminated` / `rescheduling` / `initializing` / `failed` / `upgrading`。 **type** `string` | 对象类型 固定为 `session`。 **updated_at** `string` | 更新时间 会话信息最后更新的时间,采用 RFC 3339 格式。 **archived_at** `string` | 归档时间 会话归档的时间,采用 RFC 3339 格式。会话未归档时,服务端不返回该字段。 **environment** `object` | 环境配置 当前会话实际使用的环境配置。后续修改原环境不会自动改变该会话。 **created_at** `string` | 创建时间 `environment.created_at` 环境创建完成的时间,采用 RFC 3339 格式。 **id** `string` | 环境 ID `environment.id` 会话当前使用的 Environment ID。 **name** `string` | 环境名称 `environment.name` 会话当前使用的环境名称。 **type** `string` | 对象类型 `environment.type` 会话环境快照类型。`environment` 表示直接使用基础 Environment;`environment_with_overrides` 表示当前会话使用了环境配置覆写。 **updated_at** `string` | 更新时间 `environment.updated_at` 环境配置最后更新的时间,采用 RFC 3339 格式。 **config** `object` | 环境配置 `environment.config` 当前会话使用的环境配置。 **type** `string` | 环境类型 `environment.config.type` 运行环境类型。可选值:`cloud`、`self_hosted`。 **env** `object` | 环境变量 `environment.config.env` 会话运行环境中的环境变量键值对。 **networking** `object` | 出网策略 `environment.config.networking` 容器出网策略。 **type** `string` | 出网策略类型 `environment.config.networking.type` 会话当前使用的出网策略。`unrestricted` 表示不限制出网目标。 **packages** `object` | 依赖包配置 `environment.config.packages` 启动时预装的依赖包。 **apt** `string[]` | apt 包 `environment.config.packages.apt` 会话环境启动时通过 apt 预装的系统包列表。 **cargo** `string[]` | Cargo 包 `environment.config.packages.cargo` 会话环境启动时通过 Cargo 预装的 Rust crate 列表。 **gem** `string[]` | gem 包 `environment.config.packages.gem` 会话环境启动时通过 RubyGems 预装的 Ruby 包列表。 **go** `string[]` | Go 模块 `environment.config.packages.go` 会话环境启动时通过 Go 工具链预装的模块依赖列表。 **npm** `string[]` | npm 包 `environment.config.packages.npm` 会话环境启动时通过 npm 预装的 Node.js 包列表。 **pip** `string[]` | pip 包 `environment.config.packages.pip` 会话环境启动时通过 pip 预装的 Python 包列表。 **type** `string` | 配置类型 `environment.config.packages.type` 依赖包配置的类型标识,固定为 `packages`。 **setup_script** `string` | 启动脚本 `environment.config.setup_script` 会话运行环境启动时执行的初始化脚本。 **tos** `object` | 产物存储配置 `environment.config.tos` Environment outputs 的 TOS 存储配置。 **bucket** `string` | TOS 桶 `environment.config.tos.bucket` 会话环境快照中保存的用户 TOS 存储桶名称。 **prefix** `string` | 对象前缀 `environment.config.tos.prefix` 会话环境快照中保存的对象存储目录前缀。 **description** `string` | 环境说明 `environment.description` 会话当前使用的环境说明。 **metadata** `object` | 自定义元数据 `environment.metadata` 用户自定义元数据。 **overridden_fields** `string[]` | 覆写字段 `environment.overridden_fields` 当前会话相对基础 Environment 实际覆写的 `config` 子字段名称列表。仅在 *type* 为 `environment_with_overrides` 且存在覆写字段时返回。 **scope** `string` | 环境作用域 `environment.scope` 环境配置的可见范围:`organization` 表示组织内共享,`account` 表示账号内可见。 **resources** `object[]` | 资源列表 升级后会话当前挂载到运行环境的资源列表。 文件资源 `object` 通过 Files API 上传并挂载到会话的文件。 **created_at** `string` | 挂载时间 `resources.created_at` 资源挂载到会话的时间,采用 RFC 3339 格式。 **id** `string` | 资源 ID `resources.id` 会话资源 ID。 **type** `string` | 资源类型 `resources.type` 资源类型,固定为 `file`。 **updated_at** `string` | 更新时间 `resources.updated_at` 会话资源信息最后更新的时间,采用 RFC 3339 格式。 **access** `string` | 访问权限 `resources.access` 文件访问权限,固定为 `read_only`。 **file_id** `string` | 文件 ID `resources.file_id` 当前可用的文件 ID。 **mount_path** `string` | 挂载路径 `resources.mount_path` 文件在会话运行环境中的完整挂载路径。 记忆库资源 `object` 挂载到会话的记忆库。 **created_at** `string` | 挂载时间 `resources.created_at` 资源挂载到会话的时间,采用 RFC 3339 格式。 **id** `string` | 资源 ID `resources.id` 会话资源 ID。 **type** `string` | 资源类型 `resources.type` 资源类型,固定为 `memory_store`。 **updated_at** `string` | 更新时间 `resources.updated_at` 会话资源信息最后更新的时间,采用 RFC 3339 格式。 **access** `string` | 访问权限 `resources.access` 会话对记忆库的访问权限。可选值:`read_only`、`read_write`。 **instructions** `string` | 使用指导 `resources.instructions` 会话当前用于该记忆库的使用指导。 **memory_store_id** `string` | 记忆库 ID `resources.memory_store_id` 挂载到会话的记忆库 ID。 TOS 资源 `object` 挂载到会话的 TOS 对象目录。 **created_at** `string` | 挂载时间 `resources.created_at` 资源挂载到会话的时间,采用 RFC 3339 格式。 **id** `string` | 资源 ID `resources.id` 会话资源 ID。 **type** `string` | 资源类型 `resources.type` 资源类型,固定为 `tos`。 **updated_at** `string` | 更新时间 `resources.updated_at` 会话资源信息最后更新的时间,采用 RFC 3339 格式。 **access** `string` | 访问权限 `resources.access` 会话对 TOS 目录的访问权限。可选值:`read_only`、`read_write`。 **mount_path** `string` | 挂载路径 `resources.mount_path` TOS 目录在会话运行环境中的挂载路径。创建会话时未指定挂载路径,则不返回该字段。 **tos_bucket** `string` | TOS 存储桶 `resources.tos_bucket` TOS 挂载源所在的存储桶名称。 **tos_key** `string` | TOS 目录前缀 `resources.tos_key` TOS 中已挂载目录的对象前缀。 **tos_region** `string` | TOS 地域 `resources.tos_region` TOS 挂载源所在地域的 Region ID。 **scene** `string` | 会话场景 会话场景标记。 - `default`:普通会话。 - `dreams`:用于 Dream 记忆整理任务的会话。 **tags** `object[]` | 标签列表 会话标签,用于业务侧检索与分组。 **key** `string` | 标签键 `tags.key` 标签键,用于分类和检索 **value** `string` | 标签值 `tags.value` 用于记录该标签分类的具体内容。 **title** `string` | 会话标题 升级后的会话标题,用于识别和检索该会话。 **vault_ids** `string[] / null` | 保管库 ID 列表 升级后会话可访问的保管库 ID 列表。智能体可在运行过程中使用其中的凭证。 ## 代码示例 ## 升级会话 ### cURL #### Request ```bash curl -sS --fail-with-body \ "https://ark.cn-beijing.volces.com/api/v3/sessions//upgrades" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d @- <<'EOF' { "agent": { "type": "agent_with_upgrades", "id": "", "version": 2, "display_name": "数据分析助手(快速分析)", "system": "你是一个数据分析助手。优先给出结论、关键指标和异常项。" } } EOF ``` #### Response ``` { "id": "", "type": "session", "status": "upgrading", "environment_id": "", "agent": { "id": "", "type": "agent", "name": "数据分析助手", "display_name": "数据分析助手(快速分析)", "version": 2, "system": "你是一个数据分析助手。优先给出结论、关键指标和异常项。", "created_at": "2026-10-19T08:00:00Z", "updated_at": "2026-10-19T08:40:00Z" }, "created_at": "2026-10-19T08:30:00Z", "updated_at": "2026-10-19T08:40:00Z" } ``` --- # 删除会话 Source: https://ark.volcengine.com/region:cn-beijing/docs/delete-session-api `DELETE https://ark.cn-beijing.volces.com/api/v3/sessions/{session_id}` 永久删除不再需要的会话并释放其活跃会话占用。删除成功后,该会话将无法再通过 [查询会话详情](/docs/get-session-api) 或 [查询会话列表](/docs/list-sessions-api) 访问。相关运行资源可能继续在后台回收,无需轮询删除状态。 删除会话前,请根据会话状态处理: - `idle` 或 `terminated`:可以直接删除。 - `running`:先发送 `user.interrupt`,等待状态恢复为 `idle` 后再删除。 - 其他状态:等待当前操作完成并恢复为 `idle` 后再删除。 如需中断当前任务但保留会话,请发送 `user.interrupt`,不要删除会话。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **session_id** `string` `必选` | 会话 ID 要删除的会话 ID,格式为 `sesn-` 开头的字符串。 ## 响应参数 **id** `string` | 会话 ID 被删除的会话 ID。 **type** `string` | 对象类型 对象类型,固定为 `session_deleted`。 ## 代码示例 ## 删除会话 ### cURL #### Request ```Bash curl -sS --fail-with-body -X DELETE "https://ark.cn-beijing.volces.com/api/v3/sessions/" \ -H "Authorization: Bearer $ARK_API_KEY" ``` #### Response ``` { "id": "", "type": "session_deleted" } ``` ### Python #### Request ```python import os from arkruntime import Ark client = Ark( api_key=os.environ["ARK_API_KEY"], base_url="https://ark.cn-beijing.volces.com/api/v3", ) response = client.sessions.delete("") print(response) ``` #### Response ``` { "id": "", "type": "session_deleted" } ``` ### Java #### Request ```java // pom.xml 依赖: // // com.volcengine // ark-runtime // 0.9.0 // import com.volcengine.ark.runtime.service.ArkService; public class Main { public static void main(String[] args) throws Exception { ArkService service = ArkService.builder() .apiKey(System.getenv("ARK_API_KEY")) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); Object response = service.deleteSession(""); System.out.println(response); service.shutdownExecutor(); } } ``` #### Response ``` { "id": "", "type": "session_deleted" } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" ) func main() { ctx := context.Background() client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) response, err := client.DeleteSession(ctx, "") if err != nil { panic(err) } fmt.Println(response) } ``` #### Response ``` { "id": "", "type": "session_deleted" } ``` --- # 发送会话事件 Source: https://ark.volcengine.com/region:cn-beijing/docs/send-event-api `POST https://ark.cn-beijing.volces.com/api/v3/sessions/{session_id}/events` 向指定会话发送用户侧事件。 需要实时接收智能体输出和状态变化时,创建会话后先建立 [流式事件连接](/docs/stream-events-api),再调用本接口发送事件。无需实时接收时,可在发送后通过 [获取会话事件列表](/docs/list-events-api) 查询结果。 接口成功响应仅表示事件已受理,不表示本轮处理完成。事件字段结构请参见 [会话事件结构参考](/docs/sessions-events-reference-v2)。 > **说明** > > `user.message` 事件的 `content` 数组支持文本、图片、文档、视频等多种内容块。图片、文档和视频块均可将 `source.type` 设为 `file`,并通过 `source.file_id` 引用 Files API 已上传的文件。`purpose` 为 `user_data` 或 `agent` 的文件均可复用。文件能否直接传入当前模型,由模型能力和内容类型共同决定;不满足条件时,可通过会话 `resources` 将文件挂载到会话运行环境中处理。字段结构详情请参见 [会话事件结构参考](/docs/sessions-events-reference-v2)。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **session_id** `string` `必选` | 会话 ID 填写要接收事件的会话 ID,形如 `sesn-...` ### Body 参数 **events** `object[]` `必选` | 事件列表 要发送的用户侧事件列表,至少包含 1 条事件。每个事件对象至少包含 `type` 字段,其余字段随事件类型不同而变化。 支持的事件类型、字段结构和批次顺序请参见 [会话事件结构参考](/docs/sessions-events-reference-v2)。 > **说明** > > 整个请求体不能超过 10 MiB。 **type** `string` `必选` | 事件类型 `events.type` 事件类型标识符。支持的取值及对应字段结构详见 [会话事件结构参考](/docs/sessions-events-reference-v2)。 ## 响应参数 **data** `object[]` | 已接收事件列表 服务端已受理的事件列表,与请求中的 `events` 一一对应。每个元素的字段随 `type` 变化,详情请参见 [会话事件结构参考](/docs/sessions-events-reference-v2)。 接口成功响应仅表示事件已受理,不表示本轮处理完成。可通过 [流式获取会话事件](/docs/stream-events-api) 实时接收结果,或通过 [获取会话事件列表](/docs/list-events-api) 查询已经产生的事件。 **type** `string` | 事件类型 `data.type` 事件类型,与请求中传入的 `type` 一致,如 `user.message` **id** `string` | 事件 ID `data.id` 回执中的事件 ID。服务端会为未提供 ID 的用户事件生成形如 `sevt-...` 的 ID;`system.message` 等事件可能返回空字符串,最终事件 ID 以事件列表或流式事件为准 ## 代码示例 ## 发送会话事件 ### cURL #### Request ```Bash curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/sessions//events" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d @- <<'EOF' { "events": [ { "type": "user.message", "content": [{"type": "text", "text": "帮我梳理 Q3 目标,并列出交付判据"}] } ] } EOF ``` #### Response ``` { "data": [ { "id": "sevt-20260926143025-a1b2c", "type": "user.message", "content": [ {"type": "text", "text": "帮我梳理 Q3 目标,并列出交付判据"} ] } ] } ``` ### Python #### Request ```python import os from arkruntime import Ark client = Ark( api_key=os.environ["ARK_API_KEY"], base_url="https://ark.cn-beijing.volces.com/api/v3", ) resp = client.sessions.events.send( "", events=[ { "type": "user.message", "content": [ {"type": "text", "text": "帮我梳理 Q3 目标,并列出交付判据"} ], } ], ) print(resp) ``` #### Response ``` { "data": [ { "id": "sevt-20260926143025-a1b2c", "type": "user.message", "content": [ {"type": "text", "text": "帮我梳理 Q3 目标,并列出交付判据"} ] } ] } ``` ### Java #### Request ```java // pom.xml 依赖: // // com.volcengine // ark-runtime // 0.9.0 // import com.volcengine.ark.runtime.models.session.ManagedAgentsMessageContentBlock; import com.volcengine.ark.runtime.models.session.ManagedAgentsTextBlock; import com.volcengine.ark.runtime.models.session.ManagedAgentsUserMessageEventParams; import com.volcengine.ark.runtime.models.session.SendSessionEventsRequest; import com.volcengine.ark.runtime.models.session.SendSessionEventsResponse; import com.volcengine.ark.runtime.service.ArkService; import java.util.Arrays; import java.util.Collections; public class Main { public static void main(String[] args) throws Exception { ArkService service = ArkService.builder() .apiKey(System.getenv("ARK_API_KEY")) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); ManagedAgentsTextBlock text = ManagedAgentsTextBlock.builder() .text("帮我梳理 Q3 目标,并列出交付判据") .build(); ManagedAgentsUserMessageEventParams userMsg = ManagedAgentsUserMessageEventParams.builder() .content(Collections.singletonList(text)) .build(); SendSessionEventsResponse resp = service.sendSessionEvents( "", SendSessionEventsRequest.builder() .events(Arrays.asList(userMsg)) .build()); System.out.println(resp); service.shutdownExecutor(); } } ``` #### Response ``` { "data": [ { "id": "sevt-20260926143025-a1b2c", "type": "user.message", "content": [ {"type": "text", "text": "帮我梳理 Q3 目标,并列出交付判据"} ] } ] } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" sessionmodel "github.com/volcengine/ark-runtime-go/arkruntime/model/session" ) func main() { ctx := context.Background() client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) textBlock := sessionmodel.ManagedAgentsMessageContentBlock{ OneOf: sessionmodel.NewManagedAgentsTextBlockManagedAgentsMessageContentBlockSum( sessionmodel.ManagedAgentsTextBlock{Text: "帮我梳理 Q3 目标,并列出交付判据"}, ), } userMsg := sessionmodel.ManagedAgentsEventParams{ OneOf: sessionmodel.NewManagedAgentsUserMessageEventParamsManagedAgentsEventParamsSum( sessionmodel.ManagedAgentsUserMessageEventParams{ Content: []sessionmodel.ManagedAgentsMessageContentBlock{textBlock}, }, ), } resp, err := client.SendSessionEvents(ctx, "", &sessionmodel.SendSessionEventsRequest{ Events: []sessionmodel.ManagedAgentsEventParams{userMsg}, }) if err != nil { panic(err) } fmt.Println(resp) } ``` #### Response ``` { "data": [ { "id": "sevt-20260926143025-a1b2c", "type": "user.message", "content": [ {"type": "text", "text": "帮我梳理 Q3 目标,并列出交付判据"} ] } ] } ``` --- # 查询会话事件列表 Source: https://ark.volcengine.com/region:cn-beijing/docs/list-events-api `GET https://ark.cn-beijing.volces.com/api/v3/sessions/{session_id}/events` 分页查询会话主线程中已经产生的事件,支持按事件处理时间和事件类型筛选。实时接收事件请使用 [流式获取会话事件](/docs/stream-events-api),查询子线程事件请使用 [获取线程事件列表](/docs/list-thread-events-api)。返回字段随事件类型变化,详情请参见 [会话事件结构参考](/docs/sessions-events-reference-v2)。 > **说明** > > - 默认按事件产生时间正序返回(从旧到新)。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **session_id** `string` `必选` | 会话 ID 填写要查询事件的会话 ID,形如 `sesn-...` ### Query 参数 > 在 URL Query String 中传入。 **created_at[gt]** `string` | 起始时间(不含) 事件处理时间的起始边界(不含),采用 RFC 3339 格式。同时传入多个时间边界时,仅返回满足全部边界条件的事件 **created_at[gte]** `string` | 起始时间(含) 事件处理时间的起始边界(含),采用 RFC 3339 格式。同时传入多个时间边界时,仅返回满足全部边界条件的事件 **created_at[lt]** `string` | 结束时间(不含) 事件处理时间的结束边界(不含),采用 RFC 3339 格式。同时传入多个时间边界时,仅返回满足全部边界条件的事件 **created_at[lte]** `string` | 结束时间(含) 事件处理时间的结束边界(含),采用 RFC 3339 格式。同时传入多个时间边界时,仅返回满足全部边界条件的事件 **limit** `integer` `默认值 50` | 每页事件数 每页返回的事件数量。 > **说明** > > 当 `limit` 大于 200 时,服务端会按 200 处理,不会返回参数错误。 **取值范围**:`[1, 200]` **order** `string` `默认值 asc` | 排序方向 排序方向,`asc` 按事件产生时间正序(从旧到新),`desc` 倒序。 **page** `string` | 下一页标识 下一页标识。请将上一页返回的 `next_page` 原样传入;不传则从第一页开始 **types** `string[]` | 事件类型筛选 按事件类型筛选,可重复传入,例如 `types=user.message&types=agent.message`。支持的取值请参见 [会话事件结构参考](/docs/sessions-events-reference-v2) ## 响应参数 **data** `object[]` | 事件列表 本接口返回会话主线程中的历史事件,包括用户输入、智能体输出、会话状态,以及模型调用与结果评估事件。 每个事件对象包含 `id`、`type`、`processed_at` 和随 `type` 变化的业务字段。 只有对应事件结构明确包含时,才会返回 `session_thread_id`;主线程中的常规消息通常不含该字段。子智能体线程内部的消息和工具调用,需通过对应线程的事件列表接口查询。 完整事件类型和字段结构见 [会话事件结构参考](/docs/sessions-events-reference-v2)。 **id** `string` | 事件 ID `data.id` 事件唯一标识符,形如 `sevt-...` **processed_at** `string` | 处理时间 `data.processed_at` 事件处理时间,采用 RFC 3339 格式 **type** `string` | 事件类型 `data.type` 事件类型(如 `user.message`、`agent.message`、`session.status_idle` 等) **next_page** `string` | 下一页标识 下一页标识,请原样传入下一次请求的 `page` 参数;无更多数据时不返回该字段 ## 代码示例 ## 获取会话事件列表 ### cURL #### Request ```Bash curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/sessions//events?limit=50&order=asc&types=user.message&types=agent.message" \ -H "Authorization: Bearer $ARK_API_KEY" ``` #### Response ``` { "data": [ { "id": "sevt-20260926143025-a1b2c", "type": "user.message", "processed_at": "2026-09-26T14:30:25.123Z", "session_id": "", "content": [{"type": "text", "text": "帮我梳理 Q3 目标"}] }, { "id": "sevt-20260926143027-c3d4e", "type": "agent.message", "processed_at": "2026-09-26T14:30:27.045Z", "content": [ {"type": "text", "text": "好的,我先按 OKR 分层梳理,随后逐条给出交付判据。"} ] } ] } ``` ### Python #### Request ```python import json import os import urllib.parse import urllib.request query = urllib.parse.urlencode( [ ("limit", 50), ("order", "asc"), ("types", "user.message"), ("types", "agent.message"), ] ) req = urllib.request.Request( "https://ark.cn-beijing.volces.com/api/v3/sessions//events?" + query, headers={"Authorization": f"Bearer {os.environ['ARK_API_KEY']}"}, ) with urllib.request.urlopen(req) as resp: print(resp.read().decode()) ``` #### Response ``` { "data": [ { "id": "sevt-20260926143025-a1b2c", "type": "user.message", "processed_at": "2026-09-26T14:30:25.123Z", "session_id": "", "content": [{"type": "text", "text": "帮我梳理 Q3 目标"}] }, { "id": "sevt-20260926143027-c3d4e", "type": "agent.message", "processed_at": "2026-09-26T14:30:27.045Z", "content": [ {"type": "text", "text": "好的,我先按 OKR 分层梳理,随后逐条给出交付判据。"} ] } ] } ``` ### Java #### Request ```java // pom.xml 依赖: // // com.volcengine // ark-runtime // 0.9.0 // import com.volcengine.ark.runtime.models.session.ListSessionEventsResponse; import com.volcengine.ark.runtime.service.ArkService; import java.util.Arrays; public class Main { public static void main(String[] args) throws Exception { ArkService service = ArkService.builder() .apiKey(System.getenv("ARK_API_KEY")) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); ListSessionEventsResponse page = service.listSessionEvents( "", null, null, null, null, 50, "asc", null, Arrays.asList("user.message", "agent.message")); System.out.println(page); service.shutdownExecutor(); } } ``` #### Response ``` { "data": [ { "id": "sevt-20260926143025-a1b2c", "type": "user.message", "processed_at": "2026-09-26T14:30:25.123Z", "session_id": "", "content": [{"type": "text", "text": "帮我梳理 Q3 目标"}] }, { "id": "sevt-20260926143027-c3d4e", "type": "agent.message", "processed_at": "2026-09-26T14:30:27.045Z", "content": [ {"type": "text", "text": "好的,我先按 OKR 分层梳理,随后逐条给出交付判据。"} ] } ] } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" sessionmodel "github.com/volcengine/ark-runtime-go/arkruntime/model/session" ) func main() { ctx := context.Background() client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) resp, err := client.ListSessionEvents(ctx, "", &sessionmodel.SessionEventsListEventsParams{ Limit: sessionmodel.NewOptInt32(50), Order: sessionmodel.NewOptListSessionsOrder(sessionmodel.ListSessionsOrderAsc), Types: []string{"user.message", "agent.message"}, }) if err != nil { panic(err) } fmt.Println(resp) } ``` #### Response ``` { "data": [ { "id": "sevt-20260926143025-a1b2c", "type": "user.message", "processed_at": "2026-09-26T14:30:25.123Z", "session_id": "", "content": [{"type": "text", "text": "帮我梳理 Q3 目标"}] }, { "id": "sevt-20260926143027-c3d4e", "type": "agent.message", "processed_at": "2026-09-26T14:30:27.045Z", "content": [ {"type": "text", "text": "好的,我先按 OKR 分层梳理,随后逐条给出交付判据。"} ] } ] } ``` --- # 流式获取会话事件 Source: https://ark.volcengine.com/region:cn-beijing/docs/stream-events-api `GET https://ark.cn-beijing.volces.com/api/v3/sessions/{session_id}/events/stream` 通过 HTTP 长连接的 SSE(Server-Sent Events)协议订阅会话主线程收到的实时事件。所有事件的结构定义详情请参见 [会话事件结构参考](/docs/sessions-events-reference-v2)。 > **说明** > > - 子智能体线程内部的消息和工具调用需通过对应的 [线程事件流](/docs/stream-thread-events-api) 接收。 > - 本接口不支持断线续传。连接中断后,可通过 [获取会话事件列表](/docs/list-events-api) 查询中断期间产生的事件,再重新建立流式连接。 > - 连接建立后先收到 `: ready`。服务端随后约每 15 秒发送一次 `: heartbeat`;服务实例退出前可能发送 `: server draining, reconnect`。这些以冒号开头的行均为 SSE 注释,客户端应忽略并将读取超时设置为至少两个心跳周期。 > - 服务端通过 `data:` 行发送可解析的事件 JSON,可以省略显式 `event:` 行。连接通过 EOF、`session.deleted` 或客户端主动断开结束;业务处理是否完成以会话状态事件为准。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **session_id** `string` `必选` | 会话 ID 填写要订阅事件的会话 ID,形如 `sesn-...` ### Query 参数 > 在 URL Query String 中传入。 **event_deltas** `array` | 预览事件类型 指定需要通过 `event_start` 和 `event_delta` 接收预览内容的事件类型。当前支持 `agent.message` 和 `agent.thinking`。 未提供该参数时不返回预览帧。预览帧可能不完整,请以随后返回的完整事件为准。 > **说明** > > 多值可重复传入(`?event_deltas=agent.message&event_deltas=agent.thinking`),也可以使用逗号分隔(`?event_deltas=agent.message,agent.thinking`)。 > **注意** > > 参数名必须写为 `event_deltas`,不要写成 `event_deltas[]`。服务端会忽略未知参数名和不支持的事件类型,并继续返回 HTTP 200;被忽略的值不会产生预览帧。 ## 响应参数 ### 流式响应(SSE) **data** `string` | 事件 JSON 数据 服务端通过 `data:` 行返回事件 JSON。SSE 响应中可能没有 `event:` 行;这种情况下,客户端仍可按默认的 `message` 事件读取 `data:` 内容。 根据事件种类解析 `type`: * 完整事件顶层的 `type` 表示业务事件类型。 * 预览帧顶层的 `type` 固定为 `event_start` 或 `event_delta`。其中,`event_start.event.type` 表示被预览的业务事件类型。 完整事件和每个预览帧均包含各自的 `id`、`type` 和 `processed_at`。预览帧还包含以下增量信息: * `event_start.event` 包含被预览事件的 `id` 和 `type`。 * `event_delta.delta` 包含增量 `type`、`content` 和 `index`。 预览帧顶层 `id` 是当前帧的 ID;`event_start.event.id` 和 `event_delta.event_id` 指向被预览的完整事件。 预览帧可能不完整,最终以同一被预览事件 ID 的完整事件为准。 `session_thread_id` 不是公共字段,仅在对应事件结构中明确列出时返回。完整结构请参见 [会话事件结构参考](/docs/sessions-events-reference-v2)。 ## 代码示例 ## 流式获取会话事件 ### cURL #### Request ```Bash curl -sS --fail-with-body -N "https://ark.cn-beijing.volces.com/api/v3/sessions//events/stream" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Accept: text/event-stream" ``` #### Response ``` : ready : heartbeat data: {"id":"sevt-20260926143025-a1b2c","type":"user.message","processed_at":"2026-09-26T14:30:25.123Z","session_id":"","content":[{"type":"text","text":"帮我梳理 Q3 目标"}]} data: {"id":"sevt-20260926143027-c3d4e","type":"agent.message","processed_at":"2026-09-26T14:30:27.045Z","session_thread_id":"","content":[{"type":"text","text":"好的,我先按 OKR 分层梳理。"}]} data: {"id":"sevt-20260926143029-e5f6g","type":"session.status_idle","processed_at":"2026-09-26T14:30:29.220Z","stop_reason":{"type":"end_turn"}} ``` ### Python #### Request ```python import os from arkruntime import Ark client = Ark( api_key=os.environ["ARK_API_KEY"], base_url="https://ark.cn-beijing.volces.com/api/v3", ) for event in client.sessions.events.stream(""): print(event) if event.type in {"session.status_idle", "session.status_terminated"}: break ``` #### Response ``` : ready : heartbeat data: {"id":"sevt-20260926143025-a1b2c","type":"user.message","processed_at":"2026-09-26T14:30:25.123Z","session_id":"","content":[{"type":"text","text":"帮我梳理 Q3 目标"}]} data: {"id":"sevt-20260926143027-c3d4e","type":"agent.message","processed_at":"2026-09-26T14:30:27.045Z","session_thread_id":"","content":[{"type":"text","text":"好的,我先按 OKR 分层梳理。"}]} data: {"id":"sevt-20260926143029-e5f6g","type":"session.status_idle","processed_at":"2026-09-26T14:30:29.220Z","stop_reason":{"type":"end_turn"}} ``` ### Java #### Request ```java // pom.xml 依赖: // // com.volcengine // ark-runtime // 0.9.0 // import com.volcengine.ark.runtime.service.ArkService; import okhttp3.ResponseBody; import okio.BufferedSource; import retrofit2.Response; public class Main { public static void main(String[] args) throws Exception { ArkService service = ArkService.builder() .apiKey(System.getenv("ARK_API_KEY")) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); Response response = service.streamSessionEvents("").execute(); if (!response.isSuccessful() || response.body() == null) { throw new IllegalStateException("stream failed: " + response.code()); } try (ResponseBody body = response.body()) { BufferedSource source = body.source(); String line; while ((line = source.readUtf8Line()) != null) { if (line.startsWith("data:")) { System.out.println(line.substring(5).trim()); } if (line.contains("session.status_idle") || line.contains("session.status_terminated")) { break; } } } service.shutdownExecutor(); } } ``` #### Response ``` : ready : heartbeat data: {"id":"sevt-20260926143025-a1b2c","type":"user.message","processed_at":"2026-09-26T14:30:25.123Z","session_id":"","content":[{"type":"text","text":"帮我梳理 Q3 目标"}]} data: {"id":"sevt-20260926143027-c3d4e","type":"agent.message","processed_at":"2026-09-26T14:30:27.045Z","session_thread_id":"","content":[{"type":"text","text":"好的,我先按 OKR 分层梳理。"}]} data: {"id":"sevt-20260926143029-e5f6g","type":"session.status_idle","processed_at":"2026-09-26T14:30:29.220Z","stop_reason":{"type":"end_turn"}} ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" ) func main() { ctx := context.Background() client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) stream, err := client.StreamSessionEvents(ctx, "") if err != nil { panic(err) } defer stream.Close() for stream.Next() { frame := stream.Event() fmt.Printf("%s: %s\n", frame.Type, frame.RawPayload) if frame.Type == "session.status_idle" || frame.Type == "session.status_terminated" { break } } if err := stream.Err(); err != nil { panic(err) } } ``` #### Response ``` : ready : heartbeat data: {"id":"sevt-20260926143025-a1b2c","type":"user.message","processed_at":"2026-09-26T14:30:25.123Z","session_id":"","content":[{"type":"text","text":"帮我梳理 Q3 目标"}]} data: {"id":"sevt-20260926143027-c3d4e","type":"agent.message","processed_at":"2026-09-26T14:30:27.045Z","session_thread_id":"","content":[{"type":"text","text":"好的,我先按 OKR 分层梳理。"}]} data: {"id":"sevt-20260926143029-e5f6g","type":"session.status_idle","processed_at":"2026-09-26T14:30:29.220Z","stop_reason":{"type":"end_turn"}} ``` --- # 会话事件结构参考 Source: https://ark.volcengine.com/region:cn-beijing/docs/sessions-events-reference-v2 托管智能体会话通过事件实现客户端与服务端之间的双向通信。客户端可以发送消息、控制指令和工具执行结果;服务端会推送 Agent 回复、Session 状态和模型调用信息。流式订阅还可以返回用于增量展示内容的瞬时预览帧。本参考文档说明各类事件和预览帧的结构、字段含义与触发时机。 > **说明** > > - 客户端事件通过 [发送会话事件](/docs/send-event-api) 接口提交;服务端事件可通过 [流式获取会话事件](/docs/stream-events-api) 实时消费,或通过 [获取会话事件列表](/docs/list-events-api) 查询历史。预览帧只在流式接口中出现。 > - 如需发送、实时接收或断线补查事件,请参见 [Session 事件流](/docs/session-event-stream)。 > - 客户端发送事件时,公共字段中的 `id`、`processed_at` 等由服务端自动生成,客户端仅需要填写事件类型(`type`)和对应业务字段即可。 > - `system.message` 必须与一条 `user.message` 放在同一个 `events` 数组中,并紧跟在该 `user.message` 后发送;单独发送 `system.message` 会被服务端拒绝。 > - 多态对象通过 `type` 字段区分具体结构。客户端应先读取 `type`,再按对应变体解析其余字段。 > - 事件 ID、结果评估 ID 和线程 ID 分别以 `sevt-`、`outc-` 和 `sthr-` 开头。 > - `user.message` 的 `content[]` 支持 `video` 内容块: > - `fps`:抽帧频率,取值范围为 0.2~5;省略时使用下游模型的默认策略。 > - `source.type`:视频来源类型,支持以下取值: > - `url`:使用公网可访问的视频 URL。可处理的视频大小以下游模型的输入限制为准。 > - `base64`:使用 Base64 编码的视频,媒体类型支持 `video/mp4`、`video/x-msvideo` 和 `video/quicktime`。 > - `file`:使用 Files API 上传的视频文件 ID。 > - `event_start` 和 `event_delta` 仅在流式接口通过 `event_deltas` 参数显式订阅后返回,不写入事件历史。每个预览帧都有独立的顶层 `id` 和 `processed_at`;使用 `event_start.event.id` 或 `event_delta.event_id` 关联最终完整事件。 > - 订阅主线程时也可能收到子线程的创建和状态变化通知;子线程内部消息仍需订阅或查询对应线程。流式响应可能为线程内事件补充 `session_thread_id`,事件历史接口可能省略该字段。下方事件结构仅列出事件自身定义的字段。 ## 客户端发送事件(请求) ### user.message > 用户向智能体发送消息时触发 **type** `string` | 事件类型 `user.message.type` 事件类型,固定为 `user.message` **id** `string` | 事件 ID `user.message.id` 事件唯一标识符。客户端无需填写;服务端生成形如 `sevt-...` 的 ID 后回填 **session_id** `string` | Session ID `user.message.session_id` 目标 Session ID。请求路径已指定 Session 时可以省略 **processed_at** `string` | 处理时间 `user.message.processed_at` 事件处理时间,由服务端生成并写入事件历史,采用 RFC 3339 格式 **content** `object[]` | 消息内容 `user.message.content` 消息内容块列表,支持文本、图片、文档和视频四种类型 **文本** `object` 文本内容 **type** `string` | 内容类型 `user.message.content.type` 内容类型,固定为 `text` **text** `string` `必选` | 文本内容 `user.message.content.text` **图片** `object` 图片内容 **type** `string` | 内容类型 `user.message.content.type` 内容类型,固定为 `image` **source** `object` `必选` | 图片源 `user.message.content.source` **Base64 图片** `object` Base64 编码图片 **type** `string` `必选` | 内容类型 `user.message.content.source.type` **media_type** `string` `必选` | MIME 类型 `user.message.content.source.media_type` **data** `string` `必选` | Base64 数据 `user.message.content.source.data` **URL 图片** `object` **type** `string` `必选` | 内容类型 `user.message.content.source.type` **url** `string` `必选` | 图片 URL `user.message.content.source.url` **文件图片** `object` 文件 ID 图片 **type** `string` `必选` | 内容类型 `user.message.content.source.type` **file_id** `string` `必选` | 文件 ID `user.message.content.source.file_id` **文档** `object` 文档内容 **type** `string` | 内容类型 `user.message.content.type` 内容类型,固定为 `document` **source** `object` `必选` | 文档源 `user.message.content.source` 文档源 **纯文本文档** `object` **type** `string` `必选` | 内容类型 `user.message.content.source.type` **media_type** `string` `必选` | MIME 类型 `user.message.content.source.media_type` **data** `string` `必选` | 文本内容 `user.message.content.source.data` **URL 文档** `object` **type** `string` `必选` | 内容类型 `user.message.content.source.type` **url** `string` `必选` | 文档 URL `user.message.content.source.url` **文件文档** `object` 文件 ID 文档 **type** `string` `必选` | 内容类型 `user.message.content.source.type` **file_id** `string` `必选` | 文件 ID `user.message.content.source.file_id` **title** `string` | 文档标题 `user.message.content.title` **context** `string` | 上下文说明 `user.message.content.context` **视频** `object` 视频内容 **type** `string` | 内容类型 `user.message.content.type` 内容类型,固定为 `video` **source** `object` `必选` | 视频源 `user.message.content.source` 视频源 **Base64 视频** `object` Base64 编码视频 **type** `string` `必选` | 内容类型 `user.message.content.source.type` **media_type** `string` `必选` | MIME 类型 `user.message.content.source.media_type` 取值:`video/mp4` / `video/x-msvideo` / `video/quicktime`。 **data** `string` `必选` | Base64 数据 `user.message.content.source.data` **fps** `number` | 抽帧频率 `user.message.content.source.fps` 抽帧频率,取值范围为 0.2 到 5;省略时使用下游模型的默认策略 **URL 视频** `object` **type** `string` `必选` | 内容类型 `user.message.content.source.type` **url** `string` `必选` | 视频 URL `user.message.content.source.url` 公网可访问的视频 URL,可处理的视频大小以下游模型的输入限制为准;对象存储需将 `Content-Type` 设置为对应视频 MIME 类型 **fps** `number` | 抽帧频率 `user.message.content.source.fps` 抽帧频率,取值范围为 0.2 到 5;省略时使用下游模型的默认策略 **文件视频** `object` 文件 ID 视频 **type** `string` `必选` | 内容类型 `user.message.content.source.type` **file_id** `string` `必选` | 文件 ID `user.message.content.source.file_id` **fps** `number` | 抽帧频率 `user.message.content.source.fps` 抽帧频率,取值范围为 0.2 到 5;省略时使用下游模型的默认策略 --- ### system.message > 客户端向会话注入系统提示词时触发,必须作为同一 `events` 数组中 `user.message` 后的下一个事件发送 **type** `string` | 事件类型 `system.message.type` 事件类型,固定为 `system.message` **id** `string` | 事件 ID `system.message.id` 事件唯一标识符。客户端无需填写;服务端生成形如 `sevt-...` 的 ID 后回填 **session_id** `string` | Session ID `system.message.session_id` 目标 Session ID。请求路径已指定 Session 时可以省略 **processed_at** `string` | 处理时间 `system.message.processed_at` 事件处理时间,由服务端生成并写入事件历史,采用 RFC 3339 格式 **content** `object[]` `必选` | 消息内容 `system.message.content` 系统提示词的文本内容,至少包含一个文本块 **文本** `object` 文本内容 **type** `string` | 内容类型 `system.message.content.type` 内容类型,固定为 `text` **text** `string` `必选` | 文本内容 `system.message.content.text` --- ### user.interrupt > 用户发送中断指令,终止正在运行的线程/会话时触发 **type** `string` | 事件类型 `user.interrupt.type` 事件类型,固定为 `user.interrupt` **id** `string` | 事件 ID `user.interrupt.id` 事件唯一标识符。客户端无需填写;服务端生成形如 `sevt-...` 的 ID 后回填 **session_id** `string` | Session ID `user.interrupt.session_id` 目标 Session ID。请求路径已指定 Session 时可以省略 **processed_at** `string` | 处理时间 `user.interrupt.processed_at` 事件处理时间,由服务端生成并写入事件历史,采用 RFC 3339 格式 **session_thread_id** `string` | 线程 ID `user.interrupt.session_thread_id` 要中断的线程 ID,不填则中断会话内所有活跃线程 --- ### user.tool_confirmation > 用户对需要确认的工具调用进行批准/拒绝操作时触发 **type** `string` | 事件类型 `user.tool_confirmation.type` 事件类型,固定为 `user.tool_confirmation` **id** `string` | 事件 ID `user.tool_confirmation.id` 事件唯一标识符。客户端无需填写;服务端生成形如 `sevt-...` 的 ID 后回填 **session_id** `string` | Session ID `user.tool_confirmation.session_id` 目标 Session ID。请求路径已指定 Session 时可以省略 **processed_at** `string` | 处理时间 `user.tool_confirmation.processed_at` 事件处理时间,由服务端生成并写入事件历史,采用 RFC 3339 格式 **result** `string` `必选` | 确认结果 `user.tool_confirmation.result` 确认结果。`allow` 表示批准,`deny` 表示拒绝。 **tool_use_id** `string` `必选` | 工具调用 ID `user.tool_confirmation.tool_use_id` 对应的工具调用事件 ID(`agent.tool_use` 或 `agent.mcp_tool_use`)。当 `stop_reason.type` 为 `requires_action` 时,从 `stop_reason.event_ids` 获取该 ID 并原样填入 **deny_message** `string` | 拒绝理由 `user.tool_confirmation.deny_message` 拒绝理由,仅当 `result` 为 `deny` 时有效。 **session_thread_id** `string` | 线程 ID `user.tool_confirmation.session_thread_id` 所属线程 ID --- ### user.tool_result > 自托管 Environment 中的 Worker 完成内置工具调用后,客户端回传执行结果时触发 **type** `string` | 事件类型 `user.tool_result.type` 事件类型,固定为 `user.tool_result` **id** `string` | 事件 ID `user.tool_result.id` 事件唯一标识符。客户端无需填写;服务端生成形如 `sevt-...` 的 ID 后回填 **session_id** `string` | Session ID `user.tool_result.session_id` 目标 Session ID。请求路径已指定 Session 时可以省略 **processed_at** `string` | 处理时间 `user.tool_result.processed_at` 事件处理时间,由服务端生成并写入事件历史,采用 RFC 3339 格式 **tool_use_id** `string` `必选` | 工具调用 ID `user.tool_result.tool_use_id` 对应的 `agent.tool_use` 事件 ID。当 `stop_reason.type` 为 `requires_action` 时,从 `stop_reason.event_ids` 获取该 ID 并原样填入 **content** `object[]` | 结果内容 `user.tool_result.content` 工具执行结果的多模态内容块列表,支持文本、图片、文档、视频和搜索结果 **文本** `object` 文本内容 **type** `string` | 内容类型 `user.tool_result.content.type` 内容类型,固定为 `text` **text** `string` `必选` | 文本内容 `user.tool_result.content.text` **图片** `object` 图片内容 **type** `string` | 内容类型 `user.tool_result.content.type` 内容类型,固定为 `image` **source** `object` `必选` | 图片源 `user.tool_result.content.source` **Base64 图片** `object` Base64 编码图片 **type** `string` `必选` | 内容类型 `user.tool_result.content.source.type` **media_type** `string` `必选` | MIME 类型 `user.tool_result.content.source.media_type` **data** `string` `必选` | Base64 数据 `user.tool_result.content.source.data` **URL 图片** `object` **type** `string` `必选` | 内容类型 `user.tool_result.content.source.type` **url** `string` `必选` | 图片 URL `user.tool_result.content.source.url` **文件图片** `object` 文件 ID 图片 **type** `string` `必选` | 内容类型 `user.tool_result.content.source.type` **file_id** `string` `必选` | 文件 ID `user.tool_result.content.source.file_id` **文档** `object` 文档内容 **type** `string` | 内容类型 `user.tool_result.content.type` 内容类型,固定为 `document` **source** `object` `必选` | 文档源 `user.tool_result.content.source` 文档源 **纯文本文档** `object` **type** `string` `必选` | 内容类型 `user.tool_result.content.source.type` **media_type** `string` `必选` | MIME 类型 `user.tool_result.content.source.media_type` **data** `string` `必选` | 文本内容 `user.tool_result.content.source.data` **URL 文档** `object` **type** `string` `必选` | 内容类型 `user.tool_result.content.source.type` **url** `string` `必选` | 文档 URL `user.tool_result.content.source.url` **文件文档** `object` 文件 ID 文档 **type** `string` `必选` | 内容类型 `user.tool_result.content.source.type` **file_id** `string` `必选` | 文件 ID `user.tool_result.content.source.file_id` **title** `string` | 文档标题 `user.tool_result.content.title` **context** `string` | 上下文说明 `user.tool_result.content.context` **视频** `object` 视频内容 **type** `string` | 内容类型 `user.tool_result.content.type` 内容类型,固定为 `video` **source** `object` `必选` | 视频源 `user.tool_result.content.source` 视频源 **Base64 视频** `object` Base64 编码视频 **type** `string` `必选` | 内容类型 `user.tool_result.content.source.type` **media_type** `string` `必选` | MIME 类型 `user.tool_result.content.source.media_type` 取值:`video/mp4` / `video/x-msvideo` / `video/quicktime`。 **data** `string` `必选` | Base64 数据 `user.tool_result.content.source.data` **fps** `number` | 抽帧频率 `user.tool_result.content.source.fps` 抽帧频率,取值范围为 0.2 到 5;省略时使用下游模型的默认策略 **URL 视频** `object` **type** `string` `必选` | 内容类型 `user.tool_result.content.source.type` **url** `string` `必选` | 视频 URL `user.tool_result.content.source.url` 公网可访问的视频 URL,可处理的视频大小以下游模型的输入限制为准;对象存储需将 `Content-Type` 设置为对应视频 MIME 类型 **fps** `number` | 抽帧频率 `user.tool_result.content.source.fps` 抽帧频率,取值范围为 0.2 到 5;省略时使用下游模型的默认策略 **文件视频** `object` 文件 ID 视频 **type** `string` `必选` | 内容类型 `user.tool_result.content.source.type` **file_id** `string` `必选` | 文件 ID `user.tool_result.content.source.file_id` **fps** `number` | 抽帧频率 `user.tool_result.content.source.fps` 抽帧频率,取值范围为 0.2 到 5;省略时使用下游模型的默认策略 **搜索结果** `object` **type** `string` | 内容类型 `user.tool_result.content.type` 内容类型,固定为 `search_result` **source** `string` `必选` | 结果 URL `user.tool_result.content.source` **title** `string` `必选` | 结果标题 `user.tool_result.content.title` **content** `object[]` `必选` | 结果内容 `user.tool_result.content.content` 搜索结果内容片段 **type** `string` `必选` | 内容类型 `user.tool_result.content.content.type` 内容类型,固定为 `text` **text** `string` `必选` | 文本内容 `user.tool_result.content.content.text` 搜索结果文本片段 **citations** `object` `必选` | 引用配置 `user.tool_result.content.citations` 搜索结果引用配置 **enabled** `boolean` `必选` | 是否启用引用 `user.tool_result.content.citations.enabled` 是否启用引用标注 **is_error** `boolean` | 是否错误 `user.tool_result.is_error` 工具是否执行失败。设为 `true` 时,Agent 会收到失败结果及 `content` 中的错误信息,并继续后续处理 **session_thread_id** `string` | 线程 ID `user.tool_result.session_thread_id` 触发工具调用的线程 ID。子线程触发工具调用时,将响应事件返回的 `session_thread_id` 原样填入 --- ### user.custom_tool_result > 客户端本地执行完自定义工具(`custom` 类型工具,如生图、生视频等场景)后回传结果时触发。通过 `custom_tool_use_id` 关联对应的 `agent.custom_tool_use` 事件。 **type** `string` | 事件类型 `user.custom_tool_result.type` 事件类型,固定为 `user.custom_tool_result` **id** `string` | 事件 ID `user.custom_tool_result.id` 事件唯一标识符。客户端无需填写;服务端生成形如 `sevt-...` 的 ID 后回填 **session_id** `string` | Session ID `user.custom_tool_result.session_id` 目标 Session ID。请求路径已指定 Session 时可以省略 **processed_at** `string` | 处理时间 `user.custom_tool_result.processed_at` 事件处理时间,由服务端生成并写入事件历史,采用 RFC 3339 格式 **custom_tool_use_id** `string` `必选` | 自定义工具调用 ID `user.custom_tool_result.custom_tool_use_id` 对应的自定义工具调用事件 ID(来自 `agent.custom_tool_use`)。当 `stop_reason.type` 为 `requires_action` 时,从 `stop_reason.event_ids` 获取该 ID 并原样填入 **content** `object[]` | 结果内容 `user.custom_tool_result.content` 工具执行结果的多模态内容块列表,字段结构以 `ToolResultContentBlock` 为准 **文本** `object` 文本内容 **type** `string` | 内容类型 `user.custom_tool_result.content.type` 内容类型,固定为 `text` **text** `string` `必选` | 文本内容 `user.custom_tool_result.content.text` **图片** `object` 图片内容 **type** `string` | 内容类型 `user.custom_tool_result.content.type` 内容类型,固定为 `image` **source** `object` `必选` | 图片源 `user.custom_tool_result.content.source` **Base64 图片** `object` Base64 编码图片 **type** `string` `必选` | 内容类型 `user.custom_tool_result.content.source.type` **media_type** `string` `必选` | MIME 类型 `user.custom_tool_result.content.source.media_type` **data** `string` `必选` | Base64 数据 `user.custom_tool_result.content.source.data` **URL 图片** `object` **type** `string` `必选` | 内容类型 `user.custom_tool_result.content.source.type` **url** `string` `必选` | 图片 URL `user.custom_tool_result.content.source.url` **文件图片** `object` 文件 ID 图片 **type** `string` `必选` | 内容类型 `user.custom_tool_result.content.source.type` **file_id** `string` `必选` | 文件 ID `user.custom_tool_result.content.source.file_id` **文档** `object` 文档内容 **type** `string` | 内容类型 `user.custom_tool_result.content.type` 内容类型,固定为 `document` **source** `object` `必选` | 文档源 `user.custom_tool_result.content.source` 文档源 **纯文本文档** `object` **type** `string` `必选` | 内容类型 `user.custom_tool_result.content.source.type` **media_type** `string` `必选` | MIME 类型 `user.custom_tool_result.content.source.media_type` **data** `string` `必选` | 文本内容 `user.custom_tool_result.content.source.data` **URL 文档** `object` **type** `string` `必选` | 内容类型 `user.custom_tool_result.content.source.type` **url** `string` `必选` | 文档 URL `user.custom_tool_result.content.source.url` **文件文档** `object` 文件 ID 文档 **type** `string` `必选` | 内容类型 `user.custom_tool_result.content.source.type` **file_id** `string` `必选` | 文件 ID `user.custom_tool_result.content.source.file_id` **title** `string` | 文档标题 `user.custom_tool_result.content.title` **context** `string` | 上下文说明 `user.custom_tool_result.content.context` **视频** `object` 视频内容 **type** `string` | 内容类型 `user.custom_tool_result.content.type` 内容类型,固定为 `video` **source** `object` `必选` | 视频源 `user.custom_tool_result.content.source` 视频源 **Base64 视频** `object` Base64 编码视频 **type** `string` `必选` | 内容类型 `user.custom_tool_result.content.source.type` **media_type** `string` `必选` | MIME 类型 `user.custom_tool_result.content.source.media_type` 取值:`video/mp4` / `video/x-msvideo` / `video/quicktime`。 **data** `string` `必选` | Base64 数据 `user.custom_tool_result.content.source.data` **fps** `number` | 抽帧频率 `user.custom_tool_result.content.source.fps` 抽帧频率,取值范围为 0.2 到 5;省略时使用下游模型的默认策略 **URL 视频** `object` **type** `string` `必选` | 内容类型 `user.custom_tool_result.content.source.type` **url** `string` `必选` | 视频 URL `user.custom_tool_result.content.source.url` 公网可访问的视频 URL,可处理的视频大小以下游模型的输入限制为准;对象存储需将 `Content-Type` 设置为对应视频 MIME 类型 **fps** `number` | 抽帧频率 `user.custom_tool_result.content.source.fps` 抽帧频率,取值范围为 0.2 到 5;省略时使用下游模型的默认策略 **文件视频** `object` 文件 ID 视频 **type** `string` `必选` | 内容类型 `user.custom_tool_result.content.source.type` **file_id** `string` `必选` | 文件 ID `user.custom_tool_result.content.source.file_id` **fps** `number` | 抽帧频率 `user.custom_tool_result.content.source.fps` 抽帧频率,取值范围为 0.2 到 5;省略时使用下游模型的默认策略 **搜索结果** `object` **type** `string` | 内容类型 `user.custom_tool_result.content.type` 内容类型,固定为 `search_result` **source** `string` `必选` | 结果 URL `user.custom_tool_result.content.source` **title** `string` `必选` | 结果标题 `user.custom_tool_result.content.title` **content** `object[]` `必选` | 结果内容 `user.custom_tool_result.content.content` 搜索结果内容片段 **type** `string` `必选` | 内容类型 `user.custom_tool_result.content.content.type` 内容类型,固定为 `text` **text** `string` `必选` | 文本内容 `user.custom_tool_result.content.content.text` 搜索结果文本片段 **citations** `object` `必选` | 引用配置 `user.custom_tool_result.content.citations` 搜索结果引用配置 **enabled** `boolean` `必选` | 是否启用引用 `user.custom_tool_result.content.citations.enabled` 是否启用引用标注 **is_error** `boolean` | 是否错误 `user.custom_tool_result.is_error` 工具是否执行失败 **session_thread_id** `string` | 线程 ID `user.custom_tool_result.session_thread_id` 触发工具调用的线程 ID。子线程触发工具调用时,将响应事件返回的 `session_thread_id` 原样填入 --- ## 服务端推送事件(响应) ### agent.message > 智能体生成回复消息时触发,包括最终回复以及工具调用前后的中间文本(随模型行为不同而不同) **type** `string` | 事件类型 `agent.message.type` 事件类型,固定为 `agent.message` **id** `string` | 事件 ID `agent.message.id` 事件唯一标识符,形如 `sevt-...`,由服务端生成 **processed_at** `string` | 处理时间 `agent.message.processed_at` 事件处理时间,采用 RFC 3339 格式 **content** `object[]` | 回复内容 `agent.message.content` 回复内容,仅包含文本块 文本内容块 **type** `string` | 内容类型 `agent.message.content.type` 内容类型,固定为 `text` **text** `string` | 文本内容 `agent.message.content.text` 文本内容 --- ### agent.thinking > 智能体生成思考内容时触发 **type** `string` | 事件类型 `agent.thinking.type` 事件类型,固定为 `agent.thinking` **id** `string` | 事件 ID `agent.thinking.id` 事件唯一标识符,形如 `sevt-...`,由服务端生成 **processed_at** `string` | 处理时间 `agent.thinking.processed_at` 事件处理时间,采用 RFC 3339 格式 **content** `object[]` | 思考内容 `agent.thinking.content` 思考内容,仅包含文本块 文本内容块 **type** `string` | 内容类型 `agent.thinking.content.type` 内容类型,固定为 `text` **text** `string` | 文本内容 `agent.thinking.content.text` 文本内容 --- ### agent.tool_use > 智能体决定调用内置工具时触发 **type** `string` | 事件类型 `agent.tool_use.type` 事件类型,固定为 `agent.tool_use` **id** `string` | 事件 ID `agent.tool_use.id` 事件唯一标识符,形如 `sevt-...`,由服务端生成 **processed_at** `string` | 处理时间 `agent.tool_use.processed_at` 事件处理时间,采用 RFC 3339 格式 **name** `string` | 工具名称 `agent.tool_use.name` 工具名称 **input** `object` | 输入参数 `agent.tool_use.input` 工具输入参数,JSON 对象 **evaluated_permission** `string` | 权限结果 `agent.tool_use.evaluated_permission` 权限策略评估结果。`allow` 表示直接调用;`ask` 表示客户端需发送 `user.tool_confirmation`,确认前会话等待用户操作;`deny` 表示拒绝调用 **session_thread_id** `string` | 线程 ID `agent.tool_use.session_thread_id` 工具调用所属线程 ID。子线程触发工具调用时可能返回该字段;回传 `user.tool_confirmation` 或 `user.tool_result` 时应原样带回 --- ### agent.tool_result > 内置工具执行完成并返回结果时触发 **type** `string` | 事件类型 `agent.tool_result.type` 事件类型,固定为 `agent.tool_result` **id** `string` | 事件 ID `agent.tool_result.id` 事件唯一标识符,形如 `sevt-...`,由服务端生成 **processed_at** `string` | 处理时间 `agent.tool_result.processed_at` 事件处理时间,采用 RFC 3339 格式 **tool_use_id** `string` | 工具调用 ID `agent.tool_result.tool_use_id` 对应的工具调用事件 ID **content** `object[]` | 结果内容 `agent.tool_result.content` 工具执行结果内容 **文本** `object` 文本内容 **type** `string` | 内容类型 `agent.tool_result.content.type` 内容类型,固定为 `text` **text** `string` | 文本内容 `agent.tool_result.content.text` **图片** `object` 图片内容 **type** `string` | 内容类型 `agent.tool_result.content.type` 内容类型,固定为 `image` **source** `object` | 图片源 `agent.tool_result.content.source` **Base64 图片** `object` Base64 编码图片 **type** `string` | 内容类型 `agent.tool_result.content.source.type` **media_type** `string` | MIME 类型 `agent.tool_result.content.source.media_type` **data** `string` | Base64 数据 `agent.tool_result.content.source.data` **URL 图片** `object` **type** `string` | 内容类型 `agent.tool_result.content.source.type` **url** `string` | 图片 URL `agent.tool_result.content.source.url` **文件图片** `object` 文件 ID 图片 **type** `string` | 内容类型 `agent.tool_result.content.source.type` **file_id** `string` | 文件 ID `agent.tool_result.content.source.file_id` **文档** `object` 文档内容 **type** `string` | 内容类型 `agent.tool_result.content.type` 内容类型,固定为 `document` **source** `object` | 文档源 `agent.tool_result.content.source` 文档源 **纯文本文档** `object` **type** `string` | 内容类型 `agent.tool_result.content.source.type` **media_type** `string` | MIME 类型 `agent.tool_result.content.source.media_type` **data** `string` | 文本内容 `agent.tool_result.content.source.data` **URL 文档** `object` **type** `string` | 内容类型 `agent.tool_result.content.source.type` **url** `string` | 文档 URL `agent.tool_result.content.source.url` **文件文档** `object` 文件 ID 文档 **type** `string` | 内容类型 `agent.tool_result.content.source.type` **file_id** `string` | 文件 ID `agent.tool_result.content.source.file_id` **title** `string` | 文档标题 `agent.tool_result.content.title` **context** `string` | 上下文说明 `agent.tool_result.content.context` **视频** `object` 视频内容 **type** `string` | 内容类型 `agent.tool_result.content.type` 内容类型,固定为 `video` **source** `object` | 视频源 `agent.tool_result.content.source` 视频源 **Base64 视频** `object` Base64 编码视频 **type** `string` | 内容类型 `agent.tool_result.content.source.type` **media_type** `string` | MIME 类型 `agent.tool_result.content.source.media_type` 取值:`video/mp4` / `video/x-msvideo` / `video/quicktime`。 **data** `string` | Base64 数据 `agent.tool_result.content.source.data` **fps** `number` | 抽帧频率 `agent.tool_result.content.source.fps` 抽帧频率,取值范围为 0.2 到 5;省略时使用下游模型的默认策略 **URL 视频** `object` **type** `string` | 内容类型 `agent.tool_result.content.source.type` **url** `string` | 视频 URL `agent.tool_result.content.source.url` 公网可访问的视频 URL,可处理的视频大小以下游模型的输入限制为准;对象存储需将 `Content-Type` 设置为对应视频 MIME 类型 **fps** `number` | 抽帧频率 `agent.tool_result.content.source.fps` 抽帧频率,取值范围为 0.2 到 5;省略时使用下游模型的默认策略 **文件视频** `object` 文件 ID 视频 **type** `string` | 内容类型 `agent.tool_result.content.source.type` **file_id** `string` | 文件 ID `agent.tool_result.content.source.file_id` **fps** `number` | 抽帧频率 `agent.tool_result.content.source.fps` 抽帧频率,取值范围为 0.2 到 5;省略时使用下游模型的默认策略 **搜索结果** `object` **type** `string` | 内容类型 `agent.tool_result.content.type` 内容类型,固定为 `search_result` **source** `string` | 结果 URL `agent.tool_result.content.source` **title** `string` | 结果标题 `agent.tool_result.content.title` **content** `object[]` | 结果内容 `agent.tool_result.content.content` 搜索结果内容片段 **type** `string` | 内容类型 `agent.tool_result.content.content.type` 内容类型,固定为 `text` **text** `string` | 文本内容 `agent.tool_result.content.content.text` 搜索结果文本片段 **citations** `object` | 引用配置 `agent.tool_result.content.citations` 搜索结果引用配置 **enabled** `boolean` | 是否启用引用 `agent.tool_result.content.citations.enabled` 是否启用引用标注 **is_error** `boolean` | 是否错误 `agent.tool_result.is_error` 执行是否出错 --- ### agent.mcp_tool_use > 智能体决定调用 MCP 服务提供的工具时触发 **type** `string` | 事件类型 `agent.mcp_tool_use.type` 事件类型,固定为 `agent.mcp_tool_use` **id** `string` | 事件 ID `agent.mcp_tool_use.id` 事件唯一标识符,形如 `sevt-...`,由服务端生成 **processed_at** `string` | 处理时间 `agent.mcp_tool_use.processed_at` 事件处理时间,采用 RFC 3339 格式 **mcp_server_name** `string` | MCP 服务名 `agent.mcp_tool_use.mcp_server_name` MCP 服务名称 **name** `string` | 工具名称 `agent.mcp_tool_use.name` 工具名称 **input** `object` | 输入参数 `agent.mcp_tool_use.input` 工具输入参数,JSON 对象 **evaluated_permission** `string` | 权限结果 `agent.mcp_tool_use.evaluated_permission` 权限策略评估结果。`allow` 表示直接调用;`ask` 表示客户端需发送 `user.tool_confirmation`,确认前会话等待用户操作;`deny` 表示拒绝调用 **session_thread_id** `string` | 线程 ID `agent.mcp_tool_use.session_thread_id` 工具调用所属线程 ID。子线程触发工具调用时可能返回该字段;回传 `user.tool_confirmation` 时应原样带回 --- ### agent.mcp_tool_result > MCP 工具执行完成并返回结果时触发 **type** `string` | 事件类型 `agent.mcp_tool_result.type` 事件类型,固定为 `agent.mcp_tool_result` **id** `string` | 事件 ID `agent.mcp_tool_result.id` 事件唯一标识符,形如 `sevt-...`,由服务端生成 **processed_at** `string` | 处理时间 `agent.mcp_tool_result.processed_at` 事件处理时间,采用 RFC 3339 格式 **mcp_tool_use_id** `string` | MCP 工具调用 ID `agent.mcp_tool_result.mcp_tool_use_id` 对应的 MCP 工具调用事件 ID **content** `object[]` | 结果内容 `agent.mcp_tool_result.content` 工具执行结果内容 **文本** `object` 文本内容 **type** `string` | 内容类型 `agent.mcp_tool_result.content.type` 内容类型,固定为 `text` **text** `string` | 文本内容 `agent.mcp_tool_result.content.text` **图片** `object` 图片内容 **type** `string` | 内容类型 `agent.mcp_tool_result.content.type` 内容类型,固定为 `image` **source** `object` | 图片源 `agent.mcp_tool_result.content.source` **Base64 图片** `object` Base64 编码图片 **type** `string` | 内容类型 `agent.mcp_tool_result.content.source.type` **media_type** `string` | MIME 类型 `agent.mcp_tool_result.content.source.media_type` **data** `string` | Base64 数据 `agent.mcp_tool_result.content.source.data` **URL 图片** `object` **type** `string` | 内容类型 `agent.mcp_tool_result.content.source.type` **url** `string` | 图片 URL `agent.mcp_tool_result.content.source.url` **文件图片** `object` 文件 ID 图片 **type** `string` | 内容类型 `agent.mcp_tool_result.content.source.type` **file_id** `string` | 文件 ID `agent.mcp_tool_result.content.source.file_id` **文档** `object` 文档内容 **type** `string` | 内容类型 `agent.mcp_tool_result.content.type` 内容类型,固定为 `document` **source** `object` | 文档源 `agent.mcp_tool_result.content.source` 文档源 **纯文本文档** `object` **type** `string` | 内容类型 `agent.mcp_tool_result.content.source.type` **media_type** `string` | MIME 类型 `agent.mcp_tool_result.content.source.media_type` **data** `string` | 文本内容 `agent.mcp_tool_result.content.source.data` **URL 文档** `object` **type** `string` | 内容类型 `agent.mcp_tool_result.content.source.type` **url** `string` | 文档 URL `agent.mcp_tool_result.content.source.url` **文件文档** `object` 文件 ID 文档 **type** `string` | 内容类型 `agent.mcp_tool_result.content.source.type` **file_id** `string` | 文件 ID `agent.mcp_tool_result.content.source.file_id` **title** `string` | 文档标题 `agent.mcp_tool_result.content.title` **context** `string` | 上下文说明 `agent.mcp_tool_result.content.context` **视频** `object` 视频内容 **type** `string` | 内容类型 `agent.mcp_tool_result.content.type` 内容类型,固定为 `video` **source** `object` | 视频源 `agent.mcp_tool_result.content.source` 视频源 **Base64 视频** `object` Base64 编码视频 **type** `string` | 内容类型 `agent.mcp_tool_result.content.source.type` **media_type** `string` | MIME 类型 `agent.mcp_tool_result.content.source.media_type` 取值:`video/mp4` / `video/x-msvideo` / `video/quicktime`。 **data** `string` | Base64 数据 `agent.mcp_tool_result.content.source.data` **fps** `number` | 抽帧频率 `agent.mcp_tool_result.content.source.fps` 抽帧频率,取值范围为 0.2 到 5;省略时使用下游模型的默认策略 **URL 视频** `object` **type** `string` | 内容类型 `agent.mcp_tool_result.content.source.type` **url** `string` | 视频 URL `agent.mcp_tool_result.content.source.url` 公网可访问的视频 URL,可处理的视频大小以下游模型的输入限制为准;对象存储需将 `Content-Type` 设置为对应视频 MIME 类型 **fps** `number` | 抽帧频率 `agent.mcp_tool_result.content.source.fps` 抽帧频率,取值范围为 0.2 到 5;省略时使用下游模型的默认策略 **文件视频** `object` 文件 ID 视频 **type** `string` | 内容类型 `agent.mcp_tool_result.content.source.type` **file_id** `string` | 文件 ID `agent.mcp_tool_result.content.source.file_id` **fps** `number` | 抽帧频率 `agent.mcp_tool_result.content.source.fps` 抽帧频率,取值范围为 0.2 到 5;省略时使用下游模型的默认策略 **搜索结果** `object` **type** `string` | 内容类型 `agent.mcp_tool_result.content.type` 内容类型,固定为 `search_result` **source** `string` | 结果 URL `agent.mcp_tool_result.content.source` **title** `string` | 结果标题 `agent.mcp_tool_result.content.title` **content** `object[]` | 结果内容 `agent.mcp_tool_result.content.content` 搜索结果内容片段 **type** `string` | 内容类型 `agent.mcp_tool_result.content.content.type` 内容类型,固定为 `text` **text** `string` | 文本内容 `agent.mcp_tool_result.content.content.text` 搜索结果文本片段 **citations** `object` | 引用配置 `agent.mcp_tool_result.content.citations` 搜索结果引用配置 **enabled** `boolean` | 是否启用引用 `agent.mcp_tool_result.content.citations.enabled` 是否启用引用标注 **is_error** `boolean` | 是否错误 `agent.mcp_tool_result.is_error` 执行是否出错 --- ### agent.custom_tool_use > 智能体决定调用客户端提供的自定义工具(`custom` 类型工具,如生图、生视频等场景)时触发。客户端执行工具后,通过 `user.custom_tool_result` 回传结果;`custom_tool_use_id` 需与本事件 `id` 一一匹配。 **type** `string` | 事件类型 `agent.custom_tool_use.type` 事件类型,固定为 `agent.custom_tool_use` **id** `string` | 事件 ID `agent.custom_tool_use.id` 事件唯一标识符,形如 `sevt-...`,由服务端生成 **processed_at** `string` | 处理时间 `agent.custom_tool_use.processed_at` 事件处理时间,采用 RFC 3339 格式 **name** `string` | 工具名称 `agent.custom_tool_use.name` 自定义工具名称,对应 Agent 配置中 `custom` 类型工具项的 `name` **input** `object` | 输入参数 `agent.custom_tool_use.input` 工具输入参数,JSON 对象 **session_thread_id** `string` | 线程 ID `agent.custom_tool_use.session_thread_id` 工具调用所属线程 ID。子线程触发工具调用时可能返回该字段;回传 `user.custom_tool_result` 时应原样带回 --- ### agent.thread_message_received > 多智能体场景下,当前线程收到其他线程/智能体发来的消息时触发 **type** `string` | 事件类型 `agent.thread_message_received.type` 事件类型,固定为 `agent.thread_message_received` **id** `string` | 事件 ID `agent.thread_message_received.id` 事件唯一标识符,形如 `sevt-...`,由服务端生成 **processed_at** `string` | 处理时间 `agent.thread_message_received.processed_at` 事件处理时间,采用 RFC 3339 格式 **content** `object[]` | 消息内容 `agent.thread_message_received.content` 收到的消息内容 **文本** `object` 文本内容 **type** `string` | 内容类型 `agent.thread_message_received.content.type` 内容类型,固定为 `text` **text** `string` | 文本内容 `agent.thread_message_received.content.text` **图片** `object` 图片内容 **type** `string` | 内容类型 `agent.thread_message_received.content.type` 内容类型,固定为 `image` **source** `object` | 图片源 `agent.thread_message_received.content.source` **Base64 图片** `object` Base64 编码图片 **type** `string` | 内容类型 `agent.thread_message_received.content.source.type` **media_type** `string` | MIME 类型 `agent.thread_message_received.content.source.media_type` **data** `string` | Base64 数据 `agent.thread_message_received.content.source.data` **URL 图片** `object` **type** `string` | 内容类型 `agent.thread_message_received.content.source.type` **url** `string` | 图片 URL `agent.thread_message_received.content.source.url` **文件图片** `object` 文件 ID 图片 **type** `string` | 内容类型 `agent.thread_message_received.content.source.type` **file_id** `string` | 文件 ID `agent.thread_message_received.content.source.file_id` **文档** `object` 文档内容 **type** `string` | 内容类型 `agent.thread_message_received.content.type` 内容类型,固定为 `document` **source** `object` | 文档源 `agent.thread_message_received.content.source` 文档源 **纯文本文档** `object` **type** `string` | 内容类型 `agent.thread_message_received.content.source.type` **media_type** `string` | MIME 类型 `agent.thread_message_received.content.source.media_type` **data** `string` | 文本内容 `agent.thread_message_received.content.source.data` **URL 文档** `object` **type** `string` | 内容类型 `agent.thread_message_received.content.source.type` **url** `string` | 文档 URL `agent.thread_message_received.content.source.url` **文件文档** `object` 文件 ID 文档 **type** `string` | 内容类型 `agent.thread_message_received.content.source.type` **file_id** `string` | 文件 ID `agent.thread_message_received.content.source.file_id` **title** `string` | 文档标题 `agent.thread_message_received.content.title` **context** `string` | 上下文说明 `agent.thread_message_received.content.context` **视频** `object` 视频内容 **type** `string` | 内容类型 `agent.thread_message_received.content.type` 内容类型,固定为 `video` **source** `object` | 视频源 `agent.thread_message_received.content.source` 视频源 **Base64 视频** `object` Base64 编码视频 **type** `string` | 内容类型 `agent.thread_message_received.content.source.type` **media_type** `string` | MIME 类型 `agent.thread_message_received.content.source.media_type` 取值:`video/mp4` / `video/x-msvideo` / `video/quicktime`。 **data** `string` | Base64 数据 `agent.thread_message_received.content.source.data` **fps** `number` | 抽帧频率 `agent.thread_message_received.content.source.fps` 抽帧频率,取值范围为 0.2 到 5;省略时使用下游模型的默认策略 **URL 视频** `object` **type** `string` | 内容类型 `agent.thread_message_received.content.source.type` **url** `string` | 视频 URL `agent.thread_message_received.content.source.url` 公网可访问的视频 URL,可处理的视频大小以下游模型的输入限制为准;对象存储需将 `Content-Type` 设置为对应视频 MIME 类型 **fps** `number` | 抽帧频率 `agent.thread_message_received.content.source.fps` 抽帧频率,取值范围为 0.2 到 5;省略时使用下游模型的默认策略 **文件视频** `object` 文件 ID 视频 **type** `string` | 内容类型 `agent.thread_message_received.content.source.type` **file_id** `string` | 文件 ID `agent.thread_message_received.content.source.file_id` **fps** `number` | 抽帧频率 `agent.thread_message_received.content.source.fps` 抽帧频率,取值范围为 0.2 到 5;省略时使用下游模型的默认策略 **from_session_thread_id** `string` | 来源线程 ID `agent.thread_message_received.from_session_thread_id` 消息来源线程 ID **from_agent_name** `string` | 来源智能体名称 `agent.thread_message_received.from_agent_name` 发送方智能体名称,来自主智能体时为空 --- ### agent.thread_message_sent > 多智能体场景下,当前线程向其他线程/智能体发送消息时触发 **type** `string` | 事件类型 `agent.thread_message_sent.type` 事件类型,固定为 `agent.thread_message_sent` **id** `string` | 事件 ID `agent.thread_message_sent.id` 事件唯一标识符,形如 `sevt-...`,由服务端生成 **processed_at** `string` | 处理时间 `agent.thread_message_sent.processed_at` 事件处理时间,采用 RFC 3339 格式 **content** `object[]` | 消息内容 `agent.thread_message_sent.content` 发送的消息内容 **文本** `object` 文本内容 **type** `string` | 内容类型 `agent.thread_message_sent.content.type` 内容类型,固定为 `text` **text** `string` | 文本内容 `agent.thread_message_sent.content.text` **图片** `object` 图片内容 **type** `string` | 内容类型 `agent.thread_message_sent.content.type` 内容类型,固定为 `image` **source** `object` | 图片源 `agent.thread_message_sent.content.source` **Base64 图片** `object` Base64 编码图片 **type** `string` | 内容类型 `agent.thread_message_sent.content.source.type` **media_type** `string` | MIME 类型 `agent.thread_message_sent.content.source.media_type` **data** `string` | Base64 数据 `agent.thread_message_sent.content.source.data` **URL 图片** `object` **type** `string` | 内容类型 `agent.thread_message_sent.content.source.type` **url** `string` | 图片 URL `agent.thread_message_sent.content.source.url` **文件图片** `object` 文件 ID 图片 **type** `string` | 内容类型 `agent.thread_message_sent.content.source.type` **file_id** `string` | 文件 ID `agent.thread_message_sent.content.source.file_id` **文档** `object` 文档内容 **type** `string` | 内容类型 `agent.thread_message_sent.content.type` 内容类型,固定为 `document` **source** `object` | 文档源 `agent.thread_message_sent.content.source` 文档源 **纯文本文档** `object` **type** `string` | 内容类型 `agent.thread_message_sent.content.source.type` **media_type** `string` | MIME 类型 `agent.thread_message_sent.content.source.media_type` **data** `string` | 文本内容 `agent.thread_message_sent.content.source.data` **URL 文档** `object` **type** `string` | 内容类型 `agent.thread_message_sent.content.source.type` **url** `string` | 文档 URL `agent.thread_message_sent.content.source.url` **文件文档** `object` 文件 ID 文档 **type** `string` | 内容类型 `agent.thread_message_sent.content.source.type` **file_id** `string` | 文件 ID `agent.thread_message_sent.content.source.file_id` **title** `string` | 文档标题 `agent.thread_message_sent.content.title` **context** `string` | 上下文说明 `agent.thread_message_sent.content.context` **视频** `object` 视频内容 **type** `string` | 内容类型 `agent.thread_message_sent.content.type` 内容类型,固定为 `video` **source** `object` | 视频源 `agent.thread_message_sent.content.source` 视频源 **Base64 视频** `object` Base64 编码视频 **type** `string` | 内容类型 `agent.thread_message_sent.content.source.type` **media_type** `string` | MIME 类型 `agent.thread_message_sent.content.source.media_type` 取值:`video/mp4` / `video/x-msvideo` / `video/quicktime`。 **data** `string` | Base64 数据 `agent.thread_message_sent.content.source.data` **fps** `number` | 抽帧频率 `agent.thread_message_sent.content.source.fps` 抽帧频率,取值范围为 0.2 到 5;省略时使用下游模型的默认策略 **URL 视频** `object` **type** `string` | 内容类型 `agent.thread_message_sent.content.source.type` **url** `string` | 视频 URL `agent.thread_message_sent.content.source.url` 公网可访问的视频 URL,可处理的视频大小以下游模型的输入限制为准;对象存储需将 `Content-Type` 设置为对应视频 MIME 类型 **fps** `number` | 抽帧频率 `agent.thread_message_sent.content.source.fps` 抽帧频率,取值范围为 0.2 到 5;省略时使用下游模型的默认策略 **文件视频** `object` 文件 ID 视频 **type** `string` | 内容类型 `agent.thread_message_sent.content.source.type` **file_id** `string` | 文件 ID `agent.thread_message_sent.content.source.file_id` **fps** `number` | 抽帧频率 `agent.thread_message_sent.content.source.fps` 抽帧频率,取值范围为 0.2 到 5;省略时使用下游模型的默认策略 **to_session_thread_id** `string` | 目标线程 ID `agent.thread_message_sent.to_session_thread_id` 消息目标线程 ID **to_agent_name** `string` | 目标智能体名称 `agent.thread_message_sent.to_agent_name` 接收方智能体名称,发给主智能体时为空 --- ### agent.thread_context_compacted > 线程上下文达到长度限制,自动进行摘要压缩时触发 **type** `string` | 事件类型 `agent.thread_context_compacted.type` 事件类型,固定为 `agent.thread_context_compacted` **id** `string` | 事件 ID `agent.thread_context_compacted.id` 事件唯一标识符,形如 `sevt-...`,由服务端生成 **processed_at** `string` | 处理时间 `agent.thread_context_compacted.processed_at` 事件处理时间,采用 RFC 3339 格式 --- ### session.error > 会话执行过程中发生错误时触发 **type** `string` | 事件类型 `session.error.type` 事件类型,固定为 `session.error` **id** `string` | 事件 ID `session.error.id` 事件唯一标识符,形如 `sevt-...`,由服务端生成 **processed_at** `string` | 处理时间 `session.error.processed_at` 事件处理时间,采用 RFC 3339 格式 **error** `object` | 错误详情 `session.error.error` 错误详情,支持多态错误类型 **未知错误** `object` **type** `string` | 错误类型 `session.error.error.type` **message** `string` | 错误信息 `session.error.error.message` **retry_status** `object` | 重试状态 `session.error.error.retry_status` 重试状态 **重试中** `object` 服务端正在自动重试,客户端应等待 **type** `string` | 状态类型 `session.error.error.retry_status.type` 状态类型,固定为 `retrying`,表示服务端正在自动重试 **重试耗尽** `object` 当前轮次结束,会话恢复为空闲状态后可继续发送输入 **type** `string` | 状态类型 `session.error.error.retry_status.type` 状态类型,固定为 `exhausted`,表示已用尽当前轮次重试次数 **终止** `object` 会话将进入终止状态,客户端不能继续发送事件 **type** `string` | 状态类型 `session.error.error.retry_status.type` 状态类型,固定为 `terminal`,表示会话将进入终止状态 **模型过载** `object` **type** `string` | 错误类型 `session.error.error.type` **message** `string` | 错误信息 `session.error.error.message` **retry_status** `object` | 重试状态 `session.error.error.retry_status` 重试状态 **重试中** `object` 服务端正在自动重试,客户端应等待 **type** `string` | 状态类型 `session.error.error.retry_status.type` 状态类型,固定为 `retrying`,表示服务端正在自动重试 **重试耗尽** `object` 当前轮次结束,会话恢复为空闲状态后可继续发送输入 **type** `string` | 状态类型 `session.error.error.retry_status.type` 状态类型,固定为 `exhausted`,表示已用尽当前轮次重试次数 **终止** `object` 会话将进入终止状态,客户端不能继续发送事件 **type** `string` | 状态类型 `session.error.error.retry_status.type` 状态类型,固定为 `terminal`,表示会话将进入终止状态 **模型限流** `object` **type** `string` | 错误类型 `session.error.error.type` **message** `string` | 错误信息 `session.error.error.message` **retry_status** `object` | 重试状态 `session.error.error.retry_status` 重试状态 **重试中** `object` 服务端正在自动重试,客户端应等待 **type** `string` | 状态类型 `session.error.error.retry_status.type` 状态类型,固定为 `retrying`,表示服务端正在自动重试 **重试耗尽** `object` 当前轮次结束,会话恢复为空闲状态后可继续发送输入 **type** `string` | 状态类型 `session.error.error.retry_status.type` 状态类型,固定为 `exhausted`,表示已用尽当前轮次重试次数 **终止** `object` 会话将进入终止状态,客户端不能继续发送事件 **type** `string` | 状态类型 `session.error.error.retry_status.type` 状态类型,固定为 `terminal`,表示会话将进入终止状态 **请求失败** `object` 模型请求失败 **type** `string` | 错误类型 `session.error.error.type` **message** `string` | 错误信息 `session.error.error.message` **retry_status** `object` | 重试状态 `session.error.error.retry_status` 重试状态 **重试中** `object` 服务端正在自动重试,客户端应等待 **type** `string` | 状态类型 `session.error.error.retry_status.type` 状态类型,固定为 `retrying`,表示服务端正在自动重试 **重试耗尽** `object` 当前轮次结束,会话恢复为空闲状态后可继续发送输入 **type** `string` | 状态类型 `session.error.error.retry_status.type` 状态类型,固定为 `exhausted`,表示已用尽当前轮次重试次数 **终止** `object` 会话将进入终止状态,客户端不能继续发送事件 **type** `string` | 状态类型 `session.error.error.retry_status.type` 状态类型,固定为 `terminal`,表示会话将进入终止状态 **MCP 连接失败** `object` **type** `string` | 错误类型 `session.error.error.type` **message** `string` | 错误信息 `session.error.error.message` **retry_status** `object` | 重试状态 `session.error.error.retry_status` 重试状态 **重试中** `object` 服务端正在自动重试,客户端应等待 **type** `string` | 状态类型 `session.error.error.retry_status.type` 状态类型,固定为 `retrying`,表示服务端正在自动重试 **重试耗尽** `object` 当前轮次结束,会话恢复为空闲状态后可继续发送输入 **type** `string` | 状态类型 `session.error.error.retry_status.type` 状态类型,固定为 `exhausted`,表示已用尽当前轮次重试次数 **终止** `object` 会话将进入终止状态,客户端不能继续发送事件 **type** `string` | 状态类型 `session.error.error.retry_status.type` 状态类型,固定为 `terminal`,表示会话将进入终止状态 **mcp_server_name** `string` | MCP 服务名 `session.error.error.mcp_server_name` **MCP 认证失败** `object` **type** `string` | 错误类型 `session.error.error.type` **message** `string` | 错误信息 `session.error.error.message` **retry_status** `object` | 重试状态 `session.error.error.retry_status` 重试状态 **重试中** `object` 服务端正在自动重试,客户端应等待 **type** `string` | 状态类型 `session.error.error.retry_status.type` 状态类型,固定为 `retrying`,表示服务端正在自动重试 **重试耗尽** `object` 当前轮次结束,会话恢复为空闲状态后可继续发送输入 **type** `string` | 状态类型 `session.error.error.retry_status.type` 状态类型,固定为 `exhausted`,表示已用尽当前轮次重试次数 **终止** `object` 会话将进入终止状态,客户端不能继续发送事件 **type** `string` | 状态类型 `session.error.error.retry_status.type` 状态类型,固定为 `terminal`,表示会话将进入终止状态 **mcp_server_name** `string` | MCP 服务名 `session.error.error.mcp_server_name` **计费错误** `object` **type** `string` | 错误类型 `session.error.error.type` **message** `string` | 错误信息 `session.error.error.message` **retry_status** `object` | 重试状态 `session.error.error.retry_status` 重试状态 **重试中** `object` 服务端正在自动重试,客户端应等待 **type** `string` | 状态类型 `session.error.error.retry_status.type` 状态类型,固定为 `retrying`,表示服务端正在自动重试 **重试耗尽** `object` 当前轮次结束,会话恢复为空闲状态后可继续发送输入 **type** `string` | 状态类型 `session.error.error.retry_status.type` 状态类型,固定为 `exhausted`,表示已用尽当前轮次重试次数 **终止** `object` 会话将进入终止状态,客户端不能继续发送事件 **type** `string` | 状态类型 `session.error.error.retry_status.type` 状态类型,固定为 `terminal`,表示会话将进入终止状态 **凭证不可达** `object` 凭证服务不可达 **type** `string` | 错误类型 `session.error.error.type` **message** `string` | 错误信息 `session.error.error.message` **retry_status** `object` | 重试状态 `session.error.error.retry_status` 重试状态 **重试中** `object` 服务端正在自动重试,客户端应等待 **type** `string` | 状态类型 `session.error.error.retry_status.type` 状态类型,固定为 `retrying`,表示服务端正在自动重试 **重试耗尽** `object` 当前轮次结束,会话恢复为空闲状态后可继续发送输入 **type** `string` | 状态类型 `session.error.error.retry_status.type` 状态类型,固定为 `exhausted`,表示已用尽当前轮次重试次数 **终止** `object` 会话将进入终止状态,客户端不能继续发送事件 **type** `string` | 状态类型 `session.error.error.retry_status.type` 状态类型,固定为 `terminal`,表示会话将进入终止状态 **vault_id** `string` | 保管库 ID `session.error.error.vault_id` **credential_id** `string` | 凭证 ID `session.error.error.credential_id` --- ### session.deleted > 会话被删除时触发。收到该事件后,该会话不会再产生后续事件,客户端应结束当前流式连接 **type** `string` | 事件类型 `session.deleted.type` 事件类型,固定为 `session.deleted` **id** `string` | 事件 ID `session.deleted.id` 事件唯一标识符,形如 `sevt-...`,由服务端生成 **processed_at** `string` | 处理时间 `session.deleted.processed_at` 事件处理时间,采用 RFC 3339 格式 --- ### session.thread_created > 多智能体会话中新线程创建成功时触发。订阅父线程时也可能收到该通知;子线程内部消息需订阅对应线程 **type** `string` | 事件类型 `session.thread_created.type` 事件类型,固定为 `session.thread_created` **id** `string` | 事件 ID `session.thread_created.id` 事件唯一标识符,形如 `sevt-...`,由服务端生成 **processed_at** `string` | 处理时间 `session.thread_created.processed_at` 事件处理时间,采用 RFC 3339 格式 **agent_name** `string` | 智能体名称 `session.thread_created.agent_name` 线程所属智能体名称 **session_thread_id** `string` | 线程 ID `session.thread_created.session_thread_id` 新创建的线程 ID --- ### session.status_running > 会话开始处理任务,进入运行状态时触发 **type** `string` | 事件类型 `session.status_running.type` 事件类型,固定为 `session.status_running` **id** `string` | 事件 ID `session.status_running.id` 事件唯一标识符,形如 `sevt-...`,由服务端生成 **processed_at** `string` | 处理时间 `session.status_running.processed_at` 事件处理时间,采用 RFC 3339 格式 --- ### session.status_idle > 会话处理完当前任务,进入空闲状态时触发 **type** `string` | 事件类型 `session.status_idle.type` 事件类型,固定为 `session.status_idle` **id** `string` | 事件 ID `session.status_idle.id` 事件唯一标识符,形如 `sevt-...`,由服务端生成 **processed_at** `string` | 处理时间 `session.status_idle.processed_at` 事件处理时间,采用 RFC 3339 格式 **stop_reason** `object` | 停止原因 `session.status_idle.stop_reason` 停止原因,支持多态类型 **正常结束** `object` 当前轮次正常结束,客户端可以发送下一条消息 **type** `string` | 停止原因类型 `session.status_idle.stop_reason.type` **需要操作** `object` 需要用户操作 **type** `string` | 停止原因类型 `session.status_idle.stop_reason.type` **event_ids** `string[]` | 待处理事件 ID 列表 `session.status_idle.stop_reason.event_ids` 待处理的工具调用事件 ID 列表。客户端处理对应操作后,将 ID 原样填入确认或结果事件 **重试耗尽** `object` 已用尽当前轮次重试次数,仅结束当前轮次;会话恢复为空闲状态后仍可继续发送输入 **type** `string` | 停止原因类型 `session.status_idle.stop_reason.type` --- ### session.status_rescheduled > 会话因临时错误进入自动恢复和重新调度过程时触发 **type** `string` | 事件类型 `session.status_rescheduled.type` 事件类型,固定为 `session.status_rescheduled` **id** `string` | 事件 ID `session.status_rescheduled.id` 事件唯一标识符,形如 `sevt-...`,由服务端生成 **processed_at** `string` | 处理时间 `session.status_rescheduled.processed_at` 事件处理时间,采用 RFC 3339 格式 --- ### session.status_terminated > 会话进入终态时触发。该状态下不能继续发送事件;`retries_exhausted` 仅表示当前轮次结束,不代表会话终止 **type** `string` | 事件类型 `session.status_terminated.type` 事件类型,固定为 `session.status_terminated` **id** `string` | 事件 ID `session.status_terminated.id` 事件唯一标识符,形如 `sevt-...`,由服务端生成 **processed_at** `string` | 处理时间 `session.status_terminated.processed_at` 事件处理时间,采用 RFC 3339 格式 --- ### session.thread_status_running > 线程开始处理任务,进入运行状态时触发 **type** `string` | 事件类型 `session.thread_status_running.type` 事件类型,固定为 `session.thread_status_running` **id** `string` | 事件 ID `session.thread_status_running.id` 事件唯一标识符,形如 `sevt-...`,由服务端生成 **processed_at** `string` | 处理时间 `session.thread_status_running.processed_at` 事件处理时间,采用 RFC 3339 格式 **agent_name** `string` | 智能体名称 `session.thread_status_running.agent_name` 线程所属智能体名称 **session_thread_id** `string` | 线程 ID `session.thread_status_running.session_thread_id` 线程 ID --- ### session.thread_status_idle > 线程处理完当前任务,进入空闲状态时触发 **type** `string` | 事件类型 `session.thread_status_idle.type` 事件类型,固定为 `session.thread_status_idle` **id** `string` | 事件 ID `session.thread_status_idle.id` 事件唯一标识符,形如 `sevt-...`,由服务端生成 **processed_at** `string` | 处理时间 `session.thread_status_idle.processed_at` 事件处理时间,采用 RFC 3339 格式 **agent_name** `string` | 智能体名称 `session.thread_status_idle.agent_name` 线程所属智能体名称 **session_thread_id** `string` | 线程 ID `session.thread_status_idle.session_thread_id` 线程 ID **stop_reason** `object` | 停止原因 `session.thread_status_idle.stop_reason` 停止原因,支持多态类型 **正常结束** `object` 当前轮次正常结束,客户端可以发送下一条消息 **type** `string` | 停止原因类型 `session.thread_status_idle.stop_reason.type` **需要操作** `object` 需要用户操作 **type** `string` | 停止原因类型 `session.thread_status_idle.stop_reason.type` **event_ids** `string[]` | 待处理事件 ID 列表 `session.thread_status_idle.stop_reason.event_ids` 待处理的工具调用事件 ID 列表。客户端处理对应操作后,将 ID 原样填入确认或结果事件 **重试耗尽** `object` 已用尽当前轮次重试次数,仅结束当前轮次;会话恢复为空闲状态后仍可继续发送输入 **type** `string` | 停止原因类型 `session.thread_status_idle.stop_reason.type` --- ### session.thread_status_rescheduled > 线程因临时错误进入自动恢复和重新调度过程时触发。订阅父线程时也可能收到子线程的该状态通知 **type** `string` | 事件类型 `session.thread_status_rescheduled.type` 事件类型,固定为 `session.thread_status_rescheduled` **id** `string` | 事件 ID `session.thread_status_rescheduled.id` 事件唯一标识符,形如 `sevt-...`,由服务端生成 **processed_at** `string` | 处理时间 `session.thread_status_rescheduled.processed_at` 事件处理时间,采用 RFC 3339 格式 **agent_name** `string` | 智能体名称 `session.thread_status_rescheduled.agent_name` 线程所属智能体名称 **session_thread_id** `string` | 线程 ID `session.thread_status_rescheduled.session_thread_id` 线程 ID --- ### session.thread_status_terminated > 线程被终止时触发。订阅父线程时也可能收到子线程的该状态通知 **type** `string` | 事件类型 `session.thread_status_terminated.type` 事件类型,固定为 `session.thread_status_terminated` **id** `string` | 事件 ID `session.thread_status_terminated.id` 事件唯一标识符,形如 `sevt-...`,由服务端生成 **processed_at** `string` | 处理时间 `session.thread_status_terminated.processed_at` 事件处理时间,采用 RFC 3339 格式 **agent_name** `string` | 智能体名称 `session.thread_status_terminated.agent_name` 线程所属智能体名称 **session_thread_id** `string` | 线程 ID `session.thread_status_terminated.session_thread_id` 线程 ID --- ### span.model_request_start > 开始调用大模型时触发,用于链路追踪 **type** `string` | 事件类型 `span.model_request_start.type` 事件类型,固定为 `span.model_request_start` **id** `string` | 事件 ID `span.model_request_start.id` 事件唯一标识符,形如 `sevt-...`,由服务端生成 **processed_at** `string` | 处理时间 `span.model_request_start.processed_at` 事件处理时间,采用 RFC 3339 格式 --- ### span.model_request_end > 大模型调用完成时触发 **type** `string` | 事件类型 `span.model_request_end.type` 事件类型,固定为 `span.model_request_end` **id** `string` | 事件 ID `span.model_request_end.id` 事件唯一标识符,形如 `sevt-...`,由服务端生成 **processed_at** `string` | 处理时间 `span.model_request_end.processed_at` 事件处理时间,采用 RFC 3339 格式 **model_request_start_id** `string` | 开始事件 ID `span.model_request_end.model_request_start_id` 对应的模型请求开始事件 ID **model_usage** `object` | token 用量 `span.model_request_end.model_usage` 模型 token 用量统计 一次模型请求的 token 用量统计 **cache_creation_input_tokens** `integer` | 缓存写入 token `span.model_request_end.model_usage.cache_creation_input_tokens` 缓存写入的输入 token 数 **cache_read_input_tokens** `integer` | 缓存读取 token `span.model_request_end.model_usage.cache_read_input_tokens` 缓存命中读取的输入 token 数 **input_tokens** `integer` | 输入 token `span.model_request_end.model_usage.input_tokens` 输入 token 总数 **output_tokens** `integer` | 输出 token `span.model_request_end.model_usage.output_tokens` 输出 token 总数 **speed** `string` | 速度档位 `span.model_request_end.model_usage.speed` 推理速度档位。取值:`standard` / `fast`。 **is_error** `boolean` | 是否错误 `span.model_request_end.is_error` 模型调用是否出错 --- ## 流式预览帧(SSE) ### event_start > 通过 `event_deltas` 订阅 `agent.message` 或 `agent.thinking` 的增量预览后,服务端开始推送对应事件时触发 **type** `string` | 帧类型 `event_start.type` 帧类型,固定为 `event_start` **id** `string` | 预览帧 ID `event_start.id` 预览帧唯一标识符,形如 `sevt-...`,由服务端生成 **processed_at** `string` | 生成时间 `event_start.processed_at` 预览帧生成时间,采用 RFC 3339 格式 **event** `object` | 预览事件 `event_start.event` 被预览事件的类型和 ID **回复消息预览** `object` Agent 回复消息预览 **type** `string` | 事件类型 `event_start.event.type` 事件类型,固定为 `agent.message` **id** `string` | 事件 ID `event_start.event.id` 被预览事件的 ID **思考内容预览** `object` Agent 思考内容预览 **type** `string` | 事件类型 `event_start.event.type` 事件类型,固定为 `agent.thinking` **id** `string` | 事件 ID `event_start.event.id` 被预览事件的 ID --- ### event_delta > 被订阅事件生成新的文本片段时触发,客户端按 `event_id` 和 `index` 累积内容 **type** `string` | 帧类型 `event_delta.type` 帧类型,固定为 `event_delta` **id** `string` | 预览帧 ID `event_delta.id` 预览帧唯一标识符,形如 `sevt-...`,由服务端生成 **processed_at** `string` | 生成时间 `event_delta.processed_at` 预览帧生成时间,采用 RFC 3339 格式 **event_id** `string` | 事件 ID `event_delta.event_id` 被预览事件的 ID,与对应 `event_start.event.id` 及最终 buffered 事件的 `id` 一致 **delta** `object` | 内容增量 `event_delta.delta` 当前内容增量 被预览事件的一个文本内容增量 **type** `string` | 增量类型 `event_delta.delta.type` 增量类型,固定为 `content_delta` **content** `object` | 文本片段 `event_delta.delta.content` 新增的文本片段 文本内容块 **type** `string` | 内容类型 `event_delta.delta.content.type` 内容类型,固定为 `text` **text** `string` | 文本内容 `event_delta.delta.content.text` 文本内容 **index** `integer` | 内容下标 `event_delta.delta.index` 文本片段在最终 `content[]` 数组中的下标 --- --- # 添加会话资源 Source: https://ark.volcengine.com/region:cn-beijing/docs/add-resource-api `POST https://ark.cn-beijing.volces.com/api/v3/sessions/{session_id}/resources` 将 Files API 中的文件添加到已有会话的托管运行环境。当前仅支持 `file`,并以只读方式挂载。 添加成功后,请使用响应中的 `file_id` 查询或引用该文件。本接口仅适用于绑定托管运行环境的会话。 > **说明** > > 挂载后,智能体通过 `mount_path` 读取文件;未指定该字段时,路径为 `/mnt/session/uploads/`。若还需要将同一文件传入模型上下文,请在 `user.message` 的 `content[]` 中引用响应中的 `file_id`。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **session_id** `string` `必选` | 会话 ID 填写要添加资源的会话 ID,形如 `sesn-...`。 ### Body 参数 **file_id** `string` `必选` | 文件 ID 要挂载到会话的文件 ID,通过 Files API 上传文件后获得。 > **说明** > > 文件不能超过 100 MiB。通过 Files API 上传文件时,`purpose` 必须为 `user_data` 或 `agent`;文件 ID 格式需匹配 `^[A-Za-z0-9_-]{1,128}$`。 **type** `string` `必选` | 资源类型 要添加的资源类型,固定为 `file`,表示通过 Files API 上传的文件。 **mount_path** `string` | 挂载路径 文件在托管运行环境中的路径。省略或传入空值时,使用文件上传时的原始文件名,最终路径为 `/mnt/session/uploads/`。 > **说明** > > 路径开头的 `/` 会自动移除。路径不得包含独立的 `..` 或 `.` 路径段,例如 `a/../b` 和 `a/./b` 均不合法;也不得包含反斜杠、连续的 `//` 或控制字符,且不能以 `/` 结尾。 ## 响应参数 **access** `string` | 访问模式 会话对文件的访问权限,固定为 `read_only`,表示智能体可以读取文件,但不能修改。 **type** `string` | 资源类型 已挂载资源的类型,固定为 `file`,表示通过 Files API 上传的文件。 **created_at** `string` | 创建时间 文件挂载到会话的时间,采用 RFC 3339 格式。 **file_id** `string` | 文件 ID 当前可用的文件 ID。该值可能与请求中提交的 `file_id` 不同;后续查询和引用请以响应值为准。 **id** `string` | 资源 ID 会话资源 ID,形如 `sesrsc-...`。 **mount_path** `string` | 挂载路径 文件在托管运行环境中的完整挂载路径。 > **说明** > > 指定 `mount_path` 时,返回值由 `/mnt/session/uploads/` 与规范化后的请求路径组成。例如传入 `data/report.pdf` 时,返回 `/mnt/session/uploads/data/report.pdf`。未指定时,返回 `/mnt/session/uploads/`。 **updated_at** `string` | 更新时间 会话资源信息最后更新的时间,采用 RFC 3339 格式。 ## 代码示例 ## 添加会话资源 ### cURL #### Request ```Bash curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/sessions//resources" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d @- <<'EOF' { "type": "file", "file_id": "", "mount_path": "workspace/input.txt" } EOF ``` #### Response ``` { "id": "sesrsc-01hx3z9r0w8n3p5q6s7t8v9x20", "type": "file", "file_id": "", "mount_path": "/mnt/session/uploads/workspace/input.txt", "created_at": "2026-07-15T08:30:20.000Z", "updated_at": "2026-07-15T08:30:20.000Z" } ``` ### Python #### Request ```python import json import os import urllib.request payload = json.dumps( { "type": "file", "file_id": "", "mount_path": "workspace/input.txt", } ).encode() req = urllib.request.Request( "https://ark.cn-beijing.volces.com/api/v3/sessions//resources", data=payload, method="POST", headers={ "Authorization": f"Bearer {os.environ['ARK_API_KEY']}", "Content-Type": "application/json", }, ) with urllib.request.urlopen(req) as resp: print(resp.read().decode()) ``` #### Response ``` { "id": "sesrsc-01hx3z9r0w8n3p5q6s7t8v9x20", "type": "file", "file_id": "", "mount_path": "/mnt/session/uploads/workspace/input.txt", "created_at": "2026-07-15T08:30:20.000Z", "updated_at": "2026-07-15T08:30:20.000Z" } ``` ### Java #### Request ```java import okhttp3.MediaType; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; public class Main { public static void main(String[] args) throws Exception { String body = "{\"type\":\"file\"," + "\"file_id\":\"\"," + "\"mount_path\":\"workspace/input.txt\"}"; Request req = new Request.Builder() .url("https://ark.cn-beijing.volces.com/api/v3/sessions//resources") .addHeader("Authorization", "Bearer " + System.getenv("ARK_API_KEY")) .post(RequestBody.create( MediaType.parse("application/json"), body)) .build(); try (Response resp = new OkHttpClient().newCall(req).execute()) { String responseBody = resp.body() == null ? "" : resp.body().string(); if (!resp.isSuccessful()) { throw new RuntimeException( "HTTP " + resp.code() + ": " + responseBody); } System.out.println(responseBody); } } } ``` #### Response ``` { "id": "sesrsc-01hx3z9r0w8n3p5q6s7t8v9x20", "type": "file", "file_id": "", "mount_path": "/mnt/session/uploads/workspace/input.txt", "created_at": "2026-07-15T08:30:20.000Z", "updated_at": "2026-07-15T08:30:20.000Z" } ``` ### Go #### Request ```go package main import ( "bytes" "context" "fmt" "io" "net/http" "os" ) func main() { ctx := context.Background() body := []byte(`{ "type": "file", "file_id": "", "mount_path": "workspace/input.txt" }`) req, err := http.NewRequestWithContext( ctx, http.MethodPost, "https://ark.cn-beijing.volces.com/api/v3/sessions//resources", bytes.NewReader(body), ) if err != nil { panic(err) } req.Header.Set("Authorization", "Bearer "+os.Getenv("ARK_API_KEY")) req.Header.Set("Content-Type", "application/json") resp, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer resp.Body.Close() if resp.StatusCode/100 != 2 { errorBody, _ := io.ReadAll(resp.Body) panic(fmt.Sprintf("HTTP %d: %s", resp.StatusCode, errorBody)) } if _, err := io.Copy(os.Stdout, resp.Body); err != nil { panic(err) } fmt.Println() } ``` #### Response ``` { "id": "sesrsc-01hx3z9r0w8n3p5q6s7t8v9x20", "type": "file", "file_id": "", "mount_path": "/mnt/session/uploads/workspace/input.txt", "created_at": "2026-07-15T08:30:20.000Z", "updated_at": "2026-07-15T08:30:20.000Z" } ``` --- # 查询会话资源列表 Source: https://ark.volcengine.com/region:cn-beijing/docs/list-resources-api `GET https://ark.cn-beijing.volces.com/api/v3/sessions/{session_id}/resources` 查询指定会话已挂载的资源列表。接口全量返回,最多返回 1000 条,无分页参数。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **session_id** `string` `必选` | 会话 ID 会话 ID,格式为 `sesn-` 开头的字符串 ## 响应参数 **data** `object[]` | 资源列表 指定会话当前挂载的资源列表。 文件资源 `object` 通过 Files API 上传并挂载到会话的文件。 **created_at** `string` | 挂载时间 `data.created_at` 资源挂载到会话的时间,采用 RFC 3339 格式。 **id** `string` | 资源 ID `data.id` 会话资源 ID。 **type** `string` | 资源类型 `data.type` 资源类型,固定为 `file`。 **updated_at** `string` | 更新时间 `data.updated_at` 会话资源信息最后更新的时间,采用 RFC 3339 格式。 **access** `string` | 访问权限 `data.access` 文件访问权限,固定为 `read_only`。 **file_id** `string` | 文件 ID `data.file_id` 当前可用的文件 ID。 **mount_path** `string` | 挂载路径 `data.mount_path` 文件在会话运行环境中的完整挂载路径。 记忆库资源 `object` 挂载到会话的记忆库。 **created_at** `string` | 挂载时间 `data.created_at` 资源挂载到会话的时间,采用 RFC 3339 格式。 **id** `string` | 资源 ID `data.id` 会话资源 ID。 **type** `string` | 资源类型 `data.type` 资源类型,固定为 `memory_store`。 **updated_at** `string` | 更新时间 `data.updated_at` 会话资源信息最后更新的时间,采用 RFC 3339 格式。 **access** `string` | 访问权限 `data.access` 会话对记忆库的访问权限。可选值:`read_only`、`read_write`。 **instructions** `string` | 使用指导 `data.instructions` 会话当前用于该记忆库的使用指导。 **memory_store_id** `string` | 记忆库 ID `data.memory_store_id` 挂载到会话的记忆库 ID。 TOS 资源 `object` 挂载到会话的 TOS 对象目录。 **created_at** `string` | 挂载时间 `data.created_at` 资源挂载到会话的时间,采用 RFC 3339 格式。 **id** `string` | 资源 ID `data.id` 会话资源 ID。 **type** `string` | 资源类型 `data.type` 资源类型,固定为 `tos`。 **updated_at** `string` | 更新时间 `data.updated_at` 会话资源信息最后更新的时间,采用 RFC 3339 格式。 **access** `string` | 访问权限 `data.access` 会话对 TOS 目录的访问权限。可选值:`read_only`、`read_write`。 **mount_path** `string` | 挂载路径 `data.mount_path` TOS 目录在会话运行环境中的挂载路径。创建会话时未指定挂载路径,则不返回该字段。 **tos_bucket** `string` | TOS 存储桶 `data.tos_bucket` TOS 挂载源所在的存储桶名称。 **tos_key** `string` | TOS 目录前缀 `data.tos_key` TOS 中已挂载目录的对象前缀。 **tos_region** `string` | TOS 地域 `data.tos_region` TOS 挂载源所在地域的 Region ID。 ## 代码示例 ## 查询会话资源列表 ### cURL #### Request ```Bash curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/sessions//resources" \ -H "Authorization: Bearer $ARK_API_KEY" ``` #### Response ``` { "data": [ { "id": "sesrsc-01hx3z9r0w8n3p5q6s7t8v9x20", "type": "memory_store", "memory_store_id": "", "access": "read_write", "created_at": "2026-07-15T08:30:20.000Z", "updated_at": "2026-07-15T08:30:20.000Z" }, { "id": "sesrsc-01hx3z9r0w8n3p5q6s7t8v9x21", "type": "file", "file_id": "", "mount_path": "/mnt/session/uploads/", "access": "read_only", "created_at": "2026-07-15T08:30:22.000Z", "updated_at": "2026-07-15T08:30:22.000Z" } ] } ``` ### Python #### Request ```python import os from arkruntime import Ark client = Ark( api_key=os.environ["ARK_API_KEY"], base_url="https://ark.cn-beijing.volces.com/api/v3", ) page = client.sessions.resources.list("") print(page) ``` #### Response ``` { "data": [ { "id": "sesrsc-01hx3z9r0w8n3p5q6s7t8v9x20", "type": "memory_store", "memory_store_id": "", "access": "read_write", "created_at": "2026-07-15T08:30:20.000Z", "updated_at": "2026-07-15T08:30:20.000Z" }, { "id": "sesrsc-01hx3z9r0w8n3p5q6s7t8v9x21", "type": "file", "file_id": "", "mount_path": "/mnt/session/uploads/", "access": "read_only", "created_at": "2026-07-15T08:30:22.000Z", "updated_at": "2026-07-15T08:30:22.000Z" } ] } ``` ### Java #### Request ```java // pom.xml 依赖: // // com.volcengine // ark-runtime // 0.9.0 // import com.volcengine.ark.runtime.models.session.ListSessionResourcesResponse; import com.volcengine.ark.runtime.service.ArkService; public class Main { public static void main(String[] args) throws Exception { ArkService service = ArkService.builder() .apiKey(System.getenv("ARK_API_KEY")) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); ListSessionResourcesResponse page = service.listSessionResources(""); System.out.println(page); service.shutdownExecutor(); } } ``` #### Response ``` { "data": [ { "id": "sesrsc-01hx3z9r0w8n3p5q6s7t8v9x20", "type": "memory_store", "memory_store_id": "", "access": "read_write", "created_at": "2026-07-15T08:30:20.000Z", "updated_at": "2026-07-15T08:30:20.000Z" }, { "id": "sesrsc-01hx3z9r0w8n3p5q6s7t8v9x21", "type": "file", "file_id": "", "mount_path": "/mnt/session/uploads/", "access": "read_only", "created_at": "2026-07-15T08:30:22.000Z", "updated_at": "2026-07-15T08:30:22.000Z" } ] } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" ) func main() { ctx := context.Background() client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) resp, err := client.ListSessionResources(ctx, "") if err != nil { panic(err) } fmt.Println(resp) } ``` #### Response ``` { "data": [ { "id": "sesrsc-01hx3z9r0w8n3p5q6s7t8v9x20", "type": "memory_store", "memory_store_id": "", "access": "read_write", "created_at": "2026-07-15T08:30:20.000Z", "updated_at": "2026-07-15T08:30:20.000Z" }, { "id": "sesrsc-01hx3z9r0w8n3p5q6s7t8v9x21", "type": "file", "file_id": "", "mount_path": "/mnt/session/uploads/", "access": "read_only", "created_at": "2026-07-15T08:30:22.000Z", "updated_at": "2026-07-15T08:30:22.000Z" } ] } ``` --- # 查询会话资源 Source: https://ark.volcengine.com/region:cn-beijing/docs/get-resource-api `GET https://ark.cn-beijing.volces.com/api/v3/sessions/{session_id}/resources/{resource_id}` 按 `session_id` 和 `resource_id` 查询单个已挂载资源。响应字段随 `type` 变化;`file` 资源的后续引用请以查询返回的 `file_id` 为准。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **resource_id** `string` `必选` | 资源 ID 会话资源 ID,形如 `sesrsc-...`,可从添加资源或资源列表响应的 `id` 字段获得 **session_id** `string` `必选` | 会话 ID 填写资源所属的会话 ID,形如 `sesn-...` ## 响应参数 **created_at** `string` | 挂载时间 资源挂载到会话的时间,采用 RFC 3339 格式。 **id** `string` | 资源 ID 会话资源 ID。 **type** `string` | 资源类型 资源类型,用于确定返回哪些类型专属字段。可选值:`file`、`memory_store`、`tos`。 **updated_at** `string` | 更新时间 会话资源信息最后更新的时间,采用 RFC 3339 格式。 **access** `string` | 访问权限 资源访问权限。`file` 资源固定为 `read_only`;`memory_store` 和 `tos` 资源返回实际挂载权限。取值:`read_only` / `read_write`。 **file_id** `string` | 文件 ID 当 `type` 为 `file` 时返回,表示当前可用的文件 ID。 **instructions** `string` | 使用指导 当 `type` 为 `memory_store` 时返回,表示会话当前用于该记忆库的使用指导。 **memory_store_id** `string` | 记忆库 ID 当 `type` 为 `memory_store` 时返回,表示挂载到会话的记忆库 ID。 **mount_path** `string` | 挂载路径 当 `type` 为 `file` 或 `tos` 时返回,表示资源在会话运行环境中的挂载路径。创建会话时未指定 TOS 挂载路径,则不返回该字段。 **tos_bucket** `string` | TOS 存储桶 当 `type` 为 `tos` 时返回,表示挂载源所在的 TOS 存储桶名称。 **tos_key** `string` | TOS 目录前缀 当 `type` 为 `tos` 时返回,表示 TOS 中已挂载目录的对象前缀。 **tos_region** `string` | TOS 地域 当 `type` 为 `tos` 时返回,表示挂载源所在地域的 Region ID。 ## 代码示例 ## 查询会话资源详情 ### cURL #### Request ```Bash curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/sessions//resources/" \ -H "Authorization: Bearer $ARK_API_KEY" ``` #### Response ``` { "id": "", "type": "memory_store", "memory_store_id": "", "access": "read_write", "created_at": "2026-07-15T08:30:20.000Z", "updated_at": "2026-07-15T08:30:20.000Z" } ``` ### Python #### Request ```python import json import os import urllib.request req = urllib.request.Request( "https://ark.cn-beijing.volces.com/api/v3/sessions//resources/", headers={"Authorization": f"Bearer {os.environ['ARK_API_KEY']}"}, ) with urllib.request.urlopen(req) as resp: print(resp.read().decode()) ``` #### Response ``` { "id": "", "type": "memory_store", "memory_store_id": "", "access": "read_write", "created_at": "2026-07-15T08:30:20.000Z", "updated_at": "2026-07-15T08:30:20.000Z" } ``` ### Java #### Request ```java import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; public class Main { public static void main(String[] args) throws Exception { Request req = new Request.Builder() .url("https://ark.cn-beijing.volces.com/api/v3" + "/sessions//resources/") .addHeader("Authorization", "Bearer " + System.getenv("ARK_API_KEY")) .build(); try (Response resp = new OkHttpClient().newCall(req).execute()) { String responseBody = resp.body() == null ? "" : resp.body().string(); if (!resp.isSuccessful()) { throw new IllegalStateException( "HTTP " + resp.code() + ": " + responseBody); } System.out.println(responseBody); } } } ``` #### Response ``` { "id": "", "type": "memory_store", "memory_store_id": "", "access": "read_write", "created_at": "2026-07-15T08:30:20.000Z", "updated_at": "2026-07-15T08:30:20.000Z" } ``` ### Go #### Request ```go package main import ( "context" "fmt" "io" "net/http" "os" ) func main() { ctx := context.Background() req, _ := http.NewRequestWithContext(ctx, "GET", "https://ark.cn-beijing.volces.com/api/v3/sessions//resources/", nil) req.Header.Set("Authorization", "Bearer "+os.Getenv("ARK_API_KEY")) resp, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer resp.Body.Close() if resp.StatusCode >= http.StatusBadRequest { body, _ := io.ReadAll(resp.Body) panic(fmt.Sprintf("HTTP %d: %s", resp.StatusCode, body)) } if _, err := io.Copy(os.Stdout, resp.Body); err != nil { panic(err) } fmt.Println() } ``` #### Response ``` { "id": "", "type": "memory_store", "memory_store_id": "", "access": "read_write", "created_at": "2026-07-15T08:30:20.000Z", "updated_at": "2026-07-15T08:30:20.000Z" } ``` --- # 查询线程列表 Source: https://ark.volcengine.com/region:cn-beijing/docs/list-threads-api `GET https://ark.cn-beijing.volces.com/api/v3/sessions/{session_id}/threads` 分页查询指定会话下的主线程和子线程。会话开始执行后形成主线程;智能体委派子任务时形成子线程。 主线程排在最前,子线程按创建时间正序返回。 > **说明** > > 新建会话在尚未开始处理任何事件时,线程列表可能为空。本接口仅支持 `limit` 和 `page` 分页,不支持按状态、智能体或父线程筛选,也不支持反转排序。单次最多返回 1000 条。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **session_id** `string` `必选` | 会话 ID 会话 ID,形如 `sesn-...` ### Query 参数 > 在 URL Query String 中传入。 **limit** `integer` `默认值 1000` | 每页线程数 每页返回的线程数量,有效取值范围为 0~1000。 > **说明** > > 省略 `limit` 或传入 0 时,按 1000 处理;传入大于 1000 的整数时,按 1000 处理。负数或无法解析为整数的值会返回参数错误。 **最小值**:`0` **page** `string` | 下一页标识 下一页标识。请将上一页响应中的 `next_page` 原样传入;不传则从第一页开始 ## 响应参数 **data** `object[]` | 线程列表 线程列表。新建会话在尚未开始处理任何事件时可能返回空数组;首次执行开始后才会出现主线程视图 **agent_name** `string` | 智能体名称 `data.agent_name` 线程关联的智能体名称 **created_at** `string` | 创建时间 `data.created_at` 首次观察到该线程的时间,采用 RFC 3339 格式。 **id** `string` | 线程 ID `data.id` 线程唯一标识符,形如 `sthr-...` **parent_thread_id** `string / null` | 父线程 ID `data.parent_thread_id` 子线程的父线程 ID;主线程返回 `null`。 **session_id** `string` | 会话 ID `data.session_id` 所属会话 ID,形如 `sesn-...` **status** `string` | 线程状态 `data.status` 线程状态: - `running` 智能体正在处理 - `idle` 空闲(等待用户输入或工具结果) - `rescheduling` 调度中 - `terminated` 已终止 线程不能单独删除;`terminated` 线程仍可能出现在列表中。 **type** `string` | 对象类型 `data.type` 对象类型,固定为 `session_thread` **updated_at** `string` | 更新时间 `data.updated_at` 最近一次线程状态变化的时间,采用 RFC 3339 格式。 **next_page** `string` | 下一页标识 下一页标识。若为空或字段不返回,表示已到最后一页 ## 代码示例 ## 查询线程列表 ### cURL #### Request ```Bash curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/sessions//threads?limit=100" \ -H "Authorization: Bearer $ARK_API_KEY" ``` #### Response ``` { "data": [ { "id": "sthr-01hx3z9r0w8n3p5q6s7t8v9x0z", "session_id": "", "type": "session_thread", "status": "idle", "agent_name": "", "parent_thread_id": null, "created_at": "2026-07-15T08:30:14.900Z", "updated_at": "2026-07-15T08:30:19.220Z" }, { "id": "sthr-01hx3z9r0w8n3p5q6s7t8v9x22", "session_id": "", "type": "session_thread", "status": "running", "agent_name": "-sub", "parent_thread_id": "sthr-01hx3z9r0w8n3p5q6s7t8v9x0z", "created_at": "2026-07-15T08:31:04.000Z", "updated_at": "2026-07-15T08:31:04.000Z" } ] } ``` ### Python #### Request ```python import os from arkruntime import Ark client = Ark( api_key=os.environ["ARK_API_KEY"], base_url="https://ark.cn-beijing.volces.com/api/v3", ) page = client.sessions.threads.list("", limit=100) print(page) ``` #### Response ``` { "data": [ { "id": "sthr-01hx3z9r0w8n3p5q6s7t8v9x0z", "session_id": "", "type": "session_thread", "status": "idle", "agent_name": "", "parent_thread_id": null, "created_at": "2026-07-15T08:30:14.900Z", "updated_at": "2026-07-15T08:30:19.220Z" }, { "id": "sthr-01hx3z9r0w8n3p5q6s7t8v9x22", "session_id": "", "type": "session_thread", "status": "running", "agent_name": "-sub", "parent_thread_id": "sthr-01hx3z9r0w8n3p5q6s7t8v9x0z", "created_at": "2026-07-15T08:31:04.000Z", "updated_at": "2026-07-15T08:31:04.000Z" } ] } ``` ### Java #### Request ```java // pom.xml 依赖: // // com.volcengine // ark-runtime // 0.9.0 // import com.volcengine.ark.runtime.models.session.ListSessionThreadsResponse; import com.volcengine.ark.runtime.service.ArkService; public class Main { public static void main(String[] args) throws Exception { ArkService service = ArkService.builder() .apiKey(System.getenv("ARK_API_KEY")) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); ListSessionThreadsResponse page = service.listSessionThreads("", 100, null); System.out.println(page); service.shutdownExecutor(); } } ``` #### Response ``` { "data": [ { "id": "sthr-01hx3z9r0w8n3p5q6s7t8v9x0z", "session_id": "", "type": "session_thread", "status": "idle", "agent_name": "", "parent_thread_id": null, "created_at": "2026-07-15T08:30:14.900Z", "updated_at": "2026-07-15T08:30:19.220Z" }, { "id": "sthr-01hx3z9r0w8n3p5q6s7t8v9x22", "session_id": "", "type": "session_thread", "status": "running", "agent_name": "-sub", "parent_thread_id": "sthr-01hx3z9r0w8n3p5q6s7t8v9x0z", "created_at": "2026-07-15T08:31:04.000Z", "updated_at": "2026-07-15T08:31:04.000Z" } ] } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" sessionmodel "github.com/volcengine/ark-runtime-go/arkruntime/model/session" ) func main() { ctx := context.Background() client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) resp, err := client.ListSessionThreads(ctx, "", &sessionmodel.SessionThreadsListParams{ Limit: sessionmodel.NewOptInt32(100), }) if err != nil { panic(err) } fmt.Println(resp) } ``` #### Response ``` { "data": [ { "id": "sthr-01hx3z9r0w8n3p5q6s7t8v9x0z", "session_id": "", "type": "session_thread", "status": "idle", "agent_name": "", "parent_thread_id": null, "created_at": "2026-07-15T08:30:14.900Z", "updated_at": "2026-07-15T08:30:19.220Z" }, { "id": "sthr-01hx3z9r0w8n3p5q6s7t8v9x22", "session_id": "", "type": "session_thread", "status": "running", "agent_name": "-sub", "parent_thread_id": "sthr-01hx3z9r0w8n3p5q6s7t8v9x0z", "created_at": "2026-07-15T08:31:04.000Z", "updated_at": "2026-07-15T08:31:04.000Z" } ] } ``` --- # 查询线程详情 Source: https://ark.volcengine.com/region:cn-beijing/docs/get-thread-api `GET https://ark.cn-beijing.volces.com/api/v3/sessions/{session_id}/threads/{thread_id}` 查询指定线程的当前状态、关联智能体和主子关系。已知 `thread_id` 时使用本接口。 查看全部线程请使用 [查询线程列表](/docs/list-threads-api);排查执行过程请使用 [获取线程事件列表](/docs/list-thread-events-api)。 > **说明** > > 线程信息是根据会话执行事件形成的当前视图: > > - `created_at` 表示首次观察到该线程的时间。 > - `updated_at` 表示最近一次状态变化时间。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **session_id** `string` `必选` | 会话 ID 会话 ID,形如 `sesn-...` **thread_id** `string` `必选` | 线程 ID 线程 ID,形如 `sthr-...` ## 响应参数 **agent_name** `string` | 智能体名称 线程关联的智能体名称 **created_at** `string` | 创建时间 首次观察到该线程的时间,采用 RFC 3339 格式。 **id** `string` | 线程 ID 线程唯一标识符,形如 `sthr-...` **parent_thread_id** `string / null` | 父线程 ID 子线程的父线程 ID;主线程返回 `null`。 **session_id** `string` | 会话 ID 所属会话 ID,形如 `sesn-...` **status** `string` | 线程状态 线程状态: - `running` 智能体正在处理 - `idle` 空闲(等待用户输入或工具结果) - `rescheduling` 调度中 - `terminated` 已终止 **type** `string` | 对象类型 对象类型,固定为 `session_thread` **updated_at** `string` | 更新时间 最近一次线程状态变化的时间,采用 RFC 3339 格式。 ## 代码示例 ## 查询会话线程详情 ### cURL #### Request ```Bash curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/sessions//threads/" \ -H "Authorization: Bearer $ARK_API_KEY" ``` #### Response ``` { "id": "", "session_id": "", "status": "idle", "agent_name": "", "parent_thread_id": null, "created_at": "2026-07-15T08:30:14.900Z", "updated_at": "2026-07-15T08:30:19.220Z", "type": "session_thread" } ``` ### Python #### Request ```python import os from arkruntime import Ark client = Ark( api_key=os.environ["ARK_API_KEY"], base_url="https://ark.cn-beijing.volces.com/api/v3", ) thread = client.sessions.threads.retrieve("", "") print(thread) ``` #### Response ``` { "id": "", "session_id": "", "status": "idle", "agent_name": "", "parent_thread_id": null, "created_at": "2026-07-15T08:30:14.900Z", "updated_at": "2026-07-15T08:30:19.220Z", "type": "session_thread" } ``` ### Java #### Request ```java // pom.xml 依赖: // // com.volcengine // ark-runtime // 0.9.0 // import com.volcengine.ark.runtime.models.session.SessionThread; import com.volcengine.ark.runtime.service.ArkService; public class Main { public static void main(String[] args) throws Exception { ArkService service = ArkService.builder() .apiKey(System.getenv("ARK_API_KEY")) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); SessionThread thread = service.getSessionThread("", ""); System.out.println(thread); service.shutdownExecutor(); } } ``` #### Response ``` { "id": "", "session_id": "", "status": "idle", "agent_name": "", "parent_thread_id": null, "created_at": "2026-07-15T08:30:14.900Z", "updated_at": "2026-07-15T08:30:19.220Z", "type": "session_thread" } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" ) func main() { ctx := context.Background() client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) t, err := client.GetSessionThread(ctx, "", "") if err != nil { panic(err) } fmt.Println(t) } ``` #### Response ``` { "id": "", "session_id": "", "status": "idle", "agent_name": "", "parent_thread_id": null, "created_at": "2026-07-15T08:30:14.900Z", "updated_at": "2026-07-15T08:30:19.220Z", "type": "session_thread" } ``` --- # 查询线程事件列表 Source: https://ark.volcengine.com/region:cn-beijing/docs/list-thread-events-api `GET https://ark.cn-beijing.volces.com/api/v3/sessions/{session_id}/threads/{thread_id}/events` 分页查询指定线程中已经产生的消息、工具调用和状态事件。查询会话主线程中的事件时,请使用 [获取会话事件列表](/docs/list-events-api);实时接收指定线程的事件时,请使用 [流式获取线程事件](/docs/stream-thread-events-api)。返回字段随事件类型变化,详情请参见 [会话事件结构参考](/docs/sessions-events-reference-v2)。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **session_id** `string` `必选` | 会话 ID 会话 ID,格式为 `sesn-` 开头的字符串 **thread_id** `string` `必选` | 线程 ID 线程 ID,形如 `sthr-xxxxx`。 ### Query 参数 > 在 URL Query String 中传入。 **created_at[gt]** `string` | 起始时间(不含) 事件处理时间的起始边界(不含),采用 RFC 3339 格式。`created_at` 四个边界至多使用两个组成区间 **created_at[gte]** `string` | 起始时间(含) 事件处理时间的起始边界(含),采用 RFC 3339 格式。`created_at` 四个边界至多使用两个组成区间 **created_at[lt]** `string` | 结束时间(不含) 事件处理时间的结束边界(不含),采用 RFC 3339 格式。`created_at` 四个边界至多使用两个组成区间 **created_at[lte]** `string` | 结束时间(含) 事件处理时间的结束边界(含),采用 RFC 3339 格式。`created_at` 四个边界至多使用两个组成区间 **limit** `integer` `默认值 50` | 每页事件数 每页返回的事件数量。 > **说明** > > `limit` 为 0 时按默认值 50 处理;大于 200 时按 200 处理。负数或无法解析为整数的值会返回参数错误。 **取值范围**:`[0, 200]` **order** `string` `默认值 asc` | 排序方向 事件排序方向。 > **说明** > > `desc` 表示倒序;省略、传入 `asc` 或其他值时均按正序返回。 **page** `string` | 下一页标识 下一页标识。请将上一页返回的 `next_page` 原样传入;不传则从第一页开始 **types** `string[]` | 事件类型筛选 按事件类型筛选,可重复传入,例如 `types=user.message&types=agent.message`。支持的取值请参见 [会话事件结构参考](/docs/sessions-events-reference-v2) ## 响应参数 **data** `object[]` | 事件列表 指定线程的事件列表,用于查询子智能体线程内部的消息和工具调用。 每个事件对象包含 `id`、`type`、`processed_at` 以及随 `type` 变化的业务字段。 * 查询会话主线程中的事件时,请使用 [获取会话事件列表](/docs/list-events-api)。 * 完整字段结构请参见 [会话事件结构参考](/docs/sessions-events-reference-v2)。 **id** `string` | 事件 ID `data.id` 事件唯一标识符,形如 `sevt-...` **processed_at** `string` | 处理时间 `data.processed_at` 事件处理时间,采用 RFC 3339 格式 **type** `string` | 事件类型 `data.type` 事件类型(如 `user.message`、`agent.message`、`session.status_idle` 等) **next_page** `string` | 下一页标识 下一页标识,请原样传入下一次请求的 `page` 参数;无更多数据时不返回该字段 ## 代码示例 ## 获取线程事件列表 ### cURL #### Request ```Bash curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/sessions//threads//events?limit=50&order=asc" \ -H "Authorization: Bearer $ARK_API_KEY" ``` #### Response ``` { "data": [ { "id": "sevt-20260926143027-c3d4e", "type": "agent.message", "processed_at": "2026-09-26T14:30:27.045Z", "content": [{"type": "text", "text": "好的,我先按 OKR 分层梳理。"}] }, { "id": "sevt-20260926143029-e5f6g", "type": "session.thread_status_idle", "processed_at": "2026-09-26T14:30:29.220Z", "session_thread_id": "", "agent_name": "researcher", "stop_reason": {"type": "end_turn"} } ] } ``` ### Python #### Request ```python import json import os import urllib.parse import urllib.request query = urllib.parse.urlencode({"limit": 50, "order": "asc"}) req = urllib.request.Request( "https://ark.cn-beijing.volces.com/api/v3/sessions//threads//events?" + query, headers={"Authorization": f"Bearer {os.environ['ARK_API_KEY']}"}, ) with urllib.request.urlopen(req) as resp: print(resp.read().decode()) ``` #### Response ``` { "data": [ { "id": "sevt-20260926143027-c3d4e", "type": "agent.message", "processed_at": "2026-09-26T14:30:27.045Z", "content": [{"type": "text", "text": "好的,我先按 OKR 分层梳理。"}] }, { "id": "sevt-20260926143029-e5f6g", "type": "session.thread_status_idle", "processed_at": "2026-09-26T14:30:29.220Z", "session_thread_id": "", "agent_name": "researcher", "stop_reason": {"type": "end_turn"} } ] } ``` ### Java #### Request ```java // pom.xml 依赖: // // com.volcengine // ark-runtime // 0.9.0 // import com.volcengine.ark.runtime.models.session.ListSessionEventsResponse; import com.volcengine.ark.runtime.service.ArkService; public class Main { public static void main(String[] args) throws Exception { ArkService service = ArkService.builder() .apiKey(System.getenv("ARK_API_KEY")) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); ListSessionEventsResponse page = service.listSessionThreadEvents( "", "", null, null, null, null, 50, "asc", null, null); System.out.println(page); service.shutdownExecutor(); } } ``` #### Response ``` { "data": [ { "id": "sevt-20260926143027-c3d4e", "type": "agent.message", "processed_at": "2026-09-26T14:30:27.045Z", "content": [{"type": "text", "text": "好的,我先按 OKR 分层梳理。"}] }, { "id": "sevt-20260926143029-e5f6g", "type": "session.thread_status_idle", "processed_at": "2026-09-26T14:30:29.220Z", "session_thread_id": "", "agent_name": "researcher", "stop_reason": {"type": "end_turn"} } ] } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" sessionmodel "github.com/volcengine/ark-runtime-go/arkruntime/model/session" ) func main() { ctx := context.Background() client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) resp, err := client.ListSessionThreadEvents(ctx, "", "", &sessionmodel.SessionThreadsListEventsParams{ Limit: sessionmodel.NewOptInt32(50), Order: sessionmodel.NewOptListSessionsOrder(sessionmodel.ListSessionsOrderAsc), }) if err != nil { panic(err) } fmt.Println(resp) } ``` #### Response ``` { "data": [ { "id": "sevt-20260926143027-c3d4e", "type": "agent.message", "processed_at": "2026-09-26T14:30:27.045Z", "content": [{"type": "text", "text": "好的,我先按 OKR 分层梳理。"}] }, { "id": "sevt-20260926143029-e5f6g", "type": "session.thread_status_idle", "processed_at": "2026-09-26T14:30:29.220Z", "session_thread_id": "", "agent_name": "researcher", "stop_reason": {"type": "end_turn"} } ] } ``` --- # 流式获取线程事件 Source: https://ark.volcengine.com/region:cn-beijing/docs/stream-thread-events-api `GET https://ark.cn-beijing.volces.com/api/v3/sessions/{session_id}/threads/{thread_id}/stream` 通过 SSE(Server-Sent Events)协议订阅指定线程视角的实时事件。订阅主线程时,可能同时收到子线程的创建、状态变化和需要主线程处理的工具请求通知。所有事件的结构定义详情请参见 [会话事件结构参考](/docs/sessions-events-reference-v2)。 > **说明** > > - 本接口不支持断线续传。连接中断后,可通过 [获取线程事件列表](/docs/list-thread-events-api) 查询中断期间产生的事件,再重新建立流式连接。 > - 连接建立后先收到 `: ready`,随后约每 15 秒收到 `: heartbeat`。服务实例退出前可能发送 `: server draining, reconnect`,收到后应重新连接。客户端应忽略这些 SSE 注释行,并将读取超时设置为至少两个心跳周期。 > - 服务端通过 `data:` 行发送事件 JSON,可以省略显式 `event:` 行。线程进入 `idle` 不会自动关闭连接;客户端不再监听时需要主动断开。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **session_id** `string` `必选` | 会话 ID 会话 ID,形如 `sesn-...` **thread_id** `string` `必选` | 线程 ID 线程 ID,以 `sthr-` 开头 ### Query 参数 > 在 URL Query String 中传入。 **event_deltas** `array` | 流式预览事件类型 指定希望以 `event_start` 和 `event_delta` 预览的事件类型。当前支持 `agent.message` 和 `agent.thinking`;未提供时不返回预览帧 > **说明** > > 多值可重复传入(`?event_deltas=agent.message&event_deltas=agent.thinking`)或使用逗号分隔(`?event_deltas=agent.message,agent.thinking`)。未识别的值会被忽略。 ## 响应参数 ### SSE 流式响应,每个事件为一个 SessionEvent 对象,仅包含当前线程相关事件 **data** `string` | 事件 JSON 数据 服务端通过 `data:` 行返回事件 JSON。SSE 响应中可能没有 `event:` 行;这种情况下,客户端仍可按默认的 `message` 事件读取 `data:` 内容。 JSON 中的 `type` 字段表示具体的业务事件类型。 完整事件的公共字段包括 `id`、`type` 和 `processed_at`。`session_thread_id` 仅在对应事件结构中明确列出时返回,其他字段随 `type` 不同。 **event** `string` | SSE 事件类型 SSE 事件类型固定为 `message`。服务端不显式返回 `event:` 行时,SSE 客户端使用该默认值;业务事件类型从 `data.type` 读取 ## 代码示例 ## 流式获取线程事件 ### cURL #### Request ```Bash curl -sS --fail-with-body -N \ "https://ark.cn-beijing.volces.com/api/v3/sessions//threads//stream" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Accept: text/event-stream" ``` #### Response ``` : ready data: {"id":"sevt-20260715083015-a1b2c","type":"session.status_running","processed_at":"2026-07-15T08:30:15.123Z"} data: {"id":"sevt-20260715083015-b2c3d","type":"user.message","processed_at":"2026-07-15T08:30:15.130Z","content":[{"type":"text","text":"帮我梳理 Q3 目标"}]} data: {"id":"sevt-20260715083017-c3d4e","type":"agent.message","processed_at":"2026-07-15T08:30:17.045Z","session_thread_id":"","content":[{"type":"text","text":"好的,我先按 OKR 分层梳理。"}]} data: {"id":"sevt-20260715083017-d4e5f","type":"session.thread_status_idle","processed_at":"2026-07-15T08:30:17.100Z","session_thread_id":"","agent_name":"demo-agent","stop_reason":{"type":"end_turn"}} data: {"id":"sevt-20260715083017-e5f6g","type":"session.status_idle","processed_at":"2026-07-15T08:30:17.101Z","stop_reason":{"type":"end_turn"}} : heartbeat ``` ### Python #### Request ```python import os from arkruntime import Ark client = Ark( api_key=os.environ["ARK_API_KEY"], base_url="https://ark.cn-beijing.volces.com/api/v3", ) for event in client.sessions.threads.stream("", ""): print(event.data.model_dump_json(exclude_none=True, exclude_defaults=True)) if event.type in {"session.status_idle", "session.status_terminated"}: break ``` #### Response ``` {"id":"sevt-20260715083017-c3d4e","type":"agent.message","processed_at":"2026-07-15T08:30:17.045Z","session_thread_id":"","content":[{"type":"text","text":"好的,我先按 OKR 分层梳理。"}]} {"id":"sevt-20260715083017-d4e5f","type":"session.thread_status_idle","processed_at":"2026-07-15T08:30:17.100Z","session_thread_id":"","agent_name":"demo-agent","stop_reason":{"type":"end_turn"}} {"id":"sevt-20260715083017-e5f6g","type":"session.status_idle","processed_at":"2026-07-15T08:30:17.101Z","stop_reason":{"type":"end_turn"}} ``` ### Java #### Request ```java // Maven dependency: com.volcengine:ark-runtime:0.9.0 import com.volcengine.ark.runtime.service.ArkService; import okhttp3.ResponseBody; import okio.BufferedSource; import retrofit2.Response; public class Main { public static void main(String[] args) throws Exception { ArkService service = ArkService.builder() .apiKey(System.getenv("ARK_API_KEY")) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); Response response = service.streamSessionThreadEvents("", "").execute(); if (!response.isSuccessful() || response.body() == null) { throw new IllegalStateException("stream failed: " + response.code()); } try (ResponseBody body = response.body()) { BufferedSource source = body.source(); String line; while ((line = source.readUtf8Line()) != null) { if (line.startsWith("data:")) { System.out.println(line.substring(5).trim()); } if (line.contains("session.status_idle") || line.contains("session.status_terminated")) { break; } } } service.shutdownExecutor(); } } ``` #### Response ``` {"id":"sevt-20260715083017-c3d4e","type":"agent.message","processed_at":"2026-07-15T08:30:17.045Z","session_thread_id":"","content":[{"type":"text","text":"好的,我先按 OKR 分层梳理。"}]} {"id":"sevt-20260715083017-d4e5f","type":"session.thread_status_idle","processed_at":"2026-07-15T08:30:17.100Z","session_thread_id":"","agent_name":"demo-agent","stop_reason":{"type":"end_turn"}} {"id":"sevt-20260715083017-e5f6g","type":"session.status_idle","processed_at":"2026-07-15T08:30:17.101Z","stop_reason":{"type":"end_turn"}} ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" ) func main() { ctx := context.Background() client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) stream, err := client.StreamSessionThreadEvents(ctx, "", "") if err != nil { panic(err) } defer stream.Close() for stream.Next() { frame := stream.Event() fmt.Printf("%s: %s\n", frame.Type, frame.RawPayload) if frame.Type == "session.status_idle" || frame.Type == "session.status_terminated" { break } } if err := stream.Err(); err != nil { panic(err) } } ``` #### Response ``` agent.message: {"id":"sevt-20260715083017-c3d4e","type":"agent.message","processed_at":"2026-07-15T08:30:17.045Z","session_thread_id":"","content":[{"type":"text","text":"好的,我先按 OKR 分层梳理。"}]} session.thread_status_idle: {"id":"sevt-20260715083017-d4e5f","type":"session.thread_status_idle","processed_at":"2026-07-15T08:30:17.100Z","session_thread_id":"","agent_name":"demo-agent","stop_reason":{"type":"end_turn"}} session.status_idle: {"id":"sevt-20260715083017-e5f6g","type":"session.status_idle","processed_at":"2026-07-15T08:30:17.101Z","stop_reason":{"type":"end_turn"}} ``` --- # 创建保管库 Source: https://ark.volcengine.com/region:cn-beijing/docs/create-vault-api `POST https://ark.cn-beijing.volces.com/api/v3/vaults` 创建保管库,用于集中管理 Session 运行时需要使用的凭证。保管库本身不存储密文,密文保存在其中的各条凭证内。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Body 参数 **display_name** `string` `必选` | 保管库展示名 保管库的展示名称,用于在保管库列表和详情中识别该保管库。 **metadata** `object` | 自定义元数据 用于分类或关联业务信息的字符串键值对。最多 16 对;键长度为 1~64 个字符,值最长 512 个字符。 > **说明** > > 用户级凭证场景推荐使用 `external_user_id` 键存储客户产品侧的用户唯一标识,用于将保管库与终端用户建立映射。例如 `{"external_user_id": "usr_abc123"}`。 **scene** `string` `默认值 default` | 保管库场景 用于标记保管库的使用场景。 * `default`:普通业务场景。 * `dreams`:记忆整理场景。 ## 响应参数 **created_at** `string` | 创建时间 保管库的创建时间,采用 RFC 3339 格式。 **display_name** `string` | 保管库展示名 保管库的展示名称,用于识别该保管库。 **id** `string` | 保管库 ID 保管库 ID,以 `vlt-` 开头。 **type** `string` | 对象类型 表示当前对象是一个保管库。 取值固定为 `vault`。 **updated_at** `string` | 更新时间 保管库最后一次更新的时间,采用 RFC 3339 格式。 **metadata** `object` | 自定义元数据 为保管库设置的字符串键值对,可用于分类或关联业务信息。未设置时返回 `null`。 **scene** `string` | 保管库场景 保管库的使用场景。 * `default`:普通业务场景。 * `dreams`:记忆整理场景。 ## 代码示例 ## 创建保管库 ### cURL #### Request ```Bash curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/vaults" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d @- <<'EOF' { "display_name": "Agent Infra · 生产凭证", "metadata": { "team": "agent-infra", "env": "prod" } } EOF ``` #### Response ``` { "id": "vlt-01hx3z9r0w8n3p5q6s7t8v9x40", "type": "vault", "display_name": "Agent Infra · 生产凭证", "metadata": { "team": "agent-infra", "env": "prod" }, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T08:00:00Z" } ``` ### Python #### Request ```python import os from arkruntime import Ark client = Ark( api_key=os.environ["ARK_API_KEY"], base_url="https://ark.cn-beijing.volces.com/api/v3", ) vault = client.vaults.create( display_name="Agent Infra · 生产凭证", metadata={"team": "agent-infra", "env": "prod"}, ) print(vault) ``` #### Response ``` { "id": "vlt-01hx3z9r0w8n3p5q6s7t8v9x40", "type": "vault", "display_name": "Agent Infra · 生产凭证", "metadata": { "team": "agent-infra", "env": "prod" }, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T08:00:00Z" } ``` ### Java #### Request ```java // pom.xml 依赖: // // com.volcengine // ark-runtime // 0.9.0 // import com.volcengine.ark.runtime.models.vault.CreateVaultRequest; import com.volcengine.ark.runtime.models.vault.Vault; import com.volcengine.ark.runtime.service.ArkService; import java.util.HashMap; import java.util.Map; public class Main { public static void main(String[] args) throws Exception { ArkService service = ArkService.builder() .apiKey(System.getenv("ARK_API_KEY")) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); Map metadata = new HashMap<>(); metadata.put("team", "agent-infra"); metadata.put("env", "prod"); Vault vault = service.createVault( CreateVaultRequest.builder() .displayName("Agent Infra · 生产凭证") .metadata(metadata) .build()); System.out.println(vault); service.shutdownExecutor(); } } ``` #### Response ``` { "id": "vlt-01hx3z9r0w8n3p5q6s7t8v9x40", "type": "vault", "display_name": "Agent Infra · 生产凭证", "metadata": { "team": "agent-infra", "env": "prod" }, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T08:00:00Z" } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" vaultmodel "github.com/volcengine/ark-runtime-go/arkruntime/model/vault" ) func main() { ctx := context.Background() client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) vault, err := client.CreateVault(ctx, &vaultmodel.CreateVaultRequest{ DisplayName: "Agent Infra · 生产凭证", Metadata: vaultmodel.NewOptCreateVaultRequestMetadata(vaultmodel.CreateVaultRequestMetadata{ "team": "agent-infra", "env": "prod", }), }) if err != nil { panic(err) } fmt.Println(vault) } ``` #### Response ``` { "id": "vlt-01hx3z9r0w8n3p5q6s7t8v9x40", "type": "vault", "display_name": "Agent Infra · 生产凭证", "metadata": { "team": "agent-infra", "env": "prod" }, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T08:00:00Z" } ``` --- # 查询保管库列表 Source: https://ark.volcengine.com/region:cn-beijing/docs/list-vaults-api `GET https://ark.cn-beijing.volces.com/api/v3/vaults` 查询当前项目中的保管库列表,结果按创建时间降序排列。 根据响应中是否包含 `next_page` 判断是否有更多结果: * 包含 `next_page` 时,将该值原样传入下一次请求的 `page`。 * 不包含 `next_page` 时,表示没有更多结果,停止分页查询。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Query 参数 > 在 URL Query String 中传入。 **limit** `integer` `默认值 20` | 每页数量 每页返回的保管库数量。 **取值范围**:`[1, 100]` **page** `string` | 下一页标识 用于告诉服务端从上一页结束的位置继续返回数据。该值由服务端生成,不是页码。 首次请求 `GET /api/v3/vaults?limit=20` 时不传 `page`。后续翻页规则如下: * 响应返回 `"next_page": ""` 时,将该值传入下一次请求:`GET /api/v3/vaults?limit=20&page=`。 * 响应不包含 `next_page` 时,表示没有更多结果。 不要自行生成或修改该值。 **scene** `string` | 保管库场景 按保管库的使用场景过滤。省略或传空值时不过滤。 * `default`:普通业务场景。 * `dreams`:记忆整理场景。 传入其他值不会报错;没有匹配的场景时返回空列表。 ## 响应参数 **data** `object[]` | 保管库列表 查询到的保管库列表。 **created_at** `string` | 创建时间 `data.created_at` 保管库的创建时间,采用 RFC 3339 格式。 **display_name** `string` | 保管库展示名 `data.display_name` 保管库的展示名称,用于识别该保管库。 **id** `string` | 保管库 ID `data.id` 保管库 ID,以 `vlt-` 开头。 **type** `string` | 对象类型 `data.type` 表示当前对象是一个保管库。 取值固定为 `vault`。 **updated_at** `string` | 更新时间 `data.updated_at` 保管库最后一次更新的时间,采用 RFC 3339 格式。 **metadata** `object` | 自定义元数据 `data.metadata` 为保管库设置的字符串键值对,可用于分类或关联业务信息。未设置时返回 `null`。 **scene** `string` | 保管库场景 `data.scene` 保管库的使用场景。 * `default`:普通业务场景。 * `dreams`:记忆整理场景。 **next_page** `string` | 下一页标识 下一页标识。无更多数据时不返回;后续请求需将该值原样作为 `page` 传入。 ## 代码示例 ## 查询保管库列表 ### cURL #### Request ```Bash curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/vaults?limit=20" \ -H "Authorization: Bearer $ARK_API_KEY" ``` #### Response ``` { "data": [ { "id": "vlt-01hx3z9r0w8n3p5q6s7t8v9x40", "type": "vault", "display_name": "Agent Infra · 生产凭证", "metadata": { "team": "agent-infra", "env": "prod" }, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T09:00:00Z" } ], "next_page": "page_xxxxxxxx" } ``` ### Python #### Request ```python import os from arkruntime import Ark client = Ark( api_key=os.environ["ARK_API_KEY"], base_url="https://ark.cn-beijing.volces.com/api/v3", ) page = client.vaults.list(limit=20) print(page) ``` #### Response ``` { "data": [ { "id": "vlt-01hx3z9r0w8n3p5q6s7t8v9x40", "type": "vault", "display_name": "Agent Infra · 生产凭证", "metadata": { "team": "agent-infra", "env": "prod" }, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T09:00:00Z" } ], "next_page": "page_xxxxxxxx" } ``` ### Java #### Request ```java // pom.xml 依赖: // // com.volcengine // ark-runtime // 0.9.0 // import com.volcengine.ark.runtime.models.vault.ListVaultsResponse; import com.volcengine.ark.runtime.service.ArkService; public class Main { public static void main(String[] args) throws Exception { ArkService service = ArkService.builder() .apiKey(System.getenv("ARK_API_KEY")) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); ListVaultsResponse page = service.listVaults(20, null); System.out.println(page); service.shutdownExecutor(); } } ``` #### Response ``` { "data": [ { "id": "vlt-01hx3z9r0w8n3p5q6s7t8v9x40", "type": "vault", "display_name": "Agent Infra · 生产凭证", "metadata": { "team": "agent-infra", "env": "prod" }, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T09:00:00Z" } ], "next_page": "page_xxxxxxxx" } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" vaultmodel "github.com/volcengine/ark-runtime-go/arkruntime/model/vault" ) func main() { ctx := context.Background() client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) resp, err := client.ListVaults(ctx, &vaultmodel.VaultsListParams{ Limit: vaultmodel.NewOptInt32(20), }) if err != nil { panic(err) } fmt.Println(resp) } ``` #### Response ``` { "data": [ { "id": "vlt-01hx3z9r0w8n3p5q6s7t8v9x40", "type": "vault", "display_name": "Agent Infra · 生产凭证", "metadata": { "team": "agent-infra", "env": "prod" }, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T09:00:00Z" } ], "next_page": "page_xxxxxxxx" } ``` --- # 查询保管库详情 Source: https://ark.volcengine.com/region:cn-beijing/docs/get-vault-api `GET https://ark.cn-beijing.volces.com/api/v3/vaults/{vault_id}` 查询指定保管库的详细信息。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **vault_id** `string` `必选` | 保管库 ID 保管库 ID,以 `vlt-` 开头。 ## 响应参数 **created_at** `string` | 创建时间 保管库的创建时间,采用 RFC 3339 格式。 **display_name** `string` | 保管库展示名 保管库的展示名称,用于识别该保管库。 **id** `string` | 保管库 ID 保管库 ID,以 `vlt-` 开头。 **type** `string` | 对象类型 表示当前对象是一个保管库。 取值固定为 `vault`。 **updated_at** `string` | 更新时间 保管库最后一次更新的时间,采用 RFC 3339 格式。 **metadata** `object` | 自定义元数据 为保管库设置的字符串键值对,可用于分类或关联业务信息。未设置时返回 `null`。 ## 代码示例 ## 查询保管库详情 ### cURL #### Request ```Bash curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/vaults/" \ -H "Authorization: Bearer $ARK_API_KEY" ``` #### Response ``` { "id": "", "type": "vault", "display_name": "Agent Infra · 生产凭证", "metadata": { "team": "agent-infra", "env": "prod" }, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T09:00:00Z" } ``` ### Python #### Request ```python import os from arkruntime import Ark client = Ark( api_key=os.environ["ARK_API_KEY"], base_url="https://ark.cn-beijing.volces.com/api/v3", ) vault = client.vaults.retrieve("") print(vault) ``` #### Response ``` { "id": "", "type": "vault", "display_name": "Agent Infra · 生产凭证", "metadata": { "team": "agent-infra", "env": "prod" }, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T09:00:00Z" } ``` ### Java #### Request ```java // pom.xml 依赖: // // com.volcengine // ark-runtime // 0.9.0 // import com.volcengine.ark.runtime.models.vault.Vault; import com.volcengine.ark.runtime.service.ArkService; public class Main { public static void main(String[] args) throws Exception { ArkService service = ArkService.builder() .apiKey(System.getenv("ARK_API_KEY")) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); Vault vault = service.getVault(""); System.out.println(vault); service.shutdownExecutor(); } } ``` #### Response ``` { "id": "", "type": "vault", "display_name": "Agent Infra · 生产凭证", "metadata": { "team": "agent-infra", "env": "prod" }, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T09:00:00Z" } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" ) func main() { ctx := context.Background() client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) vault, err := client.GetVault(ctx, "") if err != nil { panic(err) } fmt.Println(vault) } ``` #### Response ``` { "id": "", "type": "vault", "display_name": "Agent Infra · 生产凭证", "metadata": { "team": "agent-infra", "env": "prod" }, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T09:00:00Z" } ``` --- # 更新保管库 Source: https://ark.volcengine.com/region:cn-beijing/docs/update-vault-api `POST https://ark.cn-beijing.volces.com/api/v3/vaults/{vault_id}` 更新指定保管库的展示名称或自定义元数据。请求体为空,或者只传入空的 `metadata` 对象时,服务端返回当前保管库信息,不修改数据或更新时间。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **vault_id** `string` `必选` | 保管库 ID 保管库 ID,以 `vlt-` 开头。 ### Body 参数 **display_name** `string` | 保管库展示名 保管库的展示名称,用于在保管库列表和详情中识别该保管库。省略时保留原值。 **metadata** `object` | 自定义元数据 用于分类或关联业务信息的字符串键值对: * 省略或传入空对象时,保留全部原值。 * 提供非空值时,新增或覆盖对应键。 * 值为空字符串时,删除对应键。 更新后最多 16 对;键长度为 1~64 个字符,值最长 512 个字符。 ## 响应参数 **created_at** `string` | 创建时间 保管库的创建时间,采用 RFC 3339 格式。 **display_name** `string` | 保管库展示名 保管库的展示名称,用于识别该保管库。 **id** `string` | 保管库 ID 保管库 ID,以 `vlt-` 开头。 **type** `string` | 对象类型 表示当前对象是一个保管库。 取值固定为 `vault`。 **updated_at** `string` | 更新时间 保管库最后一次更新的时间,采用 RFC 3339 格式。 **metadata** `object` | 自定义元数据 为保管库设置的字符串键值对,可用于分类或关联业务信息。未设置时返回 `null`。 ## 代码示例 ## 更新保管库 ### cURL #### Request ```Bash curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/vaults/" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d @- <<'EOF' { "display_name": "Agent Infra · 生产凭证 (2026H2)", "metadata": { "env": "prod", "review_cycle": "2026H2" } } EOF ``` #### Response ``` { "id": "", "type": "vault", "display_name": "Agent Infra · 生产凭证 (2026H2)", "metadata": { "team": "agent-infra", "env": "prod", "review_cycle": "2026H2" }, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T10:00:00Z" } ``` ### Python #### Request ```python import os from arkruntime import Ark client = Ark( api_key=os.environ["ARK_API_KEY"], base_url="https://ark.cn-beijing.volces.com/api/v3", ) vault = client.vaults.update( "", display_name="Agent Infra · 生产凭证 (2026H2)", metadata={"env": "prod", "review_cycle": "2026H2"}, ) print(vault) ``` #### Response ``` { "id": "", "type": "vault", "display_name": "Agent Infra · 生产凭证 (2026H2)", "metadata": { "team": "agent-infra", "env": "prod", "review_cycle": "2026H2" }, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T10:00:00Z" } ``` ### Java #### Request ```java // pom.xml 依赖: // // com.volcengine // ark-runtime // 0.9.0 // import com.volcengine.ark.runtime.models.vault.UpdateVaultRequest; import com.volcengine.ark.runtime.models.vault.Vault; import com.volcengine.ark.runtime.service.ArkService; import java.util.HashMap; import java.util.Map; public class Main { public static void main(String[] args) throws Exception { ArkService service = ArkService.builder() .apiKey(System.getenv("ARK_API_KEY")) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); Map metadata = new HashMap<>(); metadata.put("env", "prod"); metadata.put("review_cycle", "2026H2"); Vault vault = service.updateVault( "", UpdateVaultRequest.builder() .displayName("Agent Infra · 生产凭证 (2026H2)") .metadata(metadata) .build()); System.out.println(vault); service.shutdownExecutor(); } } ``` #### Response ``` { "id": "", "type": "vault", "display_name": "Agent Infra · 生产凭证 (2026H2)", "metadata": { "team": "agent-infra", "env": "prod", "review_cycle": "2026H2" }, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T10:00:00Z" } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" vaultmodel "github.com/volcengine/ark-runtime-go/arkruntime/model/vault" ) func main() { ctx := context.Background() client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) vault, err := client.UpdateVault(ctx, "", &vaultmodel.UpdateVaultRequest{ DisplayName: vaultmodel.NewOptString("Agent Infra · 生产凭证 (2026H2)"), Metadata: vaultmodel.NewOptUpdateVaultRequestMetadata( vaultmodel.UpdateVaultRequestMetadata{ "env": "prod", "review_cycle": "2026H2", }, ), }) if err != nil { panic(err) } fmt.Println(vault) } ``` #### Response ``` { "id": "", "type": "vault", "display_name": "Agent Infra · 生产凭证 (2026H2)", "metadata": { "team": "agent-infra", "env": "prod", "review_cycle": "2026H2" }, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T10:00:00Z" } ``` --- # 删除保管库 Source: https://ark.volcengine.com/region:cn-beijing/docs/delete-vault-api `DELETE https://ark.cn-beijing.volces.com/api/v3/vaults/{vault_id}` 删除指定保管库及其中的全部凭证。 > **警告** > > 删除保管库会同时删除其中的全部凭证。 > > 删除后无法恢复保管库或凭证,后续运行也无法再使用这些凭证。 > > 删除前,确认业务不再使用该保管库。 保管库仍被 `running` 状态的 Session 引用时,返回 HTTP 409 `Conflict`。请先中断相关 Session 并等待其不再处于 `running` 状态,或等待本轮对话运行结束后重试。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **vault_id** `string` `必选` | 保管库 ID 保管库 ID,以 `vlt-` 开头。 ## 响应参数 **id** `string` | 保管库 ID 已删除的保管库 ID,以 `vlt-` 开头,与路径参数中的值相同。 **type** `string` | 对象类型 表示当前对象是一个已删除的保管库记录。 取值固定为 `vault_deleted`。 ## 代码示例 ## 删除保管库 ### cURL #### Request ```Bash curl -sS --fail-with-body -X DELETE "https://ark.cn-beijing.volces.com/api/v3/vaults/" \ -H "Authorization: Bearer $ARK_API_KEY" ``` #### Response ``` { "id": "vlt-example", "type": "vault_deleted" } ``` ### Python #### Request ```python import os from arkruntime import Ark client = Ark( api_key=os.environ["ARK_API_KEY"], base_url="https://ark.cn-beijing.volces.com/api/v3", ) response = client.vaults.delete("") print(response) ``` #### Response ``` { "id": "vlt-example", "type": "vault_deleted" } ``` ### Java #### Request ```java // pom.xml 依赖: // // com.volcengine // ark-runtime // 0.9.0 // import com.volcengine.ark.runtime.service.ArkService; public class Main { public static void main(String[] args) throws Exception { ArkService service = ArkService.builder() .apiKey(System.getenv("ARK_API_KEY")) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); Object response = service.deleteVault(""); System.out.println(response); service.shutdownExecutor(); } } ``` #### Response ``` { "id": "vlt-example", "type": "vault_deleted" } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" ) func main() { ctx := context.Background() client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) response, err := client.DeleteVault(ctx, "") if err != nil { panic(err) } fmt.Println(response) } ``` #### Response ``` { "id": "vlt-example", "type": "vault_deleted" } ``` --- # 创建凭证 Source: https://ark.volcengine.com/region:cn-beijing/docs/create-credential-api `POST https://ark.cn-beijing.volces.com/api/v3/vaults/{vault_id}/credentials` 在指定保管库中创建凭证。创建成功后,可通过返回的凭证 ID 查询、更新或删除该凭证。 每个保管库最多包含 100 条凭证,超出时返回 HTTP 409 `Conflict`。 通过 `auth.type` 选择鉴权方式: * `mcp_oauth`:使用 OAuth 访问令牌连接 MCP 服务。 * `static_bearer`:使用静态 Bearer 令牌连接 MCP 服务。 * `mcp_static`:将静态密钥注入 MCP 请求,支持请求头或查询参数等注入位置。 * `environment_variable`:通过环境变量向运行环境注入凭证。 * `env_oauth`:使用 OAuth 访问令牌,并通过环境变量向运行环境注入该令牌。 响应不返回以下密文字段:`access_token`、`token`、`secret_value`、`refresh_token` 和 `client_secret`。 本接口不支持幂等键,服务端不会自动识别或合并重复的创建请求。 如果创建请求超时,请先查询凭证列表,确认目标凭证是否已经创建,再决定是否重试。直接重试相同目标的创建请求会返回 HTTP 409 `Conflict`,且响应不包含已有凭证 ID。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **vault_id** `string` `必选` | 保管库 ID 保管库 ID,以 `vlt-` 开头。 ### Body 参数 **auth** `object` `必选` | 鉴权配置 用于配置凭证的鉴权方式。根据 `type` 的值填写对应字段。 > **注意** > > 创建 `mcp_oauth`、`static_bearer` 或 `mcp_static` 凭证时,服务端会同步访问目标 MCP 服务: > > * 返回内容不符合 MCP 协议时,返回 HTTP 424 `MCPInvalidResponse`。 > * MCP 服务返回 5xx 或连接异常时,返回 HTTP 424 `UpstreamUnavailable`。 > * 校验失败时,不创建凭证。 > > 同一保管库中的 MCP 凭证不能使用相同的 `mcp_server_url`,重复时返回 HTTP 409 `Conflict`。 MCP OAuth 凭证 `object` 调用方提供 OAuth 访问令牌和 MCP 服务地址,用于连接指定的 MCP 服务。 提供 `expires_at` 和 `refresh` 后,服务端在 Session 使用该凭据时自动刷新访问令牌。 **access_token** `string` `必选` | 访问令牌 `auth.access_token` 用于访问 MCP 服务的 OAuth 访问令牌。 **mcp_server_url** `string` `必选` | MCP 服务器 URL `auth.mcp_server_url` MCP 服务的访问地址。 * 必须使用 HTTPS,不能包含用户信息,也不能指向本地或私有网络地址。 * URL 中 `#` 后的片段不参与请求,服务端保存时会移除该片段。 * 创建后不可修改。 **type** `string` `必选` | 鉴权类型 `auth.type` 选择使用 OAuth 访问令牌连接 MCP 服务。 取值固定为 `mcp_oauth`。 **expires_at** `string` | 过期时间 `auth.expires_at` 访问令牌的过期时间,采用 RFC 3339 格式。启用自动刷新时,与 `refresh` 一起提供;省略时,服务端无法判断主动刷新时机。 **refresh** `object` | 访问令牌刷新 `auth.refresh` 用于在 Session 使用该凭据且访问令牌进入 `expires_at` 前 5 分钟刷新窗口时自动获取新令牌。 必须与 `expires_at` 同时配置。省略 `refresh` 时,服务端不会自动刷新访问令牌。 **client_id** `string` | 客户端 ID `auth.refresh.client_id` 向 OAuth 令牌端点请求访问令牌时使用的客户端 ID。请求中包含 `refresh` 时必填。 **refresh_token** `string` | 刷新令牌 `auth.refresh.refresh_token` 用于向 OAuth 令牌端点获取新访问令牌的刷新令牌。请求中包含 `refresh` 时必填。 **resource** `string` | 资源标识 `auth.refresh.resource` OAuth 授权请求对应的资源标识。 **scope** `string` | 授权范围 `auth.refresh.scope` OAuth 服务支持的授权范围。 * 多个范围通常使用空格分隔,例如 `read write`。 * 具体取值以 OAuth 服务提供方为准。 * 省略时,服务端刷新令牌时不传入 `scope`。 **token_endpoint** `string` | OAuth 令牌端点 `auth.refresh.token_endpoint` 用于刷新访问令牌的 OAuth 端点地址。请求中包含 `refresh` 时必填。 **token_endpoint_auth** `object` | OAuth 客户端鉴权 `auth.refresh.token_endpoint_auth` 服务端向 OAuth 令牌端点提交刷新请求时使用的客户端鉴权配置。 **type** `string` `必选` | 鉴权方式 `auth.refresh.token_endpoint_auth.type` 服务端向 OAuth 令牌端点提交刷新请求时使用的客户端鉴权方式: * `none`:仅提交 `client_id`,不使用客户端密钥。 * `client_secret_basic`:通过 HTTP Basic Authentication 提交 `client_id` 和 `client_secret`。 * `client_secret_post`:在请求体中提交 `client_id` 和 `client_secret`。 **client_secret** `string` | 客户端密钥 `auth.refresh.token_endpoint_auth.client_secret` OAuth 客户端密钥。 * `type` 为 `client_secret_basic` 或 `client_secret_post` 时必填。 * `type` 为 `none` 时必须省略。 静态 Bearer 令牌凭证 `object` 调用方提供静态 Bearer 令牌,用于连接指定的 MCP 服务。 **mcp_server_url** `string` `必选` | MCP 服务器 URL `auth.mcp_server_url` MCP 服务的访问地址。 * 必须使用 HTTPS,不能包含用户信息,也不能指向本地或私有网络地址。 * URL 中 `#` 后的片段不参与请求,服务端保存时会移除该片段。 * 创建后不可修改。 **token** `string` `必选` | Bearer 令牌 `auth.token` 用于访问 MCP 服务的静态 Bearer 令牌。 **type** `string` `必选` | 鉴权类型 `auth.type` 选择使用静态 Bearer 令牌连接 MCP 服务。 取值固定为 `static_bearer`。 MCP 静态凭证 `object` 调用方提供静态密钥及其注入方式,用于鉴权发往指定 MCP 服务的请求。 **mcp_server_url** `string` `必选` | MCP 服务器 URL `auth.mcp_server_url` MCP 服务的访问地址。 * 必须使用 HTTPS,不能包含用户信息,也不能指向本地或私有网络地址。 * URL 中 `#` 后的片段不参与请求,服务端保存时会移除该片段。 * 创建后不可修改。 **token** `string` `必选` | 密钥值 `auth.token` 注入 MCP 请求的静态密钥。 不要包含 `Bearer ` 前缀;`injection_type` 为 `bearer` 时,请求头使用 `Authorization: Bearer `。 **type** `string` `必选` | 鉴权类型 `auth.type` 选择将静态密钥注入 MCP 请求。通过 `injection_type` 指定请求头或查询参数等注入位置。 取值固定为 `mcp_static`。 **injection_name** `string` | 注入名 `auth.injection_name` 自定义请求头名称或查询参数名。 * `injection_type` 为 `header` 时,必须传入该字段。请求头名称必须符合 HTTP token 规则,且不能使用 `Authorization`、`Host`、`Content-Length`、`Cookie` 或 `Proxy-Authorization`;传入这些名称会返回 HTTP 400 `InvalidParameter`。 * `injection_type` 为 `query` 时,必须传入该字段。该字段必须是单个参数名,不能包含 `?`、`&` 或 `=`。 * `injection_type` 为 `bearer` 时,不能传入该字段。 **injection_type** `string` `默认值 bearer` | 注入方式 `auth.injection_type` 密钥注入到出向 MCP 请求的方式: * `bearer`:使用 `Authorization: Bearer `,且不能传入 `injection_name`。 * `header`:使用 `injection_name` 指定的自定义请求头名称。 * `query`:使用 `injection_name` 指定的 URL 查询参数名。 环境变量注入凭证 `object` 调用方提供环境变量名、凭证值和网络范围,用于向运行环境注入凭证。 **networking** `object` `必选` | 网络范围 `auth.networking` 控制凭证可以注入的目标主机范围。 **type** `string` `必选` | 网络范围类型 `auth.networking.type` 控制凭证可以注入的目标主机范围: * `unrestricted`:可以注入发往任意公网主机的请求。 * `limited`:仅可以注入发往 `allowed_hosts` 所列主机的请求。 **allowed_hosts** `string[]` | 允许主机列表 `auth.networking.allowed_hosts` `type` 为 `limited` 时必填,包含 1~16 个允许注入凭证的公网主机。 每项填写纯域名、通配域名或公网 IPv4 地址,例如 `api.example.com`、`*.example.com` 或 `192.0.2.1`。 不支持 URL、端口、路径、IPv6 地址或内网地址。`type` 为 `unrestricted` 时必须省略该字段。 **secret_name** `string` `必选` | 环境变量名 `auth.secret_name` 向运行环境注入凭证时使用的环境变量名。名称必须匹配 `^[A-Za-z_][A-Za-z0-9_]*$`。 名称在当前保管库内必须唯一,重复时返回 HTTP 409 `Conflict`。创建后不可修改。 **secret_value** `string` `必选` | 环境变量值 `auth.secret_value` 向运行环境注入的凭证值,不能为空,最大为 4096 字节。 **type** `string` `必选` | 鉴权类型 `auth.type` 选择通过环境变量向运行环境注入凭证。 取值固定为 `environment_variable`。 环境 OAuth 凭证 `object` 调用方提供 OAuth 访问令牌、环境变量名和网络范围,用于向运行环境注入令牌。 提供 `expires_at` 和 `refresh` 后,服务端在 Session 使用该凭据时自动刷新访问令牌。 **access_token** `string` `必选` | 访问令牌 `auth.access_token` 向运行环境注入并用于目标服务鉴权的 OAuth 访问令牌。 **networking** `object` `必选` | 网络范围 `auth.networking` 控制访问令牌可以注入的目标主机范围。 **type** `string` `必选` | 网络范围类型 `auth.networking.type` 控制凭证可以注入的目标主机范围: * `unrestricted`:可以注入发往任意公网主机的请求。 * `limited`:仅可以注入发往 `allowed_hosts` 所列主机的请求。 **allowed_hosts** `string[]` | 允许主机列表 `auth.networking.allowed_hosts` `type` 为 `limited` 时必填,包含 1~16 个允许注入凭证的公网主机。 每项填写纯域名、通配域名或公网 IPv4 地址,例如 `api.example.com`、`*.example.com` 或 `192.0.2.1`。 不支持 URL、端口、路径、IPv6 地址或内网地址。`type` 为 `unrestricted` 时必须省略该字段。 **secret_name** `string` `必选` | 环境变量名 `auth.secret_name` 向运行环境注入访问令牌时使用的环境变量名。名称必须匹配 `^[A-Za-z_][A-Za-z0-9_]*$`。 名称在当前保管库内必须唯一,重复时返回 HTTP 409 `Conflict`。创建后不可修改。 **type** `string` `必选` | 鉴权类型 `auth.type` 选择使用 OAuth 访问令牌,并通过环境变量向运行环境注入该令牌。 取值固定为 `env_oauth`。 **expires_at** `string` | 过期时间 `auth.expires_at` 访问令牌的过期时间,采用 RFC 3339 格式。启用自动刷新时,与 `refresh` 一起提供;省略时,服务端无法判断主动刷新时机。 **refresh** `object` | 访问令牌刷新 `auth.refresh` 用于在 Session 使用该凭据且访问令牌进入 `expires_at` 前 5 分钟刷新窗口时自动获取新令牌。 启用自动刷新时,与 `expires_at` 一起提供;省略时,服务端不会自动刷新访问令牌。 **client_id** `string` | 客户端 ID `auth.refresh.client_id` 向 OAuth 令牌端点请求访问令牌时使用的客户端 ID。请求中包含 `refresh` 时必填。 **refresh_token** `string` | 刷新令牌 `auth.refresh.refresh_token` 用于向 OAuth 令牌端点获取新访问令牌的刷新令牌。请求中包含 `refresh` 时必填。 **resource** `string` | 资源标识 `auth.refresh.resource` OAuth 授权请求对应的资源标识。 **scope** `string` | 授权范围 `auth.refresh.scope` OAuth 服务支持的授权范围。 * 多个范围通常使用空格分隔,例如 `read write`。 * 具体取值以 OAuth 服务提供方为准。 * 省略时,服务端刷新令牌时不传入 `scope`。 **token_endpoint** `string` | OAuth 令牌端点 `auth.refresh.token_endpoint` 用于刷新访问令牌的 OAuth 端点地址。请求中包含 `refresh` 时必填。 **token_endpoint_auth** `object` | OAuth 客户端鉴权 `auth.refresh.token_endpoint_auth` 服务端向 OAuth 令牌端点提交刷新请求时使用的客户端鉴权配置。 **type** `string` `必选` | 鉴权方式 `auth.refresh.token_endpoint_auth.type` 服务端向 OAuth 令牌端点提交刷新请求时使用的客户端鉴权方式: * `none`:仅提交 `client_id`,不使用客户端密钥。 * `client_secret_basic`:通过 HTTP Basic Authentication 提交 `client_id` 和 `client_secret`。 * `client_secret_post`:在请求体中提交 `client_id` 和 `client_secret`。 **client_secret** `string` | 客户端密钥 `auth.refresh.token_endpoint_auth.client_secret` OAuth 客户端密钥。 * `type` 为 `client_secret_basic` 或 `client_secret_post` 时必填。 * `type` 为 `none` 时必须省略。 **display_name** `string` `必选` | 凭证展示名 凭证的展示名称,用于在凭证列表和详情中识别该凭证。 **metadata** `object` | 自定义元数据 用于分类或关联业务信息的字符串键值对。创建时保存本次提供的完整对象,最多 16 对;键长度为 1~64 个字符,值最长 512 个字符。 ## 响应参数 **auth** `object` | 鉴权配置 凭证的鉴权方式及可公开返回的配置。字段结构由 `type` 决定,响应只返回与 `type` 匹配的一种结构。 MCP OAuth 凭证 `object` 服务端返回 MCP OAuth 凭证的鉴权类型和 MCP 服务地址。配置自动刷新时,还返回访问令牌过期时间和用于刷新访问令牌的字段。 响应不返回访问令牌、刷新令牌或客户端密钥。 **mcp_server_url** `string` | MCP 服务器 URL `auth.mcp_server_url` MCP 服务的访问地址。 **type** `string` | 鉴权类型 `auth.type` 表示该凭证使用 OAuth 访问令牌连接 MCP 服务。 取值固定为 `mcp_oauth`。 **expires_at** `string` | 过期时间 `auth.expires_at` 访问令牌的过期时间,采用 RFC 3339 格式。Session 使用该凭据且访问令牌进入 5 分钟刷新窗口时,服务端尝试自动刷新。 **refresh** `object` | 访问令牌刷新 `auth.refresh` 服务端返回用于刷新访问令牌的字段,不返回刷新令牌或客户端密钥。 **client_id** `string` | 客户端 ID `auth.refresh.client_id` 向 OAuth 令牌端点请求访问令牌时使用的客户端 ID。 **resource** `string` | 资源标识 `auth.refresh.resource` OAuth 授权请求对应的资源标识。 **scope** `string` | 授权范围 `auth.refresh.scope` OAuth 令牌允许访问的权限范围。 **token_endpoint** `string` | OAuth 令牌端点 `auth.refresh.token_endpoint` 用于刷新访问令牌的 OAuth 端点地址。 **token_endpoint_auth** `object` | OAuth 客户端鉴权 `auth.refresh.token_endpoint_auth` 服务端向 OAuth 令牌端点提交刷新请求时使用的客户端鉴权配置。 **type** `string` | 鉴权方式 `auth.refresh.token_endpoint_auth.type` 服务端向 OAuth 令牌端点提交刷新请求时使用的客户端鉴权方式: * `none`:仅提交 `client_id`,不使用客户端密钥。 * `client_secret_basic`:通过 HTTP Basic Authentication 提交客户端信息。 * `client_secret_post`:在请求体中提交客户端信息。 静态 Bearer 令牌凭证 `object` 服务端返回静态 Bearer 令牌凭证的公开配置,不返回令牌。 **mcp_server_url** `string` | MCP 服务器 URL `auth.mcp_server_url` MCP 服务的访问地址。 **type** `string` | 鉴权类型 `auth.type` 表示该凭证使用静态 Bearer 令牌连接 MCP 服务。 取值固定为 `static_bearer`。 MCP 静态凭证 `object` 服务端返回 MCP 静态凭证的公开注入配置,不返回密钥值。 **injection_type** `string` | 注入方式 `auth.injection_type` 服务端返回的密钥注入方式: * `bearer`:通过 `Authorization: Bearer ` 请求头注入。 * `header`:通过 `injection_name` 指定的自定义请求头注入。 * `query`:通过 `injection_name` 指定的 URL 查询参数注入。 **mcp_server_url** `string` | MCP 服务器 URL `auth.mcp_server_url` MCP 服务的访问地址。 **type** `string` | 鉴权类型 `auth.type` 表示该凭证会将静态密钥注入 MCP 请求,注入位置由 `injection_type` 指定。 取值固定为 `mcp_static`。 **injection_name** `string` | 注入名 `auth.injection_name` 自定义请求头名称或查询参数名。`injection_type` 为 `header` 或 `query` 时返回该字段;`injection_type` 为 `bearer` 时不返回。 环境变量注入凭证 `object` 服务端返回环境变量凭证的公开注入配置,不返回环境变量值。 **networking** `object` | 网络范围 `auth.networking` 凭证可注入的目标主机范围。 **type** `string` | 网络范围类型 `auth.networking.type` 凭证的目标主机范围: * `unrestricted`:可以注入发往任意公网主机的请求。 * `limited`:仅可以注入发往 `allowed_hosts` 所列主机的请求。 **allowed_hosts** `string[]` | 允许主机列表 `auth.networking.allowed_hosts` `type` 为 `limited` 时返回允许注入凭证的公网主机列表,每项为纯域名、通配域名或公网 IPv4 地址。`type` 为 `unrestricted` 时不返回。 **secret_name** `string` | 环境变量名 `auth.secret_name` 向运行环境注入凭证时使用的环境变量名。 **type** `string` | 鉴权类型 `auth.type` 表示该凭证通过环境变量向运行环境注入凭证。 取值固定为 `environment_variable`。 环境 OAuth 凭证 `object` 服务端返回环境 OAuth 凭证的鉴权类型、环境变量名和网络范围。配置自动刷新时,还返回访问令牌过期时间和用于刷新访问令牌的字段。 响应不返回访问令牌、刷新令牌或客户端密钥。 **networking** `object` | 网络范围 `auth.networking` 访问令牌可注入的目标主机范围。 **type** `string` | 网络范围类型 `auth.networking.type` 凭证的目标主机范围: * `unrestricted`:可以注入发往任意公网主机的请求。 * `limited`:仅可以注入发往 `allowed_hosts` 所列主机的请求。 **allowed_hosts** `string[]` | 允许主机列表 `auth.networking.allowed_hosts` `type` 为 `limited` 时返回允许注入凭证的公网主机列表,每项为纯域名、通配域名或公网 IPv4 地址。`type` 为 `unrestricted` 时不返回。 **secret_name** `string` | 环境变量名 `auth.secret_name` 向运行环境注入访问令牌时使用的环境变量名。 **type** `string` | 鉴权类型 `auth.type` 表示该凭证使用 OAuth 访问令牌,并通过环境变量向运行环境注入该令牌。 取值固定为 `env_oauth`。 **expires_at** `string` | 过期时间 `auth.expires_at` 访问令牌的过期时间,采用 RFC 3339 格式。Session 使用该凭据且访问令牌进入 5 分钟刷新窗口时,服务端尝试自动刷新。 **refresh** `object` | 访问令牌刷新 `auth.refresh` 服务端返回用于刷新访问令牌的字段,不返回刷新令牌或客户端密钥。 **client_id** `string` | 客户端 ID `auth.refresh.client_id` 向 OAuth 令牌端点请求访问令牌时使用的客户端 ID。 **resource** `string` | 资源标识 `auth.refresh.resource` OAuth 授权请求对应的资源标识。 **scope** `string` | 授权范围 `auth.refresh.scope` OAuth 令牌允许访问的权限范围。 **token_endpoint** `string` | OAuth 令牌端点 `auth.refresh.token_endpoint` 用于刷新访问令牌的 OAuth 端点地址。 **token_endpoint_auth** `object` | OAuth 客户端鉴权 `auth.refresh.token_endpoint_auth` 服务端向 OAuth 令牌端点提交刷新请求时使用的客户端鉴权配置。 **type** `string` | 鉴权方式 `auth.refresh.token_endpoint_auth.type` 服务端向 OAuth 令牌端点提交刷新请求时使用的客户端鉴权方式: * `none`:仅提交 `client_id`,不使用客户端密钥。 * `client_secret_basic`:通过 HTTP Basic Authentication 提交客户端信息。 * `client_secret_post`:在请求体中提交客户端信息。 **created_at** `string` | 创建时间 凭证的创建时间,采用 RFC 3339 格式。 **id** `string` | 凭证 ID 凭证 ID,以 `vcrd-` 开头。 **type** `string` | 对象类型 表示当前对象是一条保管库凭证。 取值固定为 `vault_credential`。 **updated_at** `string` | 更新时间 凭证最后一次更新的时间,采用 RFC 3339 格式。 **vault_id** `string` | 保管库 ID 凭证所属的保管库 ID,以 `vlt-` 开头。 **display_name** `string` | 凭证展示名 凭证的展示名称,用于识别该凭证。 **metadata** `object` | 自定义元数据 为凭证设置的字符串键值对,可用于分类或关联业务信息。 ## 代码示例 ## 创建凭证 ### cURL #### Request ```Bash curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/vaults//credentials" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d @- <<'EOF' { "display_name": "GitHub 只读 MCP", "auth": { "type": "static_bearer", "mcp_server_url": "", "token": "" }, "metadata": { "team": "agent-infra" } } EOF ``` #### Response ``` { "id": "vcrd-example", "type": "vault_credential", "vault_id": "vlt-example", "display_name": "GitHub 只读 MCP", "auth": { "type": "static_bearer", "mcp_server_url": "" }, "metadata": { "team": "agent-infra" }, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T08:00:00Z" } ``` ### Python #### Request ```python import os from arkruntime import Ark client = Ark( api_key=os.environ["ARK_API_KEY"], base_url="https://ark.cn-beijing.volces.com/api/v3", ) credential = client.vaults.credentials.create( "", display_name="GitHub 只读 MCP", auth={ "type": "static_bearer", "mcp_server_url": "", "token": "", }, metadata={"team": "agent-infra"}, ) print(credential) ``` #### Response ``` { "id": "vcrd-example", "type": "vault_credential", "vault_id": "vlt-example", "display_name": "GitHub 只读 MCP", "auth": { "type": "static_bearer", "mcp_server_url": "" }, "metadata": { "team": "agent-infra" }, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T08:00:00Z" } ``` ### Java #### Request ```java // pom.xml 依赖: // // com.volcengine // ark-runtime // 0.9.0 // import com.volcengine.ark.runtime.models.vault.CreateCredentialRequest; import com.volcengine.ark.runtime.models.vault.Credential; import com.volcengine.ark.runtime.models.vault.CredentialAuth; import com.volcengine.ark.runtime.models.vault.CredentialAuthType; import com.volcengine.ark.runtime.service.ArkService; import java.util.Collections; public class Main { public static void main(String[] args) throws Exception { ArkService service = ArkService.builder() .apiKey(System.getenv("ARK_API_KEY")) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); Credential credential = service.createCredential( "", CreateCredentialRequest.builder() .displayName("GitHub 只读 MCP") .metadata(Collections.singletonMap("team", "agent-infra")) .auth(CredentialAuth.builder() .type(CredentialAuthType.STATIC_BEARER) .mcpServerUrl("") .token("") .build()) .build()); System.out.println(credential); service.shutdownExecutor(); } } ``` #### Response ``` { "id": "vcrd-example", "type": "vault_credential", "vault_id": "vlt-example", "display_name": "GitHub 只读 MCP", "auth": { "type": "static_bearer", "mcp_server_url": "" }, "metadata": { "team": "agent-infra" }, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T08:00:00Z" } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" vaultmodel "github.com/volcengine/ark-runtime-go/arkruntime/model/vault" ) func main() { ctx := context.Background() client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) cred, err := client.CreateCredential(ctx, "", &vaultmodel.CreateCredentialRequest{ DisplayName: vaultmodel.NewOptString("GitHub 只读 MCP"), Metadata: vaultmodel.NewOptCreateCredentialRequestMetadata( vaultmodel.CreateCredentialRequestMetadata{"team": "agent-infra"}, ), Auth: vaultmodel.CredentialAuth{ Type: vaultmodel.CredentialAuthTypeStaticBearer, McpServerURL: vaultmodel.NewOptString(""), Token: vaultmodel.NewOptString(""), }, }) if err != nil { panic(err) } fmt.Println(cred) } ``` #### Response ``` { "id": "vcrd-example", "type": "vault_credential", "vault_id": "vlt-example", "display_name": "GitHub 只读 MCP", "auth": { "type": "static_bearer", "mcp_server_url": "" }, "metadata": { "team": "agent-infra" }, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T08:00:00Z" } ``` --- # 查询凭证列表 Source: https://ark.volcengine.com/region:cn-beijing/docs/list-credentials-api `GET https://ark.cn-beijing.volces.com/api/v3/vaults/{vault_id}/credentials` 查询指定保管库中的凭证列表。结果按创建时间降序排列。 需要继续查询时,将响应中的 `next_page` 原样传入下一次请求的 `page`。响应不包含 `next_page` 时,表示没有更多结果。 已配置自动刷新的 OAuth 凭证会返回访问令牌过期时间和用于刷新访问令牌的非敏感字段。响应不返回以下密文字段:`access_token`、`token`、`secret_value`、`refresh_token` 和 `client_secret`。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **vault_id** `string` `必选` | 保管库 ID 保管库 ID,以 `vlt-` 开头。 ### Query 参数 > 在 URL Query String 中传入。 **limit** `integer` `默认值 20` | 每页数量 每页返回的凭证数量。 **取值范围**:`[1, 100]` **page** `string` | 下一页标识 用于告诉服务端从上一页结束的位置继续返回数据。该值由服务端生成,不是页码。 首次请求 `GET /api/v3/vaults//credentials?limit=20` 时不传 `page`。后续翻页规则如下: * 响应返回 `"next_page": ""` 时,将该值传入下一次请求:`GET /api/v3/vaults//credentials?limit=20&page=`。 * 响应不包含 `next_page` 时,表示没有更多结果。 不要自行生成或修改该值。 ## 响应参数 **data** `object[]` | 凭证列表 查询到的凭证列表。 **auth** `object` | 鉴权配置 `data.auth` 凭证的鉴权方式及可公开返回的配置。字段结构由 `type` 决定,响应只返回与 `type` 匹配的一种结构。 MCP OAuth 凭证 `object` 服务端返回 MCP OAuth 凭证的鉴权类型和 MCP 服务地址。配置自动刷新时,还返回访问令牌过期时间和用于刷新访问令牌的字段。 响应不返回访问令牌、刷新令牌或客户端密钥。 **mcp_server_url** `string` | MCP 服务器 URL `data.auth.mcp_server_url` MCP 服务的访问地址。 **type** `string` | 鉴权类型 `data.auth.type` 表示该凭证使用 OAuth 访问令牌连接 MCP 服务。 取值固定为 `mcp_oauth`。 **expires_at** `string` | 过期时间 `data.auth.expires_at` 访问令牌的过期时间,采用 RFC 3339 格式。Session 使用该凭据且访问令牌进入 5 分钟刷新窗口时,服务端尝试自动刷新。 **refresh** `object` | 访问令牌刷新 `data.auth.refresh` 服务端返回用于刷新访问令牌的字段,不返回刷新令牌或客户端密钥。 **client_id** `string` | 客户端 ID `data.auth.refresh.client_id` 向 OAuth 令牌端点请求访问令牌时使用的客户端 ID。 **resource** `string` | 资源标识 `data.auth.refresh.resource` OAuth 授权请求对应的资源标识。 **scope** `string` | 授权范围 `data.auth.refresh.scope` OAuth 令牌允许访问的权限范围。 **token_endpoint** `string` | OAuth 令牌端点 `data.auth.refresh.token_endpoint` 用于刷新访问令牌的 OAuth 端点地址。 **token_endpoint_auth** `object` | OAuth 客户端鉴权 `data.auth.refresh.token_endpoint_auth` 服务端向 OAuth 令牌端点提交刷新请求时使用的客户端鉴权配置。 **type** `string` | 鉴权方式 `data.auth.refresh.token_endpoint_auth.type` 服务端向 OAuth 令牌端点提交刷新请求时使用的客户端鉴权方式: * `none`:仅提交 `client_id`,不使用客户端密钥。 * `client_secret_basic`:通过 HTTP Basic Authentication 提交客户端信息。 * `client_secret_post`:在请求体中提交客户端信息。 静态 Bearer 令牌凭证 `object` 服务端返回静态 Bearer 令牌凭证的公开配置,不返回令牌。 **mcp_server_url** `string` | MCP 服务器 URL `data.auth.mcp_server_url` MCP 服务的访问地址。 **type** `string` | 鉴权类型 `data.auth.type` 表示该凭证使用静态 Bearer 令牌连接 MCP 服务。 取值固定为 `static_bearer`。 MCP 静态凭证 `object` 服务端返回 MCP 静态凭证的公开注入配置,不返回密钥值。 **injection_type** `string` | 注入方式 `data.auth.injection_type` 服务端返回的密钥注入方式: * `bearer`:通过 `Authorization: Bearer ` 请求头注入。 * `header`:通过 `injection_name` 指定的自定义请求头注入。 * `query`:通过 `injection_name` 指定的 URL 查询参数注入。 **mcp_server_url** `string` | MCP 服务器 URL `data.auth.mcp_server_url` MCP 服务的访问地址。 **type** `string` | 鉴权类型 `data.auth.type` 表示该凭证会将静态密钥注入 MCP 请求,注入位置由 `injection_type` 指定。 取值固定为 `mcp_static`。 **injection_name** `string` | 注入名 `data.auth.injection_name` 自定义请求头名称或查询参数名。`injection_type` 为 `header` 或 `query` 时返回该字段;`injection_type` 为 `bearer` 时不返回。 环境变量注入凭证 `object` 服务端返回环境变量凭证的公开注入配置,不返回环境变量值。 **networking** `object` | 网络范围 `data.auth.networking` 凭证可注入的目标主机范围。 **type** `string` | 网络范围类型 `data.auth.networking.type` 凭证的目标主机范围: * `unrestricted`:可以注入发往任意公网主机的请求。 * `limited`:仅可以注入发往 `allowed_hosts` 所列主机的请求。 **allowed_hosts** `string[]` | 允许主机列表 `data.auth.networking.allowed_hosts` `type` 为 `limited` 时返回允许注入凭证的公网主机列表,每项为纯域名、通配域名或公网 IPv4 地址。`type` 为 `unrestricted` 时不返回。 **secret_name** `string` | 环境变量名 `data.auth.secret_name` 向运行环境注入凭证时使用的环境变量名。 **type** `string` | 鉴权类型 `data.auth.type` 表示该凭证通过环境变量向运行环境注入凭证。 取值固定为 `environment_variable`。 环境 OAuth 凭证 `object` 服务端返回环境 OAuth 凭证的鉴权类型、环境变量名和网络范围。配置自动刷新时,还返回访问令牌过期时间和用于刷新访问令牌的字段。 响应不返回访问令牌、刷新令牌或客户端密钥。 **networking** `object` | 网络范围 `data.auth.networking` 访问令牌可注入的目标主机范围。 **type** `string` | 网络范围类型 `data.auth.networking.type` 凭证的目标主机范围: * `unrestricted`:可以注入发往任意公网主机的请求。 * `limited`:仅可以注入发往 `allowed_hosts` 所列主机的请求。 **allowed_hosts** `string[]` | 允许主机列表 `data.auth.networking.allowed_hosts` `type` 为 `limited` 时返回允许注入凭证的公网主机列表,每项为纯域名、通配域名或公网 IPv4 地址。`type` 为 `unrestricted` 时不返回。 **secret_name** `string` | 环境变量名 `data.auth.secret_name` 向运行环境注入访问令牌时使用的环境变量名。 **type** `string` | 鉴权类型 `data.auth.type` 表示该凭证使用 OAuth 访问令牌,并通过环境变量向运行环境注入该令牌。 取值固定为 `env_oauth`。 **expires_at** `string` | 过期时间 `data.auth.expires_at` 访问令牌的过期时间,采用 RFC 3339 格式。Session 使用该凭据且访问令牌进入 5 分钟刷新窗口时,服务端尝试自动刷新。 **refresh** `object` | 访问令牌刷新 `data.auth.refresh` 服务端返回用于刷新访问令牌的字段,不返回刷新令牌或客户端密钥。 **client_id** `string` | 客户端 ID `data.auth.refresh.client_id` 向 OAuth 令牌端点请求访问令牌时使用的客户端 ID。 **resource** `string` | 资源标识 `data.auth.refresh.resource` OAuth 授权请求对应的资源标识。 **scope** `string` | 授权范围 `data.auth.refresh.scope` OAuth 令牌允许访问的权限范围。 **token_endpoint** `string` | OAuth 令牌端点 `data.auth.refresh.token_endpoint` 用于刷新访问令牌的 OAuth 端点地址。 **token_endpoint_auth** `object` | OAuth 客户端鉴权 `data.auth.refresh.token_endpoint_auth` 服务端向 OAuth 令牌端点提交刷新请求时使用的客户端鉴权配置。 **type** `string` | 鉴权方式 `data.auth.refresh.token_endpoint_auth.type` 服务端向 OAuth 令牌端点提交刷新请求时使用的客户端鉴权方式: * `none`:仅提交 `client_id`,不使用客户端密钥。 * `client_secret_basic`:通过 HTTP Basic Authentication 提交客户端信息。 * `client_secret_post`:在请求体中提交客户端信息。 **created_at** `string` | 创建时间 `data.created_at` 凭证的创建时间,采用 RFC 3339 格式。 **id** `string` | 凭证 ID `data.id` 凭证 ID,以 `vcrd-` 开头。 **type** `string` | 对象类型 `data.type` 表示当前对象是一条保管库凭证。 取值固定为 `vault_credential`。 **updated_at** `string` | 更新时间 `data.updated_at` 凭证最后一次更新的时间,采用 RFC 3339 格式。 **vault_id** `string` | 保管库 ID `data.vault_id` 凭证所属的保管库 ID,以 `vlt-` 开头。 **display_name** `string` | 凭证展示名 `data.display_name` 凭证的展示名称,用于识别该凭证。 **metadata** `object` | 自定义元数据 `data.metadata` 为凭证设置的字符串键值对,可用于分类或关联业务信息。 **next_page** `string` | 下一页标识 下一页标识。无更多数据时不返回;后续请求需将该值原样作为 `page` 传入。 ## 代码示例 ## 查询凭证列表 ### cURL #### Request ```Bash curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/vaults//credentials?limit=20" \ -H "Authorization: Bearer $ARK_API_KEY" ``` #### Response ``` { "data": [ { "id": "vcrd-example", "type": "vault_credential", "vault_id": "vlt-example", "display_name": "GitHub 只读 MCP", "auth": { "type": "static_bearer", "mcp_server_url": "https://mcp.example.com/github" }, "metadata": {"team": "agent-infra"}, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T09:00:00Z" } ], "next_page": "page_xxxxxxxx" } ``` #### 查询下一页 将上一页响应中的 `next_page` 原样作为 `page` 传入: ```Bash curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/vaults//credentials?limit=20&page=" \ -H "Authorization: Bearer $ARK_API_KEY" ``` ### Python #### Request ```python import os import urllib.parse import urllib.request query = urllib.parse.urlencode({"limit": 20}) req = urllib.request.Request( "https://ark.cn-beijing.volces.com/api/v3/vaults//credentials?" + query, headers={"Authorization": f"Bearer {os.environ['ARK_API_KEY']}"}, ) with urllib.request.urlopen(req) as resp: print(resp.read().decode()) ``` #### Response ``` { "data": [ { "id": "vcrd-example", "type": "vault_credential", "vault_id": "vlt-example", "display_name": "GitHub 只读 MCP", "auth": { "type": "static_bearer", "mcp_server_url": "https://mcp.example.com/github" }, "metadata": {"team": "agent-infra"}, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T09:00:00Z" } ], "next_page": "page_xxxxxxxx" } ``` ### Java #### Request ```java import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; public class Main { public static void main(String[] args) throws Exception { Request req = new Request.Builder() .url("https://ark.cn-beijing.volces.com/api/v3/vaults//credentials?limit=20") .addHeader("Authorization", "Bearer " + System.getenv("ARK_API_KEY")) .build(); try (Response resp = new OkHttpClient().newCall(req).execute()) { String responseBody = resp.body() == null ? "" : resp.body().string(); if (!resp.isSuccessful()) { throw new IllegalStateException( "HTTP " + resp.code() + ": " + responseBody); } System.out.println(responseBody); } } } ``` #### Response ``` { "data": [ { "id": "vcrd-example", "type": "vault_credential", "vault_id": "vlt-example", "display_name": "GitHub 只读 MCP", "auth": { "type": "static_bearer", "mcp_server_url": "https://mcp.example.com/github" }, "metadata": {"team": "agent-infra"}, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T09:00:00Z" } ], "next_page": "page_xxxxxxxx" } ``` ### Go #### Request ```go package main import ( "context" "fmt" "io" "net/http" "os" ) func main() { ctx := context.Background() req, err := http.NewRequestWithContext( ctx, http.MethodGet, "https://ark.cn-beijing.volces.com/api/v3/vaults//credentials?limit=20", nil, ) if err != nil { panic(err) } req.Header.Set("Authorization", "Bearer "+os.Getenv("ARK_API_KEY")) resp, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer resp.Body.Close() if resp.StatusCode >= http.StatusBadRequest { body, _ := io.ReadAll(resp.Body) panic(fmt.Sprintf("HTTP %d: %s", resp.StatusCode, body)) } if _, err := io.Copy(os.Stdout, resp.Body); err != nil { panic(err) } fmt.Println() } ``` #### Response ``` { "data": [ { "id": "vcrd-example", "type": "vault_credential", "vault_id": "vlt-example", "display_name": "GitHub 只读 MCP", "auth": { "type": "static_bearer", "mcp_server_url": "https://mcp.example.com/github" }, "metadata": {"team": "agent-infra"}, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T09:00:00Z" } ], "next_page": "page_xxxxxxxx" } ``` --- # 查询凭证详情 Source: https://ark.volcengine.com/region:cn-beijing/docs/get-credential-api `GET https://ark.cn-beijing.volces.com/api/v3/vaults/{vault_id}/credentials/{credential_id}` 查询指定凭证的详细信息。 已配置自动刷新的 OAuth 凭证会返回访问令牌过期时间和用于刷新访问令牌的非敏感字段。响应不返回以下密文字段:`access_token`、`token`、`secret_value`、`refresh_token` 和 `client_secret`。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **credential_id** `string` `必选` | 凭证 ID 凭证 ID,以 `vcrd-` 开头。 **vault_id** `string` `必选` | 保管库 ID 保管库 ID,以 `vlt-` 开头。 ## 响应参数 **auth** `object` | 鉴权配置 凭证的鉴权方式及可公开返回的配置。字段结构由 `type` 决定,响应只返回与 `type` 匹配的一种结构。 MCP OAuth 凭证 `object` 服务端返回 MCP OAuth 凭证的鉴权类型和 MCP 服务地址。配置自动刷新时,还返回访问令牌过期时间和用于刷新访问令牌的字段。 响应不返回访问令牌、刷新令牌或客户端密钥。 **mcp_server_url** `string` | MCP 服务器 URL `auth.mcp_server_url` MCP 服务的访问地址。 **type** `string` | 鉴权类型 `auth.type` 表示该凭证使用 OAuth 访问令牌连接 MCP 服务。 取值固定为 `mcp_oauth`。 **expires_at** `string` | 过期时间 `auth.expires_at` 访问令牌的过期时间,采用 RFC 3339 格式。Session 使用该凭据且访问令牌进入 5 分钟刷新窗口时,服务端尝试自动刷新。 **refresh** `object` | 访问令牌刷新 `auth.refresh` 服务端返回用于刷新访问令牌的字段,不返回刷新令牌或客户端密钥。 **client_id** `string` | 客户端 ID `auth.refresh.client_id` 向 OAuth 令牌端点请求访问令牌时使用的客户端 ID。 **resource** `string` | 资源标识 `auth.refresh.resource` OAuth 授权请求对应的资源标识。 **scope** `string` | 授权范围 `auth.refresh.scope` OAuth 令牌允许访问的权限范围。 **token_endpoint** `string` | OAuth 令牌端点 `auth.refresh.token_endpoint` 用于刷新访问令牌的 OAuth 端点地址。 **token_endpoint_auth** `object` | OAuth 客户端鉴权 `auth.refresh.token_endpoint_auth` 服务端向 OAuth 令牌端点提交刷新请求时使用的客户端鉴权配置。 **type** `string` | 鉴权方式 `auth.refresh.token_endpoint_auth.type` 服务端向 OAuth 令牌端点提交刷新请求时使用的客户端鉴权方式: * `none`:仅提交 `client_id`,不使用客户端密钥。 * `client_secret_basic`:通过 HTTP Basic Authentication 提交客户端信息。 * `client_secret_post`:在请求体中提交客户端信息。 静态 Bearer 令牌凭证 `object` 服务端返回静态 Bearer 令牌凭证的公开配置,不返回令牌。 **mcp_server_url** `string` | MCP 服务器 URL `auth.mcp_server_url` MCP 服务的访问地址。 **type** `string` | 鉴权类型 `auth.type` 表示该凭证使用静态 Bearer 令牌连接 MCP 服务。 取值固定为 `static_bearer`。 MCP 静态凭证 `object` 服务端返回 MCP 静态凭证的公开注入配置,不返回密钥值。 **injection_type** `string` | 注入方式 `auth.injection_type` 服务端返回的密钥注入方式: * `bearer`:通过 `Authorization: Bearer ` 请求头注入。 * `header`:通过 `injection_name` 指定的自定义请求头注入。 * `query`:通过 `injection_name` 指定的 URL 查询参数注入。 **mcp_server_url** `string` | MCP 服务器 URL `auth.mcp_server_url` MCP 服务的访问地址。 **type** `string` | 鉴权类型 `auth.type` 表示该凭证会将静态密钥注入 MCP 请求,注入位置由 `injection_type` 指定。 取值固定为 `mcp_static`。 **injection_name** `string` | 注入名 `auth.injection_name` 自定义请求头名称或查询参数名。`injection_type` 为 `header` 或 `query` 时返回该字段;`injection_type` 为 `bearer` 时不返回。 环境变量注入凭证 `object` 服务端返回环境变量凭证的公开注入配置,不返回环境变量值。 **networking** `object` | 网络范围 `auth.networking` 凭证可注入的目标主机范围。 **type** `string` | 网络范围类型 `auth.networking.type` 凭证的目标主机范围: * `unrestricted`:可以注入发往任意公网主机的请求。 * `limited`:仅可以注入发往 `allowed_hosts` 所列主机的请求。 **allowed_hosts** `string[]` | 允许主机列表 `auth.networking.allowed_hosts` `type` 为 `limited` 时返回允许注入凭证的公网主机列表,每项为纯域名、通配域名或公网 IPv4 地址。`type` 为 `unrestricted` 时不返回。 **secret_name** `string` | 环境变量名 `auth.secret_name` 向运行环境注入凭证时使用的环境变量名。 **type** `string` | 鉴权类型 `auth.type` 表示该凭证通过环境变量向运行环境注入凭证。 取值固定为 `environment_variable`。 环境 OAuth 凭证 `object` 服务端返回环境 OAuth 凭证的鉴权类型、环境变量名和网络范围。配置自动刷新时,还返回访问令牌过期时间和用于刷新访问令牌的字段。 响应不返回访问令牌、刷新令牌或客户端密钥。 **networking** `object` | 网络范围 `auth.networking` 访问令牌可注入的目标主机范围。 **type** `string` | 网络范围类型 `auth.networking.type` 凭证的目标主机范围: * `unrestricted`:可以注入发往任意公网主机的请求。 * `limited`:仅可以注入发往 `allowed_hosts` 所列主机的请求。 **allowed_hosts** `string[]` | 允许主机列表 `auth.networking.allowed_hosts` `type` 为 `limited` 时返回允许注入凭证的公网主机列表,每项为纯域名、通配域名或公网 IPv4 地址。`type` 为 `unrestricted` 时不返回。 **secret_name** `string` | 环境变量名 `auth.secret_name` 向运行环境注入访问令牌时使用的环境变量名。 **type** `string` | 鉴权类型 `auth.type` 表示该凭证使用 OAuth 访问令牌,并通过环境变量向运行环境注入该令牌。 取值固定为 `env_oauth`。 **expires_at** `string` | 过期时间 `auth.expires_at` 访问令牌的过期时间,采用 RFC 3339 格式。Session 使用该凭据且访问令牌进入 5 分钟刷新窗口时,服务端尝试自动刷新。 **refresh** `object` | 访问令牌刷新 `auth.refresh` 服务端返回用于刷新访问令牌的字段,不返回刷新令牌或客户端密钥。 **client_id** `string` | 客户端 ID `auth.refresh.client_id` 向 OAuth 令牌端点请求访问令牌时使用的客户端 ID。 **resource** `string` | 资源标识 `auth.refresh.resource` OAuth 授权请求对应的资源标识。 **scope** `string` | 授权范围 `auth.refresh.scope` OAuth 令牌允许访问的权限范围。 **token_endpoint** `string` | OAuth 令牌端点 `auth.refresh.token_endpoint` 用于刷新访问令牌的 OAuth 端点地址。 **token_endpoint_auth** `object` | OAuth 客户端鉴权 `auth.refresh.token_endpoint_auth` 服务端向 OAuth 令牌端点提交刷新请求时使用的客户端鉴权配置。 **type** `string` | 鉴权方式 `auth.refresh.token_endpoint_auth.type` 服务端向 OAuth 令牌端点提交刷新请求时使用的客户端鉴权方式: * `none`:仅提交 `client_id`,不使用客户端密钥。 * `client_secret_basic`:通过 HTTP Basic Authentication 提交客户端信息。 * `client_secret_post`:在请求体中提交客户端信息。 **created_at** `string` | 创建时间 凭证的创建时间,采用 RFC 3339 格式。 **id** `string` | 凭证 ID 凭证 ID,以 `vcrd-` 开头。 **type** `string` | 对象类型 表示当前对象是一条保管库凭证。 取值固定为 `vault_credential`。 **updated_at** `string` | 更新时间 凭证最后一次更新的时间,采用 RFC 3339 格式。 **vault_id** `string` | 保管库 ID 凭证所属的保管库 ID,以 `vlt-` 开头。 **display_name** `string` | 凭证展示名 凭证的展示名称,用于识别该凭证。 **metadata** `object` | 自定义元数据 为凭证设置的字符串键值对,可用于分类或关联业务信息。 ## 代码示例 ## 查询凭证详情 ### cURL #### Request ```Bash curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/vaults//credentials/" \ -H "Authorization: Bearer $ARK_API_KEY" ``` #### Response ``` { "id": "vcrd-example", "type": "vault_credential", "vault_id": "vlt-example", "display_name": "GitHub 只读 MCP", "auth": { "type": "static_bearer", "mcp_server_url": "https://mcp.example.com/github" }, "metadata": { "team": "agent-infra" }, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T09:00:00Z" } ``` ### Python #### Request ```python import os from arkruntime import Ark client = Ark( api_key=os.environ["ARK_API_KEY"], base_url="https://ark.cn-beijing.volces.com/api/v3", ) credential = client.vaults.credentials.retrieve("", "") print(credential) ``` #### Response ``` { "id": "vcrd-example", "type": "vault_credential", "vault_id": "vlt-example", "display_name": "GitHub 只读 MCP", "auth": { "type": "static_bearer", "mcp_server_url": "https://mcp.example.com/github" }, "metadata": { "team": "agent-infra" }, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T09:00:00Z" } ``` ### Java #### Request ```java // pom.xml 依赖: // // com.volcengine // ark-runtime // 0.9.0 // import com.volcengine.ark.runtime.models.vault.Credential; import com.volcengine.ark.runtime.service.ArkService; public class Main { public static void main(String[] args) throws Exception { ArkService service = ArkService.builder() .apiKey(System.getenv("ARK_API_KEY")) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); Credential credential = service.getCredential("", ""); System.out.println(credential); service.shutdownExecutor(); } } ``` #### Response ``` { "id": "vcrd-example", "type": "vault_credential", "vault_id": "vlt-example", "display_name": "GitHub 只读 MCP", "auth": { "type": "static_bearer", "mcp_server_url": "https://mcp.example.com/github" }, "metadata": { "team": "agent-infra" }, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T09:00:00Z" } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" ) func main() { ctx := context.Background() client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) cred, err := client.GetCredential(ctx, "", "") if err != nil { panic(err) } fmt.Println(cred) } ``` #### Response ``` { "id": "vcrd-example", "type": "vault_credential", "vault_id": "vlt-example", "display_name": "GitHub 只读 MCP", "auth": { "type": "static_bearer", "mcp_server_url": "https://mcp.example.com/github" }, "metadata": { "team": "agent-infra" }, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T09:00:00Z" } ``` --- # 更新凭证 Source: https://ark.volcengine.com/region:cn-beijing/docs/update-credential-api `POST https://ark.cn-beijing.volces.com/api/v3/vaults/{vault_id}/credentials/{credential_id}` 更新指定凭证的展示信息、元数据或可轮换的鉴权信息。请求体不包含任何可更新字段时,接口返回当前凭证信息,不修改内容或更新时间。 对于 OAuth 凭证,可以轮换访问令牌、更新过期时间、启用自动刷新或更新自动刷新所需信息。省略的字段保留原值。 响应不返回以下密文字段:`access_token`、`token`、`secret_value`、`refresh_token` 和 `client_secret`。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **credential_id** `string` `必选` | 凭证 ID 凭证 ID,以 `vcrd-` 开头。 **vault_id** `string` `必选` | 保管库 ID 保管库 ID,以 `vlt-` 开头。 ### Body 参数 **auth** `object` | 鉴权配置 用于更新凭证的鉴权信息。 * 省略时,保留全部原值。 * 提供时,只需填写 `type` 和需要修改的字段,其他未修改字段无需重复提供。 * `type` 用于标识当前凭证类型,必须与当前值一致。 > **注意** > > 更新 `mcp_static.token` 时,服务端会同步访问目标 MCP 服务: > > * 返回内容不符合 MCP 协议时,返回 HTTP 424 `MCPInvalidResponse`。 > * MCP 服务返回 5xx 或连接异常时,返回 HTTP 424 `UpstreamUnavailable`。 > * 校验失败时,不更新凭证。 MCP OAuth 凭证 `object` 用于更新 MCP OAuth 凭证,可轮换访问令牌、启用自动刷新或更新自动刷新所需信息。 **type** `string` `必选` | 鉴权类型 `auth.type` 用于标识当前凭证为 MCP OAuth 类型。更新 `auth` 时必填,不能修改为其他类型。 取值固定为 `mcp_oauth`。 **access_token** `string` | 访问令牌 `auth.access_token` 用于访问 MCP 服务的 OAuth 访问令牌。省略时保留原值,提供时整体替换。 **expires_at** `string` | 过期时间 `auth.expires_at` 访问令牌的过期时间,采用 RFC 3339 格式。服务端根据该时间判断是否需要自动刷新;省略时保留原值,提供时整体替换。 **mcp_server_url** `string` | MCP 服务器 URL `auth.mcp_server_url` MCP 服务的访问地址。更新时无需提供;如果提供,必须与当前值一致,否则返回 HTTP 409 `Conflict`。 **refresh** `object` | 访问令牌刷新 `auth.refresh` 用于启用或更新访问令牌自动刷新。启用自动刷新时,提供完整对象;已启用自动刷新后,只需提供需要更新的字段,未提供的字段保留原值。 **client_id** `string` | 客户端 ID `auth.refresh.client_id` 向 OAuth 令牌端点请求访问令牌时使用的客户端 ID。启用自动刷新时必填;更新自动刷新信息时无需提供,如果提供则必须与当前值一致。 **refresh_token** `string` | 刷新令牌 `auth.refresh.refresh_token` 用于向 OAuth 令牌端点获取新访问令牌的刷新令牌。启用自动刷新时必填;更新自动刷新信息时,省略该字段会保留原值,提供时会整体替换。 **resource** `string` | 资源标识 `auth.refresh.resource` OAuth 授权请求对应的资源标识。省略时保留原值,提供时整体替换。 **scope** `string` | 授权范围 `auth.refresh.scope` OAuth 令牌允许访问的权限范围。省略时保留原值,提供时整体替换。 **token_endpoint** `string` | OAuth 令牌端点 `auth.refresh.token_endpoint` 用于刷新访问令牌的 OAuth 端点地址。启用自动刷新时必填;更新自动刷新信息时无需提供,如果提供则必须与当前值一致。 **token_endpoint_auth** `object` | OAuth 客户端鉴权 `auth.refresh.token_endpoint_auth` 服务端向 OAuth 令牌端点提交刷新请求时使用的客户端鉴权配置。启用自动刷新时,根据鉴权方式提供完整对象;更新自动刷新信息时,仅更新显式传入的字段。 **type** `string` `必选` | 鉴权方式 `auth.refresh.token_endpoint_auth.type` 服务端向 OAuth 令牌端点提交刷新请求时使用的客户端鉴权方式: * `none`:仅提交 `client_id`,不使用客户端密钥。 * `client_secret_basic`:通过 HTTP Basic Authentication 提交 `client_id` 和 `client_secret`。 * `client_secret_post`:在请求体中提交 `client_id` 和 `client_secret`。 **client_secret** `string` | 客户端密钥 `auth.refresh.token_endpoint_auth.client_secret` OAuth 客户端密钥。 * 启用自动刷新时,如果 `type` 为 `client_secret_basic` 或 `client_secret_post`,必须提供该字段;如果 `type` 为 `none`,必须省略该字段。 * 更新自动刷新信息时,省略该字段会保留原值,提供时会整体替换。 静态 Bearer 令牌凭证 `object` 用于更新静态 Bearer 令牌凭证,可轮换令牌但不能更改 MCP 服务地址。 **type** `string` `必选` | 鉴权类型 `auth.type` 用于标识当前凭证为静态 Bearer 令牌类型。更新 `auth` 时必填,不能修改为其他类型。 取值固定为 `static_bearer`。 **mcp_server_url** `string` | MCP 服务器 URL `auth.mcp_server_url` MCP 服务的访问地址。更新时无需提供;如果提供,必须与当前值一致,否则返回 HTTP 409 `Conflict`。 **token** `string` | Bearer 令牌 `auth.token` 用于访问 MCP 服务的静态 Bearer 令牌。省略时保留原值,提供时整体替换。 MCP 静态凭证 `object` 用于更新 MCP 静态凭证,可轮换密钥但不能更改目标地址或注入方式。 **type** `string` `必选` | 鉴权类型 `auth.type` 用于标识当前凭证为 MCP 静态密钥类型。更新 `auth` 时必填,不能修改为其他类型。 取值固定为 `mcp_static`。 **injection_name** `string` | 注入名 `auth.injection_name` 自定义请求头名称或查询参数名。更新时无需提供;如果提供,必须与当前值一致,否则返回 HTTP 409 `Conflict`。 **injection_type** `string` | 注入方式 `auth.injection_type` 静态密钥的注入方式。更新时无需提供;如果提供,必须与当前值一致,否则返回 HTTP 409 `Conflict`。取值:`bearer` / `header` / `query`。 **mcp_server_url** `string` | MCP 服务器 URL `auth.mcp_server_url` MCP 服务的访问地址。更新时无需提供;如果提供,必须与当前值一致,否则返回 HTTP 409 `Conflict`。 **token** `string` | 密钥值 `auth.token` 注入 MCP 请求的静态密钥。 * 省略时,保留原值。 * 提供时,整体替换且不能为空。 * `injection_type` 为 `bearer` 时,不要包含 `Bearer ` 前缀。 环境变量注入凭证 `object` 用于更新环境变量凭证,可替换凭证值和网络范围但不能更改环境变量名。 **type** `string` `必选` | 鉴权类型 `auth.type` 用于标识当前凭证为环境变量类型。更新 `auth` 时必填,不能修改为其他类型。 取值固定为 `environment_variable`。 **networking** `object` | 网络范围 `auth.networking` 控制凭证可以注入的目标主机范围。省略时保留原值,提供时整体替换并重新校验。 **type** `string` `必选` | 网络范围类型 `auth.networking.type` 控制凭证可以注入的目标主机范围: * `unrestricted`:可以注入发往任意公网主机的请求。 * `limited`:仅可以注入发往 `allowed_hosts` 所列主机的请求。 **allowed_hosts** `string[]` | 允许主机列表 `auth.networking.allowed_hosts` `type` 为 `limited` 时允许注入的主机列表。 * 提供 1~16 个不重复的主机。 * 每项可为域名、IPv4 地址或 `*.example.com` 形式的通配域名。 * 不接受 URL、端口、路径或 IPv6 地址。 **secret_name** `string` | 环境变量名 `auth.secret_name` 向运行环境注入凭证时使用的环境变量名。更新时无需提供;如果提供,必须与当前值一致,否则返回 HTTP 409 `Conflict`。 **secret_value** `string` | 环境变量值 `auth.secret_value` 向运行环境注入的凭证值。省略时保留原值,提供时整体替换且不能为空,最大为 4096 字节。 环境 OAuth 凭证 `object` 用于更新环境 OAuth 凭证,可轮换访问令牌、启用自动刷新、更新自动刷新所需信息或更新网络范围。 **type** `string` `必选` | 鉴权类型 `auth.type` 用于标识当前凭证为环境 OAuth 类型。更新 `auth` 时必填,不能修改为其他类型。 取值固定为 `env_oauth`。 **access_token** `string` | 访问令牌 `auth.access_token` 向运行环境注入并用于目标服务鉴权的 OAuth 访问令牌。省略时保留原值,提供时整体替换。 **expires_at** `string` | 过期时间 `auth.expires_at` 访问令牌的过期时间,采用 RFC 3339 格式。服务端根据该时间判断是否需要自动刷新;省略时保留原值,提供时整体替换。 **networking** `object` | 网络范围 `auth.networking` 控制访问令牌可以注入的目标主机范围。省略时保留原值,提供时整体替换并重新校验。 **type** `string` `必选` | 网络范围类型 `auth.networking.type` 控制凭证可以注入的目标主机范围: * `unrestricted`:可以注入发往任意公网主机的请求。 * `limited`:仅可以注入发往 `allowed_hosts` 所列主机的请求。 **allowed_hosts** `string[]` | 允许主机列表 `auth.networking.allowed_hosts` `type` 为 `limited` 时允许注入的主机列表。 * 提供 1~16 个不重复的主机。 * 每项可为域名、IPv4 地址或 `*.example.com` 形式的通配域名。 * 不接受 URL、端口、路径或 IPv6 地址。 **refresh** `object` | 访问令牌刷新 `auth.refresh` 用于启用或更新访问令牌自动刷新。启用自动刷新时,提供完整对象;已启用自动刷新后,只需提供需要更新的字段,未提供的字段保留原值。 **client_id** `string` | 客户端 ID `auth.refresh.client_id` 向 OAuth 令牌端点请求访问令牌时使用的客户端 ID。启用自动刷新时必填;更新自动刷新信息时无需提供,如果提供则必须与当前值一致。 **refresh_token** `string` | 刷新令牌 `auth.refresh.refresh_token` 用于向 OAuth 令牌端点获取新访问令牌的刷新令牌。启用自动刷新时必填;更新自动刷新信息时,省略该字段会保留原值,提供时会整体替换。 **resource** `string` | 资源标识 `auth.refresh.resource` OAuth 授权请求对应的资源标识。省略时保留原值,提供时整体替换。 **scope** `string` | 授权范围 `auth.refresh.scope` OAuth 令牌允许访问的权限范围。省略时保留原值,提供时整体替换。 **token_endpoint** `string` | OAuth 令牌端点 `auth.refresh.token_endpoint` 用于刷新访问令牌的 OAuth 端点地址。启用自动刷新时必填;更新自动刷新信息时无需提供,如果提供则必须与当前值一致。 **token_endpoint_auth** `object` | OAuth 客户端鉴权 `auth.refresh.token_endpoint_auth` 服务端向 OAuth 令牌端点提交刷新请求时使用的客户端鉴权配置。启用自动刷新时,根据鉴权方式提供完整对象;更新自动刷新信息时,仅更新显式传入的字段。 **type** `string` `必选` | 鉴权方式 `auth.refresh.token_endpoint_auth.type` 服务端向 OAuth 令牌端点提交刷新请求时使用的客户端鉴权方式: * `none`:仅提交 `client_id`,不使用客户端密钥。 * `client_secret_basic`:通过 HTTP Basic Authentication 提交 `client_id` 和 `client_secret`。 * `client_secret_post`:在请求体中提交 `client_id` 和 `client_secret`。 **client_secret** `string` | 客户端密钥 `auth.refresh.token_endpoint_auth.client_secret` OAuth 客户端密钥。 * 启用自动刷新时,如果 `type` 为 `client_secret_basic` 或 `client_secret_post`,必须提供该字段;如果 `type` 为 `none`,必须省略该字段。 * 更新自动刷新信息时,省略该字段会保留原值,提供时会整体替换。 **secret_name** `string` | 环境变量名 `auth.secret_name` 向运行环境注入访问令牌时使用的环境变量名。更新时无需提供;如果提供,必须与当前值一致,否则返回 HTTP 409 `Conflict`。 **display_name** `string` | 凭证展示名 凭证的展示名称,用于在凭证列表和详情中识别该凭证。不能只包含空白字符;省略时保留原值。 **metadata** `object` | 自定义元数据 用于分类或关联业务信息的字符串键值对。按键新增或覆盖,未出现的键保留,空字符串作为普通值保存;更新后最多 16 对,键长度为 1~64 个字符,值最长 512 个字符。 ## 响应参数 **auth** `object` | 鉴权配置 凭证的鉴权方式及可公开返回的配置。字段结构由 `type` 决定,响应只返回与 `type` 匹配的一种结构。 MCP OAuth 凭证 `object` 服务端返回 MCP OAuth 凭证的鉴权类型和 MCP 服务地址。配置自动刷新时,还返回访问令牌过期时间和用于刷新访问令牌的字段。 响应不返回访问令牌、刷新令牌或客户端密钥。 **mcp_server_url** `string` | MCP 服务器 URL `auth.mcp_server_url` MCP 服务的访问地址。 **type** `string` | 鉴权类型 `auth.type` 表示该凭证使用 OAuth 访问令牌连接 MCP 服务。 取值固定为 `mcp_oauth`。 **expires_at** `string` | 过期时间 `auth.expires_at` 访问令牌的过期时间,采用 RFC 3339 格式。Session 使用该凭据且访问令牌进入 5 分钟刷新窗口时,服务端尝试自动刷新。 **refresh** `object` | 访问令牌刷新 `auth.refresh` 服务端返回用于刷新访问令牌的字段,不返回刷新令牌或客户端密钥。 **client_id** `string` | 客户端 ID `auth.refresh.client_id` 向 OAuth 令牌端点请求访问令牌时使用的客户端 ID。 **resource** `string` | 资源标识 `auth.refresh.resource` OAuth 授权请求对应的资源标识。 **scope** `string` | 授权范围 `auth.refresh.scope` OAuth 令牌允许访问的权限范围。 **token_endpoint** `string` | OAuth 令牌端点 `auth.refresh.token_endpoint` 用于刷新访问令牌的 OAuth 端点地址。 **token_endpoint_auth** `object` | OAuth 客户端鉴权 `auth.refresh.token_endpoint_auth` 服务端向 OAuth 令牌端点提交刷新请求时使用的客户端鉴权配置。 **type** `string` | 鉴权方式 `auth.refresh.token_endpoint_auth.type` 服务端向 OAuth 令牌端点提交刷新请求时使用的客户端鉴权方式: * `none`:仅提交 `client_id`,不使用客户端密钥。 * `client_secret_basic`:通过 HTTP Basic Authentication 提交客户端信息。 * `client_secret_post`:在请求体中提交客户端信息。 静态 Bearer 令牌凭证 `object` 服务端返回静态 Bearer 令牌凭证的公开配置,不返回令牌。 **mcp_server_url** `string` | MCP 服务器 URL `auth.mcp_server_url` MCP 服务的访问地址。 **type** `string` | 鉴权类型 `auth.type` 表示该凭证使用静态 Bearer 令牌连接 MCP 服务。 取值固定为 `static_bearer`。 MCP 静态凭证 `object` 服务端返回 MCP 静态凭证的公开注入配置,不返回密钥值。 **injection_type** `string` | 注入方式 `auth.injection_type` 服务端返回的密钥注入方式: * `bearer`:通过 `Authorization: Bearer ` 请求头注入。 * `header`:通过 `injection_name` 指定的自定义请求头注入。 * `query`:通过 `injection_name` 指定的 URL 查询参数注入。 **mcp_server_url** `string` | MCP 服务器 URL `auth.mcp_server_url` MCP 服务的访问地址。 **type** `string` | 鉴权类型 `auth.type` 表示该凭证会将静态密钥注入 MCP 请求,注入位置由 `injection_type` 指定。 取值固定为 `mcp_static`。 **injection_name** `string` | 注入名 `auth.injection_name` 自定义请求头名称或查询参数名。`injection_type` 为 `header` 或 `query` 时返回该字段;`injection_type` 为 `bearer` 时不返回。 环境变量注入凭证 `object` 服务端返回环境变量凭证的公开注入配置,不返回环境变量值。 **networking** `object` | 网络范围 `auth.networking` 凭证可注入的目标主机范围。 **type** `string` | 网络范围类型 `auth.networking.type` 凭证的目标主机范围: * `unrestricted`:可以注入发往任意公网主机的请求。 * `limited`:仅可以注入发往 `allowed_hosts` 所列主机的请求。 **allowed_hosts** `string[]` | 允许主机列表 `auth.networking.allowed_hosts` `type` 为 `limited` 时返回允许注入凭证的公网主机列表,每项为纯域名、通配域名或公网 IPv4 地址。`type` 为 `unrestricted` 时不返回。 **secret_name** `string` | 环境变量名 `auth.secret_name` 向运行环境注入凭证时使用的环境变量名。 **type** `string` | 鉴权类型 `auth.type` 表示该凭证通过环境变量向运行环境注入凭证。 取值固定为 `environment_variable`。 环境 OAuth 凭证 `object` 服务端返回环境 OAuth 凭证的鉴权类型、环境变量名和网络范围。配置自动刷新时,还返回访问令牌过期时间和用于刷新访问令牌的字段。 响应不返回访问令牌、刷新令牌或客户端密钥。 **networking** `object` | 网络范围 `auth.networking` 访问令牌可注入的目标主机范围。 **type** `string` | 网络范围类型 `auth.networking.type` 凭证的目标主机范围: * `unrestricted`:可以注入发往任意公网主机的请求。 * `limited`:仅可以注入发往 `allowed_hosts` 所列主机的请求。 **allowed_hosts** `string[]` | 允许主机列表 `auth.networking.allowed_hosts` `type` 为 `limited` 时返回允许注入凭证的公网主机列表,每项为纯域名、通配域名或公网 IPv4 地址。`type` 为 `unrestricted` 时不返回。 **secret_name** `string` | 环境变量名 `auth.secret_name` 向运行环境注入访问令牌时使用的环境变量名。 **type** `string` | 鉴权类型 `auth.type` 表示该凭证使用 OAuth 访问令牌,并通过环境变量向运行环境注入该令牌。 取值固定为 `env_oauth`。 **expires_at** `string` | 过期时间 `auth.expires_at` 访问令牌的过期时间,采用 RFC 3339 格式。Session 使用该凭据且访问令牌进入 5 分钟刷新窗口时,服务端尝试自动刷新。 **refresh** `object` | 访问令牌刷新 `auth.refresh` 服务端返回用于刷新访问令牌的字段,不返回刷新令牌或客户端密钥。 **client_id** `string` | 客户端 ID `auth.refresh.client_id` 向 OAuth 令牌端点请求访问令牌时使用的客户端 ID。 **resource** `string` | 资源标识 `auth.refresh.resource` OAuth 授权请求对应的资源标识。 **scope** `string` | 授权范围 `auth.refresh.scope` OAuth 令牌允许访问的权限范围。 **token_endpoint** `string` | OAuth 令牌端点 `auth.refresh.token_endpoint` 用于刷新访问令牌的 OAuth 端点地址。 **token_endpoint_auth** `object` | OAuth 客户端鉴权 `auth.refresh.token_endpoint_auth` 服务端向 OAuth 令牌端点提交刷新请求时使用的客户端鉴权配置。 **type** `string` | 鉴权方式 `auth.refresh.token_endpoint_auth.type` 服务端向 OAuth 令牌端点提交刷新请求时使用的客户端鉴权方式: * `none`:仅提交 `client_id`,不使用客户端密钥。 * `client_secret_basic`:通过 HTTP Basic Authentication 提交客户端信息。 * `client_secret_post`:在请求体中提交客户端信息。 **created_at** `string` | 创建时间 凭证的创建时间,采用 RFC 3339 格式。 **id** `string` | 凭证 ID 凭证 ID,以 `vcrd-` 开头。 **type** `string` | 对象类型 表示当前对象是一条保管库凭证。 取值固定为 `vault_credential`。 **updated_at** `string` | 更新时间 凭证最后一次更新的时间,采用 RFC 3339 格式。 **vault_id** `string` | 保管库 ID 凭证所属的保管库 ID,以 `vlt-` 开头。 **display_name** `string` | 凭证展示名 凭证的展示名称,用于识别该凭证。 **metadata** `object` | 自定义元数据 为凭证设置的字符串键值对,可用于分类或关联业务信息。 ## 代码示例 ## 更新凭证 ### cURL #### Request ```Bash curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/vaults//credentials/" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d @- <<'EOF' { "display_name": "GitHub 只读 MCP (rotated)", "auth": { "type": "static_bearer", "token": "" }, "metadata": { "rotated_at": "2026-07-15T10:00:00Z" } } EOF ``` #### Response ``` { "id": "vcrd-example", "type": "vault_credential", "vault_id": "vlt-example", "display_name": "GitHub 只读 MCP (rotated)", "auth": { "type": "static_bearer", "mcp_server_url": "" }, "metadata": { "team": "agent-infra", "rotated_at": "2026-07-15T10:00:00Z" }, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T10:00:00Z" } ``` ### Python #### Request ```python import os from arkruntime import Ark client = Ark( api_key=os.environ["ARK_API_KEY"], base_url="https://ark.cn-beijing.volces.com/api/v3", ) credential = client.vaults.credentials.update( "", "", display_name="GitHub 只读 MCP (rotated)", auth={ "type": "static_bearer", "token": "", }, metadata={"rotated_at": "2026-07-15T10:00:00Z"}, ) print(credential) ``` #### Response ``` { "id": "vcrd-example", "type": "vault_credential", "vault_id": "vlt-example", "display_name": "GitHub 只读 MCP (rotated)", "auth": { "type": "static_bearer", "mcp_server_url": "" }, "metadata": { "team": "agent-infra", "rotated_at": "2026-07-15T10:00:00Z" }, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T10:00:00Z" } ``` ### Java #### Request ```java // pom.xml 依赖: // // com.volcengine // ark-runtime // 0.9.0 // import com.volcengine.ark.runtime.models.vault.Credential; import com.volcengine.ark.runtime.models.vault.CredentialAuth; import com.volcengine.ark.runtime.models.vault.CredentialAuthType; import com.volcengine.ark.runtime.models.vault.UpdateCredentialRequest; import com.volcengine.ark.runtime.service.ArkService; import java.util.Collections; public class Main { public static void main(String[] args) throws Exception { ArkService service = ArkService.builder() .apiKey(System.getenv("ARK_API_KEY")) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); Credential credential = service.updateCredential( "", "", UpdateCredentialRequest.builder() .displayName("GitHub 只读 MCP (rotated)") .metadata(Collections.singletonMap( "rotated_at", "2026-07-15T10:00:00Z")) .auth(CredentialAuth.builder() .type(CredentialAuthType.STATIC_BEARER) .token("") .build()) .build()); System.out.println(credential); service.shutdownExecutor(); } } ``` #### Response ``` { "id": "vcrd-example", "type": "vault_credential", "vault_id": "vlt-example", "display_name": "GitHub 只读 MCP (rotated)", "auth": { "type": "static_bearer", "mcp_server_url": "" }, "metadata": { "team": "agent-infra", "rotated_at": "2026-07-15T10:00:00Z" }, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T10:00:00Z" } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" vaultmodel "github.com/volcengine/ark-runtime-go/arkruntime/model/vault" ) func main() { ctx := context.Background() client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) cred, err := client.UpdateCredential(ctx, "", "", &vaultmodel.UpdateCredentialRequest{ DisplayName: vaultmodel.NewOptString("GitHub 只读 MCP (rotated)"), Metadata: vaultmodel.NewOptUpdateCredentialRequestMetadata( vaultmodel.UpdateCredentialRequestMetadata{ "rotated_at": "2026-07-15T10:00:00Z", }, ), Auth: vaultmodel.NewOptCredentialAuth(vaultmodel.CredentialAuth{ Type: vaultmodel.CredentialAuthTypeStaticBearer, Token: vaultmodel.NewOptString(""), }), }) if err != nil { panic(err) } fmt.Println(cred) } ``` #### Response ``` { "id": "vcrd-example", "type": "vault_credential", "vault_id": "vlt-example", "display_name": "GitHub 只读 MCP (rotated)", "auth": { "type": "static_bearer", "mcp_server_url": "" }, "metadata": { "team": "agent-infra", "rotated_at": "2026-07-15T10:00:00Z" }, "created_at": "2026-07-15T08:00:00Z", "updated_at": "2026-07-15T10:00:00Z" } ``` --- # 删除凭证 Source: https://ark.volcengine.com/region:cn-beijing/docs/delete-credential-api `DELETE https://ark.cn-beijing.volces.com/api/v3/vaults/{vault_id}/credentials/{credential_id}` 删除指定凭证。 > **警告** > > 删除后无法恢复或读取该凭证。后续运行也无法再使用该凭证访问 MCP 服务或注入环境变量。删除前请确认业务不再使用该凭证。 如果首次删除请求超时,可以使用相同的凭证 ID 重试。 在鉴权信息和项目均未改变的情况下,重试返回 404 `InvalidCredential.NotFound` 表示该凭证已不存在,此时停止重试。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **credential_id** `string` `必选` | 凭证 ID 凭证 ID,以 `vcrd-` 开头。 **vault_id** `string` `必选` | 保管库 ID 保管库 ID,以 `vlt-` 开头。 ## 响应参数 **id** `string` | 凭证 ID 已删除的凭证 ID,以 `vcrd-` 开头,与路径参数中的值相同。 **type** `string` | 对象类型 表示当前对象是一条已删除的凭证记录。 取值固定为 `vault_credential_deleted`。 ## 代码示例 ## 删除凭证 ### cURL #### Request ```Bash curl -sS --fail-with-body -X DELETE "https://ark.cn-beijing.volces.com/api/v3/vaults//credentials/" \ -H "Authorization: Bearer $ARK_API_KEY" ``` #### Response ``` { "id": "vcrd-example", "type": "vault_credential_deleted" } ``` ### Python #### Request ```python import os from arkruntime import Ark client = Ark( api_key=os.environ["ARK_API_KEY"], base_url="https://ark.cn-beijing.volces.com/api/v3", ) response = client.vaults.credentials.delete("", "") print(response) ``` #### Response ``` { "id": "vcrd-example", "type": "vault_credential_deleted" } ``` ### Java #### Request ```java // pom.xml 依赖: // // com.volcengine // ark-runtime // 0.9.0 // import com.volcengine.ark.runtime.service.ArkService; public class Main { public static void main(String[] args) throws Exception { ArkService service = ArkService.builder() .apiKey(System.getenv("ARK_API_KEY")) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); Object response = service.deleteCredential("", ""); System.out.println(response); service.shutdownExecutor(); } } ``` #### Response ``` { "id": "vcrd-example", "type": "vault_credential_deleted" } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" ) func main() { ctx := context.Background() client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) response, err := client.DeleteCredential(ctx, "", "") if err != nil { panic(err) } fmt.Println(response) } ``` #### Response ``` { "id": "vcrd-example", "type": "vault_credential_deleted" } ``` --- # 创建记忆库 Source: https://ark.volcengine.com/region:cn-beijing/docs/create-memory-store-api `POST https://ark.cn-beijing.volces.com/api/v3/memory_stores` 创建一个记忆库,用于集中存放智能体的长期记忆。创建后可向库内写入带路径的记忆条目,并将记忆库挂载到会话。 > **说明** > > * 新建记忆库的 `memory_count`、`storage_bytes` 和 `session_count` 均为 0。 > * 创建失败的常见原因包括:名称为空或超过 64 个字符、描述采用 UTF-8 编码后超过 2048 字节、元数据不符合限制,以及当前账号和项目已达到 300 个记忆库。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Body 参数 **name** `string` `必选` | 记忆库名称 用于识别和管理记忆库的名称。同一账号和项目下允许存在同名记忆库,可通过各自的记忆库 ID 区分。 > **注意** > > 长度为 1–64 个字符。 **description** `string` | 记忆库描述 用于说明记忆库的用途和存储内容。 > **注意** > > UTF-8 编码后不得超过 2048 字节。 **metadata** `object` | 自定义元数据 用于标记和分类记忆库的自定义键值对。 > **注意** > > 最多包含 64 个非空键;键和值均为字符串,UTF-8 序列化后不得超过 8192 字节。 ## 响应参数 **created_at** `string` | 创建时间 记忆库创建时间,采用 RFC 3339 UTC 格式。 **created_by** `object` | 创建者 创建该记忆库的操作者信息。 **type** `string` | 操作者类型 `created_by.type` 创建者类型,固定为 `user_actor`。 **user_id** `string` | 用户 ID `created_by.user_id` 创建该记忆库的用户 ID,由服务端根据当前请求的身份自动记录,可用于按创建者筛选记忆库。 **id** `string` | 记忆库 ID 服务端生成的记忆库 ID,以 `memstore-` 开头。后续查询、更新或删除记忆库时,作为 `memory_store_id` 路径参数传入。 **memory_count** `integer` | 记忆条目数量 记忆库当前包含的记忆条目数量。 **metadata** `object` | 自定义元数据 创建或更新记忆库时设置的自定义元数据。 **name** `string` | 记忆库名称 记忆库名称,用于识别和管理该记忆库。 **session_count** `integer` | 活跃会话数 当前挂载该记忆库的活跃会话数量。 **storage_bytes** `integer` | 内容总字节数 记忆库当前所有记忆正文的总字节数。 **type** `string` | 对象类型 对象类型,固定为 `memory_store`。 **updated_at** `string` | 更新时间 记忆库更新时间,采用 RFC 3339 UTC 格式。 **description** `string` | 记忆库描述 记忆库的用途和存储内容说明。 **dream_id** `string` | Dream 任务 ID 仅 Dream 输出记忆库返回,表示创建该输出 Memory Store 的 Dream ID;普通 Memory Store 不返回该字段。 **dream_status** `string` | Dream 任务状态 仅 Dream 输出记忆库返回,表示创建该输出 Memory Store 的 Dream 当前状态;普通 Memory Store 不返回该字段。可选值:`pending`、`running`、`completed`、`failed`、`canceled`。 **mountable** `boolean` | 是否可挂载 表示当前是否可以挂载、读取或修改该 Memory Store。普通 Memory Store 返回 `true`;Dream 输出记忆库在 `pending` 或 `running` 状态时返回 `false`,在 `completed`、`failed` 或 `canceled` 状态时返回 `true`。 **project_name** `string` | 项目名称 记忆库实际所属的项目名称。 **usage_ready** `boolean` | 用量是否就绪 表示 `memory_count` 和 `storage_bytes` 是否已可作为准确统计值。普通 Memory Store 返回 `true`;Dream 输出记忆库在 `pending` 或 `running` 状态时返回 `false`,在 `completed`、`failed` 或 `canceled` 状态时返回 `true`。 ## 代码示例 ## 创建记忆库 ### cURL #### Request ```Bash curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/memory_stores" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d @- <<'EOF' { "name": "", "description": "用于存放团队常用规范和历史决策的长期记忆库" } EOF ``` #### Response ``` { "id": "memstore-", "type": "memory_store", "name": "", "description": "用于存放团队常用规范和历史决策的长期记忆库", "memory_count": 0, "storage_bytes": 0, "session_count": 0, "created_by": { "type": "user_actor", "user_id": "" }, "created_at": "2026-09-17T16:02:42Z", "updated_at": "2026-09-17T16:02:42Z", "metadata": {} } ``` ### Python #### Request ```python import os from arkruntime import Ark client = Ark( api_key=os.environ["ARK_API_KEY"], base_url="https://ark.cn-beijing.volces.com/api/v3", ) memory_store = client.memory_stores.create( name="", description="用于存放团队常用规范和历史决策的长期记忆库", ) print(memory_store) ``` #### Response ``` { "id": "memstore-", "type": "memory_store", "name": "", "description": "用于存放团队常用规范和历史决策的长期记忆库", "memory_count": 0, "storage_bytes": 0, "session_count": 0, "created_by": {"type": "user_actor", "user_id": ""}, "created_at": "2026-09-17T16:02:42Z", "updated_at": "2026-09-17T16:02:42Z", "metadata": {} } ``` ### Java #### Request ```java // pom.xml 依赖: // // com.volcengine // ark-runtime // 0.9.0 // import com.volcengine.ark.runtime.models.memory.CreateMemoryStoreRequest; import com.volcengine.ark.runtime.models.memory.MemoryStore; import com.volcengine.ark.runtime.service.ArkService; public class Main { public static void main(String[] args) throws Exception { ArkService service = ArkService.builder() .apiKey(System.getenv("ARK_API_KEY")) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); MemoryStore store = service.createMemoryStore( CreateMemoryStoreRequest.builder() .name("") .description("用于存放团队常用规范和历史决策的长期记忆库") .build()); System.out.println(store); service.shutdownExecutor(); } } ``` #### Response ``` { "id": "memstore-", "type": "memory_store", "name": "", "description": "用于存放团队常用规范和历史决策的长期记忆库", "memory_count": 0, "storage_bytes": 0, "session_count": 0, "created_by": { "type": "user_actor", "user_id": "" }, "created_at": "2026-09-17T16:02:42Z", "updated_at": "2026-09-17T16:02:42Z", "metadata": {} } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" memorymodel "github.com/volcengine/ark-runtime-go/arkruntime/model/memory" ) func main() { ctx := context.Background() client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) store, err := client.CreateMemoryStore(ctx, &memorymodel.CreateMemoryStoreRequest{ Name: "", Description: memorymodel.NewOptString("用于存放团队常用规范和历史决策的长期记忆库"), }) if err != nil { panic(err) } fmt.Println(store) } ``` #### Response ``` { "id": "memstore-", "type": "memory_store", "name": "", "description": "用于存放团队常用规范和历史决策的长期记忆库", "memory_count": 0, "storage_bytes": 0, "session_count": 0, "created_by": { "type": "user_actor", "user_id": "" }, "created_at": "2026-09-17T16:02:42Z", "updated_at": "2026-09-17T16:02:42Z", "metadata": {} } ``` --- # 查询记忆库列表 Source: https://ark.volcengine.com/region:cn-beijing/docs/list-memory-stores-api `GET https://ark.cn-beijing.volces.com/api/v3/memory_stores` 查询当前账号和项目下的记忆库。支持按创建者和记忆库名称筛选,结果默认按创建时间倒序排列。每个列表项包含记忆条数、活跃会话数等信息。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Query 参数 > 在 URL Query String 中传入。 **created_by** `string[]` | 创建者 ID 按创建者用户 ID 筛选。用户 ID 可从记忆库响应的 `created_by.user_id` 获取。 * 传入多个用户 ID 时,重复使用同名查询参数,例如 `created_by=&created_by=`。 * 多个 ID 之间为“或”关系:返回创建者 ID 与任一传入值相同的记忆库。 * 省略时不按创建者筛选。 **exclude_dreaming** `boolean` `默认值 false` | 排除未完成记忆库 返回结果可包含普通记忆库和 Dream 输出记忆库。`true` 表示排除 `pending` 或 `running` 状态的 Dream 输出记忆库;`false` 或省略表示不排除这些记忆库。 **limit** `integer` `默认值 20` | 每页数量 单页返回的记忆库数量。 **取值范围**:`[1, 100]` **name** `string` | 记忆库名称 按记忆库名称进行子串包含匹配。例如,`name=demo` 可匹配名称中包含 `demo` 的记忆库;`%` 和 `_` 按普通字符处理,不作为通配符。 **page** `string` | 下一页标识 上一页返回的下一页标识;首次请求省略,后续将 `next_page` 原样传入,且标识与当前筛选条件绑定。筛选条件变化或标识无效时返回 400 `InvalidParameter`,请从第一页查询。 ## 响应参数 **data** `object[]` | 记忆库列表 符合筛选条件的记忆库列表。 **created_at** `string` | 创建时间 `data.created_at` 记忆库创建时间,采用 RFC 3339 UTC 格式。 **created_by** `object` | 创建者 `data.created_by` 创建该记忆库的操作者信息。 **type** `string` | 操作者类型 `data.created_by.type` 创建者类型,固定为 `user_actor`。 **user_id** `string` | 用户 ID `data.created_by.user_id` 创建该记忆库的用户 ID,由服务端根据当前请求的身份自动记录,可用于按创建者筛选记忆库。 **id** `string` | 记忆库 ID `data.id` 服务端生成的记忆库 ID,以 `memstore-` 开头。后续查询、更新或删除记忆库时,作为 `memory_store_id` 路径参数传入。 **memory_count** `integer` | 记忆条目数量 `data.memory_count` 记忆库当前包含的记忆条目数量。 **metadata** `object` | 自定义元数据 `data.metadata` 创建或更新记忆库时设置的自定义元数据。 **name** `string` | 记忆库名称 `data.name` 记忆库名称,用于识别和管理该记忆库。 **session_count** `integer` | 活跃会话数 `data.session_count` 当前挂载该记忆库的活跃会话数量。 **storage_bytes** `integer` | 内容总字节数 `data.storage_bytes` 记忆库当前所有记忆正文的总字节数。 **type** `string` | 对象类型 `data.type` 对象类型,固定为 `memory_store`。 **updated_at** `string` | 更新时间 `data.updated_at` 记忆库更新时间,采用 RFC 3339 UTC 格式。 **description** `string` | 记忆库描述 `data.description` 记忆库的用途和存储内容说明。 **dream_id** `string` | Dream 任务 ID `data.dream_id` 仅 Dream 输出记忆库返回,表示创建该输出 Memory Store 的 Dream ID;普通 Memory Store 不返回该字段。 **dream_status** `string` | Dream 任务状态 `data.dream_status` 仅 Dream 输出记忆库返回,表示创建该输出 Memory Store 的 Dream 当前状态;普通 Memory Store 不返回该字段。可选值:`pending`、`running`、`completed`、`failed`、`canceled`。 **mountable** `boolean` | 是否可挂载 `data.mountable` 表示当前是否可以挂载、读取或修改该 Memory Store。普通 Memory Store 返回 `true`;Dream 输出记忆库在 `pending` 或 `running` 状态时返回 `false`,在 `completed`、`failed` 或 `canceled` 状态时返回 `true`。 **project_name** `string` | 项目名称 `data.project_name` 记忆库实际所属的项目名称。 **usage_ready** `boolean` | 用量是否就绪 `data.usage_ready` 表示 `memory_count` 和 `storage_bytes` 是否已可作为准确统计值。普通 Memory Store 返回 `true`;Dream 输出记忆库在 `pending` 或 `running` 状态时返回 `false`,在 `completed`、`failed` 或 `canceled` 状态时返回 `true`。 **next_page** `string` | 下一页标识 下一页标识。返回非空值时,将其原样传入下一次请求的 `page` 参数;无更多数据时不返回该字段。 ## 代码示例 ## 查询记忆库列表 ### cURL #### Request ```Bash curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/memory_stores?limit=20" \ -H "Authorization: Bearer $ARK_API_KEY" ``` #### Response ``` { "data": [ { "id": "memstore-", "type": "memory_store", "name": "", "memory_count": 12, "storage_bytes": 34567, "session_count": 2, "created_by": {"type": "user_actor", "user_id": ""}, "created_at": "2026-09-17T06:36:52Z", "updated_at": "2026-09-17T06:37:03Z", "metadata": {} } ], "next_page": "" } ``` ### Python #### Request ```python import os from arkruntime import Ark client = Ark( api_key=os.environ["ARK_API_KEY"], base_url="https://ark.cn-beijing.volces.com/api/v3", ) page = client.memory_stores.list(limit=20) print(page) ``` #### Response ``` { "data": [ { "id": "memstore-", "type": "memory_store", "name": "", "memory_count": 12, "storage_bytes": 34567, "session_count": 2, "created_by": {"type": "user_actor", "user_id": ""}, "created_at": "2026-09-17T06:36:52Z", "updated_at": "2026-09-17T06:37:03Z", "metadata": {} } ], "next_page": "" } ``` ### Java #### Request ```java // pom.xml 依赖: // // com.volcengine // ark-runtime // 0.9.0 // import com.volcengine.ark.runtime.models.memory.ListMemoryStoresResponse; import com.volcengine.ark.runtime.service.ArkService; public class Main { public static void main(String[] args) throws Exception { ArkService service = ArkService.builder() .apiKey(System.getenv("ARK_API_KEY")) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); ListMemoryStoresResponse page = service.listMemoryStores(20, null, null, null); System.out.println(page); service.shutdownExecutor(); } } ``` #### Response ``` { "data": [ { "id": "memstore-", "type": "memory_store", "name": "", "memory_count": 12, "storage_bytes": 34567, "session_count": 2, "created_by": {"type": "user_actor", "user_id": ""}, "created_at": "2026-09-17T06:36:52Z", "updated_at": "2026-09-17T06:37:03Z", "metadata": {} } ], "next_page": "" } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" memorymodel "github.com/volcengine/ark-runtime-go/arkruntime/model/memory" ) func main() { ctx := context.Background() client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) resp, err := client.ListMemoryStores(ctx, &memorymodel.MemoryStoresListParams{ Limit: memorymodel.NewOptInt32(20), }) if err != nil { panic(err) } fmt.Println(resp) } ``` #### Response ``` { "data": [ { "id": "memstore-", "type": "memory_store", "name": "", "memory_count": 12, "storage_bytes": 34567, "session_count": 2, "created_by": {"type": "user_actor", "user_id": ""}, "created_at": "2026-09-17T06:36:52Z", "updated_at": "2026-09-17T06:37:03Z", "metadata": {} } ], "next_page": "" } ``` --- # 查询记忆库详情 Source: https://ark.volcengine.com/region:cn-beijing/docs/get-memory-store-api `GET https://ark.cn-beijing.volces.com/api/v3/memory_stores/{memory_store_id}` 按 ID 查询单个记忆库的配置、自定义元数据和当前统计值。需要浏览多个记忆库时,使用查询记忆库列表接口。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **memory_store_id** `string` `必选` | 记忆库 ID 用于定位要查询的记忆库,以 `memstore-` 开头。传入创建或列表接口返回的完整 ID,不要自行拼接。 ## 响应参数 **created_at** `string` | 创建时间 记忆库创建时间,采用 RFC 3339 UTC 格式。 **created_by** `object` | 创建者 创建该记忆库的操作者信息。 **type** `string` | 操作者类型 `created_by.type` 创建者类型,固定为 `user_actor`。 **user_id** `string` | 用户 ID `created_by.user_id` 创建该记忆库的用户 ID,由服务端根据当前请求的身份自动记录,可用于按创建者筛选记忆库。 **id** `string` | 记忆库 ID 服务端生成的记忆库 ID,以 `memstore-` 开头。后续查询、更新或删除记忆库时,作为 `memory_store_id` 路径参数传入。 **memory_count** `integer` | 记忆条目数量 记忆库当前包含的记忆条目数量。 **metadata** `object` | 自定义元数据 创建或更新记忆库时设置的自定义元数据。 **name** `string` | 记忆库名称 记忆库名称,用于识别和管理该记忆库。 **session_count** `integer` | 活跃会话数 当前挂载该记忆库的活跃会话数量。 **storage_bytes** `integer` | 内容总字节数 记忆库当前所有记忆正文的总字节数。 **type** `string` | 对象类型 对象类型,固定为 `memory_store`。 **updated_at** `string` | 更新时间 记忆库更新时间,采用 RFC 3339 UTC 格式。 **description** `string` | 记忆库描述 记忆库的用途和存储内容说明。 **dream_id** `string` | Dream 任务 ID 仅 Dream 输出记忆库返回,表示创建该输出 Memory Store 的 Dream ID;普通 Memory Store 不返回该字段。 **dream_status** `string` | Dream 任务状态 仅 Dream 输出记忆库返回,表示创建该输出 Memory Store 的 Dream 当前状态;普通 Memory Store 不返回该字段。可选值:`pending`、`running`、`completed`、`failed`、`canceled`。 **mountable** `boolean` | 是否可挂载 表示当前是否可以挂载、读取或修改该 Memory Store。普通 Memory Store 返回 `true`;Dream 输出记忆库在 `pending` 或 `running` 状态时返回 `false`,在 `completed`、`failed` 或 `canceled` 状态时返回 `true`。 **project_name** `string` | 项目名称 记忆库实际所属的项目名称。 **usage_ready** `boolean` | 用量是否就绪 表示 `memory_count` 和 `storage_bytes` 是否已可作为准确统计值。普通 Memory Store 返回 `true`;Dream 输出记忆库在 `pending` 或 `running` 状态时返回 `false`,在 `completed`、`failed` 或 `canceled` 状态时返回 `true`。 ## 代码示例 ## 查询记忆库详情 ### cURL #### Request ```Bash curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/memory_stores/" \ -H "Authorization: Bearer $ARK_API_KEY" ``` #### Response ``` { "id": "", "type": "memory_store", "name": "", "description": "用于存放团队常用规范和历史决策的长期记忆库", "memory_count": 12, "storage_bytes": 34567, "session_count": 2, "created_by": {"type": "user_actor", "user_id": ""}, "created_at": "2026-09-17T16:02:42Z", "updated_at": "2026-09-17T16:02:48Z", "metadata": {} } ``` ### Python #### Request ```python import os from arkruntime import Ark client = Ark( api_key=os.environ["ARK_API_KEY"], base_url="https://ark.cn-beijing.volces.com/api/v3", ) store = client.memory_stores.retrieve("") print(store) ``` #### Response ``` { "id": "", "type": "memory_store", "name": "", "description": "用于存放团队常用规范和历史决策的长期记忆库", "memory_count": 12, "storage_bytes": 34567, "session_count": 2, "created_by": {"type": "user_actor", "user_id": ""}, "created_at": "2026-09-17T16:02:42Z", "updated_at": "2026-09-17T16:02:48Z", "metadata": {} } ``` ### Java #### Request ```java // pom.xml 依赖: // // com.volcengine // ark-runtime // 0.9.0 // import com.volcengine.ark.runtime.models.memory.MemoryStore; import com.volcengine.ark.runtime.service.ArkService; public class Main { public static void main(String[] args) throws Exception { ArkService service = ArkService.builder() .apiKey(System.getenv("ARK_API_KEY")) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); MemoryStore store = service.getMemoryStore(""); System.out.println(store); service.shutdownExecutor(); } } ``` #### Response ``` { "id": "", "type": "memory_store", "name": "", "description": "用于存放团队常用规范和历史决策的长期记忆库", "memory_count": 12, "storage_bytes": 34567, "session_count": 2, "created_by": {"type": "user_actor", "user_id": ""}, "created_at": "2026-09-17T16:02:42Z", "updated_at": "2026-09-17T16:02:48Z", "metadata": {} } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" ) func main() { ctx := context.Background() client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) store, err := client.GetMemoryStore(ctx, "") if err != nil { panic(err) } fmt.Println(store) } ``` #### Response ``` { "id": "", "type": "memory_store", "name": "", "description": "用于存放团队常用规范和历史决策的长期记忆库", "memory_count": 12, "storage_bytes": 34567, "session_count": 2, "created_by": {"type": "user_actor", "user_id": ""}, "created_at": "2026-09-17T16:02:42Z", "updated_at": "2026-09-17T16:02:48Z", "metadata": {} } ``` --- # 更新记忆库 Source: https://ark.volcengine.com/region:cn-beijing/docs/update-memory-store-api `POST https://ark.cn-beijing.volces.com/api/v3/memory_stores/{memory_store_id}` 按字段更新记忆库的名称、描述或自定义元数据。请求至少包含 `name`、`description` 和 `metadata` 中的一个字段。未传入的字段保持不变。 > **说明** > > 多个请求同时更新同一字段时,以服务端最后成功处理的值为准。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **memory_store_id** `string` `必选` | 记忆库 ID 用于定位要更新的记忆库,以 `memstore-` 开头。传入创建或查询接口返回的完整 ID,不要自行拼接。 ### Body 参数 **description** `string` | 记忆库描述 用于替换现有描述的用途和存储内容说明。传空字符串会清空已有描述。 > **注意** > > UTF-8 编码后不得超过 2048 字节。 **metadata** `object` | 自定义元数据 用于整体替换记忆库现有的自定义元数据。省略或传 `null` 时保留原值,传空对象 `{}` 时清空全部键。 > **说明** > > 传入对象时,如需保留已有键,更新前先查询现有元数据,将需要保留的键与新值合并后再传。对象最多包含 64 个非空键;键和值均为字符串,UTF-8 序列化后不得超过 8192 字节。 **name** `string` | 记忆库名称 用于替换现有名称的记忆库名称。同一账号和项目下允许存在同名记忆库,可通过各自的记忆库 ID 区分。 > **注意** > > 长度为 1–64 个字符。 ## 响应参数 **created_at** `string` | 创建时间 记忆库创建时间,采用 RFC 3339 UTC 格式。 **created_by** `object` | 创建者 创建该记忆库的操作者信息。 **type** `string` | 操作者类型 `created_by.type` 创建者类型,固定为 `user_actor`。 **user_id** `string` | 用户 ID `created_by.user_id` 创建该记忆库的用户 ID,由服务端根据当前请求的身份自动记录,可用于按创建者筛选记忆库。 **id** `string` | 记忆库 ID 服务端生成的记忆库 ID,以 `memstore-` 开头。后续查询、更新或删除记忆库时,作为 `memory_store_id` 路径参数传入。 **memory_count** `integer` | 记忆条目数量 记忆库当前包含的记忆条目数量。 **metadata** `object` | 自定义元数据 创建或更新记忆库时设置的自定义元数据。 **name** `string` | 记忆库名称 记忆库名称,用于识别和管理该记忆库。 **session_count** `integer` | 活跃会话数 当前挂载该记忆库的活跃会话数量。 **storage_bytes** `integer` | 内容总字节数 记忆库当前所有记忆正文的总字节数。 **type** `string` | 对象类型 对象类型,固定为 `memory_store`。 **updated_at** `string` | 更新时间 记忆库更新时间,采用 RFC 3339 UTC 格式。 **description** `string` | 记忆库描述 记忆库的用途和存储内容说明。 **dream_id** `string` | Dream 任务 ID 仅 Dream 输出记忆库返回,表示创建该输出 Memory Store 的 Dream ID;普通 Memory Store 不返回该字段。 **dream_status** `string` | Dream 任务状态 仅 Dream 输出记忆库返回,表示创建该输出 Memory Store 的 Dream 当前状态;普通 Memory Store 不返回该字段。可选值:`pending`、`running`、`completed`、`failed`、`canceled`。 **mountable** `boolean` | 是否可挂载 表示当前是否可以挂载、读取或修改该 Memory Store。普通 Memory Store 返回 `true`;Dream 输出记忆库在 `pending` 或 `running` 状态时返回 `false`,在 `completed`、`failed` 或 `canceled` 状态时返回 `true`。 **project_name** `string` | 项目名称 记忆库实际所属的项目名称。 **usage_ready** `boolean` | 用量是否就绪 表示 `memory_count` 和 `storage_bytes` 是否已可作为准确统计值。普通 Memory Store 返回 `true`;Dream 输出记忆库在 `pending` 或 `running` 状态时返回 `false`,在 `completed`、`failed` 或 `canceled` 状态时返回 `true`。 ## 代码示例 ## 更新记忆库 ### cURL #### Request ```Bash curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/memory_stores/" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d @- <<'EOF' { "name": "团队规范 · Q3 修订版", "description": "存放团队常用规范与历史决策,Q3 补齐 skill hub 相关约定。", "metadata": { "owner": "team-agent-infra", "quarter": "2026Q3" } } EOF ``` #### Response ``` { "id": "", "type": "memory_store", "name": "团队规范 · Q3 修订版", "description": "存放团队常用规范与历史决策,Q3 补齐 skill hub 相关约定。", "memory_count": 12, "storage_bytes": 34567, "session_count": 2, "created_by": {"type": "user_actor", "user_id": ""}, "created_at": "2026-09-17T16:02:42Z", "updated_at": "2026-09-17T16:02:48Z", "metadata": { "owner": "team-agent-infra", "quarter": "2026Q3" } } ``` ### Python #### Request ```python import os from arkruntime import Ark client = Ark( api_key=os.environ["ARK_API_KEY"], base_url="https://ark.cn-beijing.volces.com/api/v3", ) store = client.memory_stores.update( "", name="团队规范 · Q3 修订版", description="存放团队常用规范与历史决策,Q3 补齐 skill hub 相关约定。", metadata={"owner": "team-agent-infra", "quarter": "2026Q3"}, ) print(store) ``` #### Response ``` { "id": "", "type": "memory_store", "name": "团队规范 · Q3 修订版", "description": "存放团队常用规范与历史决策,Q3 补齐 skill hub 相关约定。", "memory_count": 12, "storage_bytes": 34567, "session_count": 2, "created_by": {"type": "user_actor", "user_id": ""}, "created_at": "2026-09-17T16:02:42Z", "updated_at": "2026-09-17T16:02:48Z", "metadata": { "owner": "team-agent-infra", "quarter": "2026Q3" } } ``` ### Java #### Request ```java // pom.xml 依赖: // // com.volcengine // ark-runtime // 0.9.0 // import com.volcengine.ark.runtime.models.memory.MemoryStore; import com.volcengine.ark.runtime.models.memory.UpdateMemoryStoreRequest; import com.volcengine.ark.runtime.service.ArkService; import java.util.HashMap; import java.util.Map; public class Main { public static void main(String[] args) throws Exception { ArkService service = ArkService.builder() .apiKey(System.getenv("ARK_API_KEY")) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); Map metadata = new HashMap<>(); metadata.put("owner", "team-agent-infra"); metadata.put("quarter", "2026Q3"); MemoryStore store = service.updateMemoryStore( "", UpdateMemoryStoreRequest.builder() .name("团队规范 · Q3 修订版") .description("存放团队常用规范与历史决策,Q3 补齐 skill hub 相关约定。") .metadata(metadata) .build()); System.out.println(store); service.shutdownExecutor(); } } ``` #### Response ``` { "id": "", "type": "memory_store", "name": "团队规范 · Q3 修订版", "description": "存放团队常用规范与历史决策,Q3 补齐 skill hub 相关约定。", "memory_count": 12, "storage_bytes": 34567, "session_count": 2, "created_by": {"type": "user_actor", "user_id": ""}, "created_at": "2026-09-17T16:02:42Z", "updated_at": "2026-09-17T16:02:48Z", "metadata": { "owner": "team-agent-infra", "quarter": "2026Q3" } } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" memorymodel "github.com/volcengine/ark-runtime-go/arkruntime/model/memory" ) func main() { ctx := context.Background() client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) store, err := client.UpdateMemoryStore(ctx, "", &memorymodel.UpdateMemoryStoreRequest{ Name: memorymodel.NewOptString("团队规范 · Q3 修订版"), Description: memorymodel.NewOptString("存放团队常用规范与历史决策,Q3 补齐 skill hub 相关约定。"), Metadata: memorymodel.NewOptUpdateMemoryStoreRequestMetadata( memorymodel.UpdateMemoryStoreRequestMetadata{ "owner": "team-agent-infra", "quarter": "2026Q3", }, ), }) if err != nil { panic(err) } fmt.Println(store) } ``` #### Response ``` { "id": "", "type": "memory_store", "name": "团队规范 · Q3 修订版", "description": "存放团队常用规范与历史决策,Q3 补齐 skill hub 相关约定。", "memory_count": 12, "storage_bytes": 34567, "session_count": 2, "created_by": {"type": "user_actor", "user_id": ""}, "created_at": "2026-09-17T16:02:42Z", "updated_at": "2026-09-17T16:02:48Z", "metadata": { "owner": "team-agent-infra", "quarter": "2026Q3" } } ``` --- # 删除记忆库 Source: https://ark.volcengine.com/region:cn-beijing/docs/delete-memory-store-api `DELETE https://ark.cn-beijing.volces.com/api/v3/memory_stores/{memory_store_id}` 删除指定记忆库及其中的全部记忆条目。删除后不支持恢复;如需继续使用,需重新创建记忆库并写入内容。需要删除整个记忆库及全部记忆时使用本接口;仅删除一条记忆时,使用删除记忆条目接口。 > **注意** > > 即使记忆库已挂载到会话,也可以删除。删除后,相关会话将无法继续访问该记忆库及其中的记忆;删除前需确认业务影响。 > **说明** > > 当记忆库不存在或当前账号、项目无权访问时,统一返回 404 `InvalidMemoryStore.NotFound`。重复删除已不存在的记忆库时,可将该错误视为目标记忆库已不存在。请求路径参数无效时返回 400 `InvalidParameter`。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **memory_store_id** `string` `必选` | 记忆库 ID 用于定位要删除的记忆库,以 `memstore-` 开头。传入创建或查询接口返回的完整 ID,不要自行拼接。 ## 响应参数 **id** `string` | 记忆库 ID 已删除的记忆库 ID,与请求中的 `memory_store_id` 相同。 **type** `string` | 对象类型 对象类型,固定为 `memory_store_deleted`。 ## 代码示例 ## 删除记忆库 ### cURL #### Request ```Bash curl -sS --fail-with-body -X DELETE "https://ark.cn-beijing.volces.com/api/v3/memory_stores/" \ -H "Authorization: Bearer $ARK_API_KEY" ``` #### Response ``` { "id": "", "type": "memory_store_deleted" } ``` ### Python #### Request ```python import os from arkruntime import Ark client = Ark( api_key=os.environ["ARK_API_KEY"], base_url="https://ark.cn-beijing.volces.com/api/v3", ) response = client.memory_stores.delete("") print(response) ``` #### Response ``` { "id": "", "type": "memory_store_deleted" } ``` ### Java #### Request ```java // pom.xml 依赖: // // com.volcengine // ark-runtime // 0.9.0 // import com.volcengine.ark.runtime.service.ArkService; public class Main { public static void main(String[] args) throws Exception { ArkService service = ArkService.builder() .apiKey(System.getenv("ARK_API_KEY")) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); Object response = service.deleteMemoryStore(""); System.out.println(response); service.shutdownExecutor(); } } ``` #### Response ``` { "id": "", "type": "memory_store_deleted" } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" ) func main() { ctx := context.Background() client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) response, err := client.DeleteMemoryStore(ctx, "") if err != nil { panic(err) } fmt.Println(response) } ``` #### Response ``` { "id": "", "type": "memory_store_deleted" } ``` --- # 创建记忆 Source: https://ark.volcengine.com/region:cn-beijing/docs/create-memory-api `POST https://ark.cn-beijing.volces.com/api/v3/memory_stores/{memory_store_id}/memories` 在指定记忆库中创建一条文本记忆。创建后可将该记忆库挂载到会话,供智能体读取或更新其中的记忆。调用前需先创建记忆库,并使用创建或查询记忆库接口返回的 ID。 > **说明** > > 创建记忆时,响应不返回记忆内容(`content`)。需要正文时,调用查询记忆详情接口。 > > **创建失败的常见原因**: > > - 记忆库不存在或不可访问。 > - 路径格式不合法。 > - 记忆内容不是有效的 UTF-8 文本。 > - 记忆内容超过 100 KiB。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **memory_store_id** `string` `必选` | 记忆库 ID 用于指定目标记忆库,以 `memstore-` 开头。传入创建或查询记忆库接口返回的完整 ID,不要自行拼接。 ### Body 参数 **content** `string` `必选` | 记忆内容 写入记忆文件的正文。 > **注意** > > 记忆内容必须是有效的 UTF-8 文本,允许空字符串,且不得超过 102400 字节(100 KiB)。 **path** `string` `必选` | 记忆路径 记忆在记忆库中的文件路径。 > **注意** > > 路径必须以 `/` 开头,以 `.md` 或 `.txt` 结尾,UTF-8 编码后不超过 1024 字节,且不得包含控制字符、`%`、`;` 或 `?`;路径段不得为空、`.` 或 `..`。 ## 响应参数 **content_sha256** `string` | 内容摘要 记忆正文的 SHA-256 摘要,以小写十六进制字符串表示,可用于校验内容完整性。 **content_size_bytes** `integer` | 内容字节数 记忆正文采用 UTF-8 编码后的字节数。 **created_at** `string` | 创建时间 记忆创建时间,采用 RFC 3339 UTC 格式。 **created_by** `object` | 创建者 创建该记忆的操作者信息。 **type** `string` | 操作者类型 `created_by.type` 操作者类型,固定为 `user_actor`,表示该 Memory 由当前 API 调用方创建。 **user_id** `string` | 用户 ID `created_by.user_id` 写入该记忆的用户 ID。 **id** `string` | 记忆 ID 服务端生成的记忆 ID,以 `mem-` 开头。后续查询、更新或删除记忆时,作为 `memory_id` 路径参数传入。 **memory_store_id** `string` | 记忆库 ID 该记忆所属的记忆库 ID。 **memory_version_id** `string` | 版本 ID 记忆条目的当前版本标识。内容或路径成功更新后,该值会变化。 **path** `string` | 记忆路径 记忆在记忆库中的文件路径。 **type** `string` | 对象类型 对象类型,固定为 `memory`。 **updated_at** `string` | 更新时间 记忆最后更新时间,采用 RFC 3339 UTC 格式。 ## 代码示例 ## 创建记忆条目 ### cURL #### Request ```Bash curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/memory_stores//memories" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d @- <<'EOF' { "path": "/notes/2026/q3-plan.md", "content": "Q3 目标:完成托管智能体接口全量上线。" } EOF ``` #### Response ``` { "id": "mem-", "type": "memory", "memory_store_id": "", "path": "/notes/2026/q3-plan.md", "content_sha256": "e774ea541686b734b4d19d3460264bc350ecaebef7f45e7ca2bc31a712b2a694", "content_size_bytes": 54, "memory_version_id": "", "created_by": {"type": "user_actor", "user_id": ""}, "created_at": "2026-09-17T16:02:50Z", "updated_at": "2026-09-17T16:02:51Z" } ``` ### Python #### Request ```python import os from arkruntime import Ark client = Ark( api_key=os.environ["ARK_API_KEY"], base_url="https://ark.cn-beijing.volces.com/api/v3", ) memory = client.memory_stores.memories.create( "", path="/notes/2026/q3-plan.md", content="Q3 目标:完成托管智能体接口全量上线。", ) print(memory) ``` #### Response ``` { "id": "mem-", "type": "memory", "memory_store_id": "", "path": "/notes/2026/q3-plan.md", "content_sha256": "e774ea541686b734b4d19d3460264bc350ecaebef7f45e7ca2bc31a712b2a694", "content_size_bytes": 54, "memory_version_id": "", "created_by": {"type": "user_actor", "user_id": ""}, "created_at": "2026-09-17T16:02:50Z", "updated_at": "2026-09-17T16:02:51Z" } ``` ### Java #### Request ```java // pom.xml 依赖: // // com.volcengine // ark-runtime // 0.9.0 // import com.volcengine.ark.runtime.models.memory.CreateMemoryRequest; import com.volcengine.ark.runtime.models.memory.Memory; import com.volcengine.ark.runtime.service.ArkService; public class Main { public static void main(String[] args) throws Exception { ArkService service = ArkService.builder() .apiKey(System.getenv("ARK_API_KEY")) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); Memory memory = service.createMemory( "", CreateMemoryRequest.builder() .path("/notes/2026/q3-plan.md") .content("Q3 目标:完成托管智能体接口全量上线。") .build()); System.out.println(memory); service.shutdownExecutor(); } } ``` #### Response ``` { "id": "mem-", "type": "memory", "memory_store_id": "", "path": "/notes/2026/q3-plan.md", "content_sha256": "e774ea541686b734b4d19d3460264bc350ecaebef7f45e7ca2bc31a712b2a694", "content_size_bytes": 54, "memory_version_id": "", "created_by": {"type": "user_actor", "user_id": ""}, "created_at": "2026-09-17T16:02:50Z", "updated_at": "2026-09-17T16:02:51Z" } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" memorymodel "github.com/volcengine/ark-runtime-go/arkruntime/model/memory" ) func main() { ctx := context.Background() client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) mem, err := client.CreateMemory(ctx, "", &memorymodel.CreateMemoryRequest{ Path: "/notes/2026/q3-plan.md", Content: "Q3 目标:完成托管智能体接口全量上线。", }) if err != nil { panic(err) } fmt.Println(mem) } ``` #### Response ``` { "id": "mem-", "type": "memory", "memory_store_id": "", "path": "/notes/2026/q3-plan.md", "content_sha256": "e774ea541686b734b4d19d3460264bc350ecaebef7f45e7ca2bc31a712b2a694", "content_size_bytes": 54, "memory_version_id": "", "created_by": {"type": "user_actor", "user_id": ""}, "created_at": "2026-09-17T16:02:50Z", "updated_at": "2026-09-17T16:02:51Z" } ``` --- # 批量创建记忆 Source: https://ark.volcengine.com/region:cn-beijing/docs/batch-create-memories-api `POST https://ark.cn-beijing.volces.com/api/v3/memory_stores/{memory_store_id}/memories/batch_create` 在指定记忆库中批量创建多条文本记忆,适合一次导入多个文件。仅写入一条时,可使用创建记忆接口。调用前需先创建记忆库,并使用创建或查询记忆库接口返回的 ID。 > **说明** > > **批量限制** > > - 单批必须包含 1–100 条记忆,总内容不超过 50 MiB。每条内容必须是有效的 UTF-8 文本,且不超过 100 KiB。 > - 批内路径重复时,整个请求返回 400 `InvalidParameter`。请求总量超限、批次参数非法或记忆库不可访问时,整个请求失败。 > - 每个记忆库最多保存 2000 条记忆。 > > **处理结果** > > - 批次通过整体校验后,各条目独立处理。响应中的 `results` 与请求 `items` 按顺序一一对应;单条路径、内容或冲突校验失败时,请求仍返回 200,并在对应的 `results[].error` 中给出错误。 > - 成功条目的 `results[].memory` 不返回记忆正文(`content`)。需要正文时,调用查询记忆详情接口。 > > **重试** > > - 重试前先核对各条结果。使用默认 `overwrite` 重试成功条目会再次更新其当前版本标识。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **memory_store_id** `string` `必选` | 记忆库 ID 用于指定目标记忆库,以 `memstore-` 开头。传入创建或查询记忆库接口返回的完整 ID,不要自行拼接。 ### Body 参数 **items** `object[]` `必选` | 记忆列表 本次批量创建的记忆条目。 > **注意** > > 单批包含 1–100 条记忆。批内 `path` 不得重复;重复时整个请求返回 400 `InvalidParameter`。 **content** `string` `必选` | 记忆内容 `items.content` 写入记忆文件的正文。 > **注意** > > 记忆内容必须是有效的 UTF-8 文本,单条不得超过 102400 字节(100 KiB)。 **path** `string` `必选` | 记忆路径 `items.path` 记忆在记忆库中的文件路径。 > **注意** > > 路径必须以 `/` 开头,以 `.md` 或 `.txt` 结尾,UTF-8 编码后不得超过 1024 字节,且不得包含控制字符、`%`、`;` 或 `?`;路径段不得为空、`.` 或 `..`。 **on_conflict** `string` `默认值 overwrite` | 冲突策略 指定目标 `path` 已存在同名记忆时的处理方式: - `overwrite`:用新内容覆盖已有记忆,并更新其当前版本标识。 - `fail`:保留已有记忆,该条目返回冲突错误,其他条目继续处理。 ## 响应参数 **results** `object[]` | 创建结果 各条记忆的创建结果,与请求 `items` 顺序一一对应。成功时返回 `memory`,失败时返回 `error`。 **path** `string` | 记忆路径 `results.path` 对应请求中的 `items[].path`,用于关联输入条目和创建结果。 **error** `object` | 错误信息 `results.error` 该条记忆失败时的错误信息;成功时不返回。 **message** `string` | 错误描述 `results.error.message` 该条记忆失败的原因说明,用于定位并修正输入。 **type** `string` | 错误类型 `results.error.type` 错误类型标识,用于分类该条记忆的失败原因。 **memory** `object` | 记忆详情 `results.memory` 成功创建或覆盖后的记忆详情;该条记忆失败时不返回。 **content_sha256** `string` | 内容摘要 `results.memory.content_sha256` 记忆正文的 SHA-256 摘要,以小写十六进制字符串表示,可用于校验内容完整性。 **content_size_bytes** `integer` | 内容字节数 `results.memory.content_size_bytes` 记忆正文采用 UTF-8 编码后的字节数。 **created_at** `string` | 创建时间 `results.memory.created_at` 记忆创建时间,采用 RFC 3339 UTC 格式。 **created_by** `object` | 创建者 `results.memory.created_by` 创建该记忆的操作者信息。 **type** `string` | 操作者类型 `results.memory.created_by.type` 操作者类型。`user_actor` 表示通过用户身份写入,`session_actor` 表示会话中的智能体写入。 **session_id** `string` | 会话 ID `results.memory.created_by.session_id` 写入该记忆的会话 ID,仅 `type` 为 `session_actor` 时返回。 **user_id** `string` | 用户 ID `results.memory.created_by.user_id` 写入该记忆的用户 ID,仅 `type` 为 `user_actor` 时返回。 **id** `string` | 记忆 ID `results.memory.id` 服务端生成的记忆 ID,以 `mem-` 开头。后续查询、更新或删除记忆时,作为 `memory_id` 路径参数传入。 **memory_store_id** `string` | 记忆库 ID `results.memory.memory_store_id` 该记忆所属的记忆库 ID。 **memory_version_id** `string` | 版本 ID `results.memory.memory_version_id` 记忆条目的当前版本标识。内容或路径成功更新后,该值会变化。 **path** `string` | 记忆路径 `results.memory.path` 记忆在记忆库中的文件路径。 **type** `string` | 对象类型 `results.memory.type` 对象类型,固定为 `memory`。 **updated_at** `string` | 更新时间 `results.memory.updated_at` 记忆最后更新时间,采用 RFC 3339 UTC 格式。 ## 代码示例 ## 批量创建记忆 ### cURL #### Request ```Bash curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/memory_stores//memories/batch_create" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d @- <<'EOF' { "items": [ { "path": "/notes/2026/q3-plan.md", "content": "Q3 目标:完成托管智能体接口全量上线。" }, { "path": "/notes/2026/q3-owners.md", "content": "接口 owner:接口团队;文档 owner:文档团队。" } ], "on_conflict": "fail" } EOF ``` #### Response ``` { "results": [ { "path": "/notes/2026/q3-plan.md", "memory": { "id": "mem-", "type": "memory", "memory_store_id": "", "path": "/notes/2026/q3-plan.md", "content_sha256": "e774ea541686b734b4d19d3460264bc350ecaebef7f45e7ca2bc31a712b2a694", "content_size_bytes": 54, "memory_version_id": "", "created_by": {"type": "user_actor", "user_id": ""}, "created_at": "2026-09-17T16:02:50Z", "updated_at": "2026-09-17T16:02:50Z" } }, { "path": "/notes/2026/q3-owners.md", "memory": { "id": "mem-", "type": "memory", "memory_store_id": "", "path": "/notes/2026/q3-owners.md", "content_sha256": "76a3fc07c4ab54fd1ce11d962dc31d256ad364628e84df5ee9a43b75a7d3cc28", "content_size_bytes": 60, "memory_version_id": "", "created_by": {"type": "user_actor", "user_id": ""}, "created_at": "2026-09-17T16:02:50Z", "updated_at": "2026-09-17T16:02:50Z" } } ] } ``` ### Python #### Request ```python import json import os import urllib.request body = { "items": [ {"path": "/notes/2026/q3-plan.md", "content": "Q3 目标:完成托管智能体接口全量上线。"}, {"path": "/notes/2026/q3-owners.md", "content": "接口 owner:接口团队;文档 owner:文档团队。"}, ], "on_conflict": "fail", } req = urllib.request.Request( "https://ark.cn-beijing.volces.com/api/v3/memory_stores//memories/batch_create", headers={ "Authorization": f"Bearer {os.environ['ARK_API_KEY']}", "Content-Type": "application/json", }, data=json.dumps(body, ensure_ascii=False).encode(), method="POST", ) with urllib.request.urlopen(req) as resp: print(resp.read().decode()) ``` #### Response ``` { "results": [ { "path": "/notes/2026/q3-plan.md", "memory": { "id": "mem-", "type": "memory", "memory_store_id": "", "path": "/notes/2026/q3-plan.md", "content_sha256": "e774ea541686b734b4d19d3460264bc350ecaebef7f45e7ca2bc31a712b2a694", "content_size_bytes": 54, "memory_version_id": "", "created_by": {"type": "user_actor", "user_id": ""}, "created_at": "2026-09-17T16:02:50Z", "updated_at": "2026-09-17T16:02:50Z" } }, { "path": "/notes/2026/q3-owners.md", "memory": { "id": "mem-", "type": "memory", "memory_store_id": "", "path": "/notes/2026/q3-owners.md", "content_sha256": "76a3fc07c4ab54fd1ce11d962dc31d256ad364628e84df5ee9a43b75a7d3cc28", "content_size_bytes": 60, "memory_version_id": "", "created_by": {"type": "user_actor", "user_id": ""}, "created_at": "2026-09-17T16:02:50Z", "updated_at": "2026-09-17T16:02:50Z" } } ] } ``` ### Java #### Request ```java import okhttp3.MediaType; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; public class Main { public static void main(String[] args) throws Exception { String body = "{\"items\":[" + "{\"path\":\"/notes/2026/q3-plan.md\"," + "\"content\":\"Q3 目标:完成托管智能体接口全量上线。\"}," + "{\"path\":\"/notes/2026/q3-owners.md\"," + "\"content\":\"接口 owner:接口团队;文档 owner:文档团队。\"}" + "],\"on_conflict\":\"fail\"}"; Request req = new Request.Builder() .url("https://ark.cn-beijing.volces.com/api/v3" + "/memory_stores//memories/batch_create") .addHeader("Authorization", "Bearer " + System.getenv("ARK_API_KEY")) .post(RequestBody.create( MediaType.parse("application/json"), body)) .build(); try (Response resp = new OkHttpClient().newCall(req).execute()) { String responseBody = resp.body() == null ? "" : resp.body().string(); if (!resp.isSuccessful()) { throw new IllegalStateException( "HTTP " + resp.code() + ": " + responseBody); } System.out.println(responseBody); } } } ``` #### Response ``` { "results": [ { "path": "/notes/2026/q3-plan.md", "memory": { "id": "mem-", "type": "memory", "memory_store_id": "", "path": "/notes/2026/q3-plan.md", "content_sha256": "e774ea541686b734b4d19d3460264bc350ecaebef7f45e7ca2bc31a712b2a694", "content_size_bytes": 54, "memory_version_id": "", "created_by": {"type": "user_actor", "user_id": ""}, "created_at": "2026-09-17T16:02:50Z", "updated_at": "2026-09-17T16:02:50Z" } }, { "path": "/notes/2026/q3-owners.md", "memory": { "id": "mem-", "type": "memory", "memory_store_id": "", "path": "/notes/2026/q3-owners.md", "content_sha256": "76a3fc07c4ab54fd1ce11d962dc31d256ad364628e84df5ee9a43b75a7d3cc28", "content_size_bytes": 60, "memory_version_id": "", "created_by": {"type": "user_actor", "user_id": ""}, "created_at": "2026-09-17T16:02:50Z", "updated_at": "2026-09-17T16:02:50Z" } } ] } ``` ### Go #### Request ```go package main import ( "bytes" "context" "fmt" "io" "net/http" "os" ) func main() { ctx := context.Background() body := []byte(`{ "items": [ {"path": "/notes/2026/q3-plan.md", "content": "Q3 目标:完成托管智能体接口全量上线。"}, {"path": "/notes/2026/q3-owners.md", "content": "接口 owner:接口团队;文档 owner:文档团队。"} ], "on_conflict": "fail" }`) req, _ := http.NewRequestWithContext(ctx, "POST", "https://ark.cn-beijing.volces.com/api/v3/memory_stores//memories/batch_create", bytes.NewReader(body)) req.Header.Set("Authorization", "Bearer "+os.Getenv("ARK_API_KEY")) req.Header.Set("Content-Type", "application/json") resp, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer resp.Body.Close() if resp.StatusCode >= http.StatusBadRequest { responseBody, _ := io.ReadAll(resp.Body) panic(fmt.Sprintf("HTTP %d: %s", resp.StatusCode, responseBody)) } if _, err := io.Copy(os.Stdout, resp.Body); err != nil { panic(err) } fmt.Println() } ``` #### Response ``` { "results": [ { "path": "/notes/2026/q3-plan.md", "memory": { "id": "mem-", "type": "memory", "memory_store_id": "", "path": "/notes/2026/q3-plan.md", "content_sha256": "e774ea541686b734b4d19d3460264bc350ecaebef7f45e7ca2bc31a712b2a694", "content_size_bytes": 54, "memory_version_id": "", "created_by": {"type": "user_actor", "user_id": ""}, "created_at": "2026-09-17T16:02:50Z", "updated_at": "2026-09-17T16:02:50Z" } }, { "path": "/notes/2026/q3-owners.md", "memory": { "id": "mem-", "type": "memory", "memory_store_id": "", "path": "/notes/2026/q3-owners.md", "content_sha256": "76a3fc07c4ab54fd1ce11d962dc31d256ad364628e84df5ee9a43b75a7d3cc28", "content_size_bytes": 60, "memory_version_id": "", "created_by": {"type": "user_actor", "user_id": ""}, "created_at": "2026-09-17T16:02:50Z", "updated_at": "2026-09-17T16:02:50Z" } } ] } ``` --- # 查询记忆列表 Source: https://ark.volcengine.com/region:cn-beijing/docs/list-memories-api `GET https://ark.cn-beijing.volces.com/api/v3/memory_stores/{memory_store_id}/memories` 查询指定记忆库中的记忆条目。支持按 `path_prefix` 筛选,并通过 `depth` 折叠子目录。列表项仅包含路径和精简信息,不含 `content`;需要正文时,调用查询记忆详情接口。 > **说明** > > 记忆库不存在或不可访问时返回 404 `InvalidMemoryStore.NotFound`。`path_prefix`、`depth`、`order_by`、`limit` 或下一页标识不合法时返回 400 `InvalidParameter`;翻页期间保持筛选条件和每页数量不变。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **memory_store_id** `string` `必选` | 记忆库 ID 用于指定目标记忆库,以 `memstore-` 开头。传入创建或查询记忆库接口返回的完整 ID,不要自行拼接。 ### Query 参数 > 在 URL Query String 中传入。 **depth** `integer` | 折叠层数 控制从 `path_prefix` 之后展示的目录层数。省略时,平铺返回全部匹配的记忆。 例如,`path_prefix` 为 `/preferences/` 且 `depth` 为 `1` 时: * `/preferences/language.md` 作为 `memory` 返回。 * 更深层级的记忆合并为 `/preferences/editors/` 等 `memory_prefix` 项。 > **说明** > > 取值必须大于等于 1。取值大于匹配路径的实际目录层级时,所有匹配的记忆均以 `memory` 类型返回,不再生成 `memory_prefix` 折叠项。 **最小值**:`1` **limit** `integer` `默认值 100` | 每页数量 单页返回的记忆条目数量。 **取值范围**:`[1, 2000]` **order_by** `string` `默认值 path` | 排序字段 指定列表排序方式。可选值:`path`、`updated_at`、`created_at`。 > **说明** > > - `path`:按路径字典序排列。 > - `updated_at`:按更新时间倒序排列。 > - `created_at`:按创建时间倒序排列。 **page** `string` | 下一页标识 上一页响应返回的下一页标识。首次请求时省略;后续请求将 `next_page` 的值原样传入。 > **说明** > > 下一页标识与 `path_prefix`、`depth`、`order_by` 和 `limit` 绑定。翻页过程中修改任一参数会返回 400 `InvalidParameter`。 **path_prefix** `string` | 路径前缀 按记忆 `path` 字段的目录前缀筛选。非空值必须以 `/` 开头;服务端按目录边界匹配,`/foo` 与 `/foo/` 等价,不会匹配 `/foobar.md`。 ## 响应参数 **data** `object[]` | 记忆列表 记忆列表项。`type` 为 `memory` 时返回文件元信息;`type` 为 `memory_prefix` 时返回折叠目录的 `path` 和 `memory_count`。 **path** `string` | 记忆路径 `data.path` 记忆文件或折叠目录的路径;`memory_prefix` 类型时以 `/` 结尾。 **type** `string` | 列表项类型 `data.type` 列表项类型。`memory` 表示记忆文件,`memory_prefix` 表示折叠目录。 **content_sha256** `string` | 内容摘要 `data.content_sha256` 记忆正文的 SHA-256 摘要,以小写十六进制字符串表示,仅 `type` 为 `memory` 时返回。 **content_size_bytes** `integer` | 内容字节数 `data.content_size_bytes` 记忆正文采用 UTF-8 编码后的字节数,仅 `type` 为 `memory` 时返回。 **created_at** `string` | 创建时间 `data.created_at` 创建时间,仅 `type` 为 `memory` 时返回,采用 RFC 3339 UTC 格式。 **id** `string` | 记忆 ID `data.id` 服务端生成的记忆 ID,仅 `type` 为 `memory` 时返回。后续查询、更新或删除记忆时,作为 `memory_id` 路径参数传入。 **memory_count** `integer` | 记忆条数 `data.memory_count` 折叠目录下的记忆条数,仅 `type` 为 `memory_prefix` 时返回。 **memory_store_id** `string` | 记忆库 ID `data.memory_store_id` 该记忆所属的记忆库 ID,仅 `type` 为 `memory` 时返回。 **memory_version_id** `string` | 版本 ID `data.memory_version_id` 记忆条目的当前版本标识,仅 `type` 为 `memory` 时返回。内容或路径成功更新后,该值会变化。 **updated_at** `string` | 更新时间 `data.updated_at` 最后更新时间,仅 `type` 为 `memory` 时返回,采用 RFC 3339 UTC 格式。 **next_page** `string` | 下一页标识 下一页标识。返回非空值时,将其原样传入下一次请求的 `page` 参数;无更多数据时不返回该字段。 **prefixes** `string[]` | 折叠前缀列表 当前返回空数组。折叠目录通过 `data[]` 中 `type` 为 `memory_prefix` 的列表项返回。 ## 代码示例 ## 查询记忆条目列表 ### cURL #### Request ```Bash curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/memory_stores//memories?limit=20&path_prefix=/notes/" \ -H "Authorization: Bearer $ARK_API_KEY" ``` #### Response ``` { "data": [ { "type": "memory", "id": "mem-", "memory_store_id": "", "path": "/notes/2026/q3-plan.md", "content_sha256": "e774ea541686b734b4d19d3460264bc350ecaebef7f45e7ca2bc31a712b2a694", "content_size_bytes": 54, "memory_version_id": "", "created_at": "2026-09-17T16:02:50Z", "updated_at": "2026-09-17T16:02:51Z" } ], "next_page": "", "prefixes": [] } ``` ### Python #### Request ```python import os from arkruntime import Ark client = Ark( api_key=os.environ["ARK_API_KEY"], base_url="https://ark.cn-beijing.volces.com/api/v3", ) page = client.memory_stores.memories.list( "", path_prefix="/notes/", limit=20, ) print(page) ``` #### Response ``` { "data": [ { "type": "memory", "id": "mem-", "memory_store_id": "", "path": "/notes/2026/q3-plan.md", "content_sha256": "e774ea541686b734b4d19d3460264bc350ecaebef7f45e7ca2bc31a712b2a694", "content_size_bytes": 54, "memory_version_id": "", "created_at": "2026-09-17T16:02:50Z", "updated_at": "2026-09-17T16:02:51Z" } ], "next_page": "", "prefixes": [] } ``` ### Java #### Request ```java // pom.xml 依赖: // // com.volcengine // ark-runtime // 0.9.0 // import com.volcengine.ark.runtime.models.memory.ListMemoriesResponse; import com.volcengine.ark.runtime.service.ArkService; public class Main { public static void main(String[] args) throws Exception { ArkService service = ArkService.builder() .apiKey(System.getenv("ARK_API_KEY")) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); ListMemoriesResponse page = service.listMemories( "", "/notes/", null, null, 20, null); System.out.println(page); service.shutdownExecutor(); } } ``` #### Response ``` { "data": [ { "type": "memory", "id": "mem-", "memory_store_id": "", "path": "/notes/2026/q3-plan.md", "content_sha256": "e774ea541686b734b4d19d3460264bc350ecaebef7f45e7ca2bc31a712b2a694", "content_size_bytes": 54, "memory_version_id": "", "created_at": "2026-09-17T16:02:50Z", "updated_at": "2026-09-17T16:02:51Z" } ], "next_page": "", "prefixes": [] } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" memorymodel "github.com/volcengine/ark-runtime-go/arkruntime/model/memory" ) func main() { ctx := context.Background() client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) resp, err := client.ListMemories(ctx, "", &memorymodel.MemoriesListParams{ PathPrefix: memorymodel.NewOptString("/notes/"), Limit: memorymodel.NewOptInt32(20), }) if err != nil { panic(err) } fmt.Println(resp) } ``` #### Response ``` { "data": [ { "type": "memory", "id": "mem-", "memory_store_id": "", "path": "/notes/2026/q3-plan.md", "content_sha256": "e774ea541686b734b4d19d3460264bc350ecaebef7f45e7ca2bc31a712b2a694", "content_size_bytes": 54, "memory_version_id": "", "created_at": "2026-09-17T16:02:50Z", "updated_at": "2026-09-17T16:02:51Z" } ], "next_page": "", "prefixes": [] } ``` ## 查询末页 ### cURL #### Request ```Bash curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/memory_stores//memories?limit=20&path_prefix=/notes/&page=" \ -H "Authorization: Bearer $ARK_API_KEY" ``` #### Response ``` { "data": [], "prefixes": [] } ``` --- # 查询记忆详情 Source: https://ark.volcengine.com/region:cn-beijing/docs/get-memory-api `GET https://ark.cn-beijing.volces.com/api/v3/memory_stores/{memory_store_id}/memories/{memory_id}` 按 ID 查询单条记忆的完整信息,包括 `content` 正文。 * 浏览路径和精简元信息时,使用查询记忆列表接口。 * 获取某条记忆的完整正文时,使用本接口,并传入同一记忆库下的完整记忆 ID。 调用前需已创建记忆库和记忆条目。 > **说明** > > 记忆库不存在或不可访问时返回 404 `InvalidMemoryStore.NotFound`;记忆不存在时返回 404 `ResourceNotFound`。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **memory_id** `string` `必选` | 记忆 ID 用于定位要查询的记忆,以 `mem-` 开头。传入创建、列表或更新接口返回的完整 ID,不要自行拼接。 **memory_store_id** `string` `必选` | 记忆库 ID 用于指定记忆所属的记忆库,以 `memstore-` 开头。传入创建或列表接口返回的完整 ID,不要自行拼接。 ## 响应参数 **content** `string` | 记忆内容 记忆正文,为 UTF-8 文本。本接口返回 `content`;可结合 `content_sha256` 和 `content_size_bytes` 校验完整性。 **content_sha256** `string` | 内容摘要 记忆正文的 SHA-256 摘要,以小写十六进制字符串表示,可用于校验内容完整性。 **content_size_bytes** `integer` | 内容字节数 记忆正文采用 UTF-8 编码后的字节数。 **created_at** `string` | 创建时间 记忆创建时间,采用 RFC 3339 UTC 格式。 **created_by** `object` | 创建者 创建该记忆的操作者信息。 **type** `string` | 操作者类型 `created_by.type` 操作者类型。`user_actor` 表示通过用户身份写入,`session_actor` 表示会话中的智能体写入。 **session_id** `string` | 会话 ID `created_by.session_id` 写入该记忆的会话 ID,仅 `type` 为 `session_actor` 时返回。 **user_id** `string` | 用户 ID `created_by.user_id` 写入该记忆的用户 ID,仅 `type` 为 `user_actor` 时返回。 **id** `string` | 记忆 ID 服务端生成的记忆 ID,以 `mem-` 开头。后续查询、更新或删除记忆时,作为 `memory_id` 路径参数传入。 **memory_store_id** `string` | 记忆库 ID 该记忆所属的记忆库 ID。 **memory_version_id** `string` | 版本 ID 记忆条目的当前版本标识。内容或路径成功更新后,该值会变化。 **path** `string` | 记忆路径 记忆在记忆库中的文件路径。 **type** `string` | 对象类型 对象类型,固定为 `memory`。 **updated_at** `string` | 更新时间 记忆最后更新时间,采用 RFC 3339 UTC 格式。 ## 代码示例 ## 查询记忆详情 ### cURL #### Request ```Bash curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/memory_stores//memories/" \ -H "Authorization: Bearer $ARK_API_KEY" ``` #### Response ``` { "id": "mem-", "type": "memory", "memory_store_id": "", "path": "/notes/2026/q3-plan.md", "content": "Q3 目标:完成托管智能体接口全量上线。", "content_sha256": "e774ea541686b734b4d19d3460264bc350ecaebef7f45e7ca2bc31a712b2a694", "content_size_bytes": 54, "memory_version_id": "", "created_by": {"type": "user_actor", "user_id": ""}, "created_at": "2026-09-17T16:02:50Z", "updated_at": "2026-09-17T16:02:51Z" } ``` ### Python #### Request ```python import os from arkruntime import Ark client = Ark( api_key=os.environ["ARK_API_KEY"], base_url="https://ark.cn-beijing.volces.com/api/v3", ) memory = client.memory_stores.memories.retrieve( "", "" ) print(memory) ``` #### Response ``` { "id": "mem-", "type": "memory", "memory_store_id": "", "path": "/notes/2026/q3-plan.md", "content": "Q3 目标:完成托管智能体接口全量上线。", "content_sha256": "e774ea541686b734b4d19d3460264bc350ecaebef7f45e7ca2bc31a712b2a694", "content_size_bytes": 54, "memory_version_id": "", "created_by": {"type": "user_actor", "user_id": ""}, "created_at": "2026-09-17T16:02:50Z", "updated_at": "2026-09-17T16:02:51Z" } ``` ### Java #### Request ```java // pom.xml 依赖: // // com.volcengine // ark-runtime // 0.9.0 // import com.volcengine.ark.runtime.models.memory.Memory; import com.volcengine.ark.runtime.service.ArkService; public class Main { public static void main(String[] args) throws Exception { ArkService service = ArkService.builder() .apiKey(System.getenv("ARK_API_KEY")) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); Memory memory = service.getMemory("", ""); System.out.println(memory); service.shutdownExecutor(); } } ``` #### Response ``` { "id": "mem-", "type": "memory", "memory_store_id": "", "path": "/notes/2026/q3-plan.md", "content": "Q3 目标:完成托管智能体接口全量上线。", "content_sha256": "e774ea541686b734b4d19d3460264bc350ecaebef7f45e7ca2bc31a712b2a694", "content_size_bytes": 54, "memory_version_id": "", "created_by": {"type": "user_actor", "user_id": ""}, "created_at": "2026-09-17T16:02:50Z", "updated_at": "2026-09-17T16:02:51Z" } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" ) func main() { ctx := context.Background() client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) mem, err := client.GetMemory(ctx, "", "") if err != nil { panic(err) } fmt.Println(mem) } ``` #### Response ``` { "id": "mem-", "type": "memory", "memory_store_id": "", "path": "/notes/2026/q3-plan.md", "content": "Q3 目标:完成托管智能体接口全量上线。", "content_sha256": "e774ea541686b734b4d19d3460264bc350ecaebef7f45e7ca2bc31a712b2a694", "content_size_bytes": 54, "memory_version_id": "", "created_by": {"type": "user_actor", "user_id": ""}, "created_at": "2026-09-17T16:02:50Z", "updated_at": "2026-09-17T16:02:51Z" } ``` --- # 更新记忆 Source: https://ark.volcengine.com/region:cn-beijing/docs/update-memory-api `POST https://ark.cn-beijing.volces.com/api/v3/memory_stores/{memory_store_id}/memories/{memory_id}` 按字段更新记忆的正文、路径或两者;未传字段保持不变。更新 `path` 后,响应会返回新的记忆 ID,旧 ID 立即失效,继续使用旧 ID 查询、更新或删除会返回 404 `ResourceNotFound`;后续请求必须改用响应中的新 ID。 > **说明** > > - 并发修改导致冲突时,重新查询最新记忆后再重试。 > - 更新响应不返回记忆正文(`content`)。需要确认更新后的正文时,调用查询记忆详情接口。 > - 仅传入与当前值相同的 `path` 且不传 `content` 时,不会产生实际更新,ID、版本标识和更新时间保持不变。 > - 常见失败包括:记忆库或记忆不存在、路径或内容不合法、目标路径已存在、正文超过 100 KiB,以及并发修改冲突。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **memory_id** `string` `必选` | 记忆 ID 用于定位要更新的记忆,以 `mem-` 开头。传入创建、列表或更新接口返回的完整 ID,不要自行拼接。 **memory_store_id** `string` `必选` | 记忆库 ID 用于指定记忆所属的记忆库,以 `memstore-` 开头。传入创建或查询记忆库接口返回的完整 ID,不要自行拼接。 ### Body 参数 **content** `string` | 记忆内容 用于替换现有正文的记忆内容。省略时保持现有正文不变。 > **注意** > > 记忆正文必须是有效的 UTF-8 文本,且不得超过 102400 字节(100 KiB)。`content` 与 `path` 至少提供一个。 **path** `string` | 记忆路径 用于重命名记忆的文件路径。省略时保持现有路径不变。 > **注意** > > 路径必须以 `/` 开头,以 `.md` 或 `.txt` 结尾,UTF-8 编码后不得超过 1024 字节,且不得包含控制字符、`%`、`;` 或 `?`;路径段不得为空、`.` 或 `..`。`content` 与 `path` 至少提供一个。 ## 响应参数 **content_sha256** `string` | 内容摘要 记忆正文的 SHA-256 摘要,以小写十六进制字符串表示,可用于校验内容完整性。 **content_size_bytes** `integer` | 内容字节数 记忆正文采用 UTF-8 编码后的字节数。 **created_at** `string` | 创建时间 记忆创建时间,采用 RFC 3339 UTC 格式。 **created_by** `object` | 创建者 创建该记忆的操作者信息。 **type** `string` | 操作者类型 `created_by.type` 操作者类型。`user_actor` 表示通过用户身份写入,`session_actor` 表示会话中的智能体写入。 **session_id** `string` | 会话 ID `created_by.session_id` 写入该记忆的会话 ID,仅 `type` 为 `session_actor` 时返回。 **user_id** `string` | 用户 ID `created_by.user_id` 写入该记忆的用户 ID,仅 `type` 为 `user_actor` 时返回。 **id** `string` | 记忆 ID 服务端生成的记忆 ID,以 `mem-` 开头。后续查询、更新或删除记忆时,作为 `memory_id` 路径参数传入。 **memory_store_id** `string` | 记忆库 ID 该记忆所属的记忆库 ID。 **memory_version_id** `string` | 版本 ID 记忆条目的当前版本标识。内容或路径成功更新后,该值会变化。 **path** `string` | 记忆路径 记忆在记忆库中的文件路径。 **type** `string` | 对象类型 对象类型,固定为 `memory`。 **updated_at** `string` | 更新时间 记忆最后更新时间,采用 RFC 3339 UTC 格式。 ## 代码示例 ## 更新记忆条目 ### cURL #### Request ```Bash curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/memory_stores//memories/" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d @- <<'EOF' { "content": "Q3 目标(已修订):完成托管智能体接口全量上线,并接入 skill hub。" } EOF ``` #### Response ``` { "id": "", "type": "memory", "memory_store_id": "", "path": "/notes/2026/q3-plan.md", "content_sha256": "046f9e0b839a060b93aca62932d586e2d6d70f03b6c248d02345dc98c4d8ec3d", "content_size_bytes": 91, "memory_version_id": "", "created_by": {"type": "user_actor", "user_id": ""}, "created_at": "2026-09-17T16:02:50Z", "updated_at": "2026-09-17T16:02:57Z" } ``` ### Python #### Request ```python import os from arkruntime import Ark client = Ark( api_key=os.environ["ARK_API_KEY"], base_url="https://ark.cn-beijing.volces.com/api/v3", ) memory = client.memory_stores.memories.update( "", "", content="Q3 目标(已修订):完成托管智能体接口全量上线,并接入 skill hub。", ) print(memory) ``` #### Response ``` { "id": "", "type": "memory", "memory_store_id": "", "path": "/notes/2026/q3-plan.md", "content_sha256": "046f9e0b839a060b93aca62932d586e2d6d70f03b6c248d02345dc98c4d8ec3d", "content_size_bytes": 91, "memory_version_id": "", "created_by": {"type": "user_actor", "user_id": ""}, "created_at": "2026-09-17T16:02:50Z", "updated_at": "2026-09-17T16:02:57Z" } ``` ### Java #### Request ```java // pom.xml 依赖: // // com.volcengine // ark-runtime // 0.9.0 // import com.volcengine.ark.runtime.models.memory.Memory; import com.volcengine.ark.runtime.models.memory.UpdateMemoryRequest; import com.volcengine.ark.runtime.service.ArkService; public class Main { public static void main(String[] args) throws Exception { ArkService service = ArkService.builder() .apiKey(System.getenv("ARK_API_KEY")) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); Memory memory = service.updateMemory( "", "", UpdateMemoryRequest.builder() .content("Q3 目标(已修订):完成托管智能体接口全量上线,并接入 skill hub。") .build()); System.out.println(memory); service.shutdownExecutor(); } } ``` #### Response ``` { "id": "", "type": "memory", "memory_store_id": "", "path": "/notes/2026/q3-plan.md", "content_sha256": "046f9e0b839a060b93aca62932d586e2d6d70f03b6c248d02345dc98c4d8ec3d", "content_size_bytes": 91, "memory_version_id": "", "created_by": {"type": "user_actor", "user_id": ""}, "created_at": "2026-09-17T16:02:50Z", "updated_at": "2026-09-17T16:02:57Z" } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" memorymodel "github.com/volcengine/ark-runtime-go/arkruntime/model/memory" ) func main() { ctx := context.Background() client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) mem, err := client.UpdateMemory(ctx, "", "", &memorymodel.UpdateMemoryRequest{ Content: memorymodel.NewOptString("Q3 目标(已修订):完成托管智能体接口全量上线,并接入 skill hub。"), }) if err != nil { panic(err) } fmt.Println(mem) } ``` #### Response ``` { "id": "", "type": "memory", "memory_store_id": "", "path": "/notes/2026/q3-plan.md", "content_sha256": "046f9e0b839a060b93aca62932d586e2d6d70f03b6c248d02345dc98c4d8ec3d", "content_size_bytes": 91, "memory_version_id": "", "created_by": {"type": "user_actor", "user_id": ""}, "created_at": "2026-09-17T16:02:50Z", "updated_at": "2026-09-17T16:02:57Z" } ``` --- # 删除记忆 Source: https://ark.volcengine.com/region:cn-beijing/docs/delete-memory-api `DELETE https://ark.cn-beijing.volces.com/api/v3/memory_stores/{memory_store_id}/memories/{memory_id}` 删除单条记忆条目。删除后,原 `path` 可用于重新创建同名记忆。仅删除单条记忆时使用本接口;需要删除整个记忆库及其中全部记忆时,使用删除记忆库接口。 > **注意** > > 即使所属记忆库已挂载到会话,也可以删除该记忆。删除后,相关会话将无法再读取该条目;删除前需确认业务影响。 > **说明** > > 当记忆库不存在或当前账号、项目无权访问时,统一返回 404 `InvalidMemoryStore.NotFound`;记忆不存在时返回 404 `ResourceNotFound`。重复删除已不存在的记忆时,可将 404 `ResourceNotFound` 视为目标记忆已不存在。并发修改导致删除失败时返回 409 `ResourceConflict`,重新查询后再重试。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **memory_id** `string` `必选` | 记忆 ID 用于定位要删除的记忆,以 `mem-` 开头。传入创建、列表或更新接口返回的完整 ID,不要自行拼接。 **memory_store_id** `string` `必选` | 记忆库 ID 用于指定记忆所属的记忆库,以 `memstore-` 开头。传入创建或查询接口返回的完整 ID,不要自行拼接。 ## 响应参数 **id** `string` | 记忆 ID 已删除的记忆条目 ID,与请求中的 `memory_id` 相同。 **type** `string` | 对象类型 对象类型,固定为 `memory_deleted`。 ## 代码示例 ## 删除记忆条目 ### cURL #### Request ```Bash curl -sS --fail-with-body -X DELETE "https://ark.cn-beijing.volces.com/api/v3/memory_stores//memories/" \ -H "Authorization: Bearer $ARK_API_KEY" ``` #### Response ``` { "id": "", "type": "memory_deleted" } ``` ### Python #### Request ```python import os from arkruntime import Ark client = Ark( api_key=os.environ["ARK_API_KEY"], base_url="https://ark.cn-beijing.volces.com/api/v3", ) response = client.memory_stores.memories.delete("", "") print(response) ``` #### Response ``` { "id": "", "type": "memory_deleted" } ``` ### Java #### Request ```java // pom.xml 依赖: // // com.volcengine // ark-runtime // 0.9.0 // import com.volcengine.ark.runtime.service.ArkService; public class Main { public static void main(String[] args) throws Exception { ArkService service = ArkService.builder() .apiKey(System.getenv("ARK_API_KEY")) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); Object response = service.deleteMemory("", ""); System.out.println(response); service.shutdownExecutor(); } } ``` #### Response ``` { "id": "", "type": "memory_deleted" } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" ) func main() { ctx := context.Background() client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) response, err := client.DeleteMemory(ctx, "", "") if err != nil { panic(err) } fmt.Println(response) } ``` #### Response ``` { "id": "", "type": "memory_deleted" } ``` --- # 创建 Dream Source: https://ark.volcengine.com/region:cn-beijing/docs/create-dream-api `POST https://ark.cn-beijing.volces.com/api/v3/dreams` 创建一个异步记忆整理任务。每个任务读取一个已有 Memory Store 和 1~100 个历史 Session,生成一个新的 Memory Store,不修改输入 Memory Store。 输出 Memory Store 会与任务一起创建,但在任务处于 `pending` 或 `running` 状态时不可挂载、读取或修改。任务最长执行 48 小时。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Body 参数 **inputs** `object[]` `必选` | 任务输入 任务输入,必须恰好包含一个 `memory_store` 输入和一个 `sessions` 输入。 源记忆库输入 `object` 指定一个源 Memory Store。 **memory_store_id** `string` `必选` | 源记忆库 ID `inputs.memory_store_id` 源 Memory Store ID,不能仅包含空白字符。 **type** `string` `必选` | 输入类型 `inputs.type` 输入类型,固定为 `memory_store`。 历史会话输入 `object` 指定一组历史 Session。 **session_ids** `string[]` `必选` | 历史会话 ID `inputs.session_ids` 历史 Session ID 列表,需包含 1~100 个不重复且不能仅包含空白字符的 ID。 **type** `string` `必选` | 输入类型 `inputs.type` 输入类型,固定为 `sessions`。 **model** `string` `必选` | 模型 ID 执行记忆整理任务的模型 ID。模型必须已在当前项目中开通。 **output_memory_store_name** `string` `必选` | 输出记忆库名称 输出 Memory Store 的名称,长度为 1~64 个 Unicode 字符,不能仅包含空白字符。 **instructions** `string` | 整理指令 记忆整理要求,例如主题筛选、隐私信息剥离和归档规则。最多包含 4096 个 Unicode 字符。 **output_memory_store_description** `string` | 输出记忆库描述 输出 Memory Store 的描述,最多包含 300 个 Unicode 字符。省略时使用空描述。 ## 响应参数 **created_at** `string` | 创建时间 任务创建时间,RFC 3339 格式。 **id** `string` | Dream ID Dream 任务的唯一标识符,格式为 `drm-` 开头的字符串。 **inputs** `object[]` | 任务输入 创建任务时保存的输入快照。 源记忆库输入 `object` 创建任务时保存的源 Memory Store 输入。 **memory_store_id** `string` | 源记忆库 ID `inputs.memory_store_id` 源 Memory Store ID。 **type** `string` | 输入类型 `inputs.type` 输入类型,固定为 `memory_store`。 历史会话输入 `object` 创建任务时保存的历史 Session 输入。 **session_ids** `string[]` | 历史会话 ID `inputs.session_ids` 创建任务时保存的历史 Session ID 列表。 **type** `string` | 输入类型 `inputs.type` 输入类型,固定为 `sessions`。 **model** `object` | 模型信息 执行记忆整理任务的模型信息。 **id** `string` | 模型 ID `model.id` 执行记忆整理任务的模型 ID。 **outputs** `object[]` | 任务输出 Dream 创建的输出 Memory Store。访问时机和内容完整性由 `status` 表示。 **memory_store_id** `string` | 输出记忆库 ID `outputs.memory_store_id` Dream 创建的输出 Memory Store ID。 **type** `string` | 输出类型 `outputs.type` 输出类型,固定为 `memory_store`。 **status** `string` | 任务状态 Dream 任务状态。创建成功后通常为 `pending`。 - `pending`:任务已受理,正在等待执行,输出 Memory Store 尚不可访问。 - `running`:任务正在执行,输出 Memory Store 尚不可访问。 - `completed`:任务已完成,输出 Memory Store 可以使用。 - `failed`:任务执行失败,输出 Memory Store 可以访问,但内容可能为空或不完整;可通过 `error` 查看原因。 - `canceled`:任务已取消,输出 Memory Store 可以访问,但内容可能为空或不完整。 **type** `string` | 对象类型 对象类型,固定为 `dream`。 **ended_at** `string` | 结束时间 任务进入终态的时间,RFC 3339 格式。任务未结束时为 `null`。 **error** `object` | 失败信息 任务异步执行失败的信息。任务未失败时为 `null`。 **message** `string` | 错误信息 `error.message` Dream 执行失败的原因,用于定位任务失败问题。 **type** `string` | 错误类型 `error.type` 错误类型。`timeout` 表示任务超时;`internal_error` 表示任务执行期间发生内部错误。 **instructions** `string` | 整理指令 创建任务时传入的记忆整理要求。未传入时为 `null`。 **running_time** `number` | 累计运行时长 Dream 排除空闲间隔后的累计运行时长,单位为秒。暂未获得时为 `null`。 **usage** `object` | 用量统计 任务的 Token 用量。值为 `null` 时表示用量未知,不能解释为零消耗。 **cache_creation_input_tokens** `integer` | 缓存创建 Token 数 `usage.cache_creation_input_tokens` 写入缓存的输入 Token 数。 **cache_read_input_tokens** `integer` | 缓存读取 Token 数 `usage.cache_read_input_tokens` 从缓存读取的输入 Token 数。 **input_tokens** `integer` | 输入 Token 数 `usage.input_tokens` 本次 Dream 执行消耗的输入 token 数。 **output_tokens** `integer` | 输出 Token 数 `usage.output_tokens` 本次 Dream 执行生成的输出 token 数。 ## 代码示例 ## 创建 Dream ### cURL #### Request ```bash dream=$( curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/dreams" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d @- <" }, "instructions": "保留稳定偏好和已验证结论;删除重复、过期和包含个人身份的信息;按主题组织结果。", "created_at": "2026-09-24T06:30:00Z", "ended_at": null, "usage": null, "running_time": null, "error": null } ``` --- # 查询 Dream 列表 Source: https://ark.volcengine.com/region:cn-beijing/docs/list-dreams-api `GET https://ark.cn-beijing.volces.com/api/v3/dreams` 分页查询当前账号和项目下的 Dream 任务。支持按任务状态和输入 Memory Store 筛选,并按创建时间升序或降序返回。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Query 参数 > 在 URL Query String 中传入。 **limit** `integer` `默认值 20` | 每页数量 每页返回的 Dream 数量,取值范围为 1~100。 **取值范围**:`[1, 100]` **order** `string` `默认值 desc` | 排序方式 Dream 的创建时间排序方式。`asc` 表示升序,`desc` 表示降序。 **page** `string` | 下一页标识 首次请求时省略该参数。 后续请求将上一次响应返回的 `next_page` 原样传入该参数。 不要解析、生成或修改该值;该值必须与当前账号、项目、状态、输入 Memory Store 筛选条件和排序方式匹配。 **source_memory_store_query** `string` | 输入记忆库筛选 按输入 Memory Store 筛选 Dream。传入完整 ID 时精确匹配;传入名称时执行子串匹配,其中 `%`、`_` 和反斜线均按普通字符处理。 **status** `string[]` | 状态过滤 按 Dream 状态过滤。可以重复传入该 query 参数,匹配任一指定状态;省略时返回所有状态。可选值:`pending`、`running`、`completed`、`failed`、`canceled`。 ## 响应参数 **data** `object[]` | Dream 列表 当前页的 Dream 列表,按 `order` 指定的创建时间顺序返回。 **created_at** `string` | 创建时间 `data.created_at` 任务创建时间,RFC 3339 格式。 **id** `string` | Dream ID `data.id` Dream 任务的唯一标识符,格式为 `drm-` 开头的字符串。 **inputs** `object[]` | 任务输入 `data.inputs` 创建任务时保存的输入快照。 源记忆库输入 `object` 创建任务时保存的源 Memory Store 输入。 **memory_store_id** `string` | 源记忆库 ID `data.inputs.memory_store_id` 源 Memory Store ID。 **type** `string` | 输入类型 `data.inputs.type` 输入类型,固定为 `memory_store`。 **memory_store_name** `string` | 输入记忆库名称 `data.inputs.memory_store_name` 输入 Memory Store 的当前名称。关联的 Memory Store 已删除时省略。 历史会话输入 `object` 创建任务时保存的历史 Session 输入。 **session_ids** `string[]` | 历史会话 ID `data.inputs.session_ids` 创建任务时保存的历史 Session ID 列表。 **type** `string` | 输入类型 `data.inputs.type` 输入类型,固定为 `sessions`。 **model** `object` | 模型信息 `data.model` 执行记忆整理任务的模型信息。 **id** `string` | 模型 ID `data.model.id` 执行记忆整理任务的模型 ID。 **outputs** `object[]` | 任务输出 `data.outputs` Dream 创建的输出 Memory Store。访问时机和内容完整性由 `status` 表示。 **memory_store_id** `string` | 输出记忆库 ID `data.outputs.memory_store_id` Dream 创建的输出 Memory Store ID。 **type** `string` | 输出类型 `data.outputs.type` 输出类型,固定为 `memory_store`。 **memory_store_name** `string` | 输出记忆库名称 `data.outputs.memory_store_name` 输出 Memory Store 的当前名称。关联的 Memory Store 已删除时省略。 **status** `string` | 任务状态 `data.status` Dream 任务状态。 - `pending`:任务已受理,正在等待执行,输出 Memory Store 尚不可访问。 - `running`:任务正在执行,输出 Memory Store 尚不可访问。 - `completed`:任务已完成,输出 Memory Store 可以使用。 - `failed`:任务执行失败,输出 Memory Store 可以访问,但内容可能为空或不完整;可通过 `error` 查看原因。 - `canceled`:任务已取消,输出 Memory Store 可以访问,但内容可能为空或不完整。 **type** `string` | 对象类型 `data.type` 对象类型,固定为 `dream`。 **ended_at** `string` | 结束时间 `data.ended_at` 任务进入终态的时间,RFC 3339 格式。任务未结束时为 `null`。 **error** `object` | 失败信息 `data.error` 任务异步执行失败的信息。任务未失败时为 `null`。 **message** `string` | 错误信息 `data.error.message` Dream 执行失败的原因,用于定位任务失败问题。 **type** `string` | 错误类型 `data.error.type` 错误类型。`timeout` 表示任务超时;`internal_error` 表示任务执行期间发生内部错误。 **instructions** `string` | 整理指令 `data.instructions` 创建任务时传入的记忆整理要求。未传入时为 `null`。 **running_time** `number` | 累计运行时长 `data.running_time` Dream 排除空闲间隔后的累计运行时长,单位为秒。暂未获得时为 `null`。 **usage** `object` | 用量统计 `data.usage` 任务的 Token 用量。值为 `null` 时表示用量未知,不能解释为零消耗。 **cache_creation_input_tokens** `integer` | 缓存创建 Token 数 `data.usage.cache_creation_input_tokens` 写入缓存的输入 Token 数。 **cache_read_input_tokens** `integer` | 缓存读取 Token 数 `data.usage.cache_read_input_tokens` 从缓存读取的输入 Token 数。 **input_tokens** `integer` | 输入 Token 数 `data.usage.input_tokens` 本次 Dream 执行消耗的输入 token 数。 **output_tokens** `integer` | 输出 Token 数 `data.usage.output_tokens` 本次 Dream 执行生成的输出 token 数。 **next_page** `string` | 下一页标识 下一页标识。响应未返回 `next_page` 时,表示无更多数据,应停止分页查询。 **total_count** `integer` | Dream 总数 满足当前筛选条件的 Dream 总数,不受分页影响。 ## 代码示例 ## 查询 Dream 列表 ### cURL #### Request ```bash curl -sS --fail-with-body -G \ "https://ark.cn-beijing.volces.com/api/v3/dreams" \ -H "Authorization: Bearer $ARK_API_KEY" \ --data-urlencode "status=running" \ --data-urlencode "status=completed" \ --data-urlencode "source_memory_store_query=$INPUT_MEMORY_STORE_ID" \ --data-urlencode "order=desc" \ --data-urlencode "limit=20" ``` #### Response ``` { "data": [ { "type": "dream", "id": "drm-20260924143000-a1b2c", "status": "completed", "inputs": [ { "type": "memory_store", "memory_store_id": "memstore-20260920100000-source", "memory_store_name": "project-memory" }, { "type": "sessions", "session_ids": [ "sesn-20260921100000-a1b2c", "sesn-20260922100000-d3e4f" ] } ], "outputs": [ { "type": "memory_store", "memory_store_id": "memstore-20260924143000-output", "memory_store_name": "dream-curated-memory" } ], "model": { "id": "" }, "instructions": "保留稳定偏好和已验证结论;删除重复、过期和包含个人身份的信息;按主题组织结果。", "created_at": "2026-09-24T06:30:00Z", "ended_at": "2026-09-24T06:42:00Z", "usage": { "input_tokens": 18420, "output_tokens": 3260, "cache_read_input_tokens": 5120, "cache_creation_input_tokens": 1024 }, "running_time": 672.8, "error": null } ], "next_page": "page-20260924143000-next", "total_count": 2 } ``` --- # 查询 Dream Source: https://ark.volcengine.com/region:cn-beijing/docs/get-dream-api `GET https://ark.cn-beijing.volces.com/api/v3/dreams/{dream_id}` 查询指定 Dream 任务的状态、输入、输出、累计运行时长、用量和失败信息。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **dream_id** `string` `必选` | Dream ID 要查询的 Dream 任务 ID,格式为 `drm-` 开头的字符串。 ## 响应参数 **created_at** `string` | 创建时间 任务创建时间,RFC 3339 格式。 **id** `string` | Dream ID Dream 任务的唯一标识符,格式为 `drm-` 开头的字符串。 **inputs** `object[]` | 任务输入 创建任务时保存的输入快照。 源记忆库输入 `object` 创建任务时保存的源 Memory Store 输入。 **memory_store_id** `string` | 源记忆库 ID `inputs.memory_store_id` 源 Memory Store ID。 **type** `string` | 输入类型 `inputs.type` 输入类型,固定为 `memory_store`。 历史会话输入 `object` 创建任务时保存的历史 Session 输入。 **session_ids** `string[]` | 历史会话 ID `inputs.session_ids` 创建任务时保存的历史 Session ID 列表。 **type** `string` | 输入类型 `inputs.type` 输入类型,固定为 `sessions`。 **model** `object` | 模型信息 执行记忆整理任务的模型信息。 **id** `string` | 模型 ID `model.id` 执行记忆整理任务的模型 ID。 **outputs** `object[]` | 任务输出 Dream 创建的输出 Memory Store。访问时机和内容完整性由 `status` 表示。 **memory_store_id** `string` | 输出记忆库 ID `outputs.memory_store_id` Dream 创建的输出 Memory Store ID。 **type** `string` | 输出类型 `outputs.type` 输出类型,固定为 `memory_store`。 **status** `string` | 任务状态 Dream 任务状态。 - `pending`:任务已受理,正在等待执行,输出 Memory Store 尚不可访问。 - `running`:任务正在执行,输出 Memory Store 尚不可访问。 - `completed`:任务已完成,输出 Memory Store 可以使用。 - `failed`:任务执行失败,输出 Memory Store 可以访问,但内容可能为空或不完整;可通过 `error` 查看原因。 - `canceled`:任务已取消,输出 Memory Store 可以访问,但内容可能为空或不完整。 **type** `string` | 对象类型 对象类型,固定为 `dream`。 **ended_at** `string` | 结束时间 任务进入终态的时间,RFC 3339 格式。任务未结束时为 `null`。 **error** `object` | 失败信息 任务异步执行失败的信息。任务未失败时为 `null`。 **message** `string` | 错误信息 `error.message` Dream 执行失败的原因,用于定位任务失败问题。 **type** `string` | 错误类型 `error.type` 错误类型。`timeout` 表示任务超时;`internal_error` 表示任务执行期间发生内部错误。 **instructions** `string` | 整理指令 创建任务时传入的记忆整理要求。未传入时为 `null`。 **running_time** `number` | 累计运行时长 Dream 排除空闲间隔后的累计运行时长,单位为秒。暂未获得时为 `null`。 **usage** `object` | 用量统计 任务的 Token 用量。值为 `null` 时表示用量未知,不能解释为零消耗。 **cache_creation_input_tokens** `integer` | 缓存创建 Token 数 `usage.cache_creation_input_tokens` 写入缓存的输入 Token 数。 **cache_read_input_tokens** `integer` | 缓存读取 Token 数 `usage.cache_read_input_tokens` 从缓存读取的输入 Token 数。 **input_tokens** `integer` | 输入 Token 数 `usage.input_tokens` 本次 Dream 执行消耗的输入 token 数。 **output_tokens** `integer` | 输出 Token 数 `usage.output_tokens` 本次 Dream 执行生成的输出 token 数。 ## 代码示例 ## 查询 Dream ### cURL #### Request ```bash curl -sS --fail-with-body \ "https://ark.cn-beijing.volces.com/api/v3/dreams/$DREAM_ID" \ -H "Authorization: Bearer $ARK_API_KEY" ``` #### Response ``` { "type": "dream", "id": "drm-20260924143000-a1b2c", "status": "running", "inputs": [ { "type": "memory_store", "memory_store_id": "memstore-20260920100000-source" }, { "type": "sessions", "session_ids": [ "sesn-20260921100000-a1b2c", "sesn-20260922100000-d3e4f" ] } ], "outputs": [ { "type": "memory_store", "memory_store_id": "memstore-20260924143000-output" } ], "model": { "id": "" }, "instructions": "保留稳定偏好和已验证结论;删除重复、过期和包含个人身份的信息;按主题组织结果。", "created_at": "2026-09-24T06:30:00Z", "ended_at": null, "usage": { "input_tokens": 12480, "output_tokens": 2080, "cache_read_input_tokens": 4096, "cache_creation_input_tokens": 1024 }, "running_time": 128.5, "error": null } ``` --- # 取消 Dream Source: https://ark.volcengine.com/region:cn-beijing/docs/cancel-dream-api `POST https://ark.cn-beijing.volces.com/api/v3/dreams/{dream_id}/cancel` 请求取消处于 `pending` 或 `running` 状态的 Dream。已经处于 `canceled` 状态的任务会直接返回当前任务;其他终态任务不能取消。 接口先记录取消意图,再由后台任务确认执行停止。响应中的 `status` 可能仍为 `pending` 或 `running`,需要继续查询任务,直到进入终态。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **dream_id** `string` `必选` | Dream ID 要取消的 Dream 任务 ID,格式为 `drm-` 开头的字符串。 ## 响应参数 **created_at** `string` | 创建时间 任务创建时间,RFC 3339 格式。 **id** `string` | Dream ID Dream 任务的唯一标识符,格式为 `drm-` 开头的字符串。 **inputs** `object[]` | 任务输入 创建任务时保存的输入快照。 源记忆库输入 `object` 创建任务时保存的源 Memory Store 输入。 **memory_store_id** `string` | 源记忆库 ID `inputs.memory_store_id` 源 Memory Store ID。 **type** `string` | 输入类型 `inputs.type` 输入类型,固定为 `memory_store`。 历史会话输入 `object` 创建任务时保存的历史 Session 输入。 **session_ids** `string[]` | 历史会话 ID `inputs.session_ids` 创建任务时保存的历史 Session ID 列表。 **type** `string` | 输入类型 `inputs.type` 输入类型,固定为 `sessions`。 **model** `object` | 模型信息 执行记忆整理任务的模型信息。 **id** `string` | 模型 ID `model.id` 执行记忆整理任务的模型 ID。 **outputs** `object[]` | 任务输出 Dream 创建的输出 Memory Store。访问时机和内容完整性由 `status` 表示。 **memory_store_id** `string` | 输出记忆库 ID `outputs.memory_store_id` Dream 创建的输出 Memory Store ID。 **type** `string` | 输出类型 `outputs.type` 输出类型,固定为 `memory_store`。 **status** `string` | 任务状态 Dream 任务的当前状态。取消请求被记录后,响应仍可能为 `pending` 或 `running`。 - `pending`:任务已受理,正在等待执行,输出 Memory Store 尚不可访问。 - `running`:任务正在执行,输出 Memory Store 尚不可访问。 - `completed`:任务已完成,输出 Memory Store 可以使用。 - `failed`:任务执行失败,输出 Memory Store 可以访问,但内容可能为空或不完整;可通过 `error` 查看原因。 - `canceled`:任务已取消,输出 Memory Store 可以访问,但内容可能为空或不完整。 **type** `string` | 对象类型 对象类型,固定为 `dream`。 **ended_at** `string` | 结束时间 任务进入终态的时间,RFC 3339 格式。任务未结束时为 `null`。 **error** `object` | 失败信息 任务异步执行失败的信息。任务未失败时为 `null`。 **message** `string` | 错误信息 `error.message` Dream 执行失败的原因,用于定位任务失败问题。 **type** `string` | 错误类型 `error.type` 错误类型。`timeout` 表示任务超时;`internal_error` 表示任务执行期间发生内部错误。 **instructions** `string` | 整理指令 创建任务时传入的记忆整理要求。未传入时为 `null`。 **running_time** `number` | 累计运行时长 Dream 排除空闲间隔后的累计运行时长,单位为秒。暂未获得时为 `null`。 **usage** `object` | 用量统计 任务的 Token 用量。值为 `null` 时表示用量未知,不能解释为零消耗。 **cache_creation_input_tokens** `integer` | 缓存创建 Token 数 `usage.cache_creation_input_tokens` 写入缓存的输入 Token 数。 **cache_read_input_tokens** `integer` | 缓存读取 Token 数 `usage.cache_read_input_tokens` 从缓存读取的输入 Token 数。 **input_tokens** `integer` | 输入 Token 数 `usage.input_tokens` 本次 Dream 执行消耗的输入 token 数。 **output_tokens** `integer` | 输出 Token 数 `usage.output_tokens` 本次 Dream 执行生成的输出 token 数。 ## 代码示例 ## 取消 Dream ### cURL #### Request ```bash curl -sS --fail-with-body \ "https://ark.cn-beijing.volces.com/api/v3/dreams/$DREAM_ID/cancel" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{}' ``` #### Response ``` { "type": "dream", "id": "drm-20260924143000-a1b2c", "status": "running", "inputs": [ { "type": "memory_store", "memory_store_id": "memstore-20260920100000-source" }, { "type": "sessions", "session_ids": [ "sesn-20260921100000-a1b2c", "sesn-20260922100000-d3e4f" ] } ], "outputs": [ { "type": "memory_store", "memory_store_id": "memstore-20260924143000-output" } ], "model": { "id": "" }, "instructions": "保留稳定偏好和已验证结论;删除重复、过期和包含个人身份的信息;按主题组织结果。", "created_at": "2026-09-24T06:30:00Z", "ended_at": null, "usage": { "input_tokens": 12480, "output_tokens": 2080, "cache_read_input_tokens": 4096, "cache_creation_input_tokens": 1024 }, "running_time": 128.5, "error": null } ``` --- # 创建技能 Source: https://ark.volcengine.com/region:cn-beijing/docs/create-skill-api `POST https://ark.cn-beijing.volces.com/api/v3/skills` 上传技能文件并创建自定义技能。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Body 参数 **display_title** `string` | 展示名称 用于设置技能的展示名称。省略时,服务端使用 `SKILL.md` 中的 `name`。 **files** `file[]` | 技能文件 使用 `files` 字段名上传技能文件。`files[]` 是兼容字段名,两者表示同一组技能文件。 `files` 与 `files[]` 至少传入一项。任选一种字段名即可;同时传入时,服务端会合并处理文件。 该字段支持以下上传方式: * 单个 ZIP 文件。 * 单个 `SKILL.md` 文件。 * 重复传入该字段,上传保留相对路径的多个文件。 上传内容必须满足以下限制: * 每次请求最多上传 500 个文件,所有上传文件的原始大小合计不超过 30 MiB。 * 上传 ZIP 文件时,解压后单个文件不超过 30 MiB,所有文件总大小不超过 120 MiB。 * ZIP 文件或多文件目录只能包含一个顶层目录,且该目录下必须直接包含且只能包含一个 `SKILL.md`。 * `SKILL.md` 的 YAML frontmatter 必须包含非空的 `name` 和 `description`。 * `name` 去除首尾空白后长度为 1~64 个字符,只能包含小写英文字母、数字和连字符(`-`),不能以连字符开头或结尾,也不能包含连续连字符。 **files[]** `file[]` | 技能文件 `files` 的兼容字段名。上传方式和校验规则与 `files` 相同。 重复传入 `files[]` 时,每个文件的 `filename` 需要保留相对于技能目录的路径。同时传入两个字段时,服务端会合并处理文件。 **protection_enabled** `boolean` `默认值 false` | 内容保护开关 用于控制是否为技能启用内容保护。 * `true`:方舟平台在运行技能时注入保护指令,降低技能内容被直接输出的风险。 * `false`:方舟平台不启用该保护。 ## 响应参数 **created_at** `integer` | 创建时间 技能创建时间,为 Unix 时间戳,单位为秒。 **display_title** `string` | 展示名称 技能的展示名称。未配置时,服务端返回 `SKILL.md` 中的 `name`。 **id** `string` | 技能 ID 用于唯一标识新建的技能,值以 `skill-` 开头。后续查询、更新、删除技能和管理技能的不同版本时需要使用该 ID。 **latest_version** `string` | 最新版本 表示新建技能的版本号,固定为 `1`。 **object** `string` | 资源类型 用于标识响应对象的资源类型,固定为 `skill`。 **protection_enabled** `boolean` | 内容保护开关 表示技能是否已启用内容保护。`true` 表示已启用,`false` 表示未启用。 **source** `string` | 技能来源 表示技能来源,固定为 `custom`。该值表示当前账号上传的自定义技能。 **updated_at** `integer` | 技能更新时间 技能最后更新时间,为 Unix 时间戳,单位为秒。创建技能时,该值与 `created_at` 相同。 **description** `string` | 技能描述 表示方舟平台从 `SKILL.md` 中解析出的技能描述。 **name** `string` | 技能名称 表示 `SKILL.md` 中定义的技能名称。 ## 代码示例 ## 创建技能 ### cURL #### Request ```Bash curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/skills" \ -H "Authorization: Bearer $ARK_API_KEY" \ -F "display_title=文档抽取助手" \ -F "files=@./skill-doc-extractor.zip;type=application/zip" ``` #### Response ``` { "id": "skill-20260922102030-a1b2c", "object": "skill", "created_at": 1790072430, "description": "从 PDF/DOCX 中抽取结构化字段并输出 JSON", "latest_version": "1", "display_title": "文档抽取助手", "source": "custom", "updated_at": 1790072430, "name": "document-extractor", "protection_enabled": false } ``` ### Python #### Request ```python import os from arkruntime import Ark client = Ark( api_key=os.environ["ARK_API_KEY"], base_url="https://ark.cn-beijing.volces.com/api/v3", ) with open("./skill-doc-extractor.zip", "rb") as file: skill = client.skills.create( files=file, display_title="文档抽取助手", ) print(skill) ``` #### Response ``` { "id": "skill-20260922102030-a1b2c", "object": "skill", "created_at": 1790072430, "description": "从 PDF/DOCX 中抽取结构化字段并输出 JSON", "latest_version": "1", "display_title": "文档抽取助手", "source": "custom", "updated_at": 1790072430, "name": "document-extractor", "protection_enabled": false } ``` ### Java #### Request ```java // pom.xml 依赖: // // com.volcengine // ark-runtime // 0.9.0 // import com.volcengine.ark.runtime.models.skill.Skill; import com.volcengine.ark.runtime.service.ArkService; import okhttp3.MediaType; import okhttp3.MultipartBody; import okhttp3.RequestBody; import java.io.File; public class Main { public static void main(String[] args) throws Exception { ArkService service = ArkService.builder() .apiKey(System.getenv("ARK_API_KEY")) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); File file = new File("./skill-doc-extractor.zip"); MultipartBody.Part filePart = MultipartBody.Part.createFormData( "files", file.getName(), RequestBody.create(MediaType.parse("application/zip"), file)); Skill skill = service.createSkill(filePart, "文档抽取助手"); System.out.println(skill); service.shutdownExecutor(); } } ``` #### Response ``` { "id": "skill-20260922102030-a1b2c", "object": "skill", "created_at": 1790072430, "description": "从 PDF/DOCX 中抽取结构化字段并输出 JSON", "latest_version": "1", "display_title": "文档抽取助手", "source": "custom", "updated_at": 1790072430, "name": "document-extractor", "protection_enabled": false } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" ) func main() { ctx := context.Background() client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) f, err := os.Open("./skill-doc-extractor.zip") if err != nil { panic(err) } defer f.Close() skill, err := client.CreateSkill(ctx, f, "skill-doc-extractor.zip", "文档抽取助手") if err != nil { panic(err) } fmt.Println(skill) } ``` #### Response ``` { "id": "skill-20260922102030-a1b2c", "object": "skill", "created_at": 1790072430, "description": "从 PDF/DOCX 中抽取结构化字段并输出 JSON", "latest_version": "1", "display_title": "文档抽取助手", "source": "custom", "updated_at": 1790072430, "name": "document-extractor", "protection_enabled": false } ``` --- # 查询技能列表 Source: https://ark.volcengine.com/region:cn-beijing/docs/list-skills-api `GET https://ark.cn-beijing.volces.com/api/v3/skills` 查询方舟平台预置技能或自定义技能列表。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Query 参数 > 在 URL Query String 中传入。 **limit** `integer` `默认值 20` | 每页数量 用于设置单页最多返回的记录数。 **取值范围**:`[1, 100]` **name** `string` | 技能名称 用于按 `SKILL.md` 中的技能名称筛选技能。 **page** `string` | 下一页标识 首次请求时省略该参数。后续请求将上一次响应返回的 `next_page` 原样传入该参数。 该值由服务端生成,不是页码。不要解析、生成或修改该值。 **source** `string` | 技能来源 用于按技能来源筛选技能: * `custom`:返回当前账号的自定义技能。 * `ark`:返回方舟平台预置技能。 省略时,服务端返回这两类技能。该接口不支持查询 Skill Hub 技能,传入 `skill_hub` 时返回参数错误。 ## 响应参数 **data** `object[]` | 技能列表 包含当前页返回的技能列表。 **created_at** `integer` | 创建时间 `data.created_at` 技能创建时间,为 Unix 时间戳,单位为秒。 **display_title** `string` | 展示名称 `data.display_title` 技能的展示名称。未配置时,服务端返回 `SKILL.md` 中的 `name`。 **id** `string` | 技能 ID `data.id` 用于唯一标识技能。服务端返回的自定义技能和方舟平台预置技能 ID 均以 `skill-` 开头。 **latest_version** `string` | 最新版本 `data.latest_version` 表示技能的最新版本号。 **object** `string` | 资源类型 `data.object` 用于标识响应对象的资源类型,固定为 `skill`。 **protection_enabled** `boolean` | 内容保护开关 `data.protection_enabled` 表示技能是否已启用内容保护。`true` 表示已启用,`false` 表示未启用。 **source** `string` | 技能来源 `data.source` 该字段表示技能来源: * `custom` 表示当前账号上传或导入的自定义技能。 * `ark` 表示方舟平台预置技能。 **updated_at** `integer` | 技能更新时间 `data.updated_at` 技能最后更新时间,为 Unix 时间戳,单位为秒。 **description** `string` | 技能描述 `data.description` 表示方舟平台从 `SKILL.md` 中解析出的技能描述。 **name** `string` | 技能名称 `data.name` 表示 `SKILL.md` 中定义的技能名称。 **has_more** `boolean` | 是否有下一页 表示是否还有下一页数据: * `true`:仍有数据,可以继续分页查询。 * `false`:已返回最后一页。 **next_page** `string` | 下一页标识 服务端生成的下一页标识。`has_more` 为 `true` 时,将该值原样传入下一次请求的 `page`;没有下一页时,不返回该字段。 ## 代码示例 ## 默认 ### cURL #### Request ```Bash curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/skills?limit=20&source=custom" \ -H "Authorization: Bearer $ARK_API_KEY" ``` #### Response ``` { "data": [ { "id": "skill-20260922102030-a1b2c", "object": "skill", "created_at": 1790072430, "description": "提取文档中的结构化信息", "latest_version": "1", "display_title": "文档处理", "source": "custom", "updated_at": 1790072430, "name": "document-helper", "protection_enabled": false } ], "has_more": false } ``` --- # 查询技能详情 Source: https://ark.volcengine.com/region:cn-beijing/docs/get-skill-api `GET https://ark.cn-beijing.volces.com/api/v3/skills/{skill_id}` 查询指定技能的详细信息。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **skill_id** `string` `必选` | 技能 ID 用于指定要查询的技能。 ## 响应参数 **created_at** `integer` | 创建时间 技能创建时间,为 Unix 时间戳,单位为秒。 **display_title** `string` | 展示名称 技能的展示名称。未配置时,服务端返回 `SKILL.md` 中的 `name`。 **id** `string` | 技能 ID 用于唯一标识技能。更新、删除技能或管理技能版本时需要使用该 ID。 * 自定义技能和方舟平台预置技能的 ID 以 `skill-` 开头。 * Skill Hub 技能的 ID 以 `s-` 开头。 **latest_version** `string` | 最新版本 表示技能的最新版本号。 **object** `string` | 资源类型 用于标识响应对象的资源类型,固定为 `skill`。 **protection_enabled** `boolean` | 内容保护开关 表示技能是否已启用内容保护。`true` 表示已启用,`false` 表示未启用。 **source** `string` | 技能来源 该字段表示技能来源: * `custom` 表示上传或导入的自定义技能。 * `skill_hub` 表示来自 Skill Hub 的公共技能。 * `ark` 表示方舟平台预置技能。 **updated_at** `integer` | 技能更新时间 技能最后更新时间,为 Unix 时间戳,单位为秒。 **description** `string` | 技能描述 表示方舟平台从 `SKILL.md` 中解析出的技能描述。 **name** `string` | 技能名称 表示 `SKILL.md` 中定义的技能名称。 ## 代码示例 ## 查询技能详情 ### cURL #### Request ```Bash curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/skills/" \ -H "Authorization: Bearer $ARK_API_KEY" ``` #### Response ``` { "id": "", "object": "skill", "created_at": 1790072430, "description": "从 PDF/DOCX 中抽取结构化字段并输出 JSON", "latest_version": "1", "display_title": "文档抽取助手", "source": "custom", "updated_at": 1790072430, "name": "document-extractor", "protection_enabled": false } ``` ### Python #### Request ```python import os from arkruntime import Ark client = Ark( api_key=os.environ["ARK_API_KEY"], base_url="https://ark.cn-beijing.volces.com/api/v3", ) skill = client.skills.retrieve("") print(skill) ``` #### Response ``` { "id": "", "object": "skill", "created_at": 1790072430, "description": "从 PDF/DOCX 中抽取结构化字段并输出 JSON", "latest_version": "1", "display_title": "文档抽取助手", "source": "custom", "updated_at": 1790072430, "name": "document-extractor", "protection_enabled": false } ``` ### Java #### Request ```java // pom.xml 依赖: // // com.volcengine // ark-runtime // 0.9.0 // import com.volcengine.ark.runtime.models.skill.Skill; import com.volcengine.ark.runtime.service.ArkService; public class Main { public static void main(String[] args) throws Exception { ArkService service = ArkService.builder() .apiKey(System.getenv("ARK_API_KEY")) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); Skill skill = service.getSkill(""); System.out.println(skill); service.shutdownExecutor(); } } ``` #### Response ``` { "id": "", "object": "skill", "created_at": 1790072430, "description": "从 PDF/DOCX 中抽取结构化字段并输出 JSON", "latest_version": "1", "display_title": "文档抽取助手", "source": "custom", "updated_at": 1790072430, "name": "document-extractor", "protection_enabled": false } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" ) func main() { ctx := context.Background() client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) skill, err := client.GetSkill(ctx, "") if err != nil { panic(err) } fmt.Println(skill) } ``` #### Response ``` { "id": "", "object": "skill", "created_at": 1790072430, "description": "从 PDF/DOCX 中抽取结构化字段并输出 JSON", "latest_version": "1", "display_title": "文档抽取助手", "source": "custom", "updated_at": 1790072430, "name": "document-extractor", "protection_enabled": false } ``` --- # 设置技能内容保护 Source: https://ark.volcengine.com/region:cn-beijing/docs/update-skill-api `POST https://ark.cn-beijing.volces.com/api/v3/skills/{skill_id}` 设置是否对自定义技能开启内容保护。启用内容保护后,运行技能时,方舟平台会注入保护指令,降低技能内容被直接输出的风险。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **skill_id** `string` `必选` | 技能 ID 用于指定要更新的技能。 ### Body 参数 **protection_enabled** `boolean` | 内容保护开关 用于更新技能的内容保护设置。 * 省略或传 `null`:不改变内容保护开关,`updated_at` 不变。 * 传入当前值:不改变内容保护开关,`updated_at` 不变。 * 传入不同的 `true` 或 `false`:更新内容保护设置和 `updated_at`。 ## 响应参数 **created_at** `integer` | 创建时间 技能创建时间,为 Unix 时间戳,单位为秒。 **display_title** `string` | 展示名称 技能的展示名称。未配置时,服务端返回 `SKILL.md` 中的 `name`。 **id** `string` | 技能 ID 用于唯一标识已更新的技能,值以 `skill-` 开头。 **latest_version** `string` | 最新版本 表示技能的最新版本号。 **object** `string` | 资源类型 用于标识响应对象的资源类型,固定为 `skill`。 **protection_enabled** `boolean` | 内容保护开关 表示技能是否已启用内容保护。`true` 表示已启用,`false` 表示未启用。 **source** `string` | 技能来源 表示技能来源,固定为 `custom`。该值表示上传或导入的自定义技能。 **updated_at** `integer` | 技能更新时间 技能最后更新时间,为 Unix 时间戳,单位为秒。 **description** `string` | 技能描述 表示方舟平台从 `SKILL.md` 中解析出的技能描述。 **name** `string` | 技能名称 表示 `SKILL.md` 中定义的技能名称。 ## 代码示例 ## 默认 ### cURL #### Request ```Bash curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/skills/" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{"protection_enabled": true}' ``` #### Response ``` { "id": "", "object": "skill", "created_at": 1790072430, "description": "提取文档中的结构化信息", "latest_version": "1", "display_title": "文档处理", "source": "custom", "updated_at": 1790073000, "name": "document-helper", "protection_enabled": true } ``` --- # 删除技能 Source: https://ark.volcengine.com/region:cn-beijing/docs/delete-skill-api `DELETE https://ark.cn-beijing.volces.com/api/v3/skills/{skill_id}` 删除指定的自定义技能。技能与技能版本是独立资源,删除最后一个版本不会删除技能。 删除技能前,按以下顺序处理: 1. 更新引用该技能的 Agent,移除对应技能配置。删除技能不会自动移除引用;未移除时,相关 Agent 后续创建的 Session 可能运行失败。 2. 删除该技能的全部版本。存在多个版本时,先删除非最新版本,再删除最后剩余的最新版本。 3. 调用本接口删除技能。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **skill_id** `string` `必选` | 技能 ID 用于指定要删除的技能。 ## 响应参数 **id** `string` | 技能 ID 用于标识已删除的技能。 **type** `string` | 删除结果类型 用于标识删除成功响应的资源类型,固定为 `skill_deleted`。 ## 代码示例 ## 默认 ### cURL #### Request ```Bash curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/skills/" \ -X DELETE \ -H "Authorization: Bearer $ARK_API_KEY" ``` #### Response ``` { "id": "", "type": "skill_deleted" } ``` --- # 创建新版本的技能 Source: https://ark.volcengine.com/region:cn-beijing/docs/create-skill-version-api `POST https://ark.cn-beijing.volces.com/api/v3/skills/{skill_id}/versions` 为已有自定义技能上传文件并创建新版本。创建成功后,该技能的 `latest_version`、`name` 和 `description` 更新为新版本内容。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **skill_id** `string` `必选` | 技能 ID 用于指定需要创建新版本的技能。 ### Body 参数 **display_title** `string` | 展示名称 用于设置新版本的展示名称。省略时,服务端使用 `SKILL.md` 中的 `name`。 **files** `file[]` | 技能文件 使用 `files` 字段名上传技能文件。`files[]` 是兼容字段名,两者表示同一组技能文件。 `files` 与 `files[]` 至少传入一项。任选一种字段名即可;同时传入时,服务端会合并处理文件。 该字段支持以下上传方式: * 单个 ZIP 文件。 * 单个 `SKILL.md` 文件。 * 重复传入该字段,上传保留相对路径的多个文件。 上传内容必须满足以下限制: * 每次请求最多上传 500 个文件,所有上传文件的原始大小合计不超过 30 MiB。 * 上传 ZIP 文件时,解压后单个文件不超过 30 MiB,所有文件总大小不超过 120 MiB。 * ZIP 文件或多文件目录只能包含一个顶层目录,且该目录下必须直接包含且只能包含一个 `SKILL.md`。 * `SKILL.md` 的 YAML frontmatter 必须包含非空的 `name` 和 `description`。 * `name` 去除首尾空白后长度为 1~64 个字符,只能包含小写英文字母、数字和连字符(`-`),不能以连字符开头或结尾,也不能包含连续连字符。 **files[]** `file[]` | 技能文件 `files` 的兼容字段名。上传方式和校验规则与 `files` 相同。 重复传入 `files[]` 时,每个文件的 `filename` 需要保留相对于技能目录的路径。同时传入两个字段时,服务端会合并处理文件。 ## 响应参数 **created_at** `string` | 创建时间 该版本的创建时间,采用 RFC 3339 格式。 **display_title** `string` | 展示名称 表示该版本的展示名称。 **id** `string` | 版本 ID 用于唯一标识本次创建的版本,值以 `skillver-` 开头。 **skill_id** `string` | 技能 ID 表示该版本所属技能的 ID。 **type** `string` | 资源类型 用于标识响应对象的资源类型,固定为 `skill_version`。 **version** `string` | 版本号 表示新建版本的版本号。服务端在当前最大版本号的基础上加 `1`,并以字符串形式返回新版本号。 **description** `string` | 技能描述 表示方舟平台从该版本的 `SKILL.md` 中解析出的技能描述。 ## 代码示例 ## 默认 ### cURL #### Request ```Bash curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/skills//versions" \ -H "Authorization: Bearer $ARK_API_KEY" \ -F "display_title=文档处理" \ -F "files=@./document-helper.zip;type=application/zip" ``` #### Response ``` { "id": "skillver-20260922102510-b2c3d", "type": "skill_version", "skill_id": "", "version": "2", "display_title": "文档处理", "description": "提取文档中的结构化信息", "created_at": "2026-09-22T10:25:10Z" } ``` --- # 查询技能的版本列表 Source: https://ark.volcengine.com/region:cn-beijing/docs/list-skill-versions-api `GET https://ark.cn-beijing.volces.com/api/v3/skills/{skill_id}/versions` 查询指定技能的版本。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **skill_id** `string` `必选` | 技能 ID 用于指定要查询版本的技能。 ### Query 参数 > 在 URL Query String 中传入。 **limit** `integer` `默认值 20` | 每页数量 用于设置单页最多返回的记录数。 **取值范围**:`[1, 100]` **page** `string` | 下一页标识 首次请求时省略该参数。后续请求将上一次响应返回的 `next_page` 原样传入该参数。 该值由服务端生成,不是页码。不要解析、生成或修改该值。 ## 响应参数 **data** `object[]` | 技能的版本列表 包含当前页返回的不同版本的技能。 **created_at** `string` | 创建时间 `data.created_at` 该版本的创建时间,采用 RFC 3339 格式。 **display_title** `string` | 展示名称 `data.display_title` 表示该版本的展示名称。 **id** `string` | 版本 ID `data.id` 用于唯一标识该版本,值以 `skillver-` 开头。 **skill_id** `string` | 技能 ID `data.skill_id` 表示该版本所属技能的 ID。 **type** `string` | 资源类型 `data.type` 用于标识响应对象的资源类型,固定为 `skill_version`。 **version** `string` | 版本号 `data.version` 表示技能的版本号。 **description** `string` | 技能描述 `data.description` 表示方舟平台从该版本的 `SKILL.md` 中解析出的技能描述。 **has_more** `boolean` | 是否有下一页 表示是否还有下一页数据: * `true`:仍有数据,可以继续分页查询。 * `false`:已返回最后一页。 **next_page** `string` | 下一页标识 服务端生成的下一页标识。`has_more` 为 `true` 时,将该值原样传入下一次请求的 `page`;没有下一页时,不返回该字段。 ## 代码示例 ## 默认 ### cURL #### Request ```Bash curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/skills//versions?limit=20" \ -H "Authorization: Bearer $ARK_API_KEY" ``` #### Response ``` { "data": [ { "id": "skillver-20260922102510-b2c3d", "type": "skill_version", "skill_id": "", "version": "2", "display_title": "文档处理", "description": "提取文档中的结构化信息", "created_at": "2026-09-22T10:25:10Z" } ], "has_more": false } ``` --- # 查询指定版本的技能 Source: https://ark.volcengine.com/region:cn-beijing/docs/get-skill-version-api `GET https://ark.cn-beijing.volces.com/api/v3/skills/{skill_id}/versions/{version}` 查询指定技能在某一版本下的详细信息,不返回技能文件内容。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **skill_id** `string` `必选` | 技能 ID 用于指定要查询版本的技能。 **version** `string` `必选` | 版本号 用于指定要查询的版本号。 ## 响应参数 **created_at** `string` | 创建时间 该版本的创建时间,采用 RFC 3339 格式。 **display_title** `string` | 展示名称 表示该版本的展示名称。 **id** `string` | 版本 ID 用于唯一标识该版本,值以 `skillver-` 开头。 **skill_id** `string` | 技能 ID 表示该版本所属技能的 ID。 **type** `string` | 资源类型 用于标识响应对象的资源类型,固定为 `skill_version`。 **version** `string` | 版本号 表示技能的版本号。 **description** `string` | 技能描述 表示方舟平台从该版本的 `SKILL.md` 中解析出的技能描述。 ## 代码示例 ## 默认 ### cURL #### Request ```Bash curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/skills//versions/" \ -H "Authorization: Bearer $ARK_API_KEY" ``` #### Response ``` { "id": "skillver-20260922102510-b2c3d", "type": "skill_version", "skill_id": "", "version": "", "display_title": "文档处理", "description": "提取文档中的结构化信息", "created_at": "2026-09-22T10:25:10Z" } ``` --- # 删除指定版本的技能 Source: https://ark.volcengine.com/region:cn-beijing/docs/delete-skill-version-api `DELETE https://ark.cn-beijing.volces.com/api/v3/skills/{skill_id}/versions/{version}` 删除当前账号中自定义技能的指定版本,不删除技能本身。 如果技能有多个版本,必须先删除所有非最新版本,之后才能删除最后剩余的最新版本。仍有其他版本时删除最新版本会返回 HTTP 400 `InvalidAction`。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **skill_id** `string` `必选` | 技能 ID 用于指定要删除版本的技能。 **version** `string` `必选` | 版本号 用于指定要删除的版本。 ## 响应参数 **id** `string` | 版本 ID 已删除版本的 ID,用于标识该版本。 **type** `string` | 删除结果类型 用于标识删除成功响应的资源类型,固定为 `skill_version_deleted`。 ## 代码示例 ## 默认 ### cURL #### Request ```Bash curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/skills//versions/" \ -X DELETE \ -H "Authorization: Bearer $ARK_API_KEY" ``` #### Response ``` { "id": "", "type": "skill_version_deleted" } ``` --- # 下载指定版本的技能 Source: https://ark.volcengine.com/region:cn-beijing/docs/download-skill-version-content-api `GET https://ark.cn-beijing.volces.com/api/v3/skills/{skill_id}/versions/{version}/content` 获取指定版本的技能 ZIP 包下载地址。服务端返回 HTTP 302 响应,并在 `Location` 响应头中提供有效期为 1 小时的下载地址。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Path 参数 **skill_id** `string` `必选` | 技能 ID 用于指定要下载版本内容的技能。 **version** `string` `必选` | 版本号 用于指定要下载的版本号。 ## 响应参数 **Location** `string` | 下载地址 表示指定版本的技能 ZIP 包下载地址,有效期为 1 小时。 ## 代码示例 ## 默认 ### cURL #### Request ```Bash curl -sS --fail-with-body --include \ "https://ark.cn-beijing.volces.com/api/v3/skills//versions//content" \ -H "Authorization: Bearer $ARK_API_KEY" ``` #### Response ``` HTTP/1.1 302 Found Location: ``` --- # 扫描 GitHub 技能 Source: https://ark.volcengine.com/region:cn-beijing/docs/scan-github-skills-api `POST https://ark.cn-beijing.volces.com/api/v3/skills/github/scan` 扫描 GitHub 仓库中的 `SKILL.md`,返回技能候选项及校验结果。响应中 `valid` 为 `true` 的候选技能可通过导入 GitHub 技能接口导入。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Body 参数 **input** `string` `必选` | 仓库地址 用于指定待扫描的 GitHub 仓库。支持传入完整的仓库 URL 或 `owner/repo` 格式的仓库标识。 ## 响应参数 **candidates** `object[]` | 技能候选项 包含本次扫描发现的技能候选项。 **name** `string` | 技能名称 `candidates.name` 表示方舟平台从候选目录的 `SKILL.md` 中解析出的技能名称。 **path** `string` | 技能路径 `candidates.path` 表示 `SKILL.md` 所在目录相对于仓库根目录的路径。仓库根目录本身是技能目录时,该值为空字符串。 **valid** `boolean` | 校验结果 `candidates.valid` 表示候选技能是否通过 `SKILL.md` 格式校验。`true` 表示校验通过,可以导入。`false` 表示校验失败,具体原因由 `error` 字段返回。 **error** `string` | 校验错误 `candidates.error` 候选技能未通过校验时,返回具体的错误原因。 **existing_skill_id** `string` | 已有技能 ID `candidates.existing_skill_id` 当前账号已从相同仓库路径导入技能时,返回对应技能的 ID。 **has_update** `boolean` | 是否有更新 `candidates.has_update` 表示已导入技能是否存在更新。最新版本对应的提交与本次扫描的提交不同时,服务端返回 `true`。两次提交相同时,不返回该字段。 **repo** `object` | 仓库信息 包含本次扫描对应的仓库和提交信息。 **commit_sha** `string` | 提交 SHA `repo.commit_sha` 表示本次扫描对应的 Git 提交 SHA。调用导入接口时,必须原样传入该值。 **html_url** `string` | 仓库地址 `repo.html_url` 提供 GitHub 仓库的网页地址。 **name** `string` | 仓库名称 `repo.name` 表示 GitHub 仓库名称。 **owner** `string` | 仓库所有者 `repo.owner` 表示 GitHub 仓库所有者。 ## 代码示例 ## 默认 ### cURL #### Request ```Bash curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/skills/github/scan" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{"input": "anthropics/skills"}' ``` #### Response ``` { "repo": { "owner": "anthropics", "name": "skills", "commit_sha": "", "html_url": "https://github.com/anthropics/skills" }, "candidates": [ { "path": "skills/pdf", "name": "pdf", "valid": true } ] } ``` --- # 导入 GitHub 技能 Source: https://ark.volcengine.com/region:cn-beijing/docs/import-github-skills-api `POST https://ark.cn-beijing.volces.com/api/v3/skills/github/import` 导入 GitHub 技能前,先调用扫描 GitHub 技能接口,获取可导入的技能及本次扫描对应的仓库信息。 服务端将所选技能与当前已有技能对比后,分别处理: - 所选技能尚未导入时,服务端创建技能。 - 所选技能已导入,但本次扫描的提交与最新版本对应的提交不同时,服务端创建新版本。 - 所选技能已导入,且两次提交相同时,服务端跳过该项。 请求成功不表示每项都导入成功。调用后,检查 `items[].status` 获取每项导入结果。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Body 参数 **repo** `object` `必选` | 仓库信息 传入扫描接口返回的仓库信息。`commit_sha` 必须使用扫描接口返回的原始值。 **commit_sha** `string` `必选` | 提交 SHA `repo.commit_sha` 表示扫描接口返回的 Git 提交 SHA。导入请求必须原样传入该值。 **html_url** `string` `必选` | 仓库地址 `repo.html_url` 提供 GitHub 仓库的网页地址。 **name** `string` `必选` | 仓库名称 `repo.name` 表示 GitHub 仓库名称。 **owner** `string` `必选` | 仓库所有者 `repo.owner` 表示 GitHub 仓库所有者。 **selected** `object[]` `必选` | 待导入技能 用于指定要导入的技能路径,至少传入一项。 **path** `string` `必选` | 技能路径 `selected.path` 用于指定要导入的技能。传入扫描接口返回的 `candidates[].path`,即 `SKILL.md` 所在目录相对于仓库根目录的路径。导入仓库根目录中的技能时,传入空字符串。 **protection_enabled** `boolean` `默认值 false` | 内容保护开关 `selected.protection_enabled` 控制服务端在新建技能时是否启用内容保护。 * `true`:运行技能时,方舟平台会注入保护指令,降低技能内容被直接输出的风险。 * `false`:方舟平台不启用内容保护。 该字段仅在所选路径尚未导入、服务端创建新技能时生效。所选路径已导入时,不修改已有技能的内容保护设置。 ## 响应参数 **items** `object[]` | 导入结果 返回每个所选技能的导入结果。请求成功不表示每项都导入成功。调用后,检查每个 `items[].status`。 **path** `string` | 技能路径 `items.path` 表示本条导入结果对应的 `selected[].path`。 **status** `string` | 导入状态 `items.status` 该字段表示导入状态: * `ok` 表示服务端已创建新技能。 * `updated` 表示服务端已为已有技能创建新版本。 * `skipped_duplicate` 表示已有技能的当前版本与扫描提交相同,服务端未重复导入。 * `failed` 表示该技能导入失败。 **error_code** `string` | 错误码 `items.error_code` 导入失败时返回的错误码。 **error_message** `string` | 错误信息 `items.error_message` 导入失败时返回的错误信息。 **skill_id** `string` | 技能 ID `items.skill_id` 服务端创建技能、更新技能或跳过重复项时,返回对应技能的 ID。 ## 代码示例 ## 默认 ### cURL #### Request ```Bash curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/skills/github/import" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "repo": { "owner": "anthropics", "name": "skills", "commit_sha": "", "html_url": "https://github.com/anthropics/skills" }, "selected": [ { "path": "skills/pdf", "protection_enabled": true } ] }' ``` #### Response ``` { "items": [ { "path": "skills/pdf", "status": "ok", "skill_id": "skill-20260922102030-a1b2c" } ] } ``` --- # 创建批量推理任务 Source: https://ark.volcengine.com/region:cn-beijing/docs/create-batch-inference-job-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=CreateBatchInferenceJob&Version=2024-01-01` 创建批量推理任务。为了避免异常情况下重复提交任务带来额外推理和计费,平台在创建批量推理任务时提供幂等控制:当用户、项目名(Project Name)、存储桶(bucket)和输入文件名(object-key)完全相同时,平台仅保留一个任务处于活跃状态(运行或排队),其他重复提交将报错,并在错误信息中包含在运行或排队中任务的 ID,供用户查询。 > **说明:注意** > > 批量推理任务有以下使用约束: > - 输入文件需为 JSONL 格式,每行一个请求;输出为模型推理结果。 > - 输入与输出存储桶均需位于华北 2-北京地域(`cn-beijing`),且与任务在同一账号下。 > - 同一用户、项目、存储桶和输入文件下,平台仅保留一个活跃任务(运行或排队),重复提交会报错并返回已存在任务的 ID。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **InputFileTosLocation** `object` `必选` | 输入文件 批量推理输入文件的 TOS 位置。文件需为 JSONL 格式,且存储桶位于 `cn-beijing` 地域。 **BucketName** `string` `必选` | TOS 桶名称 `InputFileTosLocation.BucketName` TOS 桶名称。当前火山方舟仅支持华北 2-北京地域(`cn-beijing`)的 TOS 桶。 **ObjectKey** `string` `必选` | 对象路径 `InputFileTosLocation.ObjectKey` TOS 对象路径。输入为 JSONL 文件的完整 object key;输出文件夹路径建议以 `/` 结尾。 **ModelReference** `object` `必选` | 模型引用 批量推理任务选择的模型。*CustomModelId*(定制模型)与 *FoundationModel*(基础模型)二者需且仅需指定其一。 **CustomModelId** `string` | 定制模型 ID `ModelReference.CustomModelId` 定制模型 ID。与 *FoundationModel* 二选一,仅需指定其一。 **FoundationModel** `object` | 基础模型引用 `ModelReference.FoundationModel` 基础模型引用对象。与 *CustomModelId* 二选一,仅需指定其一。 **ModelVersion** `string` `必选` | 模型版本 `ModelReference.FoundationModel.ModelVersion` 基础模型版本号,例如 `240615`。 **Name** `string` `必选` | 模型名称 `ModelReference.FoundationModel.Name` 基础模型名称,例如 `doubao-seed-2-1-pro-260628`。 **Name** `string` `必选` | 任务名称 批量推理任务名称,用于在控制台与查询接口中标识该任务。 **OutputDirTosLocation** `object` `必选` | 输出文件夹 批量推理任务结果输出的 TOS 文件夹路径。存储桶需与输入文件位于同一地域。 **BucketName** `string` `必选` | TOS 桶名称 `OutputDirTosLocation.BucketName` TOS 桶名称。当前火山方舟仅支持华北 2-北京地域(`cn-beijing`)的 TOS 桶。 **ObjectKey** `string` `必选` | 对象路径 `OutputDirTosLocation.ObjectKey` TOS 对象路径。输入为 JSONL 文件的完整 object key;输出文件夹路径建议以 `/` 结尾。 **CompletionWindow** `string` | 最大等待时间 批量推理任务的最大等待时间,超过该时间任务仍未完成则自动终止。常见取值如 `1d`(1 天)。 **Description** `string` | 任务描述 批量推理任务的描述信息,便于业务侧标注任务用途。 **DryRun** `boolean` `默认值 false` | 预检请求 是否仅对此请求进行预检。`true` 表示发送检查请求,仅校验参数合法性与权限,不实际创建任务;`false` 表示发送正常请求,执行创建操作。 **ProjectName** `string` `默认值 default` | 项目名称 资源所属的项目名称。若资源不在默认项目中,需填写正确的项目名称,获取方式请参考 [如何获取项目名称](/docs/modelark-faq)。 **Tags** `object[]` | 任务标签 批量推理任务绑定的标签列表,可用于资源分组与计费分摊。 **Key** `string` `必选` | 标签键 `Tags.Key` **Value** `string` `必选` | 标签值 `Tags.Value` ## 响应参数 **Id** `string` | 任务 ID 创建成功后返回的批量推理任务 ID,可用于 *GetBatchInferenceJob* 等接口查询任务状态。 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=CreateBatchInferenceJob&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "Name": "批量推理任务", "Description": "这是一个批量推理任务", "ModelReference": { "FoundationModel": { "Name": "doubao-seed-2-0-pro", "ModelVersion": "260215" } }, "InputFileTosLocation": { "BucketName": "my-bucket-name", "ObjectKey": "batch-inference-job/dataset/my-job.jsonl" }, "OutputDirTosLocation": { "ObjectKey": "batch-inference-job/output/", "BucketName": "my-bucket-name" }, "ProjectName":"default", "CompletionWindow": "1d", "Tags": [ { "Key": "test_key", "Value": "test_value" } ] } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "20240918194640ECB302768CB287CEDA", "Action": "CreateBatchInferenceJob", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "Id": "bi-20240918194641-r2nwq" } } ``` --- # 获取批量推理任务列表 Source: https://ark.volcengine.com/region:cn-beijing/docs/list-batch-inference-jobs-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=ListBatchInferenceJobs&Version=2024-01-01` 获取批量推理任务列表。支持按标签、任务状态、模型等条件筛选,并支持分页和排序。 > **说明** > > 支持按标签(*TagFilters*)、任务属性(*Filter*)筛选,并通过 *PageNumber* / *PageSize* 分页。排序字段支持 `CreateTime` / `UpdateTime`,排序顺序支持 `Asc` / `Desc`。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **Filter** `object` | 属性筛选 按任务属性筛选的条件组。 **CustomModelIds** `string[]` | 定制模型筛选 `Filter.CustomModelIds` 按定制模型 ID 列表筛选。 **FoundationModels** `object[]` | 基础模型筛选 `Filter.FoundationModels` 按基础模型名称及版本筛选。 **Name** `string` `必选` | 模型名称 `Filter.FoundationModels.Name` 基础模型名称,例如 `doubao-seed-2-1-pro-260628`。 **ModelVersions** `string[]` | 版本号列表 `Filter.FoundationModels.ModelVersions` 基础模型版本号列表。 **Ids** `string[]` | 任务 ID 列表 `Filter.Ids` 指定要查询的批量推理任务 ID 列表。 **Name** `string` | 名称模糊匹配 `Filter.Name` 按任务名称做模糊搜索。 **Phases** `string[]` | 状态筛选 `Filter.Phases` 按任务状态筛选。可选值:`Queued`、`Running`、`Completed`、`Terminating`、`Terminated`、`Failed`。 **PageNumber** `integer` `默认值 1` | 起始页码 分页查询的起始页码,从 1 开始。 **PageSize** `integer` `默认值 10` | 每页条数 分页查询时每页返回的记录数。 **取值范围**:`[1, 100]` **ProjectName** `string` `默认值 default` | 项目名称 资源所属的项目名称。若资源不在默认项目中,需填写正确的项目名称。 **SortBy** `string` | 排序字段 排序字段。可选值:`CreateTime`、`UpdateTime`。 **SortOrder** `string` | 排序顺序 排序顺序。可选值:`Asc`、`Desc`。 **TagFilters** `object[]` | 标签筛选 按任务绑定的标签筛选。 **Key** `string` `必选` | 标签键 `TagFilters.Key` 标签键,必填。 **Values** `string[]` | 标签值列表 `TagFilters.Values` ## 响应参数 **Items** `object[]` | 任务列表 批量推理任务列表。 **CreateTime** `string` | 创建时间 `Items.CreateTime` 任务创建时间,RFC 3339 格式。 **Description** `string` | 任务描述 `Items.Description` 批量推理任务的描述信息。 **Id** `string` | 任务 ID `Items.Id` 批量推理任务的唯一 ID。 **InputFileTosLocation** `object` | 输入文件 `Items.InputFileTosLocation` 批量推理输入文件的 TOS 位置。 **BucketName** `string` | TOS 桶名称 `Items.InputFileTosLocation.BucketName` TOS 桶名称。当前火山方舟仅支持华北 2-北京地域(`cn-beijing`)的 TOS 桶。 **ObjectKey** `string` | 对象路径 `Items.InputFileTosLocation.ObjectKey` TOS 对象路径。输入为 JSONL 文件的完整 object key;输出文件夹路径建议以 `/` 结尾。 **ModelReference** `object` | 模型引用 `Items.ModelReference` 任务使用的模型引用。 **CustomModelId** `string` | 定制模型 ID `Items.ModelReference.CustomModelId` 定制模型 ID。与 *FoundationModel* 二选一,仅需指定其一。 **FoundationModel** `object` | 基础模型引用 `Items.ModelReference.FoundationModel` 基础模型引用对象。与 *CustomModelId* 二选一,仅需指定其一。 **ModelVersion** `string` | 模型版本 `Items.ModelReference.FoundationModel.ModelVersion` 基础模型版本号,例如 `240615`。 **Name** `string` | 模型名称 `Items.ModelReference.FoundationModel.Name` 基础模型名称,例如 `doubao-seed-2-1-pro-260628`。 **Name** `string` | 任务名称 `Items.Name` 批量推理任务名称。 **OutputDirTosLocation** `object` | 输出文件夹 `Items.OutputDirTosLocation` 批量推理任务结果输出的 TOS 文件夹位置。 **BucketName** `string` | TOS 桶名称 `Items.OutputDirTosLocation.BucketName` TOS 桶名称。当前火山方舟仅支持华北 2-北京地域(`cn-beijing`)的 TOS 桶。 **ObjectKey** `string` | 对象路径 `Items.OutputDirTosLocation.ObjectKey` TOS 对象路径。输入为 JSONL 文件的完整 object key;输出文件夹路径建议以 `/` 结尾。 **ProjectName** `string` | 项目名称 `Items.ProjectName` 资源所属的项目名称。 **RequestCounts** `object` | 请求数量 `Items.RequestCounts` 任务的请求数量统计。 **Completed** `number` | 完成数 `Items.RequestCounts.Completed` 已成功完成的请求数。 **Failed** `number` | 失败数 `Items.RequestCounts.Failed` 失败的请求数。 **Total** `number` | 请求总数 `Items.RequestCounts.Total` 任务包含的请求总数。 **Tags** `object[]` | 任务标签 `Items.Tags` 任务绑定的标签列表。 **Key** `string` | 标签键 `Items.Tags.Key` **Value** `string` | 标签值 `Items.Tags.Value` **UpdateTime** `string` | 更新时间 `Items.UpdateTime` 任务最近更新时间,RFC 3339 格式。 **CompletionWindow** `string` | 最大等待时间 `Items.CompletionWindow` 任务的最大等待时间,超过该时间任务仍未完成则自动终止。 **ExpireTime** `string` | 到期时间 `Items.ExpireTime` 任务到期时间,RFC 3339 格式。 **Status** `object` | 任务状态 `Items.Status` 任务的状态元信息。 **Phase** `string` | 任务状态 `Items.Status.Phase` 批量推理任务当前所处阶段。各状态含义如下: - `Queued`:排队中,因账号下并发任务数达到上限等原因等待调度。 - `Initializing`:初始化中。 - `Running`:运行中。 - `Terminating`:取消中(到期、系统原因或手动终止触发)。 - `Terminated`:已终止。 - `Completed`:已完成,所有请求均已处理完毕。 - `Failed`:失败,通常由输入文件校验失败等原因导致。 **PhaseTime** `string` | 状态更新时间 `Items.Status.PhaseTime` 当前状态的更新时间,RFC 3339 格式。 **Message** `string` | 状态描述 `Items.Status.Message` 当前状态的描述信息,用于补充说明任务进度或失败原因。 **PageNumber** `integer` | 页码 当前返回结果对应的页码。 **PageSize** `integer` | 每页条数 当前返回结果对应的每页记录数。 **TotalCount** `integer` | 任务总数 当前筛选条件下符合条件的任务总数。 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=ListBatchInferenceJobs&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "ProjectName": "default", "PageNumber": 1, "PageSize": 10, "SortOrder": "Desc", "SortBy": "CreateTime", "TagFilters": [ { "Key": "owner", "Values": [ "team-a" ] } ], "Filter": { "Ids": [ "bi-20240918194641-r2nwq" ], "Name": "批量推理任务", "FoundationModels": [ { "Name": "doubao-seed-2-0-pro", "ModelVersions": ["260215"] } ], "CustomModelIds": [], "Phases": [ "Completed" ] } } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "2024091819503335D2321703C1A3CCA3", "Action": "ListBatchInferenceJobs", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "TotalCount": 1, "PageNumber": 1, "PageSize": 10, "Items": [ { "Id": "bi-20240918194641-r2nwq", "Name": "批量推理任务", "Description": "这是一个批量推理任务", "InputFileTosLocation": { "BucketName": "my-bucket-name", "ObjectKey": "batch-inference-job/dataset/my-job.jsonl" }, "OutputDirTosLocation": { "BucketName": "my-bucket-name", "ObjectKey": "batch-inference-job/output/" }, "CompletionWindow": "1d", "Status": { "Phase": "Completed", "PhaseTime": "2024-09-18T11:50:00Z", "Message": "批量推理任务已完成" }, "ModelReference": { "FoundationModel": { "Name": "doubao-seed-2-0-pro", "ModelVersion": "260215" } }, "RequestCounts": { "Total": 2, "Completed": 2, "Failed": 0 }, "Tags": [ { "Key": "owner", "Value": "team-a" }, { "Key": "test_key", "Value": "test_value" } ], "ProjectName": "default", "CreateTime": "2024-09-18T11:46:41Z", "UpdateTime": "2024-09-18T11:50:00Z", "ExpireTime": "2024-09-19T11:46:41Z" } ] } } ``` --- # 获取批量推理任务 Source: https://ark.volcengine.com/region:cn-beijing/docs/get-batch-inference-job-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=GetBatchInferenceJob&Version=2024-01-01` 获取批量推理任务的详细信息,包括任务状态、模型引用、请求计数等。 > **说明** > > 任务状态机:`Queued` → `Initializing` → `Running` → `Completed`;运行中可经由 *StopBatchInferenceJob* 进入 `Terminating` → `Terminated`,失败时进入 `Failed`。处于 `Terminated` / `Failed` 状态的任务可通过 *ResumeBatchInferenceJob* 重启。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **Id** `string` `必选` | 任务 ID 批量推理任务的 ID。 ## 响应参数 **CompletionWindow** `string` | 最大等待时间 批量推理任务的最大等待时间。 **CreateTime** `string` | 创建时间 批量推理任务创建时间,RFC 3339 格式。 **Description** `string` | 任务描述 批量推理任务的描述信息。 **ErrorFileTosLocation** `object` | 错误信息文件 任务执行过程中错误信息的输出 TOS 位置。 **BucketName** `string` | TOS 桶名称 `ErrorFileTosLocation.BucketName` TOS 桶名称。当前火山方舟仅支持华北 2-北京地域(`cn-beijing`)的 TOS 桶。 **ObjectKey** `string` | 对象路径 `ErrorFileTosLocation.ObjectKey` TOS 对象路径。输入为 JSONL 文件的完整 object key;输出文件夹路径建议以 `/` 结尾。 **ExpireTime** `string` | 到期时间 批量推理任务到期时间,RFC 3339 格式。 **Id** `string` | 任务 ID 批量推理任务的唯一 ID。 **InputFileTosLocation** `object` | 输入文件 批量推理输入文件的 TOS 位置。 **BucketName** `string` | TOS 桶名称 `InputFileTosLocation.BucketName` TOS 桶名称。当前火山方舟仅支持华北 2-北京地域(`cn-beijing`)的 TOS 桶。 **ObjectKey** `string` | 对象路径 `InputFileTosLocation.ObjectKey` TOS 对象路径。输入为 JSONL 文件的完整 object key;输出文件夹路径建议以 `/` 结尾。 **ModelReference** `object` | 模型引用 批量推理任务选中的模型。 **CustomModelId** `string` | 定制模型 ID `ModelReference.CustomModelId` 定制模型 ID。与 *FoundationModel* 二选一,仅需指定其一。 **FoundationModel** `object` | 基础模型引用 `ModelReference.FoundationModel` 基础模型引用对象。与 *CustomModelId* 二选一,仅需指定其一。 **ModelVersion** `string` | 模型版本 `ModelReference.FoundationModel.ModelVersion` 基础模型版本号,例如 `240615`。 **Name** `string` | 模型名称 `ModelReference.FoundationModel.Name` 基础模型名称,例如 `doubao-seed-2-1-pro-260628`。 **Name** `string` | 任务名称 批量推理任务名称。 **OutputDirTosLocation** `object` | 输出文件夹 批量推理任务结果输出的 TOS 文件夹位置。 **BucketName** `string` | TOS 桶名称 `OutputDirTosLocation.BucketName` TOS 桶名称。当前火山方舟仅支持华北 2-北京地域(`cn-beijing`)的 TOS 桶。 **ObjectKey** `string` | 对象路径 `OutputDirTosLocation.ObjectKey` TOS 对象路径。输入为 JSONL 文件的完整 object key;输出文件夹路径建议以 `/` 结尾。 **ProjectName** `string` | 项目名称 资源所属的项目名称。 **RequestCounts** `object` | 请求数量 批量推理任务的请求数量统计。 **Completed** `number` | 完成数 `RequestCounts.Completed` 已成功完成的请求数。 **Failed** `number` | 失败数 `RequestCounts.Failed` 失败的请求数。 **Total** `number` | 请求总数 `RequestCounts.Total` 任务包含的请求总数。 **Status** `object` | 任务状态 批量推理任务的状态元信息。 **Phase** `string` | 任务状态 `Status.Phase` 批量推理任务当前所处阶段。各状态含义如下: - `Queued`:排队中,因账号下并发任务数达到上限等原因等待调度。 - `Initializing`:初始化中。 - `Running`:运行中。 - `Terminating`:取消中(到期、系统原因或手动终止触发)。 - `Terminated`:已终止。 - `Completed`:已完成,所有请求均已处理完毕。 - `Failed`:失败,通常由输入文件校验失败等原因导致。 **PhaseTime** `string` | 状态更新时间 `Status.PhaseTime` 当前状态的更新时间,RFC 3339 格式。 **Message** `string` | 状态描述 `Status.Message` 当前状态的描述信息,用于补充说明任务进度或失败原因。 **Tags** `object[]` | 任务标签 批量推理任务绑定的标签列表。 **Key** `string` | 标签键 `Tags.Key` **Value** `string` | 标签值 `Tags.Value` **UpdateTime** `string` | 更新时间 批量推理任务最近更新时间,RFC 3339 格式。 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=GetBatchInferenceJob&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "Id": "bi-20240918194641-r2nwq" } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "2024091910512025A35A851624E45418", "Action": "GetBatchInferenceJob", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "Id": "bi-20240918194641-r2nwq", "Name": "批量推理任务", "Description": "这是一个批量推理任务", "InputFileTosLocation": { "BucketName": "my-bucket-name", "ObjectKey": "batch-inference-job/dataset/my-job.jsonl" }, "OutputDirTosLocation": { "BucketName": "my-bucket-name", "ObjectKey": "batch-inference-job/output/" }, "CompletionWindow": "1d", "Status": { "Phase": "Completed", "PhaseTime": "2024-09-18T11:50:00Z", "Message": "批量推理任务已完成" }, "ModelReference": { "FoundationModel": { "Name": "doubao-seed-2-0-pro", "ModelVersion": "260215" } }, "RequestCounts": { "Total": 2, "Completed": 2, "Failed": 0 }, "Tags": [ { "Key": "owner", "Value": "team-a" }, { "Key": "test_key", "Value": "test_value" } ], "ProjectName": "default", "CreateTime": "2024-09-18T11:46:41Z", "UpdateTime": "2024-09-18T11:50:00Z", "ExpireTime": "2024-09-19T11:46:41Z" } } ``` --- # 更新批量推理任务 Source: https://ark.volcengine.com/region:cn-beijing/docs/update-batch-inference-job-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=UpdateBatchInferenceJob&Version=2024-01-01` 更新批量推理任务的名称或描述信息。 > **说明** > > 更新接口仅支持修改 *Name* 与 *Description*。任务的模型引用、输入输出位置、最大等待时间等关键参数在创建后不可变更。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **Id** `string` `必选` | 任务 ID 待更新的批量推理任务 ID。 **Description** `string` | 任务描述 批量推理任务的描述信息。 **DryRun** `boolean` `默认值 false` | 预检请求 是否仅对此请求进行预检。`true` 表示发送检查请求;`false` 表示发送正常请求,执行更新操作。 **Name** `string` | 任务名称 批量推理任务名称。 ## 响应参数 本接口无特有的返回参数,成功时 HTTP 状态码为 `200`,返回结构中 `Result` 为空对象 `{}`。 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=UpdateBatchInferenceJob&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "Id": "bi-20240918194641-r2nwq", "Name": "批量推理任务(重命名)", "Description": "更新后的描述", "DryRun": true } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "20241101204820216194191074D4638D", "Action": "UpdateBatchInferenceJob", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": {} } ``` --- # 删除批量推理任务 Source: https://ark.volcengine.com/region:cn-beijing/docs/delete-batch-inference-job-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=DeleteBatchInferenceJob&Version=2024-01-01` 删除指定的批量推理任务。删除后任务及其状态信息无法恢复,请谨慎操作。 > **注意** > > 删除操作不可逆,任务及其状态信息将无法恢复,请确认后再执行。建议先通过 `DryRun` 预检请求合法性。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **Id** `string` `必选` | 任务 ID 待删除的批量推理任务 ID。 **DryRun** `boolean` `默认值 false` | 预检请求 是否仅对此请求进行预检。`true` 表示发送检查请求;`false` 表示发送正常请求,执行删除操作。 ## 响应参数 本接口无特有的返回参数,成功时 HTTP 状态码为 `200`,返回结构中 `Result` 为空对象 `{}`。 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=DeleteBatchInferenceJob&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "DryRun": true, "Id": "bi-20240918194641-r2nwq" } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "20250115174930217216139059A62D03", "Action": "DeleteBatchInferenceJob", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": {} } ``` --- # 停止批量推理任务 Source: https://ark.volcengine.com/region:cn-beijing/docs/stop-batch-inference-job-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=StopBatchInferenceJob&Version=2024-01-01` 停止一个正在运行(Running)或排队中(Queued)的批量推理任务,使其提前结束执行。 > **说明:注意** > > 仅 `Running` 或 `Queued` 状态的任务可以被停止。停止后任务进入 `Terminating` → `Terminated`,已处理完成的推理结果保留在 *OutputDirTosLocation* 中,可通过 *ResumeBatchInferenceJob* 重启继续处理剩余请求。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **Id** `string` `必选` | 任务 ID 待停止的批量推理任务 ID。可通过 *CreateBatchInferenceJob* 接口创建任务时获取,或通过 *ListBatchInferenceJobs* 查询。 **DryRun** `boolean` `默认值 false` | 预检请求 是否仅对此请求进行预检。`true` 表示发送检查请求,仅校验参数合法性与权限,不实际停止任务;`false` 表示发送正常请求,执行停止操作。 ## 响应参数 本接口无特有的返回参数,成功时 HTTP 状态码为 `200`,返回结构中 `Result` 为空对象 `{}`。 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=StopBatchInferenceJob&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "Id": "bi-20240918194641-r2nwq" } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "202411012125322342121442116F88A9", "Action": "StopBatchInferenceJob", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": {} } ``` --- # 重启批量推理任务 Source: https://ark.volcengine.com/region:cn-beijing/docs/resume-batch-inference-job-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=ResumeBatchInferenceJob&Version=2024-01-01` 重启一个已被终止(Terminated)或处于失败(Failed)状态的批量推理任务,将其重新拉起继续处理剩余请求。 > **说明** > > 仅 `Terminated` 或 `Failed` 状态的任务可以被重启。重启后任务从已完成的进度继续处理剩余请求,已成功完成的请求不会重复推理。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **Id** `string` `必选` | 任务 ID 待重启的批量推理任务 ID。可通过 *CreateBatchInferenceJob* 接口创建任务时获取,或通过 *ListBatchInferenceJobs* 查询。 ## 响应参数 **Id** `string` | 任务 ID 重启成功后返回的批量推理任务 ID,与请求中传入的 *Id* 一致。 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=ResumeBatchInferenceJob&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{"Id": "bi-20240918194641-r2nwq"} ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "202501151747141031441900110C4B1C", "Action": "ResumeBatchInferenceJob", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "Id": "bi-20240918194641-r2nwq" } } ``` --- # 批量(Chat) API(待下线) Source: https://ark.volcengine.com/region:cn-beijing/docs/batch-chat-api ` POST https://ark.cn-beijing.volces.com/api/v3/batch/chat/completions` [运行](https://api.volcengine.com/api-explorer/?action=BatchChatCompletions&data=%7B%7D&groupName=%E6%89%B9%E9%87%8F%E6%8E%A8%E7%90%86&query=%7B%7D&serviceCode=ark&version=2024-01-01) 本文介绍批量推理调用模型服务的 API 的输入输出参数,供您使用接口时查阅字段含义。通过批量推理您可享受到更高的限流配额以及实惠的价格,适合进行大批量数据处理时使用。 > 推荐的调用方式请见 [示例代码](/docs/batch-inference#075b8a07)。 > **说明** > > - **Batch Chat API 已标记为待下线。** 建议您直接使用 [Chat API](/docs/chat-api),并在请求中设置 `service_tier=flex`,以 [在线推理(低优)](/docs/online-inference-flex) 的方式完成批量数据处理。接口参数一致,改造成本低。 > - 对于动态产生的数据、后台任务或其他需要保持同步调用方式的时延不敏感业务,可以迁移至 [在线推理(低优)](/docs/online-inference-flex)。迁移后,使用普通在线推理的预置推理接入点或自定义推理接入点,并在请求中设置 `service_tier=flex`。 > - 在线推理(低优)支持 [Chat API](/docs/chat-api)、[Responses API](/docs/create-model-responses-api) 和 [Messages API](/docs/messages-api),请根据业务当前使用的 API 协议及所需能力选择迁移后的接口。 > - **注意:doubao-seed-2.1 后续模型不再支持调用 Batch Chat API。** **选项:快速入口** ![图片](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_2abecd05ca2779567c6d32f0ddc7874d.png) [模型列表](/docs/batch-inference) ![图片](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_a5fdd3028d35cc512a10bd71b982b6eb.png) [模型计费](/docs/model-pricing) ![图片](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_afbcf38bdec05c05089d5de5c3fd8fc8.png) [API Key](https://ark.volcengine.com/region:cn-beijing/apiKey?apikey=%7B%7D) ![图片](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_bef4bc3de3535ee19d0c5d6c37b0ffdd.png) [开通模型](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&OpenTokenDrawer=false) ![图片](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_57d0bca8e0d122ab1191b40101b5df75.png) [调用教程](/docs/batch-inference) ![图片](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_1609c71a747f84df24be1e6421ce58f0.png) [常见问题](/docs/modelark-faq) **选项:鉴权说明** 本接口支持 API Key 与 Access Key鉴权,详见 [鉴权认证方式](/docs/base-url-and-authentication)。 **选项:在线调试** [去调试](https://api.volcengine.com/api-explorer/?action=BatchChatCompletions&data=%7B%7D&groupName=%E6%89%B9%E9%87%8F%E6%8E%A8%E7%90%86&query=%7B%7D&serviceCode=ark&version=2024-01-01):您可以通过 API Explorer 在线发起调用,无需关注签名生成过程,快速获取调用结果。 --- ## 请求参数 > 跳转 [响应参数](/docs/batch-chat-api#PM1q4ttH) ### 请求体 --- **model** `string` `必选` 通过 Endpoint ID 来调用模型,可参考 [获取 Endpoint ID](/docs/online-inference-standard)。 --- **messages** `object[]` `必选` 到目前为止的对话组成的消息列表。不同模型支持不同类型的消息,如文本、图片、视频等。 消息类型 --- **系统消息** `object` 开发人员提供的指令,模型应遵循这些指令。如模型扮演的角色或者目标等。 属性 --- messages.**role** `string` `必选` 发送消息的角色,此处应为`system`。 --- messages.**content** `string / object[]` `必选` 系统信息内容。 属性 --- **纯文本消息内容** `string` 纯文本消息内容,大语言模型支持传入此类型。 --- **多模态消息内容** `object[]` 支持文本、图像、视频等类型,视觉理解模型等多模态模型、部分大语言模型支持此字段。 各模态消息部分 --- **文本消息部分** `object` 多模态消息中,内容文本输入。[具备视觉理解能力模型](/docs/model-list#76df97c8)、部分大语言模型支持此类型消息。 属性 --- messages.content.**text** `string` `必选` 文本消息部分的内容。 --- messages.content.**type** `string` `必选` 文本消息类型,此处应为 `text`。 --- **图像消息部分** `object` 多模态消息中,图像内容部分。[具备视觉理解能力模型](/docs/model-list#76df97c8) 支持此类型消息。 属性 --- messages.content.**image_url** `object` `必选` 图片消息的内容部分。 属性 --- messages.content.image_url.**url** `string` `必选` 支持传入图片链接或图片的Base64编码,具体使用请参见[使用说明](/docs/image-understanding#7a123cd1)。 --- messages.content.image_url.**detail** `string` `默认值 auto` 支持手动设置图片的质量,取值范围`high`、`low`、`auto`。 * `high`:高细节模式,适用于需要理解图像细节信息的场景,如对图像的多个局部信息/特征提取、复杂/丰富细节的图像理解等场景,理解更全面。 * `low`:低细节模式,适用于简单的图像分类/识别、整体内容理解/描述等场景,理解更快速。 * `auto`:默认模式,不同模型选择的模式略有不同,具体请参见 [理解图像的深度控制](/docs/image-understanding#bf4d9224)。 --- messages.content.**type** `string` `必选` 图像消息类型,此次应为 `image_url`。 --- **视频消息部分** > 视频理解模型请参见 [视频理解模型](/docs/model-list#76df97c8)。 多模态消息中,视频内容部分。 属性 --- messages.content.**type** `string` `必选` 视频消息类型,此次应为 `video_url`。 --- messages.content.**video_url**`object` `必选` 视频消息的内容部分。 属性 --- messages.content.video_url.**url** `string` `必选` 支持传入视频链接或视频的Base64编码。具体使用请参见 [视频理解说明](/docs/video-understanding)。 --- messages.content.video_url.**fps** `float/ null` `默认值 1` 取值范围:`[0.2, 5]`。 每秒钟从视频中抽取指定数量的图像。取值越高,对于视频中画面变化理解越精细;取值越低,对于视频中画面变化感知减弱,但是使用的 token 花费少,速度也更快。详细说明见 [用量说明](/docs/image-understanding#57188ace)。 --- **用户消息** `object` 用户发送的消息,包含提示或附加上下文信息。不同模型支持的字段类型不同,最多支持文本、图片、视频形式的消息。 属性 --- messages.**role** `string` `必选` 发送消息的角色,此处应为`user`。 --- messages.**content** `string / object[]` `必选` 用户信息内容。 内容类型 --- **纯文本消息内容** `string` 纯文本消息内容,大语言模型支持传入此类型。 --- **多模态消息内容** `object[]` 支持文本、图像、视频等类型,视觉理解模型等多模态模型、部分大语言模型支持此字段。 内容类型 --- **文本消息部分** `object` 多模态消息中,内容文本输入。视觉理解模型、部分大语言模型支持此类型消息。 属性 --- messages.content.**text** `string` `必选` 文本消息部分的内容。 --- messages.content.**type** `string` `必选` 文本消息类型,此处应为 `text`。 --- **图像消息部分** `object` 多模态消息中,图像内容部分。视觉理解模型支持此类型消息。 **属性** --- messages.content.**type** `string` `必选` 图像消息类型,此次应为 `image_url`。 --- messages.content.**image_url** `object` `必选` 图片消息的内容部分。 **属性** --- messages.content.image_url.**url** `string` `必选` 支持传入图片链接或图片的Base64编码,不同模型支持图片大小略有不同,具体请参见[使用说明](/docs/image-understanding#7a123cd1)。 --- messages.content.image_url.**detail** `string / null` `默认值 low` 取值范围:`high`、`low`、`auto`。 支持手动设置图片的质量。 * `high`:高细节模式,适用于需要理解图像细节信息的场景,如对图像的多个局部信息/特征提取、复杂/丰富细节的图像理解等场景,理解更全面。此时 **min_pixels** 取值`3136`、**max_pixels** 取值`4014080`。 * `low`:低细节模式,适用于简单的图像分类/识别、整体内容理解/描述等场景,理解更快速。此时 **min_pixels** 取值`3136`、**max_pixels** 取值`1048576`。 * `auto`:默认模式,不同模型选择的模式略有不同,具体请参见 [理解图像的深度控制](/docs/image-understanding#bf4d9224)。 --- messages.content.image_url.**image_pixel_limit** `object / null` `默认值 null` 允许设置图片的像素大小限制,如果不在此范围,则会等比例放大或者缩小至该范围内。 生效优先级:高于 **detail** 字段,即同时配置 **detail** 与 **image_pixel_limit** 字段时,生效 **image_pixel_limit** 字段配置。 若 **min_pixels** / **max_pixels** 字段未设置,使用 **detail** 设置配置的值对应的 **min_pixels** / **max_pixels** 值。 子字段取值逻辑:`3136` ≤ **min_pixels** ≤ **max_pixels** ≤ `4014080` --- * messages.content.image_url.image_pixel_limit.**max_pixels** `integer` 取值范围:(**min_pixels**, `4014080`]。 传入图片最大像素限制,大于此像素则等比例缩小至 **max_pixels** 字段取值以下。 若未设置,则取值为 **detail** 设置配置的值对应的 **max_pixels** 值。 --- * messages.content.image_url.image_pixel_limit.**min_pixels** 取值范围:[`3136`, **max_pixels**)。 传入图片最小像素限制,小于此像素则等比例放大至 **min_pixels** 字段取值以上。 若未设置,则取值为 **detail** 设置配置的值对应的 **min_pixels** 值(`3136`)。 --- **视频信息部分** `object` > 视频理解模型请参见 [视频理解模型](/docs/model-list#76df97c8)。 多模态消息中,视频内容部分。 属性 --- messages.content.**type** `string` `必选` 视频消息类型,此次应为 `video_url`。 --- messages.content.**video_url**`object` `必选` 视频消息的内容部分。 属性 --- messages.content.video_url.**url** `string` `必选` 支持传入视频链接或视频的Base64编码。具体使用请参见 [视频理解说明](/docs/video-understanding)。 --- messages.content.video_url.**fps** `float/ null` `默认值 1` 取值范围:`[0.2, 5]`。 每秒钟从视频中抽取指定数量的图像。取值越高,对于视频中画面变化理解越精细;取值越低,对于视频中画面变化感知减弱,但是使用的 token 花费少,速度也更快。详细说明见 [用量说明](/docs/image-understanding#57188ace)。 --- **模型消息** `object` 历史对话中,模型回复的消息。往往在多轮对话传入历史对话记录以及 [Prefill Response](/docs/continuation-mode) 时让模型按照预置的回复内容继续回复时使用。 属性 > **说明** > > messages.**content** 与 messages.**tool_calls** 字段二者至少填写其一。 --- messages.**role** `string` `必选` 发送消息的角色,此处应为`assistant`。 --- messages.**content** `string / array` 模型回复的消息。 --- messages.**tool_calls** `object[]` 历史对话中,模型回复的工具调用信息。 显示子字段 --- messages.tool_calls.**function** `object` `必选` 模型调用工具对应的函数信息。 显示子字段 --- messages.tool_calls.function.**name** `string` `必选` 模型需要调用的函数名称。 --- messages.tool_calls.function.**arguments** `string` `必选` 模型生成的用于调用函数的参数,JSON 格式。 > **说明** > > 模型并不总是生成有效的 JSON,并且可能会虚构出一些您的函数参数规范中未定义的参数。在调用函数之前,请在您的代码中验证这些参数是否有效。 --- messages.tool_calls.**id** `string` `必选` 调用的工具的 ID。 --- messages.tool_calls.**type** `string` `必选` 工具类型,当前仅支持`function`。 --- **thinking** `object` `默认值 {"type":"enabled"}` 控制模型是否开启深度思考模式。默认开启深度思考模式,可以手动关闭。 > 支持此字段的模型以及使用示例请参见 [文档](/docs/deep-thinking#fa3f44fa)。 属性 --- thinking.**type** `string` `必选` 取值范围:`enabled`, `disabled`,`auto`。 * `enabled`:开启思考模式,模型一定先思考后回答。 * `disabled`:关闭思考模式,模型直接回答问题,不会进行思考。 * `auto`:自动思考模式,模型根据问题自主判断是否需要思考,简单题目直接回答。 --- **max_tokens** `integer / null` `默认值 4096` 模型回复最大长度(单位 token),取值范围各个模型不同,详细见[模型列表](/docs/model-list)。 输入 token 和输出 token 的总长度还受模型的上下文长度限制。 --- **max_completion_tokens** `integer / null` > 支持该字段的模型 `deepseek-r1-250528`。 取值范围:`[0, 64k]`。 使用示例见 [文档](/docs/deep-thinking#cfc7c5a8)。控制模型输出的最大长度(包括模型回答和模型思维链内容长度,单位 token)。配置了该参数后,可以让模型输出超长内容,**max_tokens** (默认值 4k)与思维链最大长度将失效,模型按需输出内容,直到达到 **max_completion_tokens** 配置的值。 不可与 **max_tokens** 字段同时设置,会直接报错。 --- **stop** `string / string[] / null` `默认值 null` 模型遇到 stop 字段所指定的字符串时将停止继续生成,这个词语本身不会输出。 - 默认最多支持 `4` 个停止词。 - `deepseek-v4-pro-ga-260813`、`deepseek-v4-flash-ga-260731` 最多支持 `16` 个停止词。 > [深度思考能力模型](/docs/model-list#32e9e053)默认不支持该字段;上述 DeepSeek V4 模型除外。 示例:`["你好", "天气"]` --- **frequency_penalty** `float / null` `默认值 0` 取值范围为 [-2.0, 2.0]。 频率惩罚系数。如果值为正,会根据新 token 在文本中的出现频率对其进行惩罚,从而降低模型逐字重复的可能性。 --- **presence_penalty** `float / null` `默认值 0` 取值范围为 [-2.0, 2.0]。 存在惩罚系数。如果值为正,会根据新 token 到目前为止是否出现在文本中对其进行惩罚,从而增加模型谈论新主题的可能性。 --- **temperature** `float / null` `默认值 1` 取值范围为 [0, 2]。 采样温度。控制了生成文本时对每个候选词的概率分布进行平滑的程度。当取值为 0 时模型仅考虑对数概率最大的一个 token。 较高的值(如 0.8)会使输出更加随机,而较低的值(如 0.2)会使输出更加集中确定。 通常建议仅调整 temperature 或 top_p 其中之一,不建议两者都修改。 --- **top_p** `float / null` `默认值 0.7` 取值范围为 [0, 1]。 核采样概率阈值。模型会考虑概率质量在 top_p 内的 token 结果。当取值为 0 时模型仅考虑对数概率最大的一个 token。 0.1 意味着只考虑概率质量最高的前 10% 的 token,取值越大生成的随机性越高,取值越低生成的确定性越高。通常建议仅调整 temperature 或 top_p 其中之一,不建议两者都修改。 --- **logprobs** `boolean / null` `默认值 false` 是否返回输出 tokens 的对数概率。 * `false`:不返回对数概率信息。 * `true`:返回消息内容中每个输出 token 的对数概率。 --- **top_logprobs** `integer / null` `默认值 0` 取值范围为 [0, 20]。 指定每个输出 token 位置最有可能返回的 token 数量,每个 token 都有关联的对数概率。仅当 **logprobs** 为`true` 时可以设置 **top_logprobs** 参数。 --- **logit_bias** `map / null` `默认值 null` 调整指定 token 在模型输出内容中出现的概率,使模型生成的内容更加符合特定的偏好。**logit_bias** 字段接受一个 map 值,其中每个键为词表中的 token ID(使用 tokenization 接口获取),每个值为该 token 的偏差值,取值范围为 [-100, 100]。 -1 会减少选择的可能性,1 会增加选择的可能性;-100 会完全禁止选择该 token,100 会导致仅可选择该 token。该参数的实际效果可能因模型而异。 `{"": -100}` --- **tools** `object[] / null` `默认值 null` 待调用工具的列表,模型返回信息中可包含。当您需要让模型返回待调用工具时,需要配置该结构体。支持该字段的模型请参见 [文档](/docs/model-list#f44ceef7)。 属性 --- tools.**type** `string` `必选` 工具类型,此处应为 `function`。 --- tools.**function** `object` `必选` 模型返回中可包含待调用的工具。 属性 --- tools.function.**name** `string` `必选` 调用的函数的名称。 --- tools.function.**description** `string` 调用的函数的描述,大模型会使用它来判断是否调用这个工具。 --- tools.function.**parameters** `object` 函数请求参数,以 JSON Schema 格式描述。具体格式请参考 [JSON Schema](https://json-schema.org/understanding-json-schema) 文档,格式如下: ```json { "type": "object", "properties": { "location": { "type": "string", "description": "城市,如:北京" } }, "required": ["location"] } ``` 其中, * 所有字段名大小写敏感。 * **parameters** 须是合规的 JSON Schema 对象。 * 建议用英文字段名,中文置于 **description** 字段中。 --- ## 响应参数 > 跳转 [请求参数](/docs/batch-chat-api#B2fc2CRV) ### 非流式调用返回 --- **id** `string` 本次请求的唯一标识。 --- **model** `string` 本次请求实际使用的模型名称和版本。 --- **service_tier** `string` 本次请求是否使用了TPM保障包。 * `default`:本次请求未使用TPM保障包额度。 --- **created** `integer` 本次请求创建时间的 Unix 时间戳(秒)。 --- **object** `string` 固定为 `chat.completion`。 --- **choices** `object[]` 本次请求的模型输出内容。 属性 --- choices.**index** `integer` 当前元素在 **choices** 列表的索引。 --- choices.**finish_reason** `string` 模型停止生成 token 的原因。取值范围: * `stop`:模型输出自然结束,或因命中请求参数 stop 中指定的字段而被截断。 * `length`:模型输出因达到模型输出限制而被截断,有以下原因: * 触发`max_token`限制(回答内容的长度限制)。 * 触发`max_completion_tokens`限制(思维链内容+回答内容的长度限制)。 * 触发`context_window`限制(输入内容+思维链内容+回答内容的长度限制)。 * `content_filter`:模型输出被内容审核拦截。 * `tool_calls`:模型调用了工具。 --- choices.**message** `object` 模型输出的内容。 属性 --- choices.message.**role** `string` 内容输出的角色,此处固定为 `assistant`。 --- choices.message.**content** `string` 模型生成的消息内容。 --- choices.message.**reasoning_content** `string / null` 模型处理问题的思维链内容。 仅深度推理模型支持返回此字段,深度推理模型请参见[回传思考内容加密原文](/docs/deep-thinking#8cfd447b)。 批量推理场景下,对于已默认开启 thinking summary 的模型,不返回此字段(思考内容摘要),仅返回回答内容。 --- choices.message.**tool_calls** `object[] / null` 模型生成的工具调用。 属性 --- choices.message.tool_calls.**id** `string` 调用的工具的 ID。 --- choices.message.tool_calls.**type** `string` 工具类型,当前仅支持`function`。 --- choices.message.tool_calls.**function** `object` 模型调用的函数。 属性 --- choices.message.tool_calls.function.**name** `string` 模型调用的函数的名称。 --- choices.message.tool_calls.function.**arguments** `string` 模型生成的用于调用函数的参数,JSON 格式。 模型并不总是生成有效的 JSON,并且可能会虚构出一些您的函数参数规范中未定义的参数。在调用函数之前,请在您的代码中验证这些参数是否有效。 --- choices.**logprobs** `object / null` 当前内容的对数概率信息。 属性 --- choices.logprobs.**content** `object[] / null` message列表中每个 content 元素中的 token 对数概率信息。 属性 --- choices.logprobs.content.**token** `string` 当前 token。 --- choices.logprobs.content.**bytes** `integer[] / null` 当前 token 的 UTF-8 值,格式为整数列表。当一个字符由多个 token 组成(表情符号或特殊字符等)时可以用于字符的编码和解码。如果 token 没有 UTF-8 值则为空。 --- choices.logprobs.content.**logprob** `float` 当前 token 的对数概率。 --- choices.logprobs.content.**top_logprobs** `object[]` 在当前 token 位置最有可能的标记及其对数概率的列表。在一些情况下,返回的数量可能比请求参数 top_logprobs 指定的数量要少。 **属性** --- choices.logprobs.content.top_logprobs.**token** `string` 当前 token。 --- choices.logprobs.content.top_logprobs.**bytes** `integer[] / null` 当前 token 的 UTF-8 值,格式为整数列表。当一个字符由多个 token 组成(表情符号或特殊字符等)时可以用于字符的编码和解码。如果 token 没有 UTF-8 值则为空。 --- choices.logprobs.content.top_logprobs.**logprob** `float` 当前 token 的对数概率。 --- choices.**moderation_hit_type** `string / null` 模型输出文字含有敏感信息时,会返回模型输出文字命中的风险分类标签。 返回值及含义: * `severe_violation`:模型输出文字涉及严重违规。 * `violence`:模型输出文字涉及激进行为。 注意:当前只有 [视觉理解模型](/docs/image-understanding#f8d6cc48) 支持返回该字段,且只有在方舟控制台 [接入点配置页面](https://ark.volcengine.com/region:cn-beijing/endpoint/create?customModelId=) 或者 [CreateEndpoint](/docs/create-endpoint-api) 接口中,将内容护栏方案(ModerationStrategy)设置为基础方案(Basic)时,才会返回风险分类标签。 --- **usage** `object` 本次请求的 token 用量。 属性 --- usage.**prompt_tokens** `integer` 输入的 prompt token 数量。 --- usage.**completion_tokens** `integer` 模型生成的 token 数量。 --- usage.**total_tokens** `integer` 本次请求消耗的总 token 数量(输入 + 输出)。 --- usage.**prompt_tokens_details** `object` 本接口暂不支持该字段。 命中上下文缓存的tokens细节。 属性 --- usage.prompt_tokens_details.**cached_tokens** `integer` 本接口暂不支持该字段。此处应为 `0`。 --- usage.**completion_tokens_details** `object` 本次请求花费的 token 的细节。 属性 --- usage.completion_tokens_details.**reasoning_tokens** `integer` 输出思维链内容花费的 token 数 。 支持输出思维链的模型请参见 [文档](/docs/deep-thinking#14b5c6db)。 ## 代码示例 ## 简单示例 ### cURL #### Request ```bash curl https://ark.cn-beijing.volces.com/api/v3/batch/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d $'{ "messages": [ { "content": "You are a helpful assistant.", "role": "system" }, { "content": "Hello!", "role": "user" } ], "model": "ep-bi-20250327******-*****" }' ``` #### Response ``` { "choices": [ { "finish_reason": "stop", "index": 0, "logprobs": null, "message": { "content": "Hello! How can I assist you today?", "role": "assistant" } } ], "created": 1744206287, "id": "0217442062858641b9058848e46dd9b87819ea2d71e52d55930aa", "model": "doubao-seed-2-1-pro-260628", "service_tier": "default", "object": "chat.completion", "usage": { "completion_tokens": 9, "prompt_tokens": 20, "total_tokens": 29, "prompt_tokens_details": { "cached_tokens": 0 }, "completion_tokens_details": { "reasoning_tokens": 0 } } } ``` ### Python #### Request ```python import os from arkruntime import Ark client = Ark(base_url="https://ark.cn-beijing.volces.com/api/v3", api_key=os.environ.get("ARK_API_KEY")) if __name__ == "__main__": # Non-streaming: print("----- standard request -----") completion = client.batch.chat.completions.create( model="ep-bi-20250327******-*****", messages=[{"content":"You are a helpful assistant.","role":"system"},{"content":"Hello!","role":"user"}], ) print(completion.choices[0].message.content) ``` #### Response ``` { "choices": [ { "finish_reason": "stop", "index": 0, "logprobs": null, "message": { "content": "Hello! How can I assist you today?", "role": "assistant" } } ], "created": 1744206287, "id": "0217442062858641b9058848e46dd9b87819ea2d71e52d55930aa", "model": "doubao-seed-2-1-pro-260628", "service_tier": "default", "object": "chat.completion", "usage": { "completion_tokens": 9, "prompt_tokens": 20, "total_tokens": 29, "prompt_tokens_details": { "cached_tokens": 0 }, "completion_tokens_details": { "reasoning_tokens": 0 } } } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "sync" "time" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/chat" ) func main() { timeout := time.Hour workerNum := 3 client := arkruntime.NewClientWithApiKey(os.Getenv("ARK_API_KEY"), arkruntime.WithTimeout(timeout), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) client.StartBatchWorker(workerNum) ctx := context.Background() taskNum := 5 wg := sync.WaitGroup{} req := &chat.ChatCompletionRequest{ Model: "ep-bi-20250327******-*****", Messages: []chat.ChatCompletionRequestMessage{ systemMessage("You are a helpful assistant."), userMessage("Hello!"), }, } for i := 0; i < workerNum; i++ { wg.Add(1) go func(index int) { defer wg.Done() for j := 0; j < taskNum; j++ { resp, err := client.CreateBatchChatCompletion(ctx, req) if err != nil { fmt.Printf("worker %d request %d Fail Err %s\n", index, j, err) return } fmt.Println(resp.Choices[0].Message.Content) } }(i) } wg.Wait() client.StopBatchWorker() } func systemMessage(content string) chat.ChatCompletionRequestMessage { return chat.ChatCompletionRequestMessage{ OneOf: chat.NewChatCompletionRequestSystemMessageChatCompletionRequestMessageSum( chat.ChatCompletionRequestSystemMessage{ Role: chat.ChatCompletionRequestSystemMessageRoleSystem, Content: chat.NewStringChatCompletionMessageContent(content), }, ), } } func userMessage(content string) chat.ChatCompletionRequestMessage { return chat.ChatCompletionRequestMessage{ OneOf: chat.NewChatCompletionRequestUserMessageChatCompletionRequestMessageSum( chat.ChatCompletionRequestUserMessage{ Role: chat.ChatCompletionRequestUserMessageRoleUser, Content: chat.NewOptNilChatCompletionMessageContent( chat.NewStringChatCompletionMessageContent(content), ), }, ), } } ``` #### Response ``` { "choices": [ { "finish_reason": "stop", "index": 0, "logprobs": null, "message": { "content": "Hello! How can I assist you today?", "role": "assistant" } } ], "created": 1744206287, "id": "0217442062858641b9058848e46dd9b87819ea2d71e52d55930aa", "model": "doubao-seed-2-1-pro-260628", "service_tier": "default", "object": "chat.completion", "usage": { "completion_tokens": 9, "prompt_tokens": 20, "total_tokens": 29, "prompt_tokens_details": { "cached_tokens": 0 }, "completion_tokens_details": { "reasoning_tokens": 0 } } } ``` ### Java #### Request ```java package com.volcengine.sample; import com.volcengine.ark.runtime.models.chat.*; import com.fasterxml.jackson.core.JsonProcessingException; import com.volcengine.ark.runtime.service.ArkService; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; /* # pom.xml com.volcengine ark-runtime // 替换正式版本号 0.9.0 */ public class Sample { static String apiKey = System.getenv("ARK_API_KEY"); static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); static Dispatcher dispatcher = new Dispatcher(); static ArkService service = ArkService.builder() .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); public static void main(String[] args) throws JsonProcessingException { List messagesForReqList = new ArrayList<>(); ChatCompletionRequestMessage elementForMessagesForReqList0 = ChatCompletionRequestSystemMessage.builder() .role(ChatCompletionRequestMessageType.SYSTEM) .content(ChatCompletionMessageContent.ofString("You are a helpful assistant.")) .build(); ChatCompletionRequestMessage elementForMessagesForReqList1 = ChatCompletionRequestUserMessage.builder().role(ChatCompletionRequestMessageType.USER).content(ChatCompletionMessageContent.ofString("Hello!")).build(); messagesForReqList.add(elementForMessagesForReqList0); messagesForReqList.add(elementForMessagesForReqList1); ChatCompletionRequest req = ChatCompletionRequest.builder() .model("ep-bi-20250327******-*****") .messages(messagesForReqList) .build(); service.createBatchChatCompletion(req) .getChoices() .forEach(choice -> System.out.println(choice.getMessage().getContent())); // shutdown service after all requests is finished service.shutdownExecutor(); } } ``` #### Response ``` { "choices": [ { "finish_reason": "stop", "index": 0, "logprobs": null, "message": { "content": "Hello! How can I assist you today?", "role": "assistant" } } ], "created": 1744206287, "id": "0217442062858641b9058848e46dd9b87819ea2d71e52d55930aa", "model": "doubao-seed-2-1-pro-260628", "service_tier": "default", "object": "chat.completion", "usage": { "completion_tokens": 9, "prompt_tokens": 20, "total_tokens": 29, "prompt_tokens_details": { "cached_tokens": 0 }, "completion_tokens_details": { "reasoning_tokens": 0 } } } ``` --- # 分词 API Source: https://ark.volcengine.com/region:cn-beijing/docs/tokenization-api `POST https://ark.cn-beijing.volces.com/api/v3/tokenization` 对输入的文本进行分词,返回每个 Token 的 ID 和偏移量。仅支持文本输入。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 --- ## 请求参数 ### Body 参数 **model** `string` `必选` | 模型 ID 本次请求使用模型的 Model ID 或推理接入点 (Endpoint ID) **text** `string / string[]` `必选` | 分词内容 需要分词的内容,支持字符串或字符串列表。如需在一次请求中对多条文本分词,请传入字符串列表 **user** `string` | 用户标识 代表最终用户的唯一标识符。当前服务端接受但不使用该字段,预留以对齐其他接口 ## 响应参数 **created** `integer` | 创建时间 本次请求创建时间的 Unix 时间戳(秒) **data** `object[]` | 分词结果 本次请求的分词结果列表,每个元素对应一条输入文本的分词结果 **index** `integer` | 索引 `data.index` 当前元素在 `data` 列表中的索引,与请求 `text` 数组顺序一致 **object** `string` | 对象类型 `data.object` 对象类型,固定为 `tokenization` **offset_mapping** `integer[]` | 偏移量 `data.offset_mapping` 对文本进行分词后的词语偏移量,列表中每个元素是一个包含两个整数的列表:第一个整数表示词或标记在原始文本中的起始索引(从 0 开始),第二个整数表示结束索引(不包括该索引处的字符) **token_ids** `integer[]` | Token ID 列表 `data.token_ids` 对文本分词后每个 token 在词表中的 ID 列表,顺序与原文一致 **total_tokens** `integer` | token 总数 `data.total_tokens` 对应内容的总 token 数量 **id** `string` | 请求 ID 本次请求的唯一标识 **model** `string` | 使用的模型 本次请求实际使用的模型 ID(`模型名称-版本`)。例如调用部署 `doubao-seed-2-1-pro-260628` 模型的推理接入点,返回 model 字段信息 `doubao-seed-2-1-pro-260628` **object** `string` | 对象类型 固定为 `list` ## 代码示例 ## 默认 ### cURL #### Request ```bash curl https://ark.cn-beijing.volces.com/api/v3/tokenization \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d $'{ "model": "doubao-pro-32k-241215", "text": [ "天空为什么这么蓝", "花儿为什么这么香" ] }' ``` #### Response ``` { "object": "list", "id": "0217441868631536d992e302715172e42d8bf34590a60cadc221f", "model": "doubao-pro-32k-241215", "data": [ { "object": "tokenization", "index": 0, "total_tokens": 4, "token_ids": [14539, 4752, 5189, 5399], "offset_mapping": [ [0, 2], [2, 5], [5, 7], [7, 8] ] }, { "object": "tokenization", "index": 1, "total_tokens": 4, "token_ids": [45018, 4752, 5189, 2920], "offset_mapping": [ [0, 2], [2, 5], [5, 7], [7, 8] ] } ], "created": 1744186863 } ``` ### Python #### Request ```python import os from arkruntime import Ark # Authentication # 1.If you authorize your endpoint using an API key, you can set your api key to environment variable "ARK_API_KEY" # or specify api key by Ark(api_key="${YOUR_API_KEY}"). # Note: If you use an API key, this API key will not be refreshed. # To prevent the API from expiring and failing after some time, choose an API key with no expiration date. # 2.If you authorize your endpoint with Volcengine Identity and Access Management(IAM), # set your api key to environment variable "VOLC_ACCESSKEY", "VOLC_SECRETKEY" # or specify ak&sk by Ark(ak="${YOUR_AK}", sk="${YOUR_SK}"). # To get your ak&sk, please refer to this document(https://www.volcengine.com/docs/6291/65568) # For more information,please check this document(https://ark.volcengine.com/region:cn-beijing/docs/api-key) client = Ark( api_key=os.environ.get("ARK_API_KEY"), base_url="https://ark.cn-beijing.volces.com/api/v3", ) print("----- tokenization request -----") resp = client.tokenization.create( model="doubao-pro-32k-241215", text=[ "天空为什么这么蓝", "花儿为什么这么香", ], ) print(resp) ``` #### Response ``` { "object": "list", "id": "0217441868631536d992e302715172e42d8bf34590a60cadc221f", "model": "doubao-pro-32k-241215", "data": [ { "object": "tokenization", "index": 0, "total_tokens": 4, "token_ids": [14539, 4752, 5189, 5399], "offset_mapping": [ [0, 2], [2, 5], [5, 7], [7, 8] ] }, { "object": "tokenization", "index": 1, "total_tokens": 4, "token_ids": [45018, 4752, 5189, 2920], "offset_mapping": [ [0, 2], [2, 5], [5, 7], [7, 8] ] } ], "created": 1744186863 } ``` ### Go #### Request ```go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" model "github.com/volcengine/ark-runtime-go/arkruntime/model/tokenization" ) /** * Authentication * 1.If you authorize your endpoint using an API key, you can set your api key to environment variable "ARK_API_KEY" * client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) * Note: If you use an API key, this API key will not be refreshed. * To prevent the API from expiring and failing after some time, choose an API key with no expiration date. * * 2.If you authorize your endpoint with Volcengine Identity and Access Management(IAM), set your api key to environment variable "VOLC_ACCESSKEY", "VOLC_SECRETKEY" * client := arkruntime.NewClientWithAkSk(os.Getenv("VOLC_ACCESSKEY"), os.Getenv("VOLC_SECRETKEY")) * To get your ak&sk, please refer to this document(https://www.volcengine.com/docs/6291/65568) * For more information,please check this document(https://ark.volcengine.com/region:cn-beijing/docs/api-key) */ func main() { client := arkruntime.NewClientWithApiKey(os.Getenv("ARK_API_KEY")) ctx := context.Background() fmt.Println("----- tokenization request -----") req := &model.TokenizationRequest{ Text: model.NewStringArrayTokenizationInput([]string{ "天空为什么这么蓝", "花儿为什么这么香", }), Model: "doubao-pro-32k-241215", } resp, err := client.CreateTokenization(ctx, req) if err != nil { fmt.Printf("tokenization error: %v\n", err) return } fmt.Printf("tokenization response: %v\n", resp) } ``` #### Response ``` { "object": "list", "id": "0217441868631536d992e302715172e42d8bf34590a60cadc221f", "model": "doubao-pro-32k-241215", "data": [ { "object": "tokenization", "index": 0, "total_tokens": 4, "token_ids": [14539, 4752, 5189, 5399], "offset_mapping": [ [0, 2], [2, 5], [5, 7], [7, 8] ] }, { "object": "tokenization", "index": 1, "total_tokens": 4, "token_ids": [45018, 4752, 5189, 2920], "offset_mapping": [ [0, 2], [2, 5], [5, 7], [7, 8] ] } ], "created": 1744186863 } ``` ### Java #### Request ```java package com.volcengine.sample; import com.volcengine.ark.runtime.models.tokenization.*; import com.fasterxml.jackson.core.JsonProcessingException; import com.volcengine.ark.runtime.service.ArkService; import java.util.Arrays; import java.util.concurrent.TimeUnit; import okhttp3.ConnectionPool; import okhttp3.Dispatcher; /* # pom.xml com.volcengine ark-runtime // 替换正式版本号 0.9.0 */ public class Sample { /** * Authentication 1.If you authorize your endpoint using an API key, you can set your api key to * environment variable "ARK_API_KEY" String apiKey = System.getenv("ARK_API_KEY"); ArkService * service = new ArkService(apiKey); Note: If you use an API key, this API key will not be * refreshed. To prevent the API from expiring and failing after some time, choose an API key * with no expiration date. * *

    2.If you authorize your endpoint with Volcengine Identity and Access Management(IAM), set * your api key to environment variable "VOLC_ACCESSKEY", "VOLC_SECRETKEY" String ak = * System.getenv("VOLC_ACCESSKEY"); String sk = System.getenv("VOLC_SECRETKEY"); ArkService * service = new ArkService(ak, sk); To get your ak&sk, please refer to this * document(https://www.volcengine.com/docs/6291/65568) For more information,please check this * document(https://ark.volcengine.com/region:cn-beijing/docs/api-key) */ static String apiKey = System.getenv("ARK_API_KEY"); static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS); static Dispatcher dispatcher = new Dispatcher(); static ArkService service = ArkService.builder() .dispatcher(dispatcher) .connectionPool(connectionPool) .apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); public static void main(String[] args) throws JsonProcessingException { TokenizationRequest req = TokenizationRequest.builder() .model("doubao-pro-32k-241215") .text(TokenizationInput.ofList(Arrays.asList("天空为什么这么蓝", "花儿为什么这么香"))) .build(); System.out.println(service.createTokenization(req).toString()); // shutdown service after all requests is finished service.shutdownExecutor(); } } ``` #### Response ``` { "object": "list", "id": "0217441868631536d992e302715172e42d8bf34590a60cadc221f", "model": "doubao-pro-32k-241215", "data": [ { "object": "tokenization", "index": 0, "total_tokens": 4, "token_ids": [14539, 4752, 5189, 5399], "offset_mapping": [ [0, 2], [2, 5], [5, 7], [7, 8] ] }, { "object": "tokenization", "index": 1, "total_tokens": 4, "token_ids": [45018, 4752, 5189, 2920], "offset_mapping": [ [0, 2], [2, 5], [5, 7], [7, 8] ] } ], "created": 1744186863 } ``` --- # 获取临时 API Key Source: https://ark.volcengine.com/region:cn-beijing/docs/get-api-key-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=GetApiKey&Version=2024-01-01` 获取临时 API Key,用于在有效期内指定推理接入点、智能体等资源的调用的鉴权 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **DurationSeconds** `integer` `必选` | 有效期 临时 API Key 的有效期,单位为秒。 **取值范围**:`[0, 2592000]` **ResourceIds** `string[]` `必选` | 资源 ID 列表 *ResourceType* 字段指定的资源 ID 列表。 - 当 *ResourceType* 为 `endpoint` 时,可在方舟控制台 > 推理模块获取 endpoint ID。 - 当 *ResourceType* 为 `bot` 时,可在方舟控制台 > 我的应用获取 bot ID。 **ResourceType** `string` `必选` | 资源类型 资源类型。可选值: - `endpoint`:模型推理接入点 - `bot`:智能体 - `presetendpoint`:预置推理接入点 **ProjectName** `string` | 项目名称 项目名称。当 *ResourceType* 为 `presetendpoint` 时,本参数必填。 ## 响应参数 **ApiKey** `string` | 临时 API Key 生成的临时 API Key 字符串,可在 *DurationSeconds* 指定的有效期内用于调用方舟相关资源。 **ExpiredTime** `integer` | 过期时间 临时 API Key 的过期时间,Unix 时间戳,单位为秒。 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=GetApiKey&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "DurationSeconds": 86400, "ResourceType": "endpoint", "ResourceIds": [ "[\"ep-***\", \"ep-***\"]" ] } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "20250108152350029189016106C67393", "Action": "GetApiKey", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "ExpiredTime": 0, "ApiKey": "***" } } ``` --- # 创建个人版套餐 Source: https://ark.volcengine.com/region:cn-beijing/docs/create-personal-plan-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=CreatePersonalPlan&Version=2024-01-01` 个人版用户购买 Agent Plan / Coding Plan 套餐(`AgentPlan` / `CodingPlan`)。 > 您通过 API 接口发起部署请求或调用本服务的,即表示您已充分阅读、理解并同意 [《火山引擎数据授权协议》](/docs/volcengine-data-authorization-agreement)、[《方舟平台专用条款》](/docs/volcengine-ark-platform-terms)、[《免责声明》](/docs/volcengine-ark-experience-center-terms-and-disclaimer)、[《豆包模型服务协议》](/docs/doubao-model-service-agreement)、[《开源模型许可证》](/docs/open-source-model-licenses)、[《语音服务协议》](https://docs.volcengine.com/docs/6561/1866421?lang=zh)、[《Harness能力说明和产品专用条款》](/docs/harness-rules) 及其他适用的平台规则。如您不同意上述协议,请立即停止调用。 > **注意** > > 自 **2026 年 8 月 26 日**起,`CreatePersonalPlan` 接口新增必填请求参数 `AgreementAccepted`,用于确认调用方已阅读并同意当前 Plan 所适用的协议及条款。该参数仅支持传入 `true`。**未传入该参数时,将无法下单并返回参数缺失错误。** 请您尽快完成接口适配,以避免影响套餐购买。 > **说明** > > * 单次请求仅支持订购单一套餐类型(单次仅购买一个 `PlanType`)。 > * 支持传入 `DryRun=true` 参数,仅执行订购合法性校验,不实际创建订阅订单。 > * 个人版同一账号同档位同一时间仅允许持有一个有效订阅,重复提交同档位订购请求,将返回 `OperationDenied` 类错误。 > * 接口为异步下单,自动扣费模式,下单前请确保云账户内余额充足。 > * 调用 `CreatePersonalPlan` 提交套餐创建请求后,订单存在异步处理或状态延迟情况。建议在调用 `CreatePersonalPlan` 接口后,通过 `GetPersonalPlan` 接口进行反查,以确认最终的套餐创建结果。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **AgreementAccepted** `boolean` `必选` | 协议确认 是否已阅读并同意当前 Plan 适用的协议及条款。该参数仅支持传入 `true`;未传入时,将无法下单并返回参数缺失错误。 **Duration** `number` `必选` | 订购时长 订购时长,单位以 *PricingCycle* 为准。 **取值范围**:`[1, 12]` **Plan** `string` `必选` | 商品名称 待购买的商品名称。可选值:`AgentPlan`(Agent Plan 个人版)、`CodingPlan`(Coding Plan 个人版)。 **PlanType** `string` `必选` | 套餐档位 套餐档位。支持以下套餐类型及档位取值: * `AgentPlan`:`Small`、`Medium`、`Large`、`Max` * `CodingPlan`:`Lite`、`Pro` **PricingCycle** `string` `必选` | 计费周期 计费周期。当前仅支持 `Month`(包月)。 **AutoRenew** `boolean` `默认值 false` | 自动续费 是否在套餐到期时开启自动续费。设为 `true` 时套餐到期前会从云账户余额自动续费,仅支持单次自动续费。 **DryRun** `boolean` `默认值 false` | 预检模式 是否仅校验不下单。设为 `true` 时,仅完成参数、额度全链路校验,不会实际扣款,适用于上线前预校验场景。 ## 响应参数 **PlanType** `string` | 已购买的套餐档位 ## 代码示例 --- # 续费个人版套餐 Source: https://ark.volcengine.com/region:cn-beijing/docs/renew-personal-plan-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=RenewPersonalPlan&Version=2024-01-01` 续费个人版套餐 > 您通过 API 接口发起部署请求或调用本服务的,即表示您已充分阅读、理解并同意 [《火山引擎数据授权协议》](/docs/volcengine-data-authorization-agreement)、[《方舟平台专用条款》](/docs/volcengine-ark-platform-terms)、[《免责声明》](/docs/volcengine-ark-experience-center-terms-and-disclaimer)、[《豆包模型服务协议》](/docs/doubao-model-service-agreement)、[《开源模型许可证》](/docs/open-source-model-licenses)、[《语音服务协议》](https://docs.volcengine.com/docs/6561/1866421?lang=zh)、[《Harness能力说明和产品专用条款》](/docs/harness-rules) 及其他适用的平台规则。如您不同意上述协议,请立即停止调用。 > **注意** > > 自 **2026 年 8 月 26 日**起,`RenewPersonalPlan` 接口新增必填请求参数 `AgreementAccepted`,用于确认调用方已阅读并同意当前 Plan 所适用的协议及条款。该参数仅支持传入 `true`。**未传入该参数时,将无法下单并返回参数缺失错误。** 请您尽快完成接口适配,以避免影响套餐购买。 > **说明** > > * 接口为异步执行,自动扣费,下单前请确保云账户内余额充足。 > * 调用 `RenewPersonalPlan` 提交续费请求后,订单存在异步处理或状态延迟情况。建议在调用 `RenewPersonalPlan` 接口续费个人版套餐后,通过 `GetPersonalPlan` 接口进行反查,以确认最终的续费结果。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **AgreementAccepted** `boolean` `必选` | 协议确认 是否已阅读并同意当前 Plan 适用的协议及条款。该参数仅支持传入 `true`;未传入时,将无法续费并返回参数缺失错误。 **Duration** `number` `必选` | 续费时长 续费时长,单位以 *PricingCycle* 为准。 **取值范围**:`[1, 12]` **Plan** `string` `必选` | 商品名称 待续费的商品名称。可选值:`AgentPlan`、`CodingPlan`。 **PricingCycle** `string` `必选` | 计费周期 计费周期。固定取值:`Month`。 **DryRun** `boolean` `默认值 false` | 预检模式 是否仅进行预检不下单。取值: * `true`:仅校验请求 * `false`(默认):正式执行请求。 ## 响应参数 本接口无特有的返回参数,成功时 HTTP 状态码为 `200`,返回结构中 `Result` 为空对象 `{}`。 ## 代码示例 --- # 查询个人版套餐 Source: https://ark.volcengine.com/region:cn-beijing/docs/get-personal-plan-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=GetPersonalPlan&Version=2024-01-01` 查询当前账号已购买的个人版套餐信息,包含套餐档位、生效状态、起止时间、自动续费设置等。 > **说明:注意** > > 该接口仅返回当前账号已购买的个人版套餐信息,未购买或套餐已回收时会返回 ResourceNotFound.Plan 错误。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **Plan** `string` `必选` | 商品名称 待查询的商品名称。可选值:`AgentPlan`、`CodingPlan`。 ## 响应参数 **AutoRenew** `boolean` | 自动续费 是否已开启到期自动续费。 **EndTime** `string` | 到期时间 套餐当前到期时间,ISO 8601 格式。 **PlanType** `string` | 套餐档位 当前账号已订购的套餐档位。*Plan* 为 `AgentPlan` 时取值 `Small`、`Medium`、`Large`、`Max`;*Plan* 为 `CodingPlan` 时取值 `Lite`、`Pro`。 **StartTime** `string` | 生效时间 套餐首次生效时间,ISO 8601 格式。 **Status** `string` | 套餐状态 套餐的当前生效状态。`Running` 表示生效中,`Expired` 表示已过期。 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=GetPersonalPlan&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "Plan": "AgentPlan" } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "20260101120000D7E3F2B481A5C90463", "Action": "GetPersonalPlan", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "PlanType": "Small", "Status": "Running", "StartTime": "2025-01-01T00:00:00+08:00", "EndTime": "2026-01-01T00:00:00+08:00", "AutoRenew": false } } ``` --- # 查询 Agent Plan 支持的模型列表 Source: https://ark.volcengine.com/region:cn-beijing/docs/list-ark-agent-plan-model-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=ListArkAgentPlanModel&Version=2024-01-01` 查询 `AgentPlan` 套餐当前支持的模型列表,支持通过 `Edition` 区分个人版与企业版,结果用于在前端展示用户可在套餐内调用的模型。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **Edition** `string` | 套餐版本 套餐版本。可选值:`personal`(个人版)或 `enterprise`(企业版)。未传入或传入未识别值时,默认返回公共模型列表。 ## 响应参数 **Datas** `object[]` | 模型列表 `AgentPlan` 套餐支持的模型列表。 **ModelID** `string` | 模型 ID `Datas.ModelID` ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=ListArkAgentPlanModel&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{} ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "2026042420200711904516115846EFE8", "Action": "ListArkAgentPlanModel", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "Datas": [ { "ModelID": "doubao-seed-2-1-pro-260915" }, { "ModelID": "doubao-seed-2-1-pro-260915" }, { "ModelID": "doubao-seed-2-1-lite-260915" } ] } } ``` --- # 轮换个人版 API Key Source: https://ark.volcengine.com/region:cn-beijing/docs/regenerate-personal-api-key-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=RegeneratePersonalApiKey&Version=2024-01-01` 轮换个人版 `AgentPlan` 套餐的 API Key。轮换后原 API Key 立即失效,使用旧 Key 的请求将鉴权失败。轮换成功后,请通过控制台或调用 [获取临时 API Key](/docs/get-api-key-api) 接口获取新 API Key,本接口出于安全考虑不在响应体中返回新 Key。适用于密钥泄露后的紧急轮换或定期安全轮换场景。 > **注意** > > 轮换操作不可逆,旧 API Key 在轮换完成后立即失效。请在调用前确认已做好密钥更替的业务联动准备。轮换成功后,请通过控制台或调用 [获取临时 API Key](/docs/get-api-key-api) 获取新 API Key,本接口出于安全考虑不在响应体中返回新 Key。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **Plan** `string` `必选` | 商品名称 待轮换 API Key 的套餐商品名称。可选值:`AgentPlan`(Agent Plan 个人版)。 **ProjectName** `string` | 项目名称 API Key 所属的项目空间名称。 ## 响应参数 **Message** `string` | 失败原因 轮换失败时的具体原因说明。轮换成功时为空字符串。 **Status** `string` | 轮换结果 轮换结果状态。可选值:`Success`(轮换成功,新 API Key 已生效,旧 Key 已失效)、`Failed`(轮换失败,原 API Key 仍然有效,具体原因见 *Message* 字段)。 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=RegeneratePersonalApiKey&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "Plan": "AgentPlan" } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "20260519103356E1B4A72F9D82C50376", "Action": "RegeneratePersonalApiKey", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "Status": "Success", "Message": "" } } ``` --- # 获取套餐 AFP 额度 Source: https://ark.volcengine.com/region:cn-beijing/docs/get-afp-usage-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=GetAFPUsage&Version=2024-01-01` 查询个人版 `AgentPlan` 套餐的 AFP(Agent Frame Point)额度用量,包含 5 小时、近一天、近一周、近一月四个滚动窗口的配额与已用量。企业版席位用量请改用 *GetSeatAFPUsage* 接口。 > **说明:注意** > > 仅适用于个人版 Agent Plan 套餐;企业版席位用量请改用 GetSeatAFPUsage。返回的 Quota / Used 单位为 AFP,时间戳为 epoch 毫秒。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ## 响应参数 **AFPDaily** `object` | 近一天用量 近 1 天滚动窗口的 AFP 用量。 **Quota** `string` | 窗口总配额 `AFPDaily.Quota` 该窗口内的 AFP 总配额。 **ResetTime** `integer` | 下次重置时间 `AFPDaily.ResetTime` 下一次额度重置的时间,Unix 毫秒时间戳。 **SubscribeTime** `integer` | 窗口起始时间 `AFPDaily.SubscribeTime` 当前计费窗口的起始时间,Unix 毫秒时间戳。 **Used** `string` | 窗口已用量 `AFPDaily.Used` 该窗口内已消耗的 AFP 配额。 **AFPFiveHour** `object` | 5 小时用量 近 5 小时滚动窗口的 AFP 用量。 **Quota** `string` | 窗口总配额 `AFPFiveHour.Quota` 该窗口内的 AFP 总配额。 **ResetTime** `integer` | 下次重置时间 `AFPFiveHour.ResetTime` 下一次额度重置的时间,Unix 毫秒时间戳。 **SubscribeTime** `integer` | 窗口起始时间 `AFPFiveHour.SubscribeTime` 当前计费窗口的起始时间,Unix 毫秒时间戳。 **Used** `string` | 窗口已用量 `AFPFiveHour.Used` 该窗口内已消耗的 AFP 配额。 **AFPMonthly** `object` | 近一月用量 近 1 个月滚动窗口的 AFP 用量。 **Quota** `string` | 窗口总配额 `AFPMonthly.Quota` 该窗口内的 AFP 总配额。 **ResetTime** `integer` | 下次重置时间 `AFPMonthly.ResetTime` 下一次额度重置的时间,Unix 毫秒时间戳。 **SubscribeTime** `integer` | 窗口起始时间 `AFPMonthly.SubscribeTime` 当前计费窗口的起始时间,Unix 毫秒时间戳。 **Used** `string` | 窗口已用量 `AFPMonthly.Used` 该窗口内已消耗的 AFP 配额。 **AFPWeekly** `object` | 近一周用量 近 1 周滚动窗口的 AFP 用量。 **Quota** `string` | 窗口总配额 `AFPWeekly.Quota` 该窗口内的 AFP 总配额。 **ResetTime** `integer` | 下次重置时间 `AFPWeekly.ResetTime` 下一次额度重置的时间,Unix 毫秒时间戳。 **SubscribeTime** `integer` | 窗口起始时间 `AFPWeekly.SubscribeTime` 当前计费窗口的起始时间,Unix 毫秒时间戳。 **Used** `string` | 窗口已用量 `AFPWeekly.Used` 该窗口内已消耗的 AFP 配额。 **PlanType** `string` | 套餐档位 当前个人版套餐档位。取值:`Small`、`Medium`、`Large`、`Max`。 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=GetAFPUsage&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{} ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "20260511034034F809E27C4B1D3A6E52", "Action": "GetAFPUsage", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "PlanType": "Large", "AFPFiveHour": { "Quota": "50.0", "Used": "12.5", "SubscribeTime": 1778788800000, "ResetTime": 1778806800000 }, "AFPDaily": { "Quota": "100.0", "Used": "22.5", "SubscribeTime": 1778716800000, "ResetTime": 1778803200000 }, "AFPWeekly": { "Quota": "500.0", "Used": "150.0", "SubscribeTime": 1778457600000, "ResetTime": 1779062400000 }, "AFPMonthly": { "Quota": "2000.0", "Used": "850.5", "SubscribeTime": 1777939200000, "ResetTime": 1780531200000 } } } ``` --- # 获取套餐用量详情 Source: https://ark.volcengine.com/region:cn-beijing/docs/get-usage-details-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=GetUsageDetails&Version=2024-01-01` 查询个人版 `AgentPlan` 套餐的模型调用用量明细。用量按 *QueryInterval* 指定的时间粒度(天或小时)聚合。企业版席位用量请改用 *GetSeatUsageDetails* 接口。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **QueryInterval** `string` `必选` | 聚合粒度 用量数据的聚合粒度。可选值:`Day`(按天)、`Hour`(按小时)。 **Filter** `object` | 过滤条件 用量明细的过滤条件,可按模型名称、套餐档位和时间范围筛选。 **EndTime** `string` `必选` | 结束日期 `Filter.EndTime` 查询时间窗口的结束日期,格式为 `YYYY-MM-DD`。 **StartTime** `string` `必选` | 起始日期 `Filter.StartTime` 查询时间窗口的起始日期,格式为 `YYYY-MM-DD`。 **ObjectName** `string[]` | 模型名称 `Filter.ObjectName` 限定要查询的模型名称列表,可传入多个查询内容。 **PlanType** `integer[]` | 套餐档位 `Filter.PlanType` 限定要查询的套餐档位,可传入多个。整数枚举值 `1`、`2`、`3`、`4` 分别代表 `Small`、`Medium`、`Large`、`Max`。 ## 响应参数 **Details** `object[]` | 明细列表 调用明细列表,每个元素表示一个时间点上某模型的用量记录。 **BillingType** `string` | 计费类型 `Details.BillingType` 用量的计费类型。可选值:`WithinPlan`(套餐内用量)、`OutsideOfPlan`(套餐外用量)。 **ObjectName** `string` | 模型名称 `Details.ObjectName` 发生消耗的模型或 Harness 名称。 **Time** `integer` | 时间点 `Details.Time` 该条用量记录所属的时间点,Unix 毫秒时间戳。 **Unit** `string` | 用量单位 `Details.Unit` *Usage* 的计量单位。常见取值:`Tokens`、`Images`。 **Usage** `integer` | 用量数值 `Details.Usage` 该时间点上的计费用量,单位由 *Unit* 字段决定。 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=GetUsageDetails&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "QueryInterval": "Day", "Filter": { "ObjectName": [ "doubao-seed-1.6", "GLM-4.7" ], "PlanType": ["Large"], "StartTime": "2026-05-01", "EndTime": "2026-05-10" } } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "20260511035211B7A29C481EFC026D93", "Action": "GetUsageDetails", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "Details": [ { "Time": 1778284800000, "ObjectName": "doubao-seed-2-1-pro-260915", "Usage": 12500, "Unit": "Tokens", "BillingType": "WithinPlan" }, { "Time": 1778284800000, "ObjectName": "doubao-seed-2-1-pro-260915", "Usage": 8400, "Unit": "Tokens", "BillingType": "WithinPlan" }, { "Time": 1778371200000, "ObjectName": "doubao-seed-2-1-pro-260915", "Usage": 26800, "Unit": "Tokens", "BillingType": "WithinPlan" }, { "Time": 1778371200000, "ObjectName": "doubao-seed-2-1-pro-260915", "Usage": 5100, "Unit": "Tokens", "BillingType": "WithinPlan" } ] } } ``` --- # 查询 Coding Plan 支持的模型列表 Source: https://ark.volcengine.com/region:cn-beijing/docs/list-ark-coding-plan-model-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=ListArkCodingPlanModel&Version=2024-01-01` 查询 Coding Plan 支持的模型列表。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ## 响应参数 **Datas** `object[]` | 模型列表 Coding Plan 套餐当前可选的模型列表。 **ModelID** `string` | 模型 ID `Datas.ModelID` 模型 ID,例如 `doubao-seed-evolving`,调用模型时填入 `model` 参数。 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=ListArkCodingPlanModel&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{} ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "2026060216554717422120215259FAFF", "Action": "ListArkCodingPlanModel", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "Datas": [ { "ModelID": "doubao-seed-1.6" } ] } } ``` --- # 获取基础模型版本列表 Source: https://ark.volcengine.com/region:cn-beijing/docs/list-foundation-model-versions-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=ListFoundationModelVersions&Version=2024-01-01` 列出基础模型版本。 > **说明:注意** > > 本接口仅返回基础模型已发布或下线中的版本元数据,未发布版本的可见性受账号权限控制。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **FoundationModelName** `string` `必选` | 基础模型名称 待查询版本列表的基础模型名称。可通过调用 ListFoundationModels 接口获取。 **Filter** `object` | 筛选条件 版本列表筛选条件。 **Description** `string` | 描述匹配 `Filter.Description` 按版本描述模糊匹配。 **ModelVersions** `string[]` | 版本号匹配 `Filter.ModelVersions` 按版本号精准匹配。 **Statuses** `string[]` | 状态匹配 `Filter.Statuses` 按版本状态精准匹配。可指定值:`Unpublished`、`Published`、`Retiring`。 **PageNumber** `integer` `默认值 1` | 起始页码 分页查询起始页码,从 1 开始。 **PageSize** `integer` `默认值 10` | 每页记录数 分页查询每页返回的记录数。 **取值范围**:`[1, 100]` **ProjectName** `string` | 项目名称 资源所属的项目名称。 **SortBy** `string` `默认值 CreateTime` | 排序字段 排序字段。可指定值: - `CreateTime`:按创建时间排序 - `UpdateTime`:按更新时间排序。 **SortOrder** `string` `默认值 Desc` | 排序方向 排序方向。可指定值: - `Asc`:升序排列 - `Desc`:降序排列。 ## 响应参数 **Items** `object[]` | 版本列表 当前页的基础模型版本列表。 **CreateTime** `string` | 创建时间 `Items.CreateTime` 版本创建时间,RFC3339 格式。 **FoundationModelName** `string` | 基础模型名称 `Items.FoundationModelName` 版本所属的基础模型名称。 **ModelVersion** `string` | 版本号 `Items.ModelVersion` 基础模型版本号。 **Status** `string` | 版本状态 `Items.Status` 版本生命周期状态。可指定值: - `Unpublished`:未发布 - `Published`:已发布 - `Retiring`:下线中 **UpdateTime** `string` | 更新时间 `Items.UpdateTime` 版本最近更新时间,RFC3339 格式。 **ActiveConfigurationId** `string` | 生效配置 ID `Items.ActiveConfigurationId` 当前生效的版本配置 ID。 **Description** `string` | 版本描述 `Items.Description` 版本描述信息。 **PublishTime** `string` | 发布时间 `Items.PublishTime` 版本发布时间,RFC3339 格式。 **PageNumber** `integer` | 当前页码 当前返回的页码。 **PageSize** `integer` | 每页记录数 当前返回的每页记录数。 **TotalCount** `integer` | 总数 命中筛选条件的基础模型版本总数。 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=ListFoundationModelVersions&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "FoundationModelName": "doubao-seed-2-0-pro", "PageNumber": 1, "PageSize": 10, "Filter": { "Description": "WU", "ModelVersions": [ "783" ], "Statuses": [ "M0" ] }, "SortOrder": "Desc", "SortBy": "CreateTime" } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "2024051421010908503002501682D9A8", "Action": "ListFoundationModelVersions", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "TotalCount": 2, "PageNumber": 1, "PageSize": 1, "Items": [ { "FoundationModelName": "doubao-seed-2-0-pro", "ModelVersion": "260215", "Description": "该版本包含最新推理与效果优化", "ActiveConfigurationId": "fmvc-20240914123456-abcde", "Status": "Published", "PublishTime": "2024-04-15T10:20:30Z", "CreateTime": "2024-04-01T11:54:41Z", "UpdateTime": "2024-05-14T20:59:45Z" } ] } } ``` --- # 获取基础模型版本信息 Source: https://ark.volcengine.com/region:cn-beijing/docs/get-foundation-model-version-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=GetFoundationModelVersion&Version=2024-01-01` 获取基础模型版本信息 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **FoundationModelName** `string` `必选` | 基础模型名称 待查询版本所属的基础模型名称。 **ModelVersion** `string` `必选` | 版本号 待查询的基础模型版本号。 ## 响应参数 **ActiveConfigurationId** `string` | 生效配置 ID 当前生效的版本配置 ID。 **Configuration** `object` | 生效配置 当前生效配置的详细信息。 **AppSettings** `object` | 应用配置 `Configuration.AppSettings` 模型体验应用相关配置。 **Greeting** `string` | 问候语 `Configuration.AppSettings.Greeting` 应用首次交互的问候语文本。 **MaxInputTokenLength** `integer` | 最大输入长度 `Configuration.AppSettings.MaxInputTokenLength` 用户输入允许的最大 token 长度。 **Parameters** `object[]` | 参数配置 `Configuration.AppSettings.Parameters` 体验时可配置的模型参数列表。 **Name** `string` | 参数名称 `Configuration.AppSettings.Parameters.Name` 参数唯一名称。 **Type** `string` | 参数类型 `Configuration.AppSettings.Parameters.Type` 参数数据类型。可指定值:`Int`、`Bool`、`Float`、`String`。 **DefaultValue** `string` | 默认值 `Configuration.AppSettings.Parameters.DefaultValue` 参数的默认取值。 **Description** `string` | 说明 `Configuration.AppSettings.Parameters.Description` 参数的说明文本。 **DisplayName** `string` | 展示名 `Configuration.AppSettings.Parameters.DisplayName` 控制台展示用的参数名。 **Max** `string` | 最大值 `Configuration.AppSettings.Parameters.Max` 参数允许的最大值。 **Min** `string` | 最小值 `Configuration.AppSettings.Parameters.Min` 参数允许的最小值。 **Options** `string[]` | 可选值 `Configuration.AppSettings.Parameters.Options` 参数的枚举可选值列表。 **Prompts** `object[]` | 预置提示词 `Configuration.AppSettings.Prompts` 体验应用的预置提示词列表。 **Message** `string` | 提示词内容 `Configuration.AppSettings.Prompts.Message` 预置提示词文本内容。 **Scenario** `string` | 适用场景 `Configuration.AppSettings.Prompts.Scenario` 预置提示词适用的场景标识。 **SystemPrompt** `object` | 系统提示词 `Configuration.AppSettings.SystemPrompt` 系统提示词相关配置。 **Message** `string` | 提示词内容 `Configuration.AppSettings.SystemPrompt.Message` 系统提示词文本内容。 **MaxInputTokenLength** `number` | 最大 token 长度 `Configuration.AppSettings.SystemPrompt.MaxInputTokenLength` 系统提示词允许的最大 token 长度。 **ModificationAllowed** `boolean` | 允许修改 `Configuration.AppSettings.SystemPrompt.ModificationAllowed` 体验时是否允许用户修改系统提示词。 **CustomizationJobSettings** `object` | 精调配置 `Configuration.CustomizationJobSettings` 模型精调任务相关配置。 **ContinuePretrainSettings** `object` | 增量预训练 `Configuration.CustomizationJobSettings.ContinuePretrainSettings` 增量预训练任务配置。 **Enabled** `boolean` | 是否开启 `Configuration.CustomizationJobSettings.ContinuePretrainSettings.Enabled` 当前训练类型是否开启。 **Parameters** `object[]` | 训练参数 `Configuration.CustomizationJobSettings.ContinuePretrainSettings.Parameters` 训练任务可配置的参数列表。 **Name** `string` | 参数名称 `Configuration.CustomizationJobSettings.ContinuePretrainSettings.Parameters.Name` 参数唯一名称。 **Type** `string` | 参数类型 `Configuration.CustomizationJobSettings.ContinuePretrainSettings.Parameters.Type` 参数数据类型。可指定值:`Bool`、`Int`、`Float`、`String`。 **DefaultValue** `string` | 默认值 `Configuration.CustomizationJobSettings.ContinuePretrainSettings.Parameters.DefaultValue` 参数的默认取值。 **Description** `string` | 说明 `Configuration.CustomizationJobSettings.ContinuePretrainSettings.Parameters.Description` 参数的说明文本。 **DisplayName** `string` | 展示名 `Configuration.CustomizationJobSettings.ContinuePretrainSettings.Parameters.DisplayName` 控制台展示用的参数名。 **IncrementalLearningLocked** `boolean` | 增量训练锁定 `Configuration.CustomizationJobSettings.ContinuePretrainSettings.Parameters.IncrementalLearningLocked` 增量训练时是否锁定参数值不可修改。 **Max** `string` | 最大值 `Configuration.CustomizationJobSettings.ContinuePretrainSettings.Parameters.Max` 参数允许的最大值。 **Min** `string` | 最小值 `Configuration.CustomizationJobSettings.ContinuePretrainSettings.Parameters.Min` 参数允许的最小值。 **Options** `string[]` | 可选值 `Configuration.CustomizationJobSettings.ContinuePretrainSettings.Parameters.Options` 参数的枚举可选值列表。 **SupportPresetDatasets** `object[]` | 预置数据集 `Configuration.CustomizationJobSettings.ContinuePretrainSettings.SupportPresetDatasets` 支持混入的预置数据集列表。 **Description** `string` | 说明 `Configuration.CustomizationJobSettings.ContinuePretrainSettings.SupportPresetDatasets.Description` 预置数据集说明。 **Labelled** `boolean` | 是否有标注 `Configuration.CustomizationJobSettings.ContinuePretrainSettings.SupportPresetDatasets.Labelled` 预置数据集是否包含标注。 **Name** `string` | 数据集名称 `Configuration.CustomizationJobSettings.ContinuePretrainSettings.SupportPresetDatasets.Name` 预置数据集名称。 **SampleCount** `integer` | 样本数量 `Configuration.CustomizationJobSettings.ContinuePretrainSettings.SupportPresetDatasets.SampleCount` 预置数据集的样本数量。 **LoraDPOSettings** `object` | DPO LoRA `Configuration.CustomizationJobSettings.LoraDPOSettings` DPO LoRA 训练任务配置。 **Enabled** `boolean` | 是否开启 `Configuration.CustomizationJobSettings.LoraDPOSettings.Enabled` 当前训练类型是否开启。 **Parameters** `object[]` | 训练参数 `Configuration.CustomizationJobSettings.LoraDPOSettings.Parameters` 训练任务可配置的参数列表。 **Name** `string` | 参数名称 `Configuration.CustomizationJobSettings.LoraDPOSettings.Parameters.Name` 参数唯一名称。 **Type** `string` | 参数类型 `Configuration.CustomizationJobSettings.LoraDPOSettings.Parameters.Type` 参数数据类型。可指定值:`Bool`、`Int`、`Float`、`String`。 **DefaultValue** `string` | 默认值 `Configuration.CustomizationJobSettings.LoraDPOSettings.Parameters.DefaultValue` 参数的默认取值。 **Description** `string` | 说明 `Configuration.CustomizationJobSettings.LoraDPOSettings.Parameters.Description` 参数的说明文本。 **DisplayName** `string` | 展示名 `Configuration.CustomizationJobSettings.LoraDPOSettings.Parameters.DisplayName` 控制台展示用的参数名。 **IncrementalLearningLocked** `boolean` | 增量训练锁定 `Configuration.CustomizationJobSettings.LoraDPOSettings.Parameters.IncrementalLearningLocked` 增量训练时是否锁定参数值不可修改。 **Max** `string` | 最大值 `Configuration.CustomizationJobSettings.LoraDPOSettings.Parameters.Max` 参数允许的最大值。 **Min** `string` | 最小值 `Configuration.CustomizationJobSettings.LoraDPOSettings.Parameters.Min` 参数允许的最小值。 **Options** `string[]` | 可选值 `Configuration.CustomizationJobSettings.LoraDPOSettings.Parameters.Options` 参数的枚举可选值列表。 **SupportPresetDatasets** `object[]` | 预置数据集 `Configuration.CustomizationJobSettings.LoraDPOSettings.SupportPresetDatasets` 支持混入的预置数据集列表。 **Description** `string` | 说明 `Configuration.CustomizationJobSettings.LoraDPOSettings.SupportPresetDatasets.Description` 预置数据集说明。 **Labelled** `boolean` | 是否有标注 `Configuration.CustomizationJobSettings.LoraDPOSettings.SupportPresetDatasets.Labelled` 预置数据集是否包含标注。 **Name** `string` | 数据集名称 `Configuration.CustomizationJobSettings.LoraDPOSettings.SupportPresetDatasets.Name` 预置数据集名称。 **SampleCount** `integer` | 样本数量 `Configuration.CustomizationJobSettings.LoraDPOSettings.SupportPresetDatasets.SampleCount` 预置数据集的样本数量。 **LoraSettings** `object` | LoRA 配置 `Configuration.CustomizationJobSettings.LoraSettings` LoRA 训练任务配置。 **Enabled** `boolean` | 是否开启 `Configuration.CustomizationJobSettings.LoraSettings.Enabled` 当前训练类型是否开启。 **Parameters** `object[]` | 训练参数 `Configuration.CustomizationJobSettings.LoraSettings.Parameters` 训练任务可配置的参数列表。 **Name** `string` | 参数名称 `Configuration.CustomizationJobSettings.LoraSettings.Parameters.Name` 参数唯一名称。 **Type** `string` | 参数类型 `Configuration.CustomizationJobSettings.LoraSettings.Parameters.Type` 参数数据类型。可指定值:`Bool`、`Int`、`Float`、`String`。 **DefaultValue** `string` | 默认值 `Configuration.CustomizationJobSettings.LoraSettings.Parameters.DefaultValue` 参数的默认取值。 **Description** `string` | 说明 `Configuration.CustomizationJobSettings.LoraSettings.Parameters.Description` 参数的说明文本。 **DisplayName** `string` | 展示名 `Configuration.CustomizationJobSettings.LoraSettings.Parameters.DisplayName` 控制台展示用的参数名。 **IncrementalLearningLocked** `boolean` | 增量训练锁定 `Configuration.CustomizationJobSettings.LoraSettings.Parameters.IncrementalLearningLocked` 增量训练时是否锁定参数值不可修改。 **Max** `string` | 最大值 `Configuration.CustomizationJobSettings.LoraSettings.Parameters.Max` 参数允许的最大值。 **Min** `string` | 最小值 `Configuration.CustomizationJobSettings.LoraSettings.Parameters.Min` 参数允许的最小值。 **Options** `string[]` | 可选值 `Configuration.CustomizationJobSettings.LoraSettings.Parameters.Options` 参数的枚举可选值列表。 **SupportPresetDatasets** `object[]` | 预置数据集 `Configuration.CustomizationJobSettings.LoraSettings.SupportPresetDatasets` 支持混入的预置数据集列表。 **Description** `string` | 说明 `Configuration.CustomizationJobSettings.LoraSettings.SupportPresetDatasets.Description` 预置数据集说明。 **Labelled** `boolean` | 是否有标注 `Configuration.CustomizationJobSettings.LoraSettings.SupportPresetDatasets.Labelled` 预置数据集是否包含标注。 **Name** `string` | 数据集名称 `Configuration.CustomizationJobSettings.LoraSettings.SupportPresetDatasets.Name` 预置数据集名称。 **SampleCount** `integer` | 样本数量 `Configuration.CustomizationJobSettings.LoraSettings.SupportPresetDatasets.SampleCount` 预置数据集的样本数量。 **SftSettings** `object` | SFT 配置 `Configuration.CustomizationJobSettings.SftSettings` SFT 训练任务配置。 **Enabled** `boolean` | 是否开启 `Configuration.CustomizationJobSettings.SftSettings.Enabled` 当前训练类型是否开启。 **Parameters** `object[]` | 训练参数 `Configuration.CustomizationJobSettings.SftSettings.Parameters` 训练任务可配置的参数列表。 **Name** `string` | 参数名称 `Configuration.CustomizationJobSettings.SftSettings.Parameters.Name` 参数唯一名称。 **Type** `string` | 参数类型 `Configuration.CustomizationJobSettings.SftSettings.Parameters.Type` 参数数据类型。可指定值:`Bool`、`Int`、`Float`、`String`。 **DefaultValue** `string` | 默认值 `Configuration.CustomizationJobSettings.SftSettings.Parameters.DefaultValue` 参数的默认取值。 **Description** `string` | 说明 `Configuration.CustomizationJobSettings.SftSettings.Parameters.Description` 参数的说明文本。 **DisplayName** `string` | 展示名 `Configuration.CustomizationJobSettings.SftSettings.Parameters.DisplayName` 控制台展示用的参数名。 **IncrementalLearningLocked** `boolean` | 增量训练锁定 `Configuration.CustomizationJobSettings.SftSettings.Parameters.IncrementalLearningLocked` 增量训练时是否锁定参数值不可修改。 **Max** `string` | 最大值 `Configuration.CustomizationJobSettings.SftSettings.Parameters.Max` 参数允许的最大值。 **Min** `string` | 最小值 `Configuration.CustomizationJobSettings.SftSettings.Parameters.Min` 参数允许的最小值。 **Options** `string[]` | 可选值 `Configuration.CustomizationJobSettings.SftSettings.Parameters.Options` 参数的枚举可选值列表。 **SupportPresetDatasets** `object[]` | 预置数据集 `Configuration.CustomizationJobSettings.SftSettings.SupportPresetDatasets` 支持混入的预置数据集列表。 **Description** `string` | 说明 `Configuration.CustomizationJobSettings.SftSettings.SupportPresetDatasets.Description` 预置数据集说明。 **Labelled** `boolean` | 是否有标注 `Configuration.CustomizationJobSettings.SftSettings.SupportPresetDatasets.Labelled` 预置数据集是否包含标注。 **Name** `string` | 数据集名称 `Configuration.CustomizationJobSettings.SftSettings.SupportPresetDatasets.Name` 预置数据集名称。 **SampleCount** `integer` | 样本数量 `Configuration.CustomizationJobSettings.SftSettings.SupportPresetDatasets.SampleCount` 预置数据集的样本数量。 **CreateTime** `string` | 创建时间 版本创建时间,RFC3339 格式。 **Description** `string` | 版本描述 该版本的描述信息。 **FoundationModelName** `string` | 基础模型名称 版本所属的基础模型名称。 **ModelVersion** `string` | 版本号 基础模型版本号。 **PublishTime** `string` | 发布时间 版本发布时间,RFC3339 格式。 **Status** `string` | 版本状态 版本生命周期状态。可指定值: - `Unpublished`:未发布 - `Published`:已发布 - `Retiring`:下线中 **UpdateTime** `string` | 更新时间 版本最近更新时间,RFC3339 格式。 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=GetFoundationModelVersion&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "FoundationModelName": "doubao-seed-2-0-pro" } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "20240514210046057210000044CEC5FF", "Action": "GetFoundationModelVersion", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "FoundationModelName": "doubao-seed-2-0-pro", "ModelVersion": "260215", "Description": "这是一条基础模型版本描述", "ActiveConfigurationId": "fmvc-20240914123456-abcde", "Configuration": { "AppSettings": { "Greeting": "你好,我是 Doubao 助手,很高兴为你服务。", "Parameters": [ { "Type": "String", "Name": "temperature", "DisplayName": "温度", "Min": "0.0", "Max": "2.0", "Options": [ "1.0" ], "DefaultValue": "1.0", "Description": "生成随机性控制 · 值越大输出越多样" } ], "Prompts": [ { "Scenario": "chat", "Message": "请用简洁的语言总结以下内容" } ], "MaxInputTokenLength": 4096, "SystemPrompt": { "Message": "你是一个专业的 AI 助手,请根据用户问题给出准确、简洁的回答。", "ModificationAllowed": true, "MaxInputTokenLength": 1024 } }, "CustomizationJobSettings": { "SftSettings": { "Enabled": true, "SupportPresetDatasets": [ { "Name": "通用中文对话数据集", "Description": "覆盖日常对话与问答场景的通用中文语料", "SampleCount": 461, "Labelled": false } ], "Parameters": [ { "Type": "String", "Name": "learning_rate", "DisplayName": "学习率", "Min": "0.00001", "Max": "0.001", "Options": [ "0.0001" ], "DefaultValue": "0.0001", "Description": "训练过程中权重更新的步长", "IncrementalLearningLocked": false } ] }, "LoraSettings": { "Enabled": false, "SupportPresetDatasets": [ { "Name": "LoRA 微调通用数据集", "Description": "面向 LoRA 微调的多领域通用语料", "SampleCount": 901, "Labelled": true } ], "Parameters": [ { "Type": "String", "Name": "lora_rank", "DisplayName": "LoRA 秩", "Min": "1", "Max": "64", "Options": [ "8" ], "DefaultValue": "8", "Description": "LoRA 低秩分解的秩大小 · 越大表达能力越强但训练成本越高", "IncrementalLearningLocked": false } ] }, "ContinuePretrainSettings": { "Enabled": false, "SupportPresetDatasets": [ { "Name": "通用增量预训练语料", "Description": "覆盖通用中英文语料的预训练数据", "SampleCount": 224, "Labelled": true } ], "Parameters": [ { "Type": "String", "Name": "batch_size", "DisplayName": "批大小", "Min": "1", "Max": "128", "Options": [ "16", "32", "64" ], "DefaultValue": "16", "Description": "每次训练迭代使用的样本数量", "IncrementalLearningLocked": false } ] } } }, "Status": "Unpublished", "PublishTime": "2024-04-15T10:20:30Z", "CreateTime": "2024-04-01T11:54:41Z", "UpdateTime": "2024-05-14T20:59:45Z" } } ``` --- # 获取基础模型列表 Source: https://ark.volcengine.com/region:cn-beijing/docs/list-foundation-models-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=ListFoundationModels&Version=2024-01-01` 列出基础模型。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **Filter** `object` | 筛选条件 基础模型列表筛选条件。 **AccessTypes** `string[]` | 访问模式 `Filter.AccessTypes` 按基础模型访问模式列表精准匹配。可指定值:`Public`、`Private`。 **Description** `string` | 描述匹配 `Filter.Description` 按基础模型描述模糊匹配。 **DisplayName** `string` | 展示名匹配 `Filter.DisplayName` 按基础模型展示名模糊匹配。 **FoundationModelTag** `object` | 能力标签 `Filter.FoundationModelTag` 按基础模型的能力标签筛选。 **Domains** `string[]` | 能力领域 `Filter.FoundationModelTag.Domains` 基础模型覆盖的能力领域列表。可指定值: - `LLM`:大语言模型 - `Audio`:语音大模型 - `ComputerVision`:视觉大模型 - `MultiModal`:多模态 - `Embedding`:向量模型 - `VLM`:视觉语言模型 **Languages** `string[]` | 支持语言 `Filter.FoundationModelTag.Languages` 基础模型支持的自然语言列表。 **TaskTypes** `string[]` | 支持任务类型 `Filter.FoundationModelTag.TaskTypes` 基础模型支持的任务类型列表。可指定值: - `Chat`:对话 - `TextGeneration`:文本生成 - `PreTrain`:预训练 - `VisualQuestionAnswering`:图片内容理解 - `TextToImage`:文生图 - `ImageToImage`:图生图 - `TextToVideo`:文生视频 - `ImageToVideo`:图生视频 - `TextTo3D`:文生 3D - `ImageTo3D`:图生 3D - `TextToSpeech`:文本转语音 - `SpeechToText`:语音转文本 - `SpeechToSpeech`:语音转语音 - `TextEmbedding`:文本向量化 - `ImageEmbedding`:图像向量化 - `MultimodalEmbedding`:多模态向量化 - `Translation`:翻译 **UsedLibraries** `string[]` | 依赖库 `Filter.FoundationModelTag.UsedLibraries` 基础模型依赖的库列表。 **Introduction** `string` | 介绍匹配 `Filter.Introduction` 按基础模型介绍模糊匹配。 **Name** `string` | 名称匹配 `Filter.Name` 按基础模型名称模糊匹配。 **Names** `string[]` | 名称列表 `Filter.Names` 按基础模型名称列表精准匹配。 **SupportedCustomizationTypes** `string[]` | 精调类型 `Filter.SupportedCustomizationTypes` 按基础模型支持的精调类型精准匹配。可指定值:`Sft`、`Lora`、`ContinuePretrain`、`FinetuneSft`、`FinetuneLoRA`、`DPOLoRA`、`Pretrain`。 **PageNumber** `integer` `默认值 1` | 起始页码 分页查询起始页码,从 1 开始。 **PageSize** `integer` `默认值 10` | 每页记录数 分页查询每页返回的记录数。 **取值范围**:`[1, 100]` **ProjectName** `string` | 项目名称 资源所属的项目名称,默认值为 `default`。 **SortBy** `string` `默认值 CreateTime` | 排序字段 排序字段。可指定值: - `CreateTime`:按创建时间排序 - `UpdateTime`:按更新时间排序。 **SortOrder** `string` `默认值 Desc` | 排序方向 排序方向。可指定值: - `Asc`:升序排列 - `Desc`:降序排列。 **TagFilters** `object[]` | 标签筛选 基于绑定标签的筛选条件列表。 **Key** `string` `必选` | 键名 `TagFilters.Key` 用于筛选的标签键名。 **Values** `string[]` | 取值列表 `TagFilters.Values` 用于筛选的标签值列表。 ## 响应参数 **Items** `object[]` | 模型列表 当前页的基础模型列表。 **CreateTime** `string` | 创建时间 `Items.CreateTime` 基础模型创建时间,RFC3339 格式。 **Name** `string` | 模型名称 `Items.Name` 基础模型名称,全局唯一标识一个基础模型。 **UpdateTime** `string` | 更新时间 `Items.UpdateTime` 基础模型最近更新时间,RFC3339 格式。 **VendorName** `string` | 提供方 `Items.VendorName` 基础模型的提供方名称。 **AccessType** `string` | 可见性 `Items.AccessType` 基础模型的可见性。可指定值: - `Public`:公开模型 - `Private`:非公开模型 **Description** `string` | 内部描述 `Items.Description` 基础模型的内部描述。 **DisplayName** `string` | 展示名称 `Items.DisplayName` 控制台展示用的基础模型名称。 **FeaturedImage** `object` | 展示图片 `Items.FeaturedImage` 基础模型在控制台上的展示图片,存储于 TOS。 **BucketName** `string` | 存储桶名称 `Items.FeaturedImage.BucketName` TOS 存储桶名称。当前火山方舟仅支持华北 2-北京地域(`cn-beijing`)的存储桶。 **ObjectKey** `string` | 对象路径 `Items.FeaturedImage.ObjectKey` TOS 对象的存储路径。 **FoundationModelTag** `object` | 能力标签 `Items.FoundationModelTag` 基础模型的能力分类标签。 **Domains** `string[]` | 能力领域 `Items.FoundationModelTag.Domains` 基础模型覆盖的能力领域列表。可指定值: - `LLM`:大语言模型 - `Audio`:语音大模型 - `ComputerVision`:视觉大模型 - `MultiModal`:多模态 - `Embedding`:向量模型 - `VLM`:视觉语言模型 **Languages** `string[]` | 支持语言 `Items.FoundationModelTag.Languages` 基础模型支持的自然语言列表。 **TaskTypes** `string[]` | 支持任务类型 `Items.FoundationModelTag.TaskTypes` 基础模型支持的任务类型列表。可指定值: - `Chat`:对话 - `TextGeneration`:文本生成 - `PreTrain`:预训练 - `VisualQuestionAnswering`:图片内容理解 - `TextToImage`:文生图 - `ImageToImage`:图生图 - `TextToVideo`:文生视频 - `ImageToVideo`:图生视频 - `TextTo3D`:文生 3D - `ImageTo3D`:图生 3D - `TextToSpeech`:文本转语音 - `SpeechToText`:语音转文本 - `SpeechToSpeech`:语音转语音 - `TextEmbedding`:文本向量化 - `ImageEmbedding`:图像向量化 - `MultimodalEmbedding`:多模态向量化 - `Translation`:翻译 **UsedLibraries** `string[]` | 依赖库 `Items.FoundationModelTag.UsedLibraries` 基础模型依赖的库列表。 **Introduction** `string` | 用户介绍 `Items.Introduction` 基础模型的介绍文本。由于返回值尺寸原因,本字段在 *ListFoundationModels* 接口中不返回。 **PrimaryVersion** `string` | 主版本号 `Items.PrimaryVersion` 基础模型当前主推的版本号。 **ProjectName** `string` | 所属项目 `Items.ProjectName` 基础模型所属的项目名称。 **Tags** `object[]` | 自定义标签 `Items.Tags` 用户自定义绑定到基础模型的键值标签列表。 **Key** `string` | 键名 `Items.Tags.Key` 标签的键名。 **Value** `string` | 取值 `Items.Tags.Value` 标签的取值。 **PageNumber** `integer` | 当前页码 当前返回的页码。 **PageSize** `integer` | 每页记录数 当前返回的每页记录数。 **TotalCount** `integer` | 总数 命中筛选条件的基础模型总数。 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=ListFoundationModels&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "PageNumber": 1, "PageSize": 10, "Filter": { "Name": "1yEK", "Names": [ "b4" ], "FoundationModelTag": { "Languages": [ "Tv0mxXamkC5" ], "TaskTypes": [ "hmqgZGGni" ], "CustomizedTags": [ "zafcaqOy" ], "Domains": [ "RRamYGIqLt" ], "UsedLibraries": [ "Rctg97iyG0G" ] }, "Introduction": "sdQb3Q", "Description": "ncjtG458V89", "DisplayName": "NBgVWD3XwHJ", "AccessTypes": [ "b6Qw9wRLBb" ] }, "SortOrder": "Desc", "SortBy": "\\-", "TagFilters": [ { "Key": "DcuMJa", "Values": [ "5M8sMT" ] } ] } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "20240514210020173184054004BACCC8", "Action": "ListFoundationModels", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "TotalCount": 2, "PageNumber": 1, "PageSize": 1, "Items": [ { "Name": "doubao-seed-2-0-pro", "Description": "Doubao 深度思考模型 · 32k 上下文", "Introduction": "language models", "VendorName": "字节跳动", "DisplayName": "Doubao-Seed-2.0-pro", "FeaturedImage": { "ObjectKey": "images/models/doubao-seed-2-0-pro.png", "BucketName": "ark-model-assets-cn-beijing" }, "PrimaryVersion": "260215", "FoundationModelTag": { "Languages": [ "zh", "en" ], "TaskTypes": [ "TextGeneration" ], "Domains": [ "LLM" ], "UsedLibraries": [ "PyTorch", "Transformers" ] }, "AccessType": "Public", "Tags": [ { "Key": "owner", "Value": "team-a" } ], "ProjectName": "default", "CreateTime": "2024-04-01T11:54:41Z", "UpdateTime": "2024-05-14T20:59:45Z" } ] } } ``` --- # 获取基础模型信息 Source: https://ark.volcengine.com/region:cn-beijing/docs/get-foundation-model-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=GetFoundationModel&Version=2024-01-01` 获取基础模型详细信息。 > **说明:注意** > > 本接口仅返回基础模型自身的元数据,不包含具体版本配置;如需查询版本列表请使用 ListFoundationModelVersions。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **Name** `string` `必选` | 基础模型名称 待查询的基础模型名称,作为唯一标识。 ## 响应参数 **AccessType** `string` | 可见性 基础模型的可见性。可指定值: - `Public`:公开模型,所有租户可访问。 - `Private`:非公开模型,仅授权租户可访问。 **CreateTime** `string` | 创建时间 基础模型创建时间,RFC3339 格式。 **Description** `string` | 内部描述 基础模型的内部描述,面向运营和管理场景。 **DisplayDescription** `string` | 展示描述 控制台展示用的简介描述。 **DisplayName** `string` | 展示名称 控制台展示用的基础模型名称。 **FeaturedImage** `object` | 展示图片 基础模型在控制台上的展示图片,存储于 TOS。 **BucketName** `string` | 存储桶名称 `FeaturedImage.BucketName` TOS 存储桶名称。当前火山方舟仅支持华北 2-北京地域(`cn-beijing`)的存储桶。 **ObjectKey** `string` | 对象路径 `FeaturedImage.ObjectKey` TOS 对象的存储路径。 **FoundationModelTag** `object` | 能力标签 基础模型的能力分类标签,包含语言、任务类型、领域等维度。 **Domains** `string[]` | 能力领域 `FoundationModelTag.Domains` 基础模型覆盖的能力领域列表。可指定值: - `LLM`:大语言模型 - `Audio`:语音大模型 - `ComputerVision`:视觉大模型 - `MultiModal`:多模态 - `Embedding`:向量模型 - `VLM`:视觉语言模型 **Languages** `string[]` | 支持语言 `FoundationModelTag.Languages` 基础模型支持的自然语言列表。 **TaskTypes** `string[]` | 支持任务类型 `FoundationModelTag.TaskTypes` 基础模型支持的任务类型列表。可指定值: - `TextGeneration`:文本生成 - `VisualQuestionAnswering`:图片内容理解 - `TextToImage`:文生图 - `ImageToImage`:图生图 - `TextToVideo`:文生视频 - `ImageToVideo`:图生视频 - `TextTo3D`:文生 3D - `ImageTo3D`:图生 3D - `VoiceClone`:声音复刻 - `TextToSpeech`:文本转语音 - `SpeechToText`:语音转文本 - `SpeechToSpeech`:同声传译 - `TextEmbedding`:文本向量化 - `ImageEmbedding`:图像向量化 - `MultimodalEmbedding`:多模态向量化 **UsedLibraries** `string[]` | 依赖库 `FoundationModelTag.UsedLibraries` 基础模型依赖的库列表。 **Introduction** `string` | 用户介绍 面向用户展示的基础模型介绍文本。 **Name** `string` | 模型名称 基础模型唯一名称,全局唯一标识一个基础模型。 **PrimaryVersion** `string` | 主版本号 基础模型当前主推的版本号。 **ProjectName** `string` | 所属项目 基础模型所属的项目名称。 **RegionWhiteList** `string[]` | 可用地域 基础模型可用的地域白名单列表。 **ResourceOrigin** `string` | 资源来源 基础模型资源的来源标识。 **ShortName** `string` | 简短名称 基础模型的简短名称,用于紧凑展示。 **Tags** `object[]` | 自定义标签 用户自定义绑定到基础模型的键值标签列表。 **Key** `string` | 键名 `Tags.Key` 标签的键名。 **Value** `string` | 取值 `Tags.Value` 标签的取值。 **UpdateTime** `string` | 更新时间 基础模型最近更新时间,RFC3339 格式。 **VendorName** `string` | 提供方 基础模型的提供方名称。 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=GetFoundationModel&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "Name": "doubao-seed-2-0-pro" } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "20240514205945172013199191467134", "Action": "GetFoundationModel", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "Name": "doubao-seed-2-0-pro", "Description": "一条样例描述", "Introduction": "一条模型介绍", "VendorName": "字节跳动", "DisplayName": "Doubao-Seed-2.0-pro", "FeaturedImage": { "ObjectKey": "images/models/doubao-seed-2-0-pro.png", "BucketName": "ark-model-assets-cn-beijing" }, "PrimaryVersion": "260215", "AccessType": "Public", "FoundationModelTag": { "Languages": [ "zh", "en" ], "TaskTypes": [ "TextGeneration" ], "Domains": [ "LLM" ], "UsedLibraries": [ "PyTorch", "Transformers" ] }, "Tags": [ { "Key": "owner", "Value": "team-a" } ], "ProjectName": "default", "CreateTime": "2024-04-01T11:54:41Z", "UpdateTime": "2024-05-14T20:59:45Z" } } ``` --- # 批量开通基础模型 Source: https://ark.volcengine.com/region:cn-beijing/docs/activate-models-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=ActivateModels&Version=2024-01-01` 批量开通当前账号的基础模型服务,对应 [控制台](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=model)“开通管理”中基础模型的开通操作,例如开通豆包系列基础模型。通过 `FoundationModelNames` 指定待开通模型;开通结果可通过 [查询模型开通列表](/docs/list-model-activations-api) 确认。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **FoundationModelNames** `string[]` `必选` | 基础模型名称列表 待开通的基础模型名称列表,不能为空;传模型标识,不传展示名、Endpoint ID 或产品名称,可从 [查询模型开通列表](/docs/list-model-activations-api) 的 `Items[].FoundationModelName` 获取基础模型名称。 ## 响应参数 本接口无特有的返回参数,成功时 HTTP 状态码为 `200`,返回结构中 `Result` 为空对象 `{}`。 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=ActivateModels&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "FoundationModelNames": [ "doubao-seed-2-0-pro", "doubao-seed-2-0-lite" ] } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "20240514212750A1B2C3D4E5F607182A", "Action": "ActivateModels", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": {} } ``` --- # 启用自动开通新模型 Source: https://ark.volcengine.com/region:cn-beijing/docs/enable-auto-model-activation-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=EnableAutoModelActivation&Version=2024-01-01` 启用新模型自动开通功能。启用后,平台新上线的基础模型将自动为当前账号开通。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ## 响应参数 本接口无特有的返回参数,成功时 HTTP 状态码为 `200`,返回结构中 `Result` 为空对象 `{}`。 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=EnableAutoModelActivation&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{}' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "20240514212751B2C3D4E5F607182B01", "Action": "EnableAutoModelActivation", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": {} } ``` --- # 关闭自动开通新模型 Source: https://ark.volcengine.com/region:cn-beijing/docs/disable-auto-model-activation-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=DisableAutoModelActivation&Version=2024-01-01` 关闭新模型自动开通功能。关闭后,平台新上线的基础模型不会自动为当前账号开通。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ## 响应参数 本接口无特有的返回参数,成功时 HTTP 状态码为 `200`,返回结构中 `Result` 为空对象 `{}`。 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=DisableAutoModelActivation&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{}' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "20240514212752C3D4E5F607182C02BE", "Action": "DisableAutoModelActivation", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": {} } ``` --- # 查询模型开通详情 Source: https://ark.volcengine.com/region:cn-beijing/docs/get-model-activation-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=GetModelActivation&Version=2024-01-01` 查询指定基础模型在当前账号下的开通详情,包括状态、计费项、资源包及子服务状态。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **FoundationModelName** `string` `必选` | 基础模型名称 要查询开通详情的基础模型名称。 **WithFreeUsage** `boolean` | 是否附带免费额度信息 是否在返回结果中附带模型的免费推理额度信息。 **WithPrice** `boolean` | 是否附带价格信息 是否在返回结果中附带模型的计费价格信息。 ## 响应参数 **Item** `object` | 模型激活详情 指定基础模型的激活详情。 **ChargeItems** `object[]` | 计费项列表 `Item.ChargeItems` 模型的计费项列表。 **Price** `number` | 单价 `Item.ChargeItems.Price` 计费项的单价。 **Type** `string` | 计费项类型 `Item.ChargeItems.Type` 计费项的类型标识。 **UnitCode** `string` | 计量单位编码 `Item.ChargeItems.UnitCode` 计费项的计量单位编码。 **DiscountPriceEndTime** `string` | 折扣结束时间 `Item.ChargeItems.DiscountPriceEndTime` 折扣价格的结束时间。 **DiscountPriceStartTime** `string` | 折扣开始时间 `Item.ChargeItems.DiscountPriceStartTime` 折扣价格的生效起始时间。 **OriginalPrice** `number` | 原价 `Item.ChargeItems.OriginalPrice` 计费项的原始价格(折扣前)。 **DisplayName** `string` | 展示名称 `Item.DisplayName` 模型的展示名称。 **FoundationModelName** `string` | 基础模型名称 `Item.FoundationModelName` 基础模型的唯一名称标识。 **FreeResourcePackItems** `object[]` | 免费资源包列表 `Item.FreeResourcePackItems` 模型关联的免费资源包列表。 **Consumed** `integer` | 已消耗量 `Item.FreeResourcePackItems.Consumed` 资源包中已消耗的数量。 **Reclaimed** `integer` | 已回收量 `Item.FreeResourcePackItems.Reclaimed` 资源包中已回收的数量。 **Total** `integer` | 总量 `Item.FreeResourcePackItems.Total` 资源包的总量。 **Type** `string` | 资源包类型 `Item.FreeResourcePackItems.Type` 资源包的类型。取值 `DataPermission` 表示数据权限、`FreeInference` 表示免费推理额度。 **SyncTime** `string` | 同步时间 `Item.FreeResourcePackItems.SyncTime` 资源包数据的最近同步时间。 **MultiChargeItems** `object[]` | 多档计费项列表 `Item.MultiChargeItems` 模型的多档计费项列表,支持按 Token 用量分档计价。 **ChargeItems** `object[]` | 计费项列表 `Item.MultiChargeItems.ChargeItems` 该档位下的计费项列表。 **Price** `number` | 单价 `Item.MultiChargeItems.ChargeItems.Price` 计费项的单价。 **Type** `string` | 计费项类型 `Item.MultiChargeItems.ChargeItems.Type` 计费项的类型标识。 **UnitCode** `string` | 计量单位编码 `Item.MultiChargeItems.ChargeItems.UnitCode` 计费项的计量单位编码。 **DiscountPriceEndTime** `string` | 折扣结束时间 `Item.MultiChargeItems.ChargeItems.DiscountPriceEndTime` 折扣价格的结束时间。 **DiscountPriceStartTime** `string` | 折扣开始时间 `Item.MultiChargeItems.ChargeItems.DiscountPriceStartTime` 折扣价格的生效起始时间。 **OriginalPrice** `number` | 原价 `Item.MultiChargeItems.ChargeItems.OriginalPrice` 计费项的原始价格(折扣前)。 **Description** `string` | 档位描述 `Item.MultiChargeItems.Description` 该计费档位的描述说明。 **MaxCompletionTokens** `integer` | 最大 Completion Token 数 `Item.MultiChargeItems.MaxCompletionTokens` 该档位对应的最大 Completion Token 数量。 **MaxPromptTokens** `integer` | 最大 Prompt Token 数 `Item.MultiChargeItems.MaxPromptTokens` 该档位对应的最大 Prompt Token 数量。 **Name** `string` | 档位名称 `Item.MultiChargeItems.Name` 该计费档位的名称。 **State** `string` | 开通状态 `Item.State` 模型的开通状态。取值 `Available` 表示已开通、`Unavailable` 表示未开通。 **SubServices** `object[]` | 子服务状态列表 `Item.SubServices` 模型关联的子服务及其开通状态列表。 **Status** `string` | 开通状态 `Item.SubServices.Status` 子服务的开通状态。取值 `Available` 表示已开通、`Unavailable` 表示未开通。 **SubService** `string` | 子服务类型 `Item.SubServices.SubService` 子服务的类型标识。 **VendorName** `string` | 厂商名称 `Item.VendorName` 模型所属厂商的名称。 **InitialInferenceFreeUsage** `object` | 初始免费推理额度 `Item.InitialInferenceFreeUsage` 模型开通时赠送的初始免费推理额度。 **Consumed** `number` | 已使用额度 `Item.InitialInferenceFreeUsage.Consumed` 已消耗的免费推理额度。 **Total** `number` | 总额度 `Item.InitialInferenceFreeUsage.Total` 免费推理的总额度。 **Instruction** `string` | 开通说明 `Item.Instruction` 模型的开通说明或备注信息。 **IsDeprecated** `boolean` | 是否已下线 `Item.IsDeprecated` 模型是否已下线。 **IsLimitedActivation** `boolean` | 是否限量开通 `Item.IsLimitedActivation` 模型是否为限量开通,即仅对部分用户开放。 **IsOverdue** `boolean` | 是否逾期 `Item.IsOverdue` 模型是否处于逾期状态。 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=GetModelActivation&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "FoundationModelName": "doubao-seed-2-0-pro", "WithPrice": true, "WithFreeUsage": true } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "20240514212753D4E5F607182D03CEF7", "Action": "GetModelActivation", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "Item": { "FoundationModelName": "doubao-seed-2-0-pro", "State": "Available", "VendorName": "火山方舟", "DisplayName": "Doubao Seed 2.0 Pro", "ChargeItems": [ { "Price": 0.0008, "UnitCode": "CNY/1KToken", "Type": "PromptToken", "OriginalPrice": 0.0012, "DiscountPriceStartTime": "2024-04-01T00:00:00Z", "DiscountPriceEndTime": "2024-12-31T23:59:59Z" }, { "Price": 0.002, "UnitCode": "CNY/1KToken", "Type": "CompletionToken", "OriginalPrice": 0.003, "DiscountPriceStartTime": "2024-04-01T00:00:00Z", "DiscountPriceEndTime": "2024-12-31T23:59:59Z" } ], "MultiChargeItems": [ { "Name": "0-32K", "Description": "输入 Token 数不超过 32K 时适用的计费档位", "MaxPromptTokens": 32768, "MaxCompletionTokens": 4096, "ChargeItems": [ { "Price": 0.0008, "UnitCode": "CNY/1KToken", "Type": "PromptToken" }, { "Price": 0.002, "UnitCode": "CNY/1KToken", "Type": "CompletionToken" } ] } ], "InitialInferenceFreeUsage": { "Total": 500000, "Consumed": 12580 }, "FreeResourcePackItems": [ { "Total": 500000, "Consumed": 12580, "Type": "FreeInference", "SyncTime": "2024-04-01T11:54:41Z", "Reclaimed": 0 } ], "SubServices": [ { "SubService": "Inference", "Status": "Available" }, { "SubService": "Finetune", "Status": "Available" } ], "Instruction": "开通后即可通过推理接入点调用该模型。", "IsOverdue": false, "IsLimitedActivation": false, "IsDeprecated": false } } } ``` --- # 查询模型开通列表 Source: https://ark.volcengine.com/region:cn-beijing/docs/list-model-activations-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=ListModelActivations&Version=2024-01-01` 查询当前账号可见的基础模型及其开通状态,对应 [控制台](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=model) 中的基础模型开通信息。可用于获取待开通模型的名称、确认开通结果,并按需查询价格和免费额度。未筛选开通状态时,列表可同时包含已开通和未开通模型。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **Filter** `object` | 筛选条件 模型开通列表的筛选条件,可按状态、厂商、域等维度过滤。 **DisplayName** `string` | 模型展示名称 `Filter.DisplayName` 按模型展示名称进行筛选。 **FoundationModelDomain** `string` | 模型域 `Filter.FoundationModelDomain` 按基础模型所属域进行筛选。 **FoundationModelNames** `string[]` | 模型名称列表 `Filter.FoundationModelNames` 按基础模型名称筛选,可传入 [批量开通基础模型](/docs/activate-models-api) 中使用的模型名称。 **IncludeDeprecatedModels** `boolean` | 是否包含已下线模型 `Filter.IncludeDeprecatedModels` 是否在返回结果中包含已下线的模型。 **States** `string[]` | 状态筛选 `Filter.States` 开通状态筛选,取值 `Available` 表示已开通、`Unavailable` 表示未开通;不传时不按开通状态筛选。 **VendorName** `string` | 厂商名称 `Filter.VendorName` 按模型厂商名称进行筛选。 **PageNumber** `integer` `默认值 1` | 起始页码 分页查询时的起始页码。 **PageSize** `integer` `默认值 10` | 每页记录数 分页查询时每页返回的记录数。 **SortBy** `string` `默认值 VendorName` | 排序指标 排序所依据的字段名。 **SortOrder** `string` `默认值 Desc` | 排序顺序 排序顺序。取值 `Desc` 表示降序、`Asc` 表示升序。 **WithFreeUsage** `boolean` | 是否附带免费额度信息 是否在返回结果中附带模型的免费推理额度信息。 **WithPrice** `boolean` | 是否附带价格信息 是否在返回结果中附带模型的计费价格信息。 ## 响应参数 **Items** `object[]` | 模型开通列表 模型开通列表。每个元素包含一个基础模型的开通详情。 **ChargeItems** `object[]` | 计费项列表 `Items.ChargeItems` 模型的计费项列表。 **Price** `number` | 单价 `Items.ChargeItems.Price` 计费项的单价。 **Type** `string` | 计费项类型 `Items.ChargeItems.Type` 计费项的类型标识。 **UnitCode** `string` | 计量单位编码 `Items.ChargeItems.UnitCode` 计费项的计量单位编码。 **DiscountPriceEndTime** `string` | 折扣结束时间 `Items.ChargeItems.DiscountPriceEndTime` 折扣价格的结束时间。 **DiscountPriceStartTime** `string` | 折扣开始时间 `Items.ChargeItems.DiscountPriceStartTime` 折扣价格的生效起始时间。 **OriginalPrice** `number` | 原价 `Items.ChargeItems.OriginalPrice` 计费项的原始价格(折扣前)。 **DisplayName** `string` | 展示名称 `Items.DisplayName` 模型的展示名称。 **FoundationModelName** `string` | 基础模型名称 `Items.FoundationModelName` 基础模型名称,可用于 [批量开通基础模型](/docs/activate-models-api)。 **FreeResourcePackItems** `object[]` | 免费资源包列表 `Items.FreeResourcePackItems` 模型关联的免费资源包列表。 **Consumed** `integer` | 已消耗量 `Items.FreeResourcePackItems.Consumed` 资源包中已消耗的数量。 **Reclaimed** `integer` | 已回收量 `Items.FreeResourcePackItems.Reclaimed` 资源包中已回收的数量。 **Total** `integer` | 总量 `Items.FreeResourcePackItems.Total` 资源包的总量。 **Type** `string` | 资源包类型 `Items.FreeResourcePackItems.Type` 资源包的类型。取值 `DataPermission` 表示数据权限、`FreeInference` 表示免费推理额度。 **SyncTime** `string` | 同步时间 `Items.FreeResourcePackItems.SyncTime` 资源包数据的最近同步时间。 **MultiChargeItems** `object[]` | 多档计费项列表 `Items.MultiChargeItems` 模型的多档计费项列表,支持按 Token 用量分档计价。 **ChargeItems** `object[]` | 计费项列表 `Items.MultiChargeItems.ChargeItems` 该档位下的计费项列表。 **Price** `number` | 单价 `Items.MultiChargeItems.ChargeItems.Price` 计费项的单价。 **Type** `string` | 计费项类型 `Items.MultiChargeItems.ChargeItems.Type` 计费项的类型标识。 **UnitCode** `string` | 计量单位编码 `Items.MultiChargeItems.ChargeItems.UnitCode` 计费项的计量单位编码。 **DiscountPriceEndTime** `string` | 折扣结束时间 `Items.MultiChargeItems.ChargeItems.DiscountPriceEndTime` 折扣价格的结束时间。 **DiscountPriceStartTime** `string` | 折扣开始时间 `Items.MultiChargeItems.ChargeItems.DiscountPriceStartTime` 折扣价格的生效起始时间。 **OriginalPrice** `number` | 原价 `Items.MultiChargeItems.ChargeItems.OriginalPrice` 计费项的原始价格(折扣前)。 **Description** `string` | 档位描述 `Items.MultiChargeItems.Description` 该计费档位的描述说明。 **MaxCompletionTokens** `integer` | 最大 Completion Token 数 `Items.MultiChargeItems.MaxCompletionTokens` 该档位对应的最大 Completion Token 数量。 **MaxPromptTokens** `integer` | 最大 Prompt Token 数 `Items.MultiChargeItems.MaxPromptTokens` 该档位对应的最大 Prompt Token 数量。 **Name** `string` | 档位名称 `Items.MultiChargeItems.Name` 该计费档位的名称。 **State** `string` | 开通状态 `Items.State` 开通状态,取值 `Available` 表示已开通,`Unavailable` 表示未开通;已开通不等同于当前可正常调用,还需结合欠费等业务状态判断。 **SubServices** `object[]` | 子服务状态列表 `Items.SubServices` 模型关联的子服务及其开通状态列表。 **Status** `string` | 开通状态 `Items.SubServices.Status` 子服务的开通状态。取值 `Available` 表示已开通、`Unavailable` 表示未开通。 **SubService** `string` | 子服务类型 `Items.SubServices.SubService` 子服务的类型标识。 **VendorName** `string` | 厂商名称 `Items.VendorName` 模型所属厂商的名称。 **InitialInferenceFreeUsage** `object` | 初始免费推理额度 `Items.InitialInferenceFreeUsage` 模型开通时赠送的初始免费推理额度。 **Consumed** `number` | 已使用额度 `Items.InitialInferenceFreeUsage.Consumed` 已消耗的免费推理额度。 **Total** `number` | 总额度 `Items.InitialInferenceFreeUsage.Total` 免费推理的总额度。 **Instruction** `string` | 开通说明 `Items.Instruction` 模型的开通说明或备注信息。 **IsDeprecated** `boolean` | 是否已下线 `Items.IsDeprecated` 模型是否已下线。 **IsLimitedActivation** `boolean` | 是否受开通限制 `Items.IsLimitedActivation` 是否受开通限制,不等同于模型已开通状态。 **IsOverdue** `boolean` | 是否欠费 `Items.IsOverdue` 是否欠费。即使 `State` 为 `Available`,该字段也可能为 `true`。 **PageNumber** `integer` | 当前页码 当前返回结果对应的分页页码。 **PageSize** `integer` | 每页记录数 当前返回结果每页包含的记录数。 **TotalCount** `integer` | 总数 符合筛选条件的模型开通记录总数。 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=ListModelActivations&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "PageNumber": 1, "PageSize": 10, "Filter": { "FoundationModelNames": [ "doubao-seed-2-0-pro", "doubao-seed-2-0-lite" ] }, "WithPrice": true, "WithFreeUsage": true } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "20240514212754E5F607182E04DEF708", "Action": "ListModelActivations", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "TotalCount": 2, "PageNumber": 1, "PageSize": 10, "Items": [ { "FoundationModelName": "doubao-seed-2-0-pro", "State": "Available", "VendorName": "火山方舟", "DisplayName": "Doubao Seed 2.0 Pro", "ChargeItems": [ { "Price": 0.0008, "UnitCode": "CNY/1KToken", "Type": "PromptToken" }, { "Price": 0.002, "UnitCode": "CNY/1KToken", "Type": "CompletionToken" } ], "MultiChargeItems": [], "InitialInferenceFreeUsage": { "Total": 500000, "Consumed": 12580 }, "FreeResourcePackItems": [ { "Total": 500000, "Consumed": 12580, "Type": "FreeInference", "SyncTime": "2024-04-01T11:54:41Z", "Reclaimed": 0 } ], "SubServices": [ { "SubService": "Inference", "Status": "Available" } ], "Instruction": "", "IsOverdue": false, "IsLimitedActivation": false, "IsDeprecated": false }, { "FoundationModelName": "doubao-seed-2-0-lite", "State": "Unavailable", "VendorName": "火山方舟", "DisplayName": "Doubao Seed 2.0 Lite", "ChargeItems": [ { "Price": 0.0003, "UnitCode": "CNY/1KToken", "Type": "PromptToken" }, { "Price": 0.0006, "UnitCode": "CNY/1KToken", "Type": "CompletionToken" } ], "MultiChargeItems": [], "FreeResourcePackItems": [], "SubServices": [ { "SubService": "Inference", "Status": "Unavailable" } ], "IsOverdue": false, "IsLimitedActivation": false, "IsDeprecated": false } ] } } ``` --- # 批量开通资源 Source: https://ark.volcengine.com/region:cn-beijing/docs/activate-resources-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=ActivateResources&Version=2024-01-01` 批量开通当前账号的产品服务,适用于 Managed Agents,以及应用组件库中的豆包助手 API、产物验证服务。通过 `ResourceType` 指定服务类型,通过 `ResourceNames` 指定该服务下的开通项。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **ResourceNames** `string[]` `必选` | 资源名称列表 该服务类型下的开通项名称列表,不能为空,不允许空字符串或重复项。取值须与 `ResourceType` 匹配。 **ResourceType** `string` `必选` | 资源类型 服务类型,产品与取值的对应关系见下方说明。一次请求指定一种类型。 | 控制台产品或服务 | `ResourceType` | `ResourceNames` | | --- | --- | --- | | Managed Agents | `DataManagedAgentSum` |* `sandbox`:Agent 运行时 | \ | | |* `web_search`:豆包网页搜索。控制台开通时同时提交这两项。 | | 应用组件库 > 豆包助手 API | `PluginSum` |* `chat`:日常沟通 | \ | | |* `deep_chat`:深度沟通 | \ | | |* `ai_search`:联网搜索 | \ | | |* `reasoning_search`:边想边搜。在控制台开通豆包助手 API 时,系统会同时提交上述四个取值。 | | 应用组件库 > 其他服务 > 产物验证 | `OfficialVerifySum` |* `seedance_watermark`:产物验证。 | \ | | | | 同为搜索能力,Managed Agents 使用 `DataManagedAgentSum` 和 `web_search`,豆包助手 API 使用 `PluginSum` 和 `ai_search` 或 `reasoning_search`。类型和名称不能混用。 **DryRun** `boolean` | 是否预检查 是否仅进行预检查。将 `DryRun` 设置为 `true` 时,不实际开通资源;设置为 `false` 时,正式开通资源。 ## 响应参数 本接口无特有的返回参数,成功时 HTTP 状态码为 `200`,返回结构中 `Result` 为空对象 `{}`。 ## 代码示例 ## Managed Agents ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=ActivateResources&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "ResourceType": "DataManagedAgentSum", "ResourceNames": [ "sandbox", "web_search" ], "DryRun": false } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "20260923120528A1B2C3D4E5F607182A", "Action": "ActivateResources", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": {} } ``` ## 豆包助手 API ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=ActivateResources&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "ResourceType": "PluginSum", "ResourceNames": [ "chat", "deep_chat", "ai_search", "reasoning_search" ], "DryRun": false } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "20260923120528A1B2C3D4E5F607182A", "Action": "ActivateResources", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": {} } ``` ## 产物验证 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=ActivateResources&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "ResourceType": "OfficialVerifySum", "ResourceNames": [ "seedance_watermark" ], "DryRun": false } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "20260923120528A1B2C3D4E5F607182A", "Action": "ActivateResources", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": {} } ``` --- # 查询资源开通列表 Source: https://ark.volcengine.com/region:cn-beijing/docs/list-resource-activations-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=ListResourceActivations&Version=2024-01-01` 查询指定产品服务的资源开通状态,适用于 Managed Agents,以及应用组件库中的豆包助手 API、产物验证服务。通过 `Filter.ResourceType` 指定服务类型,可按资源名称和开通状态筛选,并按需查询价格和免费资源包信息。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **Filter** `object` `必选` | 筛选条件 资源开通列表的筛选条件,可按资源类型、资源名称和开通状态过滤。 **ResourceType** `string` `必选` | 资源类型 `Filter.ResourceType` 服务类型。三类产品分别使用 `DataManagedAgentSum`、`PluginSum`、`OfficialVerifySum`,与 [批量开通资源](/docs/activate-resources-api) 保持一致。 **ResourceNames** `string[]` | 资源名称列表 `Filter.ResourceNames` 按该服务下的资源名称筛选。确认开通结果时,可传入 [批量开通资源](/docs/activate-resources-api) 中使用的名称;不传时不按名称筛选。 **States** `string[]` | 状态筛选 `Filter.States` 开通状态筛选,取值 `Available` 表示已开通、`Unavailable` 表示未开通;不传时不按开通状态筛选。 **PageNumber** `integer` `默认值 1` | 起始页码 分页查询时的起始页码。 **PageSize** `integer` `默认值 10` | 每页记录数 分页查询时每页返回的记录数。 **SortBy** `string` | 排序字段 排序所依据的字段名。默认值:`ResourceName` **SortOrder** `string` `默认值 Desc` | 排序顺序 排序顺序。取值 `Desc` 表示降序、`Asc` 表示升序。 **WithFreeResourcePack** `boolean` | 是否附带资源包信息 是否在返回结果中附带资源的免费资源包信息。 **WithPrice** `boolean` | 是否附带价格信息 是否在返回结果中附带资源的计费价格信息。 ## 响应参数 **Items** `object[]` | 资源开通列表 资源开通条目列表。每个元素包含一个资源的开通状态、价格和免费资源包信息。 **ChargeItems** `object[]` | 计费项列表 `Items.ChargeItems` 资源关联的计费项列表。当 *WithPrice* 为 `false` 时,返回空数组。 **Price** `number` | 单价 `Items.ChargeItems.Price` 计费项的单价。 **Type** `string` | 计费项类型 `Items.ChargeItems.Type` 计费项的类型标识。 **UnitCode** `string` | 计量单位编码 `Items.ChargeItems.UnitCode` 计费项的计量单位编码。 **DiscountPriceEndTime** `string` | 折扣结束时间 `Items.ChargeItems.DiscountPriceEndTime` 折扣价格的结束时间,格式遵循 RFC3339。 **DiscountPriceStartTime** `string` | 折扣开始时间 `Items.ChargeItems.DiscountPriceStartTime` 折扣价格的生效起始时间,格式遵循 RFC3339。 **OriginalPrice** `number` | 原价 `Items.ChargeItems.OriginalPrice` 计费项的原始价格(折扣前)。 **FreeResourcePackItems** `object[]` | 免费资源包列表 `Items.FreeResourcePackItems` 资源关联的免费资源包列表。当 *WithFreeResourcePack* 为 `false` 时,返回空数组。 **Consumed** `number` | 已消耗量 `Items.FreeResourcePackItems.Consumed` 免费资源包中已消耗的数量。 **Reclaimed** `number` | 已回收量 `Items.FreeResourcePackItems.Reclaimed` 免费资源包中已回收的数量。 **ResourceName** `string` | 资源名称 `Items.FreeResourcePackItems.ResourceName` 免费资源包对应的资源名称。 **Total** `integer` | 总量 `Items.FreeResourcePackItems.Total` 免费资源包的总量。 **Type** `string` | 资源包类型 `Items.FreeResourcePackItems.Type` 免费资源包类型,取值固定为 `FreeResourcePack`。 **SyncTime** `string` | 同步时间 `Items.FreeResourcePackItems.SyncTime` 免费资源包数据的最近同步时间,格式遵循 RFC3339。 **ResourceName** `string` | 资源名称 `Items.ResourceName` 资源名称,用于识别具体开通项。 **ResourceType** `string` | 资源类型 `Items.ResourceType` 服务类型,与请求参数 `Filter.ResourceType` 对应。 **State** `string` | 开通状态 `Items.State` 开通状态,取值 `Available` 表示已开通,`Unavailable` 表示未开通;不表示实时服务健康状态,也不能仅据此判断实际调用是否成功。 **IsLimitedActivation** `boolean` | 是否限量开通 `Items.IsLimitedActivation` 是否受开通限制,不等同于资源已开通状态。 **PageNumber** `integer` | 当前页码 当前返回结果对应的分页页码。 **PageSize** `integer` | 每页记录数 当前返回结果每页包含的记录数。 **TotalCount** `integer` | 总数 符合筛选条件的资源开通记录总数。 ## 代码示例 ## Managed Agents ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=ListResourceActivations&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "PageNumber": 1, "PageSize": 10, "Filter": { "ResourceType": "DataManagedAgentSum", "ResourceNames": [ "sandbox", "web_search" ] }, "WithPrice": true, "WithFreeResourcePack": true } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "20260923120532B2C3D4E5F607182A30", "Action": "ListResourceActivations", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "TotalCount": 2, "PageNumber": 1, "PageSize": 10, "Items": [ { "ResourceName": "sandbox", "ResourceType": "DataManagedAgentSum", "State": "Available", "ChargeItems": [ { "Price": 0.01, "UnitCode": "CNY/Request", "Type": "Request" } ], "FreeResourcePackItems": [ { "Total": 1000, "Consumed": 120, "Reclaimed": 0, "SyncTime": "2026-09-23T12:00:00+08:00", "ResourceName": "sandbox", "Type": "FreeResourcePack" } ], "IsLimitedActivation": false }, { "ResourceName": "web_search", "ResourceType": "DataManagedAgentSum", "State": "Available", "ChargeItems": [ { "Price": 0.02, "UnitCode": "CNY/Request", "Type": "Request" } ], "FreeResourcePackItems": [ { "Total": 1000, "Consumed": 80, "Reclaimed": 0, "SyncTime": "2026-09-23T12:00:00+08:00", "ResourceName": "web_search", "Type": "FreeResourcePack" } ], "IsLimitedActivation": false } ] } } ``` ## 豆包助手 API ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=ListResourceActivations&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "Filter": { "ResourceType": "PluginSum", "ResourceNames": [ "chat", "deep_chat", "ai_search", "reasoning_search" ] } } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "20260923120532B2C3D4E5F607182A30", "Action": "ListResourceActivations", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "TotalCount": 4, "PageNumber": 1, "PageSize": 10, "Items": [ { "ResourceName": "chat", "ResourceType": "PluginSum", "State": "Available", "ChargeItems": [], "FreeResourcePackItems": [], "IsLimitedActivation": false }, { "ResourceName": "deep_chat", "ResourceType": "PluginSum", "State": "Available", "ChargeItems": [], "FreeResourcePackItems": [], "IsLimitedActivation": false }, { "ResourceName": "ai_search", "ResourceType": "PluginSum", "State": "Available", "ChargeItems": [], "FreeResourcePackItems": [], "IsLimitedActivation": false }, { "ResourceName": "reasoning_search", "ResourceType": "PluginSum", "State": "Available", "ChargeItems": [], "FreeResourcePackItems": [], "IsLimitedActivation": false } ] } } ``` ## 产物验证 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=ListResourceActivations&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "Filter": { "ResourceType": "OfficialVerifySum", "ResourceNames": [ "seedance_watermark" ] } } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "20260923120532B2C3D4E5F607182A30", "Action": "ListResourceActivations", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "TotalCount": 1, "PageNumber": 1, "PageSize": 10, "Items": [ { "ResourceName": "seedance_watermark", "ResourceType": "OfficialVerifySum", "State": "Available", "ChargeItems": [], "FreeResourcePackItems": [], "IsLimitedActivation": false } ] } } ``` --- # 查询模型限流 Source: https://ark.volcengine.com/region:cn-beijing/docs/list-model-rate-limit-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=ListModelRateLimit&Version=2024-01-01` 查询当前账号下各基础模型的限流配额信息,包括默认配额、当前配额、每日 Token 限额(TPD)及实时连接限制。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **FoundationModelNames** `string[]` | 基础模型名称列表 指定要查询的基础模型名称列表。为空时返回全部模型的限流信息。 ## 响应参数 **Items** `object[]` | 模型限流列表 模型限流配额信息列表。 **FoundationModelName** `string` | 基础模型名称 `Items.FoundationModelName` **ContentGenerationRateLimit** `object` | 内容生成限制 `Items.ContentGenerationRateLimit` 内容生成相关的限流参数。 **ConcurrentRequests** `integer` | 并发请求数 `Items.ContentGenerationRateLimit.ConcurrentRequests` 最大并发请求数。 **ConcurrentRequestsFor4K** `integer` | 4K 并发请求数 `Items.ContentGenerationRateLimit.ConcurrentRequestsFor4K` 4K 分辨率最大并发请求数。 **CreateTaskRpm** `integer` | 创建任务 RPM `Items.ContentGenerationRateLimit.CreateTaskRpm` 创建任务每分钟请求数上限。 **CreateTaskRpmFor4K** `integer` | 4K 创建任务 RPM `Items.ContentGenerationRateLimit.CreateTaskRpmFor4K` 4K 分辨率创建任务每分钟请求数上限。 **DeleteTaskRpm** `integer` | 删除任务 RPM `Items.ContentGenerationRateLimit.DeleteTaskRpm` 删除任务每分钟请求数上限。 **ListTaskRpm** `integer` | 查询任务 RPM `Items.ContentGenerationRateLimit.ListTaskRpm` 查询任务每分钟请求数上限。 **CurrentRateLimit** `object` | 当前限流配额 `Items.CurrentRateLimit` 模型的当前限流配额参数(可能已通过提额调整)。 **Rpm** `integer` | 每分钟请求数 `Items.CurrentRateLimit.Rpm` 每分钟请求数上限(RPM)。 **Tpm** `integer` | 每分钟 Token 数 `Items.CurrentRateLimit.Tpm` 每分钟 Token 数上限(TPM)。 **FastTpm** `integer` | 快速通道 TPM `Items.CurrentRateLimit.FastTpm` 快速通道每分钟 Token 数上限。 **Ipm** `integer` | 每分钟图片数 `Items.CurrentRateLimit.Ipm` 每分钟图片数上限(IPM)。 **LoraTpm** `integer` | LoRA TPM `Items.CurrentRateLimit.LoraTpm` LoRA 推理每分钟 Token 数上限。 **CurrentTpd** `integer` | 当前每日 Token 限额 `Items.CurrentTpd` 模型的当前每日 Token 限额(TPD),可能已通过提额调整。 **DefaultRateLimit** `object` | 默认限流配额 `Items.DefaultRateLimit` 模型的默认限流配额参数。 **Rpm** `integer` | 每分钟请求数 `Items.DefaultRateLimit.Rpm` 每分钟请求数上限(RPM)。 **Tpm** `integer` | 每分钟 Token 数 `Items.DefaultRateLimit.Tpm` 每分钟 Token 数上限(TPM)。 **FastTpm** `integer` | 快速通道 TPM `Items.DefaultRateLimit.FastTpm` 快速通道每分钟 Token 数上限。 **Ipm** `integer` | 每分钟图片数 `Items.DefaultRateLimit.Ipm` 每分钟图片数上限(IPM)。 **LoraTpm** `integer` | LoRA TPM `Items.DefaultRateLimit.LoraTpm` LoRA 推理每分钟 Token 数上限。 **DefaultTpd** `integer` | 默认每日 Token 限额 `Items.DefaultTpd` 模型的默认每日 Token 限额(TPD)。 **RealtimeRateLimit** `object` | 实时连接限制 `Items.RealtimeRateLimit` 实时连接相关的限流参数。 **ConcurrentConnections** `integer` | 并发连接数 `Items.RealtimeRateLimit.ConcurrentConnections` 最大并发连接数。 **CPMPerConnection** `integer` | 单连接每分钟对话轮次 `Items.RealtimeRateLimit.CPMPerConnection` 单连接每分钟对话轮次上限(CPM)。 **TPMPerConnection** `integer` | 单连接每分钟 Token 数 `Items.RealtimeRateLimit.TPMPerConnection` 单连接每分钟 Token 数上限(TPM)。 **TotalCount** `integer` | 总数 符合条件的模型限流记录总数。 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=ListModelRateLimit&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "FoundationModelNames": [ "doubao-seed-2-0-pro", "doubao-seedance-2-0" ] }' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "20260501133217CC98254DEBAA6EF012", "Action": "ListModelRateLimit", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "TotalCount": 2, "Items": [ { "FoundationModelName": "doubao-seed-2-0-pro", "DefaultRateLimit": { "Rpm": 500, "Tpm": 800000, "FastTpm": 200000, "LoraTpm": 100000 }, "CurrentRateLimit": { "Rpm": 1000, "Tpm": 1600000, "FastTpm": 400000, "LoraTpm": 200000 }, "DefaultTpd": 100000000, "CurrentTpd": 200000000, "RealtimeRateLimit": { "ConcurrentConnections": 20, "CPMPerConnection": 6, "TPMPerConnection": 60000 } }, { "FoundationModelName": "doubao-seedance-2-0", "DefaultRateLimit": { "Rpm": 60, "Tpm": 0, "Ipm": 20 }, "CurrentRateLimit": { "Rpm": 120, "Tpm": 0, "Ipm": 40 }, "ContentGenerationRateLimit": { "ConcurrentRequests": 8, "CreateTaskRpm": 60, "ListTaskRpm": 300, "DeleteTaskRpm": 60, "ConcurrentRequestsFor4K": 2, "CreateTaskRpmFor4K": 20 } } ] } } ``` --- # 删除定制模型 Source: https://ark.volcengine.com/region:cn-beijing/docs/delete-custom-model-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=DeleteCustomModel&Version=2024-01-01` 调用本接口删除指定的定制模型。删除后该定制模型不可恢复,请谨慎操作。建议在删除前确认该定制模型未被任何在线推理接入点(Endpoint)使用。 > **注意** > > 删除操作不可逆,定制模型一旦删除,关联的训练产物、版本信息将一并被清理,无法通过 API 或控制台恢复。如该定制模型已被在线推理接入点(Endpoint)引用,请先解除关联或删除接入点后再执行删除。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **Id** `string` `必选` | 定制模型 ID 待删除的定制模型 ID。可通过 *ListCustomModels* 接口查询当前账号下的定制模型列表。 **DryRun** `boolean` `默认值 false` | 是否预检请求 是否仅对此请求进行预检(DryRun),不实际执行删除。 - `true`:发送检查请求,仅校验参数与权限,不执行实际删除操作。 - `false`(默认):发送正常请求,执行实际的删除操作。 ## 响应参数 本接口无特有的返回参数,成功时 HTTP 状态码为 `200`,返回结构中 `Result` 为空对象 `{}`。 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=DeleteCustomModel&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "Id": "vW1AYDY27A", "DryRun": true } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "20240514210901A47B2E9C8F5D103E76", "Action": "DeleteCustomModel", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": {} } ``` --- # 获取定制模型信息 Source: https://ark.volcengine.com/region:cn-beijing/docs/get-custom-model-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=GetCustomModel&Version=2024-01-01` 获取指定定制模型的详细信息,包括模型名称、来源类型、训练超参数、标签等。 > **说明:注意** > > 本接口仅返回当前账号下可见的定制模型,跨项目查询需指定正确的 ProjectName。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **Id** `string` `必选` | 定制模型 ID 定制模型的 ID。可通过 *ListCustomModels* 接口查询当前账号下的定制模型列表。 ## 响应参数 **AvailableDeploymentTypes** `string[]` | 支持的部署类型列 定制模型支持的部署类型列表 **Compressible** `boolean` | 是否支持压缩 定制模型是否支持压缩 **CompressionJobs** `object[]` | 压缩任务列表 定制模型关联的压缩任务列表 **CreateTime** `string` | 创建时间 `CompressionJobs.CreateTime` 压缩任务的创建时间 **Index** `integer` | 任务序号 `CompressionJobs.Index` 压缩任务在列表中的序号 **Phase** `string` | 任务阶段 `CompressionJobs.Phase` 压缩任务当前所处的阶段。可选值:`Completed`、`Failed`、`Running`。 **PhaseTime** `string` | 阶段时间 `CompressionJobs.PhaseTime` 压缩任务进入当前阶段的时间 **Message** `string` | 任务消息 `CompressionJobs.Message` 压缩任务相关的描述信息 **Config** `object` | 定制模型配置 定制模型的配置信息 **ModelType** `string` | 模型类型 `Config.ModelType` 模型类型标识 **CreateTime** `string` | 创建时间 定制模型的创建时间,RFC 3339 格式。 **CustomizationType** `string` | 定制类型 精调方式。例如 `FinetuneLoRA` 表示 LoRA 精调。 **Description** `string` | 定制模型描述 定制模型的描述信息 **Encrypted** `boolean` | 是否已加密 定制模型是否已加密 **FoundationModel** `object` | 基础模型引用 定制模型所基于的基础模型信息 **ModelVersion** `string` | 基础模型版本 `FoundationModel.ModelVersion` 基础模型版本号 **Name** `string` | 基础模型名称 `FoundationModel.Name` **ConfigurationId** `string` | 基础模型配置 ID `FoundationModel.ConfigurationId` **HyperParameters** `object[]` | 超参列表 训练该定制模型时使用的超参数列表 **Name** `string` | 参数名 `HyperParameters.Name` 超参数的参数名 **Value** `string` | 参数值 `HyperParameters.Value` 超参数的参数值 **Id** `string` | 定制模型 ID 定制模型的 ID **LoraBaseModelAvailable** `boolean` | LoRA 基础模型是否可用 如果当前定制模型是基于全量 SFT 模型增量精调得到的,该字段表示全量 SFT 模型是否仍然有效:`true` 表示全量 SFT 模型仍可用;`false` 表示全量 SFT 模型当前不可用,将影响本模型的可用性。 **ModelCustomizationJobId** `string` | 调优任务 ID 创建该定制模型的精调任务 ID **Name** `string` | 定制模型名称 定制模型的名称 **OwnerAccountId** `number` | 拥有者账号 ID 拥有该定制模型的账号 ID **ProjectName** `string` | 项目名称 定制模型所属的项目名称 **ResourceOrigin** `string` | 资源来源 资源来源标识 **SourceModelAvailable** `boolean` | 源模型是否可用 如果当前定制模型是基于某共享模型增量训练得到的,该字段表示来源共享模型是否仍然有效:`true` 表示来源共享模型仍可用;`false` 表示来源共享模型当前不可用,将影响本模型的可用性。 **SourceType** `string` | 来源类型 定制模型的来源类型。例如 `Customization` 表示通过精调任务产生。 **Status** `string` | 定制模型状态 定制模型的当前状态。取值包括 `Ready`(就绪)等。 **SupportInferenceFoundry** `boolean` | 是否支持推理铸造 定制模型是否支持推理铸造 **Tags** `object[]` | 标签列表 定制模型关联的标签列表 **Key** `string` | 标签键 `Tags.Key` **Value** `string` | 标签值 `Tags.Value` **TosConfig** `object` | TOS 存储配置 定制模型的 TOS 存储配置信息 **BucketName** `string` | TOS 桶名称 `TosConfig.BucketName` **PrefixPath** `string` | TOS 文件夹路径 `TosConfig.PrefixPath` **UpdateTime** `string` | 更新时间 定制模型的最近更新时间,RFC 3339 格式。 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=GetCustomModel&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "Id": "cm-id" } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "2024051421034216322206625187C9AD", "Action": "GetCustomModel", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "CustomModel": { "Id": "cm-20240514210342-9k4hn", "Name": "自定义模型-电商图像生成", "Description": "基于 doubao-seed-2-0-pro 的 LoRA 精调模型 · 用于电商场景图像生成", "SourceType": "Customization", "ModelCustomizationJobId": "mcj-20240401114541-5gzd8", "CustomizationType": "FinetuneLoRA", "Status": "Ready", "HyperParameters": [ { "Name": "learning_rate", "Value": "0.0001" } ], "FoundationModel": { "Name": "doubao-seed-2-0-pro", "ModelVersion": "260215" }, "Tags": [ { "Key": "env", "Value": "stg" } ], "ProjectName": "default", "CreateTime": "2024-04-01T11:54:41Z", "UpdateTime": "2024-05-14T20:59:45Z" } } } ``` --- # 更新定制模型 Source: https://ark.volcengine.com/region:cn-beijing/docs/update-custom-model-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=UpdateCustomModel&Version=2024-01-01` 调用本接口更新指定定制模型的名称或描述信息。本接口仅修改元数据,不会触发模型版本变更,也不会影响已基于该定制模型创建的在线推理接入点(Endpoint)。 > **说明:注意** > > 本接口仅更新定制模型的名称或描述等元数据信息,不会修改训练产物或版本。如需关联新的版本或修改其他属性,请使用对应的版本管理接口。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **Id** `string` `必选` | 定制模型 ID 待更新的定制模型 ID。可通过 *ListCustomModels* 接口查询当前账号下的定制模型列表。 **ClientToken** `string` | 幂等令牌 用于保证请求幂等性的字符串。由调用方传入,需在不同请求之间保持唯一。重复携带同一 *ClientToken* 的请求只会被实际执行一次。 **Description** `string` | 定制模型描述 定制模型的新描述信息,用于补充说明模型用途、训练数据来源或版本说明等。 **DryRun** `boolean` `默认值 false` | 是否预检请求 是否仅对此请求进行预检(DryRun),不实际执行更新。 - `true`:发送检查请求,仅校验参数与权限,不实际更新定制模型。 - `false`(默认):发送正常请求,执行实际的更新操作。 **Name** `string` | 定制模型名称 定制模型的新名称,用于在控制台与 API 列表中识别该定制模型。建议使用具有业务含义的可读字符串。 ## 响应参数 **Id** `string` | 定制模型 ID 被更新的定制模型 ID,与请求参数中的 *Id* 一致。 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=UpdateCustomModel&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "Id": "cm-id", "Name": "TestName", "Description": "TestDescription", "DryRun": true } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "20240514210804240055238131D7DFB2", "Action": "UpdateCustomModel", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "Id": "cm-20240401114541-5gzd8" } } ``` --- # 获取定制模型列表 Source: https://ark.volcengine.com/region:cn-beijing/docs/list-custom-models-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=ListCustomModels&Version=2024-01-01` 查询当前账号下的定制模型列表,支持按模型 ID、名称、标签和项目等条件筛选,并可分页与排序返回结果。 > **说明:注意** > > 本接口仅返回当前账号下可见的定制模型,跨项目查询需指定正确的 ProjectName。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **Filter** `object` | 定制模型筛选条件 待查询定制模型的筛选条件。 **Ids** `string[]` | 定制模型 ID 列表 `Filter.Ids` 定制模型 ID 数组,精确匹配。 **Name** `string` | 定制模型名称 `Filter.Name` 定制模型名称,模糊匹配。 **PageNumber** `integer` `默认值 1` | 起始页码 分页查询时的起始页码,从 1 开始。 **最小值**:`1` **PageSize** `integer` `默认值 10` | 每页记录数 分页查询时每页显示的记录数。 **取值范围**:`[1, 100]` **ProjectName** `string` `默认值 default` | 项目名称 资源所属的项目名称。若资源不在默认项目中,需填写正确的项目名称。 **SortBy** `string` `默认值 CreateTime` | 排序指标 指定排序指标。可选值:`CreateTime`、`UpdateTime`。 **SortOrder** `string` `默认值 Desc` | 排序顺序 指定排序顺序。可选值:`Asc`、`Desc`。 **TagFilters** `object[]` | 标签筛选条件 基于绑定标签的筛选条件。 **Key** `string` `必选` | 标签键 `TagFilters.Key` **Values** `string[]` | 标签值列表 `TagFilters.Values` ## 响应参数 **Items** `object[]` | 定制模型列表 本页返回的定制模型列表 **CreateTime** `string` | 创建时间 `Items.CreateTime` 定制模型创建时间,RFC 3339 格式。 **CustomizationType** `string` | 定制类型 `Items.CustomizationType` 定制类型。 - `FinetuneSft`:SFT 精调。 - `FinetuneLoRA`:LoRA 精调。 - `Pretrain`:预训练。 **FoundationModel** `object` | 基础模型引用 `Items.FoundationModel` 定制模型所基于的基础模型引用。 **ModelVersion** `string` | 基础模型版本 `Items.FoundationModel.ModelVersion` **Name** `string` | 基础模型名称 `Items.FoundationModel.Name` **HyperParameters** `object[]` | 超参列表 `Items.HyperParameters` 定制模型的超参列表。 **Name** `string` | 超参数名 `Items.HyperParameters.Name` 超参数的参数名 **Value** `string` | 超参数值 `Items.HyperParameters.Value` 超参数的参数值 **Id** `string` | 定制模型 ID `Items.Id` **Name** `string` | 定制模型名称 `Items.Name` **ProjectName** `string` | 项目名称 `Items.ProjectName` 定制模型所属的项目名称。 **SourceType** `string` | 来源类型 `Items.SourceType` 定制模型的来源类型。 - `Customization`:精调模型。 - `Import`:导入模型。 **Status** `string` | 定制模型状态 `Items.Status` 定制模型的状态。取值包括 `Ready`(就绪)等。 **Tags** `object[]` | 绑定的标签 `Items.Tags` 定制模型绑定的标签列表。 **Key** `string` | 标签键 `Items.Tags.Key` **Value** `string` | 标签值 `Items.Tags.Value` **UpdateTime** `string` | 更新时间 `Items.UpdateTime` 定制模型更新时间,RFC 3339 格式。 **Description** `string` | 定制模型描述 `Items.Description` **LoraBaseModelAvailable** `boolean` | LoRA 基础模型是否可用 `Items.LoraBaseModelAvailable` 如果当前定制模型是基于某共享模型增量训练得到的,该字段表示来源共享模型是否仍然有效。 **ModelCustomizationJobId** `string` | 调优任务 ID `Items.ModelCustomizationJobId` 模型调优任务 ID。 **SourceModelAvailable** `boolean` | 源模型是否可用 `Items.SourceModelAvailable` 如果当前定制模型是基于全量 SFT 模型增量精调得到的,该字段表示全量 SFT 模型是否仍然有效。 **PageNumber** `integer` | 起始页码 分页查询时的起始页码。 **PageSize** `integer` | 每页记录数 分页查询时每页显示的记录数。 **TotalCount** `integer` | 定制模型总数 符合查询条件的定制模型总数 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=ListCustomModels&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "PageNumber": 1, "PageSize": 1, "Filter": { "Ids": [ "vrYVig" ], "Name": "aThQ2SZH" }, "TagFilters": [ { "Key": "8mYbP7pN", "Values": [ "8bS" ] } ], "ProjectName": "default", "SortBy": "CreateTime", "SortOrder": "Desc" } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "20240514210517123075045154E335F9", "Action": "ListCustomModels", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "TotalCount": 1, "PageNumber": 1, "PageSize": 10, "Items": [ { "Id": "cm-20240514210342-9k4hn", "Name": "自定义模型-电商图像生成", "Description": "基于 doubao-seed-2-0-pro 的 LoRA 精调模型 · 用于电商场景图像生成", "SourceType": "Customization", "ModelCustomizationJobId": "mcj-20240401114541-5gzd8", "CustomizationType": "FinetuneLoRA", "Status": "Ready", "HyperParameters": [ { "Name": "learning_rate", "Value": "0.0001" } ], "FoundationModel": { "Name": "doubao-seed-2-0-pro", "ModelVersion": "260215" }, "Tags": [ { "Key": "env", "Value": "stg" } ], "ProjectName": "default", "CreateTime": "2024-04-01T11:54:41Z", "UpdateTime": "2024-05-14T20:59:45Z" } ] } } ``` --- # 创建模型调优任务 Source: https://ark.volcengine.com/region:cn-beijing/docs/create-model-customization-job-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=CreateModelCustomizationJob&Version=2024-01-01` 创建一个模型调优任务,支持全量 SFT、SFT-LoRA、继续预训练、DPO-LoRA、DPO、GRPO、GRPOLoRA、PPO、OPD、OPDLoRA 等训练类型。 > **说明** > > - 训练类型 *CustomizationType* 一经创建即不可修改;如需更换类型请新建任务。 > - 任务创建后会进入排队(`Queue`)→ 运行中(`Running`)→ 完成(`Completed`)/ 失败(`Failed`)/ 取消(`Cancelled`)的阶段流转,可通过 *GetModelCustomizationJob* 接口查询当前 *Status.Phase*。 > - *Hyperparameters* 数组中每一项的 *Name* 不能重复;具体可用超参数因训练类型不同而异,请参考训练类型文档。 > - 强化学习类训练(`GRPO`、`GRPOLoRA`、`PPO` 等)需配合 *RewardConfigs* 或 *CustomRLPipelineConfig* 使用。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **CustomizationType** `string` `必选` | 训练类型 训练类型。取值范围:`FinetuneSft`(全量 SFT)、`FinetuneLoRA`(SFT-LoRA)、`Pretrain`(继续预训练)、`DPOLoRA`、`DPO`、`GRPO`、`GRPOLoRA`、`PPO`、`OPD`、`OPDLoRA`。一经创建不可修改。 **Data** `object` `必选` | 微调数据集 模型微调数据集,包含训练集和可选的验证集配置 **TrainingSet** `object` `必选` | 训练数据集 `Data.TrainingSet` **Datasets** `object[]` | 数据集列表 `Data.TrainingSet.Datasets` 数据集列表,当此字段不为空时表示使用数据集数据训练。不可与 TosBucket,TosPaths 同时存在 **DatasetId** `string` `必选` | 数据集 ID `Data.TrainingSet.Datasets.DatasetId` **DatasetVersionId** `string` `必选` | 版本 ID `Data.TrainingSet.Datasets.DatasetVersionId` 数据集版本 ID **Multiplier** `string` | 采样倍率 `Data.TrainingSet.Datasets.Multiplier` **SampleCount** `number` | 样本数 `Data.TrainingSet.Datasets.SampleCount` 采样的样本数 **PresetData** `string` | 预置数据集名称 `Data.TrainingSet.PresetData` 预置数据集名称,不填不适用预置数据集 **PresetDataPercentage** `integer` `默认值 10` | 预置数据集占比 `Data.TrainingSet.PresetDataPercentage` 预置数据集使用百分比(0-100),仅在填写了 PresetData 时有效。 **PresetDatasets** `object[]` | 预置数据集列表 `Data.TrainingSet.PresetDatasets` **DatasetVersionId** `string` `必选` | 预置数据集版本 `Data.TrainingSet.PresetDatasets.DatasetVersionId` **InjectMultiplier** `string` | 混入倍率 `Data.TrainingSet.PresetDatasets.InjectMultiplier` 预置数据集混入倍率 **InjectSampleCount** `number` | 混入样本数 `Data.TrainingSet.PresetDatasets.InjectSampleCount` 预置数据集混入的样本数 **TosBucket** `string` | TOS 桶名 `Data.TrainingSet.TosBucket` TOS 桶名,需与 TosPaths 同时存在,当此字段不为空时表示使用直接使用 TOS 数据训练,不可与 Datasets 同时存在 **TosPaths** `string[]` | TOS 存储路径 `Data.TrainingSet.TosPaths` TOS 存储路径,需与 TosBucket 同时存在,当此字段不为空时表示使用直接使用 TOS 数据训练,不可与 Datasets 同时存在 **EncryptionKeyringType** `string` `默认值 ManagedKeyring` | 加密密钥类型 `Data.EncryptionKeyringType` 加密密钥类型。取值范围:`ManagedKeyring`、`CustomKeyring`。 **KMSTrn** `string` | 加密密钥 TRN `Data.KMSTrn` 加密密钥 TRN,可在 KMS 控制台获取。当 *EncryptionKeyringType* 为 `ManagedKeyring`(默认)时自动生成且不可填写;为 `CustomKeyring` 时必填。 **ValidationPercentage** `integer` | 验证集采样比例 `Data.ValidationPercentage` 使用训练集数据作为验证集的比例(0-100) **ValidationSet** `object` | 验证数据集 `Data.ValidationSet` **Datasets** `object[]` | 数据集列表 `Data.ValidationSet.Datasets` **DatasetId** `string` `必选` | 数据集 ID `Data.ValidationSet.Datasets.DatasetId` **DatasetVersionId** `string` `必选` | 版本 ID `Data.ValidationSet.Datasets.DatasetVersionId` 数据集版本 ID **Multiplier** `string` | 采样倍率 `Data.ValidationSet.Datasets.Multiplier` **SampleCount** `number` | 样本数 `Data.ValidationSet.Datasets.SampleCount` 采样的样本数 **TosBucket** `string` | TOS 桶名 `Data.ValidationSet.TosBucket` TOS 桶名,需与 TosPaths 同时存在,当此字段不为空时表示使用直接使用 TOS 数据,不可与 Datasets 同时存在 **TosPaths** `string[]` | TOS 存储路径 `Data.ValidationSet.TosPaths` TOS 存储路径,需与 TosBucket 同时存在,当此字段不为空时表示使用直接使用 TOS 数据,不可与 Datasets 同时存在 **ModelReference** `object` `必选` | 微调基础模型 微调基于的模型,必须在定制模型和基座模型中二选一 **CustomModelId** `string` | 定制模型 ID `ModelReference.CustomModelId` 定制模型的 ID **FoundationModel** `object` | 基础模型 `ModelReference.FoundationModel` **ModelVersion** `string` `必选` | 模型版本 `ModelReference.FoundationModel.ModelVersion` 基础模型版本 **Name** `string` `必选` | 模型名称 `ModelReference.FoundationModel.Name` 基础模型名称 **Name** `string` `必选` | 任务名称 模型调优任务名称 **BillingMethod** `string` | 计费方式 任务计费方式。取值范围:`Instance`、`InstanceByCheckpoint`、`Token`、`TokenByCheckpoint`。其中带 Checkpoint 后缀表示按检查点计费。 **CustomRLPipelineConfig** `object` | RL 流水线配置 自定义强化学习流水线配置,用于配置 RL 训练流水线的插件和混合策略 **PipelinePlugins** `object[]` `必选` | 插件列表 `CustomRLPipelineConfig.PipelinePlugins` RL 训练流水线插件列表,定义流水线中各阶段使用的插件 **Name** `string` `必选` | 插件名称 `CustomRLPipelineConfig.PipelinePlugins.Name` **Description** `string` | 插件描述 `CustomRLPipelineConfig.PipelinePlugins.Description` **Embedded** `object` | 内嵌插件 `CustomRLPipelineConfig.PipelinePlugins.Embedded` 内嵌插件配置 **FunctionMeta** `object` `必选` | 函数元信息 `CustomRLPipelineConfig.PipelinePlugins.Embedded.FunctionMeta` **FunctionIdentifier** `string` `必选` | 函数标识 `CustomRLPipelineConfig.PipelinePlugins.Embedded.FunctionMeta.FunctionIdentifier` **Source** `string` `必选` | 源 `CustomRLPipelineConfig.PipelinePlugins.Embedded.FunctionMeta.Source` **SourceType** `string` `必选` | 源类型 `CustomRLPipelineConfig.PipelinePlugins.Embedded.FunctionMeta.SourceType` **Type** `string` `必选` | 函数类型 `CustomRLPipelineConfig.PipelinePlugins.Embedded.FunctionMeta.Type` **FunctionConfig** `object` | 函数配置 `CustomRLPipelineConfig.PipelinePlugins.Embedded.FunctionConfig` **CpuMilli** `integer` | CPU 毫核 `CustomRLPipelineConfig.PipelinePlugins.Embedded.FunctionConfig.CpuMilli` **EnvVars** `object[]` | 环境变量列表 `CustomRLPipelineConfig.PipelinePlugins.Embedded.FunctionConfig.EnvVars` **Key** `string` `必选` | 环境变量名 `CustomRLPipelineConfig.PipelinePlugins.Embedded.FunctionConfig.EnvVars.Key` **Value** `string` `必选` | 环境变量值 `CustomRLPipelineConfig.PipelinePlugins.Embedded.FunctionConfig.EnvVars.Value` **MaxConcurrency** `integer` | 最大并发数 `CustomRLPipelineConfig.PipelinePlugins.Embedded.FunctionConfig.MaxConcurrency` **MaxReplica** `integer` | 最大副本数 `CustomRLPipelineConfig.PipelinePlugins.Embedded.FunctionConfig.MaxReplica` **MemoryMB** `integer` | 内存 MB `CustomRLPipelineConfig.PipelinePlugins.Embedded.FunctionConfig.MemoryMB` **MinReplica** `integer` | 最小副本数 `CustomRLPipelineConfig.PipelinePlugins.Embedded.FunctionConfig.MinReplica` **RequestConcurrency** `integer` | 单实例并发 `CustomRLPipelineConfig.PipelinePlugins.Embedded.FunctionConfig.RequestConcurrency` 单实例请求并发数 **RequestTimeoutSeconds** `integer` | 请求超时秒数 `CustomRLPipelineConfig.PipelinePlugins.Embedded.FunctionConfig.RequestTimeoutSeconds` **Runtime** `string` | 运行时 `CustomRLPipelineConfig.PipelinePlugins.Embedded.FunctionConfig.Runtime` **Tags** `object[]` | 标签列表 `CustomRLPipelineConfig.PipelinePlugins.Embedded.FunctionConfig.Tags` **Key** `string` `必选` | 标签键 `CustomRLPipelineConfig.PipelinePlugins.Embedded.FunctionConfig.Tags.Key` **Value** `string` `必选` | 标签值 `CustomRLPipelineConfig.PipelinePlugins.Embedded.FunctionConfig.Tags.Value` **Weight** `number` | 权重 `CustomRLPipelineConfig.PipelinePlugins.Embedded.FunctionConfig.Weight` **Managed** `object` | 托管插件 `CustomRLPipelineConfig.PipelinePlugins.Managed` 托管插件配置 **SID** `string` `必选` | 插件 SID `CustomRLPipelineConfig.PipelinePlugins.Managed.SID` **FunctionConfig** `object` | 函数配置 `CustomRLPipelineConfig.PipelinePlugins.Managed.FunctionConfig` **CpuMilli** `integer` | CPU 毫核 `CustomRLPipelineConfig.PipelinePlugins.Managed.FunctionConfig.CpuMilli` **EnvVars** `object[]` | 环境变量列表 `CustomRLPipelineConfig.PipelinePlugins.Managed.FunctionConfig.EnvVars` **Key** `string` `必选` | 环境变量名 `CustomRLPipelineConfig.PipelinePlugins.Managed.FunctionConfig.EnvVars.Key` **Value** `string` `必选` | 环境变量值 `CustomRLPipelineConfig.PipelinePlugins.Managed.FunctionConfig.EnvVars.Value` **MaxConcurrency** `integer` | 最大并发数 `CustomRLPipelineConfig.PipelinePlugins.Managed.FunctionConfig.MaxConcurrency` **MaxReplica** `integer` | 最大副本数 `CustomRLPipelineConfig.PipelinePlugins.Managed.FunctionConfig.MaxReplica` **MemoryMB** `integer` | 内存 MB `CustomRLPipelineConfig.PipelinePlugins.Managed.FunctionConfig.MemoryMB` **MinReplica** `integer` | 最小副本数 `CustomRLPipelineConfig.PipelinePlugins.Managed.FunctionConfig.MinReplica` **RequestConcurrency** `integer` | 单实例并发 `CustomRLPipelineConfig.PipelinePlugins.Managed.FunctionConfig.RequestConcurrency` 单实例请求并发数 **RequestTimeoutSeconds** `integer` | 请求超时秒数 `CustomRLPipelineConfig.PipelinePlugins.Managed.FunctionConfig.RequestTimeoutSeconds` **Runtime** `string` | 运行时 `CustomRLPipelineConfig.PipelinePlugins.Managed.FunctionConfig.Runtime` **Tags** `object[]` | 标签列表 `CustomRLPipelineConfig.PipelinePlugins.Managed.FunctionConfig.Tags` **Key** `string` `必选` | 标签键 `CustomRLPipelineConfig.PipelinePlugins.Managed.FunctionConfig.Tags.Key` **Value** `string` `必选` | 标签值 `CustomRLPipelineConfig.PipelinePlugins.Managed.FunctionConfig.Tags.Value` **Weight** `number` | 权重 `CustomRLPipelineConfig.PipelinePlugins.Managed.FunctionConfig.Weight` **Tags** `object[]` | 标签列表 `CustomRLPipelineConfig.PipelinePlugins.Tags` **Key** `string` `必选` | 标签键 `CustomRLPipelineConfig.PipelinePlugins.Tags.Key` **Value** `string` `必选` | 标签值 `CustomRLPipelineConfig.PipelinePlugins.Tags.Value` **GraderMixer** `string` | 评分混合策略 `CustomRLPipelineConfig.GraderMixer` 评分混合策略,控制多个奖励函数的混合方式 **TeacherConfigs** `string` | 教师模型配置 `CustomRLPipelineConfig.TeacherConfigs` 教师模型配置,用于蒸馏类训练场景 **DebugConfig** `object` | 调试配置 调试配置,包含 RL 调试相关设置 **RLDebugConfig** `object` | RL 调试配置 `DebugConfig.RLDebugConfig` 强化学习训练的调试配置 **APIKey** `string` `必选` | API Key `DebugConfig.RLDebugConfig.APIKey` 调用推理接入点鉴权使用的 API Key **EndpointID** `string` `必选` | Endpoint ID `DebugConfig.RLDebugConfig.EndpointID` 用于 RL 调试的推理接入点 ID **Description** `string` | 任务描述 模型调优任务描述 **EnableTrajectory** `boolean` | 启用轨迹采集 是否启用轨迹记录 **Hyperparameters** `object[]` | 训练超参 训练超参数配置。数组中每一项的 *Name* 不能重复;可用超参数因训练类型而异。 **Name** `string` `必选` | 参数名 `Hyperparameters.Name` 超参数的参数名 **Value** `string` `必选` | 参数值 `Hyperparameters.Value` 超参数的参数值 **OutputConfig** `object` | 输出配置 输出配置,包含输出压缩策略等选项 **OutputCompressionStrategies** `string[]` | 输出压缩策略 `OutputConfig.OutputCompressionStrategies` 输出压缩策略列表,控制模型产物的压缩方式 **Priority** `string` | 调度优先级 任务调度优先级。`Allocated` 表示使用预留资源调度,优先级较高;`Spot` 表示使用抢占式资源调度,成本更低但可能被高优任务抢占。 **ProjectName** `string` `默认值 default` | 所属项目 资源所属的项目名称。若资源不在默认项目中,需填写正确的项目名称。 **RewardConfigs** `object[]` | 奖励规则配置 奖励规则配置,用于强化学习训练类型(如 GRPO、PPO) **CustomRewardFunction** `object` | 自定义奖励 `RewardConfigs.CustomRewardFunction` 自定义奖励函数配置 **FaaSFunctionID** `string` `必选` | veFaaS 函数 ID `RewardConfigs.CustomRewardFunction.FaaSFunctionID` veFaaS 函数 id **PresetRewardFunction** `object` | 预置奖励函数配置 `RewardConfigs.PresetRewardFunction` **Hyperparameters** `object[]` `必选` | 参数列表 `RewardConfigs.PresetRewardFunction.Hyperparameters` **Name** `string` `必选` | 参数名 `RewardConfigs.PresetRewardFunction.Hyperparameters.Name` 超参数的参数名 **Value** `string` `必选` | 参数值 `RewardConfigs.PresetRewardFunction.Hyperparameters.Value` 超参数的参数值 **Name** `string` `必选` | 预置奖励函数名 `RewardConfigs.PresetRewardFunction.Name` **Weight** `number` | 权重 `RewardConfigs.Weight` **SaveModelLimit** `integer` `默认值 1` | 保存模型上限 保存模型的最大数量限制,取值范围为 1~10。 **取值范围**:`[1, 10]` **Tags** `object[]` | 标签列表 标签信息配置,用于对任务进行分类管理 **Key** `string` `必选` | 标签键 `Tags.Key` **Value** `string` `必选` | 标签值 `Tags.Value` **TestOptions** `object` | 测试选项(内部) 测试选项,仅用于内部测试 **DisableAutoCompression** `number` | 禁用自动压缩 `TestOptions.DisableAutoCompression` 内部测试用,是否禁用自动压缩 **FoundationModelVersionConfigurationId** `string` | 配置 ID `TestOptions.FoundationModelVersionConfigurationId` 内部测试用的基础模型版本配置 ID **SpecifiedClusterID** `string` | 指定集群 ID `TestOptions.SpecifiedClusterID` 内部测试用的指定训练集群 ID **TrainingConfigOverridePolicyIndices** `integer[]` | 训练配置覆盖索引 `TestOptions.TrainingConfigOverridePolicyIndices` 内部测试用的训练配置覆盖策略索引列表 ## 响应参数 **Id** `string` | 任务 ID 创建好的模型调优任务的 ID ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=CreateModelCustomizationJob&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "Name": "测试任务", "Description": "这是一个测试任务", "Tags": [ { "Key": "test_key", "Value": "test_value" } ], "ProjectName": "default", "CustomizationType": "FinetuneLoRA", "ModelReference": { "FoundationModel": { "Name": "skylark2-lite-8k", "ModelVersion": "1.0" } }, "Hyperparameters": [ { "Name": "epoch", "Value": "6" }, { "Name": "learning_rate", "Value": "0.00001" } ], "SaveModelLimit": 1, "Data": { "TrainingSet": { "TosBucket": "ark-auto-created-required-2100000000-cn-beijing", "TosPaths": [ "model-customization-job-upload-set/1712561985763/test.jsonl" ] } } } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "20240401114541A47B2E9C8F5D103E76", "Action": "CreateModelCustomizationJob", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "Id": "mcj-20240401114541-5gzd8" } } ``` --- # 删除模型调优任务 Source: https://ark.volcengine.com/region:cn-beijing/docs/delete-model-customization-job-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=DeleteModelCustomizationJob&Version=2024-01-01` 调用本接口删除指定的模型调优任务(精调任务)。删除后任务记录不可恢复,请谨慎操作。仅支持删除处于已结束状态(如已完成、已失败、已取消)的任务;运行中或排队中的任务请先调用 [停止模型调优任务](/docs/terminate-model-customization-job-api) 终止后再删除。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **Id** `string` `必选` | 模型调优任务 ID 待删除的模型调优任务的 ID。可通过 [获取模型调优任务列表](/docs/list-model-customization-jobs-api) 接口查询 ## 响应参数 本接口无特有的返回参数,成功时 HTTP 状态码为 `200`,返回结构中 `Result` 为空对象 `{}`。 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=DeleteModelCustomizationJob&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "Id": "mcj-20240***-**" } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "20250115163836138227026138053A18", "Action": "DeleteModelCustomizationJob", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": {} } ``` --- # 获取模型调优任务信息 Source: https://ark.volcengine.com/region:cn-beijing/docs/get-model-customization-job-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=GetModelCustomizationJob&Version=2024-01-01` 获取模型训练任务信息 > **说明** > > - *Status.Phase* 反映任务当前阶段,常见取值包括 `Queue`(排队中)、`Running`(运行中)、`Completed`(已完成)、`Failed`(失败)、`Cancelled`(已取消)等。 > - 失败任务可通过 *Status.Resumable* 判断是否可恢复;若为 `true`,可调用 *ResumeModelCustomizationJob* 接口重试。 > - *Outputs* 数组按训练 Checkpoint 顺序列出产物;状态为 `Available` 的产物可发布为定制模型,`Exported` 表示已发布,`Expired` 表示已过期。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **Id** `string` `必选` | 模型调优任务 ID 模型调优任务 ID,格式如 `mcj-20240101000000-a1b2c`。可通过 ListModelCustomizationJobs 接口获取 ## 响应参数 **BillingMethod** `string` | 计费方式 调优任务的计费方式标识 **CreateTime** `string` | 创建时间 模型调优任务创建时间,UTC 时间,遵循 RFC 3339 格式 **CustomizationType** `string` | 训练类型 训练类型。取值范围:`FinetuneSft`、`FinetuneLoRA`、`Pretrain`、`DPOLoRA`、`DPO` **CustomRLPipelineConfig** `object` | RL 流水线配置 自定义强化学习流水线配置,包含流水线插件、Grader 混合器及 Teacher 配置等 **PipelinePlugins** `object[]` | 插件列表 `CustomRLPipelineConfig.PipelinePlugins` 自定义强化学习流水线的插件列表 **Name** `string` | 插件名称 `CustomRLPipelineConfig.PipelinePlugins.Name` 流水线插件名称 **Description** `string` | 插件描述 `CustomRLPipelineConfig.PipelinePlugins.Description` 流水线插件描述 **Embedded** `object` | 内嵌插件 `CustomRLPipelineConfig.PipelinePlugins.Embedded` 内嵌(Embedded)类型流水线插件的配置 **FunctionMeta** `object` | 函数元信息 `CustomRLPipelineConfig.PipelinePlugins.Embedded.FunctionMeta` 内嵌插件对应的函数元信息 **FunctionIdentifier** `string` | 函数标识 `CustomRLPipelineConfig.PipelinePlugins.Embedded.FunctionMeta.FunctionIdentifier` 函数唯一标识 **Source** `string` | 函数源 `CustomRLPipelineConfig.PipelinePlugins.Embedded.FunctionMeta.Source` 函数源地址或包标识 **SourceType** `string` | 源类型 `CustomRLPipelineConfig.PipelinePlugins.Embedded.FunctionMeta.SourceType` 函数源类型,例如代码包或镜像 **Type** `string` | 函数类型 `CustomRLPipelineConfig.PipelinePlugins.Embedded.FunctionMeta.Type` 函数类型标识 **FunctionConfig** `object` | 函数配置 `CustomRLPipelineConfig.PipelinePlugins.Embedded.FunctionConfig` 内嵌插件对应的函数运行配置 **CpuMilli** `integer` | CPU 配额 `CustomRLPipelineConfig.PipelinePlugins.Embedded.FunctionConfig.CpuMilli` 函数 CPU 配额,单位毫核(mCPU) **EnvVars** `object[]` | 环境变量 `CustomRLPipelineConfig.PipelinePlugins.Embedded.FunctionConfig.EnvVars` 函数运行时的环境变量键值对列表 **Key** `string` | 环境变量名 `CustomRLPipelineConfig.PipelinePlugins.Embedded.FunctionConfig.EnvVars.Key` **Value** `string` | 环境变量值 `CustomRLPipelineConfig.PipelinePlugins.Embedded.FunctionConfig.EnvVars.Value` **MaxConcurrency** `integer` | 最大并发 `CustomRLPipelineConfig.PipelinePlugins.Embedded.FunctionConfig.MaxConcurrency` 函数允许的最大并发数 **MaxReplica** `integer` | 最大副本 `CustomRLPipelineConfig.PipelinePlugins.Embedded.FunctionConfig.MaxReplica` 函数最大副本数 **MemoryMB** `integer` | 内存配额 `CustomRLPipelineConfig.PipelinePlugins.Embedded.FunctionConfig.MemoryMB` 函数内存配额,单位 MB **MinReplica** `integer` | 最小副本 `CustomRLPipelineConfig.PipelinePlugins.Embedded.FunctionConfig.MinReplica` 函数最小副本数 **RequestConcurrency** `integer` | 单实例并发 `CustomRLPipelineConfig.PipelinePlugins.Embedded.FunctionConfig.RequestConcurrency` 函数单实例并发请求数 **RequestTimeoutSeconds** `integer` | 请求超时 `CustomRLPipelineConfig.PipelinePlugins.Embedded.FunctionConfig.RequestTimeoutSeconds` 单次函数请求超时时长,单位秒 **Runtime** `string` | 运行时 `CustomRLPipelineConfig.PipelinePlugins.Embedded.FunctionConfig.Runtime` 函数运行时类型标识 **Tags** `object[]` | 标签列表 `CustomRLPipelineConfig.PipelinePlugins.Embedded.FunctionConfig.Tags` 函数关联的标签列表 **Key** `string` | 标签键 `CustomRLPipelineConfig.PipelinePlugins.Embedded.FunctionConfig.Tags.Key` **Value** `string` | 标签值 `CustomRLPipelineConfig.PipelinePlugins.Embedded.FunctionConfig.Tags.Value` **Weight** `number` | 流量权重 `CustomRLPipelineConfig.PipelinePlugins.Embedded.FunctionConfig.Weight` 函数流量分配权重 **Managed** `object` | 托管插件 `CustomRLPipelineConfig.PipelinePlugins.Managed` 托管(Managed)类型流水线插件的配置 **SID** `string` | 插件 SID `CustomRLPipelineConfig.PipelinePlugins.Managed.SID` 托管插件的 SID 标识 **FunctionConfig** `object` | 函数配置 `CustomRLPipelineConfig.PipelinePlugins.Managed.FunctionConfig` 托管插件对应的函数运行配置 **CpuMilli** `integer` | CPU 配额 `CustomRLPipelineConfig.PipelinePlugins.Managed.FunctionConfig.CpuMilli` 函数 CPU 配额,单位毫核(mCPU) **EnvVars** `object[]` | 环境变量 `CustomRLPipelineConfig.PipelinePlugins.Managed.FunctionConfig.EnvVars` 函数运行时的环境变量键值对列表 **Key** `string` | 环境变量名 `CustomRLPipelineConfig.PipelinePlugins.Managed.FunctionConfig.EnvVars.Key` **Value** `string` | 环境变量值 `CustomRLPipelineConfig.PipelinePlugins.Managed.FunctionConfig.EnvVars.Value` **MaxConcurrency** `integer` | 最大并发 `CustomRLPipelineConfig.PipelinePlugins.Managed.FunctionConfig.MaxConcurrency` 函数允许的最大并发数 **MaxReplica** `integer` | 最大副本 `CustomRLPipelineConfig.PipelinePlugins.Managed.FunctionConfig.MaxReplica` 函数最大副本数 **MemoryMB** `integer` | 内存配额 `CustomRLPipelineConfig.PipelinePlugins.Managed.FunctionConfig.MemoryMB` 函数内存配额,单位 MB **MinReplica** `integer` | 最小副本 `CustomRLPipelineConfig.PipelinePlugins.Managed.FunctionConfig.MinReplica` 函数最小副本数 **RequestConcurrency** `integer` | 单实例并发 `CustomRLPipelineConfig.PipelinePlugins.Managed.FunctionConfig.RequestConcurrency` 函数单实例并发请求数 **RequestTimeoutSeconds** `integer` | 请求超时 `CustomRLPipelineConfig.PipelinePlugins.Managed.FunctionConfig.RequestTimeoutSeconds` 单次函数请求超时时长,单位秒 **Runtime** `string` | 运行时 `CustomRLPipelineConfig.PipelinePlugins.Managed.FunctionConfig.Runtime` 函数运行时类型标识 **Tags** `object[]` | 标签列表 `CustomRLPipelineConfig.PipelinePlugins.Managed.FunctionConfig.Tags` 函数关联的标签列表 **Key** `string` | 标签键 `CustomRLPipelineConfig.PipelinePlugins.Managed.FunctionConfig.Tags.Key` **Value** `string` | 标签值 `CustomRLPipelineConfig.PipelinePlugins.Managed.FunctionConfig.Tags.Value` **Weight** `number` | 流量权重 `CustomRLPipelineConfig.PipelinePlugins.Managed.FunctionConfig.Weight` 函数流量分配权重 **Tags** `object[]` | 标签列表 `CustomRLPipelineConfig.PipelinePlugins.Tags` 流水线插件关联的标签列表 **Key** `string` | 标签键 `CustomRLPipelineConfig.PipelinePlugins.Tags.Key` **Value** `string` | 标签值 `CustomRLPipelineConfig.PipelinePlugins.Tags.Value` **GraderMixer** `string` | 评分混合 `CustomRLPipelineConfig.GraderMixer` 用于评估的 Grader 混合器配置(字符串形式) **TeacherConfigs** `string` | Teacher 配置 `CustomRLPipelineConfig.TeacherConfigs` Teacher 模型配置(字符串形式) **CustomTLSConfig** `object` | 自定义日志 自定义日志投递的火山引擎日志服务(TLS)配置 **ProjectID** `string` | TLS 项目 ID `CustomTLSConfig.ProjectID` 火山引擎日志服务(TLS)项目 ID **TopicID** `string` | TLS 主题 ID `CustomTLSConfig.TopicID` 火山引擎日志服务(TLS)日志主题 ID **Data** `object` | 数据集配置 模型调优使用的数据集配置,包含训练集、验证集及加密相关字段 **TrainingSet** `object` | 训练数据集 `Data.TrainingSet` 训练阶段使用的数据集配置 **Datasets** `object[]` | 数据集列表 `Data.TrainingSet.Datasets` 数据集列表。此字段非空时表示使用数据集数据训练,不可与 `TosBucket`、`TosPaths` 同时存在 **DatasetId** `string` | 数据集 ID `Data.TrainingSet.Datasets.DatasetId` 调优所引用的数据集 ID **DatasetVersionId** `string` | 版本 ID `Data.TrainingSet.Datasets.DatasetVersionId` 数据集的具体版本 ID **Multiplier** `string` | 采样倍率 `Data.TrainingSet.Datasets.Multiplier` 该数据集相对整体训练集的采样倍率 **SampleCount** `number` | 样本数 `Data.TrainingSet.Datasets.SampleCount` 该数据集贡献的采样样本数 **PresetData** `string` | 预置数据集名称 `Data.TrainingSet.PresetData` 预置数据集名称,不填则不使用预置数据集 **PresetDataPercentage** `integer` | 预置数据集占比 `Data.TrainingSet.PresetDataPercentage` 预置数据集使用百分比(0-100),仅在填写 `PresetData` 时生效 **PresetDatasets** `object[]` | 预置数据集列表 `Data.TrainingSet.PresetDatasets` 预置数据集列表,元素结构见 `PresetDataset` **DatasetVersionId** `string` | 预置版本 ID `Data.TrainingSet.PresetDatasets.DatasetVersionId` 预置数据集的版本 ID **InjectMultiplier** `string` | 混入倍率 `Data.TrainingSet.PresetDatasets.InjectMultiplier` 预置数据集相对训练集的混入倍率 **InjectSampleCount** `number` | 混入样本数 `Data.TrainingSet.PresetDatasets.InjectSampleCount` 预置数据集混入的样本数 **TosBucket** `string` | TOS 桶名 `Data.TrainingSet.TosBucket` TOS 桶名,需与 `TosPaths` 同时存在。此字段非空时表示直接使用 TOS 数据训练,不可与 `Datasets` 同时存在 **TosPaths** `string[]` | TOS 存储路径列表 `Data.TrainingSet.TosPaths` TOS 存储路径列表,需与 `TosBucket` 同时存在。此字段非空时表示直接使用 TOS 数据训练,不可与 `Datasets` 同时存在 **EncryptionKeyringType** `string` | 加密密钥类型 `Data.EncryptionKeyringType` 数据集加密密钥类型取值范围:`ManagedKeyring`、`CustomKeyring`。默认值:`ManagedKeyring` **KMSTrn** `string` | 加密密钥 TRN `Data.KMSTrn` 加密密钥的 TRN,可在 KMS 控制台中获取。`EncryptionKeyringType` 为 `ManagedKeyring`(默认)时自动生成且不可填写;为 `CustomKeyring` 时必填 **ValidationPercentage** `integer` | 验证集占比 `Data.ValidationPercentage` 从训练集划分作为验证集的比例(0-100) **ValidationSet** `object` | 验证数据集 `Data.ValidationSet` 验证阶段使用的数据集配置 **Datasets** `object[]` | 数据集列表 `Data.ValidationSet.Datasets` 验证数据集列表,元素结构见 `DatasetItem` **DatasetId** `string` | 数据集 ID `Data.ValidationSet.Datasets.DatasetId` 调优所引用的数据集 ID **DatasetVersionId** `string` | 版本 ID `Data.ValidationSet.Datasets.DatasetVersionId` 数据集的具体版本 ID **Multiplier** `string` | 采样倍率 `Data.ValidationSet.Datasets.Multiplier` 该数据集相对整体训练集的采样倍率 **SampleCount** `number` | 样本数 `Data.ValidationSet.Datasets.SampleCount` 该数据集贡献的采样样本数 **TosBucket** `string` | TOS 桶名 `Data.ValidationSet.TosBucket` TOS 桶名,需与 `TosPaths` 同时存在。此字段非空时表示直接使用 TOS 数据验证,不可与 `Datasets` 同时存在 **TosPaths** `string[]` | TOS 存储路径列表 `Data.ValidationSet.TosPaths` TOS 存储路径列表,需与 `TosBucket` 同时存在。此字段非空时表示直接使用 TOS 数据验证,不可与 `Datasets` 同时存在 **DebugConfig** `object` | 调试配置 调优任务的调试相关配置 **RLDebugConfig** `object` | RL 调试配置 `DebugConfig.RLDebugConfig` 强化学习调试配置,包含调试用接入点和 API Key **APIKey** `string` | API Key `DebugConfig.RLDebugConfig.APIKey` 强化学习调试使用的 API Key **EndpointID** `string` | 调试接入点 ID `DebugConfig.RLDebugConfig.EndpointID` 强化学习调试使用的推理接入点 ID **Description** `string` | 任务描述 模型调优任务描述 **EnableTrajectory** `boolean` | 是否启用训练轨迹 是否启用训练轨迹(Trajectory)采集与投递 **ExplainabilityTLSConfig** `object` | 可解释性日志 训练可解释性数据投递的火山引擎日志服务(TLS)配置 **ProjectID** `string` | TLS 项目 ID `ExplainabilityTLSConfig.ProjectID` 火山引擎日志服务(TLS)项目 ID **TopicID** `string` | TLS 主题 ID `ExplainabilityTLSConfig.TopicID` 火山引擎日志服务(TLS)日志主题 ID **Hyperparameters** `object[]` | 超参数列表 模型调优配置的超参数列表,元素为 `Name`/`Value` 键值对 **Name** `string` | 超参数名称 `Hyperparameters.Name` 超参数名称,例如 `epoch`、`learning_rate` **Value** `string` | 超参数值 `Hyperparameters.Value` 超参数取值(字符串形式) **Id** `string` | 任务 ID 模型调优任务资源 ID,格式如 `mcj-20240101000000-a1b2c` **ModelReference** `object` | 基础模型 模型调优基于的模型,可为基础模型或已有定制模型 **CustomModelId** `string` | 自定义模型 ID `ModelReference.CustomModelId` 已有定制模型 ID **FoundationModel** `object` | 基础模型引用 `ModelReference.FoundationModel` 调优基于的基础模型引用 **ModelVersion** `string` | 模型版本 `ModelReference.FoundationModel.ModelVersion` 基础模型版本号 **Name** `string` | 模型名称 `ModelReference.FoundationModel.Name` 基础模型名称,例如 `doubao-seed-2-1-pro-260628` **Name** `string` | 任务名称 模型调优任务名称 **OutputConfig** `object` | 产物输出 调优产物输出相关的配置项 **OutputCompressionStrategies** `string[]` | 产物压缩策略 `OutputConfig.OutputCompressionStrategies` 产物输出时使用的压缩策略列表 **Outputs** `object[]` | 产物列表 模型调优产生的检查点(CheckPoint)产物列表,可用于后续模型发布或部署 **Index** `integer` | 产物索引 `Outputs.Index` 产物在该调优任务中的索引序号 **Name** `string` | 产物名称 `Outputs.Name` 调优产物名称,如 `global_step_1` **Status** `string` | 产物状态 `Outputs.Status` 调优产物状态。取值范围:`Available`(可用)、`Exported`(已发布)、`Expired`(已过期) **CustomModelCreateTimeUnix** `number` | 模型创建时间 `Outputs.CustomModelCreateTimeUnix` 定制模型创建时间,Unix 时间戳(秒) **CustomModelId** `string` | 自定义模型 ID `Outputs.CustomModelId` 调优产物已发布为定制模型时对应的定制模型 ID **ProjectName** `string` | 所属项目 调优任务所属的火山引擎项目名称 **PublishedOutputCount** `integer` | 已发布数 已发布为定制模型的调优产物数量 **Reason** `string` | 失败原因 任务失败时的失败原因,取值如 `InvalidData`、`InternalError`、`UnknownError` 等 **Resource** `object` | 资源配置 调优任务使用的计算资源规格 **Memory** `integer` | 内存大小 `Resource.Memory` 分配给调优任务的内存大小,单位 MB **VCpu** `integer` | CPU 核数 `Resource.VCpu` 分配给调优任务的 CPU 核数(vCPU) **GpuNum** `integer` | GPU 数量 `Resource.GpuNum` 分配给调优任务的 GPU 卡数 **RdmaEniCount** `integer` | RDMA 网卡数 `Resource.RdmaEniCount` 分配给调优任务的 RDMA 弹性网卡数量 **VRdmaEniCount** `integer` | 虚拟 RDMA 网卡 `Resource.VRdmaEniCount` 分配给调优任务的虚拟 RDMA 弹性网卡数量 **SaveModelLimit** `integer` | 保存模型上限 调优任务可保存的模型产物数量上限 **Status** `object` | 任务状态 模型调优任务的运行状态,包含阶段、耗时、Token 用量等 **Phase** `string` | 任务阶段 `Status.Phase` 调优任务当前所处阶段,例如 `Queue`、`Running`、`Completed`、`Failed` 等 **PhaseTime** `string` | 阶段时间戳 `Status.PhaseTime` 任务进入当前阶段的时间戳,UTC 时间,遵循 RFC 3339 格式 **RetryLimit** `integer` | 最大重试次数 `Status.RetryLimit` 任务允许的最大重试次数 **BillableTokens** `number` | 计费 Token 数 `Status.BillableTokens` 用于计费的训练 tokens 数量 **Message** `string` | 状态说明信息 `Status.Message` 对当前任务所处状态的解释性信息 **OutputExpiredTime** `string` | 产物过期时间 `Status.OutputExpiredTime` 调优产物(如有)计划过期的时间戳,UTC 时间,遵循 RFC 3339 格式 **QueuePosition** `integer` | 队列位次 `Status.QueuePosition` 排队状态下任务在所属队列中的当前位次 **Resumable** `boolean` | 是否可重试 `Status.Resumable` 任务处于失败状态时,是否可以被重试 **RetryCount** `integer` | 已重试次数 `Status.RetryCount` 任务已经失败重试的次数 **TrainingTokensPerEpoch** `number` | 单轮训练 Token 数 `Status.TrainingTokensPerEpoch` 数据集总 tokens 数,包括训练集、验证集和混入数据 **Tags** `object[]` | 标签列表 模型调优任务关联的标签列表,元素为 `Key`/`Value` 键值对 **Key** `string` | 标签键 `Tags.Key` **Value** `string` | 标签值 `Tags.Value` **TotalOutputCount** `integer` | 产物总数 调优任务产生的全部检查点产物总数 **TraceTLSConfig** `object` | Trace 日志 训练 Trace 日志投递的火山引擎日志服务(TLS)配置 **ProjectID** `string` | TLS 项目 ID `TraceTLSConfig.ProjectID` 火山引擎日志服务(TLS)项目 ID **TopicID** `string` | TLS 主题 ID `TraceTLSConfig.TopicID` 火山引擎日志服务(TLS)日志主题 ID **TrainingMetrics** `object[]` | 训练指标 训练过程指标列表,元素结构见 `Metric` **Name** `string` | 指标名称 `TrainingMetrics.Name` 指标名称,如 `train/loss`、`eval/loss` 等 **TargetValue** `integer` | 目标值 `TrainingMetrics.TargetValue` 指标的目标值或参考值 **Type** `string` | 类型 `TrainingMetrics.Type` 指标类型,取值如 `External`、`Pods`(默认) **TrainType** `string` | 训练任务类型 训练任务类型标识 **TrajectoryTLSConfig** `object` | Trajectory 日志 训练轨迹(Trajectory)日志投递的火山引擎日志服务(TLS)配置 **ProjectID** `string` | TLS 项目 ID `TrajectoryTLSConfig.ProjectID` 火山引擎日志服务(TLS)项目 ID **TopicID** `string` | TLS 主题 ID `TrajectoryTLSConfig.TopicID` 火山引擎日志服务(TLS)日志主题 ID **UpdateTime** `string` | 更新时间 模型调优任务最近一次更新时间,UTC 时间,遵循 RFC 3339 格式 **ValidationMetrics** `object[]` | 验证指标 验证过程指标列表,元素结构见 `Metric` **Name** `string` | 指标名称 `ValidationMetrics.Name` 指标名称,如 `train/loss`、`eval/loss` 等 **TargetValue** `integer` | 目标值 `ValidationMetrics.TargetValue` 指标的目标值或参考值 **Type** `string` | 类型 `ValidationMetrics.Type` 指标类型,取值如 `External`、`Pods`(默认) ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=GetModelCustomizationJob&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "Id": "mcj-20240101000000-a1b2cr" } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "2025011511564424916310121745440A", "Action": "GetModelCustomizationJob", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "CreateTime": "2024-04-01T11:54:41Z", "CustomizationType": "FinetuneLoRA", "Data": { "TrainingSet": { "TosBucket": "ark-auto-2100466578-cn-beijing-default", "TosPaths": [ "model-customization-job-training-set/1740646772293/train_5k.jsonl" ] }, "EncryptionKeyringType": "ManagedKeyring", "KMSTrn": "trn:kms:cn-beijing:2100466578:keyrings/managed_ark_keyring/keys/modelcustomization" }, "Id": "mcj-20240401114541-5gzd8", "Hyperparameters": [ { "Name": "epoch", "Value": "6" }, { "Name": "learning_rate", "Value": "0.00001" } ], "Description": "这是一个测试任务", "ModelReference": { "FoundationModel": { "Name": "doubao-seed-2-0-pro", "ModelVersion": "260215" } }, "Outputs": [{ "Index": 1, "Name": "global_step_1", "Status": "Exported" }], "ProjectName": "default", "Name": "测试任务", "PublishedOutputCount": 1, "Reason": "", "SaveModelLimit": 1, "Status": { "Phase": "Completed", "PhaseTime": "2024-04-04T07:04:29Z", "RetryLimit": 1 }, "Tags": [{ "Key": "sys:ark:createdBy", "Value": "IAMUser/23454321/test.user@bytedance.com" }], "TotalOutputCount": 1, "UpdateTime": "2024-04-04T07:04:29Z" } } ``` --- # 查询精调效果指标详细数据 Source: https://ark.volcengine.com/region:cn-beijing/docs/get-model-customization-job-metric-data-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=GetModelCustomizationJobMetricData&Version=2024-01-01` 查询精调效果指标详细数据接口,用于获取模型精调任务在训练过程中的效果指标(如 train/loss、eval/loss 等)的打点数据。 > **说明** > > - 指标数据按训练 Step 采样返回;当指定的 *MinSampleStep* 大于系统根据 *MaxMetricPoint* 计算出的步长时,以 *MinSampleStep* 为准。 > - 单次请求每个指标最多返回 *MaxMetricPoint* 个采样点,超出范围将自动降采样。 > - 指标数据仅在任务结束后保留有限时间,过期任务的指标可能无法查询。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **FromStep** `integer` `必选` | 查询的起点 step **Metrics** `string[]` `必选` | 指标名称列表 指标名称列表。可通过 *GetModelCustomizationJobMetrics* 接口获取可用指标名,例如 `train/loss`、`eval/loss`、`train/total_tokens` 等。 **ModelCustomizationJobId** `string` `必选` | 精调任务 ID 精调任务 ID,格式如 mcj-20241128104838-g9vqg **ToStep** `integer` `必选` | 查询的终点 step **MaxMetricPoint** `string` `默认值 500` | 单个指标的最多返 单个指标最多返回的采样打点数上限。 **MinSampleStep** `string` | 最小采样步长 最小采样步长。当指定值大于系统根据 *MaxMetricPoint* 计算出的步长时,以此值生效。 ## 响应参数 **Items** `object[]` | 指标数据列表 指标数据列表,每个元素包含一个指标的采样数据 **Metric** `string` | 指标名称 `Items.Metric` **Samples** `object[]` | 指标数据 `Items.Samples` **Step** `integer` | Step 序号 `Items.Samples.Step` 第几步 **Value** `string` | 打点值 `Items.Samples.Value` 上报的打点值 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=GetModelCustomizationJobMetricData&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "ModelCustomizationJobId": "mcj-20241128104838-g9vqg", "Metrics": [ "train/total_tokens", "eval/loss", "train/loss", "eval/total_tokens" ] } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "20241212201041E7A67D3F69E447553B", "Action": "GetModelCustomizationJobMetricData", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "Items": [ { "Metric": "train/total_tokens", "Samples": [ { "Step": 1, "Value": 41422 }, { "Step": 2, "Value": 82844 } ] }, { "Metric": "eval/loss", "Samples": [ { "Step": 1, "Value": 0.0725 }, { "Step": 2, "Value": 0.0625 } ] }, { "Metric": "train/loss", "Samples": [ { "Step": 1, "Value": 0.0625 }, { "Step": 2, "Value": 0.0525 } ] } ] } } ``` --- # 查询精调效果指标 Source: https://ark.volcengine.com/region:cn-beijing/docs/get-model-customization-job-metrics-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=GetModelCustomizationJobMetrics&Version=2024-01-01` 查询精调任务的效果指标名称列表,返回的指标名称可用于 GetModelCustomizationJobMetricData 接口获取详细指标数据。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **ModelCustomizationJobId** `string` `必选` | 模型精调任务 ID 模型精调任务 ID,格式如 `mcj-20241128104838-g9vqg`。可通过 ListModelCustomizationJobs 接口获取 ## 响应参数 **Metrics** `string[]` | 指标名称列表 指标名称列表。返回的指标名称可作为 *GetModelCustomizationJobMetricData* 接口的 *Metrics* 入参,用于查询指标的详细打点数据。常见取值包括 `train/loss`、`eval/loss`、`train/total_tokens`、`eval/total_tokens` 等。 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=GetModelCustomizationJobMetrics&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "ModelCustomizationJobId": "mcj-20241128104838-g9vqg" } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "20241212162159B48FBC86E8E61A44B1", "Action": "GetModelCustomizationJobMetrics", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "Metrics": [ "eval/loss", "eval/total_tokens", "train/loss", "train/total_tokens" ] } } ``` --- # 获取模型调优任务列表 Source: https://ark.volcengine.com/region:cn-beijing/docs/list-model-customization-jobs-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=ListModelCustomizationJobs&Version=2024-01-01` 获取模型调优任务列表,支持按条件筛选、分页查询和排序。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **Filter** `object` | 过滤条件 模型调优任务过滤条件 **CreateTimeAfter** `string` | 创建时间晚于 `Filter.CreateTimeAfter` 创建时间过滤条件,格式为 RFC3339 时间戳,过滤创建时间晚于该时间戳的模型调优任务 **CreateTimeBefore** `string` | 创建时间早于 `Filter.CreateTimeBefore` 创建时间过滤条件,格式为 RFC3339 时间戳,过滤创建时间早于该时间戳的模型调优任务 **CustomizationTypes** `string[]` | 调优类型过滤 `Filter.CustomizationTypes` 调优类型过滤条件 **CustomModelIds** `string[]` | 定制模型 ID 过滤 `Filter.CustomModelIds` 定制模型 ID 过滤条件 **FoundationModels** `object[]` | 基座模型过滤 `Filter.FoundationModels` 基座模型过滤条件 **Name** `string` `必选` | 模型名称 `Filter.FoundationModels.Name` 基础模型名称 **ModelVersions** `string[]` | 模型版本 `Filter.FoundationModels.ModelVersions` 基础模型版本 **Ids** `string[]` | 任务 ID 过滤 `Filter.Ids` ID 过滤条件 **Name** `string` | 任务名过滤 `Filter.Name` 模型调优任务名过滤条件(模糊匹配) **Phases** `string[]` | 状态过滤 `Filter.Phases` 模型调优任务状态过滤条件 **ResourceGroup** `string` | 资源组 ID `Filter.ResourceGroup` 资源组 id **PageNumber** `integer` `默认值 1` | 翻页页码 翻页页码,从 1 开始计数。 **PageSize** `integer` `默认值 10` | 每页记录数 每页返回的记录数量。 **ProjectName** `string` | 项目名称 项目名称过滤条件,用于筛选指定项目下的调优任务 **SortBy** `string` `默认值 CreateTime` | 排序字段 排序字段。取值:`CreateTime`(按创建时间排序)。 **SortOrder** `string` `默认值 Desc` | 排序顺序 排序顺序。取值:`Desc`(降序)、`Asc`(升序)。 **TagFilters** `object[]` | 标签过滤条件 按标签过滤调优任务 **Key** `string` `必选` | 标签键 `TagFilters.Key` **Values** `string[]` | 标签值列表 `TagFilters.Values` 标签值 ## 响应参数 **Items** `object[]` | 调优任务列表 当前页的模型调优任务列表 **CreateTime** `string` | 创建时间 `Items.CreateTime` 资源创建时间戳 **CustomizationType** `string` | 训练类型 `Items.CustomizationType` 训练类型。取值范围:`FinetuneSft`、`FunetuneLoRA`、`Pretrain`、`DPOLoRA`、`DPO`。 **Data** `object` | 数据集配置 `Items.Data` 模型微调使用的数据集 **TrainingSet** `object` | 训练数据集 `Items.Data.TrainingSet` **Datasets** `object[]` | 数据集列表 `Items.Data.TrainingSet.Datasets` 数据集列表,当此字段不为空时表示使用数据集数据训练。不可与 TosBucket,TosPaths 同时存在 **DatasetId** `string` | 数据集 ID `Items.Data.TrainingSet.Datasets.DatasetId` **DatasetVersionId** `string` | 版本 ID `Items.Data.TrainingSet.Datasets.DatasetVersionId` 数据集版本 ID **Multiplier** `string` | 采样倍率 `Items.Data.TrainingSet.Datasets.Multiplier` **SampleCount** `number` | 样本数 `Items.Data.TrainingSet.Datasets.SampleCount` 采样的样本数 **PresetData** `string` | 预置数据集名 `Items.Data.TrainingSet.PresetData` 预置数据集名称,不填不适用预置数据集 **PresetDataPercentage** `integer` | 预置数据集比例 `Items.Data.TrainingSet.PresetDataPercentage` 预置数据集使用百分比(0-100),仅在填写了 PresetData 时有效 **PresetDatasets** `object[]` | 预置数据集列表 `Items.Data.TrainingSet.PresetDatasets` **DatasetVersionId** `string` | 预置数据集版本 `Items.Data.TrainingSet.PresetDatasets.DatasetVersionId` **InjectMultiplier** `string` | 混入倍率 `Items.Data.TrainingSet.PresetDatasets.InjectMultiplier` 预置数据集混入倍率 **InjectSampleCount** `number` | 混入样本数 `Items.Data.TrainingSet.PresetDatasets.InjectSampleCount` 预置数据集混入的样本数 **TosBucket** `string` | TOS 桶名 `Items.Data.TrainingSet.TosBucket` TOS 桶名,需与 TosPaths 同时存在,当此字段不为空时表示使用直接使用 TOS 数据训练,不可与 Datasets 同时存在 **TosPaths** `string[]` | TOS 存储路径 `Items.Data.TrainingSet.TosPaths` TOS 存储路径,需与 TosBucket 同时存在,当此字段不为空时表示使用直接使用 TOS 数据训练,不可与 Datasets 同时存在 **EncryptionKeyringType** `string` | 加密密钥类型 `Items.Data.EncryptionKeyringType` 数据集加密密钥类型。取值范围:`ManagedKeyring`、`CustomKeyring`。默认值:`ManagedKeyring` **KMSTrn** `string` | KMS 密钥 TRN `Items.Data.KMSTrn` 加密密钥 TRN,可在 KMS 控制台获取。当 *EncryptionKeyringType* 为 `ManagedKeyring`(默认)时自动生成且不可填写;为 `CustomKeyring` 时必填。 **ValidationPercentage** `integer` | 验证集比例 `Items.Data.ValidationPercentage` 使用训练集数据作为验证集的比例(0-100) **ValidationSet** `object` | 验证数据集 `Items.Data.ValidationSet` **Datasets** `object[]` | 数据集列表 `Items.Data.ValidationSet.Datasets` **DatasetId** `string` | 数据集 ID `Items.Data.ValidationSet.Datasets.DatasetId` **DatasetVersionId** `string` | 版本 ID `Items.Data.ValidationSet.Datasets.DatasetVersionId` 数据集版本 ID **Multiplier** `string` | 采样倍率 `Items.Data.ValidationSet.Datasets.Multiplier` **SampleCount** `number` | 样本数 `Items.Data.ValidationSet.Datasets.SampleCount` 采样的样本数 **TosBucket** `string` | TOS 桶名 `Items.Data.ValidationSet.TosBucket` TOS 桶名,需与 TosPaths 同时存在,当此字段不为空时表示使用直接使用 TOS 数据,不可与 Datasets 同时存在 **TosPaths** `string[]` | TOS 存储路径 `Items.Data.ValidationSet.TosPaths` TOS 存储路径,需与 TosBucket 同时存在,当此字段不为空时表示使用直接使用 TOS 数据,不可与 Datasets 同时存在 **Id** `string` | 任务 ID `Items.Id` 模型调优任务资源 ID **ModelReference** `object` | 基础模型 `Items.ModelReference` 微调基于的模型 **CustomModelId** `string` | 定制模型 ID `Items.ModelReference.CustomModelId` 定制模型的 ID **FoundationModel** `object` | 基础模型 `Items.ModelReference.FoundationModel` **ModelVersion** `string` | 模型版本 `Items.ModelReference.FoundationModel.ModelVersion` 基础模型版本 **Name** `string` | 模型名称 `Items.ModelReference.FoundationModel.Name` 基础模型名称 **Name** `string` | 任务名称 `Items.Name` 模型调优任务名称 **ProjectName** `string` | 项目名 `Items.ProjectName` **PublishedOutputCount** `integer` | 已导出产物数 `Items.PublishedOutputCount` 已导出模型产物总数 **SaveModelLimit** `integer` | 保存模型上限 `Items.SaveModelLimit` SaveModel 数量的最大限制 **Status** `object` | 任务状态 `Items.Status` 模型精调任务状态 **Phase** `string` | 任务阶段 `Items.Status.Phase` 模型微调任务状态 **PhaseTime** `string` | 阶段时间戳 `Items.Status.PhaseTime` 模型微调任务进入到当前状态的时间戳 **RetryLimit** `integer` | 重试次数上限 `Items.Status.RetryLimit` 模型精调任务可以被重试的次数上限 **BillableTokens** `number` | 计费 tokens 数 `Items.Status.BillableTokens` 训练 tokens 量,用于精调任务计费 **Message** `string` | 状态说明 `Items.Status.Message` 对当前模型微调任务所处状态的解释性信息 **OutputExpiredTime** `string` | 产物过期时间 `Items.Status.OutputExpiredTime` 模型微调产物(如果有)计划过期的时间戳 **QueuePosition** `integer` | 排队位次 `Items.Status.QueuePosition` 排队时,模型微调任务在所属队列中的当前位次 **Resumable** `boolean` | 是否可重试 `Items.Status.Resumable` 任务处于失败状态时,是否可以被重试 **RetryCount** `integer` | 重试次数 `Items.Status.RetryCount` 模型微调任务已经失败重试的次数 **TrainingTokensPerEpoch** `number` | 单轮训练 tokens `Items.Status.TrainingTokensPerEpoch` 数据集总 tokens,包括训练集、验证集和混入数据 **UpdateTime** `string` | 更新时间 `Items.UpdateTime` 资源更新时间戳 **Description** `string` | 任务描述 `Items.Description` 模型调优任务描述 **Hyperparameters** `object[]` | 超参数列表 `Items.Hyperparameters` 微调配置的超参数 **Name** `string` | 超参数名 `Items.Hyperparameters.Name` 超参数的参数名 **Value** `string` | 超参数值 `Items.Hyperparameters.Value` 超参数的参数值 **Outputs** `object[]` | 精调产物列表 `Items.Outputs` 精调产物 **Index** `integer` | 产物索引 `Items.Outputs.Index` 索引 **Name** `string` | 产物名称 `Items.Outputs.Name` 模型产物名称 **Status** `string` | 产物状态 `Items.Outputs.Status` 模型产物状态。可选值:`Available`、`Exported`、`Expired`。 **CustomModelCreateTimeUnix** `number` | 模型创建时间 `Items.Outputs.CustomModelCreateTimeUnix` 自定义模型创建时间 **CustomModelId** `string` | 自定义模型 ID `Items.Outputs.CustomModelId` 自定义模型 id **Reason** `string` | 失败原因 `Items.Reason` 失败任务原因。可选值:`InvalidData`、`InternalError`、`UnknownError`。 **Tags** `object[]` | 标签列表 `Items.Tags` 标签 **Key** `string` | 标签键 `Items.Tags.Key` **Value** `string` | 标签值 `Items.Tags.Value` **TotalOutputCount** `integer` | 产物总数 `Items.TotalOutputCount` 精调产物总数 **PageNumber** `integer` | 当前页码 翻页页码,从 1 开始计数。默认值为 1 **PageSize** `integer` | 每页记录数 每页返回的记录数量。默认值为 10 **TotalCount** `integer` | 总记录数 符合查询条件的调优任务总数 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=ListModelCustomizationJobs&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "PageNumber": 1, "PageSize": 10, "ProjectName": "default", "TagFilters": [ { "Key": "sys:ark:createdBy", "Values": ["IAMUser/23454321/test.user@bytedance.com"] } ], "Filter": { "Ids": ["mcj-20240101000000-a1b2c"] } } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "20240401114541B47C3EAD9F6D204E77", "Action": "ListModelCustomizationJobs", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "TotalCount": 1, "PageNumber": 1, "PageSize": 10, "Items": [ { "Id": "mcj-20240401114541-5gzd8", "Name": "测试任务", "Description": "这是一个测试任务", "Tags": [ { "Key": "sys:ark:createdBy", "Value": "IAMUser/23454321/test.user@bytedance.com" } ], "ProjectName": "default", "CustomizationType": "FinetuneLoRA", "ModelReference": { "FoundationModel": { "Name": "doubao-seed-2-0-pro", "ModelVersion": "260215", "ConfigurationId": "fmvc-20240401114541-8h9pk" } }, "Hyperparameters": [ { "Name": "epoch", "Value": "6" }, { "Name": "learning_rate", "Value": "0.00001" } ], "SaveModelLimit": 1, "Data": { "TrainingSet": { "TosBucket": "ark-auto-2100466578-cn-beijing-default", "TosPaths": [ "model-customization-job-upload-set/1712561985763/test.jsonl" ] } }, "Status": { "Phase": "Completed", "PhaseTime": "2024-04-04T07:04:29Z" }, "CreateTime": "2024-04-01T11:54:41Z", "UpdateTime": "2024-04-04T07:04:29Z" } ] } } ``` --- # 重试模型调优任务 Source: https://ark.volcengine.com/region:cn-beijing/docs/resume-model-customization-job-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=ResumeModelCustomizationJob&Version=2024-01-01` 调用本接口重试因可恢复错误失败的模型调优任务(精调任务)。当任务因临时性故障(如资源不足、网络波动等)失败后,可通过本接口在不重新创建任务的情况下从断点继续训练,保留原任务的训练配置、数据集与已产生的中间产物。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **Id** `string` `必选` | 模型调优任务 ID 待重试的模型调优任务的 ID。可通过 [获取模型调优任务列表](/docs/list-model-customization-jobs-api) 接口查询,仅处于失败状态的任务支持重试 ## 响应参数 本接口无特有的返回参数,成功时 HTTP 状态码为 `200`,返回结构中 `Result` 为空对象 `{}`。 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=ResumeModelCustomizationJob&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "Id": "mcj-20240101000000-a1b2c" } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "20240404070429C58D4FBE0F7E315F88", "Action": "ResumeModelCustomizationJob", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": {} } ``` --- # 停止模型调优任务 Source: https://ark.volcengine.com/region:cn-beijing/docs/terminate-model-customization-job-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=TerminateModelCustomizationJob&Version=2024-01-01` 调用本接口停止正在执行的模型调优任务(精调任务)。仅支持停止处于运行中或排队中的任务;任务停止后将进入已取消状态,已产生的训练资源费用不退还。如需删除已终止的任务记录,可继续调用 [删除模型调优任务](/docs/delete-model-customization-job-api)。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **Id** `string` `必选` | 模型调优任务 ID 待停止的模型调优任务的 ID。可通过 [获取模型调优任务列表](/docs/list-model-customization-jobs-api) 接口查询 ## 响应参数 本接口无特有的返回参数,成功时 HTTP 状态码为 `200`,返回结构中 `Result` 为空对象 `{}`。 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=TerminateModelCustomizationJob&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "Id": "mcj-20240710130531-57fch" } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "202501151637080932522361157D1536", "Action": "TerminateModelCustomizationJob", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": {} } ``` --- # 更新模型调优任务 Source: https://ark.volcengine.com/region:cn-beijing/docs/update-model-customization-job-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=UpdateModelCustomizationJob&Version=2024-01-01` 调用本接口更新已创建的模型调优任务(精调任务)的可变属性,包括任务名称、描述以及调度优先级。仅 `Name`、`Description`、`Priority` 三类元数据支持在任务创建后修改;训练数据集、超参数、基础模型等核心训练配置一经创建即不可变更,如需调整请通过 [创建模型调优任务](/docs/create-model-customization-job-api) 重新创建任务。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **Id** `string` `必选` | 模型调优任务 ID 待更新的模型调优任务的 ID。可通过 [获取模型调优任务列表](/docs/list-model-customization-jobs-api) 接口查询 **Description** `string` | 任务描述 待更新的模型调优任务描述,可用于补充任务用途、训练目标等业务备注信息 **Name** `string` | 任务名称 待更新的模型调优任务名称,用于在控制台和接口返回中标识该任务,建议使用具备业务可读性的命名 **Priority** `string` | 调度优先级模式 待更新的模型调优任务调度优先级模式。`Allocated` 表示使用预留资源调度,优先级较高;`Spot` 表示使用抢占式资源调度,成本更低但可能被高优任务抢占 ## 响应参数 本接口无特有的返回参数,成功时 HTTP 状态码为 `200`,返回结构中 `Result` 为空对象 `{}`。 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=UpdateModelCustomizationJob&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "Id": "mcj-20240710130531-57fch", "Name": "MyUpdatedJobName", "Description": "Updated description for retraining with larger dataset" } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "20250115163612164250161131A08F01", "Action": "UpdateModelCustomizationJob", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": {} } ``` --- # 开启推理接入点 Source: https://ark.volcengine.com/region:cn-beijing/docs/start-endpoint-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=StartEndpoint&Version=2024-01-01` 启动指定的推理接入点,使其从已停止状态恢复为可用状态。 > **说明:注意** > > 仅处于关闭状态(`Stopped`)的接入点支持开启操作;已处于运行状态(`Running`)的接入点重复开启会返回错误。开启操作为异步执行,调用成功后接入点将进入启动中(`Starting`)状态,并在就绪后转为运行中(`Running`)状态。后付费模式下,接入点进入 `Running` 状态后开始计费。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **Id** `string` `必选` | 推理接入点 ID 待开启的推理接入点(Endpoint)ID,以 `ep-` 开头。可在火山方舟控制台的「推理接入点」页面查看,或通过 *ListEndpoints* 接口获取。 ## 响应参数 本接口无特有的返回参数,成功时 HTTP 状态码为 `200`,返回结构中 `Result` 为空对象 `{}`。 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=StartEndpoint&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "Id": "test-ep-id" } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "202405142133340440650771964D358D", "Action": "StartEndpoint", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": {} } ``` --- # 停止推理接入点 Source: https://ark.volcengine.com/region:cn-beijing/docs/stop-endpoint-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=StopEndpoint&Version=2024-01-01` 停止指定的推理接入点(Endpoint)。停止后接入点不再接收推理请求,可通过 *StartEndpoint* 接口重新启动。 > **说明:注意** > > 仅处于运行中(`Running`)状态的接入点支持停止操作;已处于关闭状态(`Stopped`)的接入点重复调用会返回错误。停止操作为异步执行,调用成功后接入点进入停止中(`Stopping`)状态,完成后转为 `Stopped`,停止期间不再接受推理请求;后付费模式下,接入点停止后不再计费。可通过 *StartEndpoint* 接口重新启动。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **Id** `string` `必选` | 推理接入点 ID 待停止的推理接入点(Endpoint)ID。以 `ep-` 开头,需为运行中(`Running` 状态)的接入点。 ## 响应参数 本接口无特有的返回参数,成功时 HTTP 状态码为 `200`,返回结构中 `Result` 为空对象 `{}`。 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=StopEndpoint&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "Id": "test-ep-id" } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "20240514213405040224254042DAC9DB", "Action": "StopEndpoint", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": {} } ``` --- # 获取推理接入点列表 Source: https://ark.volcengine.com/region:cn-beijing/docs/list-endpoints-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=ListEndpoints&Version=2024-01-01` 分页查询推理接入点列表,支持按项目、标签、模型、状态等多维度筛选。 > **说明:注意** > > 本接口仅返回调用方有权限查看的项目下的接入点;跨项目检索请确认已切换或显式指定 *ProjectName*。返回字段为精简版接入点信息(*ListEndpointItem*),如需完整配置请通过 *GetEndpoint* 接口按 ID 查询。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **Filter** `object` | 接入点筛选条件 接入点筛选条件,各子字段之间为「与」关系。格式如下:`{ "Statuses": ["Running"], "FoundationModelName": "doubao-seed-2-1-pro-260628" }`。 **CustomModelIds** `string[]` | 定制模型 ID 筛选 `Filter.CustomModelIds` 按定制模型 ID 列表精确筛选。 **Domain** `string` | 接入点类型筛选 `Filter.Domain` 按接入点类型筛选。可选值: - `Ark` - `Mlp` **EndpointModelTypes** `string[]` | 模型类型筛选 `Filter.EndpointModelTypes` 按接入模型类型筛选。可选值: - `FoundationModel` - `CustomModel` - `ServiceModel` **FoundationModelName** `string` | 基础模型名称筛选 `Filter.FoundationModelName` 按基础模型名称模糊匹配。 **Ids** `string[]` | 接入点 ID 筛选 `Filter.Ids` 按接入点 ID 列表精确筛选。 **ModelOrServiceName** `string` | 模型/服务名称筛选 `Filter.ModelOrServiceName` 按模型名称或 MLP 服务名称模糊匹配。 **ModelVersions** `string[]` | 模型版本筛选 `Filter.ModelVersions` 按基础模型版本列表精确筛选。 **Name** `string` | 接入点名称筛选 `Filter.Name` 按接入点名称模糊匹配。 **PaymentType** `string` | 付费方式筛选 `Filter.PaymentType` 按付费方式筛选。可选值: - `ModelUnit`:模型单元。 - `ScaleTier`:TPM 保障包。 - 不传或为空:不区分付费方式 **ServiceInfoIds** `string[]` | MLP 服务 ID 筛选 `Filter.ServiceInfoIds` 按 MLP 推理服务 ID 列表筛选,仅 *Domain* 为 `Mlp` 时有效。 **Statuses** `string[]` | 状态筛选 `Filter.Statuses` 按接入点状态筛选。可选值: - `Running` - `Scheduling` - `Abnormal` - `Stopped` **PageNumber** `integer` `默认值 1` | 起始页码 分页查询时的页码,从 1 开始。 **PageSize** `integer` `默认值 10` | 每页记录数 分页查询时每页显示的记录数,取值范围 1~100。 **ProjectName** `string` `默认值 default` | 项目名称 按项目名称过滤接入点,精确匹配。 **SortBy** `string` `默认值 CreateTime` | 排序字段 排序字段。可选值: - `CreateTime`(默认):创建时间。 - `UpdateTime`:更新时间。 **SortOrder** `string` `默认值 Desc` | 排序顺序 排序顺序。可选值: - `Asc`:升序。 - `Desc`(默认):降序。 **TagFilters** `object[]` | 标签筛选条件 按标签筛选接入点,多条之间为「与」关系,同一 *Key* 的多个 *Values* 之间为「或」关系。格式如下:`[ { "Key": "env", "Values": ["stg", "boe"] } ]`。 **Key** `string` `必选` | 标签键 `TagFilters.Key` 标签键,长度 1~64 字符。 **Values** `string[]` | 标签值列表 `TagFilters.Values` 标签值列表;为空时表示该 *Key* 下所有标签值均匹配。 ## 响应参数 **Items** `object[]` | 接入点列表 接入点列表,数组每个元素为一个接入点的精简信息。格式如下:`[ { "Id": "ep-20260507230659-skvgn", "Name": "curl_bot_test", "Status": "Running" } ]`。 **CreateTime** `string` | 创建时间 `Items.CreateTime` 创建时间,RFC3339 格式。 **EndpointModelType** `string` | 模型类型 `Items.EndpointModelType` 接入模型类型。可选值: - `FoundationModel` - `CustomModel` - `ServiceModel` **Id** `string` | 接入点 ID `Items.Id` 推理接入点 ID。 **ModelReference** `object` | 模型引用 `Items.ModelReference` 接入模型引用。格式如下:`{ "FoundationModel": { "Name": "doubao-seed-2-1-pro-260628", "ModelVersion": "250615" } }`。 **CustomModelId** `string` | 定制模型 ID `Items.ModelReference.CustomModelId` 定制模型 ID,以 `cm-` 开头,与 *FoundationModel* 二选一。 **FoundationModel** `object` | 基础模型引用 `Items.ModelReference.FoundationModel` 基础模型引用,与 *CustomModelId* 二选一。指定基础模型时必填该字段。 **ModelVersion** `string` | 基础模型版本 `Items.ModelReference.FoundationModel.ModelVersion` 基础模型版本号,可通过 *ListFoundationModels* 接口查询。 **Name** `string` | 基础模型名称 `Items.ModelReference.FoundationModel.Name` 基础模型名称,可通过 *ListFoundationModels* 接口查询。 **ConfigurationId** `string` | 模型配置 ID `Items.ModelReference.FoundationModel.ConfigurationId` 模型配置 ID。默认为空,使用模型默认配置。 **Name** `string` | 接入点名称 `Items.Name` **ProjectName** `string` | 项目名称 `Items.ProjectName` **RateLimit** `object` | 限流配置 `Items.RateLimit` 限流配置。格式如下:`{ "Rpm": 600, "Tpm": 100000 }`。 **Rpm** `integer` | 每分钟请求数 `Items.RateLimit.Rpm` 每分钟请求数上限(Requests Per Minute)。 **Tpm** `integer` | 每分钟请求 token 数 `Items.RateLimit.Tpm` 每分钟 token 数上限(Tokens Per Minute)。 **FastTpm** `integer` | 低延迟 TPM 限流 `Items.RateLimit.FastTpm` **FlexTpm** `integer` | Flex TPM 限流 `Items.RateLimit.FlexTpm` **Ipm** `integer` | 每分钟生成图片数 `Items.RateLimit.Ipm` 每分钟生成图片数上限(Images Per Minute)。仅生图模型有效。 **OffPeakFlexTpm** `integer` | 闲时 Flex TPM 限流 `Items.RateLimit.OffPeakFlexTpm` **Status** `string` | 接入点状态 `Items.Status` 接入点状态。可选值: - `Running` - `Scheduling` - `Abnormal` - `Stopped` **Tags** `object[]` | 标签列表 `Items.Tags` 接入点绑定的标签列表。 **Key** `string` | 标签键 `Items.Tags.Key` **Value** `string` | 标签值 `Items.Tags.Value` **UpdateTime** `string` | 更新时间 `Items.UpdateTime` 更新时间,RFC3339 格式。 **ContentGeneration** `object` | 生图/生视频配置 `Items.ContentGeneration` 生图 / 生视频模型的特化配置。格式如下:`{ "ConcurrentRequests": 10, "CreateTaskRpm": 60 }`。 **AudioConcurrentRequests** `integer` | 音频并发请求数 `Items.ContentGeneration.AudioConcurrentRequests` **AudioRpm** `integer` | 音频请求 RPM 限流 `Items.ContentGeneration.AudioRpm` **ConcurrentRequests** `number` | 并发请求数 `Items.ContentGeneration.ConcurrentRequests` **ConcurrentRequestsFor4K** `integer` | 4K 并发请求数 `Items.ContentGeneration.ConcurrentRequestsFor4K` **CreateTaskRpm** `number` | 每分钟任务数 `Items.ContentGeneration.CreateTaskRpm` **CreateTaskRpmFor4K** `integer` | 4K 每分钟任务数 `Items.ContentGeneration.CreateTaskRpmFor4K` **Description** `string` | 接入点描述 `Items.Description` **ModelUnitId** `string` | 模型单元 ID `Items.ModelUnitId` 模型单元(PTU)ID,以 `ptu-` 开头。 **PaymentType** `string` | 付费方式 `Items.PaymentType` 付费方式。可选值: - `ModelUnit`:模型单元。 - `ScaleTier`:TPM 保障包。 - 不传或为空:按 Token 付费 **StatusReason** `string` | 状态说明 `Items.StatusReason` 状态附加说明。 **PageNumber** `integer` | 当前页码 当前返回的页码,与请求参数 *PageNumber* 一致。 **PageSize** `integer` | 每页记录数 当前返回的每页记录数,与请求参数 *PageSize* 一致。 **TotalCount** `integer` | 接入点总数 满足筛选条件的接入点总数。 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=ListEndpoints&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "PageNumber": 1, "PageSize": 10, "ProjectName": "default", "TagFilters": [ { "Key": "env", "Values": [ "prod" ] } ], "Filter": { "EndpointModelTypes": [ "FoundationModel" ], "Statuses": [ "Running" ], "ModelVersions": [ "doubao-seed-2-1-pro" ], "CustomModelIds": [ "mcm-20260507230659-abcde" ], "FoundationModelName": "doubao-seed", "Ids": [ "ep-20260507230659-skvgn" ], "Name": "my-endpoint" }, "SortBy": "CreateTime", "SortOrder": "Desc" } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "20240514213143172211079122D5C1C8", "Action": "ListEndpoints", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "TotalCount": 1, "PageNumber": 1, "PageSize": 10, "Items": [ { "Id": "ep-20260507230659-skvgn", "Name": "curl_bot_test", "Description": "用于电商场景的图像生成接入点", "ProjectName": "default", "Tags": [ { "Key": "env", "Value": "stg" } ], "ModelReference": { "CustomModelId": "", "FoundationModel": { "Name": "doubao-seed-2-0-pro", "ModelVersion": "260215" } }, "EndpointModelType": "FoundationModel", "ModelUnitId": "ptu-20260227200531-pwbpk", "Status": "Running", "UpdateTime": "2026-05-07T23:06:59Z", "CreateTime": "2026-05-07T23:06:59Z", "RateLimit": { "Rpm": 600, "Tpm": 100000 }, "StatusReason": "" } ] } } ``` --- # 获取推理接入点 Source: https://ark.volcengine.com/region:cn-beijing/docs/get-endpoint-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=GetEndpoint&Version=2024-01-01` 获取指定推理接入点的详细信息。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **Id** `string` `必选` | 接入点 ID 推理接入点 ID,以 `ep-` 开头。可通过 *ListEndpoints* 接口或控制台获取。 ## 响应参数 **BatchOnly** `boolean` | 批量推理 是否为批量推理接入点。取值为 `true` 表示接入点仅支持批量推理,`false` 表示实时推理。 **ContentGeneration** `object` | 生成配置 生图或生视频模型的特化配置,用于设置并发数与每分钟任务数上限。 **AudioConcurrentRequests** `integer` | 音频并发请求数 `ContentGeneration.AudioConcurrentRequests` **AudioRpm** `integer` | 音频请求 RPM 限流 `ContentGeneration.AudioRpm` **ConcurrentRequests** `number` | 并发请求数 `ContentGeneration.ConcurrentRequests` **ConcurrentRequestsFor4K** `integer` | 4K 并发请求数 `ContentGeneration.ConcurrentRequestsFor4K` **CreateTaskRpm** `number` | 每分钟任务数 `ContentGeneration.CreateTaskRpm` **CreateTaskRpmFor4K** `integer` | 4K 每分钟任务数 `ContentGeneration.CreateTaskRpmFor4K` **CreateTime** `string` | 创建时间 接入点创建时间,RFC3339 格式。 **Description** `string` | 描述 推理接入点描述,长度不超过 200 字符。 **EndpointModelType** `string` | 模型类型 接入点接入的模型类型。可选值:`FoundationModel`、`CustomModel`、`ServiceModel`。 **Id** `string` | 接入点 ID 推理接入点 ID,以 `ep-` 开头,作为唯一标识。 **ModelReference** `object` | 模型引用 推理接入点接入的模型引用。二选一返回:基础模型(*FoundationModel*)或定制模型(*CustomModelId*)。 **CustomModelId** `string` | 定制模型 ID `ModelReference.CustomModelId` 定制模型 ID,以 `cm-` 开头,与 *FoundationModel* 二选一。 **FoundationModel** `object` | 基础模型引用 `ModelReference.FoundationModel` 基础模型引用,与 *CustomModelId* 二选一。指定基础模型时必填该字段。 **ModelVersion** `string` | 基础模型版本 `ModelReference.FoundationModel.ModelVersion` 基础模型版本号,可通过 *ListFoundationModels* 接口查询。 **Name** `string` | 基础模型名称 `ModelReference.FoundationModel.Name` 基础模型名称,可通过 *ListFoundationModels* 接口查询。 **ConfigurationId** `string` | 模型配置 ID `ModelReference.FoundationModel.ConfigurationId` 模型配置 ID。默认为空,使用模型默认配置。 **ModelUnitId** `string` | 模型单元 ID 接入点绑定的模型单元(PTU)ID,以 `ptu-` 开头。为空表示后付费模式。 **Moderation** `object` | 内容护栏方案 接入点的内容护栏方案。 **Strategy** `string` | 内容安全护栏方案 `Moderation.Strategy` 内容安全护栏方案。取值: - `Default`(默认): 更低延迟,广泛覆盖内容安全通用需求 - `Basic`:基本方案(公测中)。支持在接口响应中提供命中的风险分类,暂时只包含严重违规和激进行为两类风险。 - `Skip`:跳过内容审核。 - `Customized`:自定义内容审核。 > **注意** > > 流式调用场景下不建议使用 `Basic`,否则可能导致响应延迟升高。 **CustomizedModerationInfos** `object[]` | 自定义审核配置 `Moderation.CustomizedModerationInfos` **AppID** `integer` | 应用 ID `Moderation.CustomizedModerationInfos.AppID` **BizType** `string` | 业务类型 `Moderation.CustomizedModerationInfos.BizType` **RiskType** `string` | 风险类型 `Moderation.CustomizedModerationInfos.RiskType` **Scene** `string` | 审核场景 `Moderation.CustomizedModerationInfos.Scene` **Name** `string` | 名称 推理接入点名称,创建时由用户指定,长度 1~64 字符。 **ProjectName** `string` | 所属项目 推理接入点所属项目名称。 **RateLimit** `object` | 限流配置 推理接入点限流配置。 > **说明** > > 为空表示使用模型默认限流。 **Rpm** `integer` | 每分钟请求数 `RateLimit.Rpm` 每分钟请求数上限(Requests Per Minute)。 **Tpm** `integer` | 每分钟请求 token 数 `RateLimit.Tpm` 每分钟 token 数上限(Tokens Per Minute)。 **FastTpm** `integer` | 低延迟 TPM 限流 `RateLimit.FastTpm` **FlexTpm** `integer` | Flex TPM 限流 `RateLimit.FlexTpm` **Ipm** `integer` | 每分钟生成图片数 `RateLimit.Ipm` 每分钟生成图片数上限(Images Per Minute)。仅生图模型有效。 **OffPeakFlexTpm** `integer` | 闲时 Flex TPM 限流 `RateLimit.OffPeakFlexTpm` **RollingId** `string` | 版本切换 ID 模型版本切换任务 ID,仅当接入点正在切换模型版本时有值。 **ScaleTierId** `string` | 保障包 ID 当接入点关联 TPM 保障包时,返回保障包 ID;否则为空。 **Status** `string` | 状态 推理接入点状态。可选值:`Running`、`Scheduling`、`Abnormal`、`Stopped`。 **StatusReason** `string` | 状态说明 接入点当前状态的附加说明,如异常原因。正常运行时为空。 **SupportRolling** `boolean` | 支持版本切换 接入点是否支持模型版本切换(滚动升级)。取值为 `true` 表示支持,`false` 表示不支持。 **SupportScaleTier** `boolean` | 支持保障包 接入点是否为 TPM 保障包接入点。取值为 `true` 表示支持,`false` 表示不支持。 **Tags** `object[]` | 标签 推理接入点绑定的标签列表。 **Key** `string` | 标签键 `Tags.Key` 标签键,长度 1~64 字符。 **Value** `string` | 标签值 `Tags.Value` 标签值,长度不超过 256 字符。 **UpdateTime** `string` | 更新时间 接入点更新时间,RFC3339 格式。 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=GetEndpoint&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "Id": "test-ep-id" } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "20241231191522021037040243127434", "Action": "GetEndpoint", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "SupportRolling": false, "CreateTime": "2026-05-07T23:06:59Z", "Description": "用于电商场景的图像生成接入点", "EndpointModelType": "FoundationModel", "Id": "ep-20260507230659-skvgn", "ModelReference": { "CustomModelId": "", "FoundationModel": { "Name": "doubao-seed-2-0-pro", "ModelVersion": "260215" } }, "ModelUnitId": "ptu-20260227200531-pwbpk", "Name": "curl_bot_test", "ProjectName": "default", "RateLimit": { "Rpm": 600, "Tpm": 100000 }, "Status": "Running", "StatusReason": "", "SupportScaleTier": false, "Tags": [ { "Key": "env", "Value": "stg" } ], "UpdateTime": "2026-05-07T23:06:59Z", "RollingId": "", "ScaleTierId": "" } } ``` --- # 删除推理接入点 Source: https://ark.volcengine.com/region:cn-beijing/docs/delete-endpoint-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=DeleteEndpoint&Version=2024-01-01` 删除指定的推理接入点。删除后该接入点不可恢复。 > **说明:注意** > > 接入点删除后**不可恢复**。删除前需满足以下条件:接入点已处于停止状态(`Stopped`),不存在活跃绑定的智能体;若为预付费模型单元绑定的接入点,仅当对应 TPM 资源处于已回收或创建失败状态时才能删除,否则需先退订。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **Id** `string` `必选` | 接入点 ID 待删除的推理接入点(Endpoint)ID,以 `ep-` 开头。可在火山方舟控制台的「推理接入点」页面查看,或通过 *ListEndpoints* 接口获取。 ## 响应参数 本接口无特有的返回参数,成功时 HTTP 状态码为 `200`,返回结构中 `Result` 为空对象 `{}`。 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=DeleteEndpoint&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "Id": "test-ep-id" } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "20240514213217222022025159D49F9E", "Action": "DeleteEndpoint", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": {} } ``` --- # 更新推理接入点 Source: https://ark.volcengine.com/region:cn-beijing/docs/update-endpoint-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=UpdateEndpoint&Version=2024-01-01` 更新一个已创建的推理接入点(Endpoint)的可变配置,包括名称、描述、限流配置、标签、模型推理默认参数、水印与内容安全护栏等。仅传入需要变更的字段,未传字段保持原值。 > **说明:注意** > > 接入点接入的模型(*ModelReference*)创建后不可修改;如需更换模型请新建接入点。本接口仅更新传入的字段,未在请求中出现的字段保持原值;如需先验证参数合法性而不实际修改,可设置 *DryRun* 为 `true`。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **Id** `string` `必选` | 接入点 ID 待更新的推理接入点 ID,以 `ep-` 开头。可通过 *ListEndpoints* 接口获取。 **AgenticStrategy** `object` | Agent 策略 Agent 策略配置,包含 Skill 与上下文压缩等子项 **AgenticSkill** `object` `必选` | AgenticSkill `AgenticStrategy.AgenticSkill` 字段 **AgenticSkillInfos** `object[]` `必选` | AgenticSkill `AgenticStrategy.AgenticSkill.AgenticSkillInfos` 字段 **ID** `string` `必选` | ID `AgenticStrategy.AgenticSkill.AgenticSkillInfos.ID` 标识 **Type** `string` `必选` | 类型 `AgenticStrategy.AgenticSkill.AgenticSkillInfos.Type` 类型。可选值:`Custom`、`Sharing`。 **Version** `string` `必选` | 版本 `AgenticStrategy.AgenticSkill.AgenticSkillInfos.Version` **VersionID** `string` | VersionID `AgenticStrategy.AgenticSkill.AgenticSkillInfos.VersionID` Version 标识 **Enabled** `number` `必选` | 启用 Agent 技能 `AgenticStrategy.AgenticSkill.Enabled` 是否启用 Agent 技能 **Mode** `string` `必选` | 技能模式 `AgenticStrategy.AgenticSkill.Mode` Agent 技能模式。取值 `Auto`(自动)、`Custom`(自定义) **AgenticContext** `object` | AgenticConte `AgenticStrategy.AgenticContext` 字段 **AgenticContextTosLocation** `object` `必选` | AgenticConte `AgenticStrategy.AgenticContext.AgenticContextTosLocation` 字段 **BucketName** `string` `必选` | TOS 桶名称 `AgenticStrategy.AgenticContext.AgenticContextTosLocation.BucketName` TOS 桶名称 在创建和选择 TOS 桶时请注意,当前火山方舟只支持 华北 2-北京 地域(region: cn-beijing)的存储桶 **ObjectKey** `string` `必选` | TOS 对象路径 `AgenticStrategy.AgenticContext.AgenticContextTosLocation.ObjectKey` **CompressionEnabled** `number` `必选` | CompressionE `AgenticStrategy.AgenticContext.CompressionEnabled` 字段 **AllowDataCollected** `boolean` | 允许数据采集 是否允许采集调用数据用于模型训练或数据回流 **ContentGeneration** `object` | 生图/生视频配置 生图 / 生视频模型的特化配置。不传表示不修改。 **AudioConcurrentRequests** `integer` | 音频并发请求数 `ContentGeneration.AudioConcurrentRequests` **AudioRpm** `integer` | 音频请求 RPM 限流 `ContentGeneration.AudioRpm` **ConcurrentRequests** `number` | 并发请求数 `ContentGeneration.ConcurrentRequests` 并发请求数上限。 **ConcurrentRequestsFor4K** `integer` | 4K 并发请求数 `ContentGeneration.ConcurrentRequestsFor4K` **CreateTaskRpm** `number` | 每分钟任务数 `ContentGeneration.CreateTaskRpm` 每分钟创建任务数上限。 **CreateTaskRpmFor4K** `integer` | 4K 每分钟任务数 `ContentGeneration.CreateTaskRpmFor4K` **DataDelivery** `boolean` | 数据回流 是否开启数据回流 **Description** `string` | 接入点描述 接入点新描述,长度不超过 200 字符。不传表示不修改描述。 **DryRun** `boolean` `默认值 false` | 预检模式 是否仅进行预检。取值 `true` 表示仅校验请求合法性,不实际更新接入点;`false` 表示正式执行更新。 **Fallback** `object` | 降级配置 降级配置。主模型不可用时按候选模型顺序回退 **NeedFallback** `number` `必选` | NeedFallback `Fallback.NeedFallback` 是否需要 Fallback **CandidateModels** `object[]` | CandidateMod `Fallback.CandidateModels` 字段 **ModelVersion** `string` `必选` | 基础模型版本 `Fallback.CandidateModels.ModelVersion` **Name** `string` `必选` | 基础模型名 `Fallback.CandidateModels.Name` **ConfigurationId** `string` | 基础模型配置 ID `Fallback.CandidateModels.ConfigurationId` **InferenceDefaultParam** `object` | 推理默认参数 推理默认参数配置,调用接入点时未显式指定的参数将使用此处的默认值 **Detail** `object` | 细节参数 `InferenceDefaultParam.Detail` **Value** `string` | 值 `InferenceDefaultParam.Detail.Value` **ReasoningEffort** `object` | 推理努力程度 `InferenceDefaultParam.ReasoningEffort` **Value** `string` | 值 `InferenceDefaultParam.ReasoningEffort.Value` **ServiceTier** `object` | 服务档位 `InferenceDefaultParam.ServiceTier` **Value** `string` | 值 `InferenceDefaultParam.ServiceTier.Value` **ThinkingConfig** `object` | 深度思考配置 `InferenceDefaultParam.ThinkingConfig` **IsSupported** `boolean` | 是否支持 `InferenceDefaultParam.ThinkingConfig.IsSupported` **Value** `string` | 值 `InferenceDefaultParam.ThinkingConfig.Value` **InferenceFoundry** `object` | 推理工厂配置 推理工厂(Inference Foundry)配置,用于自定义推理性能档位 **InferenceFoundryPerformance** `object` | InferenceFou `InferenceFoundry.InferenceFoundryPerformance` 字段 **Tier** `integer` | Tier `InferenceFoundry.InferenceFoundryPerformance.Tier` 字段 **Tpm** `integer` | Tpm `InferenceFoundry.InferenceFoundryPerformance.Tpm` 字段 **LimitCoefficient** `object` | 限流系数 限流系数配置,用于调整接入点限流策略 **NeedLimitCoefficient** `number` `必选` | NeedLimitCoe `LimitCoefficient.NeedLimitCoefficient` 是否需要 LimitCoefficient **Moderation** `object` | 内容安全护栏 内容护栏方案。不传表示不修改。*Strategy* 必填;仅当 *Strategy* 为 `Customized` 时填写 *CustomizedModerationInfos*。 **Strategy** `string` `必选` | 内容安全护栏方案 `Moderation.Strategy` 内容安全护栏方案。取值: - `Default`(默认): 更低延迟,广泛覆盖内容安全通用需求 - `Basic`:基本方案(公测中)。支持在接口响应中提供命中的风险分类,暂时只包含严重违规和激进行为两类风险。 - `Skip`:跳过内容审核。 - `Customized`:自定义内容审核。 > **注意** > > 流式调用场景下不建议使用 `Basic`,否则可能导致响应延迟升高。 **CustomizedModerationInfos** `object[]` | 自定义审核配置 `Moderation.CustomizedModerationInfos` **AppID** `integer` `必选` | 应用 ID `Moderation.CustomizedModerationInfos.AppID` **BizType** `string` `必选` | 业务类型 `Moderation.CustomizedModerationInfos.BizType` **RiskType** `string` `必选` | 风险类型 `Moderation.CustomizedModerationInfos.RiskType` **Scene** `string` `必选` | 审核场景 `Moderation.CustomizedModerationInfos.Scene` **Name** `string` | 接入点名称 接入点新名称,长度 1~64 字符。不传表示不修改名称。 **NeedWatermark** `boolean` | 启用水印 生成内容是否需要添加水印。启用后需同时填写 *WatermarkInfo* **RateLimit** `object` | 限流配置 接入点限流配置。不传表示不修改。其中 *Rpm* 与 *Tpm* 必填,*Ipm* 与 *FastTpm* 按需填写。 **Rpm** `integer` `必选` | 每分钟请求数 `RateLimit.Rpm` 每分钟请求数上限(Requests Per Minute)。 **Tpm** `integer` `必选` | 每分钟请求 token 数 `RateLimit.Tpm` 每分钟 token 数上限(Tokens Per Minute)。 **FastTpm** `integer` | 低延迟 TPM 限流 `RateLimit.FastTpm` **FlexTpm** `integer` | Flex TPM 限流 `RateLimit.FlexTpm` **Ipm** `integer` | 每分钟生成图片数 `RateLimit.Ipm` 每分钟生成图片数上限。仅生图模型有效。 **OffPeakFlexTpm** `integer` | 闲时 Flex TPM 限流 `RateLimit.OffPeakFlexTpm` **ServiceInfo** `object` | MLP 服务信息 MLP 推理服务信息。仅当接入点 *Domain* 为 `Mlp` 时可更新,可更新 *ModelName* 与 *ServiceName*。 **Id** `string` | MLP 服务 ID `ServiceInfo.Id` MLP 推理服务 ID,以 `msrv-` 开头。 **ModelName** `string` | MLP 模型名称 `ServiceInfo.ModelName` MLP 服务对应的模型名称。 **Region** `string` | MLP 服务地域 `ServiceInfo.Region` MLP 推理服务所在区域,如 `cn-beijing`、`ap-southeast-1`。 **ServiceName** `string` | MLP 服务名称 `ServiceInfo.ServiceName` **Tags** `object[]` | 标签列表 接入点绑定的标签列表。更新时整体替换原有标签。 **Key** `string` `必选` | 标签键 `Tags.Key` 标签键,长度 1~64 字符。 **Value** `string` `必选` | 标签值 `Tags.Value` 标签值,长度不超过 256 字符。 **UsageLimit** `object` | 用量限制 **Enabled** `boolean` `必选` | 是否启用 `UsageLimit.Enabled` **Limit** `integer` | 限制额度 `UsageLimit.Limit` **WatermarkInfo** `object` | 水印主体信息 水印主体信息。当 *NeedWatermark* 为 `true` 时填写 **SocialUnifiedCreditCode** `string` `必选` | 统一社会信用代码 `WatermarkInfo.SocialUnifiedCreditCode` **SubjectName** `string` `必选` | 水印主体名称 `WatermarkInfo.SubjectName` **IsContentDissemination** `number` | 是否允许内容传播 `WatermarkInfo.IsContentDissemination` ## 响应参数 本接口无特有的返回参数,成功时 HTTP 状态码为 `200`,返回结构中 `Result` 为空对象 `{}`。 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=UpdateEndpoint&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "Id": "ep-id", "Name": "testname", "Description": "testdescription", "RateLimit": { "Rpm": 111, "Tpm": 237 } } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "20240514213302095012180018DD91C7", "Action": "UpdateEndpoint", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": {} } ``` --- # 创建推理接入点 Source: https://ark.volcengine.com/region:cn-beijing/docs/create-endpoint-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=CreateEndpoint&Version=2024-01-01` 创建一个推理接入点(Endpoint),用于调用模型服务。接入点是调用模型的入口资源,绑定模型后即可通过接入点 ID 发起推理请求。 > **说明:注意** > > 创建接入点为异步操作,返回 *Id* 后接入点进入调度(`Scheduling`)状态,运行就绪后转为 `Running`。计费随接入点进入 `Running` 状态开始;如需先校验参数而不实际创建,可设置 *DryRun* 为 `true`。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **ModelReference** `object` `必选` | 接入模型配置 接入点接入的模型引用。二选一指定:基础模型(*FoundationModel*)或定制模型(*CustomModelId*)。 **CustomModelId** `string` | 定制模型 ID `ModelReference.CustomModelId` 定制模型 ID,以 `cm-` 开头,与 *FoundationModel* 二选一。 **FoundationModel** `object` | 基础模型引用 `ModelReference.FoundationModel` 基础模型引用,与 *CustomModelId* 二选一。指定基础模型时必填该字段。 **ModelVersion** `string` `必选` | 基础模型版本 `ModelReference.FoundationModel.ModelVersion` 基础模型版本号,可通过 *ListFoundationModels* 接口查询。 **Name** `string` `必选` | 基础模型名称 `ModelReference.FoundationModel.Name` 基础模型名称,可通过 *ListFoundationModels* 接口查询。 **ConfigurationId** `string` | 模型配置 ID `ModelReference.FoundationModel.ConfigurationId` 模型配置 ID。默认为空,使用模型默认配置。 **Name** `string` `必选` | 接入点名称 接入点名称,用于在控制台与列表接口中标识该接入点。建议在名称中体现模型与用途,便于识别。 **AgenticStrategy** `object` | Agent 策略 Agent 策略配置,包含 Skill 与上下文压缩等子项 **AgenticSkill** `object` `必选` | Agent 技能配置。 `AgenticStrategy.AgenticSkill` **AgenticSkillInfos** `object[]` `必选` | 技能实例列表 `AgenticStrategy.AgenticSkill.AgenticSkillInfos` Agent 技能实例列表 **ID** `string` `必选` | Agent 技能 ID。 `AgenticStrategy.AgenticSkill.AgenticSkillInfos.ID` **Type** `string` `必选` | 技能类型 `AgenticStrategy.AgenticSkill.AgenticSkillInfos.Type` Agent 技能类型。取值 `Custom`(自定义)、`Sharing`(共享) **Version** `string` `必选` | Agent 技能版本号。 `AgenticStrategy.AgenticSkill.AgenticSkillInfos.Version` **VersionID** `string` | Agent 技能版本 ID。 `AgenticStrategy.AgenticSkill.AgenticSkillInfos.VersionID` **Enabled** `number` `必选` | 启用 Agent 技能 `AgenticStrategy.AgenticSkill.Enabled` 是否启用 Agent 技能 **Mode** `string` `必选` | 技能模式 `AgenticStrategy.AgenticSkill.Mode` Agent 技能模式。取值 `Auto`(自动)、`Custom`(自定义) **AgenticContext** `object` | Agent 上下文配置。 `AgenticStrategy.AgenticContext` **AgenticContextTosLocation** `object` `必选` | Agent 上下文存储的 TOS 位置。 `AgenticStrategy.AgenticContext.AgenticContextTosLocation` **BucketName** `string` `必选` | TOS `AgenticStrategy.AgenticContext.AgenticContextTosLocation.BucketName` TOS 桶名称。在创建和选择 TOS 桶时请注意,当前火山方舟只支持华北 2-北京 地域(region: cn-beijing)的存储桶 **ObjectKey** `string` `必选` | TOS 对象路径。 `AgenticStrategy.AgenticContext.AgenticContextTosLocation.ObjectKey` **CompressionEnabled** `number` `必选` | 启用上下文压缩 `AgenticStrategy.AgenticContext.CompressionEnabled` 是否启用上下文压缩 **AllowDataCollected** `boolean` | 允许数据采集 是否允许采集调用数据用于模型训练或数据回流 **BatchOnly** `boolean` `默认值 false` | 仅批量推理 是否为批量推理。取值 `true` 表示接入点为批量推理 ep;`false` 表示实时推理。 **ContentGeneration** `object` | 生图/生视频配置 生图 / 生视频模型的特化配置,用于设置并发与每分钟任务数上限。 **AudioConcurrentRequests** `integer` | 音频并发请求数 `ContentGeneration.AudioConcurrentRequests` **AudioRpm** `integer` | 音频请求 RPM 限流 `ContentGeneration.AudioRpm` **ConcurrentRequests** `number` | 并发请求数 `ContentGeneration.ConcurrentRequests` **ConcurrentRequestsFor4K** `integer` | 4K 并发请求数 `ContentGeneration.ConcurrentRequestsFor4K` **CreateTaskRpm** `number` | 每分钟任务数 `ContentGeneration.CreateTaskRpm` **CreateTaskRpmFor4K** `integer` | 4K 每分钟任务数 `ContentGeneration.CreateTaskRpmFor4K` **DataDelivery** `boolean` `默认值 false` | 数据回流 是否开启推理数据回流。取值 `true` 表示开启,接入点的请求与响应可被回流用于数据采集;`false` 表示关闭。 **DedicatedToDynamicPTU** `boolean` | 动态模型单元 是否绑定动态模型单元(Dynamic PTU) **DedicatedToPTU** `boolean` `默认值 false` | 独占模型单元 是否将该接入点专用于绑定的模型单元(PTU)。取值 `true` 表示接入点流量将独占绑定的模型单元;`false` 表示接入点与模型单元非独占。 **DeploymentType** `string` | 部署类型 部署类型。取值 `global`(全球部署)、`regional`(区域部署) **Description** `string` | 接入点描述 接入点的描述信息,便于在控制台或列表中区分用途。默认为空。 **Domain** `string` `默认值 Ark` | 接入点类型 接入点类型。取值 `Ark`(方舟接入点)、`Mlp`(MLP 接入点)、`Foundry`(推理代工)、`All`(所有场景)。 **DryRun** `boolean` `默认值 false` | 预检模式 是否仅进行预检。取值 `true` 表示仅校验请求合法性,不实际创建接入点;`false` 表示正式执行创建。 **Fallback** `object` | 降级配置 降级配置。主模型不可用时按候选模型顺序回退 **NeedFallback** `number` `必选` | 是否启用降级。 `Fallback.NeedFallback` **CandidateModels** `object[]` | 候选基础模型列表。 `Fallback.CandidateModels` 候选基础模型列表,按顺序回退 **ModelVersion** `string` `必选` | 基础模型版本 `Fallback.CandidateModels.ModelVersion` 基础模型版本号,可通过 *ListFoundationModels* 接口查询。 **Name** `string` `必选` | 基础模型名称 `Fallback.CandidateModels.Name` 基础模型名称,可通过 *ListFoundationModels* 接口查询。 **ConfigurationId** `string` | 模型配置 ID `Fallback.CandidateModels.ConfigurationId` 模型配置 ID。默认为空,使用模型默认配置。 **InferenceDefaultParam** `object` | 推理默认参数 **Detail** `object` | 细节参数 `InferenceDefaultParam.Detail` **Value** `string` | 值 `InferenceDefaultParam.Detail.Value` **ReasoningEffort** `object` | 推理努力程度 `InferenceDefaultParam.ReasoningEffort` **Value** `string` | 值 `InferenceDefaultParam.ReasoningEffort.Value` **ServiceTier** `object` | 服务档位 `InferenceDefaultParam.ServiceTier` **Value** `string` | 值 `InferenceDefaultParam.ServiceTier.Value` **ThinkingConfig** `object` | 深度思考配置 `InferenceDefaultParam.ThinkingConfig` **IsSupported** `boolean` | 是否支持 `InferenceDefaultParam.ThinkingConfig.IsSupported` **Value** `string` | 值 `InferenceDefaultParam.ThinkingConfig.Value` **InferenceFoundry** `object` | 推理工厂配置 推理工厂(Inference Foundry)配置,用于自定义推理性能档位 **InferenceFoundryPerformance** `object` | 性能档位配置 `InferenceFoundry.InferenceFoundryPerformance` 推理工厂性能档位配置 **Tier** `integer` | 推理性能档位编号。 `InferenceFoundry.InferenceFoundryPerformance.Tier` **Tpm** `integer` | 该档位每分钟 token 数。 `InferenceFoundry.InferenceFoundryPerformance.Tpm` **IntelligentRouter** `object` | 智能路由 智能路由配置,用于在多个候选模型间按策略分发请求 **Mode** `string` `必选` | 路由模式 `IntelligentRouter.Mode` 路由模式。取值 `Automatic`(自动)、`CandidateSet`(候选集合)、`Ordered`(按顺序) **Strategy** `string` `必选` | 路由策略 `IntelligentRouter.Strategy` 路由策略。取值 `EffectFirst`(效果优先)、`CostFirst`(成本优先)、`Balanced`(均衡) **BaselineModel** `object` | 基准模型 `IntelligentRouter.BaselineModel` **CustomModelId** `string` | 定制模型 ID `IntelligentRouter.BaselineModel.CustomModelId` 定制模型 ID,以 `cm-` 开头,与 *FoundationModel* 二选一。 **FoundationModel** `object` | 基础模型引用 `IntelligentRouter.BaselineModel.FoundationModel` 基础模型引用,与 *CustomModelId* 二选一。指定基础模型时必填该字段。 **ModelVersion** `string` `必选` | 基础模型版本 `IntelligentRouter.BaselineModel.FoundationModel.ModelVersion` 基础模型版本号,可通过 *ListFoundationModels* 接口查询。 **Name** `string` `必选` | 基础模型名称 `IntelligentRouter.BaselineModel.FoundationModel.Name` 基础模型名称,可通过 *ListFoundationModels* 接口查询。 **ConfigurationId** `string` | 模型配置 ID `IntelligentRouter.BaselineModel.FoundationModel.ConfigurationId` 模型配置 ID。默认为空,使用模型默认配置。 **CandidateModels** `object[]` | 候选模型列表。 `IntelligentRouter.CandidateModels` **CustomModelId** `string` | 定制模型 ID `IntelligentRouter.CandidateModels.CustomModelId` 定制模型 ID,以 `cm-` 开头,与 *FoundationModel* 二选一。 **FoundationModel** `object` | 基础模型引用 `IntelligentRouter.CandidateModels.FoundationModel` 基础模型引用,与 *CustomModelId* 二选一。指定基础模型时必填该字段。 **ModelVersion** `string` `必选` | 基础模型版本 `IntelligentRouter.CandidateModels.FoundationModel.ModelVersion` 基础模型版本号,可通过 *ListFoundationModels* 接口查询。 **Name** `string` `必选` | 基础模型名称 `IntelligentRouter.CandidateModels.FoundationModel.Name` 基础模型名称,可通过 *ListFoundationModels* 接口查询。 **ConfigurationId** `string` | 模型配置 ID `IntelligentRouter.CandidateModels.FoundationModel.ConfigurationId` 模型配置 ID。默认为空,使用模型默认配置。 **IsAgentic** `boolean` | 启用 Agent 化 是否启用 Agent 化能力(接入点可作为 Agent 调用) **IsIntelligent** `boolean` | 启用智能路由 是否启用智能路由能力 **LimitCoefficient** `object` | 限流系数 限流系数配置,用于调整接入点限流策略 **NeedLimitCoefficient** `number` `必选` | 是否启用限流系数。 `LimitCoefficient.NeedLimitCoefficient` **ModelUnitId** `string` | 模型单元 ID 模型单元(PTU)ID,以 `ptu-` 开头。指定后接入点为预付费模式并绑定该模型单元;不传则为后付费模式。 **Moderation** `object` | 内容安全护栏 内容护栏方案。*Strategy* 必填;仅当 *Strategy* 为 `Customized` 时填写 *CustomizedModerationInfos*。 **Strategy** `string` `必选` | 内容安全护栏方案 `Moderation.Strategy` 内容安全护栏方案。取值: - `Default`(默认): 更低延迟,广泛覆盖内容安全通用需求 - `Basic`:基本方案(公测中)。支持在接口响应中提供命中的风险分类,暂时只包含严重违规和激进行为两类风险。 - `Skip`:跳过内容审核。 - `Customized`:自定义内容审核。 > **注意** > > 流式调用场景下不建议使用 `Basic`,否则可能导致响应延迟升高。 **CustomizedModerationInfos** `object[]` | 自定义审核配置 `Moderation.CustomizedModerationInfos` **AppID** `integer` `必选` | 应用 ID `Moderation.CustomizedModerationInfos.AppID` **BizType** `string` `必选` | 业务类型 `Moderation.CustomizedModerationInfos.BizType` **RiskType** `string` `必选` | 风险类型 `Moderation.CustomizedModerationInfos.RiskType` **Scene** `string` `必选` | 审核场景 `Moderation.CustomizedModerationInfos.Scene` **NeedWatermark** `boolean` | 启用水印 生成内容是否需要添加水印。启用后需同时填写 *WatermarkInfo* 提供水印主体信息 **ProjectName** `string` `默认值 default` | 项目名称 资源所属的项目名称。若资源不在默认项目(`default`)中,需填写实际项目名称。 **RateLimit** `object` | 限流配置 接入点限流配置,为空时使用模型默认限流。其中 *Rpm* 与 *Tpm* 必填,*Ipm* 与 *FastTpm* 按需填写。 **Rpm** `integer` `必选` | 每分钟请求数 `RateLimit.Rpm` 每分钟请求数上限(Requests Per Minute)。 **Tpm** `integer` `必选` | 每分钟请求 token 数 `RateLimit.Tpm` 每分钟 token 数上限(Tokens Per Minute)。 **FastTpm** `integer` | 低延迟 TPM 限流 `RateLimit.FastTpm` **FlexTpm** `integer` | Flex TPM 限流 `RateLimit.FlexTpm` **Ipm** `integer` | 每分钟生成图片数 `RateLimit.Ipm` 每分钟生成图片数上限(Images Per Minute)。仅生图模型有效。 **OffPeakFlexTpm** `integer` | 闲时 Flex TPM 限流 `RateLimit.OffPeakFlexTpm` **ServiceInfo** `object` | MLP 服务信息 MLP 服务信息。创建 MLP 接入点时,*ServiceInfo* 中的 *Id* 和 *Region* 必填 **Id** `string` | MLP 服务 ID `ServiceInfo.Id` MLP 推理服务 ID,以 `msrv-` 开头。 **ModelName** `string` | MLP 模型名称 `ServiceInfo.ModelName` MLP 服务对应的模型名称。默认从 MLP 服务定义自动解析。 **Region** `string` | MLP 服务地域 `ServiceInfo.Region` MLP 推理服务所在区域,如 `cn-beijing`、`ap-southeast-1`。 **ServiceName** `string` | MLP 服务名称 `ServiceInfo.ServiceName` MLP 服务名称。默认从 MLP 服务定义自动解析。 **Tags** `object[]` | 标签列表 接入点绑定的标签列表,用于资源分类与检索。每个标签由 *Key*(必填)与 *Value*(可选)组成。 **Key** `string` `必选` | 标签键 `Tags.Key` 标签键,长度 1~64 字符。 **Value** `string` `必选` | 标签值 `Tags.Value` 标签值,长度不超过 256 字符。 **UsageLimit** `object` | 用量限制 **Enabled** `boolean` `必选` | 是否启用 `UsageLimit.Enabled` **Limit** `integer` | 限制额度 `UsageLimit.Limit` **WatermarkInfo** `object` | 水印主体信息 水印主体信息。当 *NeedWatermark* 为 `true` 时填写 **SocialUnifiedCreditCode** `string` `必选` | 统一社会信用代码。 `WatermarkInfo.SocialUnifiedCreditCode` **SubjectName** `string` `必选` | 水印主体名称。 `WatermarkInfo.SubjectName` **IsContentDissemination** `number` | 是否允许内容传播。 `WatermarkInfo.IsContentDissemination` ## 响应参数 **Id** `string` | 接入点 ID 创建成功的推理接入点 ID,以 `ep-` 开头。可用于后续 *GetEndpoint*、*UpdateEndpoint*、*DeleteEndpoint* 等接口的 *Id* 入参。 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=CreateEndpoint&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "Name": "my-endpoint", "Description": "My model inference endpoint", "ModelReference": { "FoundationModel": { "Name": "doubao-seed-2-1-pro", "ModelVersion": "260628" } } } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "20240514212750152186163065FE5A2A", "Action": "CreateEndpoint", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "Id": "ep-20240514212750-a3f8k" } } ``` --- # 获取接入点推理应用层加密证书 Source: https://ark.volcengine.com/region:cn-beijing/docs/get-endpoint-certificate-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=GetEndpointCertificate&Version=2024-01-01` 获取指定推理接入点(Endpoint)的应用层加密证书链,用于客户端在调用推理接口前对请求/响应内容进行端到端加解密。证书由火山引擎私有 CA(PCA)签发,包含叶子证书、中间证书与根证书三层。 > **说明:注意** > > 返回的证书链需配合方舟提供的加密 SDK(MaaS Crypto SDK)使用;证书具备有效期(参见 *NotBefore* 与 *NotAfter*),临近过期前需重新调用本接口获取最新证书。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **Id** `string` `必选` | 推理接入点 ID 推理接入点(Endpoint)ID。可通过 *ListEndpoints* 接口获取 **Type** `string` | 证书类型 证书类型。当前仅支持默认值,可不传 ## 响应参数 **NotAfter** `number` | 证书过期时间 证书过期时间,使用秒级 Unix 时间戳表示。过期后证书不可用,需重新调用本接口获取新证书 **NotBefore** `number` | 证书生效时间 证书生效起始时间,使用秒级 Unix 时间戳表示。早于该时间使用证书会校验失败 **PCAHost** `string` | 证书签发机构 证书签发机构(PCA)名称 **PCAInstanceCertificate** `string` | 叶子证书(PEM) PEM 格式的叶子证书(Leaf Certificate),由中间证书签发,是客户端实际用于加解密的实例证书 **PCAName** `string` | 证书产品名称 证书产品名称,标识当前证书所属的加密方案 **PCARootCACertificate** `string` | 根证书(PEM) PEM 格式的根证书(Root CA Certificate),位于信任链顶端,用于校验整条证书链的有效性 **PCASubCACertificate** `string` | 中间根证书(PEM) PEM 格式的中间根证书(Intermediate CA Certificate),用于构建从叶子证书到根证书的信任链 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=GetEndpointCertificate&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "Id": "ep-20240522022935-4pwjK" } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "2024092515420222213017119486B17C", "Action": "GetEndpointCertificate", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "PCAHost": "Volcano Engine PCA", "PCAName": "MaaS Crypto SDK Online", "PCAInstanceCertificate": "-----BEGIN CERTIFICATE-----\n***\n-----END CERTIFICATE-----\n", "PCASubCACertificate": "-----BEGIN CERTIFICATE-----\n***\n-----END CERTIFICATE-----\n", "PCARootCACertificate": "-----BEGIN CERTIFICATE-----\n***\n-----END CERTIFICATE-----\n", "NotAfter": 1679673599, "NotBefore": 1678794684 } } ``` --- # 创建推理接入点滚动升级任务 Source: https://ark.volcengine.com/region:cn-beijing/docs/create-endpoint-rolling-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=CreateEndpointRolling&Version=2024-01-01` 为指定推理接入点创建模型版本的滚动更新任务,支持灰度切换底层模型而不中断服务。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **EndpointId** `string` `必选` | 接入点 ID 需要创建滚动更新的推理接入点 ID **ModelReference** `object` `必选` | 目标模型配置 滚动更新的目标模型配置,指定要切换到的新模型版本 **CustomModelId** `string` | 定制模型 ID `ModelReference.CustomModelId` 定制模型 ID,以 `cm-` 开头,与 *FoundationModel* 二选一。 **FoundationModel** `object` | 基础模型引用 `ModelReference.FoundationModel` 基础模型引用,与 *CustomModelId* 二选一。指定基础模型时必填该字段。 **ModelVersion** `string` `必选` | 基础模型版本 `ModelReference.FoundationModel.ModelVersion` 基础模型版本号,可通过 *ListFoundationModels* 接口查询。 **Name** `string` `必选` | 基础模型名称 `ModelReference.FoundationModel.Name` 基础模型名称,可通过 *ListFoundationModels* 接口查询。 **ConfigurationId** `string` | 模型配置 ID `ModelReference.FoundationModel.ConfigurationId` 模型配置 ID。默认为空,使用模型默认配置。 **Description** `string` | 滚动更新描述 滚动更新任务的描述信息 **TargetRouter** `object` | 目标路由配置 滚动更新完成后的目标智能路由配置 **Mode** `string` `必选` | 路由模式 `TargetRouter.Mode` 路由模式。取值 `Automatic`(自动)、`CandidateSet`(候选集合)、`Ordered`(按顺序) **Strategy** `string` `必选` | 路由策略 `TargetRouter.Strategy` 路由策略。取值 `EffectFirst`(效果优先)、`CostFirst`(成本优先)、`Balanced`(均衡) **BaselineModel** `object` | 基准模型 `TargetRouter.BaselineModel` **CustomModelId** `string` | 定制模型 ID `TargetRouter.BaselineModel.CustomModelId` 定制模型 ID,以 `cm-` 开头,与 *FoundationModel* 二选一。 **FoundationModel** `object` | 基础模型引用 `TargetRouter.BaselineModel.FoundationModel` 基础模型引用,与 *CustomModelId* 二选一。指定基础模型时必填该字段。 **ModelVersion** `string` `必选` | 基础模型版本 `TargetRouter.BaselineModel.FoundationModel.ModelVersion` 基础模型版本号,可通过 *ListFoundationModels* 接口查询。 **Name** `string` `必选` | 基础模型名称 `TargetRouter.BaselineModel.FoundationModel.Name` 基础模型名称,可通过 *ListFoundationModels* 接口查询。 **ConfigurationId** `string` | 模型配置 ID `TargetRouter.BaselineModel.FoundationModel.ConfigurationId` 模型配置 ID。默认为空,使用模型默认配置。 **CandidateModels** `object[]` | 候选模型列表。 `TargetRouter.CandidateModels` **CustomModelId** `string` | 定制模型 ID `TargetRouter.CandidateModels.CustomModelId` 定制模型 ID,以 `cm-` 开头,与 *FoundationModel* 二选一。 **FoundationModel** `object` | 基础模型引用 `TargetRouter.CandidateModels.FoundationModel` 基础模型引用,与 *CustomModelId* 二选一。指定基础模型时必填该字段。 **ModelVersion** `string` `必选` | 基础模型版本 `TargetRouter.CandidateModels.FoundationModel.ModelVersion` 基础模型版本号,可通过 *ListFoundationModels* 接口查询。 **Name** `string` `必选` | 基础模型名称 `TargetRouter.CandidateModels.FoundationModel.Name` 基础模型名称,可通过 *ListFoundationModels* 接口查询。 **ConfigurationId** `string` | 模型配置 ID `TargetRouter.CandidateModels.FoundationModel.ConfigurationId` 模型配置 ID。默认为空,使用模型默认配置。 ## 响应参数 **Id** `string` | 滚动更新任务 ID 新建滚动更新任务的 ID,可用于查询任务状态或执行回滚 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=CreateEndpointRolling&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "EndpointId": "ep-20260507230659-skvgn", "ModelReference": { "CustomModelId": "", "FoundationModel": { "Name": "doubao-seed-2-0-pro", "ModelVersion": "260328" } }, "Description": "灰度升级至新版本,观察效果与稳定性", "TargetRouter": { "Strategy": "Balanced", "Mode": "Automatic", "CandidateModels": [] } } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "20240514212755F607182F05EF08192A", "Action": "CreateEndpointRolling", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "Id": "rolling-20240514212750-abc12" } } ``` --- # 查询推理接入点滚动升级详情 Source: https://ark.volcengine.com/region:cn-beijing/docs/get-endpoint-rolling-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=GetEndpointRolling&Version=2024-01-01` 查询指定滚动更新任务的详细信息,包括状态、灰度比例、滚动策略及执行日志。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **Id** `string` `必选` | 滚动更新任务 ID 要查询的滚动更新任务 ID ## 响应参数 **RollingInfo** `object` | 滚动更新详情 滚动更新任务的详细信息 **CreateTime** `string` | 创建时间 `RollingInfo.CreateTime` 滚动更新任务的创建时间 **EndpointId** `string` | 接入点 ID `RollingInfo.EndpointId` 滚动更新所属的推理接入点 ID **Id** `string` | 滚动更新任务 ID `RollingInfo.Id` 滚动更新任务的唯一标识 **RollingGray** `number` | 灰度比例 `RollingInfo.RollingGray` 当前滚动更新的灰度比例,取值范围 0~1 **RollingIn** `object` | 滚动入快照 `RollingInfo.RollingIn` 滚动更新的目标模型快照(即将切入的版本) **ModelVersion** `string` | 模型版本 `RollingInfo.RollingIn.ModelVersion` **Name** `string` | 模型名称 `RollingInfo.RollingIn.Name` **RouterInfo** `object` | 路由信息 `RollingInfo.RollingIn.RouterInfo` 该快照对应的智能路由配置 **Mode** `string` | 路由模式 `RollingInfo.RollingIn.RouterInfo.Mode` 路由模式。取值 `Automatic`(自动)、`CandidateSet`(候选集合)、`Ordered`(按顺序) **Strategy** `string` | 路由策略 `RollingInfo.RollingIn.RouterInfo.Strategy` 路由策略。取值 `EffectFirst`(效果优先)、`CostFirst`(成本优先)、`Balanced`(均衡) **BaselineModel** `object` | 基准模型 `RollingInfo.RollingIn.RouterInfo.BaselineModel` **CustomModelId** `string` | 定制模型 ID `RollingInfo.RollingIn.RouterInfo.BaselineModel.CustomModelId` 定制模型 ID,以 `cm-` 开头,与 *FoundationModel* 二选一。 **FoundationModel** `object` | 基础模型引用 `RollingInfo.RollingIn.RouterInfo.BaselineModel.FoundationModel` 基础模型引用,与 *CustomModelId* 二选一。指定基础模型时必填该字段。 **ModelVersion** `string` | 基础模型版本 `RollingInfo.RollingIn.RouterInfo.BaselineModel.FoundationModel.ModelVersion` 基础模型版本号,可通过 *ListFoundationModels* 接口查询。 **Name** `string` | 基础模型名称 `RollingInfo.RollingIn.RouterInfo.BaselineModel.FoundationModel.Name` 基础模型名称,可通过 *ListFoundationModels* 接口查询。 **ConfigurationId** `string` | 模型配置 ID `RollingInfo.RollingIn.RouterInfo.BaselineModel.FoundationModel.ConfigurationId` 模型配置 ID。默认为空,使用模型默认配置。 **CandidateModels** `object[]` | 候选模型列表。 `RollingInfo.RollingIn.RouterInfo.CandidateModels` **CustomModelId** `string` | 定制模型 ID `RollingInfo.RollingIn.RouterInfo.CandidateModels.CustomModelId` 定制模型 ID,以 `cm-` 开头,与 *FoundationModel* 二选一。 **FoundationModel** `object` | 基础模型引用 `RollingInfo.RollingIn.RouterInfo.CandidateModels.FoundationModel` 基础模型引用,与 *CustomModelId* 二选一。指定基础模型时必填该字段。 **ModelVersion** `string` | 基础模型版本 `RollingInfo.RollingIn.RouterInfo.CandidateModels.FoundationModel.ModelVersion` 基础模型版本号,可通过 *ListFoundationModels* 接口查询。 **Name** `string` | 基础模型名称 `RollingInfo.RollingIn.RouterInfo.CandidateModels.FoundationModel.Name` 基础模型名称,可通过 *ListFoundationModels* 接口查询。 **ConfigurationId** `string` | 模型配置 ID `RollingInfo.RollingIn.RouterInfo.CandidateModels.FoundationModel.ConfigurationId` 模型配置 ID。默认为空,使用模型默认配置。 **RollingOut** `object` | 滚动出快照 `RollingInfo.RollingOut` 滚动更新的原始模型快照(即将切出的版本) **ModelVersion** `string` | 模型版本 `RollingInfo.RollingOut.ModelVersion` **Name** `string` | 模型名称 `RollingInfo.RollingOut.Name` **RouterInfo** `object` | 路由信息 `RollingInfo.RollingOut.RouterInfo` 该快照对应的智能路由配置 **Mode** `string` | 路由模式 `RollingInfo.RollingOut.RouterInfo.Mode` 路由模式。取值 `Automatic`(自动)、`CandidateSet`(候选集合)、`Ordered`(按顺序) **Strategy** `string` | 路由策略 `RollingInfo.RollingOut.RouterInfo.Strategy` 路由策略。取值 `EffectFirst`(效果优先)、`CostFirst`(成本优先)、`Balanced`(均衡) **BaselineModel** `object` | 基准模型 `RollingInfo.RollingOut.RouterInfo.BaselineModel` **CustomModelId** `string` | 定制模型 ID `RollingInfo.RollingOut.RouterInfo.BaselineModel.CustomModelId` 定制模型 ID,以 `cm-` 开头,与 *FoundationModel* 二选一。 **FoundationModel** `object` | 基础模型引用 `RollingInfo.RollingOut.RouterInfo.BaselineModel.FoundationModel` 基础模型引用,与 *CustomModelId* 二选一。指定基础模型时必填该字段。 **ModelVersion** `string` | 基础模型版本 `RollingInfo.RollingOut.RouterInfo.BaselineModel.FoundationModel.ModelVersion` 基础模型版本号,可通过 *ListFoundationModels* 接口查询。 **Name** `string` | 基础模型名称 `RollingInfo.RollingOut.RouterInfo.BaselineModel.FoundationModel.Name` 基础模型名称,可通过 *ListFoundationModels* 接口查询。 **ConfigurationId** `string` | 模型配置 ID `RollingInfo.RollingOut.RouterInfo.BaselineModel.FoundationModel.ConfigurationId` 模型配置 ID。默认为空,使用模型默认配置。 **CandidateModels** `object[]` | 候选模型列表。 `RollingInfo.RollingOut.RouterInfo.CandidateModels` **CustomModelId** `string` | 定制模型 ID `RollingInfo.RollingOut.RouterInfo.CandidateModels.CustomModelId` 定制模型 ID,以 `cm-` 开头,与 *FoundationModel* 二选一。 **FoundationModel** `object` | 基础模型引用 `RollingInfo.RollingOut.RouterInfo.CandidateModels.FoundationModel` 基础模型引用,与 *CustomModelId* 二选一。指定基础模型时必填该字段。 **ModelVersion** `string` | 基础模型版本 `RollingInfo.RollingOut.RouterInfo.CandidateModels.FoundationModel.ModelVersion` 基础模型版本号,可通过 *ListFoundationModels* 接口查询。 **Name** `string` | 基础模型名称 `RollingInfo.RollingOut.RouterInfo.CandidateModels.FoundationModel.Name` 基础模型名称,可通过 *ListFoundationModels* 接口查询。 **ConfigurationId** `string` | 模型配置 ID `RollingInfo.RollingOut.RouterInfo.CandidateModels.FoundationModel.ConfigurationId` 模型配置 ID。默认为空,使用模型默认配置。 **RollingStrategy** `object` | 滚动策略 `RollingInfo.RollingStrategy` 滚动更新的执行策略配置 **Step** `integer` | 灰度步长 `RollingInfo.RollingStrategy.Step` 每次灰度递增的步长百分比 **WaitDuration** `integer` | 等待时长 `RollingInfo.RollingStrategy.WaitDuration` 每次灰度递增后的观察等待时长(秒) **RollingTraceList** `object[]` | 执行日志列表 `RollingInfo.RollingTraceList` 滚动更新的执行日志列表,记录每次灰度变更 **CreateTime** `string` | 日志时间 `RollingInfo.RollingTraceList.CreateTime` 该日志记录的创建时间 **Message** `string` | 日志消息 `RollingInfo.RollingTraceList.Message` 该日志记录的详细消息内容 **Status** `string` | 任务状态 `RollingInfo.Status` 滚动更新任务的当前状态 **UpdateTime** `string` | 更新时间 `RollingInfo.UpdateTime` 滚动更新任务的最近更新时间 **GrayWhenRevert** `number` | 回滚时灰度比例 `RollingInfo.GrayWhenRevert` 执行回滚时的灰度比例 **InferenceDefaultParam** `object` | 推理默认参数 `RollingInfo.InferenceDefaultParam` 推理默认参数配置 **ThinkingConfig** `object` | Thinking 配置 `RollingInfo.InferenceDefaultParam.ThinkingConfig` **Enabled** `boolean` | 是否启用 Thinking `RollingInfo.InferenceDefaultParam.ThinkingConfig.Enabled` 是否启用 Thinking 能力 **Message** `string` | 附加消息 `RollingInfo.Message` 滚动更新任务的附加消息,如失败原因等 **RevertTime** `string` | 回滚时间 `RollingInfo.RevertTime` 滚动更新被回滚的时间,未回滚时为空 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=GetEndpointRolling&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "Id": "rolling-20240514212750-abc12" } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "20240514212756071829300ABCEF01B4", "Action": "GetEndpointRolling", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "RollingInfo": { "EndpointId": "ep-20260507230659-skvgn", "Id": "rolling-20240514212750-abc12", "Status": "Running", "RollingIn": { "Name": "doubao-seed-2-0-pro", "ModelVersion": "260328", "RouterInfo": { "Strategy": "Balanced", "Mode": "Automatic", "CandidateModels": [] } }, "RollingOut": { "Name": "doubao-seed-2-0-pro", "ModelVersion": "260215", "RouterInfo": { "Strategy": "Balanced", "Mode": "Automatic", "CandidateModels": [] } }, "RollingGray": 0.4, "CreateTime": "2024-05-14T21:27:50Z", "UpdateTime": "2024-05-14T21:45:20Z", "RollingStrategy": { "Step": 20, "WaitDuration": 300 }, "RollingTraceList": [ { "CreateTime": "2024-05-14T21:27:50Z", "Message": "滚动更新任务已创建,初始灰度比例 0%。" }, { "CreateTime": "2024-05-14T21:35:00Z", "Message": "灰度比例递增至 20%。" }, { "CreateTime": "2024-05-14T21:45:20Z", "Message": "灰度比例递增至 40%。" } ], "RevertTime": "", "GrayWhenRevert": 0, "InferenceDefaultParam": { "ThinkingConfig": { "Enabled": false } }, "Message": "" } } } ``` --- # 回滚推理接入点滚动升级 Source: https://ark.volcengine.com/region:cn-beijing/docs/rollback-endpoint-rolling-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=RollbackEndpointRolling&Version=2024-01-01` 回滚指定的滚动更新任务,将推理接入点恢复到滚动更新开始前的状态。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **Id** `string` `必选` | 滚动更新任务 ID 要回滚的滚动更新任务 ID **Message** `string` | 回滚原因 回滚操作的原因说明 ## 响应参数 **Id** `string` | 滚动更新任务 ID 已回滚的滚动更新任务 ID ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=RollbackEndpointRolling&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "Id": "rolling-20240514212750-abc12", "Message": "接入点 ep-20260507230659-skvgn 的新版本存在推理异常,回滚至上一版本。" } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "2024051421275807182930ABCDEF08D6", "Action": "RollbackEndpointRolling", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "Id": "rolling-20240514212750-abc12" } } ``` --- # 取消推理接入点滚动升级 Source: https://ark.volcengine.com/region:cn-beijing/docs/cancel-endpoint-rolling-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=CancelEndpointRolling&Version=2024-01-01` 取消指定的正在进行中的滚动更新任务,接入点保留当前灰度比例对应的模型版本。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **Id** `string` `必选` | 滚动更新任务 ID 要取消的滚动更新任务 ID **Message** `string` | 取消原因 取消操作的原因说明 ## 响应参数 **Id** `string` | 滚动更新任务 ID 已取消的滚动更新任务 ID ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=CancelEndpointRolling&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "Id": "rolling-20240514212750-abc12", "Message": "接入点 ep-20260507230659-skvgn 的新版本效果不达预期,取消滚动更新保留当前灰度比例。" } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "2024051421275707182930ABCDEF07C5", "Action": "CancelEndpointRolling", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "Id": "rolling-20240514212750-abc12" } } ``` --- # 创建评测任务 Source: https://ark.volcengine.com/region:cn-beijing/docs/create-evaluation-job-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=CreateEvaluationJob&Version=2024-01-01` 创建一个模型评测任务,对指定模型通过评测集进行自动化评测。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **EvaluationDatasets** `object[]` `必选` | 评测集列表 评测集列表,用于评测目标模型在不同能力维度上的表现。可同时指定多个评测集组合评估。 > **说明** > > 评测集支持平台预置(`AdminDataset`)与用户自定义(`UserDataset`)两类。用户自定义评测集需先上传至 TOS(仅支持华北 2-北京地域),并按平台规定的 JSONL 格式组织样本。 **DatasetType** `string` `必选` | 评测集类型 `EvaluationDatasets.DatasetType` 评测集类型,决定评测集来源: - `AdminDataset`:平台预置评测集。 - `UserDataset`:用户自定义评测集(需通过 TOS 上传)。 **Method** `string` `必选` | 评测算法 `EvaluationDatasets.Method` 评测算法,决定如何对模型输出进行打分: - `Include`:包含匹配,模型输出中包含期望答案即判正确。 - `BuiltIn`:平台内置算法(如 LLM-as-Judge 等)。 - `Match`:精确匹配,模型输出与期望答案完全一致才判正确。 - `InferenceOnly`:仅做推理、不进行评分,常用于数据采集场景。 **AdminEvaluationDatasetId** `string` | 预置评测集 ID `EvaluationDatasets.AdminEvaluationDatasetId` 平台预置评测集的 ID。当 *DatasetType* 为 `AdminDataset` 时填写。 **EvaluationAbility** `string` | 评测能力维度 `EvaluationDatasets.EvaluationAbility` 评测集所覆盖的能力维度名称,例如 MMLU、CMMLU 等。 **ScoringWeight** `integer` | 评测分数比重 `EvaluationDatasets.ScoringWeight` 评测集在最终综合评分中所占的分数权重,数值越大该评测集对综合分数的影响越大。 **TosLocation** `object` | 评测集 TOS 位置 `EvaluationDatasets.TosLocation` 用户自定义评测集在 TOS 中的存储位置。当 *DatasetType* 为 `UserDataset` 时必填。 **BucketName** `string` `必选` | TOS 桶名称 `EvaluationDatasets.TosLocation.BucketName` > **说明:注意** > > 当前火山方舟仅支持华北 2-北京地域(`region: cn-beijing`)的 TOS 桶。请在创建或选择桶时确认地域。 **ObjectKey** `string` `必选` | TOS 对象路径 `EvaluationDatasets.TosLocation.ObjectKey` TOS 对象路径(Object Key),指向具体的评测集或结果文件。 **Name** `string` `必选` | 任务名称 模型评测任务的名称,用于在控制台和接口中标识该任务。 **DatasetFormat** `string` `默认值 SingleTurn` | 评测集数据格式 评测集数据格式,决定平台如何解析评测集样本: - `SingleTurn`:单轮对话格式。 - `MultiTurn`:多轮对话格式。 **Description** `string` | 任务描述 模型评测任务的描述,用于补充说明任务用途、背景等信息。 **DryRun** `boolean` `默认值 false` | 是否仅做预检 是否仅对此请求进行预检: - `true`:仅做参数与权限校验,不会真正创建评测任务。 - `false`:发送正常请求,创建评测任务。 **EndpointId** `string` | 接入点 ID 接入点 ID。当通过接入点(Endpoint)指定评测对象时填写,可在控制台的接入点列表页获取。与 *ModelReference* 二选一。 **EvaluationJobSettings** `object` | 高级设置 评测任务的高级设置,包含推理参数、结果存储位置、裁判模型 system prompt 等。 **EnableLogProbs** `boolean` | 是否启用 Logprobs `EvaluationJobSettings.EnableLogProbs` 是否在评测过程中启用 Logprobs(返回每个 token 的对数概率)。 **InferenceParameters** `object` | 推理参数 `EvaluationJobSettings.InferenceParameters` 推理参数配置,控制评测过程中模型的生成行为。 **FrequencyPenalty** `string` | 频率惩罚系数 `EvaluationJobSettings.InferenceParameters.FrequencyPenalty` 频率惩罚系数。值为正数时,会根据新 token 在生成文本中出现的频率施加惩罚,降低模型逐字重复的概率。 **取值范围**:`[-2, 2]` **Logprobs** `boolean` | 是否启用 Logprobs `EvaluationJobSettings.InferenceParameters.Logprobs` 是否在推理结果中返回每个 token 的对数概率(Logprobs)。 **MaxTokens** `integer` | 最大输出 token 数 `EvaluationJobSettings.InferenceParameters.MaxTokens` 模型本次推理可生成的最大 token 数。 **取值范围**:`[0, 4096]` **Stop** `string[]` | 停止生成字符串 `EvaluationJobSettings.InferenceParameters.Stop` 停止生成的字符串列表。模型遇到列表中任一字符串时立即停止生成,且该字符串本身不会输出。最多支持 4 个。 **Temperature** `string` | 采样温度 `EvaluationJobSettings.InferenceParameters.Temperature` 采样温度。控制对每个候选 token 概率分布的平滑程度,值越大输出越随机、越小越确定。 **取值范围**:`[0, 1]` **TopLogprobs** `integer` | TopLogprobs 数量 `EvaluationJobSettings.InferenceParameters.TopLogprobs` 每个输出 token 位置最多返回的最可能 token 数量,每个 token 都附带对数概率。仅当 *Logprobs* 为 `true` 时生效。 **取值范围**:`[0, 20]` **TopP** `string` | 核采样概率阈值 `EvaluationJobSettings.InferenceParameters.TopP` 核采样概率阈值。模型只考虑累计概率落在 *TopP* 内的候选 token 集合。 **取值范围**:`[0, 1]` **LLMJudgeMetricSystemPrompt** `string` | 裁判模型 system prompt `EvaluationJobSettings.LLMJudgeMetricSystemPrompt` 裁判模型(LLM-as-Judge)的 system prompt,用于描述评估指标和打分规则。仅当评测算法为 `BuiltIn` 且涉及 LLM 裁判时生效。 **ResultTosLocation** `object` | 结果存储 TOS 位置 `EvaluationJobSettings.ResultTosLocation` 评测结果在 TOS 的存储位置。未指定时使用平台默认存储。 **BucketName** `string` `必选` | TOS 桶名称 `EvaluationJobSettings.ResultTosLocation.BucketName` > **说明:注意** > > 当前火山方舟仅支持华北 2-北京地域(`region: cn-beijing`)的 TOS 桶。请在创建或选择桶时确认地域。 **ObjectKey** `string` `必选` | TOS 对象路径 `EvaluationJobSettings.ResultTosLocation.ObjectKey` TOS 对象路径(Object Key),指向具体的评测集或结果文件。 **IgnoreCache** `boolean` | 是否忽略缓存 是否忽略推理缓存。开启后即便存在历史相同输入的推理结果,也会重新调用模型推理。 **InferenceType** `string` `默认值 ChatInference` | 推理类型 推理类型,决定评测时调用模型的方式: - `BatchInference`:批量推理,适合大规模评测,吞吐高、延迟不敏感。 - `ChatInference`:在线推理,逐条请求,延迟低。 **ModelReference** `object` | 评测对象(模型) 评测对象(模型)的引用信息,用于指定参与评测的模型。与 *EndpointId* 二选一指定评测对象。 **CustomModelId** `string` | 定制模型 ID `ModelReference.CustomModelId` 定制模型的 ID。当评测对象为定制(精调)模型时填写。 **FoundationModel** `object` | 基础模型 `ModelReference.FoundationModel` 基础模型引用。当评测对象为基础模型时填写。 **ModelVersion** `string` `必选` | 基础模型版本 `ModelReference.FoundationModel.ModelVersion` 基础模型的版本号。 **Name** `string` `必选` | 基础模型名称 `ModelReference.FoundationModel.Name` 基础模型的名称,例如 `doubao-seed-2-1-pro-260628`。 **Platform** `string` | 平台标识 调用方平台标识,用于平台侧统计与路由,通常无需手动设置。 **ProjectName** `string` `默认值 default` | 项目名称 资源所属的项目名称。若资源不在默认项目中,需填写正确的项目名称。 **Tags** `object[]` | 任务标签 模型评测任务绑定的标签列表,用于资源分类与检索。 **Key** `string` `必选` | 标签键 `Tags.Key` **Value** `string` `必选` | 标签值 `Tags.Value` ## 响应参数 **Id** `string` | 评测任务 ID 新创建的模型评测任务的 ID。可用于后续查询、更新、终止或删除该任务。 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=CreateEvaluationJob&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "Name": "测试任务", "EndpointId": "ep-20240401114848-hzfcz", "EvaluationDatasets": [ { "DatasetType": "AdminDataset", "AdminEvaluationDatasetId": "aed-20240227112053-bt425", "Method": "BuiltIn", "EvaluationAbility": "MMLU", "ScoringWeight": 3107 } ] } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "202404111449574CC61570F45B511EF0", "Action": "CreateEvaluationJob", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "Id": "ej-20240411144957-hxj6z" } } ``` --- # 删除评测任务 Source: https://ark.volcengine.com/region:cn-beijing/docs/delete-evaluation-job-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=DeleteEvaluationJob&Version=2024-01-01` 删除指定的模型评测任务。任务删除后不可恢复,请确认任务已停止运行且评测结果已确认后再执行删除。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **Id** `string` `必选` | 评测任务 ID 待删除的模型评测任务 ID。可在控制台评测任务列表页获取,或通过 *ListEvaluationJobs* 接口查询。 **DryRun** `boolean` `默认值 false` | 是否仅做预检 是否仅对此请求进行预检: - `true`:仅做参数与权限校验,不会真正删除任务。 - `false`:发送正常请求,删除评测任务。 ## 响应参数 本接口无特有的返回参数,成功时 HTTP 状态码为 `200`,返回结构中 `Result` 为空对象 `{}`。 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=DeleteEvaluationJob&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "Id": "ej-20240314132354-rvsrg" } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "20240411145812046C7CCC3CCCE87016", "Action": "DeleteEvaluationJob", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": {} } ``` --- # 获取评测任务 Source: https://ark.volcengine.com/region:cn-beijing/docs/get-evaluation-job-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=GetEvaluationJob&Version=2024-01-01` 获取指定模型评测任务的详细信息,包括任务名称、状态、关联模型和评测结果存储地址等。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **Id** `string` `必选` | 评测任务 ID 模型评测任务的 ID。可在控制台评测任务列表页获取,或通过 *ListEvaluationJobs* 接口查询。 ## 响应参数 **BatchInferenceJobId** `string` | 批量推理任务 ID 关联的批量推理任务 ID。仅当 *InferenceType* 为 `BatchInference` 时返回。 **CreateTime** `string` | 创建时间 模型评测任务的创建时间,RFC 3339 格式。 **Description** `string` | 任务描述 模型评测任务描述。 **EndpointId** `string` | 接入点 ID 评测任务对应接入点的 ID(若通过接入点指定评测对象)。 **Id** `string` | 评测任务 ID 模型评测任务的 ID。 **InferenceType** `string` | 推理类型 推理类型: - `BatchInference`:批量推理。 - `ChatInference`:在线推理。 **ModelReference** `object` | 评测对象 评测对象(模型)的引用信息,包含基础模型或定制模型的引用。 **CustomModelId** `string` | 定制模型 ID `ModelReference.CustomModelId` 定制模型的 ID。 **FoundationModel** `object` | 基础模型 `ModelReference.FoundationModel` 基础模型引用。 **ModelVersion** `string` | 基础模型版本 `ModelReference.FoundationModel.ModelVersion` 基础模型版本号。 **Name** `string` | 基础模型名称 `ModelReference.FoundationModel.Name` **Name** `string` | 任务名称 模型评测任务名称。 **ProjectName** `string` | 所属项目 评测任务所属的项目名称。 **ResultTosLocation** `object` | 评测结果 TOS 地址 评测任务运行成功后,评测结果的 TOS 存储地址。 **BucketName** `string` | TOS 桶名称 `ResultTosLocation.BucketName` > **说明:注意** > > 当前火山方舟仅支持华北 2-北京地域(`region: cn-beijing`)的 TOS 桶。 **ObjectKey** `string` | TOS 对象路径 `ResultTosLocation.ObjectKey` TOS 对象路径(Object Key)。 **Status** `object` | 任务状态 模型评测任务的状态元信息,包含当前状态、状态更新时间与附加说明。 > **说明** > > 评测任务状态机一般经历:`Queued`(排队中) → `Running`(运行中) → `Succeeded`(已完成) / `Failed`(失败) / `Terminated`(已停止)。停止或失败后任务不可恢复,需重新创建。 **Phase** `string` | 任务状态 `Status.Phase` 评测任务的当前状态阶段。取值通常为 `Queued`、`Running`、`Succeeded`、`Failed`、`Terminated` 等。 **PhaseTime** `string` | 状态更新时间 `Status.PhaseTime` 任务最近一次进入当前状态的时间,RFC 3339 格式。 **Message** `string` | 状态说明 `Status.Message` 状态附加说明。当任务为 `Failed` 状态时通常包含失败原因。 **Tags** `object[]` | 任务标签 模型评测任务绑定的标签列表。 **Key** `string` | 标签键 `Tags.Key` **Value** `string` | 标签值 `Tags.Value` **UpdateTime** `string` | 更新时间 模型评测任务最近一次更新时间,RFC 3339 格式。 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=GetEvaluationJob&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "Id": "ej-20240401114848-w5b8f" } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "20240401115441B7A29C481EFC026D93", "Action": "GetEvaluationJob", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "Id": "ej-20240401114848-w5b8f", "Name": "test-evaluation-job", "Description": "示例评测任务", "ModelReference": { "CustomModelId": "cm-20240401114541-5gzd8" }, "EndpointId": "ep-20240401114848-hzfcz", "ResultTosLocation": { "ObjectKey": "ark/ej-20240401114848-w5b8f/inference_result/results/", "BucketName": "ark-auto-created-required-0123456789-cn-beijing" }, "Status": { "Phase": "Succeeded", "PhaseTime": "2024-04-01T11:54:41Z", "Message": "评测任务已成功完成" }, "Tags": [ { "Key": "owner", "Value": "team-a" } ], "ProjectName": "default", "CreateTime": "2024-04-01T11:48:48Z", "UpdateTime": "2024-04-01T11:54:41Z" } } ``` --- # 获取评测任务结果 Source: https://ark.volcengine.com/region:cn-beijing/docs/get-evaluation-result-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=GetEvaluationResult&Version=2024-01-01` 获取指定模型评测结果的详细信息,包括评测集、评测指标、Token 消耗等。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **Id** `string` `必选` | 评测结果 ID 模型评测结果的 ID。可通过 *ListEvaluationResults* 接口查询。 ## 响应参数 **AdminEvaluationDatasetId** `string` | 预置评测集 ID 平台预置评测集的 ID。当 *DatasetType* 为 `AdminDataset` 时返回。 **CreateTime** `string` | 创建时间 模型评测结果的创建时间,RFC 3339 格式。 **DatasetDisplayName** `string` | 评测集展示名称 评测集的展示名称(面向用户)。 **DatasetName** `string` | 评测集名称 评测集的内部名称(机读名)。 **DatasetTosLocation** `object` | 自定义数据集 TOS 地址 用户自定义评测集在 TOS 中的存储地址。当 *DatasetType* 为 `UserDataset` 时返回。 **BucketName** `string` | TOS 桶名称 `DatasetTosLocation.BucketName` > **说明:注意** > > 当前火山方舟仅支持华北 2-北京地域(`region: cn-beijing`)的 TOS 桶。 **ObjectKey** `string` | TOS 对象路径 `DatasetTosLocation.ObjectKey` TOS 对象路径(Object Key)。 **DatasetType** `string` | 评测集种类 评测集的类型: - `AdminDataset`:平台预置评测集。 - `UserDataset`:用户自定义评测集。 **EvaluationAbility** `string` | 能力维度 评测集所覆盖的能力维度名称,例如 MMLU、CMMLU 等。 **EvaluationJobId** `string` | 评测任务 ID 评测结果对应的模型评测任务 ID。 **HasCompleted** `boolean` | 是否已完成 评测结果是否已完成统计。`false` 表示评测任务仍在运行或部分指标尚未产出。 **Id** `string` | 评测结果 ID 模型评测结果的 ID。 **Method** `string` | 评测算法 评测算法: - `Include`:包含匹配。 - `BuiltIn`:平台内置算法。 - `Match`:精确匹配。 - `InferenceOnly`:仅推理、不打分。 **Metrics** `object[]` | 评测指标 评测得到的指标数组。每个元素包含指标名称与分数。 > **说明** > > 指标 *Name* 取决于评测集与算法,例如准确率(Accuracy)、F1 分数、BLEU、ROUGE 等;*Value* 通常为 0-100 的分数字符串。 **Name** `string` | 指标名称 `Metrics.Name` 评测指标名称,例如 Accuracy、F1、BLEU 等。 **Value** `string` | 指标分数 `Metrics.Value` 评测指标的数值(字符串形式表示,便于承载不同精度)。 **SamplesTosLocation** `object` | 全部样本 TOS 地址 评测结果全量样本文件的 TOS 地址。 **BucketName** `string` | TOS 桶名称 `SamplesTosLocation.BucketName` > **说明:注意** > > 当前火山方舟仅支持华北 2-北京地域(`region: cn-beijing`)的 TOS 桶。 **ObjectKey** `string` | TOS 对象路径 `SamplesTosLocation.ObjectKey` TOS 对象路径(Object Key)。 **SampleTosLocation** `object` | 样本 TOS 地址(最多 50 条) 评测结果样本文件的 TOS 地址,最多包含 50 条样本。 **BucketName** `string` | TOS 桶名称 `SampleTosLocation.BucketName` > **说明:注意** > > 当前火山方舟仅支持华北 2-北京地域(`region: cn-beijing`)的 TOS 桶。 **ObjectKey** `string` | TOS 对象路径 `SampleTosLocation.ObjectKey` TOS 对象路径(Object Key)。 **ScoringWeight** `integer` | 分数比重 评测集在该任务综合评分中的分数权重。 **TokenUsage** `object` | Token 消耗量 本次评测总的 token 消耗量,分别统计 prompt 与 response。 **TotalTokenCount** `integer` | 总 token 数 `TokenUsage.TotalTokenCount` 评测总 token 数,等于 *PromptTokenCount* 与 *ResponseTokenCount* 之和。 **PromptTokenCount** `integer` | Prompt token 数 `TokenUsage.PromptTokenCount` 评测过程中所有 prompt 累积的 token 数。 **ResponseTokenCount** `integer` | Response token 数 `TokenUsage.ResponseTokenCount` 评测过程中所有模型 response 累积的 token 数。 **UpdateTime** `string` | 更新时间 模型评测结果的更新时间,RFC 3339 格式。 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=GetEvaluationResult&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "Id": "er-20240326054800-shhvj" } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "202404111438083076CAB39885F31BD6", "Action": "GetEvaluationResult", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "Id": "er-20240326054800-shhvj", "EvaluationJobId": "ej-20240326054800-gl9rp", "DatasetType": "AdminDataset", "AdminEvaluationDatasetId": "aed-20240227112053-bt425", "DatasetName": "ark-ff-mmlu-other-5shots", "DatasetDisplayName": "MMLU 其他学科", "EvaluationAbility": "MMLU", "ScoringWeight": 3107, "Method": "BuiltIn", "Metrics": null, "TokenUsage": { "TotalTokenCount": 0 }, "SamplesTosLocation": { "BucketName": "", "ObjectKey": "" }, "CreateTime": "2024-03-26T05:48:00Z", "UpdateTime": "2024-03-26T05:48:00Z" } } ``` --- # 获取评测任务列表 Source: https://ark.volcengine.com/region:cn-beijing/docs/list-evaluation-jobs-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=ListEvaluationJobs&Version=2024-01-01` 获取评测任务列表,支持按创建时间/更新时间排序,并可通过标签、状态、模型等条件进行筛选。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **Filter** `object` | 任务筛选条件 评测任务的筛选条件,可按状态、模型、ID 等过滤。 **CustomModelIds** `string[]` | 定制模型 ID 列表 `Filter.CustomModelIds` 定制模型 ID 列表,用于筛选评测对象为指定定制模型的任务。 **Description** `string` | 任务描述模糊匹配 `Filter.Description` 评测任务描述的模糊匹配关键字。 **FoundationModels** `object[]` | 基础模型筛选 `Filter.FoundationModels` 基础模型筛选条件列表,多项为「或」关系。 **Name** `string` `必选` | 基础模型名称 `Filter.FoundationModels.Name` **ModelVersions** `string[]` | 基础模型版本列表 `Filter.FoundationModels.ModelVersions` 基础模型版本列表,多版本为「或」关系。 **Id** `string` | 任务 ID 模糊匹配 `Filter.Id` 评测任务 ID 的模糊匹配关键字。 **Ids** `string[]` | 任务 ID 列表 `Filter.Ids` 精确匹配的评测任务 ID 列表。 **Name** `string` | 任务名称模糊匹配 `Filter.Name` 评测任务名称的模糊匹配关键字。 **Phases** `string[]` | 任务状态列表 `Filter.Phases` 评测任务状态列表,取值参考 *EvaluationJobStatus.Phase*。多值为「或」关系。 **PageNumber** `integer` `默认值 1` | 起始页码 分页查询的起始页码,从 1 开始。 **最小值**:`1` **PageSize** `integer` `默认值 10` | 每页记录数 每页返回的记录数。 **取值范围**:`[1, 100]` **ProjectName** `string` `默认值 default` | 所属项目 资源所属的项目名称。若资源不在默认项目中,需填写正确的项目名称。 **SortBy** `string` `默认值 CreateTime` | 排序指标 排序指标: - `CreateTime`:按创建时间排序。 - `UpdateTime`:按更新时间排序。 **SortOrder** `string` `默认值 Desc` | 排序顺序 排序顺序: - `Asc`:升序。 - `Desc`:降序。 **TagFilters** `object[]` | 标签筛选条件 基于绑定标签的筛选条件。多个标签为「与」关系。 **Key** `string` `必选` | 标签键 `TagFilters.Key` **Values** `string[]` | 标签值列表 `TagFilters.Values` 标签值列表,多值为「或」关系。 ## 响应参数 **Items** `object[]` | 任务列表 本页返回的模型评测任务列表。 **CreateTime** `string` | 创建时间 `Items.CreateTime` 评测任务的创建时间,RFC 3339 格式。 **Description** `string` | 任务描述 `Items.Description` 模型评测任务描述。 **Id** `string` | 评测任务 ID `Items.Id` 模型评测任务的 ID。 **ModelReference** `object` | 评测对象 `Items.ModelReference` 评测对象(模型)的引用信息。 **CustomModelId** `string` | 定制模型 ID `Items.ModelReference.CustomModelId` 定制模型的 ID。 **FoundationModel** `object` | 基础模型 `Items.ModelReference.FoundationModel` 基础模型引用。 **ModelVersion** `string` | 基础模型版本 `Items.ModelReference.FoundationModel.ModelVersion` 基础模型版本号。 **Name** `string` | 基础模型名称 `Items.ModelReference.FoundationModel.Name` **Name** `string` | 任务名称 `Items.Name` 模型评测任务名称。 **ProjectName** `string` | 所属项目 `Items.ProjectName` 评测任务所属的项目名称。 **Tags** `object[]` | 任务标签 `Items.Tags` 评测任务绑定的标签列表。 **Key** `string` | 标签键 `Items.Tags.Key` **Value** `string` | 标签值 `Items.Tags.Value` **UpdateTime** `string` | 更新时间 `Items.UpdateTime` 评测任务最近一次更新时间,RFC 3339 格式。 **EndpointId** `string` | 接入点 ID `Items.EndpointId` 评测任务对应接入点的 ID。 **ResultTosLocation** `object` | 评测结果 TOS 地址 `Items.ResultTosLocation` 评测结果在 TOS 的存储地址。 **BucketName** `string` | TOS 桶名称 `Items.ResultTosLocation.BucketName` > **说明:注意** > > 当前火山方舟仅支持华北 2-北京地域(`region: cn-beijing`)的 TOS 桶。 **ObjectKey** `string` | TOS 对象路径 `Items.ResultTosLocation.ObjectKey` TOS 对象路径(Object Key)。 **Status** `object` | 任务状态 `Items.Status` 评测任务的状态元信息。 **Phase** `string` | 任务状态 `Items.Status.Phase` 评测任务的当前状态阶段。取值通常为 `Queued`、`Running`、`Succeeded`、`Failed`、`Terminated` 等。 > **说明** > > 状态机:`Queued` -> `Running` -> `Succeeded` / `Failed` / `Terminated`,终态后不可恢复运行。 **PhaseTime** `string` | 状态更新时间 `Items.Status.PhaseTime` 任务最近一次进入当前状态的时间,RFC 3339 格式。 **Message** `string` | 状态说明 `Items.Status.Message` 状态附加说明。当任务为 `Failed` 状态时通常包含失败原因。 **PageNumber** `integer` | 起始页码 当前返回结果的页码。 **PageSize** `integer` | 每页记录数 当前返回结果的单页记录数。 **TotalCount** `integer` | 任务总数 符合筛选条件的评测任务总数。 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=ListEvaluationJobs&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "PageNumber": 1, "PageSize": 1, "SortOrder": "Asc", "SortBy": "CreateTime", "TagFilters": [], "ProjectName": "default", "Filter": { "Phases": [ "Succeeded" ] } } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "20240411145356A067F3B9F09679456C", "Action": "ListEvaluationJobs", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "TotalCount": 10, "PageNumber": 1, "PageSize": 10, "Items": [ { "Id": "ej-20240401114848-w5b8f", "Name": "test-evaluation-job", "Description": "示例评测任务", "ModelReference": { "CustomModelId": "cm-20240401114541-5gzd8" }, "EndpointId": "ep-20240401114848-hzfcz", "ResultTosLocation": { "BucketName": "ark-auto-created-required-0123456789-cn-beijing", "ObjectKey": "ark/ej-20240401114848-w5b8f/inference_result/results/" }, "Status": { "Phase": "Succeeded", "PhaseTime": "2024-04-01T11:54:41Z", "Message": "评测任务已成功完成" }, "Tags": [ { "Key": "owner", "Value": "team-a" } ], "ProjectName": "default", "CreateTime": "2024-04-01T11:48:48Z", "UpdateTime": "2024-04-01T11:54:41Z" } ] } } ``` --- # 获取评测任务结果列表 Source: https://ark.volcengine.com/region:cn-beijing/docs/list-evaluation-results-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=ListEvaluationResults&Version=2024-01-01` 获取指定模型评测任务下的评测结果列表,支持按评测维度、创建时间等维度筛选和排序。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **EvaluationJobId** `string` `必选` | 评测任务 ID 待查询评测结果所属的模型评测任务 ID。 **Filter** `object` | 筛选条件 评测结果的筛选条件,可按能力维度、ID 等过滤。 **EvaluationAbilities** `string[]` | 能力维度列表 `Filter.EvaluationAbilities` 能力维度列表,按能力维度筛选评测结果。多值为「或」关系。 **Ids** `string[]` | 评测结果 ID 列表 `Filter.Ids` 精确匹配的评测结果 ID 列表。 **PageNumber** `integer` `默认值 1` | 起始页码 分页查询的起始页码,从 1 开始。 **最小值**:`1` **PageSize** `integer` `默认值 10` | 每页记录数 每页返回的记录数。 **取值范围**:`[1, 100]` **ProjectName** `string` `默认值 default` | 项目名称 资源所属的项目名称。若资源不在默认项目中,需填写正确的项目名称。 **SortBy** `string` `默认值 CreateTime` | 排序指标 排序指标: - `CreateTime`:按创建时间排序。 - `UpdateTime`:按更新时间排序。 **SortOrder** `string` `默认值 Desc` | 排序顺序 排序顺序: - `Asc`:升序。 - `Desc`:降序。 ## 响应参数 **Items** `object[]` | 评测结果列表 本页返回的模型评测结果列表。 **CreateTime** `string` | 创建时间 `Items.CreateTime` 评测结果创建时间,RFC 3339 格式。 **DatasetDisplayName** `string` | 评测集展示名称 `Items.DatasetDisplayName` 评测集的展示名称(面向用户)。 **DatasetName** `string` | 评测集名称 `Items.DatasetName` 评测集的内部名称(机读名)。 **DatasetType** `string` | 评测集种类 `Items.DatasetType` 评测集的类型: - `AdminDataset`:平台预置评测集。 - `UserDataset`:用户自定义评测集。 **EvaluationAbility** `string` | 能力维度 `Items.EvaluationAbility` 评测集所覆盖的能力维度名称。 **EvaluationJobId** `string` | 评测任务 ID `Items.EvaluationJobId` 评测结果对应的模型评测任务 ID。 **Id** `string` | 评测结果 ID `Items.Id` 模型评测结果的 ID。 **Method** `string` | 评测算法 `Items.Method` 评测算法: - `Include`:包含匹配。 - `BuiltIn`:平台内置算法。 - `Match`:精确匹配。 - `InferenceOnly`:仅推理、不打分。 **Metrics** `object[]` | 评测指标 `Items.Metrics` 评测得到的指标数组。每个元素包含指标名称与分数。 **Name** `string` | 指标名称 `Items.Metrics.Name` 评测指标名称,例如 Accuracy、F1、BLEU 等。 **Value** `string` | 指标分数 `Items.Metrics.Value` 评测指标的数值(字符串形式表示,便于承载不同精度)。 **ScoringWeight** `string` | 分数比重 `Items.ScoringWeight` 评测集在综合评分中的分数权重。 **UpdateTime** `string` | 更新时间 `Items.UpdateTime` 评测结果更新时间,RFC 3339 格式。 **AdminEvaluationDatasetId** `string` | 预置评测集 ID `Items.AdminEvaluationDatasetId` 平台预置评测集的 ID。当 *DatasetType* 为 `AdminDataset` 时返回。 **DatasetTosLocation** `object` | 自定义评测集 TOS 地址 `Items.DatasetTosLocation` 用户自定义评测集在 TOS 中的存储地址。当 *DatasetType* 为 `UserDataset` 时返回。 **BucketName** `string` | TOS 桶名称 `Items.DatasetTosLocation.BucketName` > **说明:注意** > > 当前火山方舟仅支持华北 2-北京地域(`region: cn-beijing`)的 TOS 桶。 **ObjectKey** `string` | TOS 对象路径 `Items.DatasetTosLocation.ObjectKey` TOS 对象路径(Object Key)。 **SamplesTosLocation** `object` | 样本 TOS 地址 `Items.SamplesTosLocation` 评测结果样本文件的 TOS 地址。 **BucketName** `string` | TOS 桶名称 `Items.SamplesTosLocation.BucketName` > **说明:注意** > > 当前火山方舟仅支持华北 2-北京地域(`region: cn-beijing`)的 TOS 桶。 **ObjectKey** `string` | TOS 对象路径 `Items.SamplesTosLocation.ObjectKey` TOS 对象路径(Object Key)。 **TokenUsage** `object` | Token 消耗量 `Items.TokenUsage` 本次评测总的 token 消耗量。 **TotalTokenCount** `integer` | 总 token 数 `Items.TokenUsage.TotalTokenCount` 评测总 token 数,等于 *PromptTokenCount* 与 *ResponseTokenCount* 之和。 **PromptTokenCount** `integer` | Prompt token 数 `Items.TokenUsage.PromptTokenCount` 评测过程中所有 prompt 累积的 token 数。 **ResponseTokenCount** `integer` | Response token 数 `Items.TokenUsage.ResponseTokenCount` 评测过程中所有模型 response 累积的 token 数。 **PageNumber** `integer` | 起始页码 当前返回结果的页码。 **PageSize** `integer` | 每页记录数 当前返回结果的单页记录数。 **TotalCount** `integer` | 结果总数 符合筛选条件的评测结果总数。 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=ListEvaluationResults&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "EvaluationJobId": "ej-20240326054800-gl9rp", "PageNumber": 1, "PageSize": 1, "SortOrder": "Desc", "SortBy": "CreateTime" } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "202404111456299465E1DB51F5B32560", "Action": "ListEvaluationResults", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "TotalCount": 1, "PageNumber": 1, "PageSize": 1, "Items": [ { "Id": "er-20240326054800-shhvj", "EvaluationJobId": "ej-20240326054800-gl9rp", "DatasetType": "AdminDataset", "AdminEvaluationDatasetId": "aed-20240227112053-bt425", "DatasetName": "ark-ff-mmlu-other-5shots", "DatasetDisplayName": "MMLU 其他学科", "EvaluationAbility": "MMLU", "ScoringWeight": 3107, "Method": "BuiltIn", "Metrics": null, "TokenUsage": { "TotalTokenCount": 0 }, "SamplesTosLocation": { "BucketName": "", "ObjectKey": "" }, "CreateTime": "2024-03-26T05:48:00Z", "UpdateTime": "2024-03-26T05:48:00Z" } ] } } ``` --- # 停止评测任务 Source: https://ark.volcengine.com/region:cn-beijing/docs/terminate-evaluation-job-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=TerminateEvaluationJob&Version=2024-01-01` 停止指定的模型评测任务。调用本接口可以终止一个正在运行中的模型评测任务,任务停止后不可恢复运行;如需重新评测,请通过 [创建评测任务](/docs/create-evaluation-job-api) 重新创建任务。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **Id** `string` `必选` | 评测任务 ID 待停止的模型评测任务 ID。可在控制台评测任务列表页获取,或通过 *ListEvaluationJobs* 接口查询。 **DryRun** `boolean` `默认值 false` | 是否仅做预检 是否仅对此请求进行预检: - `true`:仅做参数与权限校验,不会真正停止任务。 - `false`:发送正常请求,停止评测任务。 ## 响应参数 本接口无特有的返回参数,成功时 HTTP 状态码为 `200`,返回结构中 `Result` 为空对象 `{}`。 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=TerminateEvaluationJob&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "Id": "ej-20240326055320-x9k2h" } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "2024041114371255CBA34B3A081E45B1", "Action": "TerminateEvaluationJob", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": {} } ``` --- # 更新评测任务 Source: https://ark.volcengine.com/region:cn-beijing/docs/update-evaluation-job-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=UpdateEvaluationJob&Version=2024-01-01` 更新指定模型评测任务的名称或描述等可变属性。仅模型评测任务的名称(Name)和描述(Description)可在创建后被更新;其他配置(如模型、评测集等)创建后不可修改。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **Id** `string` `必选` | 评测任务 ID 待更新的模型评测任务 ID。可在控制台评测任务列表页获取,或通过 *ListEvaluationJobs* 接口查询。 **Description** `string` | 任务描述 更新后的模型评测任务描述。 **DryRun** `boolean` `默认值 false` | 是否仅做预检 是否仅对此请求进行预检: - `true`:仅做参数与权限校验,不会真正执行更新。 - `false`:发送正常请求,更新评测任务。 **Name** `string` | 任务名称 更新后的模型评测任务名称。 ## 响应参数 本接口无特有的返回参数,成功时 HTTP 状态码为 `200`,返回结构中 `Result` 为空对象 `{}`。 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=UpdateEvaluationJob&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "Id": "ej-20240326054800-gl9rp", "Name": "updated-evaluation-job-name", "Description": "updated-evaluation-job-description" } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "202404111451146E8586AD2EFA454F41", "Action": "UpdateEvaluationJob", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": {} } ``` --- # 创建授权书免登申请会话 Source: https://ark.volcengine.com/region:cn-beijing/docs/create-right-auth-letter-application-session-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=CreateRightAuthLetterApplicationSession&Version=2024-01-01` 为指定商业 IP 和被授权方创建授权书免登申请会话,返回申请链接、会话 ID 及访问截止时间。 > **说明:回调通知协议** > > 配置 *Callback* 后,平台通过 HTTP POST 发送申请结果通知。 > > * 请求头 `X-Ark-Auth-Letter-Timestamp` 为 UTC Unix 秒字符串。 > * 请求头 `X-Ark-Auth-Letter-Signature` 的格式为 `v1=`,其中 `` 是 64 位小写十六进制 HMAC-SHA256 签名。 > * 签名消息为 `.<原始 HTTP 请求体字节>`,密钥为 *Callback.Secret* 经 Base64URL 解码后的 32 字节。 > * 建议结合服务端时钟校验 *timestamp* 的可接受时间窗口,避免重放攻击。 > * 请求体包含必选字段 *SessionId*、*Status* 和可选字段 *ApplicationId*。*Status* 仅可能为 `SUCCEEDED` 或 `FAILED`。 > * 按 *SessionId* 和 *Status* 幂等处理通知,并在可靠保存通知后返回 HTTP 2xx,建议在 3 秒内完成。平台对部分发送失败最多发送 4 次。 > * 回调可能重复或未送达。验签成功后仍需调用 *GetRightAuthLetterApplicationSession* 获取最新状态和下载地址。 > **说明:错误码** > > * HTTP 400,`MissingParameter.*`,`The required parameter is missing.`:缺少必填参数。补齐参数后重新请求。 > * HTTP 400,`InvalidParameter.*`,`The specified parameter is invalid.`:参数值不合法。按参数说明修正后重新请求。 > * HTTP 500,`InternalError`,`The request has failed due to an unknown error.`:服务内部错误。不要自动重试创建请求,以免产生重复申请;记录响应中的 *RequestId* 并联系技术支持。 > **注意:避免重复创建** > > 每次调用本接口都会创建新的申请记录和链接。请求超时时不要自动连续重试;确需重新创建时,只向用户提供新链接。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **IpId** `string` `必选` | 商业 IP ID 本次授权书申请对应的单个商业 IP ID。应传入支持授权书申请且当前账号有权使用的 IP ID,不得包含首尾空白;UTF-8 编码后最多 64 字节。 **AuthorizedSubject** `object` `必选` | 被授权方 被授权方主体信息。当前仅需填写 *AuthorizedSubject.SubjectName*。 **SubjectName** `string` `必选` | 被授权方名称 `AuthorizedSubject.SubjectName` 授权书中的真实被授权方主体名称,不会从签名账号的实名资料自动取值;不得为空或仅包含空白字符。 **ProjectName** `string` `默认值 default` | 所属项目 资源所属的项目名称,用于确定本次申请归属的资源项目,不是用户在申请表中填写的作品或商业项目标题。传入时不得为空,UTF-8 编码后最多 255 字节。 **Callback** `object` | 回调配置 申请结果回调配置。启用后,平台在申请成功或失败时向指定地址发送通知;通知不包含授权书文件,收到后需查询会话获取最新状态和下载地址。 > **说明** > > 传入 *Callback* 时,必须同时提供 *Callback.URL* 和 *Callback.Secret*。平台不发送处理中或授权书作废通知;未提交即过期的申请可能收到状态为 `FAILED` 的通知,但查询状态为 `EXPIRED`。回调可能重复或未送达,请以查询接口返回的最新状态为准。 **URL** `string` `必选` | 回调地址 `Callback.URL` 客户接收申请结果通知的公网 HTTPS 地址,最多 2048 个字符。地址应使用默认端口或 `443`,不得包含用户名、密码或 URL 片段,也不应发生重定向。 **Secret** `string` `必选` | 回调密钥 `Callback.Secret` 用于验证回调签名的共享密钥。应由客户生成 32 字节安全随机数,并编码为不含末尾等号的 43 字符 Base64URL 字符串;不得记录日志或返回给客户端。 > **注意** > > 验签时,先将 *Secret* 解码为 32 字节密钥,再对 `.<原始 HTTP 请求体字节>` 计算 HMAC-SHA256。不要对解析后的 JSON 重新序列化后验签。 ## 响应参数 **SessionId** `string` | 申请会话 ID 本次申请会话的唯一标识,用于调用 *GetRightAuthLetterApplicationSession* 查询状态和识别回调通知。应直接保存返回值,不得自行生成或修改。 **ApplicationURL** `string` | 免登申请链接 包含访问凭证的完整免登申请链接。应原样提供给指定用户,不得自行拼接或修改。 > **注意** > > 该链接仅在创建成功时返回,后续查询不会补发。链接包含访问凭证,请妥善保存,仅发送给指定用户,不要公开或写入普通日志。 **FirstAccessExpireAt** `integer` | 首次访问截止时间 用户首次成功进入申请页面的截止时间,为 UTC Unix 时间戳,单位为秒。客户服务端查询会话状态不计为访问申请页面。 > **说明** > > 当前默认首次访问时限为创建后 10 分钟。请以接口返回的时间为准,不要在客户端固定该时限。 **SessionExpireAt** `integer` | 会话访问截止时间 免登申请入口的总访问截止时间,为 UTC Unix 时间戳,单位为秒。该时间从会话创建时开始计算,不会在用户首次打开链接后重新计时。 > **说明** > > 当前默认总访问时限为创建后 24 小时。请以接口返回的时间为准;服务端配置热更新后,实际访问有效性以平台校验结果为准。 --- # 查询授权书免登申请会话 Source: https://ark.volcengine.com/region:cn-beijing/docs/get-right-auth-letter-application-session-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=GetRightAuthLetterApplicationSession&Version=2024-01-01` 查询授权书免登申请会话的当前状态,并在授权书生成成功且未作废时获取文件名和短期下载地址。 > **说明:查询建议** > > * 当 *Status* 为 `CREATED` 或 `PROCESSING` 时,建议每隔 5~10 秒查询一次,具体频率可按业务需要调整。 > * 查询暂时出错或本轮等待超时不代表申请失败。请保存 *SessionId*,稍后继续查询同一会话,不要因此重复创建申请。 > * 失败或过期的申请记录从会话创建起保留 15 天,之后可能无法查询,请及时保存需要的业务结果。 > **说明:错误处理** > > * `MissingParameter.SessionId`:缺少申请会话 ID。补齐 *SessionId* 后重新请求。 > * `InvalidParameter.*`:申请会话 ID 不合法。按参数说明修正后重新请求。 > * `ResourceNotFound.RightAuthLetterApplicationSession`:当前账号下找不到指定会话。检查调用账号和 *SessionId*;已清理的记录也无法查询。 > * `InternalError`:服务内部错误。可稍后重试;多次重试仍失败时,记录响应中的 *RequestId* 并联系技术支持。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **SessionId** `string` `必选` | 申请会话 ID 申请会话 ID。填写调用 *CreateRightAuthLetterApplicationSession* 接口时返回并保存的 *SessionId*;仅可查询当前账号创建的会话。 不得包含首尾空白,UTF-8 编码后最多 64 字节。 ## 响应参数 **Session** `object` | 申请会话 查询到的授权书申请会话信息,包含申请会话 ID、当前状态以及按状态返回的授权书文件。 **SessionId** `string` | 申请会话 ID `Session.SessionId` 本次授权书申请的会话 ID,与请求参数 *SessionId* 一致。 **Status** `string` | 申请状态 `Session.Status` 授权书申请的当前状态。 * `CREATED`:申请入口已创建,用户尚未完成提交。引导用户打开创建接口返回并保存的申请链接。 * `PROCESSING`:用户已提交资料,平台正在处理申请或生成授权书。 * `SUCCEEDED`:授权书已生成成功且未作废,可通过 *File.URL* 下载。 * `FAILED`:授权书申请处理失败。停止等待;业务确认仍需申请后,创建新的会话。 * `VOIDED`:已生成的授权书被作废,不再返回文件。 * `EXPIRED`:用户未提交资料,申请入口已超过首次进入期限或总访问期限。旧入口不能继续使用;仍需申请时,创建新的会话。 > **说明** > > 申请入口过期不等于已生成的授权书失效。用户已提交的申请仍可继续查询;状态为 `SUCCEEDED` 的授权书在被作废前仍可获取文件。 **File** `object` | 授权书文件 `Session.File` 授权书文件信息。仅当 *Status* 为 `SUCCEEDED` 且授权书未作废时返回;其他状态不返回。 **FileName** `string` | 文件名 `Session.File.FileName` 授权书文件名。 **URL** `string` | 下载 URL `Session.File.URL` 授权书文件的短期 HTTPS 签名下载地址。链接失效后,重新调用本接口即可获取新的下载地址,无需重新申请。 > **注意** > > 下载地址可直接访问授权书,请勿公开或记录到普通日志中。下载文件时无需附加 OpenAPI 访问凭证。 --- # 查询推理用量 Source: https://ark.volcengine.com/region:cn-beijing/docs/get-inference-usage-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=GetInferenceUsage&Version=2024-01-01` 查询推理用量,支持按时间范围、接入点、模型等多维度过滤,返回 token 消耗及请求数等用量数据。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **EndTime** `string` `必选` | 结束日期 查询结束日期,格式为 `yyyy-MM-dd`,时区为北京时间(UTC+8)。需大于等于 *StartTime*。 **QueryInterval** `string` `必选` | 查询粒度 查询粒度。可取值: - `Day`:按天统计 - `Hour`:按小时统计 **StartTime** `string` `必选` | 起始日期 查询起始日期,格式为 `yyyy-MM-dd`,时区为北京时间(UTC+8)。 **Filters** `object[]` | 过滤条件 过滤条件数组,支持按鉴权 token、模型名称、接入点 ID、批量任务 ID 等字段过滤。多个过滤项之间为「与」关系。 **Key** `string` `必选` | 过滤字段 `Filters.Key` 过滤字段。目前支持: > **注意** > > 由于安全升级,用量查询能力将调整为基于 `ApiKeyID` 的查询方式。 > > * 2026-08-12 及之后创建的 API Key,仅支持通过 `ApiKeyID` 查询用量,不再支持 `AuthToken` 查询方式。 > * 2026-08-12 之前创建的存量 API Key,当前同时兼容 `AuthToken` 与 `ApiKeyID` 两种用量查询方式;其中 `AuthToken` 查询方式即将下线。**为避免业务受影响,请您尽快将业务逻辑切换至 `ApiKeyID` 进行用量查询。** - `AuthToken`:鉴权 token。 - 若为 jwt token 鉴权,则默认为 `****` - 若为 apikey 鉴权: - 传统格式 API Key:取前 8 位 + `****` + 后 12 位字符,示例:`37efcc63****92c8fe4c880e` - 新版方舟 API Key:取前 3 位 + `****` + 后 5 位字符,示例:`ark****d5b88` - `ApikeyID`:API Key 对应的资源 ID > **说明** > > 在按 API Key 维度统计用量的场景中,会出现不同命名,**实际指向同一个 API Key 唯一标识**,仅命名存在差异,对应关系如下: > > * 资源 ID(Resource ID):火山方舟控制台 **API Key 管理** 页面展示的列名。 > * `ApikeyID` / `apikey_id`:分账账单系统中的分账维度名称,以及查账单 API 过滤条件 *Filters* 的键名。 > > 您可以前往方舟控制台的 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apikey) 页面,在对应 API Key 的详情中查看并复制“资源 ID”。请注意,资源 ID 并非 API Key 密钥本身,请勿将 API Key 密钥作为 `ApiKeyID` 传入。 - `ModelUnitID`:模型单元 ID - `BillingStatus`:计费方式。可取值:`no_need_billing`(无需付费,一般为客户未开通前体验的用量)、`free_for_model_unit`(模型单元用量)、`free_for_free_quota` / `free_for_limit_boundary`(超过安心体验边界的用量)、`normal`(正常后付费按量计费)、`free_for_viptier`(TPM 保障包用量) - `ModelName`:模型名称 - `ModelVersion`:模型版本 - `ModelEndpoint`:接入点 ID - `BatchJobID`:批量任务 ID - `EndpointName`:接入点名称 - `BatchType`:批量推理类型 **ValueLike** `string` `必选` | 相似匹配值 `Filters.ValueLike` 相似匹配值,按前缀/包含等近似规则过滤。*Values* 与 *ValueLike* 不能同时传递。 **Values** `string[]` `必选` | 过滤值列表 `Filters.Values` 过滤值列表。若 *Values* 长度为 0,则表示不按 *Key* 过滤,但返回结果列中仍包含该 *Key*。 **ProjectName** `string` `默认值 default` | 项目名称 资源所属的项目名称。若资源不在默认项目中,需填写正确的项目名称。 **ShowWindowDetail** `boolean` `默认值 false` | 展示窗口详情 是否在返回结果中展示计费窗口详情(如窗口序列、窗口描述、窗口 token 上限等)。 ## 响应参数 **Data** `string[]` | 用量数据 用量数据,二维数组。每行对应一条记录,列顺序与 *Fields* 一致。 **DataCount** `integer` | 数据行数 返回的数据行数,即 *Data* 数组的长度。 **Fields** `object[]` | 列定义 返回数据的列定义,描述 *Data* 数组中每一列的类型与名称。 **Name** `string` | 列名称 `Fields.Name` 列名称。包括请求参数 *Filters* 内的所有字段。默认包括: - `AccountID`:账户 ID - `Day`:日期 - `Hour`:小时 - `InputTokens`:输入 token 数 - `OutputTokens`:输出 token 数 - `TotalTokens`:总 token 数 - `ReqCnt`:请求数 若返回按窗口划分的数据,则额外包含: - `BillingStatus`:计费类型 - `WindowMatchOrder`:窗口序列 - `WindowDescription`:窗口描述 - `WindowMaxInputTokens`:窗口输入 token 上限 - `WindowMaxOutputTokens`:窗口输出 token 上限 **Type** `string` | 列类型 `Fields.Type` 列数据类型,如 `string`、`integer` 等。 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=GetInferenceUsage&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "QueryInterval": "Hour", "StartTime": "2025-09-17", "EndTime": "2025-09-19", "Filters": [ { "Key": "ModelEndpoint", "Values": [ "ep-20xxxx-xxx" ] } ] } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "202509231425196F1F971FFFC20F544E6A", "Action": "GetInferenceUsage", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "Fields": [ { "Name": "AccountID", "Type": "BIGINT" }, { "Name": "ModelEndpoint", "Type": "STRING" }, { "Name": "Day", "Type": "DATE" }, { "Name": "Hour", "Type": "STRING" }, { "Name": "InputTokens", "Type": "BIGINT" }, { "Name": "OutputTokens", "Type": "BIGINT" }, { "Name": "ImageCount", "Type": "BIGINT" }, { "Name": "TotalTokens", "Type": "BIGINT" }, { "Name": "ReqCnt", "Type": "BIGINT" } ], "Data": [ [ "2100339946", "ep-20xxxx-xxx", "2025-09-18", "16", "3062", "914", "0", "3976", "1" ], [ "2100339946", "ep-20xxxx-xxx", "2025-09-17", "14", "6955", "1921", "0", "8876", "4" ] ], "DataCount": 2 } } ``` --- # 查询单请求用量 Source: https://ark.volcengine.com/region:cn-beijing/docs/get-inference-request-usage-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=GetInferenceRequestUsage&Version=2024-01-01` 根据 `RequestID` 查询指定小时内当前账号下某个同步推理请求的用量明细。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **QueryHour** `string` `必选` | 查询小时 请求记录所在小时的起始时间,格式为 `YYYY-MM-DD HH:00:00`。分钟和秒必须为 `00`。默认使用北京时间(Asia/Shanghai);其他环境以其查询时区配置为准。 **RequestID** `string` `必选` | 请求 ID 待查询的同步推理请求 ID。 > **说明** > > `RequestID` 为同步推理请求在响应体中返回的 `id`。 ## 响应参数 **Records** `object[]` | 用量明细 同步请求用量明细数组。一个 `RequestID` 可能对应多条用量记录,接口会在该数组中返回全部明细。 **AccountantEndTime** `integer` | 账期结束时间 `Records.AccountantEndTime` 账期结束时间,Unix 时间戳,单位为秒,不包含该时间点。仅当 `BillingStatus` 严格等于 `normal` 时返回。 **AccountantStartTime** `integer` | 账期开始时间 `Records.AccountantStartTime` 账期开始时间,Unix 时间戳,单位为秒,包含该时间点。仅当 `BillingStatus` 严格等于 `normal` 时返回。 **AccountID** `integer` | 账号 ID `Records.AccountID` 记录所属的账号 ID。有记录时返回。 **APIKeyID** `string` | API Key 标识 `Records.APIKeyID` 请求使用的 API Key 标识,不是 API Key 密钥内容。有记录时返回。 **AudioCachedTokens** `integer` | 音频缓存 Token 数 `Records.AudioCachedTokens` 音频缓存 Token 数。返回 Token 用量组时返回。 **AudioOriginalDurationMs** `integer` | 原始音频时长 `Records.AudioOriginalDurationMs` 原始音频时长,单位为毫秒。返回音频用量组时返回。 **AudioTaskType** `string` | 音频任务类型 `Records.AudioTaskType` 音频任务类型。返回音频用量组时返回。 **AudioTokens** `integer` | 音频 Token 数 `Records.AudioTokens` 音频 Token 数。返回 Token 用量组时返回。 **BatchJobID** `string` | 批处理任务 ID `Records.BatchJobID` 批处理任务 ID。非空时返回。 **BillingStatus** `string` | 计费状态 `Records.BillingStatus` 计费状态,例如 `normal`。有记录时返回。 **CacheHitTokens** `integer` | 缓存命中 Token 数 `Records.CacheHitTokens` 缓存命中 Token 数。返回 Token 用量组时返回。 **DeploymentType** `string` | 部署类型 `Records.DeploymentType` 部署类型。非空时返回。 **ErrorCode** `string` | 错误码 `Records.ErrorCode` 原推理请求记录中的错误码。非空时返回。 **ImageNumber** `integer` | 图片数量 `Records.ImageNumber` 图片数量。返回图片用量组时返回。 **InputImageCount** `integer` | 输入图片数量 `Records.InputImageCount` 输入图片数量。返回图片用量组时返回。 **InputTokens** `integer` | 输入 Token 数 `Records.InputTokens` 输入 Token 数。返回 Token 用量组时返回。 **IsBatch** `boolean` | 是否为 batch 请求 `Records.IsBatch` 是否为 batch 请求。仅值为 `true` 时返回。 **IsFast** `boolean` | 是否为 fast 请求 `Records.IsFast` 是否为 fast 请求。仅值为 `true` 时返回。 **IsFlex** `boolean` | 是否为 flex 请求 `Records.IsFlex` 是否为 flex 请求。仅值为 `true` 时返回。 **IsOffpeak** `boolean` | 是否为 offpeak 请求 `Records.IsOffpeak` 是否为 offpeak 请求。仅值为 `true` 时返回。 **ManagedAgentID** `string` | 托管 Agent ID `Records.ManagedAgentID` 托管 Agent ID。非空时返回。 **ModelEndpoint** `string` | 推理接入点 ID `Records.ModelEndpoint` 推理接入点 ID。有记录时返回。 **ModelName** `string` | 模型名称 `Records.ModelName` 模型名称。有记录时返回。 **ModelUnitID** `string` | 模型单元 ID `Records.ModelUnitID` 模型单元 ID。非空时返回。 **ModelVersion** `string` | 模型版本 `Records.ModelVersion` 模型版本。有记录时返回。 **OutputTokens** `integer` | 输出 Token 数 `Records.OutputTokens` 输出 Token 数。返回 Token 用量组时返回。 **PlanChargedAFP** `string` | Plan 计费 AFP `Records.PlanChargedAFP` Plan 计费值,以十进制字符串保留精度。属于 Plan、未透支且计费值存在时返回。 **PlanEdition** `string` | Plan 版本 `Records.PlanEdition` Plan 版本。属于 Plan 且未透支时返回。 **PlanPack** `string` | Plan 套餐包标识 `Records.PlanPack` Plan 套餐包标识。属于 Plan 且未透支时返回。 **PlanScene** `string` | Plan 场景 `Records.PlanScene` Plan 场景。属于 Plan 且未透支时返回。 **PlanSeatID** `string` | Plan 席位 ID `Records.PlanSeatID` Plan 席位 ID。属于 Plan 且未透支时返回。 **PlanSharedPackageID** `string` | 共享包 ID `Records.PlanSharedPackageID` 共享包 ID。属于 Plan 且未透支时返回。 **PlanUsedSharedPackageQuota** `boolean` | 是否使用共享包额度 `Records.PlanUsedSharedPackageQuota` 是否使用共享包额度。属于 Plan 且未透支时返回,可能返回 `false`。 **RequestID** `string` | 请求 ID `Records.RequestID` 同步推理请求 ID。有记录时返回。 **SessionID** `string` | 会话 ID `Records.SessionID` 会话 ID。非空时返回。 **Timestamp** `integer` | 请求上报时间 `Records.Timestamp` 请求上报时间,Unix 时间戳,单位为秒。有记录时返回。 **UserID** `integer` | 调用身份 ID `Records.UserID` 调用身份 ID。有记录时返回。 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=GetInferenceRequestUsage&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "QueryHour": "2026-09-01 10:00:00", "RequestID": "request-id-example" } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "query-request-id-example", "Action": "GetInferenceRequestUsage", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "Records": [ { "AccountID": 1000000001, "UserID": 10001, "RequestID": "request-id-example", "Timestamp": 1788228135, "APIKeyID": "apikey-example", "ModelName": "model-example", "ModelVersion": "version-example", "ModelEndpoint": "ep-example", "DeploymentType": "standard", "BillingStatus": "normal", "AccountantStartTime": 1788228000, "AccountantEndTime": 1788228300, "InputTokens": 100, "OutputTokens": 20, "CacheHitTokens": 0, "AudioTokens": 0, "AudioCachedTokens": 0 }, { "AccountID": 1000000001, "UserID": 10001, "RequestID": "request-id-example", "Timestamp": 1788228135, "APIKeyID": "apikey-example", "ModelName": "model-example", "ModelVersion": "version-example", "ModelEndpoint": "ep-example", "DeploymentType": "standard", "BillingStatus": "normal", "AccountantStartTime": 1788228000, "AccountantEndTime": 1788228300, "InputTokens": 30, "OutputTokens": 10, "CacheHitTokens": 0, "AudioTokens": 0, "AudioCachedTokens": 0 } ] } } ``` --- # 查询异步任务用量 Source: https://ark.volcengine.com/region:cn-beijing/docs/get-inference-task-usage-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=GetInferenceTaskUsage&Version=2024-01-01` 根据 `TaskID` 查询当前账号下指定异步任务的用量。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **TaskID** `string` `必选` | 任务 ID 待查询的异步任务 ID,不能为空或全空白。 ## 响应参数 **AccountantEndTime** `integer` | 账期结束时间 账期结束时间,Unix 时间戳,单位为秒,不包含该时间点。仅当 `BillingStatus` 严格等于 `normal` 时返回。 **AccountantStartTime** `integer` | 账期开始时间 账期开始时间,Unix 时间戳,单位为秒,包含该时间点。仅当 `BillingStatus` 严格等于 `normal` 时返回。 **AccountID** `integer` | 账号 ID 记录所属的账号 ID。有记录时返回。 **APIKeyID** `string` | API Key 标识 任务使用的 API Key 标识,不是 API Key 密钥内容。有记录时返回。 **BillingStatus** `string` | 计费状态 计费状态。有记录时返回。 **DeploymentType** `string` | 部署类型 部署类型。非空时返回。 **ErrorCode** `string` | 错误码 任务错误码。非空时返回。 **HasInputVideo** `boolean` | 是否包含输入视频 是否包含输入视频。有记录时返回,可能返回 `false`。 **ManagedAgentID** `string` | 托管 Agent ID 托管 Agent ID。非空时返回。 **ModelEndpoint** `string` | 推理接入点 ID 推理接入点 ID。有记录时返回。 **ModelName** `string` | 模型名称 模型名称。有记录时返回。 **ModelUnitID** `string` | 模型单元 ID 模型单元 ID。非空时返回。 **ModelVersion** `string` | 模型版本 模型版本。有记录时返回。 **OutputTokens** `integer` | 输出 Token 数 任务输出 Token 数。有记录时返回,可能返回 `0`。 **PlanChargedAFP** `string` | Plan 计费 AFP Plan 计费值,以十进制字符串保留精度。属于 Plan、未透支且计费值存在时返回。 **PlanEdition** `string` | Plan 版本 Plan 版本。属于 Plan 且未透支时返回。 **PlanIsOverdraft** `boolean` | 是否透支 是否透支。当前仅在未透支的 Plan 记录中返回,值为 `false`。 **PlanLastestSubscribeMilestone** `string` | Plan 订阅里程碑 Plan 订阅里程碑。属于 Plan 且未透支时返回。 **PlanPack** `string` | Plan 套餐包标识 Plan 套餐包标识。属于 Plan 且未透支时返回。 **PlanScene** `string` | Plan 场景 Plan 场景。属于 Plan 且未透支时返回。 **PlanSeatID** `string` | Plan 席位 ID Plan 席位 ID。属于 Plan 且未透支时返回。 **PlanSharedPackageID** `string` | 共享包 ID 共享包 ID。属于 Plan 且未透支时返回。 **PlanUsedSharedPackageQuota** `boolean` | 是否使用共享包额度 是否使用共享包额度。属于 Plan 且未透支时返回。 **Resolution** `string` | 输出分辨率 任务输出分辨率,例如 `480p`、`720p`。有记录时返回。 **SessionID** `string` | 会话 ID 会话 ID。非空时返回。 **TaskID** `string` | 任务 ID 异步任务 ID。有记录时返回。 **UserID** `integer` | 调用身份 ID 调用身份 ID。有记录时返回。 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=GetInferenceTaskUsage&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "TaskID": "cgt-example" } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "query-task-request-id-example", "Action": "GetInferenceTaskUsage", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "AccountID": 1000000001, "UserID": 10001, "TaskID": "cgt-example", "APIKeyID": "apikey-example", "AccountantStartTime": 1788228120, "AccountantEndTime": 1788228150, "ModelName": "model-example", "ModelVersion": "version-example", "ModelEndpoint": "ep-example", "DeploymentType": "standard", "Resolution": "480p", "HasInputVideo": false, "BillingStatus": "normal", "OutputTokens": 50638 } } ``` --- # 创建用量明细导出任务 Source: https://ark.volcengine.com/region:cn-beijing/docs/create-record-export-task-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=CreateRecordExportTask&Version=2024-01-01` 创建用户用量明细异步导出任务。提交成功后返回任务 ID,用于调用 `GetRecordExportTask` 查询状态与导出结果。 > **注意** > > - 同一账号下,活跃任务数量不可超过 3 个。 > - 单个账号在滚动 24 小时内最多可提交 100 个导出任务。超出上限后,新的提交请求将失败。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **EndTime** `number` `必选` | 任务结束时间 任务结束时间(UTC Unix 时间戳,单位:秒)。需满足 *EndTime* − *StartTime* ≤ `10800`(最大时间跨度 3 小时)。 > **说明:注意** > > 单次导出最大时间跨度为 `10800` 秒(3 小时)。如需导出更长区间,请按 3 小时窗口分批提交多个任务。 **StartTime** `number` `必选` | 任务起始时间 任务起始时间(UTC Unix 时间戳,单位:秒)。最小取值为 `1777593600`(对应 UTC 时间 `2026-05-01 00:00:00`)。配合 *EndTime* 圈定本次导出覆盖的时间窗口。 **最小值**:`1777593600` **Filters** `object[]` | 用量过滤条件 过滤条件数组。每个元素为一组 *Key*/*Values* 对,多个过滤条件之间为「与」关系。其中 *Key* 为 `model_name` 的过滤项为必填。 **Key** `string` `必选` | 过滤字段名 `Filters.Key` 过滤字段名。可取值: - `model_name`:按模型名称过滤,必填 - `model_endpoint`:按模型接入点过滤 - `batch_job_id`:按批量推理任务 ID 过滤 - `volc_instance_id`:按火山实例 ID 过滤 **Values** `string[]` | 过滤值列表 `Filters.Values` 过滤值数组,需与 *Key* 配合使用。当 *Key* 为 `model_name` 时,可取值为 `doubao-seed-2-0-pro`、`doubao-seed-2-0-lite`、`doubao-seed-2-0-mini`、`doubao-seed-2-0-code-preview`、`doubao-seedance-2-0`、`doubao-seedance-2-0-fast`、`doubao-seed-evolving`、`doubao-seed-2-1-pro`、`doubao-seed-2-1-turbo`、`doubao-seed-2-1-lite`、`deepseek-v4-pro-ga`、`deepseek-v4-flash-ga`、`deepseek-v4-1-flash`、`doubao-seedream-5-0-pro`、`doubao-seedream-5-0-lite`、`doubao-seedance-2-5`。 ## 响应参数 **Task** `object` | 新建任务信息 新建任务的简要信息,包含可用于后续查询任务状态的任务 ID。 **Id** `string` | 任务 ID `Task.Id` 任务 ID,调用 *CreateRecordExportTask* 接口时返回的唯一任务标识,格式为 `uet-YYYYMMDDhhmmss-<5 位字母数字>`。可作为 *GetRecordExportTask* 的入参查询任务状态及下载链接。 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=CreateRecordExportTask&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "StartTime": 1779074117, "EndTime": 1779081317, "Filters": [ { "Key": "model_name", "Values": [ "doubao-seedance-2-0" ] } ] } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "20260501140012A1B2C3D4E5F6082741", "Action": "CreateRecordExportTask", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "Task": { "Id": "uet-20260501140000-ABCDE" } } } ``` --- # 查询用量明细导出任务状态 Source: https://ark.volcengine.com/region:cn-beijing/docs/get-record-export-task-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=GetRecordExportTask&Version=2024-01-01` 查询用量明细导出任务状态,并获取文件下载链接。 > **注意** > > `GetRecordExportTask` 接口返回的 CSV 文件中,计费字段展示方式已按用户调用情况和导出任务查询窗口的结束时间 `EndTime` 完成分阶段切换,变更点如下: > - 2026 年 9 月 2 日前已产生调用的用户:切换时刻为 2026 年 9 月 15 日。 > - 2026 年 9 月 2 日及以后新增调用的用户:切换时刻为 2026 年 9 月 2 日。 > > 对上述两类用户: > - `EndTime` **晚于**对应切换时刻时,CSV 不再单独返回 `input_token_charge_item`、`output_token_charge_item`、`cache_hit_token_charge_item` 三列,相关计费信息统一整合至 `charge_value_list` 字段。 > - `EndTime` **早于或等于**对应切换时刻时,CSV 继续单独返回上述三列。 > > 任务提交后,该任务对应的 CSV 字段展示方式保持不变。请按实际返回结果完成适配。 > **说明** > > - 需传入通过 `CreateRecordExportTask` 接口获取的任务 ID 作为入参。 > - `CreateRecordExportTask` 任务提交后,建议等待 5 秒再发起 `GetRecordExportTask` 轮询: > - 轮询间隔:不小于 5 秒。 > - 单任务轮询总时长:不超过 5 分钟。 > - 当接口返回 `Succeeded` 状态且包含 `DownloadUrl` 字段时,请立即下载 CSV 文件,避免链接过期失效,链接有效期为 12 小时。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **Id** `string` `必选` | 导出任务 ID 任务 ID,调用 *CreateRecordExportTask* 接口时返回的唯一任务标识,格式为 `uet-YYYYMMDDhhmmss-<5 位字母数字>`。 ## 响应参数 **Task** `object` | 任务完整状态 任务完整状态,包含任务进度、命中/导出行数及结果文件下载链接(仅在任务成功时返回)。 **CreateTime** `number` | 创建时间 `Task.CreateTime` 任务创建时间(UTC Unix 时间戳,单位:秒),即任务被提交并创建的时刻。 **Id** `string` | 任务 ID `Task.Id` 任务 ID,与请求参数 *Id* 一致,方便并发查询时区分结果。 **Status** `string` | 任务状态 `Task.Status` 任务状态机。可取值: - `Pending`:任务已提交,等待调度 - `Running`:任务正在执行 - `Succeeded`:任务执行成功,可通过 *DownloadUrl* 下载结果 - `Failed`:任务执行失败,原因见 *ErrorMessage* **DownloadUrl** `string` | 下载链接 `Task.DownloadUrl` TOS 一次性签发的下载链接,仅当 *Status* 为 `Succeeded` 时存在有效值。 > **注意** > > - 下载链接有效期为 12 小时。链接过期后,*FileExpired* 字段值为 `true`,需重新提交任务以获取新链接。 > - 通过 *DownloadUrl* 下载的 CSV 文件中,计费字段展示方式已发生变更。具体的变更说明、切换时刻、兼容建议和示例代码,请参见 [用量明细 CSV 解析最佳实践](/docs/usage-csv-charge-value-list-best-practice)。 **DownloadUrlExpireTime** `number` | 链接过期时间 `Task.DownloadUrlExpireTime` 下载链接的过期时间(UTC Unix 时间戳,单位:秒),有效期 12 小时,过期后对应 TOS 文件将被清理。 **EndTime** `number` | 结束时间 `Task.EndTime` 任务结束时间(UTC Unix 时间戳,单位:秒)。代表任务进入 `Succeeded`、`Failed` 终态的时间;任务处理中时该字段不返回。 **ErrorMessage** `string` | 失败原因 `Task.ErrorMessage` 任务失败时的指引文案,仅当 *Status* 为 `Failed` 时存在有效值。 **ExportCount** `number` | 实际导出行数 `Task.ExportCount` 实际写入 CSV 文件的行数,最大不超过 `100000`。当 *TotalCount* 大于 *ExportCount* 时,表示导出结果因达到单任务行数上限而被截断。 **最大值**:`100000` **FileExpired** `number` | 文件过期标识 `Task.FileExpired` 文件是否已过期的标识。当当前时间大于等于 *DownloadUrlExpireTime* 时为 `true`。 **QueryParams** `string` | 原始请求参数 `Task.QueryParams` 原始请求参数的 JSON 字符串,用于任务回放或审计。 **StartTime** `number` | 开始时间 `Task.StartTime` 任务开始时间(UTC Unix 时间戳,单位:秒),对应任务状态切换为 `Running` 的时刻。任务未调度时该字段不返回;若任务触发系统重试,此字段始终保留首次启动时间。 **TotalCount** `number` | 命中总行数 `Task.TotalCount` 查询命中的总行数,用于判断 *ExportCount* 是否因单任务 `100000` 行上限被截断。 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=GetRecordExportTask&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "Id": "uet-20260501140000-ABCDE" } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "20260501140545E7F8A9B0C1D2033815", "Action": "GetRecordExportTask", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "Task": { "Id": "uet-20260501140000-ABCDE", "Status": "Succeeded", "ExportCount": 132, "TotalCount": 132, "QueryParams": "{\"StartTime\":1779074117,\"EndTime\":1779081317,\"Filters\":[{\"Key\":\"model_name\",\"Values\":[\"doubao-seedance-2-0\"]}]}", "DownloadUrl": "https://billing-info.tos-cn-beijing.volces.com/recordexport/...?X-Tos-...", "DownloadUrlExpireTime": 1779124545, "FileExpired": false, "CreateTime": 1779081338, "StartTime": 1779081343, "EndTime": 1779081345 } } } ``` --- # 查询模型推理限额 Source: https://ark.volcengine.com/region:cn-beijing/docs/list-model-inference-limits-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=ListModelInferenceLimits&Version=2024-01-01` 查询指定基础模型的累计推理用量限额及当前用量。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **FoundationModelNames** `string[]` `必选` | 基础模型名称列表 指定需要查询推理限额的基础模型名称列表,一次最多可传入 100 个模型名称。已下线模型不返回查询结果。 ## 响应参数 **Items** `object[]` | 模型推理限额列表 模型推理限额信息列表。 **CurrentUsage** `integer` | 当前累计推理用量 `Items.CurrentUsage` 模型当前已累计的推理用量。 **FoundationModelName** `string` | 基础模型名称 `Items.FoundationModelName` **Limit** `integer` | 累计推理用量上限 `Items.Limit` 模型的累计推理用量上限,推理限额关闭时不返回。 **StartTime** `string` | 限额生效时间 `Items.StartTime` 推理限额的生效时间,RFC3339 格式。 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=ListModelInferenceLimits&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "FoundationModelNames": [ "doubao-seed-2-1-pro-260915" ] } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "20261008142033A1B2C3D4E5F6071829", "Action": "ListModelInferenceLimits", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "Items": [ { "FoundationModelName": "doubao-seed-2-1-pro-260915", "Limit": 1000000, "CurrentUsage": 125000, "StartTime": "2026-10-08T00:00:00+08:00" } ] } } ``` --- # 开启模型推理限额 Source: https://ark.volcengine.com/region:cn-beijing/docs/enable-model-inference-limit-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=EnableModelInferenceLimit&Version=2024-01-01` 为指定基础模型开启累计推理用量限额。 > **说明:提示** > > 同一基础模型完成开启、关闭后,如需再次开启推理限额,需间隔至少 2 小时。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **FoundationModelNames** `string[]` `必选` | 基础模型名称列表 指定需要开启推理限额的基础模型名称列表。一次最多可传入 100 个模型名称。 **Limit** `integer` `必选` | 累计推理用量上限 模型的累计推理用量上限,取值必须大于 0。 **DryRun** `boolean` `默认值 false` | 是否只预检查请求 - `true`:仅校验请求参数,不实际开启模型推理限额。预检查通过时,接口返回 HTTP 状态码 `400`,错误码为 `DryRunOperation`,表示请求参数校验通过,可将 `DryRun` 设置为 `false` 后重新发起请求。 - `false`:校验请求参数,并开启模型推理限额。 ## 响应参数 本接口无特有的返回参数,成功时 HTTP 状态码为 `200`,返回结构中 `Result` 为空对象 `{}`。 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=EnableModelInferenceLimit&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "FoundationModelNames": [ "doubao-seed-2-1-pro-260915" ], "Limit": 1000000, "DryRun": false } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "20261008142118B2C3D4E5F607182A30", "Action": "EnableModelInferenceLimit", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": {} } ``` --- # 关闭模型推理限额 Source: https://ark.volcengine.com/region:cn-beijing/docs/disable-model-inference-limit-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=DisableModelInferenceLimit&Version=2024-01-01` 关闭指定基础模型的累计推理用量限额。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **FoundationModelNames** `string[]` `必选` | 基础模型名称列表 指定需要关闭推理限额的基础模型名称列表。一次最多可传入 100 个模型名称。 **DryRun** `boolean` `默认值 false` | 是否只预检查请求 - `true`:仅校验请求参数,不实际关闭模型推理限额。预检查通过时,接口返回 HTTP 状态码 `400`,错误码为 `DryRunOperation`,表示请求参数校验通过,可将 `DryRun` 设置为 `false` 后重新发起请求。 - `false`:校验请求参数,并关闭模型推理限额。 ## 响应参数 本接口无特有的返回参数,成功时 HTTP 状态码为 `200`,返回结构中 `Result` 为空对象 `{}`。 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=DisableModelInferenceLimit&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "FoundationModelNames": [ "doubao-seed-2-1-pro-260915" ], "DryRun": false } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "20261008142206C3D4E5F607182A3041", "Action": "DisableModelInferenceLimit", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": {} } ``` --- # 创建方舟官方模型产物查询请求 Source: https://ark.volcengine.com/region:cn-beijing/docs/create-ark-official-result-query-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=CreateArkOfficialResultQuery&Version=2024-01-01` 提交一份内容用于方舟官方结果鉴定,返回查询 ID 供后续轮询结果。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **Type** `string` `必选` | 鉴定类型 鉴定类型,指定本次查询的鉴定方式。 **ContentURL** `string` | 待鉴定内容 URL 待鉴定内容的 URL 地址。当 `Type` 为基于内容链接的鉴定方式时必填;其他鉴定方式下可省略。URL 需公网可访问,媒体格式与大小限制请参见官方文档。 ## 响应参数 **QueryID** `string` | 查询 ID 本次鉴定查询的唯一 ID,用于后续调用获取鉴定结果接口。 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=CreateArkOfficialResultQuery&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "Type": "ContentURL", "ContentURL": "https://example.com/media/sample-clip.mp4" } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "20240514212750063DE7C1E4713BAE9F", "Action": "CreateArkOfficialResultQuery", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "QueryID": "query-20240514212750-abc12" } } ``` --- # 获取安全审计日志 Source: https://ark.volcengine.com/region:cn-beijing/docs/list-audit-logs-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=ListAuditLogs&Version=2024-01-01` 支持对安全相关事件进行查询和审计,当前可审计事件包括安全沙箱登录、安全沙箱对外连接、安全沙箱容器逃逸、vArmor 防护、KMS 访问、TKS 访问。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **Filter** `object` `必选` | 筛选条件 审计日志的筛选条件,可指定时间区间、风险等级、日志类型及自定义条件。 **LogType** `string` `必选` | 日志类型 `Filter.LogType` 待筛选的审计日志类型。取值 `SshLogin` 表示 SSH 登录安全沙箱、`ContainerLogin` 表示本地登录安全沙箱、`Connection` 表示安全沙箱对外网络连接、`ContainerBreakout` 表示安全沙箱容器逃逸、`VarmorDefence` 表示 vArmor 防护、`KMSAccess` 表示 KMS 访问、`TksAccess` 表示 Trusted Key Service(TKS)密钥访问。取值:`SshLogin` / `ContainerLogin` / `Connection` / `ContainerBreakout` / `VarmorDefence` / `KMSAccess` / `TksAccess` / `AuthStatistic` / `Auth`。 > **说明** > > `TksAccess` 当前为内测收费功能,如有需求请联系您的销售经理启用。 **Conditions** `object[]` | 自定义筛选条件 `Filter.Conditions` 自定义筛选条件列表,按字段、操作符、值组合过滤审计日志。 **Field** `string` `必选` | 字段名 `Filter.Conditions.Field` 用于筛选的字段名。 **Operator** `string` `必选` | 操作符 `Filter.Conditions.Operator` 筛选条件使用的比较操作符。 **Value** `string` `必选` | 筛选值 `Filter.Conditions.Value` 筛选条件用于比较的目标值。 **EndTime** `integer` | 结束时间 `Filter.EndTime` 查询时间区间的结束时间,Unix 时间戳(秒)。 **RiskLevels** `string[]` | 风险等级筛选 `Filter.RiskLevels` 按风险等级筛选的列表,命中其中任一等级的日志均会返回。取值 `Info` 表示正常事件、`Low` 表示低风险事件、`Medium` 表示中风险事件、`High` 表示高风险事件、`Critical` 表示严重风险事件。 **StartTime** `integer` | 起始时间 `Filter.StartTime` 查询时间区间的起始时间,Unix 时间戳(秒)。 **ResourceId** `string` `必选` | 资源 ID 被审计资源的 ID,需与 *ResourceType* 配合使用。当 *ResourceType* 为 `endpoint` 时填推理接入点 ID(形如 `ep-**************-*****`);当 *ResourceType* 为 `modelcustomizationjob` 时填模型精调任务 ID(形如 `mcj-**************-*****`)。 **ResourceType** `string` `必选` | 资源类型 被审计资源的类型。取值 `endpoint` 表示推理接入点、`modelcustomizationjob` 表示模型精调任务。 **PageNumber** `integer` `默认值 1` | 起始页码 分页查询时的起始页码。 **最小值**:`1` **PageSize** `integer` `默认值 10` | 每页记录数 分页查询时每页返回的记录数。 **取值范围**:`[1, 100]` **ProjectName** `string` `默认值 default` | 项目名称 资源所属的项目名称。若资源不在默认项目中,需填写正确的项目名称。 **SortBy** `string` `默认值 Timestamp` | 排序指标 排序指标。当前仅支持按 `Timestamp`(审计行为发生时间)排序。 **SortOrder** `string` `默认值 Desc` | 排序顺序 排序顺序。取值 `Asc` 表示升序、`Desc` 表示降序。 ## 响应参数 **Items** `object[]` | 日志列表 审计日志条目列表。每个元素包含一条审计日志的详细信息。 **LogContents** `object[]` | 日志字段内容 `Items.LogContents` 审计日志的字段内容列表。每个元素是一组 Key-Value,承载日志的结构化字段。 **Key** `string` | 字段名 `Items.LogContents.Key` 日志字段的键名,标识本条 Key-Value 承载的内容。常见取值包括 `Arguments`(带参数的完整命令)、`Command`(命令)、`Process`(进程名)、`Operation`(vArmor 防护日志的 hook 命令)、`SSH`(源/目标 IP 与端口四元组)、`Tag`(日志标签)等。 **Value** `string` | 字段值 `Items.LogContents.Value` 日志字段的取值,与 *Key* 配对。例如 *Key* 为 `Arguments` 时形如 `curl 192.168.0.1`;为 `Command` 时形如 `curl`;为 `Process` 时形如 `/usr/bin/curl`;为 `Operation` 时形如 `cat`;为 `SSH` 时形如 `192.168.0.1 8122 192.168.0.2 22`;为 `Tag` 时形如 `Docker`。 **LogDetail** `string` | 日志详情 `Items.LogDetail` 审计日志的详情描述。展现内容随 *LogType* 不同而不同:`SshLogin` 展示登录方式、源/目标 IP 与端口、进程 ID;`ContainerLogin` 展示登录方式、登录命令、源/目标 IP 与端口;`Connection` 展示连接类型、连接状态、源/目标 IP 与端口、进程名与进程 ID;`ContainerBreakout` 展示具体逃逸行为、命令、进程名与进程 ID;`VarmorDefence` 展示命令、进程名、进程 ID 及触发防护的 hook;`KMSAccess` 展示用户 ID、密钥名称、加解密对象与操作类型;`TksAccess` 展示对 TKS 密钥的访问方式(如 `CreateTksKey`、`GetTksKeyinfo`、`ExportTksPubKey`、`ExportTksKey`)。 **LogType** `string` | 日志类型 `Items.LogType` 审计日志类型。取值 `SshLogin` 表示 SSH 登录安全沙箱、`ContainerLogin` 表示本地登录安全沙箱、`Connection` 表示安全沙箱对外网络连接、`ContainerBreakout` 表示安全沙箱容器逃逸、`VarmorDefence` 表示 vArmor 防护、`KMSAccess` 表示 KMS 访问、`TksAccess` 表示 Trusted Key Service(TKS)密钥访问。取值:`SshLogin` / `ContainerLogin` / `Connection` / `ContainerBreakout` / `VarmorDefence` / `KMSAcess` / `TksAccess` / `AuthStatistic` / `Auth`。 > **说明** > > `TksAccess` 当前为内测收费功能,如有需求请联系您的销售经理启用。 **ResourceId** `string` | 资源 ID `Items.ResourceId` 被审计资源的 ID,与 *ResourceType* 配合标识资源。推理接入点 ID 形如 `ep-**************-*****`;模型精调任务 ID 形如 `mcj-**************-*****`。 **ResourceType** `string` | 资源类型 `Items.ResourceType` 被审计资源的类型。取值 `endpoint` 表示推理接入点、`modelcustomizationjob` 表示模型精调任务。 **RiskLevel** `string` | 风险等级 `Items.RiskLevel` 审计事件的风险等级。取值 `Info` 表示正常事件、`Low` 表示低风险事件、`Medium` 表示中风险事件、`High` 表示高风险事件、`Critical` 表示严重风险事件。 **Timestamp** `string` | 发生时间 `Items.Timestamp` 审计行为发生的时间,格式为 ISO 8601。 **PageNumber** `integer` | 当前页码 当前返回结果对应的分页页码。 **PageSize** `integer` | 每页记录数 当前返回结果每页包含的记录数。 **TotalCount** `integer` | 日志总数 符合筛选条件的审计日志总条数。 ## 代码示例 ## 连接审计 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=ListAuditLogs&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{}' # TODO 补 request body(备份原文无有效数据) ``` #### Response ``` { "ResponseMetadata": { "RequestId": "202407052034340071951971433E0B1D", "Action": "ListAuditLogs", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "TotalCount": 1, "PageNumber": 1, "PageSize": 10, "Items": [ { "ResourceId": "ep-**************-*****", "ResourceType": "endpoint", "LogType": "Connection", "LogDetail": "存在从安全沙箱容器向外进行网络连接的行为。连接类型:阻塞式;连接状态:成功;源 IP/端口: 192.168.0.1:50031;目标 IP/端口: 192.168.0.4:22;进程: curl;pid: 12345", "LogContents": [ { "Key": "ProcessID", "Value": "12345" }, { "Key": "SourceIP", "Value": "192.168.0.1" }, { "Key": "SourcePort", "Value": "50031" }, { "Key": "DestinationIP", "Value": "192.168.0.4" }, { "Key": "DestinationPort", "Value": "22" }, { "Key": "Tag", "Value": "Whitelisted,ConnectionSucceed,Blocking" }, { "Key": "Process", "Value": "curl" } ], "RiskLevel": "Info", "Timestamp": "2024-10-25T12:04:33Z" } ] } } ``` ## 容器逃逸 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=ListAuditLogs&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{}' # TODO 补 request body(备份原文无有效数据) ``` #### Response ``` { "ResponseMetadata": { "RequestId": "202411071454251712321471146B325A", "Action": "ListAuditLogs", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "TotalCount": 1, "PageNumber": 1, "PageSize": 10, "Items": [ { "ResourceId": "ep-**************-*****", "ResourceType": "endpoint", "LogType": "ContainerBreakout", "LogDetail": "容器上存在连接 Metadata Server 的行为,疑似进行容器逃逸准备。用户: root;命令: curl;进程: /usr/bin/curl;pid: 13483", "LogContents": [ { "Key": "Tag", "Value": "MetadataServer" }, { "Key": "Command", "Value": "curl" }, { "Key": "Username", "Value": "root" }, { "Key": "ProcessID", "Value": "13483" }, { "Key": "Process", "Value": "/usr/bin/curl" }, { "Key": "SandboxType", "Value": "Inference" } ], "RiskLevel": "Low", "Timestamp": "2024-10-25T12:03:36Z" } ] } } ``` ## 容器登录 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=ListAuditLogs&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{}' # TODO 补 request body(备份原文无有效数据) ``` #### Response ``` { "ResponseMetadata": { "RequestId": "2024070520320624805701201829AFC4", "Action": "ListAuditLogs", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "TotalCount": 1, "PageNumber": 1, "PageSize": 10, "Items": [ { "ResourceId": "ep-**************-*****", "ResourceType": "endpoint", "LogType": "ContainerLogin", "LogDetail": "存在从本地节点登录到安全沙箱容器的行为。登录方式: Docker;登录命令: docker exec -it ***** bash;源 IP/端口: 192.168.0.1:50031;目标 IP/端口: 192.168.1.2:22", "LogContents": [ { "Key": "Tag", "Value": "Docker" }, { "Key": "Arguments", "Value": "docker exec -it ***** bash" }, { "Key": "SSH", "Value": "192.168.0.1 50031 192.168.1.2 22" } ], "RiskLevel": "High", "Timestamp": "2024-10-25T12:05:36Z" } ] } } ``` ## KMS 访问 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=ListAuditLogs&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{}' # TODO 补 request body(备份原文无有效数据) ``` #### Response ``` { "ResponseMetadata": { "RequestId": "20241107153632061174073005C37DD8", "Action": "ListAuditLogs", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "TotalCount": 1, "PageNumber": 1, "PageSize": 10, "Items": [ { "ResourceId": "ep-**************-*****", "ResourceType": "endpoint", "LogType": "KMSAccess", "LogDetail": "请求 2100466578 用户的 datapipe_keyring/datapipe_key_ml_maas 密钥,对基座模型 doubao-pro-4k | 240909 进行信封解密", "LogContents": [ { "Key": "DataType", "Value": "envelope" }, { "Key": "RequestID", "Value": "20240909092241172013199191AABBCC" }, { "Key": "CreateTime", "Value": "2024-09-09T09:22:41Z" }, { "Key": "Operation", "Value": "decrypt" }, { "Key": "ModelID", "Value": "doubao-pro-4k" }, { "Key": "ModelVersion", "Value": "240909" }, { "Key": "KmsAccountID", "Value": "2100466578" }, { "Key": "KeyringName", "Value": "datapipe_keyring" }, { "Key": "Phase", "Value": "inference" }, { "Key": "ModelType", "Value": "base_model" }, { "Key": "KeyName", "Value": "datapipe_key_ml_maas" } ], "RiskLevel": "Info", "Timestamp": "2024-09-09T09:22:41Z" } ] } } ``` ## SSH 登录 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=ListAuditLogs&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{}' # TODO 补 request body(备份原文无有效数据) ``` #### Response ``` { "ResponseMetadata": { "RequestId": "20240627101238231161005082456C1E", "Action": "ListAuditLogs", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "TotalCount": 1, "PageNumber": 1, "PageSize": 10, "Items": [ { "ResourceId": "ep-**************-*****", "ResourceType": "endpoint", "LogType": "SshLogin", "LogDetail": "存在通过未知源 ssh 登录安全沙箱容器的行为。源 IP/端口: 10.0.26.52:35024;目标 IP/端口: 10.0.26.52:12222;pid: 3058688", "LogContents": [ { "Key": "Tag", "Value": "Unknown" }, { "Key": "SSH", "Value": "10.0.26.52 35024 10.0.26.52 12222" }, { "Key": "ProcessID", "Value": "3058688" }, { "Key": "SandboxType", "Value": "DataPreprocess" } ], "RiskLevel": "Medium", "Timestamp": "2024-09-29T11:38:34Z" } ] } } ``` ## TKS 访问 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=ListAuditLogs&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{}' # TODO 补 request body(备份原文无有效数据) ``` #### Response ``` { "ResponseMetadata": { "RequestId": "202509221056016566EAF5A886F22633", "Action": "ListAuditLogs", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "TotalCount": 89, "PageNumber": 1, "PageSize": 10, "Items": [ { "ResourceId": "ep-**************-*****", "ResourceType": "endpoint", "LogType": "TksAccess", "LogDetail": "GetTksKeyinfo", "LogContents": [ { "Key": "method", "Value": "GetTksKeyinfo" } ], "RiskLevel": "Info", "Timestamp": "2025-09-22T02:55:43Z" }, { "ResourceId": "ep-**************-*****", "ResourceType": "endpoint", "LogType": "TksAccess", "LogDetail": "GetTksKeyinfo", "LogContents": [ { "Key": "method", "Value": "GetTksKeyinfo" } ], "RiskLevel": "Info", "Timestamp": "2025-09-22T02:55:41Z" }, { "ResourceId": "ep-**************-*****", "ResourceType": "endpoint", "LogType": "TksAccess", "LogDetail": "CreateTksKey", "LogContents": [ { "Key": "method", "Value": "CreateTksKey" } ], "RiskLevel": "Info", "Timestamp": "2025-09-22T02:55:25Z" }, { "ResourceId": "ep-**************-*****", "ResourceType": "endpoint", "LogType": "TksAccess", "LogDetail": "ExportTksPubKey", "LogContents": [ { "Key": "method", "Value": "ExportTksPubKey" } ], "RiskLevel": "Info", "Timestamp": "2025-09-22T02:55:22Z" }, { "ResourceId": "ep-**************-*****", "ResourceType": "endpoint", "LogType": "TksAccess", "LogDetail": "GetTksKeyinfo", "LogContents": [ { "Key": "method", "Value": "GetTksKeyinfo" } ], "RiskLevel": "Info", "Timestamp": "2025-09-22T02:53:57Z" }, { "ResourceId": "ep-**************-*****", "ResourceType": "endpoint", "LogType": "TksAccess", "LogDetail": "ExportTksKey", "LogContents": [ { "Key": "method", "Value": "ExportTksKey" } ], "RiskLevel": "Info", "Timestamp": "2025-09-22T02:53:44Z" }, { "ResourceId": "ep-**************-*****", "ResourceType": "endpoint", "LogType": "TksAccess", "LogDetail": "GetTksKeyinfo", "LogContents": [ { "Key": "method", "Value": "GetTksKeyinfo" } ], "RiskLevel": "Info", "Timestamp": "2025-09-22T02:53:38Z" }, { "ResourceId": "ep-**************-*****", "ResourceType": "endpoint", "LogType": "TksAccess", "LogDetail": "GetTksKeyinfo", "LogContents": [ { "Key": "method", "Value": "GetTksKeyinfo" } ], "RiskLevel": "Info", "Timestamp": "2025-09-22T02:52:45Z" }, { "ResourceId": "ep-**************-*****", "ResourceType": "endpoint", "LogType": "TksAccess", "LogDetail": "CreateTksKey", "LogContents": [ { "Key": "method", "Value": "CreateTksKey" } ], "RiskLevel": "Info", "Timestamp": "2025-09-22T02:52:42Z" }, { "ResourceId": "ep-**************-*****", "ResourceType": "endpoint", "LogType": "TksAccess", "LogDetail": "GetTksKeyinfo", "LogContents": [ { "Key": "method", "Value": "GetTksKeyinfo" } ], "RiskLevel": "Info", "Timestamp": "2025-09-22T02:25:13Z" } ] } } ``` ## VarMor 防御 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=ListAuditLogs&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{}' # TODO 补 request body(备份原文无有效数据) ``` #### Response ``` { "ResponseMetadata": { "RequestId": "20241107144945135212178161E8A08E", "Action": "ListAuditLogs", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "TotalCount": 1, "PageNumber": 1, "PageSize": 10, "Items": [ { "ResourceId": "ep-**************-*****", "ResourceType": "endpoint", "LogType": "VarmorDefence", "LogDetail": "vArmor 成功拦截了一次风险操作。命令: cat;进程: /usr/bin/cat;pid: 3659428;触发 hook: open", "LogContents": [ { "Key": "Command", "Value": "cat" }, { "Key": "Operation", "Value": "open" }, { "Key": "ProcessID", "Value": "3659428" }, { "Key": "Process", "Value": "/usr/bin/cat" }, { "Key": "SandboxType", "Value": "Inference" } ], "RiskLevel": "Info", "Timestamp": "2024-10-25T12:05:36Z" } ] } } ``` --- # 获取方舟官方产物确认结果 Source: https://ark.volcengine.com/region:cn-beijing/docs/get-ark-official-result-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=GetArkOfficialResult&Version=2024-01-01` 根据查询 ID 获取方舟官方结果鉴定的最终结论,包括是否为官方产出、模型名称等信息。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。本接口仅支持 Access Key 鉴权。 --- ## 请求参数 ### Body 参数 **QueryID** `string` `必选` | 查询 ID 创建官方鉴定查询时返回的查询 ID。 ## 响应参数 **IsOfficial** `string` | 是否官方产出 鉴定结论,标识内容是否为官方产出。 **Message** `string` | 附加消息 鉴定结果的附加消息说明。 **ModelName** `string` | 模型名称 生成该内容所使用的模型名称。 **QueryID** `string` | 查询 ID 本次鉴定查询的唯一 ID。 **Resolution** `string` | 分辨率 鉴定内容的分辨率信息。 **ResourceType** `string` | 资源类型 鉴定内容的资源类型。 **Size** `string` | 文件大小 鉴定内容的文件大小。 **Status** `string` | 查询状态 鉴定查询的当前状态。 ## 代码示例 ## 默认 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=GetArkOfficialResult&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "QueryID": "query-20240514212750-abc12" } ' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "20240514212845118BAE59CE4A2071E3", "Action": "GetArkOfficialResult", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "QueryID": "query-20240514212750-abc12", "Status": "Success", "IsOfficial": "true", "ResourceType": "video", "ModelName": "doubao-seedance-2-0-260128", "Size": "12582912", "Resolution": "1920x1080", "Message": "内容确认为方舟官方模型产出。" } } ``` --- # 上报视频生成模型效果问题 Source: https://ark.volcengine.com/region:cn-beijing/docs/case-platform-v1-badcase-report-api `POST https://prompt-pilot.cn-beijing.volces.com/case-platform?Action=CasePlatformV1BadcaseReport&Version=2024-01-01` 本接口用于上报 Doubao Seedance 2.x 系列模型的视频生成效果问题。系统根据指定的 `task_id` 创建 Badcase 记录,并保存问题描述等反馈信息。本接口同时支持通过 Access Key 和方舟 API Key 两种方式鉴权。 > **注意** > > * 本接口及文档仅支持中国大陆火山方舟服务,不支持非中国大陆地区(如 BytePlus 等)。 > * 通过本接口提交 Badcase,视为您同意使用方舟排障服务,我们将严格按照《方舟平台专用条款》第 3.7.7 条第(2)项进行数据处理。详细条款请查阅:https://ark.volcengine.com/region:cn-beijing/docs/volcengine-ark-platform-terms ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * 【推荐】API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 * 【可选】Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。 --- ## 请求参数 ### Body 参数 **Feedback** `string` `必选` | 问题描述 Badcase 的问题描述。内容不能仅包含空白字符。 **Id** `string` `必选` | 任务 ID 列表 待标记为 Badcase 的 `task_id`。可提交单个 ID,也可传入多 ID 字符串。 多 ID 场景 · 系统会按半角逗号、全角逗号、换行、空格或制表符自动拆分,并移除每个 ID 首尾的空白字符和空项。 超过 `max_length` 限制时,接口返回 `422`。 **AccountId** `string` | 火山引擎账号 ID `Id` 中任务所属的火山引擎账号 ID。 * 使用 Access Key 调用时必填。 * 使用方舟 API Key 调用时可省略,系统根据 API Key 解析账号 ID。 **BadcaseType** `string` | Badcase 类型 效果问题的类型。可选值: - `character_id_drift`:角色 ID 漂移 - `subtitle_generation_error`:字幕生成错误 - `logo_watermark_generated`:生成 logo 水印 - `style_drift`:风格漂移 - `regular_flickering`:规律性闪烁 - `extended_video_joint_jump`:续写视频拼接跳变 - `duplicate_character_appearance`:角色重复出现 - `audio_end_noise`:音频结尾噪声 - `chinese_pronunciation_error`:中文发音错误 - `voice_tone_reference_error`:音色参考错误 - `other`:其他 支持传入单个枚举值或枚举值数组。如果设置为其他值,接口返回 `422` 参数校验错误。 > **注意** > > 仅当 *Id* 对应任务的真实模型属于 Doubao Seedance 2.x 系列时,才接受本字段。若 *Id* 对应模型不在支持范围内,接口返回业务错误码 `60002` 或 `60003`。 **模型支持**: * `doubao-seedance-2-5-260628` * `doubao-seedance-2-0-260128` * `doubao-seedance-2-0-fast-260128` * `doubao-seedance-2-0-mini-260615` **ContactInfo** `string` | 联系方式 提交人的联系方式,支持电子邮箱地址或电话号码。 **ProjectName** `string` `默认值 default` | 项目名称 用于在 Case 平台中归类本次 Badcase 上报的项目名称。 **Source** `string` `默认值 customer` | 反馈来源 效果问题的反馈来源。可选值: - `huosu`:火速助手 - `huoshan`:火山助手 - `qianzhi`:钳知 - `customer`:客户提交 未设置或设置为 `null` 时,使用默认值 `customer`。 ## 响应参数 **Accepted** `object[]` | 已接受任务列表 通过校验并已创建 Case 记录的 `task_id` 列表。 **CaseId** `string` | Case ID `Accepted.CaseId` 系统预分配的 Case ID,格式为 `instance-`。 接口返回时,Case 状态为 `processing`;后台异步转存视频和输入帧,并写入会话及消息数据。 处理成功后状态更新为 `completed`,处理失败后更新为 `failed`。 **Code** `integer` | 返回码 `Accepted.Code` 该任务的处理结果码,固定为 `0`。 **Message** `string` | 返回消息 `Accepted.Message` 该任务的处理结果信息,固定为 `Success`。 **TaskId** `string` | 任务 ID `Accepted.TaskId` 已接受并创建 Case 记录的 `task_id`。 **Rejected** `object[]` | 未接受任务列表 未通过校验且未创建 Case 记录的 `task_id` 列表。 **Code** `integer` | 错误码 `Rejected.Code` 未接受该任务的业务错误码。含义参见「错误码」章节。 **Message** `string` | 拒绝原因 `Rejected.Message` 未接受该任务的原因。 **TaskId** `string` | 未接受的任务 ID `Rejected.TaskId` 未通过校验的 `task_id`。 **SubmissionId** `string` | 提交 ID 本次提交的唯一标识,格式为 `badcase-sub-`。可使用该标识检索相关日志。 **Total** `integer` | 提交总数 本次提交的 `task_id` 总数,按 `Id` 参数拆分后的原始列表统计,包含重复项。 ## 代码示例 ## API Key 鉴权 ### cURL #### Request ```bash curl "https://prompt-pilot.cn-beijing.volces.com/case-platform?Action=CasePlatformV1BadcaseReport&Version=2024-01-01" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "Id": "cgt-20260501132104-tfm9v", "Feedback": "人物手部扭曲,且嘴型和中文配音对不上", "AccountId": "2000000000", "BadcaseType": "character_id_drift", "Source": "huosu", "ContactInfo": "user@example.com" }' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "2026050800200011803712817624A398", "Action": "CasePlatformV1BadcaseReport", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "SubmissionId": "badcase-sub-7c2e1f88-…", "Total": 1, "Accepted": [ { "TaskId": "vpv-aaa", "CaseId": "instance-11111111-…", "Code": 0, "Message": "Success" } ], "Rejected": [ { "TaskId": "vpv-bbb", "Code": 40002, "Message": "task_id 不存在或不属于当前 account_id" } ] } } ``` ## Access Key 鉴权 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=CasePlatformV1BadcaseReport&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "Id": "cgt-20260501132104-tfm9v", "Feedback": "人物手部扭曲,且嘴型和中文配音对不上", "AccountId": "2000000000", "BadcaseType": "character_id_drift", "Source": "huosu", "ContactInfo": "user@example.com" }' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "2026050800200011803712817624A398", "Action": "CasePlatformV1BadcaseReport", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "SubmissionId": "badcase-sub-7c2e1f88-…", "Total": 1, "Accepted": [ { "TaskId": "vpv-aaa", "CaseId": "instance-11111111-…", "Code": 0, "Message": "Success" } ], "Rejected": [ { "TaskId": "vpv-bbb", "Code": 40002, "Message": "task_id 不存在或不属于当前 account_id" } ] } } ``` --- # 查询视频生成模型效果问题结果 Source: https://ark.volcengine.com/region:cn-beijing/docs/case-platform-v1-badcase-query-api `POST https://prompt-pilot.cn-beijing.volces.com/case-platform?Action=CasePlatformV1BadcaseQuery&Version=2024-01-01` 本接口用于根据 `task_id` 查询 Doubao Seedance 2.x 系列模型视频生成效果问题的 Badcase 标记状态和鉴定结果。本接口同时支持通过 Access Key 和方舟 API Key 两种方式鉴权。 > **注意** > > * 本接口及文档仅支持中国大陆火山方舟服务,不支持非中国大陆地区(如 BytePlus 等)。 > * 通过本接口查询 Badcase 结果,视为您同意使用方舟排障服务,我们将严格按照《方舟平台专用条款》第 3.7.7 条第(2)项进行数据处理。详细条款请查阅:https://ark.volcengine.com/region:cn-beijing/docs/volcengine-ark-platform-terms ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * 【推荐】API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 * 【可选】Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。 --- ## 请求参数 ### Body 参数 **Id** `string` `必选` | 任务 ID 列表 待查询的 `task_id`。支持提交单个 ID,也可传入多 ID 字符串。 多 ID 场景 · 系统会按半角逗号、全角逗号、换行、空格或制表符自动拆分,并移除每个 ID 首尾的空白字符和空项。 拆分后数量必须在 1 至 50 之间;为空或超过 50 时,接口返回 `422` 参数校验错误。 **ProjectName** `string` `默认值 default` | 项目名称 用于在 Case 平台中定位所查 `task_id` 的项目名称。若资源不在默认项目中,需填写实际项目名称。 ## 响应参数 **Accepted** `object[]` | 已接受任务列表 命中且归属当前账号的 `task_id` 列表,返回提交快照和处理结果。 **BadcaseType** `string[]` | 问题分类 `Accepted.BadcaseType` 用户提交时选择的效果问题分类。枚举值参见 *CasePlatformV1BadcaseReport* 接口 *BadcaseType* 字段。 **Feedback** `string` | 问题描述 `Accepted.Feedback` 用户提交 badcase 时填写的效果问题描述。 **ProblemLabel** `string` | 问题标签 `Accepted.ProblemLabel` 问题标签。由支持人员根据 case 分析结果标注,取有限枚举值。 **Status** `string` | 处理状态 `Accepted.Status` badcase 的处理状态。可选值:`processing`(处理中)、`done`(处理完成)。 **SubmitTime** `string` | 提交时间 `Accepted.SubmitTime` badcase 的提交时间,ISO 8601 UTC 格式。 **TaskId** `string` | 任务 ID `Accepted.TaskId` 通过校验且归属当前账号的 `task_id`。 **SolutionNote** `object` | 解决方案 `Accepted.SolutionNote` 解决方案说明,包含文本说明和附件列表。仅当 *Status* 为 `done` 时返回。 **Text** `string` | 说明文本 `Accepted.SolutionNote.Text` 解决方案说明文本。 **Attachments** `object[]` | 附件列表 `Accepted.SolutionNote.Attachments` 图文附件列表。每个元素包含 *Type*、*Url*、*MimeType* 和 *Name* 等字段;读取时 TOS URL 会自动重新签名。 **MimeType** `string` | MIME 类型 `Accepted.SolutionNote.Attachments.MimeType` 多用途互联网邮件扩展类型(MIME Type)。 **Name** `string` | 文件名称 `Accepted.SolutionNote.Attachments.Name` **Type** `string` | 文件类型 `Accepted.SolutionNote.Attachments.Type` **Url** `string` | 文件链接 `Accepted.SolutionNote.Attachments.Url` 文件链接。读取时,TOS URL 会自动重新签名。 **Rejected** `object[]` | 未接受任务列表 未命中、不归属当前账号或未提交过 badcase 的 `task_id` 列表。 **Code** `integer` | 错误码 `Rejected.Code` 未接受该 `task_id` 的业务错误码。 **Message** `string` | 拒绝原因 `Rejected.Message` 未接受该 `task_id` 的原因说明。 **TaskId** `string` | 任务 ID `Rejected.TaskId` 未接受的 `task_id`。 **Total** `integer` | 任务总数 提交的 `task_id` 总数,等于去重前解析出的 *Id* 数量。 ## 代码示例 ## API Key 鉴权 ### cURL #### Request ```bash curl "https://prompt-pilot.cn-beijing.volces.com/case-platform?Action=CasePlatformV1BadcaseQuery&Version=2024-01-01" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "Id": "cgt-20260501132104-tfm9v" }' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "2026050900311521B2054EAE6127C9D4", "Action": "CasePlatformV1BadcaseQuery", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "Total": 1, "Accepted": [ { "TaskId": "cgt-20260501132104-tfm9v", "BadcaseType": [ "character_id_drift" ], "Feedback": "人物手部扭曲,且嘴型和中文配音对不上", "SubmitTime": "2026-05-08T07:19:22Z", "Status": "done", "ProblemLabel": "人物一致性", "SolutionNote": { "Text": "已确认为 LoRA 加载顺序问题,建议在 prompt 中显式指定 style 标签", "Attachments": [ { "Type": "image", "Url": "https://case-platform-files-cn-beijing.tos-cn-beijing.volces.com/2100000825/.../repro.png?X-Tos-Algorithm=...", "Name": "repro.png", "MimeType": "image/png" } ] } } ], "Rejected": [ { "TaskId": "cgt-zzz", "Code": 40012, "Message": "task_id 未提交过 badcase" } ] } } ``` ## Access Key 鉴权 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=CasePlatformV1BadcaseQuery&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "Id": "cgt-20260501132104-tfm9v" }' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "2026050900311521B2054EAE6127C9D4", "Action": "CasePlatformV1BadcaseQuery", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "Total": 1, "Accepted": [ { "TaskId": "cgt-20260501132104-tfm9v", "BadcaseType": [ "character_id_drift" ], "Feedback": "人物手部扭曲,且嘴型和中文配音对不上", "SubmitTime": "2026-05-08T07:19:22Z", "Status": "done", "ProblemLabel": "人物一致性", "SolutionNote": { "Text": "已确认为 LoRA 加载顺序问题,建议在 prompt 中显式指定 style 标签", "Attachments": [ { "Type": "image", "Url": "https://case-platform-files-cn-beijing.tos-cn-beijing.volces.com/2100000825/.../repro.png?X-Tos-Algorithm=...", "Name": "repro.png", "MimeType": "image/png" } ] } } ], "Rejected": [ { "TaskId": "cgt-zzz", "Code": 40012, "Message": "task_id 未提交过 badcase" } ] } } ``` --- # 上报大语言模型效果问题 Source: https://ark.volcengine.com/region:cn-beijing/docs/case-platform-v1-seed-badcase-report-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=CasePlatformV1SeedBadcaseReport&Version=2024-01-01` 本接口用于上报 Seed 系列大语言模型的效果问题。每条提交的 case 需携带原始的模型请求与响应,受理后返回 Instance ID,可用于查询处理结果。本接口同时支持通过 Access Key 和方舟 API Key 两种方式鉴权。 > **注意** > > * 本接口及文档仅支持中国大陆火山方舟服务,不支持非中国大陆地区(如 BytePlus 等)。 > * 通过本接口提交效果问题(Badcase),视为您同意使用方舟排障服务,我们将严格按照《方舟平台专用条款》第 3.7.7 条第(2)项进行数据处理。详细条款请查阅:https://ark.volcengine.com/region:cn-beijing/docs/volcengine-ark-platform-terms ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * 【推荐】API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 * 【可选】Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。 --- ## 请求参数 ### Body 参数 **Cases** `object[]` `必选` | Case 数组 待上报的 badcase 列表。 每条 item 需要携带原始的 Chat / Responses 接口请求体。 同时需要提供 `Response`(原始非流式响应体)或 `StreamChunks`(流式响应分片数组)二者之一,两者互斥。 > **注意** > > * Cases 数组长度:1 ~ 50 条。 > * 单条 case 大小上限:2 MB。 > * 整包请求体大小上限:20 MB。 **ApiType** `string` `必选` | 接口类型 `Cases.ApiType` 本条 case 对应的接口类型。 * `chat`:Chat Completions API。 * `responses`:Responses API。 **Feedback** `string` `必选` | 问题描述 `Cases.Feedback` 效果问题的文字描述。 **Request** `object` `必选` | 原始请求体 `Cases.Request` 发给模型的原始请求体,需按 Chat / Responses API 规范原样保存。 **BadcaseType** `string[]` | 问题类型 `Cases.BadcaseType` 问题类型标识列表。可用词表由 `CasePlatformV1TccGetBadcaseTypeList` 接口维护。 **ContactInfo** `string` | 联系方式 `Cases.ContactInfo` 上报人联系方式,支持电子邮箱地址或电话号码。 **Response** `object` | 原始非流式响应 `Cases.Response` 原始非流式响应体。与 `StreamChunks` 互斥,必须且只能提供其一。 **StreamChunks** `object[]` | 流式响应分片 `Cases.StreamChunks` 原始流式响应分片数组,按到达顺序排列。与 `Response` 互斥,必须且只能提供其一。 **Source** `string` `默认值 customer` | 反馈来源 反馈来源标识。省略或传 `null` 时使用默认来源。 * `huosu`:火速助手 * `huoshan`:火山助手 * `qianzhi`:钳知 * `customer`:客户提交 传入其他值会被拒绝。 ## 响应参数 **Total** `integer` | case 总数 本次提交的 case 总数。 **Accepted** `object[]` | 受理列表 校验通过且已受理的 case 列表。 **ApiType** `string` | 接口类型 `Accepted.ApiType` 该条 case 对应的接口类型。 * `chat`:Chat Completions API。 * `responses`:Responses API。 **Index** `integer` | 下标 `Accepted.Index` 对应提交的 Cases 数组中的下标,从 0 开始。 **InstanceId** `string` | Case ID `Accepted.InstanceId` 平台分配的 instance id,可用它调用查询接口获取处理结果。 **Model** `string` | 模型名称 `Accepted.Model` 从响应体中解析出的模型名称。 **SubmitTime** `string` | 受理时间 `Accepted.SubmitTime` 受理时间,ISO 8601 格式的 UTC 时间。 **Rejected** `object[]` | 拒绝列表 校验失败且未受理的 case 列表。 **Code** `integer` | 错误码 `Rejected.Code` 该条 case 的错误码,含义参见错误码章节。 **Index** `integer` | 下标 `Rejected.Index` 对应提交的 Cases 数组中的下标,从 0 开始。 **Message** `string` | 拒绝原因 `Rejected.Message` 拒绝原因的可读说明。 ## 代码示例 ## API Key 鉴权 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=CasePlatformV1SeedBadcaseReport&Version=2024-01-01' \ -H "Authorization: Bearer $ARK_API_KEY" \ -H 'Content-Type: application/json' \ -d '{ "Cases": [ { "ApiType": "chat", "Request": { "model": "doubao-seed-1-6-250615", "messages": [ {"role": "user", "content": "帮我写一段介绍火山方舟的话"} ] }, "Response": { "id": "chatcmpl-7c2e1f88", "model": "doubao-seed-1-6-250615", "choices": [ {"index": 0, "message": {"role": "assistant", "content": "……"}, "finish_reason": "stop"} ] }, "Feedback": "输出内容偏离用户提问,重复且冗长", "BadcaseType": ["hallucination"], "ContactInfo": "user@example.com" } ], "Source": "customer" }' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "20260831000200011803712817624A398", "Action": "CasePlatformV1SeedBadcaseReport", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "Total": 1, "Accepted": [ { "Index": 0, "InstanceId": "seed-badcase-8c2e1f88-abcd-1234-5678-…", "SubmitTime": "2026-08-31T12:34:56Z", "ApiType": "chat", "Model": "doubao-seed-2-0-lite-260428" } ], "Rejected": [] } } ``` ## Access Key 鉴权 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=CasePlatformV1SeedBadcaseReport&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "Cases": [ { "ApiType": "chat", "Request": { "model": "doubao-seed-1-6-250615", "messages": [ {"role": "user", "content": "帮我写一段介绍火山方舟的话"} ] }, "Response": { "id": "chatcmpl-7c2e1f88", "model": "doubao-seed-1-6-250615", "choices": [ {"index": 0, "message": {"role": "assistant", "content": "……"}, "finish_reason": "stop"} ] }, "Feedback": "输出内容偏离用户提问,重复且冗长", "BadcaseType": ["hallucination"], "ContactInfo": "user@example.com" } ], "Source": "customer" }' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "20260831000200011803712817624A398", "Action": "CasePlatformV1SeedBadcaseReport", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "Total": 1, "Accepted": [ { "Index": 0, "InstanceId": "seed-badcase-8c2e1f88-abcd-1234-5678-…", "SubmitTime": "2026-08-31T12:34:56Z", "ApiType": "chat", "Model": "doubao-seed-2-0-lite-260428" } ], "Rejected": [] } } ``` --- # 查询大语言模型效果问题结果 Source: https://ark.volcengine.com/region:cn-beijing/docs/case-platform-v1-seed-badcase-query-api `POST https://ark.cn-beijing.volcengineapi.com/?Action=CasePlatformV1SeedBadcaseQuery&Version=2024-01-01` 根据 Instance ID 查询方舟大语言模型效果问题(Seed Badcase)的处理状态与鉴定结果。本接口同时支持通过 Access Key 和方舟 API Key 两种方式鉴权。 > **说明:关于 AssetIssues** > > * 多模态素材(图片、音视频等)会在受理后由后台异步搬运;搬运过程中若出现失败会写入 `AssetIssues[]`,通过本接口返回。 > * 40020/40021/40022/40023 为客户数据侧问题(URL 拉取失败、base64 解码失败、file_id 不存在或已过期、素材超大等),需上报方修正后重新提交。 > * 50010 为平台侧存储失败(非客户数据问题),可稍后重新提交。 ## 鉴权 本接口支持鉴权方式如下,详情请参见 [Base URL 及鉴权](/docs/base-url-and-authentication)。 * 【推荐】API Key 鉴权,请在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面,获取长效 API Key。 * 【可选】Access Key 鉴权,请在 [Access Key 管理](https://console.volcengine.com/iam/keymanage) 页面,获取 Access Key。 --- ## 请求参数 ### Body 参数 **InstanceId** `string[]` `必选` | Case ID 列表 待查询的 instance id,来自上报接口的返回值。原名 `CaseId`,仍兼容。 > **注意** > > 单次请求 InstanceId 数量去重后为 1 ~ 50。 ## 响应参数 **Total** `integer` | case 总数 提交的 case id 总数,等于去重前解析出的 `CaseId` 数量。 **Accepted** `object[]` | 受理列表 命中且归属当前账号的 case id 列表,返回上报快照与处理结果。 **InstanceId** `string` | Case ID `Accepted.InstanceId` 查询的 case id。 **Status** `string` | 处理状态 `Accepted.Status` 处理状态。 * `processing`:排查中。 * `done`:已完成。 > **说明** > > 状态为 `processing` 时,`ProblemLabel` 与 `SolutionNote` 尚未产出。 **ApiType** `string` | 接口类型 `Accepted.ApiType` 该条 case 对应的接口类型。 * `chat`:Chat Completions API。 * `responses`:Responses API。 **AssetIssues** `object[]` | 素材问题 `Accepted.AssetIssues` 未能转存到平台存储的多模态素材列表。 素材的原始引用仍会保留。异步产生,错误码含义参见错误码章节。 > **说明** > > 错误码为 `50010` 的条目可重试。 **Code** `integer` | 错误码 `Accepted.AssetIssues.Code` 素材处理的错误码,含义参见错误码章节。 **Message** `string` | 错误说明 `Accepted.AssetIssues.Message` 素材未能转存的原因说明。 **BadcaseType** `string[]` | 问题类型 `Accepted.BadcaseType` 上报时选择的 Badcase 类型标识列表。 **Feedback** `string` | 问题描述 `Accepted.Feedback` 上报时填写的效果问题描述。 **Model** `string` | 模型名称 `Accepted.Model` 上报时记录的模型名称。 **ProblemLabel** `string` | 问题标签 `Accepted.ProblemLabel` 排查后归类的问题标签,处理完成后返回。 **SolutionNote** `object` | 解决方案 `Accepted.SolutionNote` 解决方案说明,处理完成后返回,包含说明文本与附件。 **Attachments** `object[]` | 附件列表 `Accepted.SolutionNote.Attachments` 解决方案说明的附件列表,为图片或视频。 > **注意** > > 附件链接为预签名链接,每次查询时重新生成,请勿长期保存。 **MimeType** `string` | MIME 类型 `Accepted.SolutionNote.Attachments.MimeType` 附件的 MIME 类型。 **Name** `string` | 附件名称 `Accepted.SolutionNote.Attachments.Name` 附件文件名。 **Type** `string` | 附件类型 `Accepted.SolutionNote.Attachments.Type` 附件的媒体类型。 **Url** `string` | 附件链接 `Accepted.SolutionNote.Attachments.Url` 附件的预签名下载链接。 **Text** `string` | 说明文本 `Accepted.SolutionNote.Text` 解决方案说明的文字内容。 **SubmitTime** `string` | 上报时间 `Accepted.SubmitTime` 上报时间,ISO 8601 格式的 UTC 时间。 **Rejected** `object[]` | 拒绝列表 未命中或不归属当前账号的 case id 列表。 **Code** `integer` | 错误码 `Rejected.Code` 业务错误码,含义参见错误码章节。 **InstanceId** `string` | Case ID `Rejected.InstanceId` 查询的 case id。 **Message** `string` | 拒绝原因 `Rejected.Message` 未返回结果的原因说明。 ## 代码示例 ## API Key 鉴权 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=CasePlatformV1SeedBadcaseQuery&Version=2024-01-01' \ -H "Authorization: Bearer $ARK_API_KEY" \ -H 'Content-Type: application/json' \ -d '{ "InstanceId": ["seed-badcase-8c2e1f88-abcd-1234-5678-..."] }' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "20260831203333033092066128659D5E", "Action": "CasePlatformV1SeedBadcaseQuery", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "Total": 1, "Accepted": [ { "InstanceId": "seed-badcase-8c2e1f88-abcd-1234-5678-…", "Status": "done", "AssetIssues": [], "ApiType": "chat", "Model": "doubao-seed-2-0-lite-260428", "BadcaseType": ["hallucination"], "Feedback": "输出内容偏离用户提问,重复且冗长", "SubmitTime": "2026-08-31T12:34:56Z", "ProblemLabel": "内容质量", "SolutionNote": { "Text": "建议在 system prompt 中显式约束回复长度与主题相关性", "Attachments": [] } } ], "Rejected": [] } } ``` ## Access Key 鉴权 ### cURL #### Request ```bash curl 'https://ark.cn-beijing.volcengineapi.com/?Action=CasePlatformV1SeedBadcaseQuery&Version=2024-01-01' \ -H 'Content-Type: application/json' \ -H 'X-Date: ' \ -H 'X-Content-Sha256: ' \ -H 'Authorization: HMAC-SHA256 Credential=//cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=' \ -d '{ "InstanceId": ["seed-badcase-8c2e1f88-abcd-1234-5678-..."] }' ``` #### Response ``` { "ResponseMetadata": { "RequestId": "20260831203333033092066128659D5E", "Action": "CasePlatformV1SeedBadcaseQuery", "Version": "2024-01-01", "Service": "ark", "Region": "cn-beijing" }, "Result": { "Total": 1, "Accepted": [ { "InstanceId": "seed-badcase-8c2e1f88-abcd-1234-5678-…", "Status": "done", "AssetIssues": [], "ApiType": "chat", "Model": "doubao-seed-2-0-lite-260428", "BadcaseType": ["hallucination"], "Feedback": "输出内容偏离用户提问,重复且冗长", "SubmitTime": "2026-08-31T12:34:56Z", "ProblemLabel": "内容质量", "SolutionNote": { "Text": "建议在 system prompt 中显式约束回复长度与主题相关性", "Attachments": [] } } ], "Rejected": [] } } ``` --- # 兼容 OpenAI SDK Source: https://ark.volcengine.com/region:cn-beijing/docs/compatible-with-openai-sdk 为方便您集成和使用,火山方舟模型 API 会尽可能兼容 OpenAI API。修改 `base url`、`model` 、`api_key`等少量配置,轻松将方舟模型服务集成到您已有的系统中。 > **说明** > > 社区第三方 SDK 不由火山引擎团队维护,本文仅供参考。 # 前提条件 > **说明** > > 方舟平台的新用户?获取 API Key 及 开通模型等准备工作,请参见 [快速入门](/docs/quick-start)。 # OpenAI SDK * Python版本:3.7及以上。 * OpenAI SDK:1.0版本及以上,安装命令: ```Python pip install --upgrade "openai>=1.0" ``` ## 快速开始示例 ```Python from openai import OpenAI import os client = OpenAI( # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", # Replace with your API Key api_key=os.environ.get("ARK_API_KEY"), ) completion = client.chat.completions.create( # Replace with Model ID model="doubao-seed-2-1-pro-260915", messages = [ {"role": "user", "content": "Hello"}, ], ) print(completion.choices[0].message.content) ``` ## 设置额外字段 传入OpenAI SDK中不支持的字段,可以通过 **extra_body** 字典传入,如开关模型是否深度思考的 **thinking** 字段。 ```Python from openai import OpenAI import os client = OpenAI( # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", # Replace with your API Key api_key=os.environ.get("ARK_API_KEY"), ) completion = client.chat.completions.create( # Replace with Model ID model="doubao-seed-2-1-pro-260915", messages = [ {"role": "user", "content": "Hello"}, ], extra_body={ "thinking": { "type": "disabled", # 不使用深度思考能力 # "type": "enabled", # 使用深度思考能力 } } ) print(completion.choices[0].message.content) ``` ## 设置自定义header 可以用于传递额外信息,如配置 ID来串联日志,使能数据加密能力。 ```Python from openai import OpenAI import os client = OpenAI( # The base URL for model invocation base_url="https://ark.cn-beijing.volces.com/api/v3", # Replace with your API Key api_key=os.environ.get("ARK_API_KEY"), ) completion = client.chat.completions.create( # Replace with Model ID model="doubao-seed-2-1-pro-260915", messages = [ {"role": "user", "content": "Hello"}, ], # 自定义request id extra_headers={"X-Client-Request-Id": "202406251728190000B7EA7A9648AC08D9"} ) print(completion.choices[0].message.content) ``` ## 向量化 Embedding > **注意** > > * 文本向量化模型已经逐步下线,建议您使用多模态向量化模型。 > * [向量化能力](/docs/model-list#0ee80bb9)模型不支持 OpenAI API ,请使用 方舟 SDK,详细请参见 [向量化](/docs/vectorization)。 # LangChain OpenAI SDK 安装 LangChain OpenAI SDK: ```Python pip install langchain-openai ``` ## 示例代码 ```Python from langchain_openai import ChatOpenAI from langchain_core.prompts import PromptTemplate import os llm = ChatOpenAI( # Replace with your API Key openai_api_key=os.environ.get("ARK_API_KEY"), # The base URL for model invocation openai_api_base="https://ark.cn-beijing.volces.com/api/v3", # Replace with Model ID model="doubao-seed-2-1-pro-260915", ) template = """Question: {question} Answer: Let's think step by step.""" prompt = PromptTemplate.from_template(template) question = "What NFL team won the Super Bowl in the year Justin Beiber was born?" llm_chain = prompt | llm print(llm_chain.invoke(question)) ``` --- # 向后兼容性 Source: https://ark.volcengine.com/region:cn-beijing/docs/backward-compatibility 为帮助您更稳妥地集成和使用方舟 API,本文介绍方舟关于向后兼容性的通用说明,以及建议采用的客户端适配方式。 ## 适用范围 本说明适用于以下对象: * REST API。 * 方舟官方 SDK。 * 模型系列。 ## 兼容性说明 方舟会尽量避免在同一主版本中引入不兼容的接口变更,以降低协议演进对存量接入的影响。 模型输出和提示词行为本身具有不确定性,不同模型版本之间的提示词行为和模型表现可能发生变化。如需获得更稳定的模型输出,建议固定模型版本,并结合实际业务场景进行评测与验证。 ## 常见的向后兼容变更 以下变更通常属于向后兼容的变更: * 新增 API 接口。 * 新增可选的请求参数。 * 在 JSON 响应对象或事件数据中新增字段。 * 调整 JSON 响应对象中字段的返回顺序。 * 调整资源标识等不透明字符串的长度或格式。 * 在流式 API 中新增事件类型。 ## 客户端适配建议 为更好地开发后续演进,建议您在客户端开发中遵循以下原则: * 对响应内容采用宽松解析策略,忽略未识别字段;如非业务必需,不建议对整个响应 JSON 做强校验。 * 对枚举类型字段保留未知值兼容能力,避免因新增取值直接报错。 * 仅传递业务必需的请求参数,不依赖未文档化的参数或行为。 * 基于 HTTP 状态码、错误码等稳定结构处理错误,不依赖错误消息的具体文案。 * 不依赖 JSON 字段顺序,以及资源标识等不透明字符串的固定长度或固定格式。 ## 变更说明渠道 如有兼容性相关更新,请以官方文档中的 [产品更新公告](/docs/product-update-announcements)、[模型发布公告](/docs/model-release-announcement) 和 [模型下线公告](/docs/model-deprecation-notice) 等信息为准。 --- # 错误码 Source: https://ark.volcengine.com/region:cn-beijing/docs/error-codes 本文列举您调用火山方舟 API 可能会涉及的错误码信息,包含方舟错误码和公共错误码。 ## 推理错误码 | HTTP | 错误类型 | 错误码 | 错误信息 | 含义 | \ | 状态码 | Type | Code | Message | | | --- | --- | --- | --- | --- | | 400 | BadRequest | MissingParameter | The request failed because it is missing one or multiple required parameters. Request ID: {id}. | 请求缺少必要参数,请查阅 API 文档。 | | 400 | BadRequest | InvalidParameter | One or more parameters specified in the request are not valid. Request ID: {id}. | 请求包含非法参数,请查阅 API 文档。 | | 400 | BadRequest | InvalidParameter | The parameter `{Parameter}` specified in the request is not valid: {Reason}. Request id: {id}. | System One API(beta)输入缺失、类型错误、格式错误或不满足输入规则。请根据 `error.param` 和 `error.message` 定位并修改参数。 | | 400 | BadRequest | InvalidParameter | {JSON syntax error} Request id: {id}. | System One API(beta)请求体不是合法 JSON。请根据错误信息检查请求体格式。 | | 400 | BadRequest | InvalidParameter | The parameter `instructions` specified in the request are not valid: caching is not supported for instructions. Request id: {id}. | Responses API 中,当配置过 **instructions** 字段信息,后续轮次无法配置 **Caching** 字段。 | | 400 | BadRequest | InvalidEndpoint.ClosedEndpoint | The request targeted an endpoint that is currently closed or temporarily unavailable. Request ID: {id}. | 推理接入点处于已被关闭或暂时不可用, 请稍后重试,或联系推理接入点管理员。 | | 400 | BadRequest | SensitiveContentDetected | The request failed because the input text may contain sensitive information. | 输入文本可能包含敏感信息,请您使用其他 prompt。 | | 400 | BadRequest | SensitiveContentDetected.SevereViolation | The request failed because the input text may contain severe violation information. | 输入文本可能包含严重违规相关信息,请您使用其他 prompt | | 400 | BadRequest | SensitiveContentDetected.Violence | The request failed because the input text may contain violence information. | 输入文本可能包含激进行为相关信息,请您使用其他 prompt | | 400 | BadRequest | InputTextSensitiveContentDetected | The request failed because the input text may contain sensitive information.Request ID: {id}. | 输入文本可能包含敏感信息,请您更换后重试。 | | 400 | BadRequest | InputImageSensitiveContentDetected | The request failed because the input image may contain sensitive information.Request ID: {id}. | 输入图像可能包含敏感信息,请您更换后重试。 | | 400 | BadRequest | InputVideoSensitiveContentDetected | The request failed because the input video may contain sensitive information. | 输入视频可能包含敏感信息,请您更换后重试。 | | 400 | BadRequest | InputAudioSensitiveContentDetected | The request failed because the input audio may contain sensitive information.Request ID: {id}. | 输入音频可能包含敏感信息,请您更换后重试 | | 400 | BadRequest | OutputTextSensitiveContentDetected | The request failed because the output may contain sensitive information. | 生成的文字可能包含敏感信息,请您更换输入内容后重试 | | 400 | BadRequest | OutputImageSensitiveContentDetected | The request failed because the output image may contain sensitive information. | 生成的图像可能包含敏感信息,请您更换输入内容后重试。 | | 400 | BadRequest | OutputVideoSensitiveContentDetected | The request failed because the output video may contain sensitive information.Request ID: {id}. | 生成的视频可能包含敏感信息,请您更换输入内容后重试。 | | 400 | BadRequest | OutputAudioSensitiveContentDetected | The request failed because the output audio may contain sensitive information.Request ID: {id}. | 生成的音频可能包含敏感信息,请您更换输入内容后重试。 | | 400 | BadRequest | InputTextSensitiveContentDetected.PolicyViolation | The request failed because the input text may be related to copyright restrictions. Request ID: {id}. | 输入文本可能涉及版权限制,请您更换后重试。 | | 400 | BadRequest | InputImageSensitiveContentDetected.PolicyViolation | The request failed because the input image may be related to copyright restrictions. Request ID: {id}. | 输入图片可能涉及版权限制,请您更换后重试。 | | 400 | BadRequest | InputVideoSensitiveContentDetected.PolicyViolation | The request failed because the input video may be related to copyright restrictions. Request ID: {id}. | 输入视频可能涉及版权限制,请您更换后重试。 | | 400 | BadRequest | InputAudioSensitiveContentDetected.PolicyViolation | The request failed because the input audio may be related to copyright restrictions. Request ID: {id}. | 输入音频可能涉及版权限制,请您更换后重试。 | | 400 | BadRequest | OutputImageSensitiveContentDetected.PolicyViolation | The request failed because the output image may be related to copyright restrictions. Request ID: {id}. | 生成的图片可能涉及版权限制,请您更换输入内容后重试。 | | 400 | BadRequest | OutputVideoSensitiveContentDetected.PolicyViolation | The request failed because the output video may be related to copyright restrictions. Request ID: {id}. | 生成的视频可能涉及版权限制,请您更换输入内容后重试。 | | 400 | BadRequest | OutputAudioSensitiveContentDetected.PolicyViolation | The request failed because the output audio may be related to copyright restrictions. Request ID: {id}. | 生成的音频可能涉及版权限制,请您更换输入内容后重试。 | | 400 | BadRequest | InputImageSensitiveContentDetected.PrivacyInformation | The request failed because the input image may contain real person.Request ID: {id}. | 输入图片可能包含真人,请您更换后重试。 | | 400 | BadRequest | InputVideoSensitiveContentDetected.PrivacyInformation | The request failed because the input video may contain real person.Request ID: {id}. | 输入视频可能包含真人,请您更换后重试。 | | 400 | BadRequest | OutputImageSensitiveContentDetected.DeepFake | The request failed because the output image may contain counterfeit documents or credentials.Request ID: {id}. | 输出图片可能涉及伪造内容风险,请您更换后重试。 | | 400 | BadRequest | InputTextRiskDetection | The request could not be processed because the input text includes sensitive content that violates ContentSecurityDetection.ARKRequest ID:{id};CSDRequestId:{RequestId};Label:{Label};SubLabel:{SubLabel}. | 火山引擎风险识别产品检测到输入文本可能包含敏感信息,请您更换后重试。 | | 400 | BadRequest | InputImageRiskDetection | The request could not be processed because the input image includes sensitive content that violates ContentSecurityDetection.ARKRequest ID:{id};CSDRequestId:{RequestId};Label:{Label};SubLabel:{SubLabel}. | 火山引擎风险识别产品检测到输入图片可能包含敏感信息,请您更换后重试。 | | 400 | BadRequest | OutputTextRiskDetection | The request could not be processed because the output text includes sensitive content that violates ContentSecurityDetection.ARKRequest ID:{id};CSDRequestId:{RequestId};Label:{Label};SubLabel:{SubLabel}. | 火山引擎风险识别产品检测到输出文本可能包含敏感信息,请您更换后重试。 | | 400 | BadRequest | OutputImageRiskDetection | The request could not be processed because the output image includes sensitive content that violates ContentSecurityDetection.ARKRequest ID:{id};CSDRequestId:{RequestId};Label:{Label};SubLabel:{SubLabel}. | 火山引擎风险识别产品检测到输出图片可能包含敏感信息,请您更换后重试。 | | 400 | BadRequest | ContentSecurityDetectionError | Internal error.ARKRequest ID:{id};CSDRequestId:{RequestId};CSDcode:{};CSDmessage:{} | 火山引擎风险识别产品请求失败。 | | 400 | BadRequest | InvalidParameter.{Parameter} | The specified parameter {Parameter} is invalid. | 请求参数值不合法。请检查参数值的正确性后重试。 | | 400 | BadRequest | InvalidParameter.TaskTypeConstraint | The parameter(s) {Parameter} [and {Parameter}...] specified in the request is/are not valid. {task type description}. Issues: [0] {detail}. [1] {detail}. Request id: {id}. | 请求参数与模型判定的任务类型不兼容,请根据 Issues 提示修改对应参数后重试。 | | 400 | BadRequest | InvalidParameter.TaskTypeMismatch | The parameter {Parameter} specified in the request is not valid: You requested the {requested task type} task type, but Seedance classified your task as {identified task type} based on your prompt and input. Request id: {id}. | 模型识别的任务类型与指定值不一致。请调整提示词和输入素材后重试。 | | 400 | BadRequest | MissingParameter.{Parameter} | The required parameter {Parameter} is missing. | 缺少必要的请求参数。请确认请求参数后重试。 | | 400 | BadRequest | Duplicate.Tags.Key | The specified object of tags contains duplicate keys. | 对象的标签存在重复Key。 | | 400 | BadRequest | InvalidArgumentError | MissingRole:Invalid message: {Message}. | 请求中的 messages 列表里,有消息体缺少 role 字段 | | 400 | BadRequest | InvalidArgumentError.UnknownRole | Unknown the role of message: {Role}. | 消息体中的 role 值不被支持,如`user_`。 | | 400 | BadRequest | InvalidArgumentError.UnknownRole | The Inference role not found: {Role}. | 指定的 inference_role 未在配置中定义。 | | 400 | BadRequest | InvalidArgumentError.InvalidImageDetail | Invalid image detail: {Parameter}. | image_url 中的 detail 参数值无效,只接受 "auto", "high", "low" | | 400 | BadRequest | InvalidArgumentError.InvalidPixelLimit | Customized min_pixels 100 is greater than max_pixels 50 | 用户自定义的图片像素限制(min_pixels, max_pixels)无效(例如 min_pixels > max_pixels,或超出了服务配置的范围) | | 400 | BadRequest | InvalidImageURL.EmptyURL | Empty base64 image url | 传入的图片 URL 为空 | | 400 | BadRequest | InvalidImageURL.InvalidFormat | Invalid base64 image url | 无法解析或处理图片,可能是 Base64 格式不正确、图片数据损坏或格式不支持 | | 400 | BadRequest | OutofContextError | Total tokens of image and text exceed max message tokens. | 当请求中包含图片时,文本和图片编码后的总 token 数超过了模型上下文长度限制 | | 400 | BadRequest | InvalidParameter.UnsupportedParameter | The parameters {Parameter} specified in the request are not supported by this endpoint. | 传入的参数 {Parameter} 在此推理接入点不可用。 | | 400 | BadRequest | InvalidParameter.UnsupportedParameter | The parameter `service_tier=flex` specified in the request is not supported by this model version. | 当前模型版本不支持 `service_tier=flex`。请切换到支持 Flex 的模型版本,或删除 `service_tier` 参数。 | | 400 | BadRequest | InvalidParameter.TosURLInvalid | TOS URI invalid. url:%s. | TOS URI不合法。 | | 400 | BadRequest | InvalidParameter | The given Lean code is not compilable under Lean version %s | 输入的不是一个合法的Lean Code。 | | 400 | BadRequest | InvalidParameter | The format of the given lean code is not supported so far. | 输入的Lean code格式暂不支持。 | | 400 | BadRequest | InvalidParameter | / | 输入的Lean code必须包含theorem | | 400 | BadRequest | InvalidParameter | The doubao source cannot be combined with other sources. | 搜索源同时包含 `doubao` 和其他选项。 | | 400 | Forbidden | InvalidSubscription | Your account ({account_identifier}) does not have a valid coding plan subscription, or your subscription has expired. Please visit {subscription_check_url} to review your subscription status or complete the subscription or renewal process. | Coding Plan 套餐未订阅或已过期。 | | 401 | Unauthorized | AuthenticationError | The API key or AK/SK in the request is missing or invalid. Request ID: {id}. | 请求携带的 API Key 或 AK/SK 校验未通过,请您重新检查设置的 鉴权凭证,或者查看 API 调用文档来排查问题。 | | 401 | Forbidden | InvalidAccountStatus | There is an issue with your account status. If you need assistance, please contact the platform administrators. | 当前使用的账号异常。 | | 403 | Forbidden | OperationDenied.InvalidState | The specified context is in invalid state: InProgress.Request ID: {id}. | 请求所关联的Context ID处于非空闲状态,不可调用。 | | 403 | Forbidden | OperationDenied.ConflictedValidationSet | Operation is denied because it is not supported to configure ValidationSet and ValidationPercentage at the same time. | 无法同时上传验证集和设置训练集取样为验证集百分比,不支持该操作。 | | 403 | Forbidden | OperationDenied.PermissionDenied | Operation is denied because you are not permitted to access the specified configuration of the FoundationModel. | 您没有权限访问基础模型的配置,不支持该操作。 | | 403 | Forbidden | OperationDenied.UnsupportedCustomizationType | Operation is denied because the specified CustomizationType is not supported by the CustomModel. | 模型不支持该训练方法,不支持该操作。 | | 403 | Forbidden | OperationDenied.CustomizationNotSupported | Operation is denied because the specified version of the FoundationModel is not configured for the specified type of customization. | 基础模型的版本不支持该训练方法,不支持该操作。 | | 403 | Forbidden | OperationDenied.ServiceNotOpen | Operation is denied because the model service is unavailable, please go to the Volcano Ark console activation management page to activate the corresponding model service, or submit a work order to contact us. | 模型服务不可用,不支持该操作。请前往火山方舟控制台激活模型服务,或提交工单联系我们。 | | 403 | Forbidden | OperationDenied.ServiceOverdue | Operation is denied because your account balance is overdue, please go to the Volc Trading Center to recharge in order to continue using the service. | 您的账单已逾期,不支持该操作。请前往火山费用中心充值。 | | 403 | Forbidden | AccountOverdueError | The request failed because your account has an overdue balance. Request ID: {id}. | 当前账号欠费(余额<0),如需继续调用,请前往 [火山引擎费用中心](https://console.volcengine.com/finance/fund/recharge) 进行充值,详细操作参见 [充值操作指引](https://docs.volcengine.com/docs/6269/100434?lang=zh)。 | | 403 | Forbidden | AccessDenied | The request failed because you do not have access to the requested resource. Request ID: {id}. | 没有访问该资源的权限,请检查权限设置,或联系管理员添加白名单。 | | 403 | Forbidden | OperationDenied.InvalidState | Operation is denied because the specified context is in invalid state: InProgress. Request id: {id}. | 请求的缓存信息状态是不可用状态。请查看缓存信息是否正在被更新中。 | | 403 | Forbidden | OperationDenied.UnsupportedPhase | Operation is denied because operation is not supported while the target is in its current phase. | 操作失败,操作目标在特殊状态,请检查目标是否存在或者被锁定等特殊状态中。 | | 403 | Forbidden | OperationDenied.FileQuotaExceeded | Your account %s has exhausted its file storage quota. To continue using the service, please delete historical files. | 当前账号 %s 已耗尽文件存储额度,如需继续使用,请删除历史文件。 | | 403 | Forbidden | OperationDenied.ArkAccessRoleNotFound | Please go to Ark Project Settings → Project Authorization, and grant permission to the TOS resource before trying again. | 请到方舟项目配置-项目授权,对tos资源授权后再进行操作。 | | 403 | Forbidden | OperationDenied.TosAccessDenied | Access denied for TOS resource %s. TOS responded: %s. Please verify your account / project has permission to access the specified bucket. | 无权访问 TOS 资源,请确认您的账户 / 项目对该 bucket 拥有访问权限。 | | 403 | Forbidden | OperationDenied.InvalidState | The specified file is in invalid state: InProgress.Request ID: {id}. | 请求所关联的File ID处于非可用状态,不可调用。 | | 403 | Forbidden | AccessDenied | Access denied for web search. Please go to the Volcano Ark Console to verify the activation status. | 尚未开通豆包搜索。 | | 403 | Forbidden | QuotaExceeded.DoubaoSearchFreeQuotaExceeded | Your free web search quota has been exhausted. Please subscribe to continue. Request ID: {{id}} | 豆包搜索的免费额度已耗尽。 | | 404 | NotFound | InvalidEndpointOrModel.NotFound | The model or endpoint %s does not exist or you do not have access to it. | 模型或者推理接入点 %s 不存在或者您无权访问它。 | | 404 | NotFound | ModelNotOpen | Your account %s has not activated the model %s. Please activate the model service in the Ark Console. | 当前账号 %s 暂未开通 %s 模型服务,请前往火山方舟控制台开通管理页开通对应模型服务。 | | 404 | NotFound | NotFound.{Parameter} | The specified {ResourceType} {ResourceContent} is not found. | 指定资源找不到。请确认参数后重试。 | | 404 | NotFound | InvalidEndpointOrModel.ModelIDAccessDisabled | Accessing the model via Model ID is not allowed for your account. Please use a custom endpoint ID instead. Request id:{id}. | 未能找到指定的模型ID。你的账号不允许使用模型ID来调用模型,请确认你账号权限或者使用有权限的推理接入点 ID 来调用模型服务。 | | 404 | NotFound | UnsupportedModel | The {model_name} model does not support the coding plan feature. Please refer to the documentation at {doc_url} to select a compatible model. | 当前模型不支持 Coding Plan。 | | 404 | NotFound | InvalidAction | The specified action is invalid: {method} {path} Request id: {id}. | System One API(beta)请求的方法或路径没有对应处理器。请检查请求方法和 API 路径。 | | 404 | NotFound | PathNotFound | The path of api not found. Request id: {id}. | 网关未识别 API 路径。请检查请求 URL 和路由配置。 | | 408 | RequestTimeout | RequestTimeout | Request to service is timeout: it may happen on service is meeting heavy load: please retry later or contact with administrator if not work afterwards Request id: {id}. | System One API(beta)整个请求或服务调用超时。固定文案中的 heavy load 是通用提示,不能据此认定根因是过载。可在控制重试次数的前提下重试。 | | 429 | TooManyRequests | RateLimitExceeded.EndpointRPMExceeded | The Requests Per Minute (RPM) limit of the associated endpoint for your account has been exceeded. Request ID: {id}. | 请求所关联的推理接入点已超过 RPM (Requests Per Minute) 限制, 请稍后重试。 | | 429 | TooManyRequests | RateLimitExceeded.EndpointTPMExceeded | The Tokens Per Minute (TPM) limit of the associated endpoint for your account has been exceeded. Request ID: {id}. | 请求所关联的推理接入点已超过 TPM (Tokens Per Minute) 限制, 请稍后重试。 | | 429 | TooManyRequests | RateLimitExceeded.EndpointFlexTPMExceeded | The Flex Tokens Per Minute (TPM) limit of the associated endpoint for your account has been exceeded. Request ID: {id}. | 已超过推理接入点配置的 Flex TPM 上限。请在客户端退避重试,或调整推理接入点的 Flex TPM 配置。 | | 429 | TooManyRequests | ModelAccountRpmRateLimitExceeded | RPM (Requests Per Minute) limit of the model is exceeded. Request ID: {id}. | 请求已超过帐户模型 RPM (Requests Per Minute) 限制: 请您稍后重试, 或者联系平台技术同学进行解决 | | 429 | TooManyRequests | ModelAccountTpmRateLimitExceeded | TPM (Tokens Per Minute) limit of the model is exceeded. Request ID: {id}. | 请求已超过帐户模型 TPM (Tokens Per Minute) 限制: 请您稍后重试, 或者联系平台技术同学进行解决 | | 429 | TooManyRequests | ModelAccountFlexTpmRateLimitExceeded | The Flex Tokens Per Minute (TPM) limit of the model for your account has been exceeded. Request ID: {id}. | 已超过账号 × 模型的 Flex TPM 上限。请在客户端退避重试,或申请提升 Flex TPM 配额,或将任务迁移到闲时段。 | | 429 | TooManyRequests | APIAccountRpmRateLimitExceeded | The RPM (Requests Per Minute) limit for the API on your account has been exceeded. Request ID: {id}. | 当前账号该接口的RPM (Requests Per Minute)限制已超出,请稍后重试。 | | 429 | TooManyRequests | ModelAccountIpmRateLimitExceeded | IPM (Images Per Minute) limit of the model is exceeded. | 请求已超过账户模型 IPM (Images Per Minute) 限制: 请您稍后重试, 或者联系平台技术同学进行解决 | | 429 | TooManyRequests | QuotaExceeded | Your account [%s] has exhausted its free trial quota for the [%s] model. Request ID: {id}. | 当前账号 %s 对 %s 模型的免费试用额度已消耗完毕,如需继续调用,请前往火山方舟控制台开通管理页开通对应模型服务。 | | 429 | TooManyRequests | AccountQuotaExceeded | The request has exceeded the quota. Request id: {id}. | 账户额度不足。下游未提供结构化重置时间时,System One API(beta)使用该错误码和通用文案。 | | 429 | TooManyRequests | ModelAccountTpdRateLimitExceeded | TPD (Total Per Day) limit of the model {model} is exceeded. Please try again later Request id: {id}. | 账户在该模型上的每日 Token 配额不足。请等待配额重置或调整配额。 | | 429 | TooManyRequests | QuotaExceeded | The request has exceeded the quota. Request ID: {id}. | 当前账号处于排队中状态的任务数已超过限制,请稍后重试。 | | 429 | TooManyRequests | ServerOverloaded | The service is currently unable to handle additional requests due to server overload. Please retry later. Request ID: {id}. | 服务资源紧张,请您稍后重试。常出现在调用流量突增或刚开始调用长时间未使用的推理接入点。 | \ | | | | | | \ | | | | | :::tip | \ | | | | | 调用`doubao-seed-1.8`及之前版本模型触发突增流量限制时,返回此错误码。可参考[突发流量处理最佳实践](/docs/traffic-burst-handling-best-practices)处理。 | \ | | | | | ::: | | 429 | TooManyRequests | RequestBurstTooFast | System protection triggered by request burst. Please slow down traffic growth and increase requests gradually before retrying. | 请求量激增触发系统保护,请放缓流量提升速度,逐步增加请求量后再尝试 | \ | | | | | | \ | | | | | :::tip | \ | | | | | 调用 `doubao-seed-2.0`及之后版本模型触发突增流量限制时,返回此错误码,可参考[突发流量处理最佳实践](/docs/traffic-burst-handling-best-practices)处理。 | \ | | | | | ::: | | 429 | TooManyRequests | SetLimitExceeded | Your account [%s] has reached the set usage limit for the [%s] model, and the model service has been paused. To continue using this model, please visit the Model Activation page to adjust or close the "Safe Experience Mode". | 当前账号 %s 对 %s 模型已达到设置的模型用量上限值,如需继续调用,请前往火山方舟控制台开通管理页修改模型用量上限值或关闭安心体验模式。 | \ | | | | Request ID: {id}. | | | 429 | TooManyRequests | SetLimitExceeded | Your account [%s] has reached the set usage limit for the [%s] endpoint, and the endpoint service has been paused. To continue using this endpoint, please visit the endpoint detail page to adjust or close the endpoint usage limit. | 当前账号 %s 对 %s 接入点已达到设置的接入点用量上限值,如需继续调用,请前往火山方舟控制台接入点详情页修改接入点用量上限值或关闭接入点用量上限。 | \ | | | | Request ID: {id}. | | | 429 | TooManyRequests | InflightBatchsizeExceeded | The Inflight Batchsize limit has been exceeded.Request ID: {id}. | 您已经达到当前充值金额下的最大并发数限制,您可以充值解锁更大并发额度或降低并发数。 | | 429 | TooManyRequests | AccountRateLimitExceeded | Requests are too frequent. Please reduce your request frequency, wait a short moment, and retry your request. | 请求超出RPM / TPM限制。 | | 429 | TooManyRequests | QuotaExceeded | You have exceeded the 5-hour/weekly/monthly usage quota. It will reset at {reset_time}. | 使用的额度超出5小时/周/月限额。 | | 429 | TooManyRequests | QuotaExceeded.AgentPlanQuotaExceeded | The Agent Plan AFP quota for this account has been exhausted. Please purchase additional quota or enable overdraft. | Agent Plan 套餐的 AFP 已耗尽。 | | 499 | "" | RequestCanceled | The request is canceled before response. Request id: {id}. | 调用方取消请求或连接关闭。连接已关闭时,调用方通常收不到完整响应体。 | | 500 | InternalServerError | InternalServiceError | The service encountered an unexpected internal error. Please retry later. Request ID: {id}. | 内部系统异常,请您稍后重试。 | | 500 | InternalServerError | ModelLoading | The request cannot be processed at this time because the model is currently being loaded. Request id: {id}. | 下游返回模型加载中。请等待模型就绪后重试。 | | 503 | ServiceUnavailable | ServiceConnectionRefused | Connection to service is refused: it may happen on the service has stopped by the administrator: please retry later or contact with administrator if not work afterwards Request id: {id}. | 服务连接或依赖调用失败。固定提示不能单独证明服务被管理员关闭,持续发生时请检查服务可用性。 | | 503 | ServiceUnavailable | NoAvailableService | No available service Request id: {id}. | 下游没有可用服务实例。请等待服务恢复,或检查模型服务状态。 | ## 精调错误码 本部分将介绍模型精调相关的错误码信息及其建议的解决方案。 |错误码 |示例错误信息 |说明与建议解决方案 | |---|---|---| |InvalidData.MissingKey |Data format is not expected: column not found |数据格式不符合预期, 未找到名为的列, 建议检查并补全数据集中相应键值. | |InvalidData.UnknownKey |Wrong Key , parsing sample failed |数据中有错误的Key, 解析样本失败, 建议检查错误信息中对应样本的键值 | |InvalidData.InvalidValue |Unsupported data type: , only pretrain, dialog, dialog-dpo and multimodal supported |不支持的数据集类型, 仅支持"pretrain", "dialog", "dialog-dpo", 和"multimodal"类型, 建议检查填入的数据集类型 | |^^| | | \ | |Content is empty, original text content is: |content字段内容为空, 原文本内容为, 建议检查原文本的数据完整性. | |InvalidData.InvalidJsonl | not supported |数据集文件格式不支持, 建议调整对应文件为`.jsonl`格式. | |^^| | | \ | |No jsonl file available |无可用的jsonl文件, 建议检查数据集包含的文件列表. | |InvalidData.InvalidJson |Expecting value: line 1 column 1 (char 0) in file at row |在<文件名>中第行, JSON解析失败, 建议检查数据集文件内容是否符合JSON规范. | |InvalidData |failed to init data preprocess builder: training tos bucket: maas-data-test, tos path:

    : tos objects do not exist |提供的数据集地址在TOS中不存在, 建议检查TOS中数据集文件是否出现缺失或地址错误. | |UnknownError |service error occur, please contact customer service for help |平台服务错误, 不可重试, 建议发起工单协助排查 | |InternalError |task failed, please check the logs |训练失败, 建议检查日志后发起重试, 如仍无法解决问题, 建议发起工单协助排查. | ## Managed Agent 错误码 本部分列举 Managed Agent 相关接口的错误码信息。Managed Agent 的错误按下发通道分为两类: - **HTTP 阶段错误码**:由 HTTP 请求同步返回,携带 HTTP 状态码与结构化错误体,适用于所有同步接口(如 POST create、POST events)。 - **SSE 阶段错误码**:请求已进入事件流后由服务端通过 `data.type = "session.error"` 事件下发,**无 HTTP 状态码**,仅在 `RunFailed` / `SessionError` 与 SSE resume/lag 场景出现。 ### HTTP 阶段错误码 |HTTP |错误类型 |错误码 |错误信息 |含义 | \ |状态码 |Type |Code |Message | | |---|---|---|---|---| |400 |BadRequest |InvalidParameter |One or more parameters specified in the request are not valid. |请求中存在一个或多个非法参数。请对照 API 文档核对参数名、类型、取值范围及参数间依赖关系后重试。 | |400 |BadRequest |MissingParameter |The request failed because it is missing `%s` parameter. |请求缺少必填参数 `%s`。请补齐后重试。 | |400 |BadRequest |InvalidAction |The requested action is not valid for the current resource state. |目标资源当前状态不允许该操作。请先将资源迁移到允许该操作的状态(例如结束正在进行的回合、恢复被暂停的资源)后再重试。 | |400 |BadRequest |InvalidPayload |Request payload is invalid. |请求体不符合接口约定,可能由 JSON 解析失败、事件列表结构非法或事件参数非法导致。请对照接口文档校验请求体。 | |400 |BadRequest |EmptyEvents |Request must include at least one event. |POST events 请求体中的 `events` 数组为空。本码用于与 `InvalidPayload` 区分:`InvalidPayload` 表示 batch 结构非法,`EmptyEvents` 特指结构合法但长度为 0。 | |400 |BadRequest |RuntimeRejected |Runtime rejected the request. |POST create 阶段同步 materialize 被 runtime 拒绝。Tool Service 启动期致命错误也会归到此码;create-time 使用 public override 时 `message` 内容可能不同。请检查 agent snapshot 与 runtime 配置是否兼容。 | |400 |BadRequest |MissingSessionModel |Request provider mode requires agent.model.name. |POST create 在 request provider 模式下,managed-agent snapshot 中未包含可用的 `agent.model.name`。请在 agent 定义中补齐模型信息。 | |400 |BadRequest |MissingSessionId |session_id is required. |POST create 请求体缺失 `session_id` 或该字段为空白字符串。请携带非空 `session_id` 后重试。 | |400 |BadRequest |ManagedAgentsRequired |Managed agents integration is required for request provider mode. |POST create 使用 request provider 模式,但服务端未配置 managed-agents loader。请在服务端完成 managed agents 集成后再调用。 | |400 |BadRequest |ManagedAgentsRejected |Managed agent definition was rejected. |POST create 阶段 managed-agents 业务层拒绝请求。常见原因:目标 session 不存在、session 已被删除、租户与 session 归属不一致等。 | |400 |BadRequest |ManagedAgentsInvalidAgent |Managed agent definition is invalid. |POST create 阶段 agent payload 无法翻译成合法的 AgentSpec。常见原因:`agent.name` 为空、权限策略或工具名不被识别、`skill_id` 缺失等。 | |401 |Unauthorized |AuthenticationError |The API key or AK/SK in the request is missing or invalid. |请求携带的 API Key 或 AK/SK 缺失、非法或已过期。请检查鉴权凭证的设置,或参考 API 调用文档排查。 | |401 |Unauthorized |MissingHeader |Authorization header is required for this request. |POST events 在 request provider 模式下要求 `Authorization` 请求头存在、非空且为 `Bearer ` 形态。请补齐该请求头。 | |401 |Unauthorized |MCPInvalidCredential |The MCP server rejected the credential; verify or update the API key or token. |出向调用的 MCP server 判定当前凭证无效并拒绝请求。请更新对应的 API key 或 token。 | |401 |Unauthorized |MCPNeedsReauth |The MCP credential is unauthorized after refresh; re-authorization is required. |出向 MCP 凭证在自动刷新后仍返回 401,说明 refresh token 已失效。请重新走 OAuth 授权流程获取新凭证。 | |403 |Forbidden |AccessDenied |The request failed because you do not have access to the requested resource. |调用方对目标资源无访问权限。请检查资源所属账号、项目授权及白名单配置。 | |403 |Forbidden |OperationDenied(.\) |Operation is denied [because \]. |操作被拒绝,携带子原因码 `` 指明具体原因,例如:商品未开通、子账号缺少所需权限、账号实名认证未通过、账号欠费导致服务暂停等。请根据 `` 与 `message` 定位并解决。 | |403 |Forbidden |AccountOverdueError |The request failed because your account has an overdue balance. |当前账号存在欠费或计费项未开通,服务被禁止调用。请前往火山引擎费用中心完成充值或开通对应计费项后重试。 | |403 |Forbidden |MCPNetworkDenied |Network access to the requested MCP server is denied. |目标 MCP server 未通过接入控制(connector 未启用,或 host 不在出向白名单)。请在方舟控制台开通对应的 MCP 出向策略。 | |404 |NotFound |PathNotFound |The path of api not found. |请求所指的 API 路径不存在。请核对 endpoint 路径与 API 版本。 | |404 |NotFound |InvalidSession.NotFound |The session %s does not exist or you do not have access to it. |指定的 `session_id` 不存在,或调用者对该 session 无访问权限。 | |404 |NotFound |InvalidAgent.NotFound |The agent %s does not exist or you do not have access to it. |指定的 `agent_id` 不存在,或调用者对该 agent 无访问权限。 | |404 |NotFound |InvalidEnvironment.NotFound |The environment %s does not exist or you do not have access to it. |指定的 `environment_id` 不存在,或调用者对该 environment 无访问权限。 | |404 |NotFound |InvalidVault.NotFound |The vault %s does not exist or you do not have access to it. |指定的 `vault_id` 不存在,或调用者对该 vault 无访问权限。 | |404 |NotFound |InvalidCredential.NotFound |The credential %s does not exist or you do not have access to it. |指定的 `credential_id` 不存在,或调用者对该 credential 无访问权限。 | |404 |NotFound |InvalidMemoryStore.NotFound |The memory_store %s does not exist or you do not have access to it. |指定的 `memory_store_id` 不存在,或调用者对该 memory store 无访问权限。 | |404 |NotFound |InvalidFile.NotFound |The file %s does not exist or you do not have access to it. |指定的 `file_id` 不存在,或调用者对该文件无访问权限。 | |404 |NotFound |ResourceNotFound |The requested resource does not exist or you do not have access to it. |请求的资源不存在或调用者无访问权限。当资源类型未落到上述具体 `.NotFound` 分支时使用此通用码。 | |404 |NotFound |ManagedAgentNotOpen |Your account %s has not activated the managed agent. Please activate the service in the Ark Console. |当前账号 %s 未开通 Managed Agent 服务。请前往火山方舟控制台开通对应服务后再调用。 | |404 |NotFound |NotSupportedMCPServer.NotFound |The MCP server %q is not supported by the OAuth flow yet; ask operator to register it. |OAuth flow 中传入的 `mcp_server_url` 未在服务端预注册。请联系运营方将该 MCP server 完成注册后再走 OAuth 流程。 | |409 |Conflict |Conflict |The request conflicts with the current state of the resource. |请求与目标资源的当前状态存在冲突。请刷新资源状态后重试。 | |409 |Conflict |ResourceConflict |The request conflicts with the current state of the resource. |资源发生冲突(如同名或同路径的资源已存在)。请更换资源标识后重试。 | |409 |Conflict |SessionBusy |The session is currently busy with another in-flight request. Please retry after the current request finishes or send a user.interrupt first. |同一 session 上已有 in-flight 回合正在执行。请等待其结束,或先向该 session 发送 `user.interrupt` 中断当前回合后再重试。 | |409 |Conflict |RuntimeBusy |Session is currently busy with another exclusive command; retry later. |POST create / POST events 阶段服务端在 HTTP 入口抢 session redislock 失败:同一 session 上已有另一个独占命令在执行。请等前一独占命令结束后再重试。SSE 阶段的同义码 `loop.kernel.runtime_busy` 通过事件流下发、不携带 HTTP 状态码,语义与本码不同,不可复用其判定规则。 | |413 |PayloadTooLarge |RequestTooLarge |The request entity is larger than the limit allowed. |业务层单个 content / payload 超过上限(含单文件、zip 包、单条消息等业务粒度)。请拆分或压缩后重试。 | |413 |PayloadTooLarge |RequestBodyTooLarge |The request body is larger than the limit allowed. |HTTP 请求体的字节数超过了传输层上限。请压缩或分批传输。此码与 `RequestTooLarge` 的区别是:前者是业务粒度限制,本码是传输粒度限制。 | |424 |FailedDependency |UpstreamUnavailable |An upstream dependency is temporarily unavailable. Please retry later or check that the upstream is healthy. |客户侧上游依赖(如 MCP server、IdP)临时不可达,表现为超时、抖动或返回 5xx。请稍后重试,并排查上游服务健康度。 | |424 |FailedDependency |MCPInvalidResponse |The MCP server returned an invalid response; verify the server URL and credential. |MCP server 对 `initialize` 请求返回不合法响应。常见原因是 `mcp_server_url` 指向了非 MCP 服务。请核对 server URL 及凭证。 | |429 |TooManyRequests |APIAccountRpmRateLimitExceeded |The RPM (Requests Per Minute) limit for the API on your account has been exceeded. |当前账号在该 API 上的 RPM (Requests Per Minute) 限额已超出。请降低调用频率或稍后重试。 | |429 |TooManyRequests |SessionQuotaExceeded |The number of active sessions has reached the quota. Finish or delete existing sessions before creating a new one. |单个 agent 下的活跃 session 数量已达配额上限。请调用 delete session 接口删除部分已完成的 session 释放配额后,再创建新的 session。 | |499 |ClientClosedRequest |RequestCanceled |The request is canceled before response. |服务端在返回响应前请求已被客户端取消,通常由客户端主动断开或超时导致。 | |500 |InternalServerError |InternalServiceError |The service encountered an unexpected internal error. Please retry later. |服务内部出现未预期错误。可重试;持续复现时请携带 Request ID 提工单排查。 | |500 |InternalServerError |SideEffectFailed |Request side effect failed. |服务端在向运行时分派事件前执行关联操作失败。请重试;持续失败时携带 Request ID 提交工单。 | |502 |BadGateway |ManagedAgentsUnavailable |Managed agent definition is temporarily unavailable. |POST create 反查 managed-agents 的 `InnerGetSession` 出现网络错误、非 2xx 响应或响应解码失败,上游 managed-agents 服务暂时不可用。请稍后重试。 | ### SSE 阶段错误码 请求进入事件流后发生的错误,以 `data.type = "session.error"` 事件通过已建立的 SSE 通道下发,**不携带 HTTP 状态码**。仅在以下场景出现:runtime 判定 `RunFailed` / `SessionError`,或 SSE resume / lag 通道自身错误。事件示例(SSE wire format,片段): ```text ... id: sevt-... data: {"type": "session.error", "id": "sevt-...", "processed_at": "2026-07-17T15:02:00+08:00", "error": {"type": "unknown_error", "message": "Tool execution failed due to a runtime issue."}} ... ``` 其中 `data:` 后的 JSON 负载展开如下: ```json { "type": "session.error", "id": "sevt-...", "processed_at": "2026-07-17T15:02:00+08:00", "error": { "type": "unknown_error", "message": "Tool execution failed due to a runtime issue." } } ``` **客户端分类规则**:以 `error.type` 作为程序判别的唯一字段——所有分支都会携带该字段。`error.message` 仅供展示,不作为程序分类依据。 |error.type |含义 | |---|---| |model_overloaded_error |Typed 分支,不携带 `error.code`。模型上游过载。 | |model_rate_limited_error |Typed 分支,不携带 `error.code`。模型触发限流。 | |model_request_failed_error |Typed 分支,不携带 `error.code`。模型请求失败(如上游返回 5xx、连接建立失败等)。 | |billing_error |`SessionError` 专属 variant,不携带 `error.code`。计费相关错误。 | |unknown_error |尚未收敛到 typed 分支的多种致命场景当前统一落此 type,需结合上下文与日志进一步定位。可能触发的场景包括: | \ | | * Provider snapshot 或 provider HTTP 调用失败,且 runtime 重试用尽后进入 `RunFailed`; | \ | | * Tool Service 执行期出现回合级致命错误(如 exec 无响应、2xx 响应解码失败、前台 bash 流异常终止等);exec 期 HTTP 非 2xx 通常作为模型可见的 tool error 由模型处理,**不进入 `session.error` 通道**; | \ | | * MCP 工具执行期发生致命错误; | \ | | * 命令进入 runtime 后请求非法(POST 阶段的校验规则不适用于此阶段,不要复用同名码的判定规则); | \ | | * Runtime 协议不匹配; | \ | | * 内核回合占用; | \ | | * Runtime 内部错误; | \ | | * Credential host 不可达(typed schema 已声明但 `vault_id` / `credential_id` 字段尚未补齐,当前仍落 `unknown_error`); | \ | | * SSE resume 位点超出保留窗口——属于 stream 自身错误,与 runtime / Tool / provider 均无关; | \ | | * 订阅端消费滞后被服务端主动断开——属于 stream 自身错误。 | ## 公共错误码 查询火山引擎的 [公共错误码](https://docs.volcengine.com/docs/6369/68677?lang=zh)。 --- # SDK 常见使用示例 Source: https://ark.volcengine.com/region:cn-beijing/docs/sdk-common-examples 当您使用官方 SDK 时,设置自定义header等典型的使用,可以参考本说明。 ## 设置超时&重试次数 当您的网络环境不稳定或者响应时间较长的场景,可以设置超时和重试次数,以提高服务可用性。 * 超时设置(`timeout`):适用于对响应时间较长的场景(如深度思考模型回复问题时间较长),避免请求时间超时导致服务中断,这里推荐30分钟(1800秒)。 * Python SDK:默认 60秒 连接超时(建立网络连接的最大等待时间),600 秒 socket 超时(连接建立后的数据传输超时)。 * Java SDK:默认 60秒 连接超时,600 秒 socket 超时。 * Go SDK:默认 600s 端到端的总超时(从请求发起至响应接收的总超时)。 * 重试次数(`max_retries`):适用于网络不稳定场景,自动重试因瞬时故障(如网络波动)失败的请求,默认2次,即请求失败默认会再重试2次,您可以按需配置。 **选项:Python** ```Python import os # Install the Ark SDK with: python -m pip install --upgrade arkruntime . from arkruntime import Ark client = Ark( api_key=os.environ.get("ARK_API_KEY"), # Allow enough time for long-running requests. timeout=1800, # Retry transient failures up to two times. max_retries=2, base_url="https://ark.cn-beijing.volces.com/api/v3", ) ``` **选项:Go** ```Go import ( "os" "time" "github.com/volcengine/ark-runtime-go/arkruntime" ) client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithTimeout(30*time.Minute), // Allow enough time for long-running requests. arkruntime.WithRetryTimes(2), // Retry transient failures up to two times. arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ``` **选项:Java** ```Java import java.time.Duration; import com.volcengine.ark.runtime.service.ArkService; public class ConfigureSdkTimeoutRetryExample { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); ArkService service = ArkService.builder() .apiKey(apiKey) .timeout(Duration.ofMinutes(30)) .connectTimeout(Duration.ofSeconds(20)) .retryTimes(2) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); service.shutdownExecutor(); } } ``` ## 使用Access Key鉴权 当需要通过火山引擎云服务的标准鉴权体系(Access Key/Secret Key)认证时使用。 > 使用 Access Key 鉴权的实现原理是通过接口 [GetApiKey](/docs/get-api-key-api) 获取临时 API Key 进行鉴权,此接口限流较低,务必使用单例模式进行请求,避免因限流导致鉴权失败,可参考[单例请求](/docs/sdk-common-examples#063cdc02)。 **选项:Python** ```Python import os # 通过命令安装方舟SDK python -m pip install --upgrade arkruntime . from arkruntime import Ark client = Ark( ak=os.environ.get("VOLC_ACCESSKEY"), sk=os.environ.get("VOLC_SECRETKEY"), # The base URL for model invocation . base_url="https://ark.cn-beijing.volces.com/api/v3", ) ``` **选项:Go** ```Go import ( "os" "github.com/volcengine/ark-runtime-go/arkruntime" ) client := arkruntime.NewClientWithAkSk( os.Getenv("VOLC_ACCESSKEY"), os.Getenv("VOLC_SECRETKEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), // The base URL for model invocation . ) ``` **选项:Java** ```Java import com.volcengine.ark.runtime.service.ArkService; public class CreateArkClientExample1 { public static void main(String[] args) { String ak = System.getenv("VOLC_ACCESSKEY"); String sk = System.getenv("VOLC_SECRETKEY"); ArkService service = ArkService.builder().ak(ak).sk(sk) // The base URL for model invocation . .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); } // do your operation... } ``` ## 设置自定义 header 自定义的 `header` 字段采用键值对(key-value)结构,以对象形式呈现,具体格式示例如下: ```JSON { "key1": "value1", "key2": "value2", ..., "keyN": "valueN" } ``` 可以用于传递额外信息,如配置 ID来串联日志,使能数据加密能力。支持该字段的接口有 [对话(Chat) API](/docs/chat-api)、[批量(Chat)API](/docs/batch-chat-api),下面是典型示例。 ### 问题定位 您可以在请求时,为多个请求设置 **key** 为 `X-Client-Request-Id`,**value** 配置为自定义的 ID,并提供 ID 给方舟售后团队,为您串联客户端和服务端日志,方便问题定位。 **选项:Python** ```Python import os # 通过命令安装方舟SDK python -m pip install --upgrade arkruntime from arkruntime import Ark client = Ark( api_key=os.environ.get("ARK_API_KEY"), # The base URL for model invocation . base_url="https://ark.cn-beijing.volces.com/api/v3", ) completion = client.chat.completions.create( # Replace with Model ID . model = "doubao-seed-2-1-pro-260915", messages = [ {"role": "user", "content": "Hello"}, ], # 自定义request id extra_headers={"X-Client-Request-Id": "My-Request-Id"} ) print(completion.choices[0].message.content) ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" arkmodel "github.com/volcengine/ark-runtime-go/arkruntime/model" "github.com/volcengine/ark-runtime-go/arkruntime/model/chat" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), // The base URL for model invocation . ) ctx := context.Background() req := &chat.ChatCompletionRequest{ Model: "doubao-seed-2-1-pro-260915", //Replace with Model ID . Messages: []chat.ChatCompletionRequestMessage{ userMessage("Hello"), }, } // 自定义request id resp, err := client.CreateChatCompletion( ctx, req, arkruntime.WithCustomHeader(arkmodel.ClientRequestHeader, "my-request-id"), // 自定义请求头 ) if err != nil { fmt.Printf("standard chat error: %v\n", err) return } fmt.Println(resp.Choices[0].Message.Content) } func userMessage(content string) chat.ChatCompletionRequestMessage { return chat.ChatCompletionRequestMessage{ OneOf: chat.NewChatCompletionRequestUserMessageChatCompletionRequestMessageSum( chat.ChatCompletionRequestUserMessage{ Role: chat.ChatCompletionRequestUserMessageRoleUser, Content: chat.NewOptNilChatCompletionMessageContent(chat.NewStringChatCompletionMessageContent(content)), }, ), } } ``` **选项:Java** ```Java package com.example; import com.volcengine.ark.runtime.Const; import com.volcengine.ark.runtime.models.chat.*; import com.volcengine.ark.runtime.service.ArkService; import java.util.ArrayList; import java.util.HashMap; import java.util.List; public class ChatCompletionsExample3 { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); // The base URL for model invocation . ArkService arkService = ArkService.builder().apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); final List messages = new ArrayList<>(); final ChatCompletionRequestMessage userMessage = ChatCompletionRequestUserMessage.builder().role(ChatCompletionRequestMessageType.USER).content(ChatCompletionMessageContent.ofString("常见的十字花科植物有哪些?")).build(); messages.add(userMessage); ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder() .model("doubao-seed-2-1-pro-260915") //Replace with Model ID . .messages(messages) .build(); // 使用自定义的请求头 arkService.createChatCompletion(chatCompletionRequest, new HashMap(){{put(Const.CLIENT_REQUEST_HEADER, "my_request_id");}}).getChoices().forEach(choice -> System.out.println(choice.getMessage().getContent())); // shutdown service arkService.shutdownExecutor(); } } ``` ### 加密数据 为了保证推理会话数据的传输安全,你可以为在线推理的会话数据加密。使能能力后,SDK 会对推理会话的内容进行加密。 > 更多能力介绍和原理信息请参考[推理会话数据应用层加密方案](/docs/application-layer-encryption-for-inference-session-data)。 * 版本要求: * Python SDK:需要保证 `arkruntime` 版本为 `0.5.0` 及以上。参考[升级 Python SDK](/docs/install-and-upgrade-sdk#d6b883b8)升级 SDK。 * Java SDK:需要保证 `com.volcengine:ark-runtime` 版本为 `0.5.0` 及以上。参考[升级 Java SDK](/docs/install-and-upgrade-sdk#4ab4182d)升级 SDK。 * 能力支持: * 仅支持文本生成模型和视觉理解图片理解模型请求。 * 图片仅支持 Base64 图片加密, URL 图片无法加密。 * 仅支持官方 Python SDK、Java SDK 的 [Chat API](/docs/chat-api) 。 * 支持单轮、多轮会话,支持流式、非流式,同步、异步调用。 **选项:Python** ```Python import os # 通过命令安装方舟SDK python -m pip install --upgrade arkruntime from arkruntime import Ark client = Ark( api_key=os.environ.get("ARK_API_KEY"), # The base URL for model invocation . base_url="https://ark.cn-beijing.volces.com/api/v3", ) completion = client.chat.completions.create( # Replace with Model ID . model = "doubao-seed-2-1-pro-260915", messages = [ {"role": "user", "content": "Hello"}, ], #按下述代码设置自定义header,免费开启推理会话应用层加密 extra_headers={'x-is-encrypted': 'true'} ) print(completion.choices[0].message.content) ``` **选项:Java** 在 `pom.xml` 文件中增加以下配置: ```XML org.bouncycastle bcprov-jdk18on 1.78.1 org.bouncycastle bcpkix-jdk18on 1.78.1 ``` 代码示例如下: ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.chat.*; import com.volcengine.ark.runtime.service.ArkService; import java.time.Duration; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.HashMap; public class ChatCompletionsExample { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); ArkService service = ArkService.builder() .apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .timeout(Duration.ofSeconds(1800)) // Set the backend request processing timeout in seconds, recommended to be 1800 seconds or longer .connectTimeout(Duration.ofSeconds(20)) // Set the connection timeout to 20 seconds .retryTimes(2)// Set the retry count to 2 .build(); final List messages = new ArrayList<>(); final ChatCompletionRequestMessage userMessage = ChatCompletionRequestUserMessage.builder().role(ChatCompletionRequestMessageType.USER).content(ChatCompletionMessageContent.ofString("Hello")) .build(); messages.add(userMessage); ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder() .model("doubao-seed-2-1-pro-260915") //Replace with Model ID .messages(messages) .build(); // Set custom headers with the code below to enable application-layer encryption for inference sessions at no cost Map customHeaders = new HashMap<>(); customHeaders.put("x-is-encrypted", "true"); service.createChatCompletion(chatCompletionRequest, customHeaders).getChoices() .forEach(choice -> System.out.println(choice.getMessage().getContent())); // shutdown service service.shutdownExecutor(); } } ``` ### 开启数据上报 为了便于快速排查和定位问题,你可以在 Responses API 请求的 header 中增加`"X-Fornax-Trace: true"`开启数据上报。支持统计分析的数据见[分析统计](/docs/manage-inference-endpoints#db0a7d46)。 > 该能力限时免费提供使用。 * 版本要求:如果请求上报未生效,需升级 SDK 到最新版本。 * 能力支持:仅支持 [Responses API](/docs/create-model-responses-api)。 **选项:Python** ```Python import os from arkruntime import Ark client = Ark( base_url='https://ark.cn-beijing.volces.com/api/v3', api_key=os.getenv('ARK_API_KEY'), ) response = client.responses.create( model="", input="hello", extra_headers={'X-Fornax-Trace': 'true'} ) print(response) ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/responses" ) func main() { client := arkruntime.NewClientWithApiKey( // Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) ctx := context.Background() resp, err := client.CreateResponses(ctx, &responses.ResponsesRequest{ Model: "", Input: responses.NewStringResponsesInput("hello"), }, arkruntime.WithCustomHeader("X-Fornax-Trace", "true")) if err != nil { fmt.Printf("response error: %v\n", err) return } fmt.Println(resp) } ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.service.ArkService; import com.volcengine.ark.runtime.models.responses.*; import java.util.HashMap; import java.util.Map; public class demo { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); // The base URL for model invocation ArkService arkService = ArkService.builder().apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); ResponsesRequest request = ResponsesRequest.builder() .model("") .input(ResponsesInput.ofString("hello")) .build(); Map customHeaders = new HashMap<>(); customHeaders.put("X-Fornax-Trace", "true"); Response resp = arkService.createResponse(request, customHeaders); System.out.println(resp); arkService.shutdownExecutor(); } } ``` ## 单例请求 请使用单例方式请求模型服务,勿重复创建实例导致额外资源消耗。 **选项:Python** ```Python import os # 通过命令安装方舟SDK python -m pip install --upgrade arkruntime from arkruntime import Ark client = Ark( # Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey api_key=os.environ.get("ARK_API_KEY"), # The base URL for model invocation . base_url="https://ark.cn-beijing.volces.com/api/v3", ) # 请求1 completion = client.chat.completions.create( model="doubao-seed-2-1-pro-260915", messages=[ {"role": "user", "content": "Nice day"}, ], ) print(completion.choices[0].message.content) # 请求2 completion = client.chat.completions.create( model="doubao-seed-2-1-pro-260915", messages=[ {"role": "user", "content": "Hello"}, ], ) print(completion.choices[0].message.content) ``` **选项:Go** ```Go package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/chat" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), // The base URL for model invocation . ) ctx := context.Background() // 第一次请求 req1 := &chat.ChatCompletionRequest{ // Replace with Model ID . Model: "doubao-seed-2-1-pro-260915", Messages: []chat.ChatCompletionRequestMessage{ userMessage("Nice day"), }, } resp1, err := client.CreateChatCompletion(ctx, req1) if err != nil { fmt.Printf("standard chat error: %v\n", err) return } fmt.Println(resp1.Choices[0].Message.Content) // 第二次请求 req2 := &chat.ChatCompletionRequest{ // Replace with Model ID . Model: "doubao-seed-2-1-pro-260915", Messages: []chat.ChatCompletionRequestMessage{ userMessage("Hello"), }, } resp2, err := client.CreateChatCompletion(ctx, req2) if err != nil { fmt.Printf("standard chat error: %v\n", err) return } fmt.Println(resp2.Choices[0].Message.Content) } func userMessage(content string) chat.ChatCompletionRequestMessage { return chat.ChatCompletionRequestMessage{ OneOf: chat.NewChatCompletionRequestUserMessageChatCompletionRequestMessageSum( chat.ChatCompletionRequestUserMessage{ Role: chat.ChatCompletionRequestUserMessageRoleUser, Content: chat.NewOptNilChatCompletionMessageContent(chat.NewStringChatCompletionMessageContent(content)), }, ), } } ``` **选项:Java** ```Java package com.example; import com.volcengine.ark.runtime.models.chat.*; import com.volcengine.ark.runtime.service.ArkService; import java.util.ArrayList; import java.util.List; public class ChatCompletionsExample4 { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); // The base URL for model invocation . ArkService arkService = ArkService.builder().apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); // 第一次请求 final List messages1 = new ArrayList<>(); final ChatCompletionRequestMessage userMessage1 = ChatCompletionRequestUserMessage.builder().role(ChatCompletionRequestMessageType.USER).content(ChatCompletionMessageContent.ofString("今天天气不错?")).build(); messages1.add(userMessage1); ChatCompletionRequest chatCompletionRequest1 = ChatCompletionRequest.builder() .model("doubao-seed-2-1-pro-260915")// Replace with Model ID . .messages(messages1) .build(); arkService.createChatCompletion(chatCompletionRequest1).getChoices().forEach(choice -> System.out.println(choice.getMessage().getContent())); // 第二次请求 final List messages2 = new ArrayList<>(); final ChatCompletionRequestMessage userMessage2 = ChatCompletionRequestUserMessage.builder().role(ChatCompletionRequestMessageType.USER).content(ChatCompletionMessageContent.ofString("你好")).build(); messages2.add(userMessage2); ChatCompletionRequest chatCompletionRequest2 = ChatCompletionRequest.builder() .model("doubao-seed-2-1-pro-260915")// Replace with Model ID . .messages(messages2) .build(); arkService.createChatCompletion(chatCompletionRequest2).getChoices().forEach(choice -> System.out.println(choice.getMessage().getContent())); // shutdown service arkService.shutdownExecutor(); } } ``` ## 设置Base Url 初始化时 `Ark`、`AsyncArk`实例时,默认无需配置`base_url`参数,当需要连接非默认区域的服务端点时使用,示例如下。 **选项:Python** ```Python import os # Install the Ark SDK with: python -m pip install --upgrade arkruntime . from arkruntime import Ark client = Ark( api_key=os.environ.get("ARK_API_KEY"), # Configure the service endpoint for the target region. base_url="https://ark.cn-beijing.volces.com/api/v3", ) ``` **选项:Go** ```Go import ( "os" "github.com/volcengine/ark-runtime-go/arkruntime" ) client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), // Configure the service endpoint for the target region. ) ``` **选项:Java** ```Java import com.volcengine.ark.runtime.service.ArkService; public class CreateArkClientExample { public static void main(String[] args) { String apiKey = System.getenv("ARK_API_KEY"); ArkService service = ArkService.builder() .apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation . .build(); } // do your operation... } ``` --- # 产品更新公告 Source: https://ark.volcengine.com/region:cn-beijing/docs/product-update-announcements 本文介绍了方舟平台的新版本产品功能特性,欢迎体验。 > 模型更新信息请见: > * [模型发布公告](/docs/model-release-announcement) > 历史产品更新公告: > * [产品更新公告 2025](/docs/product-update-announcement-2025) > * [产品更新公告 2024](/docs/product-update-announcement-2024) # 202609 |功能模块 |功能说明 | |---|---| |模型推理 |* 新增[在线推理(低优)](/docs/online-inference-flex)模式,支持通过请求参数 `service_tier=flex` 使用低优资源进行推理。Flex 拥有独立的 TPM 配额与更优惠的价格,适用于时延不敏感的场景;请求在服务端排队重试,可通过 `X-Ark-Max-Wait-Timeout-Ms` 设置服务端超时时间(最长 20 分钟)。 | \ | |* 新增模型级与接入点级 [用量上限](/docs/activation-management),支持按模型或接入点维度设置用量控制。达到上限后,平台将自动暂停对应模型服务或接入点服务。 | |Managed Agents |* 支持项目维度权限管理。 | \ | |* 支持 Dream 异步记忆整理:基于 1 个 MemoryStore 和多个 Session,产出 1 个新的 MemoryStore,自动完成去重、合并与洞察沉淀。 | \ | |* Session 挂载 MemoryStore 时支持只读 / 读写两种模式,开启读写后,Agent 可通过沙箱工具在 Session 运行过程中沉淀记忆。 | \ | |* Session 详情页新增文件资源系统,支持预览、上传文件资源,方便查看资源状态与挂载路径等信息。 | \ | |* 支持豆包工作与 [Managed Agents](/docs/overview) 集成。 | \ | |* 支持通过 Open API 开通 Managed Agents 服务。 | |Coding Plan / Agent Plan |* 新版控制台页面已更新上线,新增实践案例板块,支持查看语言模型的负载情况。 | \ | |* [视觉模型](/docs/agent-plan-personal-model-release) 新增支持 doubao-seedance-2.5、doubao-seedream-5-0-pro。 | \ | |* [语言模型](/docs/agent-plan-personal-model-release) 上线:deepseek-v4.1-flash、kimi-k2-8-preview、doubao-seed-2.1-pro、doubao-seed-2.1-lite。 | \ | |* 个人版 Medium 套餐支持专属 [Harness-Computer Use Agent](/docs/agent-plan-personal-cua#what-is-cua)。 | |API |* Responses API、Messages API 兼容 Web Search 能力,新增 [豆包搜索源](/docs/web-search)。 | \ | |* 支持接入三方工具 Claude Code / Codex 使用 [Web Search](/docs/integrate-third-party-tools#web-search-claude-code)。 | \ | |* Responses API 兼容 [Apply Patch 工具](/docs/apply-patch)。 | \ | |* [API兼容性能力升级](/docs/api-schema-upgrade-notice)。 | |模型精调 |* [精调效果指标](/docs/fine-tuning-overview) 支持多任务对比,便于在同一视图中对比不同任务的训练指标曲线。 | \ | |* 语言模型精调支持在 [训练样本](/docs/fine-tuning-dataset-format) 中传入音频和视频内容。 | |ArkCLI |[ArkCLI](/docs/ark-cli) 支持数据集注册管理能力。 | |体验中心 |* Responses API 支持解析外接 link reader,无需开通云服务,由平台支持联网和非 PDF 解析体验。 | \ | |* [Doubao-Seedance-2.5](https://ark.volcengine.com/region:cn-beijing/experience/gen_video?model=doubao-seedance-2-5-260628) 支持样片生成模式。 | |其他 |* [版权真人库](https://ark.volcengine.com/region:cn-beijing/experience/gen_video?_vtm_=a106466.b106468.0_0.0_0.0.457_7694114874235258419&model=doubao-seedance-2-0-260128) 上线,支持使用艺人人脸创作短剧等视频,并可获取艺人授权函。 | \ | |* [Gallery 功能](https://ark.volcengine.com/region:cn-beijing/gallery) 发布,支持查看 Seedance 优质影视作品及部分开源制作信息。 | # 202608 |功能模块 |功能说明 | |---|---| |体验中心 |* 支持 [Managed Agents](https://console.volcengine.com/ark/region:cn-beijing/experience/ma/agent-20260803131957-vhpgd) 体验 | \ | |* [语音体验中心](https://console.volcengine.com/ark/region:cn-beijing/experience/voice?projectName=default) 升级至新版控制台,支持开通前免费额度体验等能力 | |Managed Agents |* 新增支持 [下载自定义 skill](https://console.volcengine.com/ark/region:cn-beijing/managed-agents/skills) | \ | |* [Credentials 优化](https://console.volcengine.com/ark/region:cn-beijing/managed-agents/credentials-vault):支持自定义 Header 鉴权、自定义 MCP 二次编辑 | \ | |* Environments [新增可复用的 TOS 产物存储配置](/docs/create-environment-api?lang=zh),并支持 Session 级覆盖,让 Agent 产物默认可按环境统一落盘到指定 TOS 目录,同时保持特殊场景的灵活覆盖 | \ | |* 支持用户消息排队机制,让用户在 Agent 忙碌时也能连续发送消息而不再被拒绝,并在运行间隙自动消费排队消息以提升对话连续性和纠偏效率 | \ | |* 新增 [Quickstart 引导流程](https://console.volcengine.com/ark/region:cn-beijing/managed-agents/quickstart),帮助新用户通过模板或自然语言在 3 分钟内完成 Agent 初始化、环境配置、试运行和 API 接入 | \ | |* 支持用户在 Managed Agents 中更方便地 [查看、配置和管理 Skill](https://console.volcengine.com/ark/region:cn-beijing/managed-agents/skills),并可在搭建 Agent 时直接选择和编排可用 Skill | \ | |* 支持用户在 MA 中按需 [配置模型思考模式、推理强度、速度参数](https://console.volcengine.com/ark/region:cn-beijing/managed-agents/agents/create),让 Agent 在搭建和运行时可更灵活地控制模型行为 | |开通管理 |支持 [关闭 Managed Agents 服务](https://console.volcengine.com/ark/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=manageAgent) | |Coding plan / Agent plan |* 新增 [跨服务授权能力](https://console.volcengine.com/ark/region:cn-beijing/subscription/agent-plan-enterprise) 并优化企业版用户组方案,新增预设角色、权限入口和分层用户组配置 | \ | |* Agent / Coding Plan [创建](/docs/create-personal-plan-api?lang=zh) 和 [续费](/docs/renew-personal-plan-api?lang=zh) 接口新增 `AgreementAccepted` 字段 | |API |* 支持通过 Files API 下载 Managed Agents [session 产物](/docs/search-files-api?lang=zh) 文件 | \ | |* [错误码](/docs/error-codes?lang=zh) 优化:Managed Agents 的错误按下发通道,区分 HTTP 阶段错误码、SSE 阶段错误码 | \ | |* 新增 [session 查询](/docs/get-session-api?lang=zh) 接口返回子 agent 配置快照 | \ | |* Chat / Responses API 支持 [reasoning_effort 参数兼容](/docs/deep-thinking?lang=zh#fc5eac89),超出当前模型或 API 支持范围的取值可按兼容逻辑处理 | # 202607 |功能模块 |功能说明 | |---|---| |体验中心 |* 新增 [Doubao-音频生成-1.0](https://ark.volcengine.com/region:cn-beijing/experience/voice?model=doubao-seed-audio-1-0) 体验,支持时间戳和多语种能力 | \ | |* 支持 [Doubao-Seed-Evolving](https://ark.volcengine.com/region:cn-beijing/model/detail?name=doubao-seed-evolving) 模型 1M 超长上下文,提升长程任务处理能力与 Token 使用效率 | |模型推理 |新增 [Doubao-Seed-2-1-turbo](/docs/online-inference-low-latency) 系列在线推理(低延迟)能力 | |模型精调 |* 新增 [plugin 的 min/max replicas 配置](/docs/fine-tuning-sdk),用于保障实例常驻、降低 FaaS 冷启动风险的同时,约束扩容上限以确保资源使用可控 | \ | |* 更新 [FaaS 服务拉起](/docs/fine-tuning-sdk) 时机,任务创建完成即拉起 FaaS 服务 | \ | |* [Seed-2.0 系列](/docs/fine-tuning-overview) 语言模型 SFT 支持音频、视频输入,拓展多模态内容理解场景 | |Managed Agent |* 新增 [Managed Agents](/docs/build-triage-agent-with-continuous-session) 产品演示案例集 | \ | |* 支持 [Environment](/docs/configure-cloud-environment) 配置自定义脚本 | \ | |* 新增 Agent thinking 与 message 流式输出能力 | \ | |* 支持 Session 创建时对 Agent、Environment 配置进行 override 覆盖 | \ | |* 支持 Credentials 通过环境变量 ENV 注入,包含托管凭证与换签场景 | \ | |* 支持 [自定义 skill](/docs/skills) | |Coding plan / Agent plan |* 上线 [Doubao-Seed-2.1-turbo](/docs/agent-plan-personal-plan-overview) 模型 | \ | |* 上线 [Doubao-Seed-Evolving](/docs/agent-plan-personal-plan-overview) 模型 | \ | |* Agent Plan Medium 及以上档位套餐上线 [Kimi K3](/docs/agent-plan-personal-plan-overview) 模型 | \ | |* Agent Plan 上线 Harness 能力 [“Agent 进化”](/docs/agent-plan-personal-evolve) | |API |* 新增模型激活 API,包括 [批量开通基础模型](/docs/activate-models-api?lang=zh)、[启用自动开通新模型](/docs/enable-auto-model-activation-api?lang=zh)、[关闭自动开通新模型](/docs/disable-auto-model-activation-api?lang=zh)、[查询模型开通详情](/docs/get-model-activation-api?lang=zh)、[查询模型开通列表](/docs/list-model-activations-api?lang=zh) | \ | |* 上线官方 [产物验证](/docs/get-ark-official-result-api?lang=zh) 接口 | |版权商业化 |新增周星驰《功夫女足》[版权资源](https://ark.volcengine.com/region:cn-beijing/experience/gen_video?model=doubao-seedance-2-0-260128) | # 202606 |功能模块 |功能说明 | |---|---| |体验中心 |* 支持 [Doubao-Seed-2.1 系列模型](https://ark.volcengine.com/region:cn-beijing/experience/gen_chat?model=doubao-seed-2-1-pro-260628) | \ | |* 全新 [Canvas 能力升级](https://ark.volcengine.com/region:cn-beijing/experience) | \ | |* 新增 [Doubao-音频生成-1.0](https://ark.volcengine.com/region:cn-beijing/experience/voice?model=doubao-seed-audio-1-0) | |Agent Plan / Coding Plan |* 新增 [Agent plan](/docs/agent-plan-personal-get-started) 开通模型和 Harness 超额后付费 | \ | |* 新增 [创建个人版套餐](/docs/create-personal-plan-api)、[续费个人版套餐](/docs/renew-personal-plan-api)、[查询个人版套餐](/docs/get-personal-plan-api)、[查询 Agent Plan 支持的模型列表](/docs/list-ark-agent-plan-model-api)、[轮换个人版 API Key](/docs/regenerate-personal-api-key-api)、[查询 Coding Plan 支持的模型列表](/docs/list-ark-coding-plan-model-api) 等 API | |API |* 新增 [Embedding API](/docs/multimodal-vectorization-api) 通过 `multi_embedding` 开启 multi-vector 输出及压缩传输,并为视频输入开放可配置抽帧参数,以提升细粒度检索效果与长视频处理可控性 | \ | |* 新增 [Doubao-Seedance-2.0](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-seedance-2-0) 支持 4K 分辨率 | # 202605 |功能模块 |功能说明 | |---|---| |体验中心 |* 支持 [vaka 知识助手](https://docs.volcengine.com/docs/85296/2484446?lang=zh) | \ | |* [Doubao-Seed3D-2.0](/docs/3d-generation) 模型新增 obj/usd/usdz 格式 | \ | |* 新增[音频理解](/docs/audio-understanding)功能,支持 Doubao-Seed-2.0-lite、Doubao-Seed-2.0-mini 模型 | \ | |* [Doubao-Seedream-5.0-lite](/docs/seedream-4-0-5-0#9278b81b) 支持 4K 分辨率 | |模型部署 |在线推理新增 [低延迟模式](/docs/online-inference-low-latency),支持 Doubao-Seed-2.0 系列模型 | |用量统计 |新增用量明细 [查询](/docs/get-record-export-task-api?lang=zh) 与 [导出](/docs/create-record-export-task-api?lang=zh) 能力 | |API |* [Contents Generations API](/docs/create-video-generation-task-api) 新增 priority 字段,支持请求级别设置同推理接入点下的任务优先级 | \ | |* [Seedance 2.0](/docs/create-video-generation-task-api) 系列模型输入图片格式新增支持 heic、heif 格式 | |Agent Plan/Coding Plan |* 发布 Agent Plan API,支持通过 API [创建个人版套餐](/docs/create-personal-plan-api),[获取套餐 AFP 额度](/docs/get-afp-usage-api),[获取套餐用量详情](/docs/get-usage-details-api) | \ | |* 全新上线 [Agent Plan](/docs/agent-plan-personal-plan-overview),支持全模态模型及专属 Harness,并采用精细化积分计费模式 | \ | |* 支持 [DeepSeek-V4](/docs/agent-plan-personal-plan-overview#3d801f5f) 系列模型 | \ | |* 新增专属 [权益](/docs/agent-plan-personal-arkclaw):购买 Agent Plan Medium 及以上套餐赠送 Arkclaw 轻量版 | \ | |* 支持 [Responses API](/docs/agent-plan-personal-codex) | \ | |* 支持接入最新版 [Codex CLI](/docs/agent-plan-personal-codex) | # 202604 |功能模块 |功能说明 |文档/链接 | |---|---|---| |体验中心 |* Doubao-Seedance-2.0 模型支持 1080p |[体验中心](https://ark.volcengine.com/region:cn-beijing/experience) | \ | |* 支持 Doubao-Seed3D-2.0 模型 | | |模型推理 |* 自定义推理接入点详情页可查看 thinking 参数默认值并支持修改,当 API 调用显式传入 thinking.type、reasoning_effort 中任意一个时,以 API 请求传入值为准 |[在线推理](https://ark.volcengine.com/region:cn-beijing/endpoint) | \ | |* 切换模型版本时,切换前后保持默认思考模式配置 | | \ | |* Doubao-Seedance-2.0 支持使用本账号下近 30 天内由 Doubao-Seedance-2.0 及 Doubao-Seedance-2.0-fast 生成的含人脸视频、Doubao-Seedance-2.0 及 Doubao-Seedance-2.0-fast 生成的含人脸视频对应的尾帧图片、Doubao-Seedream-5.0-lite 文生图得到的含人脸图片模型的含人脸原始产物,作为输入素材,再次调用 Doubao-Seedance-2.0 系列模型进行二次创作 | | |模型精调 |* 支持通过 **runtime.max_concurrency** 参数设置 plugin 函数实例最大请求并发数 |[模型精调](https://ark.volcengine.com/region:cn-beijing/finetune) | \ | | | | |Token 计算器 |* 支持 Doubao-Seedance-2.0、Doubao-Seedance-2.0-fast |[token计算器](https://ark.volcengine.com/region:cn-beijing/tokenCalculator) | \ | | | | |开通管理 |* 新增开通模型低延迟模式按钮,使用低延迟模式需先在开通管理中开通低延迟模式 |[开通管理](https://ark.volcengine.com/region:cn-beijing/openManagement) | \ | | | | |API Key 管理 |* 支持按照 API Key 维度查看分账账单 |[用量统计](/docs/usage-statistics) | \ | | | | |API |* Chat API 按 token 付费支持低延迟模式,支持模型为doubao-seed-2.0-pro、doubao-seed-2.0-lite |[对话(Chat) API](/docs/chat-api) | \ | |* Image Generation API输入图大小限制从10MB扩大到 **30MB** |[图片生成 API](/docs/image-generation-api) | |Agent Plan |* Agent Plan 支持 Doubao-Seedream-5.0 & Doubao-Seedance-2.0 |[套餐概览](/docs/agent-plan-personal-plan-overview#6e51df70) | \ | | | | # 202603 |功能模块 |功能说明 |文档/链接 | |---|---|---| |模型推理 |* 切换模型支持配置消息通知服务(SNS)获取切换进度 |[在线推理](https://ark.volcengine.com/region:cn-beijing/endpoint) | \ | | | | |模型精调 |* 支持在训练任务详情页前往全栈可观测平台配置训练任务状态通知 |[模型精调](https://ark.volcengine.com/region:cn-beijing/finetune) | \ | |* plugin 支持python 3.11/3.12 | | \ | |* 增加预估 step 展示,并对异常 step 状态进行提醒 | | |Coding Plan |* doubao-embedding-vision-251215 模型支持 coding plan |[记忆增强-Embedding模型](/docs/coding-plan-personal-embedding-memory) | \ | | | | |API |* Responses API Prefill 模式支持上下文缓存 |[Prefill 模式](/docs/responses-api-text-generation#c0a46722) | \ | | | | # 202602 |功能模块 |功能说明 |文档/链接 | |---|---|---| |体验中心 |* 支持Doubao-Seedance-2.0、Doubao-Seedream-5.0 体验 |[体验中心](https://ark.volcengine.com/region:cn-beijing/experience) | \ | |* Doubao-seed-2.0-Pro/Lite/Mini 模型支持长视频理解和视觉定位 | | |模型推理 |* 视频生成模型支持通过 VMP 配置监控告警 |[模型推理](/docs/manage-inference-endpoints#eacd8456) | \ | | | | |API |* Doubao-seed-2.0-Pro/Lite/Mini 模型错误码变更:当用户请求平台过快时,Error Code将从`ServerOverloaded`,变更为 `RequestBurstTooFast`。后续模型也将遵从此规则 |[API](/docs/api-key) | \ | |* Doubao-seed-2.0-Pro/Lite/Mini 模型图像/视频理解升级 | | \ | |* 视觉模型增加安全审核错误码 | | |应用实验室 |* 长视频理解应用升级到 Doubao-Seed-2.0 |[应用实验室](https://ark.volcengine.com/region:cn-beijing/application) | \ | | | | # 202601 |功能模块 |功能说明 |文档/链接 | |---|---|---| |体验中心 |* 语音模型-实时语音模型 Doubao-Realtime-O 版本支持辩论模式,唱歌能力 |[体验中心](https://ark.volcengine.com/region:cn-beijing/experience) | \ | |* Seedream 4.0 故事书支持下载 | | |API |* Doubao-Seedance-1.5-pro 模型支持1080p |[Video Generation API](/docs/create-video-generation-task-api) | \ | |* Doubao-Seedance-1.5-pro 模型支持 Draft 样片模式 | | |Coding Plan |* Coding Plan 升级支持auto模式、支持多模型 |[Coding Plan](/docs/coding-plan-personal-plan-overview) | \ | | | | --- # 模型发布公告 Source: https://ark.volcengine.com/region:cn-beijing/docs/model-release-announcement 本文介绍了火山方舟大模型服务平台的新模型发布记录与特性,欢迎体验。 > 产品功能更新公告请见: > * [产品更新公告](/docs/product-update-announcements) > 历史模型发布公告 : > * [模型发布公告 2025](/docs/model-release-announcement-2025) > * [模型发布公告 2024](/docs/model-release-announcement-2024) # 202610 |**提供方** |**模型 ID** |**模型类型** |**版本说明** |**其它说明** | |---|---|---|---|---| |深度求索 |deepseek-v4-1-flash-261017 |深度思考模型 |新发布 |DeepSeek-V4.1-Flash 新版本,通过基于自反馈的强化学习训练,进一步提升复杂编程及完整项目开发能力,在游戏开发、3D 建模等“许愿式编程”场景表现更优;同时缩短任务运行时间与输出长度,实现效果、速度和成本的综合提升。模型信息参见 [DeepSeek-V4.1-Flash(升级 1017)](/docs/deepseek-v4-1-flash)。 | |深度求索 |deepseek-v4-1-flash-economy-261017 |深度思考模型 |新发布 |DeepSeek-V4.1-Flash 经济版与标准版采用完全相同的模型权重,能力与效果完全一致。经济版价格更低,回答生成速度略慢,适合注重成本、对生成速度要求不高的场景。模型信息参见 [DeepSeek-V4.1-Flash(升级 1017)](/docs/deepseek-v4-1-flash)。 | # 202609 |**提供方** |**模型 ID** |**模型类型** |**版本说明** |**其它说明** | |---|---|---|---|---| |字节跳动 |doubao-seed-2-1-lite-260915 |深度思考模型 |新发布 |新一代全模态大模型,原生支持文本、视觉、音频统一理解,具备 1M 超长上下文窗口,多模态综合能力优秀、在 Coding 与 Agent 场景下任务完成能力提升显著。调用指南请参考[深度思考](/docs/deep-thinking)。 | |字节跳动 |doubao-seed-2-1-pro-260915 |深度思考模型 |新发布 |迈向生产级智能的新一代大模型,全面升级 Coding、Agent 与多模态能力,以更强的自主规划、长链路执行和动态修复能力,胜任企业真实复杂任务。调用指南请参考[深度思考](/docs/deep-thinking)。 | |深度求索 |deepseek-v4-1-flash-260910 |深度思考模型 |新发布 |DeepSeek-V4.1-Flash 是 DeepSeek 全新 CED 架构的首发模型。552B 总参数,每 token 仅激活 8-16B(输入 8B / 输出 16B),并具备原生多模态视觉理解能力。KV Cache 压缩至上一代 HBM 的 1/4、SSD 的 1/8,显著降低长上下文与 Agent 任务成本。模型信息参见 [DeepSeek-V4.1-Flash(升级 1017)](/docs/deepseek-v4-1-flash)。 | |智谱 |glm-5-3-flash-260828 |深度思考模型 |新发布 |GLM-5.3-Flash 是 GLM-5 系列首个原生多模态模型,以极致低成本架构实现超越 GLM-5.2 的更强智能。GLM-5.3-Flash 是首个采用稀疏注意力与线性注意力混合架构的开源前沿模型。在保持精准长上下文能力的同时,显著降低计算与服务成本。Coding 视觉能力被原生融入 Coding 循环,使模型能够主动观察界面、渲染结果与交互反馈,并据此持续测试和改进。并且进一步拓展至 Office、金融研究和专业文档等工作场景。调用指南请参考[深度思考](/docs/deep-thinking)。 | |字节跳动 |doubao-seed-evolving |深度思考模型 |更新 |Seed-Evolving 版本更新:Agent 长程任务执行与异步子任务验收更可靠,多模态理解与处理效率提升,深度调研和工具执行的可信度增强,Office 办公跨应用协同及 Coding 工程实践能力进一步提升。版本升级自动生效,通过统一 Model ID `doubao-seed-evolving` 调用即可获取最新版本的模型服务。模型详情请参考[Seed-Evolving](/docs/latest-model)。 | |字节跳动 |doubao-seedream-5-0-flash-260915 |图片生成模型 |新发布 |面向高精度图片生成场景,能力与 Seedream 5.0 pro 完全一致,支持交互编辑、图层拆分、原生多语种生成等特色能力;Seedream 5.0 flash 生图速度更快、价格更低,适合对时延和成本敏感的业务场景。调用指南请参考[Doubao Seedream 5.0 pro / flash 教程](/docs/seedream-5-0-pro)。 | # 202608 |**提供方** |**模型 ID** |**模型类型** |**版本说明** |**其它说明** | |---|---|---|---|---| |字节跳动 |doubao-seed-evolving |深度思考模型 |更新 |Seed-Evolving 版本更新:进一步强化从需求理解、信息检索到工具执行和结果输出的完整 Agent 任务链路;通用 Agent 与 Coding、深度搜索与真实性、工具调用与复杂任务、视觉理解与长程规划能力持续增强,在真实开发、深度调研、流程自动化与多模态任务中表现更稳定,输出内容更真实可靠。版本升级自动生效,通过统一 Model ID `doubao-seed-evolving` 调用即可获取最新版本的模型服务。调用指南请参考[深度思考](/docs/deep-thinking)。 | |深度求索 |deepseek-v4-pro-ga-260813 |深度思考模型 |新发布 |高效通用模型,Agent 能力大幅增强,在代码修改、工具调用、多步骤任务执行等场景表现更优,支持思考与非思考双模式及百万 Token 上下文。调用指南请参考[深度思考](/docs/deep-thinking)。 | |深度求索 |deepseek-v4-flash-ga-260731 |深度思考模型 |新发布 |旗舰混合推理模型,支持自适应深度思考与通用对话双模式,较前代模型推理精度与响应速度显著提升。经多维度后训练优化,代码生成、数学推理及智能体工具调用任务表现进一步提升。调用指南请参考[深度思考](/docs/deep-thinking)。 | |字节跳动 |doubao-seed-evolving |深度思考模型 |更新 |Seed-Evolving 版本更新:通用综合能力全面提升,复杂代码任务、长程 Agent 执行表现优化,搜索与工具调用可靠性增强;显著改善搜索幻觉、工具调用幻觉、状态幻觉等问题,更好支撑真实开发、深度调研与自动化工作流等复杂场景。版本升级自动生效,通过统一 Model ID `doubao-seed-evolving` 调用即可获取最新版本的模型服务。调用指南请参考[深度思考](/docs/deep-thinking)。 | # 202607 |**提供方** |**模型 ID** |**模型类型** |**版本说明** |**其它说明** | |---|---|---|---|---| |字节跳动 |doubao-seed-evolving |深度思考模型 |更新 |Seed-Evolving 版本更新:支持 1M 超长上下文,长程任务稳定性增强;tokens 消耗更少,工具调用更简洁,整体效率提升。版本升级自动生效,通过统一 Model ID `doubao-seed-evolving` 调用即可获取最新版本的模型服务。调用指南请参考[深度思考](/docs/deep-thinking)。 | |智谱 |glm-5-2-260617 |深度思考模型 |新发布 |面向长程自主编码场景的旗舰开源模型,全面强化了大型代码库工程、长程任务规划与工具协同能力,在多个榜单上斩获开源第一,整体表现对齐海外闭源 SOTA 模型,开发场景的成功率进一步提升。它支持真正可用的 1M 上下文,可一次性承载项目级工程,且在执行复杂智能体任务时,指令遵循与工具调用更加稳定,一次任务即可贯通需求到多端可部署产物的完整开发链路。调用指南请参考[深度思考](/docs/deep-thinking)。 | # 202606 |**提供方** |**模型 ID** |**模型类型** |**版本说明** |**其它说明** | |---|---|---|---|---| |字节跳动 |doubao-seed-evolving |深度思考模型 |新发布 |面向 Agent 与 Coding 场景设计的 Seed 系列模型,具备复杂任务编排、长程规划、代码生成与工具调用等核心能力。模型采用动态迭代机制,每周至少发布一个版本更新,模型能力持续演进。可通过统一 Model ID `doubao-seed-evolving` 调用,始终获取最新版本的模型服务。调用指南请参考[深度思考](/docs/deep-thinking)。 | |字节跳动 |doubao-seed-2-1-pro-260628 |深度思考模型 |新发布 |面向 Coding 与 Agent 时代打造的新一代旗舰模型,在 Coding 工程交付、Agent 长链路任务执行与多模态理解三大方向全面升级,具备更强的需求理解、长期规划与持续修复能力。适用于复杂 Coding、长链路 Agent、多步骤工程交付等高复杂度任务探索及高价值生产场景。调用指南请参考[深度思考](/docs/deep-thinking)。 | |字节跳动 |doubao-seed-2-1-turbo-260628 |深度思考模型 |新发布 |面向规模化生产场景的低成本、低时延版本,功能齐备,效果比肩 `doubao-seed-2-1-pro`。适用于需要稳定承接大量线上调用的 Coding、Agent 与多模态理解任务,以及成本、吞吐与批量调用优先的企业级部署场景。调用指南请参考[深度思考](/docs/deep-thinking)。 | |字节跳动 |doubao-seed-character-260628 |角色模型 |新发布 |面向泛娱乐场景全面升级,角色扮演的剧情推理、对话节奏与情感递进能力显著增强,并新增 Human-like 自然聊天、thinking 与 VLM 多模态理解(视频/图片/表情包)能力,可主动激活对话并贴合语境回复。同时增强格式遵循与 function call/tool use 调用,覆盖更多泛娱乐场景,并支持透明缓存,进一步降本增效。调用指南请参考[文本生成](/docs/text-generation)。 | |字节跳动 |doubao-seedance-2-5-260628 |视频生成模型 |新发布 |新一代视频创作模型,在长叙事能力、全模态参考能力和编辑能力上全面提升。单次生成时长提升至 30 秒并支持多轮延长,单次参考多模态素材上限提升至 50 个,提供基于时间戳的精准编辑控制。调用指南请参考[Doubao Seedance 2.5 教程](/docs/seedance-2-5)。 | |字节跳动 |doubao-seedream-5-0-pro-260628 |图片生成模型 |新发布 |面向高精度图片生成场景,提供更精准的位置与元素控制能力。支持文生图、单张/多张参考图生图,以及通过交互编辑实现精准坐标定位和任意标记编辑,并新增支持 14 种语言的原生文字生成能力。调用指南请参考[Doubao Seedream 5.0 pro / flash 教程](/docs/seedream-5-0-pro)。 | # 202605 |**提供方** |**模型 ID** |**模型类型** |**版本说明** |**其它说明** | |---|---|---|---|---| |深度求索 |deepseek-v4-pro-260425 |深度思考模型 |新发布 |面向复杂 Agent 场景与企业级 Agentic Coding 工作流,原生支持100万超长上下文,具备突出的 Agentic Coding、数学推理、科学推理和代码推理能力,并完成多款主流开源 Agent 的适配优化,可支持从代码理解到复杂工程交付的全链路任务。同时,模型具备领先的世界知识与长文理解能力,适用于高阶科研、复杂办公和深度研究分析等高知识密度场景。调用指南请参考[深度思考](/docs/deep-thinking)。 | |深度求索 |deepseek-v4-flash-260425 |深度思考模型 |新发布 |面向高并发、低成本 Agent 场景,原生支持100万超长上下文,以更低成本提供接近旗舰模型的核心能力。在简单 Agent 任务上,模型与 DeepSeek-V4-Pro 表现接近,可覆盖大多数日常智能体与生产力场景;同时具备更快的响应速度和稳定的长文处理能力,适用于对成本和吞吐要求较高的企业级部署场景。调用指南请参考[深度思考](/docs/deep-thinking)。 | # 202604 |**提供方** |**模型 ID** |**模型类型** |**版本说明** |**其它说明** | |---|---|---|---|---| |字节跳动 |doubao-seed-2-0-lite-260428 |深度思考模型 |新发布 |面向企业规模化部署的轻量级全模态模型,支持文本、图片、语音、视频四模态跨模态联合理解。集成音画协同分析、长视频时序检索、全维度音频解析、代码开发、智能Agent与GUI闭环操作能力,适配大批量全模态推理业务场景。调用指南请参考[文本生成](/docs/text-generation)。 | |字节跳动 |doubao-seed-2-0-mini-260428 |深度思考模型 |新发布 |轻量均衡型全模态模型,支持文本、图片、语音、视频四模态理解与跨模态推理。精简推理链路以提升响应效率和运行稳定性,强化多语种及小语种处理能力,适用于通用轻量化多模态解析场景。调用指南请参考[文本生成](/docs/text-generation)。 | |字节跳动 |doubao-seedance-2-0-fast-260128 |视频生成模型 |更新 |全量发布,个人/企业购买资源包或者账户余额大于200元,均可使用。调用指南请参考[Doubao Seedance 2.0 系列教程](/docs/seedance-2-0)。 | |字节跳动 |doubao-seedance-2-0-260128 |视频生成模型 |更新 |全量发布,个人/企业购买资源包或者账户余额大于200元,均可使用。调用指南请参考[Doubao Seedance 2.0 系列教程](/docs/seedance-2-0)。 | |字节跳动 |doubao-seed-character-251128 |角色模型 |新发布 |面向角色扮演与故事叙事场景定向优化,新增长旁白故事能力,优化多人剧情互动,加强安全尺度,提升虚拟陪伴对话体验与输出可控性。调用指南请参考[文本生成](/docs/text-generation)。 | |字节跳动 |doubao-seed3d-2-0-260328 |3D生成 |新发布 |相比 1.0 版本提升了产物生成质量,达到易雕刻、可仿真、可商用的水准。调用指南请参见[3D 生成](/docs/3d-generation)。 | |影眸 |hyper3d-gen2-260112 |3D生成 |新发布 |具备高精度的 3D 资产生成能力,自带完整 PBR 材质与 4K 纹理,几何锐利、材质真实,支持复杂模型自动拆件为可编辑零部件。调用指南请参见 [影眸 API](/docs/shadoweye-create-3d-generation-task-api) | |数美万物 |hitem3d-2-0-251223 |3D生成 |新发布 |支持最高 1536³ 超高分辨率建模,精确还原浮雕纹理、微小结构和复杂曲面;完整 PBR 材质一步直出,颜色、法线、金属度、粗糙度随模型同步生成。调用指南请参见 [数美 API](/docs/shumei-create-3d-generation-task-api) | # 202602 |**提供方** |**模型 ID** |**模型类型** |**版本说明** |**其它说明** | |---|---|---|---|---| |字节跳动 |doubao-seed-2-0-pro-260215 |深度思考模型 |新发布 |旗舰级全能通用模型,面向 Agent 时代 的复杂推理与长链路任务执行场景。调用指南请参考[文本生成](/docs/text-generation)。 | |字节跳动 |doubao-seed-2-0-lite-260215 |深度思考模型 |新发布 |面向高频企业场景兼顾性能与成本的均衡型模型,综合能力超越上一代 Doubao-Seed-1.8。调用指南请参考[文本生成](/docs/text-generation)。 | |字节跳动 |doubao-seed-2-0-mini-260215 |深度思考模型 |新发布 |面向低时延、高并发与成本敏感场景,强调快速响应与灵活推理部署。调用指南请参考[文本生成](/docs/text-generation)。 | |字节跳动 |doubao-seed-2-0-code-preview-260215 |编程模型 |新发布 |面向企业级编程需求优化,在 doubao-seed-2.0 优秀的 Agent、视觉理解能力基础上,特别增强了代码能力,不仅前端能力表现出众,也对企业常见的多语言编码需求做了特别优化,适合接入各种 AI 编程工具使用。调用指南请参考[文本生成](/docs/text-generation)。 | # 202601 |**提供方** |**模型 ID** |**模型类型** |**版本说明** |**其它说明** | |---|---|---|---|---| |智谱 |glm-4-7-251222 |深度思考模型 |新发布 |面向 Agentic Coding 场景强化了编码能力、长程任务规划与工具协同。调用指南请参考[文本生成](/docs/text-generation)。 | --- # 模型下线公告 Source: https://ark.volcengine.com/region:cn-beijing/docs/model-deprecation-notice 随着火山方舟平台模型的升级、发布,新版本模型在效果、推理时延等各方面将远超较旧版本的模型。因此,我们将逐步下线这些旧版本模型。当某个模型确定下线计划时,我们会通过短信、站内信等方式发布通知,请及时关注。 > 历史模型下线公告: > * [模型下线公告 2025](/docs/model-deprecation-announcement-2025) > * [模型下线公告 2024](/docs/model-deprecation-announcement-2024) # 第十批模型下线说明 ## 下线计划 |节点 |时间 |动作&影响 | |---|---|---| |**启动&通知** |2026-9-22 10:00:00(UTC+8) |方舟逐步下调模型配额。 | |**EOM** |2026-9-24 10:00:00(UTC+8) |用户无法新增接入点等,详细说明见[1.模型停止新购(EOM)](/docs/model-deprecation-notice#9665a999)。 | \ |模型停止新购 | |> 建议提前切换至对应的替换模型,并测试验证新模型对业务的影响。 | |**EOS** |**2026-11-24 14:00**(UTC+8) |模型正式下线,残留接入点将自动替换为新模型或直接关停(详见下方模型列表),详细说明[2.模型下线 (EOS)](/docs/model-deprecation-notice#b933be49)。 | \ |模型服务下线 |:::warning | | \ | | **doubao-seed-2-0-lite-260215 及 doubao-seed-2-0-mini-260215** 模型的 EOS 时间:**2026-10-22 14:00**(UTC+8)。到期未迁移,系统会自动迁移到下方表格中给到的建议迁移模型或直接关停。建议提前测试验证新模型对业务的影响。 | | \ | | ::: | | | ## 下线模型 > **注意** > > * 不同模型/版本支持的能力、API 参数、单价、任务中实际表现存在差异,迁移前请务必仔细阅读模型介绍,并进行必要评测,比较迁移前后模型的表现。 > * embedding 模型迁移需要先对存量的知识库进行重建,再进行迁移操作。不同于其他基础模型,embedding 模型仅有EOM阶段,不涉及EOS阶段。即待下线的embedding 模型会在「EOM时间」停止新增接入点,但不影响存量服务的正常使用。 > * 生图生视频模型不会自动迁移到新模型。请提前使用新模型进行接入点进行使用,避免影响业务。 |**模型 ID** |**建议迁移模型** |**到期未迁移,系统替换模型** | \ | |> 推荐迁移最新版本模型,下表随模型迭代动态更新 | | |---|---|---| |doubao-seed-2-0-lite-260215 |doubao-seed-2-1-lite-260915 |doubao-seed-2-0-lite-260428 | |doubao-seed-2-0-mini-260215 |doubao-seed-2-0-mini-260428 |doubao-seed-2-0-mini-260428 | |doubao-seed-2-0-pro-260215 |doubao-seed-2-1-lite-260915 |具体替换模型在服务下线前确定并更新 | |doubao-embedding-vision-250615 |doubao-embedding-vision-251215 |不强制切换 | |doubao-seedance-1-0-pro-250528 |doubao-seedance-2-0-mini-260615 |关停 | \ | | | | \ | | |建议提前切换至对应的替换模型,并测试验证新模型对业务的影响。 | \ | | | | |doubao-seedance-1-0-pro-fast-251015 |doubao-seedance-2-0-mini-260615 |关停 | \ | | | | \ | | |建议提前切换至对应的替换模型,并测试验证新模型对业务的影响。 | \ | | | | |doubao-seed-2-0-code-preview-260215 |doubao-seed-evolving |具体替换模型在服务下线前确定并更新 | |doubao-seedream-4-0-250828 |doubao-seedream-4-0-20260415 |具体替换模型在服务下线前确定并更新 | |doubao-seedream-4-5-251128 |doubao-seedream-5-0-pro-260628 |关停 | \ | | | | \ | | |建议提前切换至对应的替换模型,并测试验证新模型对业务的影响。 | \ | | | | |doubao-seedream-5-0-lite-260128 / doubao-seedream-5-0-260128 |doubao-seedream-5-0-pro-260628 |关停 | \ | | | | \ | | |建议提前切换至对应的替换模型,并测试验证新模型对业务的影响。 | \ | | | | |glm-5-1-260428 |doubao-seed-evolving |具体替换模型在服务下线前确定并更新 | |deepseek-v4-pro-260425 |deepseek-v4-1-flash-260910 |具体替换模型在服务下线前确定并更新 | # 第九批模型下线说明 ## 下线计划 |节点 |时间 |动作&影响 | |---|---|---| |**启动&通知** |2026-7-3 10:00:00(UTC+8) |方舟逐步下调模型配额。 | |**EOM** |2026-7-10 10:00:00(UTC+8) |用户无法新增接入点等,详细说明见[1.模型停止新购(EOM)](/docs/model-deprecation-notice#9665a999)。 | \ |模型停止新购 | |> 建议提前切换至对应的替换模型,并测试验证新模型对业务的影响。 | |**EOS** |**2026-09-21 14:00**(UTC+8) |模型正式下线,残留接入点将自动替换为新模型或直接关停(详见下方模型列表),详细说明[2.模型下线 (EOS)](/docs/model-deprecation-notice#b933be49)。 | \ |模型服务下线 |:::warning | | \ | | **deepseek-v3-2-251201** 模型的 EOS 时间:**2026-07-30 14:00**(UTC+8)。到期未迁移,系统会自动迁移到下方表格中给到的建议迁移模型或直接关停。建议提前测试验证新模型对业务的影响。 | | \ | | ::: | | | ## 下线模型 > **注意** > > * 若业务使用了 **Bot API** 或 **Context API**,请先按文档进行改造迁移至 **Responses API**,否则模型下线后会出现调用报错。表格中已对支持 **Bot API**、**Context API** 的模型进行标注,迁移教程参见[迁移至 Responses API](/docs/responses-api-migration)。 > * 不同模型/版本支持的能力、API 参数、单价、任务中实际表现存在差异,迁移前请务必仔细阅读模型介绍,并进行必要评测,比较迁移前后模型的表现。 |**模型 ID** |**建议迁移模型** |**到期未迁移,系统替换模型** | \ | |> 推荐迁移最新版本模型,下表随模型迭代动态更新 | | |---|---|---| |kimi-k2-5-260127 |doubao-seed-evolving |doubao-seed-evolving | |glm-4-7-251222 |glm-5-2-260617 |doubao-seed-evolving | |deepseek-v4-flash-260425 |deepseek-v4-flash-ga-260731 |deepseek-v4-flash-ga-260731 | |deepseek-v3-2-251201 `支持 Bot API` | deepseek-v4-flash-ga-260731 |deepseek-v4-flash-ga-260731 | |doubao-seed-code-preview-251028 |doubao-seed-evolving |doubao-seed-evolving | |doubao-seed-1-8-251228 |doubao-seed-2-0-lite-260428 |doubao-seed-2-0-lite-260428 | |doubao-seed-1-6-vision-250815 |doubao-seed-2-0-lite-260428 |doubao-seed-2-0-lite-260428 | |doubao-seed-1-6-250615 |doubao-seed-2-0-lite-260428 |doubao-seed-2-0-lite-260428 | |doubao-seed-1-6-251015 |doubao-seed-2-0-lite-260428 |doubao-seed-2-0-lite-260428 | |doubao-seed-1-6-flash-250828 |doubao-seed-2-0-mini-260428 |doubao-seed-2-0-mini-260428 | |doubao-seed-1-6-flash-250615 |doubao-seed-2-0-mini-260428 |doubao-seed-2-0-mini-260428 | |doubao-1-5-lite-32k-250115 `支持 Bot API, Context API` |doubao-seed-2-0-mini-260428 |doubao-seed-2-0-mini-260428 | |doubao-1-5-vision-pro-32k-250115 `支持 Bot API` |doubao-seed-2-0-lite-260428 |doubao-seed-2-0-lite-260428 | |doubao-1-5-pro-32k-250115 `支持 Bot API, Context API` |doubao-seed-2-0-lite-260428 |doubao-seed-2-0-lite-260428 | |doubao-1-5-pro-32k-character-250715 `支持 Bot API, Context API` |doubao-seed-character-260628 |doubao-seed-character-260628 | |doubao-seedance-1-5-pro-251215 |doubao-seedance-2-0-mini-260615 |关停 | \ |:::warning | | | \ | **doubao-seedance-1-5-pro-251215** 模型到 2026-09-21 14:00(UTC+8)后**会直接关停**,不会自动迁移到新模型。请提前切换模型,避免影响业务。 | | | \ | ::: | | | # 第八批模型下线说明 ## 下线计划 |节点 |时间 |动作&影响 | |---|---|---| |**启动&通知** |2026-4-3 10:00:00(UTC+8) |方舟逐步下调模型配额。 | |**EOM** |2026-4-9 10:00:00(UTC+8) |用户无法新增接入点等,详细说明见[1.模型停止新购(EOM)](/docs/model-deprecation-notice#9665a999)。 | \ |模型停止新购 | |> 建议提前切换至对应的替换模型,并测试验证新模型对业务的影响。 | |**EOS** |**2026-05-11 14:00**(UTC+8) |模型正式下线并残留接入点自动替换为新模型,详细说明[2.模型下线 (EOS)](/docs/model-deprecation-notice#b933be49)。 | \ |模型服务下线 | | | ## 下线模型 > **注意** > > 不同模型/版本支持的能力、API 参数、单价、任务中实际表现存在差异,迁移前请务必仔细阅读模型介绍,并进行必要评测,比较迁移前后模型的表现。 |**模型 ID** |**建议迁移模型** |**到期未迁移,系统替换模型** | \ | |> 推荐迁移最新版本模型,下表随模型迭代动态更新 | | |---|---|---| |deepseek-r1-250528 |doubao-seed-2-0-lite-260215 |doubao-seed-2-0-lite-260215 | |deepseek-v3-250324 |doubao-seed-2-0-lite-260215 |doubao-seed-2-0-lite-260215 | |deepseek-v3-1-terminus |doubao-seed-2-0-lite-260215 |doubao-seed-2-0-lite-260215 | |doubao-1-5-pro-32k-character-250228 |doubao-seed-character-251128 |doubao-seed-character-251128 | |doubao-seed-1-6-lite-251015 |doubao-seed-2-0-mini-260215 |doubao-seed-2-0-mini-260215 | |doubao-seed-1-8-251215 |doubao-seed-1-8-251228 |doubao-seed-1-8-251228 | |doubao-seedance-1-0-lite-i2v-250428 |doubao-seedance-2-0-fast-260128 |doubao-seedance-2-0-fast-260128 | |doubao-seedance-1-0-lite-t2v-250428 |doubao-seedance-2-0-fast-260128 |doubao-seedance-2-0-fast-260128 | |doubao-seedream-3-0-t2i-250415 |doubao-seedream-5-0-lite-260128 |doubao-seedream-5-0-lite-260128 | # 第七批模型下线说明 详细信息 ## 下线计划 |节点 |时间 |**具体动作&影响** | |---|---|---| |**启动&通知** |2026-3-17 10:00:00(UTC+8) |方舟逐步下调模型配额。 | |**EOM** |2026-3-18 10:00:00(UTC+8) |用户无法新增接入点。 | \ |模型停止新购 | |> 建议提前切换至对应的替换模型,并测试验证新模型对业务的影响。 | |**EOS** |**2026-03-24 14:00**(UTC+8) |模型正式下线并残留接入点自动替换为新模型。 | \ |模型服务下线 | | | ## 下线模型 > **注意** > > 不同模型/版本支持的能力、API 参数、单价、任务中实际表现存在差异,迁移前请务必仔细阅读模型介绍,并进行必要评测,比较迁移前后模型的表现。 |**模型 ID** |**到期未迁移,系统替换模型** | |---|---| |gpt-oss-120b-250805 |doubao-seed-2-0-mini-260215 | |doubao-lite-32k-character-250228 |doubao-seed-character-251128 | |doubao-lite-4k-browsing-intent-240828 |doubao-seed-2-0-mini-260215 | |doubao-seed3d-1-0-250928 |关停 | \ | |> 请提前切换模型,避免影响业务。 | # 第六批模型下线说明 详细信息 ## 下线计划 |节点 |时间 |**具体动作&影响** | |---|---|---| |**启动&通知** |2025-12-19 10:00:00(UTC+8) |方舟逐步下调模型配额。 | |**EOM** |2025-12-26 10:00:00(UTC+8) |用户无法新增接入点。 | \ |模型停止新购 | |> 建议提前切换至对应的替换模型,并测试验证新模型对业务的影响。 | |**EOS** |**2026-03-31 14:00**(UTC+8) |模型正式下线并残留接入点自动替换为新模型。 | \ |模型服务下线 | | | ## 下线模型 > **注意** > > * 不同模型/版本支持的能力、API 参数、单价、任务中实际表现存在差异,迁移前请务必仔细阅读模型介绍,并进行必要评测,比较迁移前后模型的表现。 > * embedding 模型迁移需要先对存量的知识库进行重建,再进行迁移操作。不同于其他基础模型,embedding 模型仅有EOM阶段,不涉及EOS阶段。即待下线的embedding 模型会在「EOM时间」停止新增接入点,但不影响存量服务的正常使用。 |**模型 ID** |**建议迁移模型** |**到期未迁移,系统替换模型** | \ | |> 推荐迁移最新版本模型,下表随模型迭代动态更新 | | |---|---|---| |doubao-seed-1-6-thinking-250615 |doubao-seed-2-0-lite-260215 |doubao-seed-2-0-lite-260215 | |doubao-seed-1-6-thinking-250715 |doubao-seed-2-0-lite-260215 |doubao-seed-2-0-lite-260215 | |doubao-seed-1-6-flash-250715 |doubao-seed-2-0-mini-260215 |doubao-seed-2-0-mini-260215 | |doubao-1-5-vision-pro-250328 |doubao-seed-2-0-lite-260215 |doubao-seed-2-0-lite-260215 | |doubao-1-5-thinking-vision-pro-250428 |doubao-seed-2-0-lite-260215 |doubao-seed-2-0-lite-260215 | |doubao-1-5-vision-lite-250315 |doubao-seed-2-0-lite-260215 |doubao-seed-2-0-lite-260215 | |doubao-1-5-thinking-pro-250415 |doubao-seed-2-0-lite-260215 |doubao-seed-2-0-lite-260215 | |doubao-1-5-thinking-pro-m-250428 |doubao-seed-2-0-lite-260215 |doubao-seed-2-0-lite-260215 | |doubao-1-5-ui-tars-250428 |doubao-seed-2-0-lite-260215 |doubao-seed-2-0-lite-260215 | |deepseek-v3-1-250821 |deepseek-v3-1-terminus |doubao-seed-2-0-lite-260215 | |doubao-embedding-text-240715 |doubao-embedding-vision-251215 |不强制切换 | \ | |> 推荐:引入了图片/视频向量化能力,详细介绍见 [模型卡片](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-embedding-vision) 。 | | |doubao-embedding-vision-250328 |doubao-embedding-vision-251215 |不强制切换 | |doubao-embedding-large-text-240915 |doubao-embedding-vision-251215 |不强制切换 | |doubao-embedding-large-text-250515 |doubao-embedding-vision-251215 |不强制切换 | |doubao-seededit-3-0-i2i-250628 |doubao-seedream-4-5-251128 |关停 | \ | | |> 请提前切换模型,避免影响业务。 | |kimi-k2-250905 |doubao-seed-2-0-lite-260215 |doubao-seed-2-0-lite-260215 | |kimi-k2-thinking-251104 |doubao-seed-2-0-lite-260215 |doubao-seed-2-0-lite-260215 | |doubao-clasi-s2t-241215 |关停 |关停 | \ | |> 请提前切换模型,避免影响业务。 |> 请提前切换模型,避免影响业务。 | # 下线流程 一般情况下,每个版本的模型生命周期为3~6个月,即在上线后3-6个月后,模型会正式下线并停止服务。在停止服务前,我们会为开发者预留一定的时间进行新版本模型的效果测试,避免影响业务。 1. **确定旧版本模型下线计划**,通过短信、站内信、平台公告等多种方式发布通知。 2. 自正式通知日(即「通知时间」)起,逐步下调模型的使用额度(即下调RPM和TPM的配额)。 3. 至模型停止新购(即 「 EOM 时间」 )起,模型停止新购,新购和创建模型接入点的入口关闭,存量的模型推理接入点可正常使用。 4. 至模型下线时间(即「EOS 时间」)时,**模型正式下线并停止服务**,存量的模型推理服务将停止服务(部分模型会自动切换至新版本,部分模型则直接关停,详见下文节点说明及各批次说明)。 # 节点说明 ## **1.模型停止新购(EOM)** EOM:End of Marketing,旧版模型停止新购,无法新购/新建/开通旧版模型服务。 * **在线推理**:不可再新建待下线模型的推理服务接入点,仅支持切换在线推理服务接入点指向的模型版本。 * **精调任务**:不可新建基于待下线模型的精调任务。 * **批量推理** * 不可通过控制台发起批量推理任务,但在模型正式下线(EOS)前,支持通过 [Batch Job API](/docs/batch-inference) 调用待下线模型。 * 不可新建待下线模型的批量推理接入点。 * 逐步下调配额:模型会逐步下调已创建推理服务接入点使用配额,直到完全下线。 > **说明** > > * 对于自定义推理接入点 > > * 若您选择在控制台手动切换,请确保在切换前已在开通管理模块开通替代模型,否则切换将报错,但不影响线上服务。 > > * 若您选择平台自动切换,请确保下线日前在开通管理模块开通替代模型,否则会出现调用报错,**可能影响线上服务**。 > * 对于预置推理接入点 > > * 到期将直接关停,不自动切换,也不支持在控制台手动切换。请您在模型下线前,及时做好相关业务调整,以免影响正常使用。 ## **2.模型下线 (EOS)** EOS:End of Service & Support,模型停止服务,模型服务下线。 * 精调模型:模型下线当日停止服务,无法调用。 * 非精调模型:模型下线当日系统将自动切换到新模型服务或停止服务,详见下文对应批次的模型下线说明;若自动切换的模型在正式切换时刻有最新版本,会变更至最新版本。 > **说明** > > * 若开启了安心体验,安心体验接入点将在模型下线当日直接关停。 > * 若配置了用量上限,相关接入点将在模型下线当日直接关停。 > * 若下线日前未手动迁移,系统自动迁移的模型对比原模型可能会有价格波动,请关注价格变化,对比价格,以便合理规划使用成本。 # 切换模型步骤 模型切换涉及到不同场景的切换,包括同模型不同版本、不同模型迁移,精调模型服务迁移;以下是针对不同场景的迁移指引。 ## 场景:基础模型切换 平台提供**推理服务接入点平滑切换能力**。 在方舟平台的在线推理页面,修改推理服务接入点对应的模型版本(暂不支持精调模型及模型单元的版本切换)。可实现模型版本的平滑切换,支持更新模型版本。 > **注意** > > 不同模型/版本支持的能力、API 参数、单价、任务中实际表现存在差异,迁移前请务必仔细阅读模型介绍,并进行必要评测,比较迁移前后模型的表现。 |操作步骤 |图示 | |---|---| |打开 [在线推理](https://ark.volcengine.com/region:cn-beijing/endpoint)>**推理接入点详情页,** 在【选择模型】页面,选择切换的模型版本;完成后点击确定。 |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/5fbb0a5e5dad47ff8adabe722694586a~tplv-goo7wpa0wc-image.image) | \ | | | \ | | | \ | |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/4e2625c9486a4553b797f5b3e7a23fbd~tplv-goo7wpa0wc-image.image) | \ | | | |核对**推理服务接入点的详情页**中模型版本;完成平滑切换。 |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/08cde21aa80342cd9bd5a102eec7f68c~tplv-goo7wpa0wc-image.image) | \ |**说明** | | \ | | | \ |* 切换时间:模型版本迁移的过程不超过1小时 | | \ |* 取消切换:点击取消切换撤回模型迁移,请求流量按比例逐步切换至原模型版本 | | \ |* 切换和取消切换过程按流量比例进行切换,不会影响业务正常使用 | | \ | | | ## 场景:精调模型切换 由于精调模型依赖基座模型,如果需要变更精调模型对应的基座模型,需要在新的模型版本上再次 [精调模型](/docs/fine-tuning-overview),并验证效果达到预期后,再创建新的推理接入点,完成相应的代码变更,实现迁移。 如有其他迁移问题,可以通过提交 [工单](https://console.volcengine.com/workorder/create?step=2&SubProductID=P00001166) 的方式,进行咨询。 --- # 下线模型迁移说明 Source: https://ark.volcengine.com/region:cn-beijing/docs/model-deprecation-migration-guide 随着火山方舟平台模型的升级,旧版本模型将逐步下线。模型正式下线(EOS)后,未及时迁移的推理接入点将被系统自动替换为建议迁移模型或直接关停,下线计划与各批次模型列表参见[模型下线公告](/docs/model-deprecation-notice)。下线模型与迁移目标模型在 API 参数支持上存在差异:部分模型不支持 `thinking`、`reasoning_effort`、`detail`、`thinking summary` 等参数。系统自动迁移时,仅 `thinking` 参数会自动生效;`reasoning_effort`、`detail` 等其他参数不会自动生效,需要你在迁移后自行手动修改调用代码。 本文以下线公告中的模型为例,介绍迁移前后各 API 参数的差异,帮助你提前检查并调整调用参数,避免迁移后出现调用报错或效果波动。 > **注意** > > 不同模型/版本支持的能力、API 参数、单价、任务中实际表现存在差异,迁移前请务必仔细阅读模型介绍,并进行必要评测,比较迁移前后模型的表现。 > > 特别注意:系统自动迁移时,仅 `thinking` 参数会自动生效;`reasoning_effort`、`detail`、`thinking summary` 等其他参数不会自动生效,你需要在迁移后自行手动修改调用代码,否则可能导致调用报错。 # thinking(开启/关闭深度思考) `thinking` 字段用于控制是否开启深度思考,取值为 `enabled`(默认)、`disabled`,部分模型支持 `auto`。详细说明参见[深度思考](/docs/deep-thinking)。 |**下线模型 ID** |**thinking 支持情况** |**迁移后需要关注** | |---|---|---| |kimi-k2-5-260127 |不支持 |thinking 为 `disabled` | |doubao-1-5-lite-32k-250115 |^^ |^^ | |doubao-1-5-vision-pro-32k-250115 |^^ |^^ | |doubao-1-5-pro-32k-250115 |^^ |^^ | |doubao-1-5-pro-32k-character-250715 |^^ |^^ | |doubao-seedance-1-5-pro-251215 |^^ |^^ | |glm-4-7-251222 |`enabled`(默认)/ `disabled` |与原模型 thinking 取值一致 | |deepseek-v3-2-251201 |^^ |^^ | |doubao-seed-code-preview-251028 |^^ |^^ | |doubao-seed-1-6-vision-250815 |^^ |^^ | |doubao-seed-1-6-flash-250828 |^^ |^^ | |doubao-seed-1-6-flash-250615 |^^ |^^ | |doubao-seed-1-6-251015 |^^ |^^ | |doubao-seed-1-8-251228 |^^ |^^ | |deepseek-v4-flash-260425 |^^ |^^ | |doubao-seed-1-6-250615 |`enabled`(默认)/ `disabled` / `auto` |与原模型 thinking 取值一致 | **迁移建议:** * 原模型不支持 `thinking`:自动迁移后接入点的 thinking 为 `disabled`,行为与原模型一致,调用代码无需调整。若希望在迁移模型上开启深度思考,可在请求中显式传入 `"thinking": {"type": "enabled"}`。 * 原模型支持 `thinking`:自动迁移后与原取值一致,调用代码无需调整;手动切换模型时建议保持原取值,并确认目标模型的 `thinking` 支持情况。 * 若迁移目标模型不支持 `thinking`(如 `doubao-seedance-2-0-mini-260615`),请从请求中移除该参数。 # reasoning_effort(调节思考长度) `reasoning_effort`(Chat API)/ `reasoning.effort`(Responses API)字段用于调节思维链长度,取值为 `none`、`minimal`、`low`、`medium`、`high`、`xhigh`、`max`。详细说明参见[深度思考](/docs/deep-thinking)。 |**下线模型 ID** |**reasoning_effort 支持情况** |**默认取值** |**兼容映射** |**thinking 支持情况** |**迁移后需要关注** | |---|---|---|---|---|---| |kimi-k2-5-260127 |不支持 |— |— |不支持 |thinking 为 `disabled`,reasoning_effort 不会自动生效 | |doubao-1-5-lite-32k-250115 |^^ |^^ |^^ |^^ |^^ | |doubao-1-5-vision-pro-32k-250115 |^^ |^^ |^^ |^^ |^^ | |doubao-1-5-pro-32k-250115 |^^ |^^ |^^ |^^ |^^ | |doubao-1-5-pro-32k-character-250715 |^^ |^^ |^^ |^^ |^^ | |doubao-seedance-1-5-pro-251215 |^^ |^^ |^^ |^^ |^^ | |glm-4-7-251222 |不支持 |— |— |`enabled`(默认)/ `disabled` |reasoning_effort 不会自动生效 | |deepseek-v3-2-251201 |^^ |^^ |^^ |^^ |^^ | |doubao-seed-code-preview-251028 |^^ |^^ |^^ |^^ |^^ | |doubao-seed-1-6-vision-250815 |^^ |^^ |^^ |^^ |^^ | |doubao-seed-1-6-250615 |^^ |^^ |^^ |^^ |^^ | |doubao-seed-1-6-flash-250828 |^^ |^^ |^^ |^^ |^^ | |doubao-seed-1-6-flash-250615 |^^ |^^ |^^ |^^ |^^ | |deepseek-v4-flash-260425 |支持 |`high` |`minimal`→关闭思考,`none`→`minimal`,`low`/`medium`→`high`,`xhigh`→`max` |`enabled`(默认)/ `disabled` |reasoning_effort 不会自动生效,需手动设置 | |doubao-seed-1-8-251228 |支持 |`medium` |`minimal`→关闭思考,`none`→`minimal`,`xhigh`/`max`→`high` |`enabled`(默认)/ `disabled` |reasoning_effort 不会自动生效,需手动设置 | |doubao-seed-1-6-251015 |支持 |`medium` |`minimal`→关闭思考,`none`→`minimal`,`xhigh`/`max`→`high` |`enabled`(默认)/ `disabled` |reasoning_effort 不会自动生效,需手动设置 | **迁移建议:** * 系统自动迁移时 `reasoning_effort` 不会自动生效,需要手动修改调用代码:目标模型不支持该参数时,请从请求中移除,避免调用报错。 * 目标模型支持 `reasoning_effort` 时,请按目标模型的默认取值与兼容映射,在请求中手动设置取值。 # thinking summary(思考内容摘要) thinking summary 能力开启后,模型返回思考内容摘要(`reasoning_content`)与思考内容加密原文(`encrypted_content`),而不是输出原始思考内容。详细说明参见[深度思考](/docs/deep-thinking)。 > **注意** > > 特别注意回传行为:开启 thinking summary 后返回的是思考内容摘要与加密原文,Agent 场景(多轮工具调用等)下需要将加密原文按规范回传给模型,否则会影响推理效果。Agent 场景的正确调用与回传姿势参见[Agent 场景模型调用的正确姿势](/docs/agent-model-invocation-practice)。 下线模型均不支持 thinking summary。迁移后是否支持取决于建议迁移模型: |**下线模型 ID** |**thinking summary 支持情况** |**建议迁移模型** |**迁移后 thinking summary 支持情况** | |---|---|---|---| |kimi-k2-5-260127 |不支持 |doubao-seed-evolving |支持 | |doubao-1-5-vision-pro-32k-250115 |^^ |doubao-seed-2-0-lite-260428 |^^ | |doubao-1-5-pro-32k-250115 |^^ |doubao-seed-2-0-lite-260428 |^^ | |doubao-seed-code-preview-251028 |^^ |doubao-seed-evolving |^^ | |doubao-seed-1-6-vision-250815 |^^ |doubao-seed-2-0-lite-260428 |^^ | |doubao-seed-1-6-250615 |^^ |doubao-seed-2-0-lite-260428 |^^ | |doubao-seed-1-6-251015 |^^ |doubao-seed-2-0-lite-260428 |^^ | |doubao-seed-1-8-251228 |^^ |doubao-seed-2-0-lite-260428 |^^ | |deepseek-v3-2-251201 |不支持 |deepseek-v4-flash-ga-260731 |不支持 | |doubao-1-5-lite-32k-250115 |^^ |doubao-seed-2-0-mini-260428 |^^ | |doubao-1-5-pro-32k-character-250715 |^^ |doubao-seed-character-260628 |^^ | |doubao-seedance-1-5-pro-251215 |^^ |doubao-seedance-2-0-mini-260615 |^^ | |glm-4-7-251222 |^^ |glm-5-2-260617 |^^ | |doubao-seed-1-6-flash-250828 |^^ |doubao-seed-2-0-mini-260428 |^^ | |doubao-seed-1-6-flash-250615 |^^ |doubao-seed-2-0-mini-260428 |^^ | |deepseek-v4-flash-260425 |^^ |deepseek-v4-flash-ga-260731 |^^ | **迁移建议:** * 系统自动迁移时 thinking summary 不会自动生效:迁移到支持 thinking summary 的模型后,需按模型介绍自行开启并适配,开启后响应中将包含思考内容摘要(`reasoning_content`)与加密原文(`encrypted_content`)。由于可能产生较高的包间延迟,请调大请求超时时间(`timeout`)。 * 迁移到不支持 thinking summary 的模型后,不返回上述摘要相关字段。 * 若不希望迁移后返回摘要内容,请通过模型介绍确认目标模型的关闭方式。 # detail(图片理解精细度) `detail` 参数用于控制模型理解图片的精细度,在 `image_url` 中传入,详细说明参见[图片理解](/docs/image-understanding)。系统自动迁移时 `detail` 参数不会自动生效,需要在迁移后手动修改调用代码,可参考以下规则: * 不支持图片理解的模型:迁移到新模型后,`detail` 建议设置为 `low`。 * doubao-seed-1.8 之前且支持图片理解的模型:原模型 detail 使用默认值,切换到 doubao-seed-2.0 新模型后,`detail` 建议设置为 `low`。 * doubao-seed-1.8 模型及后续模型:切换到新模型后,建议在请求中保持与原模型一致的 `detail` 取值。 **迁移建议:** 若业务对图片理解精细度有要求(如需要 `high` 及以上档位),请在迁移后检查请求中 `image_url` 的 `detail` 取值,并按目标模型支持的模式显式设置。 # 建议迁移模型的参数支持总览 |**模型 ID** |**thinking 支持情况** |**reasoning_effort 支持情况** |**默认取值** |**兼容映射** |**thinking summary 支持情况** | |---|---|---|---|---|---| |doubao-seed-evolving |`enabled`(默认)/ `disabled` |支持 |`high` |`minimal`→关闭思考,`none`→`minimal`,`xhigh`/`max`→`high` |支持 | |glm-5-2-260617 |`enabled`(默认)/ `disabled` |支持 |`high` |`none`/`minimal`→关闭思考,`low`/`medium`→`high`,`xhigh`→`max` |不支持 | |deepseek-v4-flash-ga-260731 |`enabled`(默认)/ `disabled` |支持 |`high` |`none`/`minimal`→关闭思考,`medium`→`low`,`xhigh`→`high` |不支持 | |doubao-seed-2-0-lite-260428 |`enabled`(默认)/ `disabled` |支持 |`medium` |`minimal`→关闭思考,`none`→`minimal`,`xhigh`/`max`→`high` |支持 | |doubao-seed-2-0-mini-260428 |`enabled`(默认)/ `disabled` |支持 |`medium` |`minimal`→关闭思考,`none`→`minimal`,`xhigh`/`max`→`high` |不支持 | |doubao-seed-character-260628 |`enabled`(默认)/ `disabled` |支持 |`medium` |`minimal`→关闭思考,`none`→`minimal`,`xhigh`/`max`→`high` |不支持 | |doubao-seedance-2-0-mini-260615 |不支持 |不支持 |— |— |不支持 | # 迁移操作建议 1. **确认下线计划与建议迁移模型**:在[模型下线公告](/docs/model-deprecation-notice)中查看你使用的模型所属批次、下线时间及建议迁移模型。 2. **检查调用参数**:系统自动迁移时仅 `thinking` 参数会自动生效,其余参数需手动修改调用代码。按下文清单检查请求中与深度思考、图片理解相关的参数,并对照本文各参数差异表调整: * `thinking`:目标模型不支持时移除;支持时确认取值。 * `reasoning_effort`(Responses API 为 `reasoning.effort`):目标模型不支持时移除;支持时按兼容映射确认取值。 * `image_url` 中的 `detail`:按 detail 参数变化规则确认取值。 * thinking summary 相关字段(`reasoning_content`、`encrypted_content`):按目标模型支持情况调整解析逻辑与超时时间。 3. **提前切换并评测**:建议在模型下线前,通过推理接入点平滑切换能力提前切换到目标模型并完成评测,切换步骤参见[切换模型步骤](/docs/model-deprecation-notice#model-switching-notes)。 4. **未及时迁移**:模型下线当日,系统会将残留接入点自动替换为建议迁移模型或直接关停,自动迁移的模型与原模型可能存在价格波动,请关注价格变化,合理规划使用成本。 以下为调整调用参数的示例:原请求调用 `doubao-seed-1-6-251015` 并显式设置思考参数,迁移到 `doubao-seed-2-0-lite-260428` 后取值保持兼容,无需修改: |场景 |请求示例 | |---|---| |迁移前(下线模型) |```JSON | \ | |{ | \ | | "model": "doubao-seed-1-6-251015", | \ | | "messages": [ | \ | | {"role": "user", "content": "介绍一下深度思考"} | \ | | ], | \ | | "thinking": {"type": "enabled"}, | \ | | "reasoning_effort": "medium" | \ | |} | \ | |``` | |迁移后(支持思考参数的模型,取值无需调整) |```JSON | \ | |{ | \ | | "model": "doubao-seed-2-0-lite-260428", | \ | | "messages": [ | \ | | {"role": "user", "content": "介绍一下深度思考"} | \ | | ], | \ | | "thinking": {"type": "enabled"}, | \ | | "reasoning_effort": "medium" | \ | |} | \ | |``` | 如有其他迁移问题,可以通过提交 [工单](https://console.volcengine.com/workorder/create?step=2&SubProductID=P00001166) 的方式,进行咨询。 --- # 26年春节期间访问方式调整公告 Source: https://ark.volcengine.com/region:cn-beijing/docs/access-changes-during-spring-festival-2026 为了保证产品服务的稳定性和体验保障,春节期间访问火山方舟控制台、体验中心等页面前需登录火山引擎账号。春节后页面恢复为免登录访问。详细的信息如下: * **影响页面** * [AI体验中心](https://exp.volcengine.com/ark?mode=chat&modelId=doubao-seed-1-8-251228) * [大模型体验中心](https://www.volcengine.com/experience/ark?mode=chat&modelId=doubao-seed-1-8-251228) * [火山方舟控制台](https://ark.volcengine.com/region:cn-beijing) * **访问方式** * 免登录访问 -> 登录后访问 * **生效时间** * 2026-02-05 00:00:00 ~ 2026-02-24 00:00:00 --- # 模型发布公告 2025 Source: https://ark.volcengine.com/region:cn-beijing/docs/model-release-announcement-2025 # 202512 |**提供方** |**模型 ID** |**模型类型** |**版本说明** |**调用说明** | |---|---|---|---|---| |字节跳动 |doubao-seed-1-8-251228 |深度思考模型 |新发布 |更强Agent能力、升级多模态理解、更灵活的上下文管理。调用指南请参考[文本生成](/docs/text-generation)。 | |字节跳动 |doubao-seedance-1-5-pro-251215 |视频生成模型 |新发布 |音画高精同步,影视级运动和情绪表现,支持首尾帧。调用指南请参考 [视频生成教程](/docs/video-generation-tutorial)。 | |字节跳动 |doubao-embedding-vision-251215 |向量化模型 |新发布 |豆包多模态向量化大模型,支持图片、中英双语文本输入。调用指南请参考[向量化](/docs/vectorization)。 | |深度求索 |deepseek-v3-2-251201 |深度思考模型 |新发布 |平衡推理能力与输出长度,适合日常使用,例如问答场景和通用 Agent 任务场景[深度思考](/docs/responses-api-deep-thinking)。 | # 202511 |**提供方** |**模型 ID** |**模型类型** |**版本说明** |**调用说明** | |---|---|---|---|---| |字节跳动 |doubao-seed-code-preview-251028 |编程模型 |版本更新 |全新深度思考模型,同时支持thinking/non-thinking两种思考模式。调用指南请参考 [深度思考](/docs/deep-thinking)。 | |月之暗面 |kimi-k2-thinking-251104 |深度思考模型 |新版本 |具备超强代码和 Agent 能力的 MoE (混合专家模型)架构基础模型,调用指南请参考 [深度思考](/docs/deep-thinking)。 | |字节跳动 |doubao-seedream-4-5-251128 |图片生成模型 |新版本 |相比前代4.0在编辑一致性(如主体细节与光影色调的保持)、人像美化和小字生成方面体验升级,调用指南请参考 [Doubao Seedream 4.0-5.0 教程](/docs/seedream-4-0-5-0)。 | # 202510 |**提供方** |**模型 ID** |**模型类型** |**版本说明** |**调用说明** | |---|---|---|---|---| |字节跳动 |doubao-seed-1-6-251015 |对话模型 |新发布 |全新深度思考模型,同时支持thinking/non-thinking两种思考模式。调用指南请参考 [深度思考](/docs/deep-thinking)。 | |字节跳动 |doubao-seed-1-6-lite-251015 |对话模型 |新发布 |全新最强小尺寸深度思考模型,相较 doubao-seed-1-6-250615 推理速度大幅提升。调用指南请参考[深度思考](/docs/deep-thinking)。 | |字节跳动 |seedance-1.0-pro-fast-251015 |视频生成模型 |新发布 |在生成质量、速度、成本之间取得了卓越平衡的视频生成模型。调用指南请参考 [视频生成教程](/docs/video-generation-tutorial)。 | # 202509 |**提供方** |**模型 ID** |**模型类型** |**版本说明** |**调用说明** | |---|---|---|---|---| |字节跳动 |doubao-seed-translation-250915 |文本生成模型 |新发布 |doubao-seed-translation 是自研的多语言翻译模型,它的基座是一个从零开始训练的7b多语言文本大模型,支持28种语言互译,彻底摆脱“小模型时代”的“翻译腔”,提供最忠实、最地道、最流畅的译文。调用指南请参考 [Responses API](/docs/create-model-responses-api) | |月之暗面 |kimi-k2-250905 |对话模型 |版本更新 |Kimi K2/250905 是Moonshot AI推出的最新版本,作为一款性能极强的MoE架构模型,总参数 1T,激活参数 32B,上下文窗口提升至256k。在公共基准测试与真实编码智能体任务中,0905版本性能提升显著,同时优化了前端编程的美观性与实用性。调用指南请参考[对话(Chat) API](/docs/chat-api) | |深度求索 |deepseek-v3-1-terminus |对话模型 |版本更新 |相比上一版解决了一系列问题,主要包含:语言一致性: 缓解了中英文混杂、偶发异常字符等情况;Agent 能力: 进一步优化了 Code Agent 与 Search Agent 的表现。调用指南请参考 [对话(Chat )API](/docs/chat-api) | |字节跳动 |doubao-seed3d-1-0-250928 |3D生成模型 |新发布 |基于 Diffusion Transformer(DiT)架构训练的 3D生成模型,能够在几分钟内输出包含多边形面片与 PBR 材质的高精度资产。调用指南参考[3D 生成](/docs/3d-generation)。 | # 202508 |**提供方** |**模型 ID** |**模型类型** |**版本说明** |**调用说明** | |---|---|---|---|---| |深度求索 |deepseek-v3-1-250821 |对话模型 |版本更新 |deepseek-v3-1 是深度求索全新推出的混合推理模型,支持思考与非思考2种推理模式,较deepseek-R1/250528思考效率更高。经 Post-Training 优化,Agent 工具使用与智能体任务表现大幅提升。调用指南请参考[对话(Chat) API](/docs/chat-api) | |字节跳动 |doubao-seed-1-6-vision-250815 |视觉理解模型 |新发布 |doubao-seed-1-6-vision/250815是豆包推出的全新视觉思考模型,与doubao-seed-1-5-vision-pro相比,在教育、图像审核、巡检与安防和AI搜索问答等场景下展现出更强的通用多模态理解和推理能力。调用指南请参考[对话(Chat) API](/docs/chat-api) | |字节跳动 |doubao-seed-1-6-flash-250828 |视觉理解模型 |版本更新 |相比doubao-seed-1-6-flash/250715版本,文本能力基本一致,视觉能力显著大幅提升!调用指南请参考[对话(Chat) API](/docs/chat-api) | |字节跳动 |doubao-seedream-4.0-250828 |图片生成模型 |新发布 |相比doubao-seedream-3.0-t2i-250415版本,图片生成质量显著提升,在文字渲染、人像美观度、细节还原等方面表现更优。调用指南请参考 [图片生成API](/docs/image-generation-api) | # 202507 |**提供方** |**模型 ID** |**模型类型** |**版本说明** |**调用说明** | |---|---|---|---|---| |字节跳动 |doubao-seed-1-6-thinking-250715 |视觉理解模型 |版本更新 |深度思考能力更强化!相比doubao-seed-1-6-thinking-250615版本文本&视觉能力显著提升,综合能力领先doubao-seed-1-6-250615开启thinking模式。调用指南请参考[对话(Chat) API](/docs/chat-api) | |字节跳动 |doubao-seed-1-6-flash-250715 |视觉理解模型 |版本更新 |思考与非思考模式的纯文本任务效果,大幅显著提升!调用指南请参考[对话(Chat) API](/docs/chat-api) | |字节跳动 |doubao-1-5-pro-32k-character-250715 |对话模型 |版本更新 |新增故事剧情模式、恋爱拉扯、真人向聊天优化,整体效果提升10~15%。调用指南请参考[对话(Chat) API](/docs/chat-api) | |字节跳动 |doubao-seededit-3.0-i2i-250628 |图片生成模型 |新发布 |SeedEdit 3.0 模型在精细且自然地处理编辑区域的同时,还能高保真地维持其他细节信息。 尤其针对图像编辑“哪里改与哪里不改”的取舍,该模型表现出更佳的理解力和权衡力,可用率相应提高。 | |月之暗面 |kimi-k2-250711 |对话模型 |新发布 |kimi-k2 是一款Moonshot AI推出的具备超强代码和 Agent 能力的 MoE 架构基础模型,总参数 1T,激活参数 32B。在通用知识推理、编程、数学、Agent 等主要类别的基准性能测试中,K2 模型的性能超过其他主流开源模型。调用指南请参考[对话(Chat) API](/docs/chat-api) | # 202506 |**提供方** |**模型 ID** |**模型类型** |**版本说明** |**调用说明** | |---|---|---|---|---| |字节跳动 |doubao-seed-1-6-thinking-250615 |视觉理解模型 |新发布 |在思考能力上进行了大幅强化。与doubao-1-5-thinking-pro相比,在Coding、Math、 逻辑推理等基础能力上进一步提升。调用指南请参考[对话(Chat) API](/docs/chat-api) | |字节跳动 |doubao-seed-1-6-250615 |视觉理解模型 |新发布 |全新多模态深度思考模型,同时支持thinking-non-thinking-auto三种思考模式, non-thinking模型对比doubao-1-5-pro-250115大幅提升。调用指南请参考[对话(Chat) API](/docs/chat-api) | |字节跳动 |doubao-seed-1-6-flash-250615 |视觉理解模型 |新发布 |极致推理速度的多模态深度思考模型,同时支持文本和视觉理解,文本理解能力超过上一代lite,视觉理解比肩友商pro系列模型。调用指南请参考[对话(Chat) API](/docs/chat-api) | |字节跳动 |doubao-seedance-1.0-pro-250528 |视频生成模型 |新发布 |Seedance 1.0 Pro是一款支持多镜头叙事的视频生成基础模型,在各维度表现出色。它在语义理解与指令遵循能力上取得突破,能生成运动流畅、细节丰富、风格多样且具备影视级美感的 1080P 高清视频调用指南请参考 [视频生成API](/docs/create-video-generation-task-api) | |字节跳动 |doubao-1-5-ui-tars-250428 |GUI Agent模型 |版本更新 |全新升级版本,相比250328版本,在GUI交互能力全面提升的基础上,大幅提升了移动端交互能力,并支持了深度思考与FunctionCall。调用指南请参考[对话(Chat) API](/docs/chat-api) | |字节跳动 |doubao-embedding-large-text-250515 |文本向量化模型 |版本更新 |基于 Seed1.5 (doubao-1-5-pro) 进一步训练。在权威测评榜单 MTEB 上,达到了中英文 SOTA 效果。除了通用 Embedding 任务外,团队还额外优化了模型在推理密集的检索任务上的能力,并在对应榜单 BRIGHT 上也达到 SOTA。调用指南请参考 [文本向量化API](/docs/multimodal-vectorization-api) | # 202505 |提供方 |模型 ID |模型类型 |版本说明 |调用说明 | |---|---|---|---|---| |字节跳动 |doubao-seedream-3.0-t2i-250415 |图像生成模型 |新发布 |Seedream 3.0 的综合能力显著增强:支持原生 2K 分辨率输出,响应速度更快,小字生成更准确,文本排版效果增强;指令遵循能力强,美感、结构提升,保真度和细节表现较好,在多项评估中排名领先。能够应用于更复杂、更广泛的图片生成场景。调用指南请参考 [图片生成API](/docs/image-generation-api) | |字节跳动 |doubao-seedance-1.0-lite-t2v-250428 |视频生成模型 |新发布 |Seedance 1.0 是字节跳动豆包大模型团队最新推出的视频生成基础模型。Seedance 1.0 lite模型作为该模型系列的小参数量版本,在取得出色的视频生成质量的同时,显著提升了生成速度,是兼顾效果与效率的性价比之选。调用指南请参考 [视频生成API](/docs/create-video-generation-task-api)。 | |字节跳动 |doubao-seedance-1.0-lite-i2v-250428 |视频生成模型 |新发布 |Seedance 1.0 是字节跳动豆包大模型团队最新推出的视频生成基础模型。Seedance 1.0 lite模型作为该模型系列的小参数量版本,在取得出色的视频生成质量的同时,显著提升了生成速度,是兼顾效果与效率的性价比之选。调用指南请参考 [视频生成API](/docs/create-video-generation-task-api)。 | |字节跳动 |doubao-1-5-thinking-pro-m-250428 |视觉理解模型 |版本更新 |自适应的思考模式,Auto的thinking模式,模型自主根据题目难度判断,是否需要触发思考,简单题目直接回答。调用指南请参考[对话(Chat) API](/docs/chat-api)。 | |字节跳动 |doubao-1-5-thinking-vision-pro-250428 |视觉理解模型 |新发布 |在公开VLM基准测试和内部评估测试中均表现出色,在 59 项公开基准测试中,37 项达到了SOTA水平。拥有强大的深度思考能力,尤其在视觉谜题等多模态推理挑战中表现突出。调用指南请参考[对话(Chat) API](/docs/chat-api)。 | # 202504 |提供方 |模型 ID |模型类型 |版本说明 |调用说明 | |---|---|---|---|---| |阿里云 |wan2.1-14b-i2v-250225 |视频生成模型 |新发布 |在多个基准测试中优于现有的开源模型,生成的视频在运动表现、画面质量等方面具备领先效果。支持生成包含中、英文文字的视频,拓展了模型的应用范围。调用指南请参考 [视频生成API](/docs/create-video-generation-task-api)。 | |阿里云 |wan2.1-14b-t2v-250225 |视频生成模型 |新发布 |在多个基准测试中优于现有的开源模型,生成的视频在运动表现、画面质量等方面具备领先效果。支持生成包含中、英文文字的视频,拓展了模型的应用范围。调用指南请参考 [视频生成API](/docs/create-video-generation-task-api)。 | |字节跳动 |doubao-1-5-thinking-pro-250415 |对话模型 |新发布 |在数学、编程、科学推理等专业领域及创意写作等通用任务中表现突出,在AIME 2024、Codeforces、GPQA等多项权威基准上达到或接近业界第一梯队水平。调用指南请参考 [对话(Chat) API](/docs/chat-api)。 | |字节跳动 |doubao-1-5-thinking-pro-m-250415 |视觉理解模型 |新发布 |基于深度思考+视觉理解的混合训练,让模型具备视觉推理能力,更强的多模态交互能力,和更低的视觉描述幻觉。. | |字节跳动 |doubao-1-5-vision-pro-250328 |视觉理解模型 |新发布 |全新升级的多模态大模型,视觉理解、分类、信息抽取等能力显著提升,并重点增强了解题、视频理解等场景的任务效果。调用指南请参考 [对话(Chat) API](/docs/chat-api)。 | |字节跳动 |doubao-1-5-vision-lite-250315 |视觉理解模型 |新发布 |全新升级的多模态大模型,相比doubao-vision-lite-32k,综合能力大幅提升15%,信息抽取、定位、OCR、图像理解描述等能力提升超20%。调用指南请参考 [对话(Chat) API](/docs/chat-api)。 | |字节跳动 |doubao-1-5-ui-tars-250328 |GUI Agent模型 |新发布 |模型通过将屏幕视觉理解、逻辑推理、界面元素定位和操作整合在单一模型中,突破了传统自动化工具依赖预设规则的局限性,为智能界面交互提供了更接近人类认知范式的解决方案。调用指南请参考 [对话(Chat) API](/docs/chat-api)。 | |字节跳动 |doubao-lite-32k-character-250228 |对话模型 |版本更新 |全新升级的角色扮演任务专项优化模型,拥有极速推理,具备极致的响应速度,满足低时延场景需求。应用全面,能力覆盖广泛的通用任务场景。调用指南请参考 [对话(Chat) API](/docs/chat-api)。 | |字节跳动 |doubao-embedding-vision-250328 |图文向量化模型 |版本更新 |效果、时延全面升级的图文向量化模型,默认2048维,支持1024维降维使用。该版本模型输出的向量已归一化处理,无需再次归一化。调用指南请参考 [图文向量化API](/docs/multimodal-vectorization-api)。 | |深度求索 |deepseek-v3-250324 |对话模型 |版本更新 |推理能力显著提升,数学、代码评测超越 GPT-4.5;HTML 前端任务的代码可用性更高,视觉效果更美观、富有设计感;中文写作质量优化,长文本创作能力增强;搜索场景报告生成更精准。调用指南请参考 [对话(Chat) API](/docs/chat-api)。 | # 202503 |提供方 |模型 ID |模型类型 |版本说明 |调用说明 | |---|---|---|---|---| |字节跳动 |doubao-1-5-pro-32k-character-250228 |对话模型 |版本更新 |基于doubao-1-5全新升级,支持故事剧情模式,优化恋爱拉扯能力(GSB+11%),角色风格能力优化 ,增强剧情推动能力。调用指南请参考 [图文向量化API](/docs/multimodal-vectorization-api)。 | |字节跳动 |doubao-seaweed-241128 |视频生成模型 |新发布 |模型支持将用户的文本、图像生成高质量的视频,能够生成具备丰富的细节层次的影视即视频,可应用于电商营销、动画教育等广泛的应用场景。调用指南请参考 [视频生成API](/docs/create-video-generation-task-api)。 | |深度求索 |deepseek-v3-241226 |对话模型 |新发布 |多项评测成绩超越了Qwen2.5-72B 和 Llama3.1等其他开源模型,并在性能上与GPT4o、Claude 3.5 Sonnet能力相当。调用指南请参考 [对话(Chat) API](/docs/chat-api)。 | |深度求索 |deepseek-r1-250120 |对话模型 |新发布 |deepseek-R1 在后训练阶段大规模使用了强化学习技术,在仅有极少标注数据的情况下,极大提升了模型推理能力。在数学、代码、自然语言推理等任务上,性能比肩 OpenAI o1 正式版。调用指南请参考 [对话(Chat) API](/docs/chat-api)。 | |深度求索 |deepseek-r1-distill-qwen-32b-250120 |对话模型 |新发布 |deepseek-R1-Distill 模型是在开源模型的基础上通过微调训练得到的,训练过程中使用了由deepseek-R1生成的样本数据,多项指标超越OpenAI o1-mini。调用指南请参考 [对话(Chat) API](/docs/chat-api)。 | |深度求索 |deepseek-r1-distill-qwen-37b-250120 |对话模型 |新发布 |deepseek-R1-Distill 模型是在开源模型的基础上通过微调训练得到的,训练过程中使用了由deepseek-R1生成的样本数据,多项指标超越OpenAI o1-mini。调用指南请参考 [对话(Chat) API](/docs/chat-api)。 | # 202501 |提供方 |模型ID |模型类型 |版本说明 |调用说明 | |---|---|---|---|---| |字节跳动 |doubao-1-5-pro-32k-250115 |对话模型 |新发布 |在多项公开测评基准上已达到全球领先水平。在知识、代码、推理、中文权威测评基准上获得最佳成绩,综合得分优于 GPT-4o、Claude 3.5 Sonnet 等业界一流模型。调用指南请参考 [ChatCompletions-文本生成](/docs/text-generation)。 | |字节跳动 |doubao-1-5-lite-32k-250115 |对话模型 |新发布 |全球一流水平的轻量版语言模型。在综合、推理、数学、专业知识权威测评指标持平或超越 GPT-4o mini,Cluade 3.5 Haiku。调用指南请参考 [ChatCompletions-文本生成](/docs/text-generation)。 | |字节跳动 |doubao-1-5-vision-pro-32k-250115 |视觉理解模型 |新发布 |相比于上一版本,Doubao1.5-vision-Pro 在多模态数据合成、动态分辨率、多模态对齐、混合训练上进行了全面的技术升级。进一步增强了模型在视觉推理、文字文档识别、细粒度信息理解、指令遵循方面的能力,并让模型的回复模式变得更加精简、友好。调用指南请参考 [ChatCompletions-视觉理解](/docs/chat-api)。 | |字节跳动 |doubao-1-5-pro-256k-250115 |对话模型 |新发布 |基于doubao-1-5-Pro全面升级版,整体效果大幅提升10%。支持256k上下文窗口的推理,输出长度支持最大12k tokens。调用指南请参考 [ChatCompletions-文本生成](/docs/text-generation)。 | --- # 产品更新公告 2025 Source: https://ark.volcengine.com/region:cn-beijing/docs/product-update-announcement-2025 # 202512 |功能模块 |功能说明 |文档/链接 | |---|---|---| |控制台 |* 支持免登录浏览平台页面与核心功能 |[控制台](https://ark.volcengine.com/region:cn-beijing/overview) | \ | | | | |体验中心 |* 生 3D 模型新增支持选择更多面数,支持三个档位(轻质30000面,中等100000面,精细200000面) |[体验中心](https://ark.volcengine.com/region:cn-beijing/experience) | \ | |* 录音文件识别模型升级,支持图片、文本上传辅助识别,支持 POI 功能,支持多说话人的识别 | | \ | |* 支持下载语音合成、声音复刻模型生成结果 | | \ | |* 视频生成模型支持设置生成超时时间参数 | | \ | |* 支持分享 Doubao-Seedance-1.5-pro 模型生成的视频 | | \ | |* 体验中心支持开发者模式 | | \ | |* 语言模型支持体验智能路由模式【**开白功能**】 | | |模型精调 |* 强化学习精调能力开放,支持通过 SDK 进行 Serverless 的 AgentRL(自定义rollout 及 reward),详见 [强化学习最佳实践](/docs/reinforcement-learning-best-practices) |[模型精调](https://ark.volcengine.com/region:cn-beijing/finetune) | \ | |* 训练计费策略优化,按算力计费的精调任务因抢占或系统原因失败导致的进度损失不计费 | | \ | |* 精调任务创建页 训练方法及模型选择器改版,更便捷地进行精调选型。展示模型版本的精调支持详情,提供按模态、模型能力、推理方法的筛选能力 | | \ | |* 新增数据错误容忍能力,容忍携带数量或比例在设置内的少量格式错误样本发起精调,但不参与训练且不计费 | | |模型仓库 |* 支持对开源模型上传、量化后部署,以及精调后部署;支持对豆包模型精调后进行量化部署 |[模型仓库](https://ark.volcengine.com/region:cn-beijing/customModel) | \ | | | | |模型推理 |* 安心体验模式支持图片生成、视频生成模型 |[模型推理](https://ark.volcengine.com/region:cn-beijing/endpoint) | \ | |* 推理限额支持图片生成、视频生成模型 | | \ | |* 支持豆包助手插件服务【**开白功能**】 | | \ | |* 支持用户将视觉模型推理点的内容安全护栏调整为自定义护栏,可自定义内容安全策略 | | \ | |* 模型仓库模型及三方开源模型支持用户关闭内容安全护栏 | | \ | |* 模型单元创建页、详情页交互优化 | | \ | |* 模型单元支持查看输入、输出 tokens 用量数据和平均缓存命中率 | | \ | |* 模型单元支持查看成本预估情况【**开白功能**】 | | \ | |* 模型单元支持在连续一定时间无流量资源将自动暂退,不再继续计费。下一次需要使用时,可直接发起请求来唤醒【**开白功能**】 | | \ | |* 新增智能降级功能,当大模型因触发限流等原因无法正常工作时,自动切换到备用模型,以确保服务的连续性和稳定性【**开白功能**】 | | |应用实验室 |* 支持通过方舟 Build 使用自然语言创建应用 |[应用实验室](https://ark.volcengine.com/region:cn-beijing/application) | \ | |* 上架电商营销视频生成器,用户上传商品图片,即可自动生成完整的商品营销视频 | | \ | |* 开源生成故事书和连环画,降低 AI 图像应用的搭建门槛、提供可复用 UI 模板、帮助开发者快速产出可商用级别的故事书/连环画生成体验 | | |开通管理 |* 开通管理整体升级,支持用户开通模型, 应用组件库,云产品和订阅套餐 |[开通管理](https://ark.volcengine.com/region:cn-beijing/openManagement) | \ | | | | |用量统计 |* 支持查看模型,接入点维度下输入 Cache 缓存命中总量 |[用量统计](https://ark.volcengine.com/region:cn-beijing/usageTracking) | \ | | | | |Coding Plan |* 支持在开通管理页的订阅套餐 tab 下查看套餐用量 |[Coding Plan](/docs/coding-plan-personal-plan-overview) | \ | |* 从自然月限流修改为订阅月限流并到期重置 5 小时、周、月限流 | | |API |* 上线Models API, 支持查询模型及模型特性 |[Responses API](/docs/create-model-responses-api) | \ | |* 上线文件管理接口Files API, 提供文件的上传、检索、列表查询及删除能力。 | | \ | |* Responses API 支持续写模式,控制和引导模型的输出 | | \ | |* 生视频模型支持离线推理:Content Generation API新增service tier和execution_expires_after参数,可以设置生视频模型的推理模式和推理超时时间 | | # 202510 |功能模块 |功能说明 |帮助文档 | |---|---|---| |体验中心 |* 完成语言、视觉、语音等模型体验的一致性优化,同时重点升级了模型选择切换、模型信息展示等功能,提升模型了解与体验效率 |[体验中心](https://ark.volcengine.com/region:cn-beijing/experience) | \ | | | | |模型精调 |* 模型精调创建页面交互优化 |[模型精调](https://ark.volcengine.com/region:cn-beijing/finetune) | \ | | | | |开通管理 |* 开通管理一键开通弹窗交互优化 |[开通管理](https://ark.volcengine.com/region:cn-beijing/openManagement) | \ |> 仅对火山方舟用户 | | | |API |* Responses API 支持私域知识库搜索 knowledge search |[Responses API](/docs/create-model-responses-api) | \ | | | | # 202509 |功能模块 |功能说明 |帮助文档 | |---|---|---| |API |* Seedance-1.0-pro 支持首尾帧 |[API](/docs/create-video-generation-task-api) | \ | | | | |模型广场 |* 优化了智能助手的回复质量与性能,截图提问增加快捷键支持 |[模型广场](/docs/foundation-models) | \ | |* Seedance 1.0 lite 模型详情页优化,增加参考图模型能力信息 | | |开通管理 |* 安心体验标识与关闭引导优化 |[开通管理](/docs/activation-management) | \ | | | | |模型推理 |* 生图模型支持查看推理接入点监控 |[模型推理](/docs/deployment-overview) | \ | |* 购买模型单元交互优化 | | |应用实验室 |* App builder上线 |[应用实验室](/docs/app-lab-overview) | \ | |* 应用实验室和我的应用页面优化 | | \ | |* 零代码应用支持开启Trace追踪功能,可实时查看单条请求的调试详情,并回溯近 7 天内的历史请求日志。 | | |模型推理 |* 模型下线交互优化 |[在线推理](/docs/online-inference) | \ | |* 生图模型支持设置接入点限流 | | \ | |* 模型单元支持一段时间无流量自动退订 | | |模型精调 |* 训练任务进度感知增强 |[模型精调](/docs/model-fine-tuning) | \ | |* 支持精调训练过程中手动导出过程产物,提前部署推理评测 | | |API |* 图片生成 API 支持 Seedream 4.0 |[API](/docs/api-key) | \ | |* 视频生成 API 支持返回尾帧 | | \ | |* Responses API 支持 MCP built-in tools | | \ | |* Seedance 1.0 lite 模型新增参考图参数,支持多图参考生视频功能 | | \ | |* Responses API SDK 支持 Python SDK | | |开通管理 |* 一键开通模型体验优化:新增全选/反选开关、安心体验、报错提醒等优化项 |[开通管理](/docs/activation-management) | \ | | | | # 202508 |功能模块 |功能说明 |帮助文档 | |---|---|---| |体验中心 |* 新增 SeedEdit 3.0L 图生图模型体验 |[体验中心](/docs/experience-center) | \ | |* Doubao-Seedance-1.0-lite-i2v 首尾帧支持1080p | | |API Key 管理 |* API Key增加可选配置功能“IP调用白名单” | [API Key 管理](/docs/manage-api-keys) | \ | | | | |用量统计 |* 接入点按照计费项拆分用量展示(模型单元,TPM保障包,按tokens分段计费) |[用量统计](/docs/usage-statistics) | \ | | | | |模型推理 |* 模型单元支持切换输入类型和计算器 |[在线推理](/docs/online-inference) | \ | |* 推理接入点创建页面整体改版 | | \ | |* 推理接入点监控优化,支持查看推理缓存相关指标;监控指标可分拆深度思考模型的请求中启用了 thinking 的请求速率和thinking tokens 数量 | | \ | |* TPM 保障包/模型单元支持新购、扩容过程中取消 | | \ | |* 支持查看模型单元资源率、单元数和 TPM 监控曲线 | | \ | |* Deepseek&Kimi-K2模型支持关闭内容安全护栏按钮 | | |模型精调 |* 支持快捷开通计费项 | | \ | | |[模型精调](/docs/model-fine-tuning) | |计费 |* TPM 保障包支持 Doubao-Seed-1.6、Doubao-Seed-1.6-flash 分段计费模型 |[TPM保障包](/docs/tpm-guarantee-package) | \ | | | | |用量统计 |* 支持查看文生图模型用量 | | \ | | |[用量统计](/docs/usage-statistics) | |应用实验室 |* 互动双语视频生成器原型应用更新。所使用的模型均已更新到最新的Doubao-Seed-1.6、Doubao-Seedance-1.0-pro、Doubao-Seedream-3.0-t2i |[应用实验室](/docs/app-lab-overview) | \ | | | | |API |* 查询视频生成任务列表 API 调整为返回近 7 天的数据 |[API 列表](/docs/install-and-upgrade-sdk?lang=zh) | \ | |* Doubao-Seedance-1.0-lite-i2v 首尾帧支持1080p | | \ | |* SeeDance-1.0-pro和SeeDance-1.0-lite 支持自定义 ratio 参数 | | \ | |* Responses API built-in tools - web_search 开启邀测 | | |Token 计算器 |* 支持和模型广场列表对齐的模型 tokens 计算,增加视觉模型的 Token 计算 |[token计算器](https://ark.volcengine.com/region:cn-beijing/tokenCalculator) | \ | | | | # 202507 |功能模块 |功能说明 |帮助文档 | |---|---|---| |模型广场 |* 体验优化 |[模型广场](/docs/foundation-models) | \ | | | | |体验中心 |* 体验图生视频交互体验优化 |[体验中心](/docs/language-models) | \ | |* 切换模型后保留历史对话的体验优化 | | \ | |* 控制台体验中心支持 MCP 体验 | | \ | |* 体验中心页面加载速度优化 | | |模型精调 |* 精调任务排队顺序展示优化 |[创建模型精调任务](/docs/fine-tuning-overview) | \ | |* 精调效果指标看板样式优化,分组聚合指标 | | |应用实验室 |* 智能导购支持 Doubao-Seed-1.6 |[应用实验室](/docs/app-lab-overview) | \ | |* 视频实时理解模型升级到 Doubao-Seed-1.6-flash | | \ | |* 上线移动端 SDK | | |模型推理 |* 使用视觉理解模型进行批量推理时支持传入视频文件 |[批量推理](/docs/batch-inference) | \ | |* LoRA 精调模型进行批量推理时,提示用户进行模型压缩 | | \ | |* 视频生成模型接入点监控看板优化 | | \ | |* Doubao1.5 视觉理解模型支持 TPM 保障包 | | |API Key管理 |* API Key 权限管理优化 |[API Key 管理](/docs/manage-api-keys) | \ | | | | |API |* 视频生成 API 响应参数增加更多元信息 |[视频生成 API](/docs/create-video-generation-task-api) | \ | |* bot API 支持 thinking 调节 | | \ | |* Context API 稳定性优化 | | \ | |* API Key 可限制访问特定预置模型服务及推理接入点(endpoint) | | \ | |* 多模态向量化模型 API 支持多图、多文本 & 视频输入 | | # 202506 |功能模块 |功能说明 |帮助文档 | |---|---|---| |模型广场 |* 模型广场 & 模型详情页优化 |[模型广场](/docs/foundation-models) | \ | | | | |体验中心 |* 支持视觉理解模型开启联网功能 |[体验中心](/docs/language-models) | \ | |* 支持体验 Doubao-Seedance-1.0-pro模型 | | \ | |* 支持体验 Doubao-Seedance-1.0-lite-i2v & Wan2.1-14B 首尾帧功能 | | \ | |* Doubao-Seedance1.0 lite 新增支持1080P分辨率 | | \ | |* 支持向量模型 | | \ | |* 支持知识问答 | | \ | |* 支持端到端实时语音模型 | | |应用实验室 |* DeepSearch 优化 |[应用实验室](/docs/app-lab-overview) | \ | |* 高代码应用支持通用 MCP | | |在线推理 |* 监控指标优化 |[在线推理](/docs/manage-inference-endpoints) | \ | | | | |批量推理 |* 视觉理解模型支持 base64 格式或可下载链接的图片 |批量推理 | \ | | | | |API |* 视频生成API |[视频生成](/docs/create-video-generation-task-api) | \ | | * 支持Doubao-Seedance-1.0-lite 首尾帧 | | \ | | * 支持Doubao-Seedance-1.0-pro模型调用 | | \ | | * Doubao-Seedance-1.0-lite 新增支持 1080P 分辨率 | | |模型计费 |* 模型计费升级 |[模型计费](/docs/model-pricing) | \ | | | | # 202505 |功能模块 |功能说明 |帮助文档 | |---|---|---| |概览页 |* 优化 2 分钟快速创建应用链路 | | \ | | | | |模型推理 |* 配置接入点告警时支持从方舟控制台配置通知策略 |[查看并管理推理接入点](/docs/manage-inference-endpoints) | \ | | | | |应用实验室 |* 自定义推理接入点的 thinking 模型支持开启联网内容插件 |[零代码应用操作指南](/docs/no-code-app-guide) | \ | | | | |API |* 对话(Chat)API 接口支持 JSON Schema |[结构化输出](/docs/structured-output-beta) | \ | | | | |开通管理 |* 推理限额及安心体验模式支持文本 embedding 模型 |[开通管理](/docs/activation-management) | \ | | | | # 202504 |功能模块 |功能说明 |帮助文档 | |---|---|---| |体验中心 |* 语音模型-语音合成-支持混音mix功能 |[体验中心](/docs/language-models) | \ | |* 支持一键开通所有模型、自动开通后续新增模型,实现 2 分钟快速接入的便捷式体验 | | |模型精调 |* 新增save_model_per_epoch参数,支持自定义精调产物保存间隔 | | \ | | | | |应用实验室 |* [火山引擎大模型生态广场](https://www.volcengine.com/mcp-marketplace) 已正式发布:目前已上线 100个 MCP Server,集成了丰富的火山引擎官方云服务及优质三方生态工具。支持用户快速跳转至火山方舟及其他支持 MCP 协议的平台(如 Trae、Cursor等),结合火山方舟大模型服务,快速进行端到端应用开发 |[高代码应用 创建部署指南](/docs/high-code-app-creation-and-deployment-guide) | \ | |* 零代码应用创建中,知识库引用切片数量支持最大500条 | | \ | |* 零代码 DeepSeek-R1、DeepSeek-V3 支持网页解析插件 | | \ | |* 高代码/零代码控制台体验时支持设置非流式输出 | | \ | |* 创建应用时推理接入点参数新增预置推理接入点,支持用模型名称接入 | | \ | |* 高代码智能体 Trace 追踪,并可进行可交互可视化的定位 | | \ | | * 日志服务TLS为火山方舟高代码应用用户提供**3个月专属免费额度**。详细说明:截止**2025年6月30日**,高代码应用日志服务-Trace分析处于推广阶段,推广期间每个火山引擎主账号下**享受每天10GiB的免费存储**权益,预估可存储**数万条请求分析**。 | | |模型推理 |* 可在推理接入点详情页监控一键配置接入点告警 |[查看并管理推理接入点](/docs/manage-inference-endpoints) | \ | |* 支持删除预置推理接入点 | | \ | |* 接入点列表支持按照购买方式过滤 | | \ | |* 接入点列表新增所属项目字段 | | \ | |* doubao1.5-vision-pro-32k 模型支持 function call | | |视频生成模型 |* 新增 seed 参数,用于控制生成内容的随机性。对于相同的请求,若使用相同的随机种子,将产生类似的视频生成结果 |[视频生成教程](/docs/video-generation-tutorial) | \ | |* ratio 参数新增可选项 9:21 | | # 202503 |功能模块 |功能说明 |帮助文档 | |---|---|---| |概览页 |* 极简首次接入模型流程,清晰了解各个功能菜单 | | \ | |* 自助式运维,覆盖服务监控、用量统计、安全监控、用户 top 关注问题指引 | | |体验中心 |* 支持上传文档、网页链接解析体验 |[体验中心](/docs/experience-center-overview) | \ | |* 可视化代码编辑模式,方便用户理解API调用,支持一键复制及跳转API key | | |用量统计 |* 支持查看汇总后的插件用量 |[用量统计](/docs/usage-statistics) | \ | |* 支持查看体验中心、预置推理接入点用量 | | |模型推理 |* 批量推理支持 doubao1.5-pro-vision |[模型推理](/docs/deployment-overview) | \ | |* DeepSeek-R1、DeepSeek-V3 支持 Function Call | | \ | |* temperature 参数范围扩展至[0, 2] | | \ | |* Chat API 流式输出支持返回每个 chunk 的 usage | | \ | |* 支持模型单元在下单、扩缩容失败时通过火山引擎消息通知服务接收告警信息 | | |应用实验室 |* 增加用FC实现全链路+非平台插件的demo |[应用实验室](/docs/no-code-app-guide) | \ | | * 车载专用品网店-智能导购 | | \ | |* AI手机助手上线 | | \ | | * 基于豆包-图像理解模型的同屏交互系统,专为移动端即时需求设计的创作中枢,用户在任意界面唤醒AI手机助手,支持AI帮写(可支持DeepSeek回答)、物体识别、实时翻译、日程添加、体检报告解读等。可扫码下载,目前仅支持安卓5.0及以上系统 | | |模型精调 |* 精调效果指标支持下载 | | \ | | | | |视觉理解模型 |* API中system_prompt支持传图:VLM的system_prompt支持list结构,可传text和image_url | | \ | |* 单次请求传入图片数量只受模型上下文长度的限制,可根据图片转换的token数判断 | | |视频生成模型 |* 视频生成模型API支持更多图片格式:JPEG(JPG)、PNG、webp、bmp、tiff | | \ | | | | # 202502 |功能模块 |功能说明 |帮助文档 | |---|---|---| |体验中心 |* 新增DeepSeek模型 |[体验中心](/docs/language-models) | \ | | | | |应用实验室 |* 零代码应用可使用deepseek模型且**支持联网能力** |[高代码应用 创建部署指南](/docs/high-code-app-creation-and-deployment-guide) | \ | |* 高代码智能体创建流程优化 | | \ | | * 创建应用 | | \ | | * 支持关联已有函数创建新的高代码应用 | | \ | | * 创建新应用函数 | | \ | | * 新增编排配置,提供示例工程可一键下载在vs code打开 | | \ | | * 新增推理接入点配置,可直接选择接入点 | | \ | | * 新增开通模型和插件扩展的快捷入口 | | \ | | * 支持一键跳转查看所关联云服务的计费说明 | | \ | | * 支持更换API访问密钥 | | |模型推理 |* 新增概念介绍 |批量推理 | \ | | * 基于推理的不同场景新增定价与计费介绍 | | \ | | * 新增批量推理任务和批量推理接入点介绍 | | |模型精调 |* 基于模型生命周期对模型精调进行管控和提示 |[模型精调](/docs/model-fine-tuning) | \ | | * 上线阶段,支持创建精调任务并推理 | | \ | | * 即将下线阶段,允许存量用户创建精调任务并推理 | | \ | | * 下线阶段,允许精调但仅支持按照单元计费方式使用 | | |开通管理 |* 定价展示支持K tokens(元/千tokens)和 M tokens(元/百万tokens)切换 |[开通管理](/docs/activation-management) | \ | | | | |安全 |* 安全审计页面优化 |[安全审计](/docs/console-fine-tuning-security-audit) | \ | | * 部分KMS访问日志支持查看requestid | | \ | | * 会话数据安全视图增加加密情况信息 | | \ | | * 应用层会话加密看板中增加统计时间和延迟的提示 | | # 202501 |功能模块 |功能说明 |帮助文档 | |---|---|---| |体验中心 |* VLM模型扩充上传图片格式,现支持JPEG,PNG,GIF,WEBP,BMP,DIB |[体验中心](/docs/language-models) | \ | |* 语音模型-声音复刻在“生成试听”过程中支持切换音色 | | \ | |* 语音模型-语音合成音色标签导航栏进行重构 | | \ | |* 语音模型-语音识别不同使用状态的交互提醒优化 | | |模型精调 |* FunctionCall精调数据格式支持parallel_tool_calls 字段 |[模型精调](/docs/fine-tuning-overview) | \ | |* 因为 unknown error 失败的精调任务允许 3次重试 | | |模型推理 |* 批量推理任务结束之后通过SNS平台发送通知 |[在线推理](/docs/manage-inference-endpoints) | \ | |* 批量推理允许超限 TPD 以低优继续运行 | | \ | |* 批量推理接入点接口调用支持python和java sdk | | |模型仓库 |* 模型仓库自定义模型增加「支持部署方式」字段,标记模型支持「独立部署」或「共享部署」 |[模型仓库](/docs/manage-custom-models) | \ | | | | |用量统计 |* 新增“批量推理”维度查看用量 |[用量统计](/docs/usage-statistics) | \ | | | | |数据集 |* 数据集支持dpo精调数据格式 |[数据集](/docs/dataset-introduction) | \ | | | | |安全 |* 在用量统计页面中增加异常日志汇总、异常日志趋势、安全能力配置状态等三个模块 |[图片理解](/docs/image-understanding) | \ | |* 可在VLM的接入点创建页面选择内容安全护栏方案,如果选择基础版,VLM API中可以返回风险分类原因 | | --- # 模型下线公告 2025 Source: https://ark.volcengine.com/region:cn-beijing/docs/model-deprecation-announcement-2025 ## 第五批模型下线说明 ### 下线计划 |节点 |时间 |**具体动作&影响** | |---|---|---| |**启动&通知** |2025-9-15 |方舟逐步下调模型配额。 | |**EOM** |2025-9-22 00:00:00(UTC+8) |用户无法新增接入点。 | \ |模型停止新购 | | | \ | | |:::tip | \ | | |建议提前切换至对应的替换模型,并测试验证新模型对业务的影响。 | \ | | |::: | |**EOS** |**2025-11-27 14:00**(UTC+8) |模型正式下线并残留接入点自动替换为新模型。 | \ |模型服务下线 | | | ### 下线模型 > **注意** > > 不同模型/版本支持的能力、API 参数、单价、任务中实际表现存在差异,迁移前请务必仔细阅读模型介绍,并进行必要评测,比较迁移前后模型的表现。 |**模型版本** |**建议迁移模型** |**到期未迁移,系统替换模型** | |---|---|---| |doubao-lite-32k-240828 |doubao-seed-1.6-flash-250828 |doubao-seed-1.6-flash-250828 | |doubao-pro-32k-241215 |doubao-seed-1-6-251015 |doubao-seed-1-6-251015 | |doubao-pro-32k/character-241215 |doubao-1-5-pro-32k/character-250715 |doubao-1-5-pro-32k/character-250715 | |doubao-pro-32k-browsing-241115 |doubao-seed-1-6-251015 |doubao-seed-1-6-251015 | |wan2-1-14b-i2v-250225 |doubao-seedance-1-0-pro-250528 |doubao-seedance-1-0-pro-250528 | |wan2-1-14b-flf2v-250417 |doubao-seedance-1-0-pro-250528 |doubao-seedance-1-0-pro-250528 | |wan2-1-14b-t2v-250225 |doubao-seedance-1-0-pro-250528 |doubao-seedance-1-0-pro-250528 | |deepseek-r1-250120 |deepseek-v3-1-250821 |deepseek-v3-1-250821 | |deepseek-v3-241226 |deepseek-v3-1-250821 |deepseek-v3-1-250821 | |kimi-k2-250711 |kimi-k2-250905 |kimi-k2-250905 | |doubao-1-5-pro-256k-250115 |doubao-seed-1-6-251015 |doubao-seed-1-6-251015 | ## 第四批模型下线说明 ### 下线计划 |**节点** |**时间** |**具体动作&影响** | |---|---|---| |**启动&通知** |2025年7月23日 |逐步下调模型配额。 | |**EOM** |2025年7月23日 |用户无法新增接入点。 | \ |模型停止新购 | | | \ | | |:::tip | \ | | |建议提前切换至对应的替换模型,并测试验证新模型对业务的影响。 | \ | | |::: | |**EOS** |2025年8月7日 |模型正式下线并残留接入点自动替换为新模型。 | \ |模型服务下线 | | | ### 下线模型 |**模型名称** |**建议迁移模型** |**到期未迁移,系统替换模型** | |---|---|---| |Moonshot-v1-128k |doubao-seed-1.6-250615 |关停 | \ | | | | \ | | |:::tip | \ | | |请提前切换模型,避免影响业务。 | \ | | |::: | |Moonshot-v1-32k |doubao-seed-1.6-250615 |关停 | \ | | | | \ | | |:::tip | \ | | |请提前切换模型,避免影响业务。 | \ | | |::: | |Moonshot-v1-8k |doubao-seed-1.6-250615 |关停 | \ | | | | \ | | |:::tip | \ | | |请提前切换模型,避免影响业务。 | \ | | |::: | ## 第三批模型下线说明 ### 下线计划 |**节点** |**时间** |**具体动作&影响** | |---|---|---| |**启动&通知** |2025年6月30日 |逐步下调模型配额。 | |**EOM** |2025年6月30日 |用户无法新增接入点。 | \ |模型停止新购 | | | \ | | |:::tip | \ | | |建议提前切换至对应的替换模型,并测试验证新模型对业务的影响。 | \ | | |::: | |**EOS** |2025年8月28日 |模型正式下线并残留接入点自动替换为新模型。 | \ |模型服务下线 | | | ### 下线模型 |**模型版本** |**建议迁移模型** |**到期未迁移,系统替换模型** | |---|---|---| |doubao-pro-32k-240828 |doubao-seed-1.6-250615 |doubao-1.5-pro-32k-250115 | |doubao-pro-32k-character-240828 |doubao-seed-1.6-250615 |doubao-1.5-pro-32k-character-250715 | |doubao-vision-pro-32k-241028 |doubao-seed-1.6-250615 |doubao-1.5-vision-pro-250328 | |doubao-vision-pro-32k-241215 |doubao-1.5-thinking-vision-pro-250428 |doubao-1.5-vision-pro-250328 | |doubao-vision-lite-32k-241015 |doubao-Seed-1.6-flash-250615 |doubao-1.5-vision-lite-250315 | |doubao-lite-32k-character-241015 |doubao-Seed-1.6-flash-250615 |doubao-lite-32k-character-250228 | |doubao-lite-4k-character-240828 |doubao-Seed-1.6-flash-250615 |doubao-lite-32k-character-250228 | |doubao-lite-128k-240828 |doubao-Seed-1.6-flash-250615 |doubao-1.5-lite-32k-250115 | |doubao-lite-128k-240428 |doubao-seed-1.6-flash-250615 |doubao-seed-1.6-flash-250615 | |doubao-pro-256k-241115 |doubao-seed-1.6-250615 |doubao-1.5-pro-256k-250115 | |doubao-pro-256k-240828 |doubao-seed-1.6-250615 |doubao-1.5-pro-256k-250115 | |doubao-pro-32k-functioncall-241028 |doubao-seed-1.6-250615 |doubao-1.5-pro-32k-250115 | |doubao-pro-32k-browsing-240828 |doubao-seed-1.6-250615 |doubao-pro-32k-browsing-241115 | |DeepSeek-r1-distill-qwen-32b-250120 |doubao-seed-1.6-250615 |doubao-seed-1.6-250615 | |DeepSeek-r1-distill-qwen-7b-250120 |doubao-Seed-1.6-flash-250615 |doubao-seed-1.6-flash-250615 | |doubao-embedding-text-240515 |doubao-embedding-vision-250615 |doubao-embedding-vision-250615(不强制切换) | |doubao-embedding-vision-241215 |doubao-embedding-vision-250615 |doubao-embedding-vision-250615(不强制切换) | |doubao-pro-32k-functioncall-preview |doubao-seed-1.6-250615 |doubao-1.5-pro-32k-250115 | |doubao-pro-32k-oracy-240928 |doubao-seed-1.6-250615 |doubao-1.5-pro-32k-250115 | |doubao-pro-32k-creation-241028 |doubao-seed-1.6-250615 |doubao-1.5-pro-32k-250115 | |doubao-1.5-thinking-pro-m-250415 |doubao-seed-1.6-250615 |doubao-seed-1.6-250615 | |doubao-1.5-vision-pro-32k-preview |doubao-seed-1.6-250615 |doubao-1.5-vision-pro-250328 | |doubao-1.5-thinking-pro-vision-250415 |doubao-seed-1.6-250615 |doubao-1.5-thinking-pro-m-250428 | |doubao-1.5-ui-tars-250328 |doubao-seed-1.6-250615 |doubao-1.5-ui-tars-250428 | |doubao-seaweed-241128 |doubao-Seedance-1.0-pro-250528 |关停 | \ | |doubao-Seedance-1.0-lite-i2v-250428 | | \ | |doubao-Seedance-1.0-lite-t2v-250428 | | ## 第二批模型下线说明 ### 下线计划 |节点 |时间 |**具体动作&影响** | |---|---|---| |**启动&通知** |2025年1月10日 |逐步下调模型配额。 | |**EOM** |2025年1月10日 |用户无法新增接入点。 | \ |模型停止新购 | | | \ | | |:::tip | \ | | |建议提前切换至对应的替换模型,并测试验证新模型对业务的影响。 | \ | | |::: | |**EOS** |2025年5月28日 |模型正式下线并残留接入点自动替换为新模型。 | \ |模型服务下线 | | | ### 下线模型 |**模型版本** |**建议迁移模型** |**到期未迁移,系统替换模型** | |---|---|---| |doubao-pro-32k-240615 |doubao-1.5-pro-32k-250115 |doubao-1.5-pro-32k-250115 | |doubao-pro-32k-character-240528 |doubao-1.5-pro-32k-character-250228 |doubao-1.5-pro-32k-character-250228 | |doubao-pro-128k-240628 |doubao-1.5-pro-32k-250115 |doubao-1.5-pro-32k-250115 | |doubao-lite-32k-240428 |doubao-1.5-lite-32k-250115 |doubao-1.5-lite-32k-250115 | |doubao-lite-32k-240628 |doubao-1.5-lite-32k-250115 |doubao-1.5-lite-32k-250115 | |doubao-lite-128k-240428 |doubao-1.5-pro-256k-250115 |doubao-1.5-pro-256k-250115 | |doubao-pro-4k-character-240728 |doubao-1.5-pro-32k-character-250228 |doubao-1.5-pro-32k-character-250228 | |doubao-pro-4k-functioncall-240615 |doubao-1.5-pro-32k-250115 |doubao-1.5-pro-32k-250115 | |doubao-pro-32k-functioncall-240515 |doubao-1.5-pro-32k-250115 |doubao-1.5-pro-32k-250115 | |doubao-pro-32k-functioncall-240815 |doubao-1.5-pro-32k-250115 |doubao-1.5-pro-32k-250115 | |doubao-pro-32k-browsing-240615 |doubao-pro-32k-browsing-241115 |doubao-pro-32k-browsing-241115 | |doubao-lite-4k-browsing-intent-240615 |doubao-lite-4k-browsing-intent-240828 |doubao-lite-4k-browsing-intent-240828 | |glm3-130b |方舟平台其他模型 |方舟平台其他模型 | |glm3-130b 金融模型 |方舟平台其他模型 |方舟平台其他模型 | ## --- # 高代码 SDK Arkitect 正式发布 Source: https://ark.volcengine.com/region:cn-beijing/docs/sdk-arkitect 高代码 SDK Arkitect 于北京时间 2025 年 01 月 16 日正式发布并开源,现诚邀各位开发者体验并加入大模型的生态建设! 火山方舟发布并开源了高代码 SDK Arkitect 与多个 AI 原型应用代码示例。借助高代码 SDK Arkitect 和 AI 原型应用代码示例,您能够快速开发和扩展匹配您业务场景的大模型相关应用。 * **高度定制化**: 提供高代码智能体编排方式,灵活服务客户高度定制化和自定义需求。 * **丰富优质的业务工具**: 面向企业客户提供高质量、有保障的业务工具,包括丰富的业务插件库与工具链,支持与先进的大模型进行组合串联,实现一个端到端解决问题的智能体应用。 * **一站式开发与托管服务**: 简化智能体部署和管理的流程,增强系统的稳定性。 * **安全可靠**: 提供方舟的安全加固实践,增强业务数据的安全性和保密性,减小数据泄漏或窃取风险。 * **AI 原型应用代码示例**:开发者可快速上手和扩展的示例,基于示例您可以按需进行定制化开发。 我们期待您的使用和参与,共同探索大模型应用的无限可能,推动 AI 技术的创新发展。 **相关链接** * 项目代码仓库请参见 [ GitHub](https://github.com/volcengine/ai-app-lab)。 * AI 原型应用代码示例请参见 [AI 应用 Demohouse](https://github.com/volcengine/ai-app-lab/tree/main/demohouse)。 * 如需在火山引擎 veFaaS 部署您的 AI 应用,请参考 [AI 应用创建部署指南](/docs/high-code-app-creation-and-deployment-guide)。 --- # 模型发布公告 2024 Source: https://ark.volcengine.com/region:cn-beijing/docs/model-release-announcement-2024 本文介绍了火山方舟大模型服务平台的新模型发布记录与特性,欢迎体验。 > 产品功能更新公告请见:[产品更新公告](/docs/product-update-announcements) # # 20241224 |模型提供方 |模型名称 |模型类型 |模型版本 |版本说明 |调用说明 | |---|---|---|---|---|---| |字节跳动 |Doubao-pro-32k |对话模型 |functioncall-241028 |版本更新 |相较functioncall-240815,函数调用能力显著提升18%,模型通用能力提升4.5%。调用指南请参考 [ChatCompletions-文本生成](/docs/text-generation)。 | |字节跳动 |Doubao-pro-32k |对话模型 |241215 |版本更新 |Doubao-pro-32k全面升级,相比240828版本,整体能力显著提升,其中总结摘要、信息抽取、文本分类、复杂流程、综合任务等能力显著大幅提升。调用指南请参考 [ChatCompletions-文本生成](/docs/text-generation)。 | |字节跳动 |Doubao-pro-32k |对话模型 |character-241215 |版本更新 |相比character-240828版本,角色扮演能力以及对话推进能力大幅提升。调用指南请参考 [ChatCompletions-文本生成](/docs/text-generation)。 | |字节跳动 |Doubao-pro-256k |对话模型 |241115 |版本更新 |相比Doubao-pro-128k-240628,长文任务效果显著提升10%以上,要点提取、字数遵循、多轮对话上文记忆等能力大幅提升。调用指南请参考 [ChatCompletions-文本生成](/docs/text-generation)。 | |字节跳动 |Doubao-pro-32k |对话模型 |browsing-241115 |版本更新 |模型本身不支持联网,需要配合联网插件使用。相比browsing-240828效果提升7%。调用指南请参考 [ChatCompletions-文本生成](/docs/text-generation)。 | |字节跳动 |Doubao-vision-pro-32k |视觉理解模型 |241028 |新发布 |整体效果显著。在中文OCR、文本+图表理解、数学问题等方面优势更加明显。调用指南请参考 [ChatCompletions-视觉理解](/docs/chat-api)。 | |字节跳动 |Doubao-vision-lite-32k |视觉理解模型 |241015 |新发布 |效果优势显著,极致性能与成本的视觉理解模型。调用指南请参考 [ChatCompletions-视觉理解](/docs/chat-api)。 | # 20241021 |模型提供方 |模型名称 |模型类型 |模型版本 |版本说明 |调用说明 | |---|---|---|---|---|---| |字节跳动 |Doubao-lite-32k |对话模型 |character-241015 |新发布 |基于Doubao-lite-4k-character-240828提升窗口长度,增加到32k,支持更长的system prompt与更长轮次的对话。调用指南请参考 [对话(Chat)-文本 API(文档已废弃)](/docs/text-generation) | # 20240930 **以下模型即将于2025.04.15下线** | | | | | | | | |**模型提供方** |**模型名称** |**模型版本** |**下线时间**
    |**实际下线时间**
    |**替代模型** | | |---|---|---|---|---|---|---| | | | | | | | | |字节跳动 |**Doubao-lite-32k** |240428 |2025年2月28日 |2025年4月15日 |Doubao-1.5-lite-32k-250115 | | |字节跳动 |**Doubao-lite-4k** |240328 |2025年2月28日 |2025年4月15日 |Doubao-1.5-lite-32k-250115 | | | |^^| |^^|^^| | | \ |字节跳动 | |character-240515 | | |Doubao-lite-32k-character-250228 | | |字节跳动 |**Doubao-pro-128k** |240515 |2025年2月28日 |2025年4月15日 |Doubao-1.5-pro-32k-250115 | | |字节跳动 |**Doubao-pro-32k** |240515 |2025年2月28日 |2025年4月15日 |Doubao-1.5-pro-32k-250115 | | |字节跳动 |**Doubao-pro-4k** |240515 |2025年2月28日 |2025年4月15日 |Doubao-1.5-pro-32k-250115 | | | |^^| |^^|^^| | | \ |字节跳动 | |browsing-240524 | | |Doubao-pro-32k-browsing-241115 | | | |^^| |^^|^^| | | \ |字节跳动 | |character-240515 | | |Doubao-1.5-pro-32k-character-250228 | | | |^^| |^^|^^| | | \ |字节跳动 | |functioncall-240515 | | |Doubao-1.5-pro-32k-250115 | | |字节跳动 |**Skylark3-lite-128k** |240428 |2025年2月28日 |2025年4月15日 |Doubao-lite-128k-240828 | | |字节跳动 |**Skylark3-lite-4k** |240328 |2025年2月28日 |2025年4月15日 |Doubao-1.5-lite-32k-250115 | | |字节跳动 |**Skylark3-pro-4k** |240415 |2025年2月28日 |2025年4月15日 |Doubao-1.5-pro-32k-250115 | | |字节跳动 |**Skylark2-lite-8k** |browsing-intent-240415 |2025年2月28日 |2025年4月15日 |Doubao-lite-4k-browsing-intent-240828 | | | |^^| |^^|^^|^^| | \ |字节跳动 | |browsing-intent-240615 | | | | | | |^^| |^^|^^|^^| | \ |字节跳动 | |1.0 | | | | | |字节跳动 |**Skylark2-lite-4k** | |2025年2月28日 |2025年4月15日 |Doubao-1.5-lite-32k-250115 | | |字节跳动 |**Skylark2-lite-character-8k** | |2025年2月28日 |2025年4月15日 |Doubao-lite-32k-character-250228 | | |字节跳动 |**Skylark2-pro-character-4k** |1.0 |2025年2月28日 |2025年4月15日 |Doubao-1.5-pro-32k-character-250228 | | | |^^| |^^|^^|^^| | \ |字节跳动 | |ecom-20240415 | | | | | |字节跳动 |**Skylark2-pro-32k** |1.0-1.1 |2025年2月28日 |2025年4月15日 |Doubao-1.5-pro-32k-250115 | | |字节跳动 |**Skylark2-pro-4k** |browsing |2025年2月28日 |2025年4月15日 |Doubao-pro-32k-browsing-241115 | | | |^^| |^^|^^| | | \ |字节跳动 | |browsing-240415 | | |Doubao-pro-32k-browsing-241115 | | | |^^| |^^|^^| | | \ |字节跳动 | |character-240328 | | |Doubao-1.5-pro-32k-character-250228 | | | |^^| |^^|^^| | | \ |字节跳动 | |1.2-1.3 | | |Doubao-1.5-pro-32k-250115 | | |字节跳动 |**Web-intent** |1.0 |2025年2月28日 |2025年4月15日 |Doubao-pro-32k-browsing-240828 | | |字节跳动 |**Skylark-Web** |2.2-0.0 |2025年2月28日 |2025年4月15日 |Doubao-pro-32k-browsing-241115 | | |字节跳动 |**Skylark-plus-public** |1.1 |2025年2月28日 |2025年4月15日 |Doubao-1.5-pro-32k-250115 | | |字节跳动 |**Skylark-pro-public** |2.0-2.1 |2025年2月28日 |2025年4月15日 |Doubao-1.5-pro-32k-250115 | | |字节跳动 |**Skylark-lite-public** |2.0-1.0-1.1-0.0 |2025年2月28日 |2025年4月15日 |Doubao-1.5-lite-32k-250115 | | |字节跳动 |**Skylark-chat** |1.0 |2025年2月28日 |2025年4月15日 |Doubao-1.5-pro-32k-250115 | | |字节跳动 |**llama3-70b** |llama3-70b-instruct |2025年4月1日 |2025年4月15日 |Doubao-1.5-pro-32k-250115 |原服务已关停 | |字节跳动 |**llama3-8b** |llama3-8b-instruct |2025年4月1日 |2025年4月15日 |Doubao-1.5-lite-32k-250115 |原服务已关停 | |字节跳动 |mistral-7b |instruct-v0.2 |2025年2月28日 |2025年4月15日 |Doubao-1.5-lite-32k-250115 |原服务已关停 | |字节跳动 |chatglm3-130-fin |v1.0-update |2025年2月28日 |2025年4月15日 | |原服务已关停 | |字节跳动 |chatglm3-130b-fc |v1.0 |2025年2月28日 |2025年4月15日 | |原服务已关停 | # 20240919 |模型提供方 |模型名称 |模型类型 |模型版本 |版本说明 |调用说明 | |---|---|---|---|---|---| |字节跳动 |Doubao-pro-32k |对话模型 |240828 |新发布 |对比240615版本,模型综合能力显著提升8%,尤其是文本分类、创作任务、总结摘要等能力上显著大幅提升。调用指南请参考 [对话(Chat)-文本 API(文档已废弃)](/docs/text-generation) | |字节跳动 |Doubao-lite-32k |对话模型 |240828 |新发布 |对比240628版本,模型综合能力显著提升12%,尤其是数学计算、代码、学科知识、推理能力等能力上显著大幅提升。 | |字节跳动 |Doubao-lite-128k |对话模型 |240828 |新发布 |模型全面升级,各项能力均显著强于当前线上240428版本。 | |字节跳动 |Doubao-pro-32k |对话模型 |character-240828 |新发布 |对比character-240528,角色扮演能力显著提升11%,对话推进能力显著增强。 | |字节跳动 |Doubao-lite-4k |对话模型 |character-240828 |新发布 |Doubao-lite系列角色扮演最强分支模型,能力大幅提升,接近Doubao-pro系列角色版本模型。 | |字节跳动 |Doubao-pro-32k |对话模型 |browsing-240828 |新发布 |相较browsing-240628在信息检索问答任务效果得到全面提升,回答更准确、更少冗余内容。 | |字节跳动 |Doubao-pro-32k |对话模型 |functioncall-240815 |新发布 |相较Doubao-pro-32k-functioncall-240515,函数调用能力显著提升11%,模型通用能力提升13%,接近通用模型水平。 | # 20240815 |模型提供方 |模型名称 |模型类型 |模型版本 |版本说明 |调用说明 | |---|---|---|---|---|---| |字节跳动 |Doubao-流式语音识别 |语音大模型 |240815 |新发布 |支持将长音频实时识别成文字,达到“边说话边出文字”的效果,适用于实时语音识别的场景,如实时会议字幕、直播字幕、智能外呼等。 调用指南请参考 [大模型流式语音识别API](https://docs.volcengine.com/docs/6561/1354869?lang=zh) | |字节跳动 |Doubao-录音文件识别 |语音大模型 |240815 |新发布 |支持将音频文件(≤4小时)转写成文本数据,内置自动标点、语义顺滑、数字规整、智能分句等功能,可根据需要任意搭配。适用于非实时的语音识别场景,如会议记录总结、智能外呼质检、课后教辅和学情分析等。调用指南请参考 [大模型录音文件识别](https://docs.volcengine.com/docs/6561/1354868?lang=zh) | # 20240806 | | | | | | | | |模型提供方 |模型名称 |模型类型 |模型版本 |版本说明 |调用说明 | | |---|---|---|---|---|---|---| | | | | | | | | |字节跳动 |Doubao-图生图模型-AIGC图像风格化 |视觉大模型 |240806 |新发布 |豆包图生图模型AIGC图像风格化是基于字节跳动视觉大模型打造的新一代图生图模型,生成图片与原图人脸相似度高,风格多样,效果精细,可广泛应用于互动娱乐、广告创意、辅助设计等场景。调用指南请参考 AIGC图像风格化API || # 20240715 | | | | | | | | |模型提供方 |模型名称 |模型类型 |模型版本 |版本说明 |调用说明 | | |---|---|---|---|---|---|---| | | | | | | | | |字节跳动 |Doubao-embedding |向量模型 |text-240715 |新发布 |语义向量化模型,中英文Retrieval效果较text-240515版本有较大提升,推荐使用该版本。向量维度 2560 维,支持 512, 1024, 2048 降维使用。调用指南请参考 [Embeding](/docs/multimodal-vectorization-api#doubao-embedding-%E6%A8%A1%E5%9E%8B%E8%B0%83%E7%94%A8%E7%A4%BA%E4%BE%8B%E4%BB%A3%E7%A0%81) || # 20240711 **以下模型即将于2024.8.20下线** |模型提供方 |模型名称 |模型类型 |模型版本 |版本说明 |调用说明 | |---|---|---|---|---|---| |字节跳动 |Skylark2-pro-4k |对话模型 |V1.0-v1.100-V1.1-V1.2 |弃用 |豆包大模型能力全面提升,请在 [方舟2.0](https://ark.volcengine.com/region:cn-beijing/model?projectName=default) | \ | | | | | |接入 [Doubao-pro-32k](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-pro-32k) 模型服务 | |字节跳动 |Skylark2-pro-character-4k |对话模型 |v1.0-V1.1 |弃用 |豆包大模型能力全面提升,请在 [方舟2.0](https://ark.volcengine.com/region:cn-beijing/model?projectName=default) | \ | | | | | |接入 [Doubao-pro-32k](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-pro-32k) 模型服务character版本 | |字节跳动 |Skylark2-pro-32k |对话模型 |V1.0-V1.1-V1.2 |弃用 |豆包大模型能力全面提升,请在 [方舟2.0](https://ark.volcengine.com/region:cn-beijing/model?projectName=default) | \ | | | | | |接入 [Doubao-pro-32k](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-pro-32k) 模型服务 | |字节跳动 |Skylark2-pro-turbo-8k |对话模型 |V1.0 |弃用 |豆包大模型能力全面提升,请在 [方舟2.0](https://ark.volcengine.com/region:cn-beijing/model?projectName=default) | \ | | | | | |接入 [Doubao-pro-32k](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-pro-32k) 模型服务 | |字节跳动 |Skylark2-lite-8k |对话模型 |V1.0 |弃用 |豆包大模型能力全面提升,请在 [方舟2.0](https://ark.volcengine.com/region:cn-beijing/model?projectName=default) | \ | | | | | |接入 [Doubao-lite-32k](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-lite-32k) 模型服务 | |字节跳动 |Skylark-lite |对话模型 |V1.0-V1.1-V2.0 |弃用 |豆包大模型能力全面提升,请在 [方舟2.0](https://ark.volcengine.com/region:cn-beijing/model?projectName=default) | \ | | | | | |接入 [Doubao-lite-32k](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-lite-32k) 模型服务 | |字节跳动 |Skylark-pro |对话模型 |V1.0-V1.1-V2.0 |弃用 |豆包大模型能力全面提升,请在 [方舟2.0](https://ark.volcengine.com/region:cn-beijing/model?projectName=default) | \ | | | | | |接入 [Doubao-pro-32k](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-pro-32k) 模型服务 | |字节跳动 |Skylark-chat(豆包同款) |对话模型 |V1.0 |弃用 |豆包大模型能力全面提升,请在 [方舟2.0](https://ark.volcengine.com/region:cn-beijing/model?projectName=default) | \ | | | | | |接入 [Doubao-pro-32k](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-pro-32k) 模型服务 | |字节跳动 |Skylark-plus |对话模型 |V1.0-V1.1 |弃用 |豆包大模型能力全面提升,请在 [方舟2.0](https://ark.volcengine.com/region:cn-beijing/model?projectName=default) | \ | | | | | |接入 [Doubao-pro-32k](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-pro-32k) 模型服务 | # 20240628 |模型提供方 |模型名称 |模型类型 |模型版本 |版本说明 |调用说明 | |---|---|---|---|---|---| |字节跳动 |Doubao-pro-128k |对话模型 |240628 |新发布 |截止发布时间效果最好的长文模型,适合处理复杂任务,在参考问答、总结摘要、创作、文本分类、角色扮演等场景都有很好的效果。支持128k上下文窗口的推理。调用指南请参考 [ChatCompletions](/docs/text-generation) | |字节跳动 |Doubao-lite-32k |对话模型 |240628 |新发布 |拥有极致的响应速度,更好的性价比,为客户不同场景提供更灵活的选择。支持32k上下文窗口的推理和精调,调用指南请参考 [ChatCompletions](/docs/text-generation) | # 20240625 |模型提供方 |模型名称 |模型类型 |模型版本 |版本说明 |调用说明 | |---|---|---|---|---|---| |字节跳动 |Doubao-声音复刻 |语音大模型 |240625 |新发布 |豆包声音复刻大模型是使用全新自研语音大模型算法打造的高效化的轻量级音色定制方案。用户在开放环境中,仅需录制秒级别音频,即可快速拥有专属AI定制音色。可应用于视频创作、数字人驱动、语音助手等多种场景。调用指南请参考 [声音复刻API](https://docs.volcengine.com/docs/6561/1305191?lang=zh) | |字节跳动 |Doubao-语音合成 |语音大模型 |240625 |新发布 |依托新一代大模型能力,豆包语音合成大模型能够根据上下文,智能预测文本的情绪、语调等信息。并生成超自然、高保真、个性化的语音,以满足不同用户的个性化需求。相较于传统语音合成技术,豆包语音合成大模型能输出在自然度、音质、韵律、气口、情感、语气词表达等方面更像真人。调用指南请参考 [大模型语音合成API](https://docs.volcengine.com/docs/6561/1257584?lang=zh) | |字节跳动 |豆包-文生图模型-智能绘图 |视觉大模型 |240625 |新发布 |豆包文生图模型智能绘图是基于字节跳动视觉大模型打造的新一代文生图模型,根据垂类场景,提供多种服务。生图风格多样,安全性极高,可广泛应用于教育、娱乐、办公等场景。调用指南请参考智能绘图API | # 20240615 |模型提供方 |模型名称 |模型类型 |模型版本 |版本说明 |调用说明 | |---|---|---|---|---|---| |字节跳动 |Doubao-pro-32k |对话模型 |240615 |新发布 |截止发布时间效果最好的主力模型,适合处理复杂任务,在参考问答、总结摘要、创作、文本分类、角色扮演等场景都有很好的效果。支持32k上下文窗口的推理和精调。调用指南请参考 [ChatCompletions](/docs/text-generation) | |字节跳动 |Doubao-pro-32k |对话模型 |browsing-240615 |新发布 |截止发布时间效果最好的主力模型,适合处理复杂任务,在参考问答、总结摘要、创作、文本分类、角色扮演等场景都有很好的效果。支持32k上下文窗口的推理和精调。调用指南请参考 [ChatCompletions](/docs/text-generation) | # 20240515 |模型提供方 |模型名称 |模型类型 |模型版本 |版本说明 |调用说明 | |---|---|---|---|---|---| |字节跳动 |Doubao-pro-4k |对话模型 |240515 |新发布 |截止发布时间效果最好的主力模型,适合处理复杂任务,在参考问答、总结摘要、创作、文本分类、角色扮演等场景都有很好的效果。支持4k上下文窗口的推理和精调。调用指南请参考 [ChatCompletions](/docs/text-generation) | |字节跳动 |Doubao-pro-4k |对话模型 |character-240515 |新发布 |截止发布时间效果最好的主力模型,适合处理复杂任务,在参考问答、总结摘要、创作、文本分类、角色扮演等场景都有很好的效果。支持4k上下文窗口的推理和精调。在角色扮演等场景有很好的效果。调用指南请参考 [ChatCompletions](/docs/text-generation) | |字节跳动 |Doubao-pro-4k |对话模型 |functioncall-240515 |新发布 |截止发布时间效果最好的主力模型,适合处理复杂任务,在参考问答、总结摘要、创作、文本分类、角色扮演等场景都有很好的效果。支持4k上下文窗口的推理和精调。functioncall模型,在工具调用等场景有很好的效果。 调用指南请参考 [ChatCompletions](/docs/text-generation) | |字节跳动 |Doubao-pro-32k |对话模型 |240515 |新发布 |截止发布时间效果最好的主力模型,适合处理复杂任务,在参考问答、总结摘要、创作、文本分类、角色扮演等场景都有很好的效果。支持32k上下文窗口的推理和精调。调用指南请参考 [ChatCompletions](/docs/text-generation) | |字节跳动 |Doubao-pro-128k |对话模型 |240515 |新发布 |截止发布时间效果最好的主力模型,适合处理复杂任务,在参考问答、总结摘要、创作、文本分类、角色扮演等场景都有很好的效果。支持128k上下文窗口的推理和精调。,调用指南请参考 [ChatCompletions](/docs/text-generation) | |字节跳动 |Doubao-lite-4k |对话模型 |240328 |新发布 |拥有极致的响应速度,更好的性价比,为客户不同场景提供更灵活的选择。支持4k上下文窗口的推理和精调,调用指南请参考 [ChatCompletions](/docs/text-generation) | |字节跳动 |Doubao-lite-4k |对话模型 |character-240515 |新发布 |拥有极致的响应速度,更好的性价比,为客户不同场景提供更灵活的选择。支持4k上下文窗口的推理和精调。在角色扮演等场景有更极致的性价比。调用指南请参考 [ChatCompletions](/docs/text-generation) | |字节跳动 |Doubao-lite-32k |对话模型 |240428 |新发布 |拥有极致的响应速度,更好的性价比,为客户不同场景提供更灵活的选择。支持32k上下文窗口的推理和精调。调用指南请参考 [ChatCompletions](/docs/text-generation) | |字节跳动 |Doubao-lite-128k |对话模型 |240428 |新发布 |拥有极致的响应速度,更好的性价比,为客户不同场景提供更灵活的选择。支持128k上下文窗口的推理和精调。调用指南请参考 [ChatCompletions](/docs/text-generation) | |字节跳动 |Doubao-embedding |向量模型 |text-240515 |新发布 |语义向量化模型,主要面向向量检索的使用场景,支持中、英双语,最长 4K 上下文长度。调用指南请参考 [Embeddings](/docs/multimodal-vectorization-api) | |智谱AI |GLM3-130B |对话模型 |v1.0 |新发布 |模型支持function call能力。调用指南请参考 [ChatCompletions](/docs/text-generation) | |智谱AI |GLM3-130B金融版 |对话模型 |v1.0-update |新发布 |基于智谱AI的基座大模型GLM3-130B,经海量金融数据集精调联合打造的垂直领域大模型,具备金融领域的常识知识和认知能力,可更好地为金融机构发挥效力。调用指南请参考 [ChatCompletions](/docs/text-generation) | |Meta |Llama3-8B |对话模型 |instruct |新发布 |Llama3-8B 版本拥有 80 亿参数,支持 8k 上下文,适用于英文场景的互动对话、信息获取、协助创作等任务。调用指南请参考 [ChatCompletions](/docs/text-generation) | |Meta |Llama3-70B |对话模型 |instruct |新发布 |Llama3-70B 版本拥有 700 亿参数,支持 8k 上下文,适用于英文场景的互动对话、信息获取、协助创作等任务。调用指南请参考 [ChatCompletions](/docs/text-generation) | |Mistral AI |Mistral-7B |对话模型 |instruct-v0.2 |新发布 |Mistral-7B 版本拥有 70 亿参数,支持 32K 上下文,适用于多种场景的自然语言处理任务,如问答系统、机器翻译、文本摘要等。调用指南请参考 [ChatCompletions](/docs/text-generation) | # 20240418 |模型提供方 |模型名称 |模型类型 |模型版本 |版本说明 |调用说明 | |---|---|---|---|---|---| |字节跳动 |Skylark2-pro-character-4k(已于20240820下线) |对话模型 |V1.1 |版本更新 |- | |字节跳动 |Skylark2-pro-32k(已于20240820下线) |对话模型 |V1.2 |版本更新 |- | # 20240222 |模型提供方 |模型名称 |模型类型 |模型版本 |版本说明 |调用说明 | |---|---|---|---|---|---| |字节跳动 |Skylark2-pro-4k(已于20240820下线) |对话模型 |V1.2 |版本更新 |- | |字节跳动 |Skylark2-pro-turbo-8k(已于20240820下线) |对话模型 |V1.0 |新发布 |- | # 20240202 |模型提供方 |模型名称 |模型类型 |模型版本 |版本说明 |调用说明 | |---|---|---|---|---|---| |字节跳动 |Skylark2-pro-32k(已于20240820下线) |对话模型 |V1.1 |版本更新 |- | # 20240115 |模型提供方 |模型名称 |模型类型 |模型版本 |版本说明 |调用说明 | |---|---|---|---|---|---| |字节跳动 |Skylark2-pro-32k(已于20240820下线) |对话模型 |V1.0 |新发布 |- | # 20240112 |模型提供方 |模型名称 |模型类型 |模型版本 |版本说明 |调用说明 | |---|---|---|---|---|---| |字节跳动 |Skylark2-pro-4k(已于20240820下线) |对话模型 |V1.1 |版本更新 |- | |字节跳动 |Skylark2-lite-8k(已于20240820下线) |对话模型 |V1.0 |新发布 |- | # 20240102 |模型提供方 |模型名称 |模型类型 |模型版本 |版本说明 |调用文档 | |---|---|---|---|---|---| |字节跳动 |Skylark2-pro-character-4k(已于20240820下线) |对话模型 |v1.0 |新发布 |- | # 20231228 |模型提供方 |模型名称 |模型类型 |模型版本 |版本说明 |调用文档 | |---|---|---|---|---|---| |字节跳动 |Skylark2-pro-4k(已于20240820下线) |对话模型 |v1.100 |版本更新 |- | # 20231225 |模型提供方 |模型名称 |模型类型 |模型版本 |版本说明 |调用文档 | |---|---|---|---|---|---| |字节跳动 |Skylark2-pro-32k(已于20240820下线) |对话模型 |V1.0 |新发布 |- | # 20231205 |模型提供方 |模型名称 |模型类型 |模型版本 |版本说明 |调用文档 | |---|---|---|---|---|---| |字节跳动 |Skylark2-pro-4k(已于20240820下线) |对话模型 |V1.0 |新发布 |- | # 20231114 |模型提供方 |模型名称 |模型类型 |模型版本 |版本说明 |调用文档 | |---|---|---|---|---|---| |月之暗面 |Moonshot-v1-32K |对话模型 |V1.0 |新发布 |[Moonshot-v1-32K API 调用指南](/docs/chat-api) | |月之暗面 |Moonshot-v1-128K |对话模型 |V1.0 |新发布 |[Moonshot-v1-128K API 调用指南](/docs/chat-api) | # 20231020 |模型提供方 |模型名称 |模型类型 |模型版本 |版本说明 |调用文档 | |---|---|---|---|---|---| |月之暗面 |Moonshot-v1-8K |对话模型 |V1.0 |新发布 |[Moonshot-v1-8K API 调用指南](/docs/chat-api) | # 20231018 |模型提供方 |模型名称 |模型类型 |模型版本 |版本说明 | |---|---|---|---|---| |字节跳动 |Skylark-lite(已于20240820下线) |对话模型 |V2.0 |大版本更新,上下文长度支持8K,模型能力全面提升 | |字节跳动 |Skylark-pro(已于20240820下线) |对话模型 |V2.0 |大版本更新,上下文长度支持4K,模型能力全面提升 | # 20230926 (排名不分先后) |模型提供方 |模型名称 |模型类型 |模型版本 |版本说明 | |---|---|---|---|---| |智谱AI |ChatGLM2-Pro |对话模型 |V1.0 |新发布 | |字节跳动 |Skylark-chat(豆包同款)(已于20240820下线) |对话模型 |V1.0 |新发布 | # 20230908 (排名不分先后) |模型提供方 |模型名称 |模型类型 |模型版本 |版本说明 | |---|---|---|---|---| |字节跳动 |Skylark-lite(已于20240820下线) |对话模型 |V1.1 |优化语言、知识、学习和风险判断能力 | |字节跳动 |Skylark-plus(已于20240820下线) |对话模型 |V1.1 |增加了 fewshot 遵循,减少重复问题,增强代码能力等 | |字节跳动 |Skylark-pro(已于20240820下线) |对话模型 |V1.1 |增加了 fewshot 遵循,减少重复问题,增强代码能力等 | # 20230806 (排名不分先后) |模型提供方 |模型名称 |模型类型 |模型版本 |版本说明 | |---|---|---|---|---| |澜舟科技 |Mengzi-GPT(已于20240301下线) |对话模型 |V1.0 |- | |字节跳动 |Skylark-lite(已于20240820下线) |对话模型 |V1.0 |新发布 | |字节跳动 |Skylark-plus(V1.0已于20240219下线) |对话模型 |V1.0 |- | |字节跳动 |Skylark-pro(已于20240820下线) |对话模型 |V1.0 |新发布 | |出门问问 |序列猴子(已于20240202下线) |对话模型 |V1.0 |- | # 20230628 (排名不分先后) |模型提供方 |模型名称 |模型类型 |模型版本 |版本说明 | |---|---|---|---|---| |智谱AI |ChatGLM-130B |对话模型 |V1.0 |新发布 | |智谱AI |ChatGLM-6B |对话模型 |V1.0 |新发布 | |MiniMax |MiniMax-abab5.5 |对话模型 |V1.0 |新发布 | |百川智能 |baichuan-7B |对话模型 |V1.0 |新发布 | |Databricks |Dolly-V2-12B |对话模型 |V1.0 |新发布 | --- # 产品更新公告 2024 Source: https://ark.volcengine.com/region:cn-beijing/docs/product-update-announcement-2024 本文介绍了火山方舟大模型服务平台的新版本产品功能特性,欢迎体验。 > 模型更新信息请见:[模型发布公告](/docs/model-release-announcement) # # 20241231 | | | | |功能模块 |功能说明 |帮助文档 | |---|---|---| | | | | |模型广场 |* 优化选择模型弹框在交互和时延上的体验 |[模型广场](/docs/foundation-models) | \ | | | | |体验中心 |* 视频生成体验迭代优化: |[体验中心](/docs/language-models) | \ | | * 任务在发送后的等待生成过程中支持撤回终止,支持展示任务ID | | \ | |* 文本模型体验迭代优化: | | \ | | * prompt优化基座模型更新为doubao-pro-32k-240828 | | |模型推理 |* 模型接入点功能升级,包括: |[在线推理](/docs/manage-inference-endpoints) | \ | | * 无法在即将退役的模型版本上继续创建接入点 | | \ | |* 可监控性增强,包括: | | \ | | * 支持项目维度的 TPM/RPM 实际使用率统计 | | |模型精调 |* 需要模型单元推理的精调任务增加资源配额提示 |[模型精调](/docs/fine-tuning-overview) | \ | |* FunctionCall分支模型支持使用含FunctionCall样本训练集进行SFT精调 | | \ | |* 提供精调效果指标 OpenAPI | | |Prompt优解 |* 新增Prompt优解模块,包括Prompt生成、调优及管理功能,为用户提供辅助Prompt优化的自动化一站式解决方案 |[Prompt优解](/docs/promptpilot-overview) | \ | | | | |智能体 |* 新增互动双语视频生成器原型应用,[体验](https://ark.volcengine.com/region:cn-beijing/assistant/detail?id=bot-20241211162948-5l2kk-procode-preset&projectName=default) |[智能体中心](/docs/no-code-app-guide) | \ | | | | |数据集 |* 支持预览数据集内容和下载数据集文件,提供更强的数据管理能力 |[数据集](/docs/dataset-introduction) | \ | |* 支持上传含FunctionCall 样本的SFT精调格式数据文件 | | |安全 |* 在用量统计页面中,增加存在安全风险的接入点的汇总展示 |[推理安全审计](/docs/console-inference-security-audit) | \ | |* 在推理安全审计页面中,重构接入点登录日志,展示登录IP及对应登录次数,帮助用户判断是否有非预期IP登录自己的接入点 | | | | | | |^^| | | \ | |* 会话端到端加密Python SDK支持API-Key鉴权方式 |[推理会话数据应用层加密方案](/docs/application-layer-encryption-for-inference-session-data) | | | | | # 20241213 | | | | |功能模块 |功能说明 |帮助文档 | |---|---|---| | | | | |体验中心 |* 图片内容理解模型体验优化迭代,包括: |[体验中心](/docs/language-models) | \ | | * 展示tokens数量,包括输入框中显示总tokens值,和在每轮对话中提示消耗tokens值 | | \ | | * 支持用户根据使用场景选择vlm模型的高细节理解或低细节理解模式 | | \ | | * 在上传图片方式中增加“URL上传”,用户可直接复制图片URL后导入输入框 | | |模型推理 |* 批量推理任务支持重启 |[在线推理](/docs/manage-inference-endpoints) | \ | |* 批量推理支持Doubao-lite-32k|240828 | | \ | |* 支持通过创建接入点进行批量推理(需填写工单申请使用) | | \ | | * 提供一种相比在线访问几乎无改造量的批量推理接入方式 | | \ | | * 用户无需处理数据,通过平台提供的SDK直接调用模型接口实现批量推理 | | |用量统计 |* 用量统计通过OpenAPI形式支持,客户可以通过GetUsage发起调试查看用量数据 |[用量统计](/docs/usage-statistics) | \ | | | | |安全与信任 |* 会话数据应用层端到端加密支持VLM模型 |[推理会话数据应用层加密方案](/docs/application-layer-encryption-for-inference-session-data) | \ | | | | | | | | |^^| | | \ | |* 在接入点安全审计页面中,展示会话数据加密/未加密状态 |[审计日志API文档](/docs/list-audit-logs-api?lang=zh) | \ | |* 在数据协作计划产品界面和用户协议中透出安全方案 | | \ | |* 优化推理和精调安全审计界面的监控看板 | | | | | | # 20241126 | | | | |功能模块 |功能说明 |帮助文档 | |---|---|---| | | | | |体验中心 |* 文本模型界面功能升级,包括: |[体验中心](/docs/language-models) | \ | | * 支持AI自动总结标题 | | \ | | * 支持返回“体验中心首token延迟时间”,直观对比各模型推理延迟 | | \ | | * 优化长文本场景下体验(输入框和页面新增滑动条,输出侧新增“一键回底部”按钮) | | \ | |* 图片内容理解模型(该模型需 [填写工单](/docs/product-update-announcements) 申请试用)体验优化迭代,包括: | | \ | | * 支持至多50张图片的上传体验(实际上限以图片所占用的上下文窗口为准) | | \ | | * 支持将图片直接复制粘贴至输入框 | | \ | | * 页面提供丰富场景示例,支持一键发送体验 | | \ | |* 视觉模型界面功能升级,AI视频生成结果支持视图切换及筛选 | | |在线推理 |* 支持 Doubao-lite 系列模型购买并开通 TPM 保障包,该保障包为高流量业务提供资源保障,适用于大流量、流量大小可预估且对生产级高 SLA 有要求的场景 |[在线推理](/docs/manage-inference-endpoints) | \ | | | | |智能体 |* 旧版联网插件(基础版、plus版、pro版)支持一键升级为新版联网内容插件。原联网基础版、联网plus版、联网pro版插件将于**2024年12月24日18:00**下线 |[智能体中心](/docs/no-code-app-guide) | \ | |* 零代码智能体功能迭代与体验优化,包括: | | \ | | * 零代码智能体的rerank重排默认链路调整 | | \ | | * 支持用户在零代码智能体中使用图片内容理解模型上传图片或图片链接进行问答 | | \ | | * 零代码群聊智能体支持以API参数的方式动态进行角色和场景配置优化智能体 API 调用示例,展示了多种语言版本,支持智能体的快速调用 | | | | | | |^^| | | \ | |* 新版联网内容插件进行了全方位升级,丰富内容源并实现链路优化,与最新豆包大模型配合使用效果提升。原联网基础版、联网plus版、联网pro版插件将于2024年12月24日18:00起停止服务,不再支持调用。更多信息详见 [联网内容插件功能说明](/docs/online-content-plugin-guide),如有任何问题,请随时联系我们。 |[服务组件库](/app/app-lab/service-component-library) | \ | |* 网页解析插件升级,支持word、excel等更多格式 | | | | | | |数据集 |* 新增 文本向量化-SFT精调 数据格式 |[数据集](/docs/dataset-introduction) | \ | |* 优化数据格式组织方式,更清晰地展示各数据格式的用途 | | |安全与信任 |* 在线推理和模型精调的安全审计页面和审计日志API更新: |[审计日志API文档](/docs/list-audit-logs-api?lang=zh) | \ | | * 沙箱连接日志区分连接状态 | | \ | | * 增加通过主机堡垒机登录沙箱的日志 | | \ | | * 沙箱登录日志,新增字段透出沙箱的登录方式,帮助用户定位是否是违规登录 | | # 20241029 |功能模块 |功能说明 |帮助文档 | |---|---|---| |模型推理 |* 优化推理接入点监控面板,展示推理接入点的全局运行情况,新增TPM、RPM及成功率等指标 |[在线推理(常规)](/docs/online-inference-standard) | \ | |* 推理接入点详情页可展示关联智能体的信息,并支持通过该页面快速创建智能体 | | |智能体 |零代码智能体发布后,支持查看其调用统计数据,包括智能体调用量、智能体调用tokens数以及插件调用量指标 |[应用实验室](/docs/app-lab-overview) | |安全与信任 |在精调或创建数据集过程中:当用户选择上传数据集时,平台为该数据集自动开启SSE-TOS加密,保证数据在TOS密文存储,更安全;当用户选择从TOS导入时,引导用户为该数据集自行开启SSE-TOS加密 |- | |数据集 |* 数据集模块对全量用户开放可见 |[共享数据集](/docs/shared-datasets) | \ | | * 支持模型精调使用数据集 | | \ | | * 支持数据集版本管理功能 | | \ | | * 支持数据集共享能力 | | # 20241015 | | | | |功能模块 |功能说明 |帮助文档 | |---|---|---| | | | | |模型广场 |在Doubao-pro聚合页新增256k模型 |[模型广场](/docs/foundation-models) | |体验中心 |长输入文本情况下交互体验优化,默认定位到输出内容 |[语言模型](/docs/language-models) | |智能体 |上线 ASR+LLM+TTS 官方智能体demo,如需获取最佳实践可 [联系我们](/docs/product-update-announcements) |[应用实验室](/docs/app-lab-overview) | |服务组件库 |插件新增抖音百科内容源 |联网系列功能说明 | |模型推理 |支持批量推理输入文件大小配额提升,可以 [提交工单](/docs/product-update-announcements) 申请更大的文件大小上限(最大 8 GiB) |[在线推理(常规)](/docs/online-inference-standard) | |安全与信任 |审计日志 API 支持精调相关日志 |[安全管理总览](/docs/security-management-overview) | | | | | |^^| | | \ | |* 精调流程安全可视化: |- | \ | | * 精调任务详情页面中增加安全审计 tab 页,展示精调数据流程图和精调安全日志,增加安全可信度 | | \ | | * 精调任务列表页面增加安全沙箱标识,点击后可查看精调安全技术演示动画,帮助用户理解精调数据流转路径中的安全概念 | | | | | | # 20240924 |功能模块 |功能说明 |帮助文档 | |---|---|---| |体验中心 |* 体验中心「语音模型」新增语音识别(支持方言)体验能力,可上传音频文件或实时录音识别语音 |[语言模型](/docs/language-models) | \ | |* 体验中心「语音模型」新增同声传译体验,支持中文与英文的同声传译,其中译文音色为复刻声音 | | \ | |* 体验中心「视觉模型」新增AI视频体验,支持图片生成视频与文本生成视频 | | \ | |* 体验中心「视觉模型」新增文生图的模型体验,支持文本生成图片 | | |智能体 |* 上线长期记忆官方智能体demo |[应用实验室](/docs/app-lab-overview) | \ | | | | |模型推理 |* 支持同一个推理接入点上平滑切换模型版本 |[在线推理(常规)](/docs/online-inference-standard) | \ | | | | # 20240914 |功能模块 |功能说明 |帮助文档 | |---|---|---| |新用户引导 |在模型精调、模型仓库、模型评测、在线推理、批量推理等页面上方,新增模块介绍和引导 |- | |模型广场 |模型详情页优化,更清晰展示版本特性、价格、快捷操作入口等,并新增同类模型的聚合页 |[模型广场](/docs/foundation-models) | |体验中心 |同一模型的多个对话体验,可各自设置独立的参数配置 |[语言模型](/docs/language-models) | |智能体 |新增零代码智能体system prompt优化功能,支持用户一键快速优化并降低编写门槛 |[应用实验室](/docs/app-lab-overview) | \ | |智能体提示词system prompt最大长度限制升级扩展到10000字 | | \ | |联网系列插件三合一升级为联网内容插件,新用户可在零代码智能体中使用。支持联网和内容源按需选择且支持与知识库混合使用。插件开通后,即可赠送每月2万次联网资源的免费额度,头条、天气等内容源资源按使用量后付费。 | | |模型评测 |自动评测增加裁判员模型评测 |模型评测体系介绍 | \ | |支持xls、xlsx格式评测集上传以及结果批量导出 | | |在线推理 |模型单元改为实例型独占资源模式,支持按小时付费 |[在线推理(常规)](/docs/online-inference-standard) | |安全与信任 |安全审计日志API新增功能:支持按时间筛选日志,新增返回风险等级和日志细节等信息 |[安全管理总览](/docs/security-management-overview) | \ | |ChatCompletions接口的审核支持 n 参数:当模型的 n 路 response 同时送审时,只针对被拦截的 response 进行拒答文案替换,其余 response 正常放行 | | # 20240903 |功能模块 |功能说明 |帮助文档 | |---|---|---| |模型广场 |新增模型广场厂商视图,更清晰地展示同一厂商的模型家族全貌及各模型的结构化信息 |[模型广场](/docs/foundation-models) | |智能体 |* 新增零代码智能体自助Debug功能,支持对单轮执行完成的会话进行调试 |[应用实验室](/docs/app-lab-overview) | \ | |* 零代码智能体功能迭代与体验优化,包括: | | \ | | * 智能体中心新增“AI生成智能体”功能,支持用户一键创建并体验智能体效果 | | \ | | * 对话体验支持本地PDF文件上传 | | # 20240820 | | | | |功能模块 |功能说明 |帮助文档 | |---|---|---| | | | | |体验中心 |* 新增豆包语音合成模型的体验 |[体验中心](/docs/language-models) | \ | |* 支持一键副本当前话题为新话题,并保留已选模型及相关参数配置 | | |智能体 |* 插件并发超限时将触发兜底策略 |[智能体](/docs/no-code-app-guide) | \ | | * 当插件并发超限时,系统会提示出错,并将对应插件的参考资料设置为空,但保留原配置 | | \ | | * 可通过自定义prompt,来调整是否需要回答参考资料为空时的问题 | | \ | |* 联网+知识库同时使用参考资料增加资料来源标签 | | \ | | * 可分别指定对不同资料的处理办法 | | \ | |* 联网/知识库-自定义回答方式增加使用示例与样式优化 | | |用量统计 |* 用量统计看板拆分展示调用总tokens数、输入总tokens数、输出总tokens数 |[用量统计](/docs/usage-statistics) | \ | |* 支持查看所选服务下具体接入点的相关调用量 | | |安全与信任 |* 接入点详情页面中增加安全审计标签页: |/ | \ | | * 该标签页中有安全总览指标、推理流程图、审计日志,帮助用户了解推理是否安全 | | | | | | |^^| | | \ | |* 增加审计日志API可审计的事件 | | \ | | * 增加了沙箱容器逃逸日志、vArmor防护日志等 | | | | | | # 20240806 |功能模块 |功能说明 |帮助文档 | |---|---|---| |体验中心 |新增豆包**声音复刻**大模型体验 |[体验中心](/docs/language-models) | |模型推理 |* 支持**批量推理**。适用于无需实时响应的推理场景,可以一次性离线处理大量数据。 |批量推理 | \ | |* Chat API v3 更新:支持 presence_penalty/frequency_penalty |[大模型调用ChatCompletions](/docs/text-generation) | \ | |* 增加安全沙箱标识,点击可弹出推理安全方案演示动画 | | |智能体中心 |* 优化联网改写/总结prompt模板 |[智能体中心](/docs/app-lab-overview) | \ | |* 智能体SearchSummary action透出联网reference | | \ | |* 高代码智能体assistant api支持方舟apikey鉴权 | | # 20240723 |功能模块 |功能说明 |帮助文档 | |---|---|---| |模型广场 |* 新增豆包语音合成模型 |[模型广场](/docs/foundation-models) | \ | |* 模型详情页版本列表按分组展示 | | \ | |* Doubao Embedding 模型的模型卡片与相应示例代码更新至 API V3 | | |体验中心 |- 增加智能体体验,用户可在“体验插件和模型应用”标签下选择体验示例智能体模板 |[体验中心](/docs/language-models) | |评测任务 |- 系统评测集和个人评测集会过审核机制,审核策略与用户自定义配置保持一致 |[模型评测](/docs/create-model-evaluation-tasks) | |模型精调 |- 优化了精调列表页的视觉交互体验,展示状态等重点信息 |[创建精调任务](/docs/fine-tuning-overview) | |模型推理 |- 原「模型推理」模块更名为「在线推理」,优化模型接入点限频说明 |[创建推理接入点](/docs/online-inference-standard) | |智能体中心 |* 知识库新增命中测试功能并支持用户调整大模型问答测试有关参数 |[智能体中心](/docs/app-lab-overview) | \ | |* 智能体群聊功能上线,支持用户通过 GUI 选择多个智能体进行角色扮演 | | \ | |* 优化智能体对话界面的报错交互与文案 | | \ | |* 高代码智能体部署与开通流程简化 | | \ | | * 支持一键开通基础依赖服务 | | \ | | * 提供一键开通和一键加白的 API 接口,以及基于 API 接口的一键开通按钮 | | |开通管理 |* 增加豆包语音合成模型开通项 |[开通管理](/docs/activation-management) | \ | |* 用户可通过开通管理页面产品入口授权提升免费额度,免费额度内的数据会被收集用于模型训练 | | |安全与信任 |- 支持通过OpenAPI查看安全沙箱登录和连接记录的审计日志 |[获取安全审计日志](/docs/list-audit-logs-api?lang=zh) | |其他 |- 精调、评测、模型仓库等模块,数据集和模型文件上传到 TOS 时,按项目进行管理 | | # 20240708 |功能模块 |功能说明 |帮助文档 | |---|---|---| |模型推理 |* 支持智谱 GLM3 / GLM4 模型的 function call 协议适配 |API调用指南 | \ | |* 模型推理 API V3 已修复部分细节问题(如报错处理、参数范围和默认值调整等) | | |体验中心 |* 体验中心界面交互优化如下: |[体验中心](/docs/language-models) | \ | | * 体验中心-历史对话的话题区分项目,便于用户管理使用 | | \ | | * 支持选择已创建的模型推理接入点( Endpoint )进行体验 | | |模型精调 |* 增加精调任务资源预占功能:为排队第一且排队时间远大于平台均值的任务自动开启资源预占 |[模型精调](/docs/fine-tuning-overview) | \ | |* 模型仓库新增「增量训练」操作按钮,支持用户一键增量训练 | | \ | |* 优化模型精调报错交互,增加显著的提示入口及明确的失败原因,提升用户体验 | | |智能体 |* 新增支持 [网页解析插件](/docs/webpage-parsing-plugin-guide): |[智能体中心](/docs/app-lab-overview) | \ | | * 使用前需在服务组件库进行开通,限时免费 | | \ | | * 当前不支持与其他插件同时开启使用 | | \ | |* 联网插件链路部分升级,其中包括: | | \ | | * 支持多风格 Prompt 模板选择及自定义,可通过零代码创建的“联网插件-高级配置-回答配置”进行选择 | | \ | | * 联网Plus版引用条数上限从5增加至10 | | \ | | * 优化联网插件的意图识别环节链路 | | \ | | * 透传userinfo(用户当前的时间和地点) 以提升模型回复正确率与效果 | | \ | |* 知识库插件链路部分升级: | | \ | | * 支持多风格Prompt模板选择及自定义,可通过零代码创建的“知识库插件-高级配置-回答配置”进行选择 | | \ | |* BotApi V3 [API文档](/docs/api-key) / [SDK调用指南](/docs/install-and-upgrade-sdk) 已上线 | | \ | |* Chatapi V3 已支持 Function calling 能力,支持用户将外部工具或 API 接入大模型,[使用说明](/docs/function-calling) 详见文档 | | # 20240625 |功能模块 |功能说明 |帮助文档 | |---|---|---| |模型广场 |新增“Doubao-声音复刻”,“Doubao-语音合成”,“豆包-文生图模型-智能绘图”模型,支持模型接入 |[模型广场](/docs/foundation-models) | |智能体 |* 新增计算器插件(beta版本,如需使用请提交工单联系我们) |[智能体中心](/docs/app-lab-overview) | \ | | * 当用户点击选择更多插件时支持添加计算器插件 | | \ | | * 组件可多选,请注意:计算器插件和联网/知识库不可同时开启 | | \ | | * 计算器插件限时免费,无需额外开通 | | \ | |* 智能体中心支持插件限流调整:支持以账户纬度的插件限流调整 | | # 20240605 |功能模块 |功能说明 |帮助文档 | |---|---|---| |模型推理 |* 模型调用SDK版本升级,SDK V3新增支持Java、Golang语言。 |[模型调用API](/docs/base-url-and-authentication) | \ | |* 模型推理 API/SDK V3支持功能升级,新支持embedding和function call功能,包含Python、Java、Golang 三种语言。 | | \ | |* 优化模型推理API调用说明,为所有推理接入点提供详细的获取授权方式说明,以及不同代码语言和不同场景切换的API调用示例。 | | \ | |* API key的鉴权方式升级,平台支持长效API key的创建和管理,减少因API key失效而频繁更换的麻烦。其中包括: | | \ | | * API key的创建:用户可通过界面化形式为不同项目创建API key,`all`权限默认给予项目下所有资源访问权限。API key当前生效于推理服务(endpoint)、智能体(bot)、智能体组件(action)。 | | \ | | * API key的调用:调用方式与OpenAI SDK完全对齐。用户只需将API key替换为方舟的API key,即可调用方舟上的模型。 | | \ | | * 短效API key仍然可用,适用于对安全有更严格管理要求的用户。 | | |智能体 |* 智能体广场新发布联网、联网+内容、知识库三种插件的示例智能体及prompt优化大师示例智能体。 |[智能体中心](/docs/app-lab-overview) | \ | |* 智能体体验和开发升级,其中包括: | | \ | | * 智能体体验模块增加水印。 | | \ | | * 智能体体验时前端会带入当前ip的城市区域信息。 | | \ | | * 智能体的提示词放大到3000字。 | | \ | | * 高代码智能体开发指南进一步为用户补充操作信息,包括:更清晰的代码示例、vefaas部署引导。 | | \ | | * 0代码智能体创建将面向个人开发者开放,并在流程上进一步丰富提示信息,包括:零代码操作指南及说明文案,模型接入点创建说明,其他提示文案等。 | | \ | |* 联网及内容插件升级,用户可自定义联网触发条件和强制联网开启,调用方式默认为自动调用。 | | # 20240515 |功能模块 |功能说明 |帮助文档 | |---|---|---| |模型广场 |* 基础模型版本管理升级,让每个模型版本的可调参数和配置都以更清晰的方式展示,以便帮助您快速地选择适合您需求的基础模型; |[模型广场介绍](/docs/foundation-models) | \ | |* 引入全新的精选模型卡片,包括字节豆包APP应用的同系列豆包大模型等,为您提供更多选择,以满足各种业务场景的需求; | | |体验中心 |* 在体验中心可以添加“模型仓库”的模型,通过直接与精调模型问答,以更直观的方式感受精调效果; |[模型体验介绍](/docs/language-models) | \ | |* 多模型对比模式开启后,可以同时同步对比“精调模型”与“基础模型”的差异,以及来自不同模型提供方、不同特性的模型在相同问答场景下的回复; | | \ | |* 新增prompt优化选项,让大模型配合您提供更准确、更具情境感的指导词,使大模型在角色塑造和任务场景中提供更优质的回复; | | \ | |* 支持图片上传,结合豆包大模型对图片理解的能力,以实现更贴切、更精准的回复,为您带来更优的体验; | | |模型仓库 |* 新发布模型仓库,现在您可以通过模型仓库更好地管理精调模型; |[模型仓库介绍](/docs/manage-custom-models) | \ | |* 同时,以模型为中心,您可以发起增量训练、发起效果评测、创建推理服务等,以满足您持续迭代和持续运维的需求; | | |模型精调 |* 精调任务中新增了“模型产出”列表,使您可以更轻松地追溯和管理同一精调任务在不同训练阶段的多个模型产出; |[模型精调介绍](/docs/fine-tuning-overview) | \ | |* 成功完成的训练任务会自动将最终模型产出录入至模型仓库,而失败的训练任务则允许您从中断位置继续训练,确保您能够充分利用资源,提高训练效率; | | |模型推理 |* 算力保障现提供两种选项:公共资源池和模型单元。您可以从实际业务和场景出发,选择一种或灵活组合多个不同的推理服务,以实现稳定性和性价比的综合最优解; |[模型推理介绍](/docs/manage-inference-endpoints) | \ | |* 我们对模型推理限流进行了调整:之前每个模型接入点需单独申请限流额度,现改为模型维度的限流。即在同一账号内,不同接入点现在共享一个限流额度,这使得单个接入点可以访问的额度更高。同时,您还可以根据需要灵活分配每个接入点的限流; | | |智能体 |* 新发布智能体中心,为不同开发偏好的用户提供了三种开发模式,使得从零技术基础的用户到初级开发者和高级开发者均能轻松参与到基于AI模型的智能体开发中;其中包括: |[智能体中心](/docs/app-lab-overview) | \ | | * 0代码模式:通过界面点选支持分钟级搭建问答Bot,并可搭配官方预置的联网或知识库组件,获得更高时效性和准确度的模型答复; | | \ | | * 低代码模式:通过方舟 x 扣子的联动支持轻量级编排,同时也将生态内容和多渠道发布的一站式开发体验连接至企业客户; | | \ | | * 高代码模式:通过Ark SDK为开发工具支持最大自由度的AI应用服务编排体验,不仅限于问答Bot; | | \ | |* 新发布服务组件库,支持官方组件的添加和自定义组件创建,从而提高智能体的开发效率。首次发布的官方组件包括可扩展头条图文、抖音视频等优质内容源的联网组件,以及可高效联动企业私域知识进行可靠性补充的知识库组件; | | \ | |* 新发布知识库,用于私域数据问答的场景,支持导入指定链接或TOS中存储的多个文档,并自动对文档执行解析、切片、向量化、构建索引等处理流程。为智能体提供可快速更新、定制化的知识,提升回答准确性。 | | |资源管理 |* 完整对接项目管理和资源标签。账号管理员可基于自身企业的组织和业务设置更加精细的资源管理。同时,您可以通过项目或资源标签从不同维度对方舟上的任务、服务、资产进行分类和聚合管理,将其用于标签制授权和资源分账等场景; |[资源管理平台](https://console.volcengine.com/resourcemanager/resource_center/grant_permission) | \ | | | | |OpenAPI |* 新发布模型广场、模型仓库、模型精调、模型服务、智能体等平台基础功能模块的 OpenAPI,让您能够更灵活地集成和管理方舟平台,满足各种定制化需求和业务场景; |[OpenAPI介绍](/docs/base-url-and-authentication) | \ | |* 升级模型调用Chat API,和多个辅助型API(Tokenization/Classification等)组合使用,可以更好的对模型问答内容进行调整 | | \ | | * 在AK/SK鉴权模式上,新增API Key鉴权,让豆包大模型能在更多的应用侧被便捷的调用; | | \ | | * 开放logit_bias参数,用于调整模型生成的输出中某些内容出现的可能性。配合Tokenization API 可将文本分词并生成相应的 token ID 和偏移量(offset),这些信息有助于在文本中定位每个 token 的位置; | | \ | | * Chat API还同步开放了诸多新的参数 | | |安全与信任 |* 方舟平台在数据安全、隐私和合规性方面已完成并通过多个国内外权威机构(如ISO和SOC)的安全合规认证,为您提供可靠的保障; |[火山方舟互信计算架构白皮书](/docs/volcengine-ark-confidential-computing-whitepaper) | \ | |* 新增用户数据加密能力,加固保护方舟平台的数据安全性。默认情况下使用火山引擎密钥管理系统(KMS)为您加密您的精调资产; |数据加密 | # 20231214 |功能模块 |功能说明 |帮助文档 | |---|---|---| |模型接入 |模型接入是方舟模型服务的能力升级,支持用户调用模型广场上的模型与精调后的模型进行推理。相比原有模型服务,模型接入支持(1)灵活升级接入模型的版本 (2)支持模型接入的调用监控(即将上线),未来还会支持保障更高并发度、更灵活的推理需求。 |[模型接入](/docs/manage-inference-endpoints) | # 20231020 |功能模块 |功能说明 |帮助文档 | |---|---|---| |插件能力 |新发布头条搜索插件,基于外部输入的必要性判断后,调用头条搜索能力,协助大模型实时获取新闻、法律等互联网资讯。当前插件仅适配于豆包系列模型 |头条搜索插件 | # 20230926 |功能模块 |功能说明 |帮助文档 | |---|---|---| |模型评测 |优化自动评测,上传本地评测数据集或选择平台预置评测数据集,一键完成模型的评测。新增人工评测,创建标注任务并分配给指定标注人,在线协同标注模型的生成效果。 |[自动评测介绍](https://docs.volcengine.com/docs/ark/model-evaluation-system-introduction) 、 [人工评测介绍](/docs/manual-evaluation-create-model-evaluation-tasks) | |数据服务 |数据集标注,支持基础的文本大模型数据集人工标注功能。 |[数据集标注](/docs/labeled-datasets) | |模型广场 |模型卡片、体验中心支持多版本的模型展示、体验与使用 |[模型广场介绍](/docs/foundation-models) | |模型服务 |新增Lora推理功能特性,Lora精调后的模型部署为在线服务,不用独占机器资源部署,无需排队,轻量便捷 |[模型服务部署](/docs/run-online-inference-with-fine-tuned-models) | |安全与信任 |为模型提供方与模型使用者开放安全审计日志,在安全容器的基础上进一步加密了用户输入文本信息 |[安全审计日志](/docs/security-management-overview) | # 20230806 |功能模块 |功能说明 |帮助文档 | |---|---|---| |统计管理 |新发布开通管理页,可更清晰了解目前的商品开通状态、限制、价格与帮助文档等;新发布用量统计页,可清晰查看各子账号在各个模型上的调用量与RPM(每分钟请求数)信息 |[开通管理](/docs/activation-management)、[用量统计](/docs/activation-management) | |模型精调 |创建精调任务页:支持LoRA精调,模型精调更高效省时;支持自定义设置验证集;优化了参数配置的交互样式。精调任务列表页:增加了排队时间预估,训练时间预估提示信息 |[创建模型精调任务](/docs/fine-tuning-overview) | |模型服务 |创建在线服务:权限管控升级优化,增加了管理员和可见范围的配置。在线服务详情:在线服务支持服务监控,可更好监控模型服务的工程性能指标 |[查看并管理模型服务](/docs/online-inference-standard) | |模型广场 |支持了公开模型与私有模型的属性,模型卡片权限管控更自由;支持模型列表的搜索 |[模型广场介绍](/docs/foundation-models) | |体验中心 |全新升级AI对话体验中心的交互与视觉,高级参数设置更便捷直观,多模型之间可拖拽排序 |[模型体验介绍](/docs/language-models) | # 20230628 |功能模块 |功能说明 |帮助文档 | |---|---|---| |模型广场 |新发布模型广场功能,在模型广场上查看并了解所有模型提供方上架在平台上的大模型 |[模型广场介绍](/docs/foundation-models) | |体验中心 |新发布体验中心功能,可快速体验各模型的实际表现效果,探索其在语言、图像等方面的先进能力 |[模型体验介绍](/docs/language-models) | |模型精调 |新发布模型精调功能,支持自定义训练集、超参、版本管理等功能,快速精调并使用专属大模型服务 |[创建模型精调任务](/docs/fine-tuning-overview) | |模型评测 |新发布模型评测功能,自动根据预置的评测脚本与数据集,从多个维度评价精调后的模型表现效果 |[模型评测方案介绍](/docs/model-evaluation-introduction) | |模型服务 |新发布模型服务功能,在火山引擎上可直接调用推理API,接入生产环境,并持续运维与监控 |[精调模型发布在线服务](/docs/run-online-inference-with-fine-tuned-models) | |安全与信任 |支持安全可信的推理与精调服务,保障模型提供方的知识产权安全与模型使用者的业务信息安全 |[火山方舟互信计算架构白皮书](/docs/volcengine-ark-confidential-computing-whitepaper) | | | |---| --- # 模型下线公告 2024 Source: https://ark.volcengine.com/region:cn-beijing/docs/model-deprecation-announcement-2024 # 第一批模型下线说明 ### 下线计划 |节点 |时间 |**具体动作&影响** | |---|---|---| |**启动&通知** |2024年9月30日 |逐步下调模型配额。 | |**EOM** |2025年2月28日 |用户无法新增接入点。 | \ |模型停止新购 | | | \ | | |:::tip | \ | | |建议提前切换至对应的替换模型,并测试验证新模型对业务的影响。 | \ | | |::: | |**EOS** |2025年4月15日 |模型正式下线并残留接入点自动替换为新模型。 | \ |模型服务下线 | | | ### 下线模型 |**模型版本** |**建议迁移模型** |**替代模型** | |---|---|---| |doubao-lite-32k-240428 |doubao-1.5-lite-32k-250115 |doubao-1.5-lite-32k-250115 | |doubao-lite-4k-240328 |doubao-1.5-lite-32k-250115 |doubao-1.5-lite-32k-250115 | |doubao-lite-4k-character-240515 |doubao-lite-32k-character-250228 |doubao-lite-32k-character-250228 | |doubao-pro-128k-240515 |doubao-1.5-pro-32k-250115 |doubao-1.5-pro-32k-250115 | |doubao-pro-32k-240515 |doubao-1.5-pro-32k-250115 |doubao-1.5-pro-32k-250115 | |doubao-pro-4k-240515 |doubao-1.5-pro-32k-250115 |doubao-1.5-pro-32k-250115 | |doubao-pro-4k-browsing-240524 |doubao-pro-32k-browsing-241115 |doubao-pro-32k-browsing-241115 | |doubao-pro-4k-character-240515 |doubao-1.5-pro-32k-character-250228 |doubao-1.5-pro-32k-character-250228 | |doubao-pro-4k-functioncall-240515 |doubao-1.5-pro-32k-250115 |doubao-1.5-pro-32k-250115 | |skylark3-lite-128k-240428 |doubao-lite-128k-240828 |doubao-lite-128k-240828 | |skylark3-lite-4k-240328 |doubao-1.5-lite-32k-250115 |doubao-1.5-lite-32k-250115 | |skylark3-pro-4k-240415 |doubao-1.5-pro-32k-250115 |doubao-1.5-pro-32k-250115 | |skylark3-pro-8k-browsing-intent-240415 |doubao-lite-4k-browsing-intent-240828 |doubao-lite-4k-browsing-intent-240828 | |skylark2-lite-8k-browsing-intent-240615 |doubao-lite-4k-browsing-intent-240828 |doubao-lite-4k-browsing-intent-240828 | |skylark2-lite-8k-1.0 |doubao-lite-4k-browsing-intent-240828 |doubao-lite-4k-browsing-intent-240828 | |skylark2-lite-4k |doubao-1.5-lite-32k-250115 |doubao-1.5-lite-32k-250115 | |skylark2-lite-character-8k |doubao-lite-32k-character-250228 |doubao-lite-32k-character-250228 | |skylark2-pro-character-4k 1.0 |doubao-1.5-pro-32k-character-250228 |doubao-1.5-pro-32k-character-250228 | |skylark2-pro-character-4k-ecom-20240415 |doubao-1.5-pro-32k-character-250228 |doubao-1.5-pro-32k-character-250228 | |skylark2-pro-32k 1.0-1.1 |doubao-1.5-pro-32k-250115 |doubao-1.5-pro-32k-250115 | |skylark2-pro-4k-browsing |doubao-pro-32k-browsing-241115 |doubao-pro-32k-browsing-241115 | |skylark2-pro-4k-browsing-240415 |doubao-pro-32k-browsing-241115 |doubao-pro-32k-browsing-241115 | |skylark2-pro-4k-character-240328 |doubao-1.5-pro-32k-character-250228 |doubao-1.5-pro-32k-character-250228 | |skylark2-pro-4k 1.2-1.3 |doubao-1.5-pro-32k-250115 |doubao-1.5-pro-32k-250115 | |web-intent 1.0 |doubao-pro-32k-browsing-240828 |doubao-pro-32k-browsing-240828 | |skylark-Web 2.2-0.0 |doubao-pro-32k-browsing-241115 |doubao-pro-32k-browsing-241115 | |skylark-plus-public 1.1 |doubao-1.5-pro-32k-250115 |doubao-1.5-pro-32k-250115 | |skylark-pro-public 2.0-2.1 |doubao-1.5-pro-32k-250115 |doubao-1.5-pro-32k-250115 | |skylark-lite-public 2.0-1.0-1.1-0.0 |doubao-1.5-lite-32k-250115 |doubao-1.5-lite-32k-250115 | |skylark-chat 1.0 |doubao-1.5-pro-32k-250115 |doubao-1.5-pro-32k-250115 | |llama3-70b-instruct |doubao-1.5-pro-32k-250115 |doubao-1.5-pro-32k-250115 | |llama3-8b-instruct |doubao-1.5-lite-32k-250115 |doubao-1.5-lite-32k-250115 | |mistral-7b-instruct-v0.2 |关停 |关停 | |chatglm3-130-fin v1.0-update |关停 |关停 | |chatglm3-130b-fc v1.0 |关停 |关停 | --- # 火山方舟 SDK V1/V2下线公告及迁移指引 Source: https://ark.volcengine.com/region:cn-beijing/docs/sdk-v1-v2 # 背景 目前,火山方舟SDK V3在易用性、功能丰富性、稳定性、性能等各方面远超V1/V2,且已经上线并稳定运行一段时间。火山方舟平台SDK V1/V2 版本将于**2024年11月30日正式下线,不再支持调用,2024年11月19日以后创建的推理接入点将不能使用SDK V1/V2访问**。建议用户尽快**核实SDK版本,并于旧版本下线前参照本迁移指引完成SDK V1/V2至SDK V3版本切换和业务迁移**。 ## V3版本增强说明 * 易用性:V3接口完全兼容 OpenAI 协议,支持直接使用社区兼容 OpenAI 协议的 SDK 调用,同时更容易和 LangChain 等开源生态结合。 * 功能更丰富:V3接口对 function calling、n-sample等功能的支持更完善。 * 稳定性:V3接口模型推理服务链路优化,整体稳定性更好;推理服务的模型版本切换支持平滑切换(无中断)。 * 性能:V3接口模型推理服务平均 TTFT (用户提交查询后开始看到模型输出的速度)降低 50-100ms。 # 火山方舟SDK版本判断方式 * 如果您使用的是火山方舟官方提供的 SDK,可以通过 import 路径判断:出现 `ark` 字样的为 V3 API,出现 `maas` 字样的为 V1/V2 API。各语言import路径如下所示: |**语言** |**V1/V2** |**V3** | |---|---|---| |Python |`import volcengine.maas` |`from volcenginesdkarkruntime import Ark` | |Go |`import "github.com/volcengine/volc-sdk-golang/service/maas"` |`import "github.com/volcengine/volcengine-go-sdk/service/arkruntime"` | |Java |`import com.volcengine.service.maas.MaasService` |`import com.volcengine.ark.runtime.service.ArkService` | * 如果您使用的是自行实现的 HTTP 接口,可以通过域名或 path 前缀判断。各语言域名及path前缀如下所示: | |**V1** |**V2** |**V3** | |---|---|---|---| |域名 |maas-api.ml-platform-cn-beijing.volces.com |maas-api.ml-platform-cn-beijing.volces.com |ark.cn-beijing.volces.com | \ | | | | | |path前缀 |`/api/v1` |`/api/v2` |`/api/v3` | # 迁移指引 ## 接口参数映射 新旧API URL对应表及详细接口参数映射说明如下: |**旧版API URL** |**新版API URL** | |---|---| |api/v1/chat |api/v3/chat/completions | |api/v2/endpoint/*endpoint_id*/chat |api/v3/chat/completions | |api/v2/endpoint/*endpoint_id*/embeddings |api/v3/embeddings | |api/v2/endpoint/*endpoint_id*/tokenization |api/v3/tokenization | |/api/v2/endpoint/*endpoint_id*/classification |暂不支持 | |/api/v2/endpoint/*endpoint_id*/images/quick-gen |暂不支持 | |/api/v2/endpoint/*endpoint_id*/images/flex-gen |暂不支持 | |/api/v2/endpoint/*endpoint_id*/audio/speech |暂不支持 | ### api/v1/chat -> api/v3/chat/completions 参数映射 #### 请求参数 |**api/v1/chat** |**api/v3/chat/completions** |**备注** | |---|---|---| |req_id |通过 http header 支持 |v3 支持 client request id,便于 client 侧日志和 server 侧日志串联,可以通过 `X-Client-Request-Id` http header 指定。 | \ | | |该方式可以区分方舟服务侧和客户侧的请求 id,请求方可以多个请求传入相同的 `X-Client-Request-Id`,便于串联请求。 | |model.endpoint_id |model |v3 仅支持通过 endpoint id 访问模型,因此去掉了 v1 的 model.name 和 model.version。 | |messages |messages |如果使用 function calling ,需要根据 [Function Calling 使用说明](/docs/function-calling) 对请求中的 function_call 字段做相应修改。 | \ | | |v3 的 function calling 功能支持更多模型(v1/v2 不支持 doubao-functioncall 系列模型),和更多能力(v1/v2 不支持 tool_choice等功能)。 | |stream |stream |v3 的 流式返回不会默认在最后一个 chunk 返回 usage 信息,如果需要返回,可以指定 `stream_options.include_usage` 开关,如果为 `true`,在响应最后返回一个额外的块,此块上的 `usage` 字段代表整个请求的 token 用量,这一块的`choices` 字段为空数组。所有其他块也将包含 `usage` 字段,但值为 `null`。 | |functions |tools |如果使用 function calling ,需要根据 [Function Calling 使用说明](/docs/function-calling) 对请求中的 function_call 字段做相应修改。 | \ | | |v3 的 function calling 功能支持更多模型(v1/v2 不支持 doubao-functioncall 系列模型),和更多能力(v1/v2 不支持 tool_choice等功能)。 | |plugins |\- |v3 无对标参数。 | \ | | |v1 的联网插件功能可以通过方舟智能体的 [联网内容插件功能说明](/docs/online-content-plugin-guide)实现,智能体的 trace/开放性 都更优。 | |crypto_token |\- |v3 无对标参数。 | |parameters.max_new_tokens |max_tokens |v3 允许范围为 [0, 4096]。 | |parameters.min_new_tokens |\- |v3 无对标参数,该参数不建议使用。 | |parameters.max_prompt_tokens |\- |v3 无对标参数,该参数不建议使用。 | \ | | |用户如果有 prompt 截断的需求,建议 结合 分词接口(tokenization) 在业务侧自行处理截断逻辑,方舟服务端内置的截断逻辑可能会导致截断不符合客户预期。 | |parameters.temperature |temperature |v3 允许范围为 [0, 1]。 | |do_sample |\- |v3 无对标参数,该参数不建议使用。 | \ | | |同时,在 v1/v2 API 上,该参数均不生效。 | |parameters.top_p |top_p |\- | |parameters.top_k |\- |v3 无对标参数。 | \ | | |v1 接口 top_k 设置为 1 时采样策略实际上为贪心采样,v3 要达到相同效果可以设置 temperature=0。如果有 top_k 设置为其它值的需求,可以通过 [提交工单](https://console.volcengine.com/workorder/create?step=2&SubProductID=P00001166) 咨询。 | \ | | | | |parameters.frequency_penalty |frequency_penalty |v3 允许范围为 [-2, 2]。 | |parameters.presence_penalty |presence_penalty |v3 允许范围为 [-2, 2]。 | |parameters.repetition_penalty |\- |无对标参数。 | \ | | |> 传入该字段不生效。 | |stop |stop |v3 最多允许输入 4 个字符串。 | |parameters.logprobs |logprobs |v1 `parameters.logprobs=value` 的接口行为,可以通过 v3 的 `logprobs=true, top_logprobs=value` 实现。 | \ | |top_logprobs | | |parameters.guidance |通过 http header 支持 |如有定制需求可以通过 [提交工单](https://console.volcengine.com/workorder/create?step=2&SubProductID=P00001166) 咨询。 | \ | | | | |parameters.logit_bias |logit_bias |\- | #### 响应参数 ##### 非流式调用 |**api/v1/chat** |**api/v3/chat/completions** |**备注** | |---|---|---| |req_id |id |v3 接口 response 返回的 id 是服务端生成的,请求唯一的 id。用户可以通过 client request id 或 request id 提交 badcase。 | |choice |choices |v3 接口返回的 choices 是一个列表,当未指定 n 参数时,`choices[0]` 等同于 v1 的 `choice`。 | |usage |usage |\- | |extra |\- |v3 无对标参数。 | ##### 流式调用 |**api/v1/chat** |**api/v3/chat/completions** |**备注** | |---|---|---| |req_id |id |v3 接口 response 返回的 id 是服务端生成的,请求唯一的 id。用户可以通过 client request id 或 request id 提交 badcase。 | |choice |choices |v3 接口返回的 choices 是一个列表。 | \ | | |v3 兼容 openai 的接口协议,流式场景下,返回的 `choices[0].delta` 等同于 v1 的 `choice.message`。 | |usage |usage |\- | |extra |\- |v3 无对标参数。 | ### api/v2/endpoint/*:endpoint_id*/chat -> api/v3/chat/completions 参数映射 #### 请求参数 |**api/v2/endpoint/:endpoint_id/chat** |**api/v3/chat/completions** |**备注** | |---|---|---| |:endpoint_id |model |v2 在 url path 中,v3 在 body 中通过 model 字段传递。 | |messages |messages |\- | |stream |stream |v3 的 流式返回不会默认在最后一个 chunk 返回 usage 信息,如果需要返回,可以指定 `stream_options.include_usage` 开关,如果为 `true`,在响应最后返回一个额外的块,此块上的 `usage` 字段代表整个请求的 token 用量,这一块的`choices` 字段为空数组。所有其他块也将包含 `usage` 字段,但值为 `null`。 | |tools |tools |v3 的 function calling 功能支持更多模型(v1/v2 不支持 doubao-functioncall 系列模型),和更多能力(v1/v2 不支持 tool_choice等功能)。 | |user |user |\- | |crypto_token |\- |v3 无对标参数。 | |parameters.max_new_tokens |max_tokens |v3 允许范围为 [0, 4096]。 | |parameters.min_new_tokens |\- |v3 无对标参数,该参数不建议使用。 | |parameters.max_prompt_tokens |\- |v3 无对标参数,该参数不建议使用。 | \ | | |用户如果有 prompt 截断的需求,建议 结合 分词接口(tokenization) 在业务侧自行处理截断逻辑,方舟服务端内置的截断逻辑可能会导致截断不符合客户预期。 | |parameters.temperature |temperature |v3 允许范围为 [0, 1]。 | |do_sample |\- |v3 无对标参数,该参数不建议使用,实际上在 v1/v2 API 上,该参数也是不生效的。 | |parameters.top_p |top_p |\- | |parameters.top_k |\- |v3 无对标参数。 | \ | | |v1 接口 top_k 设置为 1 时采样策略实际上为贪心采样,v3 要达到相同效果可以设置 temperature=0。如果有 top_k 设置为其它值的需求,可以 case by case 讨论下。 | |parameters.frequency_penalty |frequency_penalty |v3 允许范围为 [-2, 2]。 | |parameters.presence_penalty |presence_penalty |v3 允许范围为 [-2, 2]。 | |parameters.repetition_penalty |repetition_penalty |v3 允许范围为 [0, 2]。 | |stop |stop |v3 最多允许输入 4 个字符串。 | |parameters.logprobs |logprobs |v2 `parameters.logprobs=value` 的接口行为,可以通过 v3 的 `logprobs=true, top_logprobs=value` 实现。 | \ | |top_logprobs | | |parameters.guidance |通过 http header 支持 |如有定制需求可以通过 [提交工单](https://console.volcengine.com/workorder/create?step=2&SubProductID=P00001166) 咨询。 | \ | | | | |parameters.logit_bias |logit_bias |\- | #### 响应参数 ##### 非流式调用 |**api/v2/endpoint/:endpoint_id/chat** |**api/v3/chat/completions** |**备注** | |---|---|---| |choices |choices |\- | |usage |usage |\- | |extra |\- |v3 无对标参数。 | ##### 流式调用 |**api/v2/endpoint/:endpoint_id/chat** |**api/v3/chat/completions** |**备注** | |---|---|---| |choices |choices |v3 兼容 openai 的接口协议,流式场景下,返回的 `choices[0].delta` 等同于 v1 的 `choice.message`。 | |usage |usage |\- | |extra |\- |v3 无对标参数。 | ### api/v2/endpoint/*:endpoint_id*/embeddings -> api/v3/embeddings 参数映射 #### 请求参数 |**api/v2/endpoint/:endpoint_id/embeddings** |**api/v3/embeddings** |**备注** | |---|---|---| |:endpoint_id |model |v2 在 url path 中,v3 在 body 中通过 model 字段传递。 | |input |input |\- | |encoding_format |encoding_format |v3 支持 encoding_format 取值为 float 或 base64。 | |user |user |\- | #### 响应参数 |**api/v2/endpoint/:endpoint_id/embeddings** |**api/v3/embeddings** |**备注** | |---|---|---| |object |object |\- | |data |data |\- | |usage |usage |\- | ### api/v2/endpoint/*:endpoint_id*/tokenization -> api/v3/tokenization 参数映射 #### 请求参数 |**api/v2/endpoint/:endpoint_id/tokenization** |**api/v3/tokenization** |**备注** | |---|---|---| |:endpoint_id |model |v2 在 url path 中,v3 在 body 中通过 model 字段传递。 | |text |text |v3 的 text 可以输入一个字符串,或者一个字符串列表。 | #### 响应参数 |**api/v2/endpoint/:endpoint_id/tokenization** |**api/v3/tokenization** |**备注** | |---|---|---| |tokens |\- |该字段会带来一些性能问题,并且用户可以通过 `offset_mapping` 和输入的文本串来计算该字段,因此 v3 不支持返回 tokens。 | |token_ids |data[0].token_ids |v3 的 text 输入字符串时,返回的 `data` 字段长度固定为 1,此时 `data[0].token_ids` 相当于 v2 接口的 `token_ids`。 | |offset_mapping |data[0].offset_mapping |v3 的 text 输入字符串时,返回的 `data` 字段长度固定为 1,此时 `data[0].offset_mapping` 相当于 v2 接口的 offset_mapping。 | |total_tokens |data[0].total_tokens |v3 的 text 输入字符串时,返回的 `data` 字段长度固定为 1,此时 `data[0].total_tokens` 相当于 v2 接口的 total_tokens。 | ## SDK 迁移 ### Python v1/v2 支持 python 3.5+,v3 需要 python 3.7+,3.7 以下的版本如需使用方舟 API 建议参考 [ChatCompletions-文字对话](/docs/text-generation) 实现 HTTP 调用,或使用兼容 openai-like 协议的第三方 SDK。 #### v1 和 v3 对比 ```Python # v1 [deprecated] # python -m pip install --user volcengine import os from volcengine.maas import MaasService, MaasException, ChatRole maas = MaasService('https://maas-api.ml-platform-cn-beijing.volces.com', 'cn-beijing') maas.set_ak(os.getenv("VOLC_ACCESSKEY")) maas.set_sk(os.getenv("VOLC_SECRETKEY")) resp = maas.chat({ "model": { "name": "skylark-pro", }, "messages": [ {"role": ChatRole.USER, "content": "hello"} ] }) print(resp) ``` ```Python # v3 [recommended] # python -m pip install --upgrade arkruntime import os from arkruntime import Ark client = Ark( api_key=os.environ.get("ARK_API_KEY"), # 这里同时支持通过 api_key 构造和通过 aksk 构造,二者选其一即可 base_url="https://ark.cn-beijing.volces.com/api/v3", ) completion = client.chat.completions.create( model="doubao-seed-2-1-pro-260915", # Replace with Model ID messages = [ {"role": "user", "content": "hello"}, ], ) print(completion) ``` #### v2 和 v3 对比 ```Python # v2 [deprecated] # python -m pip install --user volcengine import os from volcengine.maas.v2 import MaasService from volcengine.maas import MaasException, ChatRole maas = MaasService('https://maas-api.ml-platform-cn-beijing.volces.com', 'cn-beijing') maas.set_ak(os.getenv("VOLC_ACCESSKEY")) maas.set_sk(os.getenv("VOLC_SECRETKEY")) resp = maas.chat("ep-xxxxxx-yyy", { "messages": [ {"role": ChatRole.USER, "content": "hello"} ] }) print(resp) ``` ```Python # v3 [recommended] # python -m pip install --upgrade arkruntime import os from arkruntime import Ark client = Ark( api_key=os.environ.get("ARK_API_KEY"), # 这里同时支持通过 api_key 构造和通过 aksk 构造,二者选其一即可 base_url="https://ark.cn-beijing.volces.com/api/v3", ) completion = client.chat.completions.create( model="doubao-seed-2-1-pro-260915", # Replace with Model ID messages = [ {"role": "user", "content": "hello"}, ], ) print(completion) ``` ### Golang v3 需要 1.18 及以上的 golang 版本,1.18 以下的 golang 版本如需使用方舟 API 建议参考 [ChatCompletions-文字对话](/docs/text-generation) 实现 HTTP 调用,或使用兼容 openai-like 协议的第三方 SDK。 #### v1 和 v3 对比 ```Go // v1 [deprecated] // go get -u github.com/volcengine/volc-sdk-golang import ( "fmt" "os" "github.com/volcengine/volc-sdk-golang/service/maas" "github.com/volcengine/volc-sdk-golang/service/maas/models/api" ) func main() { r := maas.NewInstance("https://maas-api.ml-platform-cn-beijing.volces.com", "cn-beijing") r.SetAccessKey(os.Getenv("VOLC_ACCESSKEY")) r.SetSecretKey(os.Getenv("VOLC_SECRETKEY")) got, status, err := r.Chat(&api.ChatReq{ Model: &api.Model{ Name: "skylark-pro", }, Messages: []*api.Message{ { Role: maas.ChatRoleOfUser, Content: "hello", }, }, }) if err != nil { panic(err) } fmt.Println(got) } ``` ```Go // v0.2.0 // go get github.com/volcengine/ark-runtime-go@v0.2.0 package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/chat" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) resp, err := client.CreateChatCompletion(context.Background(), &chat.ChatCompletionRequest{ Model: "doubao-seed-2-1-pro-260915", Messages: []chat.ChatCompletionRequestMessage{ userMessage("hello"), }, }) if err != nil { panic(err) } fmt.Println(resp) } func userMessage(content string) chat.ChatCompletionRequestMessage { return chat.ChatCompletionRequestMessage{ OneOf: chat.NewChatCompletionRequestUserMessageChatCompletionRequestMessageSum( chat.ChatCompletionRequestUserMessage{ Role: chat.ChatCompletionRequestUserMessageRoleUser, Content: chat.NewOptNilChatCompletionMessageContent(chat.NewStringChatCompletionMessageContent(content)), }, ), } } ``` #### v2 和 v3 对比 ```Go // v2 [deprecated] // go get -u github.com/volcengine/volc-sdk-golang import ( "fmt" "os" api "github.com/volcengine/volc-sdk-golang/service/maas/models/api/v2" client "github.com/volcengine/volc-sdk-golang/service/maas/v2" ) func main() { r := client.NewInstance("https://maas-api.ml-platform-cn-beijing.volces.com", "cn-beijing") r.SetAccessKey(os.Getenv("VOLC_ACCESSKEY")) r.SetSecretKey(os.Getenv("VOLC_SECRETKEY")) got, status, err := r.Chat("ep-xxxxxx-yyy", &api.ChatReq{ Messages: []*api.Message{ { Role: api.ChatRoleUser, Content: "hello", }, }, }) if err != nil { panic(err) } fmt.Println(got) } ``` ```Go // v0.2.0 // go get github.com/volcengine/ark-runtime-go@v0.2.0 package main import ( "context" "fmt" "os" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/chat" ) func main() { client := arkruntime.NewClientWithApiKey( os.Getenv("ARK_API_KEY"), arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"), ) resp, err := client.CreateChatCompletion(context.Background(), &chat.ChatCompletionRequest{ Model: "doubao-seed-2-1-pro-260915", Messages: []chat.ChatCompletionRequestMessage{ userMessage("hello"), }, }) if err != nil { panic(err) } fmt.Println(resp) } func userMessage(content string) chat.ChatCompletionRequestMessage { return chat.ChatCompletionRequestMessage{ OneOf: chat.NewChatCompletionRequestUserMessageChatCompletionRequestMessageSum( chat.ChatCompletionRequestUserMessage{ Role: chat.ChatCompletionRequestUserMessageRoleUser, Content: chat.NewOptNilChatCompletionMessageContent(chat.NewStringChatCompletionMessageContent(content)), }, ), } } ``` ### Java #### v1 和 v3 对比 ```Java /* v1 [deprecated] # pom.xml com.volcengine volc-sdk-java LATEST */ import com.volcengine.helper.Const; import com.volcengine.model.maas.api.Api; import com.volcengine.service.maas.MaasException; import com.volcengine.service.maas.MaasService; import com.volcengine.service.maas.impl.MaasServiceImpl; public class ChatDemo { public static void main(String[] args) { MaasService maasService = new MaasServiceImpl("https://maas-api.ml-platform-cn-beijing.volces.com", "cn-beijing"); maasService.setAccessKey(System.getenv("VOLC_ACCESSKEY")); maasService.setSecretKey(System.getenv("VOLC_SECRETKEY")); Api.ChatReq req = Api.ChatReq.newBuilder() .setModel(Api.Model.newBuilder().setName("skylark-pro")) .addMessages(Api.Message.newBuilder().setRole(Const.MaasChatRoleOfUser).setContent("hello")) .build(); Api.ChatResp resp = maasService.chat(req); System.out.println(resp); } } ``` ```Java /* v3 [recommended] # pom.xml com.volcengine ark-runtime ${ark-runtime.version} */ import com.volcengine.ark.runtime.service.ArkService; import com.volcengine.ark.runtime.models.chat.*; import com.volcengine.ark.runtime.service.ArkService; import java.util.ArrayList; import java.util.List; public class ChatCompletionsExample { public static void main(String[] args) { // 这里同时支持通过 api_key 构造和通过 aksk 构造,二者选其一即可 String apiKey = System.getenv("ARK_API_KEY"); ArkService service = ArkService.builder() .apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); final List messages = new ArrayList<>(); final ChatCompletionRequestMessage message = ChatCompletionRequestUserMessage.builder().role(ChatCompletionRequestMessageType.USER).content(ChatCompletionMessageContent.ofString("hello")).build(); messages.add(message); ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder() .model("ep-xxxxxx-yyy") .messages(messages) .build(); service.createChatCompletion(chatCompletionRequest).getChoices().forEach(choice -> System.out.println(choice.getMessage().getContent())); // shutdown service before process exited. service.shutdownExecutor(); } } ``` #### v2 和 v3 对比 ```Java /* v2 [deprecated] # pom.xml com.volcengine volc-sdk-java LATEST */ import com.volcengine.model.maas.api.v2.*; import com.volcengine.service.maas.MaasException; import com.volcengine.service.maas.v2.MaasService; import com.volcengine.service.maas.v2.impl.MaasServiceImpl; import java.util.ArrayList; import java.util.Arrays; import java.util.stream.Stream; public class ChatV2Demo { public static void main(String[] args) { MaasService maasService = new MaasServiceImpl("https://maas-api.ml-platform-cn-beijing.volces.com", "cn-beijing"); maasService.setAccessKey(System.getenv("VOLC_ACCESSKEY")); maasService.setSecretKey(System.getenv("VOLC_SECRETKEY")); ChatReq req = new ChatReq() .withMessages(new ArrayList<>(Arrays.asList( new Message().withRole(Message.ChatRole.USER).withContent("hello") ))); ChatResp resp = maasService.chat("ep-xxxxxx-yyy", req); System.out.println(resp); } } ``` ```Java /* v3 [recommended] # pom.xml com.volcengine ark-runtime ${ark-runtime.version} */ import com.volcengine.ark.runtime.service.ArkService; import com.volcengine.ark.runtime.models.chat.*; import com.volcengine.ark.runtime.service.ArkService; import java.util.ArrayList; import java.util.List; public class ChatCompletionsExample { public static void main(String[] args) { // 这里同时支持通过 api_key 构造和通过 aksk 构造,二者选其一即可 String apiKey = System.getenv("ARK_API_KEY"); ArkService service = ArkService.builder() .apiKey(apiKey) .baseUrl("https://ark.cn-beijing.volces.com/api/v3") .build(); final List messages = new ArrayList<>(); final ChatCompletionRequestMessage message = ChatCompletionRequestUserMessage.builder().role(ChatCompletionRequestMessageType.USER).content(ChatCompletionMessageContent.ofString("hello")).build(); messages.add(message); ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder() .model("ep-xxxxxx-yyy") .messages(messages) .build(); service.createChatCompletion(chatCompletionRequest).getChoices().forEach(choice -> System.out.println(choice.getMessage().getContent())); // shutdown service before process exited. service.shutdownExecutor(); } } ``` ### 多语言社区SDK及 Langchain 调用指南 * 火山方舟大模型/智能体调用 v3 API 与 OpenAI API 协议兼容,您可以使用兼容 OpenAI API 协议的多语言社区 SDK 调用火山方舟大模型/智能体 API。详细说明可参考 [多语言社区 SDK](/docs/compatible-with-openai-sdk)。 * 目前SDK v3支持通过 Langchain 接入方舟 API,由于方舟 V3 接口兼容 Openai 的接口协议,您可以通过 ChatOpenAI 使用,详细说明可参考 [多语言社区 SDK](/docs/compatible-with-openai-sdk)。 ## 联网插件切换 > 主要以 Python 为例,其余语言类似请参考: > * [API Spec](/docs/api-key) / [操作指南](/docs/no-code-app-guide) > * [Python](/docs/sdk-common-examples) / [Golang](/docs/sdk-common-examples) / [Java](/docs/sdk-common-examples) chat v1 ```Python import os from volcengine.maas import MaasService, MaasException, ChatRole maas = MaasService('https://maas-api.ml-platform-cn-beijing.volces.com', 'cn-beijing') maas.set_ak(os.getenv("VOLC_ACCESSKEY")) maas.set_sk(os.getenv("VOLC_SECRETKEY")) resp = maas.chat({ "model": { "name": "skylark-pro", }, "messages": [ {"role": ChatRole.USER, "content": "hello"} ], "plugins": ["browsing"], }) print(resp) ``` bot chat v3 ![](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_8e839f876b87e314cd3536649760c753.png) > 智能体中心>创建智能体>零代码>单聊>创建详情页 ```Python import os from volcenginesdkarkruntime import Ark client = Ark( api_key=os.environ.get("ARK_API_KEY"), # 这里同时支持通过 api_key 构造和通过 aksk 构造,二者选其一即可 base_url="https://ark.cn-beijing.volces.com/api/v3" ) completion = client.bot_chat.completions.create( model="bot-xxxxxx-yyy", messages = [ {"role": "user", "content": "hello"}, ], ) print(completion) ``` V3 API 的详细说明参见 [API 列表](/docs/base-url-and-authentication),V3 SDK 的详细说明参见 [SDK 调用指南](/docs/install-and-upgrade-sdk)。如有其他迁移问题,可以通过 [提交工单](https://console.volcengine.com/workorder/create?step=2&SubProductID=P00001166) 的方式,进行咨询。 # 本期下线说明 ## 本期下线时间说明 |通知时间 |下线时间 |影响说明 | |---|---|---| |2024年10月16日 |2024年11月30日 |SDK下线工作将于通知时间起进行,自通知时间开始,将逐步下调SDK V1/V2配额; | \ | | |至下线时间日,SDK V1/V2 正式下线并停止服务;建议尽快切换至SDK V3 | --- # 模型插件联网基础版、联网plus版、联网pro版下线公告 Source: https://ark.volcengine.com/region:cn-beijing/docs/plus-pro 新版联网内容插件进行了全方位升级,丰富了内容源并优化实现链路,与最新豆包大模型配合使用效果提升,**联网基础版、联网plus版、联网pro版插件(后简称旧版插件)将于2024年12月24日18:00起停止服务**,不再支持调用。 为了避免影响您的业务运营,强烈建议您提前规划升级计划,在旧版插件下线前升级至新版插件,保障业务运营不中断。如有任何问题,请 [联系我们](https://console.volcengine.com/workorder/create?step=2&SubProductID=P00001166)。 ### 时间点 * 旧版插件停止购买(EOM):2024年11月12日 18:00:00 * 旧版插件停止服务(EOS):2024年12月24日 18:00:00 ### 相关链接 * [新版联网内容插件说明](/docs/online-content-plugin-guide) * [新版联网内容插件计费说明](/docs/online-content-plugin-pricing) * [新版联网内容插件开通](https://console.volcengine.com/common-buy/CC_content_plugin) * [方舟工单入口](https://console.volcengine.com/workorder/create?step=2&SubProductID=P00001166) --- # 方舟官方 SDK 升级公告 Source: https://ark.volcengine.com/region:cn-beijing/docs/ark-runtime-sdk-migration **发布日期:2026 年 9 月 7 日** 方舟官方 SDK 为 Python、Go 和 Java 提供统一依赖和一致的模型调用接口。为获得最新接口能力和问题修复,建议新接入和迁移项目使用各语言 SDK 的最新稳定版本。 旧版本 SDK 将逐步停止更新,具体时间另行通知。 迁移期间无需一次性移除旧版 SDK。可以优先使用新版 SDK;如果当前版本尚未覆盖所需 API,请继续使用旧版 SDK 或对应 REST API,待新版支持后再迁移。 完整安装方式、依赖替换、代码调整、迁移检查清单和兼容使用建议,请参见[迁移到方舟官方 SDK](/docs/migrate-ark-runtime-sdk)。 --- # API 兼容性升级公告 Source: https://ark.volcengine.com/region:cn-beijing/docs/api-schema-upgrade-notice 发布日期:**2026 年 9 月 9 日** 为降低接入成本并提升协议兼容性,方舟预计将于 **2026 年 9 月 9 日** 陆续对部分 API 的出入参结构和兼容行为进行升级,具体如下。 |升级点 |涉及 API |简要说明 | |---|---|---| |`logprobs`、`top_logprobs` 参数支持 |Chat API |* 升级前:API 不支持传入 `logprobs`、`top_logprobs`。 | \ |||* 升级后:DeepSeek V4 正式版系列、GLM-5.2 将支持 `logprobs`、`top_logprobs` 传入和输出。 | |`developer` 类型 `role` 支持 |Chat API |* 升级前:当 `content` 的 `role=developer` 时会返回报错。 | \ |||* 升级后:将兼容 `role=developer` 输入,不再报错。 | |Responses API 默认输出加密后的思考内容 |Responses API |* 升级前:如需返回 `reasoning.encrypted_content`,需在请求中显式传入 `"include": ["reasoning.encrypted_content"]`。 | \ |||* 升级后:当模型产生思考内容时,将默认返回 `reasoning.encrypted_content`,无需显式传参。 | |Responses API 输出格式规范化升级 |Responses API |* 升级前:流式输出中部分字段无有效内容时会省略返回。 | \ |||* 升级后: | \ ||| * `response.created`、`response.in_progress` 事件将新增 `status` 和 `output` 字段返回;无内容的场景下则为空数组。 | \ ||| * `response.output_item.added` 事件中,`reasoning` item 将新增 `summary` 字段返回,`message` item 将新增 `content` 字段返回;无内容的场景下则为空数组。 | |原生 `web_search` 工具调用能力支持 |Responses API |* 升级前:API 不支持内置的联网搜索能力。 | \ |||* 升级后:方舟 API 将支持原生 `web_search` 工具调用,并支持搜索事件和结果回传。 | |在 codex 场景下新增对 `phase=commentary`、`final_answer` 的支持 |Responses API |* 升级前:API 无法兼容 `phase` 字段。 | \ |||* 升级后:codex 场景下,API 将新增对 `phase` 字段输入和输出的支持。 | |`usage` 中新增返回 `cache_creation_input_tokens` 字段 |Messages API |* 升级前:`usage` 中不返回 `cache_creation_input_tokens` 字段。 | \ |||* 升级后: | \ ||| * 返回的 `usage` 中将新增 `cache_creation_input_tokens` 字段。 | \ ||| * 在不涉及该计费场景时,该值返回 `0`。 | |DeepSeek 系列 `stop`、`stop_sequence` 数组上限由 4 个提升至 16 个 |Chat API
    Messages API |* 升级前:DeepSeek 系列支持的 `stop`、`stop_sequence` 数组上限为 `4` 个,配置超过 `4` 个会报错。 | \ |||* 升级后:该上限将提升至 `16` 个。 | |不支持模态内容输入的报错容忍 |Chat API
    Responses API
    Messages API |* 升级前:模型收到自身不支持的模态输入时会直接报错并拒绝请求。 | \ |||* 升级后:GLM-5.2、DeepSeek V4 正式版系列收到图片、视频或音频等非模型支持模态时,不再直接报错。 | |请求输入无法解析的 `encrypted_content`、`signature` 不再报错 |Chat API
    Responses API
    Messages API |* 升级前:API 接收到无法解析的 `encrypted_content`、`signature` 时会直接报错。 | \ |||* 升级后:将兼容无法解析的 `encrypted_content`、`signature` 内容输入,不会直接报错。 | |请求输入的 `content` 为部分非法内容时不再报错 |Chat API
    Responses API
    Messages API |* 升级前:API 接收到 `content` 为 `null`、空等非法内容输入时会直接报错。 | \ |||* 升级后:将兼容部分场景的非法 `content` 输入,不会直接报错。 | |`tool_call_id` 为空时不再报错 |Chat API
    Messages API |* 升级前:API 接收到 `tool_call_id` 为 `null`、空字符串等非法输入时会直接报错。 | \ |||* 升级后:将兼容部分场景的非法 `tool_call_id` 输入,不会直接报错。 | --- # 模型接入指南(LLM) - 标准流程 Source: https://ark.volcengine.com/region:cn-beijing/docs/go-live-access-sop 本文面向**已调通 API、准备将方舟大模型接入生产环境**的开发者,介绍从联调到上线放量的完整接入步骤(也称上线流程、放量流程、onboarding)。全文按三个阶段推进:**小流量测试**(参数配置、Harness 接入、联通性核验、性能基线评测) → **突发流量爬坡**(排队 Header、QPS 爬坡、削峰填谷、跨模型分流) → **生产上量**(429 错误码分类、缓存命中率、截断检测、低延迟降级监控)。 > **说明** > > **如果你还没调通第一个请求**,请先阅读 [快速入门](/docs/quick-start)。本文默认你已完成 API Key 获取、单请求调通,从"接入生产"开始讲起。 > **警告:接入前请先了解** > > 接入方舟大模型服务前,建议按下方三阶段顺序推进:先在小流量上验证参数与联通性,再按预估流量做爬坡演练,最后放开生产流量。 > > - **阶段一 · 小流量测试**:完成参数配置、Harness 接入、联通性核验、性能基线评测。 > - **阶段二 · 突发流量爬坡**:控制 Token 用量增长斜率在每 3 分钟 ≤ 20%。 > - **阶段三 · 生产环境正式大流量上量**:持续监控 429 分类、缓存命中率、截断与低延迟降级。 ## 接入流程总览 按下表顺序推进,每个阶段完成后再进入下一阶段: | 阶段 | 目标 | 关键动作 | 完成标志 | | --- | --- | --- | --- | | **小流量测试** | 确认单请求路径打通、参数配置无误 | 参数配置 > 接入 Harness > 联通测试 > 性能基线评测 | 少量请求稳定成功,性能达到预期 | | **突发流量爬坡** | 找到匹配业务的流量爬坡策略 | 4 选 1 或组合:排队 Header(首选)/ QPS 爬坡器 / 削峰填谷 / 跨模型分流 | 目标峰值下无 `RequestBurstTooFast` 429 | | **生产大流量上量** | 稳定运行并做持续观测 | 逐步放开生产流量 + 监控 429 分类、缓存命中率、截断、低延迟降级比例 | 指标稳定,进入常态运维 | ## 阶段一:小流量测试 > **验证参数与联通性、跑出性能基线报告。** ### 1. 完成推荐参数配置 Agent / Coding 场景下,`max_tokens`、`thinking`、`reasoning_effort`、采样参数、思考内容回传方式、缓存排布与客户端超时都会显著影响效果与稳定性。首次调用前请按以下推荐值配置: | 配置项 | 推荐值 | 配置错误的后果 | | --- | --- | --- | | `max_tokens` / `max_completion_tokens` | 显式传入 ≥ 128000 | 回答被截断、工具参数 JSON 不完整、Agent Loop 中断 | | `thinking` | `{"type": "enabled"}` | 用 `auto` 时模型可能跳过推理,多步任务规划能力下降 | | `reasoning_effort` | `high` 或以上 | 低档位思考不足,工具选择与参数构造错误率上升 | | `temperature` | `1` | 影响工具调用稳定性和推理质量 | | `top_p` | `0.95` | 不建议同时大幅调整两项采样参数 | | 思考内容回传 | 按模型类别选明文 / 加密回传 | 推理连续性打断、缓存失效、成本上升,详见 [常见问题 · 思考内容回传](/docs/go-live-faq#thinking-content-return) | | 客户端超时 | 非流式 ≥ 30 分钟;流式 SDK 超时 > 排队时间 | 深度思考输出长、生成慢,默认超时可能会断连 | 字段完整清单与取值原因: - [Agent 场景模型调用的正确姿势](/docs/agent-model-invocation-practice):完整参数矩阵与常见问题定位。 - [上下文缓存](/docs/context-cache):缓存生效条件与命中原则。 ### 2. 接入三方 Harness Claude Code、Codex 等三方 Harness 需要配置 Base URL、模型位、Token、超时、思考等级等一系列环境变量。 **前置准备**: - **获取 ARK_API_KEY**:登录方舟控制台 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 创建 API Key。 - **获取 Endpoint ID**:登录方舟控制台 [推理接入点](https://ark.volcengine.com/region:cn-beijing/endpoint) 创建自定义推理接入点,拿到 `ep-********` 形态的 ID。创建流程详见 [创建推理接入点](/docs/create-endpoint-api)。 **Model ID 与 Endpoint ID 的选择**:小流量测试可直接使用 Model ID;生产环境建议全部替换为 Endpoint ID(形如 `ep-********`),以便按接入点做限流、监控与版本切换。详见 [常见问题 · model 字段建议使用 Endpoint ID](/docs/go-live-faq#use-endpoint-id)。 ### 2.1 Claude Code 将以下内容写入 `~/.claude/settings.json` 或项目 `.claude/settings.json` 的 `env` 字段: ```json { "env": { "ANTHROPIC_AUTH_TOKEN": "", "ANTHROPIC_BASE_URL": "https://ark.cn-beijing.volces.com/api/compatible", "ANTHROPIC_MODEL": "", "ANTHROPIC_DEFAULT_HAIKU_MODEL": "", "ANTHROPIC_DEFAULT_SONNET_MODEL": "", "ANTHROPIC_DEFAULT_OPUS_MODEL": "", "CLAUDE_CODE_SUBAGENT_MODEL": "", "CLAUDE_CODE_MAX_OUTPUT_TOKENS": "128000", "API_TIMEOUT_MS": "1800000" } } ``` > **注意** > > **Haiku / Sonnet / Opus 三个模型位都要配**。Claude Code 内部会根据任务复杂度自动切换模型位,只配 `ANTHROPIC_MODEL` 不够,子任务可能 fallback 到默认模型导致效果不可控。 > > - **`ANTHROPIC_DEFAULT_HAIKU_MODEL`**:建议配 lite / mini 类小尺寸模型(例如 doubao-seed-2-0-lite-260428),可以显著降低端到端延时。 > - **`CLAUDE_CODE_SUBAGENT_MODEL`**:建议与主模型 `ANTHROPIC_MODEL` 保持一致。 ### 2.2 Codex 将以下内容写入 `~/.codex/config.toml`: ```toml model = "" model_provider = "volcengine" model_reasoning_effort = "high" # 若接入 minimax-m2.7 / kimi-k2.6 / kimi-k2.7-code,需删除下一行 model_supports_reasoning_summaries = true model_max_output_tokens = 128000 [model_providers.volcengine] name = "volcengine" base_url = "https://ark.cn-beijing.volces.com/api/v3" wire_api = "responses" env_key = "ARK_API_KEY" stream_idle_timeout_ms = 1800000 ``` 在 shell 中导出 API Key: ```bash export ARK_API_KEY="" ``` > **注意** > > - **部分模型不支持 reasoning summaries**:`minimax-m2.7`、`kimi-k2.6`、`kimi-k2.7-code` 接入时需要移除 `model_supports_reasoning_summaries = true` 配置项。 > - **请求 Header 必须携带 `User-Agent`**:可取 `codex_appserver` 或 `codex`,否则会报错 `json: unknown field "client_metadata"`。若客户端无法修改,可将其 `User-Agent` 加入白名单。 参考请求示例: ```Bash curl 'https://ark.cn-beijing.volces.com/api/v3/responses' \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -H "User-Agent: codex_appserver" \ -d '{ "model": "", "input": "只回复 OK", "stream": false, "max_output_tokens": 128, "store": false }' ``` 其余 Harness 的完整字段与接入方式: - [接入三方工具](/docs/integrate-third-party-tools):Chatbox、Cherry Studio、OpenCode、TRAE、Cursor、Cline 等工具的接入示例。 配置完成后若出现模型不思考、子任务用错模型等异常,请参见 [常见问题 · Harness 关键配置缺失](/docs/go-live-faq#harness-config-missing) 逐项排查。 ### 3. 联通测试 首次调用前依次核验以下项,任一失败都会导致上量后翻车: - **测试 API 连通性**:`ping ark.cn-beijing.volces.com` 应可解析且延迟正常。 - **确认 Base URL 与协议匹配**:OpenAI 兼容 `/api/v3`;Anthropic 兼容 `/api/compatible`。协议选型详见 [常见问题 · 不同协议 Base URL 不同](/docs/go-live-faq#base-url)。 - **确认 model 字段格式**:生产环境用 Endpoint ID,快速验证可用 Model ID。 - **确认代理配置**(如有):未阻断到方舟域名的连接,处理办法见 [常见问题 · 代理导致连接失败](/docs/go-live-faq#proxy-connection-failure)。 - **发送少量测试请求**:验证思考内容正常返回、`finish_reason` 非 `length`、`cached_tokens` 字段有值。 ### 4. 性能基线评测 完成参数与联通性验证后,按标准化脚本跑一次性能基线评测,避免用主观感受判断"快 / 慢"。详见 [模型接入指南(LLM) - 性能评测](/docs/go-live-benchmark-guide)。 ## 阶段二:突发流量爬坡 > **控制流量增长斜率,规避 429 / RequestBurstTooFast 突发保护。** 方舟对流量增长斜率有保护机制,Token 用量增长速率建议控制在每 3 分钟 ≤ 20%。此处"流量爬坡"也称**放量、上量、灰度切流、突增控速**——本节讲的都是同一件事:如何把流量从小到大平滑推上去、避免撞上突发保护。可组合使用的四种策略(按改造成本从低到高): | 策略 | 适用场景 | 核心动作 | | --- | --- | --- | | **排队 Header**(首选) | 所有场景通用,零代码改造 | 请求加 `X-Ark-Max-Wait-Timeout-Ms: 300000`,服务端排队而非直接报错。客户端超时需要同步调大。 | | **QPS 爬坡器** | 可控的持续流量增长 | 从 5–50 QPS 起步,按错误率动态调整;配合指数退避重试。 | | **削峰填谷** | 不可预测的瞬时峰值(如热点事件) | 用 MQ 无限制接收(削峰),消费端匀速消费(填谷),斜率恒定。 | | **跨模型分流** | 高稳定性核心业务 | 不同模型资源池独立,可分散压力。同模型多 Endpoint / 多账号分流无效(共享资源池)。 | ### 1. 排队 Header(首选) 在请求 Header 中加入 `X-Ark-Max-Wait-Timeout-Ms`(单位毫秒),服务端命中突发限流时会自动排队,而不是直接返回 429。建议值范围为 `[60000, 600000]`(1–10 分钟)。 > **注意** > > **客户端超时必须同步调大**:非流式超时 = 基础超时 + 排队时间;流式 Python / Java SDK 超时 > 排队时间即可。排队 5 分钟但客户端 30 秒超时断开等于白等。 Python 示例: ```python completion = client.chat.completions.create( model="", messages=[ {"role": "user", "content": "常见的十字花科植物有哪些?"}, ], # 突发流量最大排队时间 300000 毫秒(5 分钟) extra_headers={"X-Ark-Max-Wait-Timeout-Ms": "300000"}, stream=False, ) ``` ### 2. QPS 爬坡器 客户端从低 QPS 起步(建议 5–50),根据限流错误率动态调整: - **错误率 ≥ 5%**:降速。 - **错误率 1%–5%**:维持当前 QPS。 - **错误率 < 1%**:小幅探测提升。 - **错误率 0%**:积极提升。 配合指数退避重试(初始 100ms,最大 3s,加随机抖动)。参考参数: ```text Options{InitialRate:10, MaxRate:1000, AdjustInterval:10s, StrictErrorRatio:0.05} ``` ### 3. 削峰填谷 - 用 MQ(如 RabbitMQ 持久化队列 + 手动 ACK)无限制接收请求,削掉客户端瞬时峰值。 - 消费端按恒定斜率匀速消费,例如从 5 QPS 起步、每 5 秒 +2 QPS: ```python FLOW = {"curr_qps": 5, "max_qps": 30, "step": 2, "interval": 5, "count": 0} ``` ### 4. 跨模型分流 仅支持**跨模型**分流(如模型 A + 模型 B),不同模型资源池独立。**同模型多 Endpoint / 多账号分流无效**——同一模型底层共享资源池。 四种策略的完整参数、代码示例与错误码识别方法: - [突发流量处理最佳实践](/docs/traffic-burst-handling-best-practices):突发流量处理最佳实践。 收到 429 时先看 `error.code` 区分类型:`ModelAccountTpmRateLimitExceeded` 是配额限流(需扩容);`ServerOverloaded` / `RequestBurstTooFast` 是突发保护(需控斜率,扩容无效)。详见 [常见问题 · 429 分不清配额超限还是突发流量限流](/docs/go-live-faq#classify-429)。 ## 阶段三:生产环境正式大流量上量 > **持续监控 429 分类、缓存命中率、截断、低延迟降级。** 按已选定的爬坡策略逐步放开生产流量,同时持续关注以下指标: - **429 错误码分类**:区分配额限流与突发保护。错误码含义见 [错误码](/docs/error-codes)。 - **缓存命中率**:观察响应中的 `cached_tokens` 字段,TTFT 异常飙升时排查参数稳定性与系统提示词 / 工具定义的排列,详见 [上下文缓存](/docs/context-cache)。 - **截断检测**:`finish_reason` / `stop_reason` 为 `length` 即被截断,需调大 `max_tokens`。 - **低延迟降级比例**:如使用 `service_tier=fast`,关注 fast → default 降级量与降级触发条件,详见 [在线推理(低延迟)](/docs/online-inference-low-latency)。 若遇到效果、可用性或选型问题,请对照 [模型接入指南(LLM) - 常见问题](/docs/go-live-faq) 逐项排查。指标稳定后即进入常态运维。 ## 上线前检查清单(Checklist) 按此清单逐项核对,全部勾选后可进入正式生产环境放量。也可拷贝到内部工单 / MR 描述,供跨团队验收使用。 **阶段一:小流量测试** - [ ] `max_tokens` / `max_completion_tokens` ≥ 128000 已显式传入。 - [ ] `thinking={"type": "enabled"}`,`reasoning_effort=high`(或更高档位)。 - [ ] `temperature=1`、`top_p=0.95`。 - [ ] 思考内容回传方式已按模型类别选定(明文 / 加密块),并已在业务代码中落地。 - [ ] 客户端超时:非流式 ≥ 30 分钟;流式 SDK 超时 > 服务端排队时间。 - [ ] 已获取 `ARK_API_KEY` 与 `ep-********` 形态的 Endpoint ID。 - [ ] 三方 Harness(Claude Code / Codex 等)配置文件已按 [接入三方 Harness](/docs/go-live-access-sop#third-party-harness) 落地。 - [ ] 联通性自检通过:思考内容正常返回、`finish_reason` 非 `length`、`cached_tokens` 字段有值。 - [ ] 性能基线评测已跑完([模型接入指南(LLM) - 性能评测](/docs/go-live-benchmark-guide)),产出 `reports/prefix_*/` 与 `reports/multiturn_*/` 目录。 **阶段二:突发流量爬坡** - [ ] 已确认预估峰值 TPM / RPM 与账号配额上限的差距。 - [ ] 已在客户端加上 `X-Ark-Max-Wait-Timeout-Ms` 排队 Header,客户端超时同步调大。 - [ ] 有匹配的 QPS 爬坡逻辑(或使用 QPS 爬坡器策略)。 - [ ] 对突发峰值场景(热点事件、定时任务)有削峰填谷或跨模型分流兜底。 - [ ] 已理解 429 两类错误码的区分方法(配额限流 vs 突发保护)。 **阶段三:生产上量** - [ ] 429 错误码分类监控与告警已配置(`ModelAccountRpmRateLimitExceeded` / `ModelAccountTpmRateLimitExceeded` / `ServerOverloaded` / `RequestBurstTooFast` 分别告警)。 - [ ] 缓存命中率(`cached_tokens`)监控已配置,异常降低触发告警。 - [ ] 截断检测(`finish_reason` / `stop_reason == length`)监控已配置。 - [ ] 如使用 `service_tier=fast`,fast → default 降级比例监控已配置。 - [ ] 已阅读 [模型接入指南(LLM) - 常见问题](/docs/go-live-faq),理解常见问题的现象、原因与排查路径。 --- # 模型接入指南(LLM) - 性能评测 Source: https://ark.volcengine.com/region:cn-beijing/docs/go-live-benchmark-guide 本指南面向**已完成接入、准备上线放量前需要跑一次性能基线评测**的场景(也称压测 / benchmark / 性能测试),在自有环境下对方舟模型推理接入点做一次标准化压测,产出可信、可复现的性能报告。 - **测什么**:TTFT(首 token 延迟)、TPOT(每 token 间隔)、E2E(端到端耗时)、缓存命中率。 - **怎么测**:优先在同机同网环境,用自有压测工具或方舟提供的 llm-bench 工具,跑「前缀复用」及「多轮长上下文」两类场景。 - **交付什么**:把生成的 `reports/prefix_<时间戳>/` 和 `reports/multiturn_<时间戳>/` 目录打包,发给您的客户经理或后算服务工程师。 ## 核心指标口径 大语言模型采用流式逐 token 生成方式,用户实际体验由以下四项核心指标决定: | 指标 | 定义 | 计算口径 | 主要影响因素 | | --- | --- | --- | --- | | **TTFT**(Time to First Token,首字延迟) | 从请求发出到收到首个输出 token 的时间 | `TTFT = 首个 token 到达时间 − 请求发送时间`(含网络往返) | 与输入长度强相关(评测时需统一约定输入长度);与缓存命中率强相关 | | **E2E 延迟**(端到端总耗时) | 从请求发出到收到最后一个输出 token 的总耗时 | `E2E = 最后内容 chunk 到达时间 − 请求发送时间` | 与输入 / 输出长度均强相关 | | **TPOT**(Time Per Output Token) | 输出阶段 token 生成速率,即相邻两个输出 token 之间的平均间隔 | `TPOT = (E2E − TTFT) / (输出 token 数 − 1)` | 长输出下趋于稳定 | | **缓存命中率** | 请求输入中命中缓存的 token 数占总输入 token 数的比例 | `cached_tokens / prompt_tokens × 100%`(按 token 加权平均) | 直接影响 TTFT;命中率越高,推理成本越低 | 在 Agent、Coding 等对响应实时性敏感的场景中,这 4 项指标是评估模型能否满足业务需求的核心依据。 统计分位建议同时记录 AVG(平均值,反映整体水平)、P50(中位数,典型用户体验)、P99(99 分位,反映长尾抖动)。 ## 测试准备 请在您自己的环境下,结合线上平均输入长度在「固定前缀 + 变化后缀」场景对方舟模型接入点跑一次评测。**同机同网、参数对齐**是有效结论的前提。 评测前请确认以下参数已经对齐: - **模型版本**:方舟 Endpoint / Model ID 明确记录。 - **reasoning_effort**:本次评测的取值保持一致(如统一 `none` 或 `high`)。 - **max_completion_tokens / max_output_tokens**:一致。 - **输入 / 输出长度**:前缀长度、后缀长度、多轮上下文长度对齐。 - **并发数**:`max_concurrency` 一致。 - **思考口径**:`reasoning_effort` 保持一致,避免"这次思考、下次不思考"造成的错位对比。 ## 测试工具选择 | 您的情况 | 选用工具 | | --- | --- | | 已有 vLLM `benchmark_serve` / SGLang `bench_serving` 等压测工具 | 沿用自有工具,按线上输入 / 输出长度参数配置即可 | | 没有现成工具 | 用方舟提供的 llm-bench 工具(OpenAI Chat 协议,指标口径对齐 vLLM `benchmark_serve`) | llm-bench 有两种使用方式,任选其一: - **一键 Agent Skill**(推荐):使用 Claude Code、豆包企业版等 Agent 工具的用户可一键安装,自然语言即可触发压测。详见 [一键 Skill 压测](/docs/go-live-benchmark-guide#one-click-skill)。 - **命令行直接跑**:熟悉 shell 的用户可从 Skill 包获取 llm-bench 源码后手动运行。详见 [命令行压测步骤](/docs/go-live-benchmark-guide#cli-steps)。 ## 一键 Skill 压测 ### 前置条件 - **Node.js ≥ 18** 与 npm(用于运行 `npx skills` 命令)。 - **Ark CLI** 已安装并完成 SSO 登录: ```bash npm install -g @volcengine/ark-cli@latest arkcli auth login volc-sso ``` Skill 内部通过 Ark CLI 获取 API Key 与推理接入点信息,若未安装则触发 skill 会报 `arkcli is required`。 - **支持 Agent Skill 的工具**:Claude Code、豆包企业版、Codex、Trae 等。`npx skills add` 命令会自动写入这些工具的 skill 目录,重新打开会话即可加载。 ### 安装 skill ```bash npx --yes skills@latest add "https://arkdocs.tos-cn-beijing.volces.com/skills/" \ --skill ark-model-benchmark \ --yes ``` ### 触发压测 安装完成后,用自然语言触发即可,例如:"帮我压测一下方舟上豆包 Seed 2.0 Mini 模型的性能"。Skill 会自动完成 Ark CLI 登录检查、模型解析、连通性 / Prefix / Multi-turn 三种场景压测,并在 `reports/` 目录下输出 Markdown 报告与 PNG 图表。 ## 命令行压测步骤 ### Step 1 · 获取 llm-bench Skill 包内嵌了 llm-bench 源码(含 `run_prefix.sh` / `run_multiturn.sh` / 语料 / 报告模板等)。先按 [一键 Skill 压测 · 安装 skill](/docs/go-live-benchmark-guide#one-click-skill) 安装 skill,然后从 skill 目录取出 `llm_bench/`: ```bash # skills CLI 通常会用 symlink 部署,find 必须加 -L 才能跟随 LLM_BENCH_DIR=$(find -L ~/.claude/skills .claude/skills .agents/skills \ -maxdepth 5 -type d -name llm_bench 2>/dev/null | head -1) echo "$LLM_BENCH_DIR" # 应输出类似 .claude/skills/ark-model-benchmark/llm_bench cp -r "$LLM_BENCH_DIR" ./llm_bench cd llm_bench ``` 若您不使用 Skill CLI,也可以联系客户经理或后算服务工程师直接获取 llm-bench zip 包。 ### Step 2 · 安装依赖 ```bash python3 -m venv .venv source .venv/bin/activate pip install -r requirements.txt export ARK_BASE_URL="https://ark.cn-beijing.volces.com/api/v3" export ARK_API_KEY="" ``` ### Step 3 · 连通性自检 将 `` 替换为方舟推理接入点 ID 或 Model ID: ```bash # 发 1 个请求验证地址 / 密钥 / 模型可用,并打印 TTFT / usage / cached_tokens python bench.py connectivity --model ``` ### Step 4 · 正式压测 llm-bench 提供两个入口脚本,分别对应「前缀复用」与「多轮长上下文」两个核心场景: ```bash # 直接跑 ./run_prefix.sh ./run_multiturn.sh # 覆盖参数:环境变量前置即可 MAX_CONCURRENCY=20 PREFIX_LEN=12000 SUFFIX_LEN=2000 NUM_REQUESTS=200 \ ./run_prefix.sh # multiturn:想让命中率曲线更平滑可提到 50 个 session MAX_CONCURRENCY=10 NUM_SESSIONS=50 MAX_TURNS=20 \ ./run_multiturn.sh ``` > **注意** > > 请在同机同网条件下测试。网络往返或代理会让 TTFT / E2E 明显虚高,导致结论失真。 ### Step 5 · 交付报告 跑完自动生成目录 `reports/prefix_<时间戳>/` 和 `reports/multiturn_<时间戳>/`(多次运行互不混杂)。请把这两个目录打包,发给您的客户经理或后算服务工程师。 拿到同口径数据后,若方舟指标与您的预期确有差距,我们会分析差距并进一步优化;若差距源于口径或环境差异,也能第一时间澄清。 ## 报告示例 llm-bench 生成的报告示例(片段)如下,可作为汇报格式参考。 ### 前缀复用(Prefix)场景 ````markdown # LLM Benchmark Report - prefix - **压测时间**: 2026-08-28 13:37:57 - **模式**: prefix - **API 地址**: https://ark.cn-beijing.volces.com/api/v3 - **长度口径**: tiktoken(精确切片) - **max_completion_tokens**: 512 - **reasoning_effort**: none - **prefix_len**: 12000 - **suffix_len**: 2000 - **num_requests**: 200 - **max_concurrency**: 5 ## 结果总览 | 模型 | 成功/失败 | TTFT avg (ms) | TTFT P99 (ms) | TPOT avg (ms) | E2E avg (ms) | 加权缓存命中率 | |---|---|---|---|---|---|---| | deepseek-v4-flash-ga-260731 | 200/0 | 2278.7 | 3362.4 | 10.4 | 6421.3 | 77.85% | ```` ### 多轮长上下文(Multi-turn)场景 ````markdown # LLM Benchmark Report - multiturn - **压测时间**: 2026-08-28 13:42:35 - **模式**: multiturn - **max_completion_tokens**: 1024 - **initial_len**: 3000 - **question_len**: 256 - **num_conversations**: 10 - **max_turns**: 20 - **max_concurrency**: 5 - **长度形态**: Turn1 输入 3000 tokens,追问各 256 tokens,回答各 ≤1024 tokens,最终轮 ≈ 27320 tokens - **429 / 网络重试次数**: 0 ## 结果总览 | 模型 | 成功/失败 | TTFT avg (ms) | TTFT P99 (ms) | TPOT avg (ms) | E2E avg (ms) | 加权缓存命中率 | |---|---|---|---|---|---|---| | deepseek-v4-flash-ga-260731 | 200/0 | 2260.9 | 3435.6 | 10.1 | 11824.6 | 87.87% | ```` ## 常见无效反馈示例 以下反馈因缺少量化指标或口径信息,无法定位问题,也无法澄清是否为口径差异。请按上一节报告格式提供数据: | 无效反馈 | 为什么无效 | | --- | --- | | 跑起来感觉很慢 | 纯主观,无量化指标,分不清慢在首 token 还是整体输出 | | 首 token 出现的很慢,但不说输入长度 | TTFT 与输入长度、缓存命中率强相关,无法判断是否正常 | | 提供了对比结论,但两边参数设定不明确 | 口径不对齐的对比没意义,差距可能来自思考等级参数差异,导致 E2E 拉长 | | 只发一句「性能不达标」 | 无原始报告和数据,无法定位也无法澄清是否口径差异 | ## 附录:方舟推理服务性能观测 为便于实时观测性能指标,方舟控制台提供了性能观测入口,可以按不同输入长度查看不同测试指标:。 ## 附录:结果偏差解读 拿到评测结果后,如遇到指标异常,可对照下表定位: - **`cached_tokens` 异常偏低**:多轮请求缓存未命中,参见 [常见问题 · 缓存失效](/docs/go-live-faq#cache-invalidation)。 - **TTFT 异常偏高**:可能是深度思考模型输出偏长,或客户端超时不够,参见 [常见问题 · 客户端超时不够导致断连](/docs/go-live-faq#client-timeout)。 - **fast 模式延迟不稳定**:低延迟模式发生降级,参见 [常见问题 · 低延迟模式非 100% 生效](/docs/go-live-faq#low-latency-degradation)。 --- # 模型接入指南(LLM) - 常见问题 Source: https://ark.volcengine.com/region:cn-beijing/docs/go-live-faq 本文汇总方舟大模型**接入 / 上线过程中的常见问题**(效果、可用性、接入配置、选型四类),每个问题按 现象 → 原因 → 排查思路 → 深度阅读 组织。同类问题也可能被称作"FAQ / 排障指南 / 接入常见问题 / 上线常见问题"。 ## 模型效果类问题 ### 思考内容没回传,静默影响推理效果 - **现象**:Coding / Agent 场景下多轮工具调用效果随轮数增加而下降;相同 Prompt 在不同实现下任务通过率差异明显;缓存命中率异常。 > **注意** > > Seed-Evolving、Seed 2.1 系列及往后模型需重点关注。这些模型返回的是加密思考块,若不回传,模型推理效果会显著下降,且不会有任何 API 报错提示。 - **原因**:Agent 场景是多轮"推理 → 调工具 → 拿结果 → 继续推理"循环。如果不回传思考内容,推理连续性会被打断、多步执行稳定性下降、缓存被破坏成本上升,最终导致模型性能显著下降。 - **排查思路**: - **选对回传字段**:根据模型和 API 类型,选明文 `reasoning_content` / 加密 `encrypted_content` / Anthropic `signature`。 - **Chat API 整体回传**:将响应中的 assistant message 整体加入下一轮 `messages`,不要按字段挑选重建。 - **Responses API 用托管上下文(推荐)**:使用 `previous_response_id` + `store: true`,服务端自动管理回传。 - **Anthropic 兼容 API 整块回传**:`thinking` 块必须整块回传(`thinking` 文本 + `signature`),保持在 `tool_use` 块之前的原始顺序。 - **遵守加密块关键规则**: - 必须**原样、完整**回传,任何篡改或截断都会返回 `Invalid signature` 错误。 - 不回传不报错,但静默影响推理效果。 - **思考内容按原始(加密块内)token 计费**,不回传等于已付费但未生效。 - 加密字段优先级高于明文摘要:同时传入时,明文摘要会被忽略。 - 流式响应中 `encrypted_content` 由独立 chunk 下发(思考完成后、正式应答前),流式合并逻辑必须处理该字段。 - 同一模型不同版本可能属于不同类别(如 `doubao-seed-2-0-lite-260215` 是明文,`doubao-seed-2-0-lite-260428` 改为加密块)。**升级模型版本时必须同步检查回传代码**,否则回传失效且不会报错。 - **深度阅读**: - [Agent 场景模型调用的正确姿势](/docs/agent-model-invocation-practice):各 API 字段矩阵、明文 / 加密支持模型清单、完整代码示例与流式响应处理规则。 ### Harness 关键配置缺失 - **现象**:用 Codex CLI、Claude Code 等工具接入后,模型不思考、不走 Responses API、子任务用错模型,可能导致效果差很多。 - **原因**:三方 Harness 涉及多个模型位、超时、思考等级等环境变量,任一缺失都会导致行为退化。 > **注意** > > Agent / Coding 场景不推荐使用 Chat API。Codex 优先使用 Responses API,Claude Code 使用 Anthropic 兼容 API。 - **排查思路**:**对照完整配置示例逐项核查**。完整配置模板已放在 [标准流程 · 接入三方 Harness](/docs/go-live-access-sop#third-party-harness),常见漏项如下: - **Claude Code**: - **Haiku / Sonnet / Opus 三个模型位都要配**:只配 `ANTHROPIC_MODEL` 不够,子任务可能 fallback 到默认模型。 - **HAIKU 位配 lite / mini**:`ANTHROPIC_DEFAULT_HAIKU_MODEL` 建议配 lite / mini 类小尺寸模型,避免端到端延时过长。 - **SUBAGENT 与主模型一致**:`CLAUDE_CODE_SUBAGENT_MODEL` 建议与 `ANTHROPIC_MODEL` 保持一致。 - **Codex**: - **携带 User-Agent Header**:请求 Header 必须带 `User-Agent`(可取 `codex_appserver` / `codex`),否则报错 `json: unknown field "client_metadata"`。若中台无法修改,可将客户端 `User-Agent` 加入白名单。 - **部分模型移除 reasoning summaries**:`minimax-m2.7` / `kimi-k2.6` / `kimi-k2.7-code` 不支持 `model_supports_reasoning_summaries = true`,接入这些模型时需要移除该配置项。 - **调大最大输出长度**: - Claude Code 设置 `CLAUDE_CODE_MAX_OUTPUT_TOKENS=128000`。 - Codex 设置 `model_max_output_tokens=128000`。 - **调大客户端超时**: - Claude Code 设置 `API_TIMEOUT_MS=1800000`。 - Codex 设置 `stream_idle_timeout_ms=1800000`。 - **深度阅读**: - [标准流程 · 接入三方 Harness](/docs/go-live-access-sop#third-party-harness):Claude Code / Codex 完整 JSON / TOML 配置示例与说明。 - [接入三方工具](/docs/integrate-third-party-tools):其他 Harness(Chatbox、Cherry Studio、TRAE 等)的接入示例。 ### `max_tokens` 没传或太小,输出被截断 - **现象**:模型回答到一半停了、工具调用的 JSON 参数半截解析失败、Agent Loop 中途断掉。常被误判为模型"不会做"或"不稳定"。 - **原因**:`max_tokens`(Chat API)/ `max_output_tokens`(Responses API)不传时可能使用较小默认值,Agent 场景下思考链 + 工具调用 + 正式回答的输出长度很容易超过。 - **排查思路**: - **显式传入 max_tokens**:Agent / Coding 场景建议 ≥ 128000。 - **配置 Claude Code 输出上限**:设置环境变量 `CLAUDE_CODE_MAX_OUTPUT_TOKENS=128000`。 - **检查截断标识**:查看响应中的 `finish_reason`(Chat)/ `stop_reason`(Responses),值为 `length` 即被截断。 - **深度阅读**: - [Agent 场景模型调用的正确姿势](/docs/agent-model-invocation-practice):输出长度参数配置章节。 ### `thinking=auto`,模型未开启深度推理 - **现象**:简单问题回答正常,复杂多步任务(架构设计、多工具编排)效果明显差,模型不做规划直接给答案。 - **原因**:`thinking` 设为 `auto` 时,模型自行判断是否需要深度思考。Agent 场景下模型可能误判任务简单而跳过推理,导致工具选择和参数构造错误率上升。 - **排查思路**:**显式启用深度思考**:Agent / Coding 场景显式设置 `thinking={"type": "enabled"}`,同时 `reasoning_effort` 建议设为 `high` 或以上。 - **深度阅读**: - [深度思考](/docs/deep-thinking):深度思考功能的适用范围与配置细节。 ### 缓存失效 - **现象**:多轮对话越聊越慢(TTFT 飙升)、成本上升,但没有任何报错。客户往往误以为"模型变慢了"。 - **原因**:Session 内改动采样参数、思考配置、工具定义或系统提示词,都会重置缓存。 - **排查思路**: - **保持 Session 参数稳定**:同一 Session 内不改动采样参数(`temperature` / `top_p`)、思考配置(`thinking` / `reasoning_effort`)、工具定义(`tools`)、系统提示词。 - **前置公共前缀**:系统提示词与工具定义放在请求最前部。 - **开启显式缓存**:`store: true`(默认即 `true`)+ `caching={"type": "enabled"}`。 - **监控命中率**:观察响应中的 `cached_tokens` 字段。 - **深度阅读**: - [上下文缓存](/docs/context-cache):前缀缓存与显式缓存的完整生效条件。 ### 低延迟模式非 100% 生效 - **现象**:设了 `service_tier=fast`,但延迟忽快忽慢,有时候和常规模式没区别。 - **原因**:低延迟推理在超出 fast TPM 限流配额、命中 QoS 防护、异常高并发或超长请求时,会自动降级为常规在线推理,降级后请求仍可能成功但延迟回到常规水平。低延迟与常规的限流配额相互独立,需要分别评估。 - **排查思路**: - **观察 fast 模式指标**:在控制台监控页关注 fast 模式 TPM、降级量(fast → default)和降级比例。 - **按峰值 TPM 评估配额**:而非分钟平均(限流计算周期为 10–15 秒)。 - **控制流量斜率**:流量增长斜率同样受每 3 分钟 20% 的限制。 - **避开长输出请求**:长输出请求不建议使用低延迟模式。 - **深度阅读**: - [在线推理(低延迟)](/docs/online-inference-low-latency):自动降级触发条件(限流限制、斜率限制、攻击 / 长请求防护)与限流配额规则。 ## 服务可用性与稳定性问题 ### 429 分不清配额超限还是突发流量限流 - **现象**:收到 429 错误,客户一律以为"额度不够",去提工单扩容,但实际可能是突发流量保护,扩容解决不了问题。 - **原因**:方舟对 429 有两种不同触发机制,`error.code` 字段可以直接区分。 - **排查思路**:**先看 error.code 定位机制**:拿到 429 后先看响应体里的 `error.code`: | 机制 | 触发条件 | 典型错误码 | 解法 | | --- | --- | --- | --- | | 配额限流 | RPM / TPM 超过配额 | `ModelAccountRpmRateLimitExceeded`、`ModelAccountTpmRateLimitExceeded` | 调大接入点限流 / 提工单扩容 / 降速 | | 突发保护 | 流量增长过快或资源紧张,配额可能没用完 | `ServerOverloaded`(seed-1.8 及之前)、`RequestBurstTooFast`(seed-2.0 及之后) | 控斜率 + 排队 + 重试,扩容无效 | - **深度阅读**: - [错误码](/docs/error-codes):完整错误码含义。 - [突发流量处理最佳实践](/docs/traffic-burst-handling-best-practices):突发保护的处理策略。 ### 突发流量导致 429,扩容无效 - **现象**:业务刚上线或定时任务集中触发时大量 429(`ServerOverloaded` / `RequestBurstTooFast`),但平峰期正常。 - **原因**:方舟对流量增长斜率有保护,建议 Token 用量增长速率控制在每 3 分钟 20% 以内。平台遇到突发会快速扩容(分钟级),但客户端如果猛打流量,扩容来不及就会熔断。 - **排查思路**:**按策略控制爬坡**:使用排队 Header(首选)、QPS 爬坡器、削峰填谷或跨模型分流。核心动作对比见 [标准流程 · 阶段二:突发流量爬坡](/docs/go-live-access-sop#traffic-burst-strategy)。 - **深度阅读**: - [突发流量处理最佳实践](/docs/traffic-burst-handling-best-practices):四种策略的完整参数、代码示例与选型建议。 ### 客户端超时不够导致断连 - **现象**:调用深度思考模型时频繁超时报错;非流式模式下长时间无响应后断开连接,任务未完成且已产生 token 用量费用;叠加排队 Header 后超时更易触发。 - **原因**: - 深度思考模型使用思维链输出内容,回复篇幅更长、生成速率更慢,默认超时(通常 30s–60s)不足以覆盖完整生成时间。 - 开启 thinking summary 能力的模型,包间延迟较高。 - 叠加排队 Header(`X-Ark-Max-Wait-Timeout-Ms`)后,客户端超时需同步叠加。 - **排查思路**: - **优先改为流式输出**:使用 `stream=true` 分块即时返回内容,维持连接活性,规避长任务超时。 - **调大非流式超时**:客户端超时 = 模型生成时间 + 排队时间,Agent 场景建议设 30 分钟以上;同时留意 TCP Keep-Alive 设置,避免防火墙 / 路由器主动断连。 - **Go SDK 强制调大超时**:无论是否使用流式输出,均需将 SDK 超时参数设置为 30 分钟以上。 - **同步放大 Claude Code 超时**:设置 `CLAUDE_CODE_MAX_OUTPUT_TOKENS=128000` 后输出变长,`timeout` 也要相应调大。 - **深度阅读**: - [深度思考](/docs/deep-thinking):深度思考模型的输出时长与包间延迟说明。 - [突发流量处理最佳实践](/docs/traffic-burst-handling-best-practices):排队 Header 与客户端超时的配套关系。 ### 同模型多 Endpoint / 多账号分流无效 - **现象**:客户为了规避限流,创建多个 Endpoint 或用多个账号轮询调用同一个模型,结果仍然 429。 - **原因**:方舟模型限流是同主账号下同模型共享的,不区分版本。可以对自定义推理接入点单独限流,但同一模型的所有 Endpoint 和账号底层共享同一个资源池,流量最终汇聚。 - **排查思路**: - **改用跨模型分流**:如同时调用 seed-2.1-pro 和 seed-2.0-pro,不同模型资源池独立。 - **提工单扩容配额**:单模型账号级配额提升。 - **配合排队 Header 与 QPS 爬坡**:控制发送速率。 - **深度阅读**: - [突发流量处理最佳实践](/docs/traffic-burst-handling-best-practices):跨模型分流的适用场景与配置方式。 ### 冷启动首请求报错 - **现象**:长时间没有流量的 Endpoint,突然调用时报 `ServerOverloaded` / `InflightBatchsizeExceeded`,但过一会儿再调就正常了。 - **原因**: - `ServerOverloaded`:长时间无流量时服务缩容,第一个请求撞上扩容过程。 - `InflightBatchsizeExceeded`:服务过载熔断,限制该时段内有突发请求、新上量的客户;流量平稳的客户不受影响。 - **排查思路**: - **携带排队 Header**:请求加 `X-Ark-Max-Wait-Timeout-Ms`,给服务端扩容留出时间。 - **客户端爬坡预热**:从低 QPS 开始逐步提升,不要一上来就打满。 - **错峰触发定时任务**:避免集中冷启动。 - **申请提额**(仅限 `InflightBatchsizeExceeded`):非默认 TPM 能够豁免系统熔断。 - **深度阅读**: - [突发流量处理最佳实践](/docs/traffic-burst-handling-best-practices):冷启动预热与排队策略的组合用法。 ### 代理导致连接失败 - **现象**:调用方舟 API 报 `ArkAPIConnectionError` 域名连接超时,或 `httpx.InvalidURL: Invalid port ':'`,客户以为方舟服务不可用。 - **原因**:客户环境配置了 HTTP / HTTPS 代理(公司网络常见),请求走了代理导致无法连接方舟域名;或代理 URL 格式不兼容(如 `socks5h`)。 - **排查思路**:**禁用代理或加白名单**: ```python # 禁用代理 client = Ark( api_key=os.environ.get("ARK_API_KEY"), base_url="https://ark.cn-beijing.volces.com/api/v3", http_client=httpx.Client(proxies={"http://": None, "https://": None}), ) ``` 或设置环境变量 `no_proxy="ark.cn-beijing.volces.com"`。先 `ping ark.cn-beijing.volces.com` 确认网络连通性;Linux 环境检查 `/etc/resolv.conf` DNS 配置。 ### 图片输入失败 - **现象**:视觉模型调用报 `InvalidParameter`,图片 URL 明明可以访问。 - **原因**:方舟服务端下载图片的限制:默认超时 5 秒;必须公网可访问;Content-Type 需与实际格式匹配;建议压缩至 100kB 以下。 - **排查思路**:**改用同区域 TOS 或 Base64**:将图片转存到火山引擎 TOS(同区域内网传输快),或压缩后使用 Base64 传入。 ### 流式与非流式选择 - **现象**:非流式模式在长任务下频繁超时;流式模式拼接完成后 `usage` 拿不到。 - **原因**:Chat API 通过 `stream` 参数控制返回方式,两种模式的返回机制、超时风险、`usage` 默认行为均不同。 - **排查思路**: - **选非流式**:适合结构化结果、Function Calling 参数解析、后端批处理。一次性返回完整响应体,`usage` 默认包含;缺点是长任务易超时。 - **选流式**:适合对话交互、长文本 / 深度思考生成。按 SSE 逐块返回,TTFT 低,可规避长任务超时;`usage` 默认不返回,需设 `stream_options={"include_usage": true}`。 - **深度阅读**: - [流式输出](/docs/streaming-output):流式响应的完整拼接逻辑与最佳实践。 ## 接入配置问题 ### `model` 字段建议使用 Endpoint ID 而非 Model ID - **现象**:生产环境使用 Model ID 调用,难以做限流配置、版本切换和监控。 - **原因**:Endpoint ID(形如 `ep-********`)可以对模型调用做更精细化的管理。 - **排查思路**: - **快速验证用 Model ID**:新用户可以直接用 Model ID 或预置接入点 Endpoint ID。 - **生产环境用 Endpoint ID**:创建自定义推理接入点,用 Endpoint ID 调用,便于做限流配置、版本切换和监控。 - **深度阅读**: - [创建推理接入点](/docs/create-endpoint-api):控制台入口与创建流程。 ### 不同协议 Base URL 不同 - **现象**:Claude Code 配了 `/api/v3` 的 Base URL 报奇怪的错;OpenAI 兼容工具配了 `/api/compatible` 也报错。 - **原因**:方舟提供两套兼容协议,Base URL 不同。 - **排查思路**: - **配 OpenAI 兼容 Base URL**:`https://ark.cn-beijing.volces.com/api/v3`,适用 Codex CLI、Chatbox、Cherry Studio、OpenCode、TRAE、Cursor、Cline 等。 - **配 Anthropic 兼容 Base URL**:`https://ark.cn-beijing.volces.com/api/compatible`,适用 Claude Code 等 Anthropic 生态工具。 - **深度阅读**: - [接入三方工具](/docs/integrate-third-party-tools):各工具的完整 Base URL 与 Header 配置。 ## 选型注意事项 ### Responses API 不支持保障包 / 精调模型 / 智能路由 - **现象**:新业务按推荐上了 Responses API,后续要接 TPM 保障包或精调模型时发现不支持,得回退 Chat API,返工成本高。 - **原因**:Responses API 目前不支持以下功能:TPM 保障包(已几乎不再售卖)、精调后模型的在线推理、智能模型路由、在线推理服务的模型版本平滑切换。 - **排查思路**: - **新业务优先 Responses API**:如果明确不需要 TPM 保障包 / 精调 / 智能路由,选它(自动上下文管理、内置工具、缓存降本)。 - **有历史依赖继续 Chat API**:如果已有或计划使用精调模型、保障包,继续用 Chat API。 - **深度阅读**: - [迁移至 Responses API](/docs/responses-api-migration):Responses API 与 Chat API 的功能矩阵与迁移指南。 --- # Seedance 2.0-2.5 模型资源包使用规则 Source: https://ark.volcengine.com/region:cn-beijing/docs/seedance-2-0-model-resource-pack-rules 本文档介绍了 Doubao Seedance 2.5、Doubao Seedance 2.0 系列模型资源包的购买规则、抵扣逻辑及注意事项。资源包采用**预付费**模式,仅用于抵扣在线推理产生的 Token 消耗。您可前往 [Seedance 系列资源包](https://console.volcengine.com/common-buy/ark_bd%7C%7Cd9li7rchmjlhari755h0) 进行选购。 > **注意** > > 1. 资源包自购买起 7 天内且额度未使用可申请全额退款;一经使用或超过 7 天,则不支持退订。请结合实际业务规模,选择匹配的规格。 > 2. 如果资源包全部到期或额度全部抵扣完后,若仍有超出部分,自动转为按量后付费。请在使用之前合理预估您的资源包与账号余额。 > 3. 为保障调用体验,部分资源包有起售个数限制,若您购买的是 700万 tokens 资源包,即购买了 7 个 100万 tokens 资源包;如需更高额度,您可叠加不同规格的 Tokens 资源包。 # 规格选择 | | | | | | | |模型 |资源包规格 |刊例价 |购买数量 |有效期 |抵扣范围 | |---|---|---|---|---|---| | | | | | | | |Doubao Seedance 2.5 | 500万 Tokens |210元 |无限制 |90天 |可用于抵扣模型在线推理产生的 tokens 消耗 | |^^| | | |^^|^^| \ | | 1000万 Tokens |420元 |无限制 | | | |^^| | | |^^|^^| \ | | 1亿 Tokens |4200元 |无限制 | | | |Doubao Seedance 2.0 | 100万 Tokens |28元 |为保障调用体验,7个起售 |90天 |可用于抵扣模型在线推理产生的 tokens 消耗 | |^^| | | |^^|^^| \ | | 1000万 Tokens |280元 |无限制 | | | |^^| | | |^^|^^| \ | | 1亿 Tokens |2800元 |无限制 | | | |Doubao Seedance 2.0 fast | 100万 tokens |22元 |为保障调用体验,9个起售 |90天 |可用于抵扣模型在线推理产生的 tokens 消耗 | |^^| | | |^^|^^| \ | | 1000万 tokens |220元 |无限制 | | | |^^| | | |^^|^^| \ | | 1亿 tokens |2200元 |无限制 | | | |Doubao Seedance 2.0 mini | 1400万 tokens |196元 |无限制 |90天 |可用于抵扣模型在线推理产生的 tokens 消耗 | |^^| | | |^^|^^| \ | | 1000万 tokens |140元 |为保障调用体验,2个起售 | | | |^^| | | |^^|^^| \ | | 1亿 tokens |1400元 |无限制 | | | # Tokens 抵扣规则 资源包用于直接抵扣模型产生的 Tokens 消耗。由于 Seedance 系列模型包含不同的输入场景(如含视频输入、无视频输入)且各场景的 Tokens 单价不同,因此抵扣比例也会进行相应的换算。 为了方便理解,资源包统一以单价较低的‘含视频输入’场景作为 1:1 抵扣标准。也就是说,当您在单价更高的‘无视频输入’场景下创作时,实际消耗 1 Token,将会按单价比例自动折算,扣除多于 1 资源包 Tokens。 | | | | | | | |模型资源包 |创作场景 |视频分辨率 |Tokens 单价 |抵扣比例 |抵扣说明 | |---|---|---|---|---|---| | | | | | | | |Doubao Seedance 2.5 资源包 |含视频输入 |480P/720P |0.042 元 / 千 Tokens |1 : 1 |消耗 1 Token = 消耗 1 资源包额度 | |^^| | | | | | \ | |无视频输入 |480P/720P |0.070 元 / 千 Tokens |1 : 1.6667 |消耗 1 Token ≈ 消耗 1.6667 资源包额度 | |^^| | | | | | \ | |含视频输入 |1080P |0.046 元 / 千 Tokens |1 : 1.0952 |消耗 1 Token = 消耗 1.0952 资源包额度 | |^^| | | | | | \ | |无视频输入 |1080P |0.077 元 / 千 Tokens |1 : 1.8333 |消耗 1 Token ≈ 消耗 1.8333 资源包额度 | |Doubao Seedance 2.0 资源包 |含视频输入 |480P/720P |0.028 元 / 千 Tokens |1 : 1 |消耗 1 Token = 消耗 1 资源包额度 | |^^| | | | | | \ | |无视频输入 |480P/720P |0.046 元 / 千 Tokens |1 : 1.6429 |消耗 1 Token ≈ 消耗 1.6429 资源包额度 | |^^| | | | | | \ | |含视频输入 |1080P |0.031 元 / 千 Tokens |1 : 1.1071 |消耗 1 Token ≈ 消耗 1.1071 资源包额度 | |^^| | | | | | \ | |无视频输入 |1080P |0.051 元 / 千 Tokens |1 : 1.8214 |消耗 1 Token ≈ 消耗 1.8214 资源包额度 | |^^| | | | | | \ | |含视频输入 |4K |0.016 元 / 千 Tokens |1 : 0.5714 |消耗 1 Token ≈ 消耗 0.5714 资源包额度 | |^^| | | | | | \ | |无视频输入 |4K |0.026 元 / 千 Tokens |1 : 0.9286 |消耗 1 Token ≈ 消耗 0.9286 资源包额度 | |Doubao Seedance 2.0 fast 资源包 |含视频输入 |480P/720P |0.022 元 / 千 Tokens |1 : 1 |消耗 1 Token = 消耗 1 资源包额度 | |^^| | | | | | \ | |无视频输入 |480P/720P |0.037 元 / 千 Tokens |1 : 1.6819 |消耗 1 Token ≈ 消耗 1.6819 资源包额度 | |Doubao Seedance 2.0 mini 资源包 |含视频输入 |480P/720P |0.014 元 / 千 Tokens |1 : 1 |消耗 1 Token = 消耗 1 资源包额度 | |^^| | | | | | \ | |无视频输入 |480P/720P |0.023 元 / 千 Tokens |1 : 1.6429 |消耗 1 Token ≈ 消耗 1.6429 资源包额度 | # 模型开通、使用与资源包购买关系说明 ## Seedance 2.5 与 Seedance 2.0 系列模型开通 满足以下 **任意一项**,即可开通 Seedance 2.0 系列模型与 Seedance 2.5 模型: 1. 账户余额 > 200 元 ([充值入口](https://console.volcengine.com/finance/fund/recharge)) 2. 购买了 Seedance 2.5 资源包,且**当前有余量** ([资源包购买入口](https://console.volcengine.com/common-buy/ark_bd%7C%7Cd9li7rchmjlhari755h0)) 3. 购买了 Seedance 2.0 资源包,且**当前有余量** ([资源包购买入口](https://console.volcengine.com/common-buy/ark_bd%7C%7Cd9li7rchmjlhari755h0)) 4. 购买了 Seedance 2.0 Fast 资源包,且**当前有余量** ([资源包购买入口](https://console.volcengine.com/common-buy/ark_bd%7C%7Cd9li7rchmjlhari755h0)) 5. 购买了 Seedance 2.0 Mini 资源包,且**当前有余量** ([资源包购买入口](https://console.volcengine.com/common-buy/ark_bd%7C%7Cd9li7rchmjlhari755h0)) 开通后,即开启该系列模型的**后付费**使用。 ## Seedance 2.0 与 2.5 系列模型调用 开通之后,每次调用按**调用的具体模型**结算,资源包仅支持**抵扣对应的模型**: | 调用的模型 | 可用扣费来源 | |---|---| | Seedance 2.5 | Seedance 2.5 资源包余量 / 账户余额 | | Seedance 2.0 | Seedance 2.0 资源包余量 / 账户余额 | | Seedance 2.0 Fast | Seedance 2.0 Fast 资源包余量 / 账户余额 | | Seedance 2.0 Mini | Seedance 2.0 Mini 资源包余量 / 账户余额 | # 使用说明 1. **生效时间**:资源包购买后立即生效,无需手动“激活”或“绑定”。有效期90天,超出有效期后,资源包中剩余的Tokens,自动作废。 2. **结算说明**:资源包不支持叠加使用代金券结算。页面价格仅供参考,请以结算时的最终成交价格为准。 3. **退订说明**:资源包属于七天无理由退款商品。在新购7天内且未使用,可前往 [退订管理](https://console.volcengine.com/finance/unsubscribe/) 申请无理由全额退款,已使用资源包不支持退订,购买超过7天资源包不支持退订。 4. **扣费顺序**: 付费资源包 > 按 token 后付费。若您存在多个同类型的资源包:优先抵扣先到期的资源包。若到期时间相同,则优先抵扣先购买的资源包。 5. **用量超出说明**:如果资源包全部到期或额度全部抵扣完后,若仍有超出部分,自动转为按量付费。 # 使用指南 ## 1. 开通模型 购买成功后,按照以下步骤操作: * **开通模型**:前往 [火山方舟-开通管理](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=model&tab=ComputerVision) 开通对应模型 * **接入调用**:[获取 API Key ](https://ark.volcengine.com/region:cn-beijing/apiKey?apikey=%7B%7D) 后即可发起在线推理请求 * **抵扣逻辑**:您购买的资源包将**自动抵扣对应模型**产生的在线推理消耗 ## 2. 管理与监控 您可以实时掌握使用进度: * **路径**:前往 [费用中心->资源包管理](https://console.volcengine.com/finance/resource-package) 。 * **功能**:查看当前资源包实例的余量等状态信息。 ## 3. 相关文档引导 了解更多模型使用详情,请参考以下官方文档: * [**模型计费信息**](/docs/model-pricing#02affcb8):查看 Token 计费与估算方式,方便您直观了解不同规格的视频成本。 * [创建视频生成任务](/docs/create-video-generation-task-api):获取接口接入指南及技术开发文档。 * [**Seedance 2.5 教程**](/docs/seedance-2-5):介绍 Seedance 2.5 模型的特色能力与使用方法,帮助您快速实现 [Video Generation API](/docs/create-video-generation-task-api) 调用。 * [**Seedance 2.5 系列提示词指南**](/docs/seedance-2-5-prompt-guide):介绍 Seedance 2.5 的提示词使用方法和相关技巧,帮助您更高效地利用该模型生成符合需求的优质视频作品。 * [**Seedance 2.0 系列教程**](/docs/seedance-2-0):介绍 Seedance 2.0 系列模型的专属能力,帮助您快速实现 [Video Generation API](/docs/create-video-generation-task-api) 调用。 * [**Seedance 2.0 系列提示词指南**](/docs/seedance-2-0-prompt-guide):介绍 Seedance 2.0 的提示词使用方法和相关技巧,帮助您更高效地利用该模型生成符合需求的优质视频作品。 # 常见问题 ## 为什么购买了资源包,但没有抵扣? 资源包的抵扣需要满足特定条件,常见原因如下: 1. 模型不匹配:您调用的模型与购买的资源包不一致。例如,购买 Seedance 2.0 资源包却调用了 Seedance 2.5 模型。 2. 使用了不支持的功能:资源包仅支持抵扣在线推理的 tokens 消耗。 **特别说明**: 1. 多个账户通过同一手机号、同一证件号、同一账号ID,或其他经火山引擎排查多个账户为同一实际控制主体的,均视为“同一用户”。 2. 对恶意抢占活动资源、批量刷单及其他任何采用非常规手段影响活动公平性的行为,火山引擎有权取消从事违法违规行为的用户活动资格并回收实例资源,必要时追究违规用户的法律责任。 3. 用户不得将火山引擎云产品和服务用于任何违法违规或侵犯第三方合法权益的用途,如因此产生的法律责任,由用户自行承担责任,与火山引擎无关。 4. 火山引擎可以根据运营情况对活动进行变更或调整,包括不限于活动规则、商品价格、商品数量等,请以页面最新内容为准。用户在活动规则变更或调整前已经获得的权益不受影响。 --- # Seedance 2.5 与 Seedance 2.0 系列模型开通、使用与退订说明 Source: https://ark.volcengine.com/region:cn-beijing/docs/seedance-model-activation-usage-and-refund 本文介绍 Seedance 2.5、Seedance 2.0、Seedance 2.0 mini 与 Seedance 2.0 fast 模型的开通条件、计费方式、抵扣顺序及退订规则。 # 开通模型 ## 满足开通门槛 满足以下任意一项,即可开通 Seedance 2.5、Seedance 2.0、Seedance 2.0 mini 与 Seedance 2.0 fast 模型。 | 开通方式 | 门槛条件 | 有效期 | 适用范围 | 充值或购买入口 | | --- | --- | --- | --- | --- | | 账户余额(推荐) | 账户可用余额达到 **200 元** | 无限制 | 余额可抵扣火山引擎产品 | [账户充值](https://console.volcengine.com/finance/fund/recharge) | | 节省计划(推荐) | 购买 **200 元**及以上规格的专属递减型节省计划,且当前有余额 | * 200 元专属递减型节省计划有效期为 30 天
    * 500 元、1000 元专属递减型节省计划有效期为 90 天 | 抵扣火山方舟全部模型,包括 Seedance 全系列及语言、图像、语音模型 | * [购买节省计划](https://console.volcengine.com/common-buy/AI-SavingsPlans%7C%7Cd682ppeeq1mp7kd5q0e0)
    * [更高规格节省计划购买](https://www.volcengine.com/product/ai-savingsplans) | | 资源包 | 购买 **200 元**及以上的模型资源包,且当前有余量 | 90 天 | 仅抵扣对应的单一模型 | [资源包规则](/docs/seedance-2-0-model-resource-pack-rules) | ## 开通模型 1. 前往 [开通管理](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=model&tab=ComputerVision),开通对应模型。 2. 前往 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey?apikey=%7B%7D)获取 API Key,发起在线推理请求。 # 计费与使用 开通后即开启模型按 token 付费使用:每次调用按该次实际调用的模型及 token 用量结算,并按固定顺序自动抵扣。 ## 抵扣顺序 调用产生的费用,按以下顺序自动抵扣: 1. 资源包:若该模型有对应资源包且有 tokens 余量,优先抵扣。 2. 节省计划:若已购买节省计划且有余额,那么节省计划余额可抵扣按量后付费账单。 3. 账户余额(即按量后付费):按实际 token 用量出账,实时扣除账号余额。 ## 对比付费方式 | 付费方式 | token 用量统计 | 余量管理与监控 | | --- | --- | --- | | 资源包 | 前往 [用量统计](https://ark.volcengine.com/region:cn-beijing/usageTracking?usageTrackingTab=model),查看当前模型的 token 用量 | 前往 [资源包管理](https://console.volcengine.com/finance/resource-package),查看资源包实例的余量、有效期等状态 | | 节省计划 | ^^ | 前往 [节省计划](https://console.volcengine.com/finance/saving-plan),查看节省计划余额、有效期等状态 | | 账户余额 | ^^ | 前往 [账号总览](https://console.volcengine.com/finance/account-overview),查看当前账户余额 | ## 模型相关文档引导 了解更多模型使用详情,请参考以下官方文档: - [模型计费信息](/docs/model-pricing#02affcb8):查看 token 计费与估算方式,方便您直观了解不同规格的视频成本。 - [Video Generation API](/docs/create-video-generation-task-api):获取接口接入指南及技术开发文档。 - [Doubao Seedance 2.5 教程](/docs/seedance-2-5):介绍 Seedance 2.5 模型的特色能力与使用方法,帮助您快速实现 Video Generation API 调用。 - [Doubao Seedance 2.5 提示词指南](/docs/seedance-2-5-prompt-guide):介绍 Seedance 2.5 的提示词使用方法和相关技巧,帮助您更高效地利用该模型生成符合需求的优质视频作品。 - [Doubao Seedance 2.0 系列教程](/docs/seedance-2-0):介绍 Seedance 2.0 系列模型的专属能力,帮助您快速实现 Video Generation API 调用。 - [Doubao Seedance 2.0 系列提示词指南](/docs/seedance-2-0-prompt-guide):介绍 Seedance 2.0 的提示词使用方法和相关技巧,帮助您更高效地利用该模型生成符合需求的优质视频作品。 # 退订与提现 | 类型 | 退订或提现规则 | | --- | --- | | 账户余额 | 模型实例处于开通状态时,账户余额中不超过 200 元的部分不可提现,超过 200 元的部分可正常提现。关闭模型实例后,被锁定的不超过 200 元部分也可提现。
    前往 [开通管理](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=model&tab=ComputerVision)关闭模型实例。
    | | 节省计划 | 购买超过 7 天或一经使用,即不可退订 | | 资源包 | 购买超过 7 天或一经使用,即不可退订 | --- # 协作奖励计划 Source: https://ark.volcengine.com/region:cn-beijing/docs/collaboration-reward-program ## **活动简介** ### **开通前提** 请确保已开通模型服务并关闭安心体验模式,未完成实名认证的用户需先完成认证。 ![Collaboration_incentive_Plan_image1.png](https://arkdocs.tos-cn-beijing.volces.com/images/resources/Collaboration_incentive_Plan_image1.png) ### **活动入口** 活动入口支持以下两个路径进入**协作奖励计划详情页**: **方式一:通过开通管理页面「立即参与」入口** 您可在 [火山方舟控制台-开通管理页](https://ark.volcengine.com/region:cn-beijing/openManagement),点击 **立即参与** 进入产品活动页面。 ![Collaboration_incentive_Plan_image2.png](https://arkdocs.tos-cn-beijing.volces.com/images/resources/Collaboration_incentive_Plan_image2.png) **方式二:通过模型广场进入模型详情页,在模型卡片进入** 您可登录 [火山方舟控制台](https://ark.volcengine.com/region:cn-beijing/overview?briefPage=0&briefType=introduce&type=advance&projectName=default),在左侧导航栏选择 **模型广场** ,点击目标模型卡片即可进入模型详情页。点击 **火山方舟模型奖励计划** 进入活动详情页。 **当前入口支持模型**: Doubao-Seed-Evolving ![Collaboration_incentive_Plan_image3.png](https://arkdocs.tos-cn-beijing.volces.com/images/resources/Collaboration_incentive_Plan_image3.png) 进入协作奖励详情页后,您可在当前页面完成协作奖励计划的 **授权** 或 **撤回授权** 操作。 ![Collaboration_incentive_Plan_image4.png](https://arkdocs.tos-cn-beijing.volces.com/images/resources/Collaboration_incentive_Plan_image4.png) ![Collaboration_incentive_Plan_image5.png](https://arkdocs.tos-cn-beijing.volces.com/images/resources/Collaboration_incentive_Plan_image5.png) ### **活动参与范围** * 完成企业认证的用户可参与本活动,享受企业权益。 * 完成个人实名认证的用户可参与本活动并享受个人权益,可在活动页面完成企业认证,并手动确认升级,享受企业权益。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/bf4f020ebc1e405ba80afa41da2ed664~tplv-goo7wpa0wc-image.image) ### **活动规则说明** * 首次授权模型及推理接入点参与本计划,可获得一个该模型的冷启动免费资源包,该资源包可用于抵扣按tokens后付费用量,奖励额度以【**产品活动介绍页**】公示为准。 * 调用已获授权的推理接入点,每日将采集每个模型不超过500万tokens的推理数据,并于次日发放有效期为30天的等量免费资源包;未获授权的接入点数据将不予采集,该部分使用量次日也不会返还资源包。 * 个人实名认证用户可享有个人权益,完成企业认证升级后可享有企业权益,采集量及免费资源包上限将提升至企业权益对应水平,具体详情请参阅活动页面说明。 * 本计划所发放的免费资源包,可用于抵扣在线推理过程中推理输入、推理输出以及推理缓存命中的按token后付费计费用量。目前,暂不支持抵扣批量推理、按模型单元付费、TPM保障包以及推理缓存存储等计费项的用量。若后续对上述抵扣规则进行调整,将在相关活动页面或文档中予以说明,请予以关注。 * 目前平台仅针对部分模型和调用方式进行数据采集,通过不支持的方式调用模型时,数据不会被采集,次日也不会发放该部分对应的资源包奖励。当前支持的调用方式: * Chat API * Responses API * Messages API * Image Generation API * Content Generation API (仅在线推理) 支持采集的模型以【**产品活动介绍页**】公示为准,若后续有调整,将在相关活动页面或文档中予以说明,请予以关注。 > 低优(Flex)模式暂不支持数据采集;支持该模式的具体模型请参见 [在线推理(低优)](/docs/online-inference-flex#9bba460b)。 * 近期本计划参与人数较多,资源包下发可能存在延迟,请耐心等待。 ### **数据安全保障** * 隐私无忧:您的授权数据会被严格加密和匿名化处理; * 无授权不采集:当您从未授权、撤回授权,或者本计划终止时,您的数据不会被采集; * 授权自主:您可以随时在数据协作奖励计划活动页面撤回授权。 ## **部分模型退出协作奖励计划说明** ### 2026 年 10 月 8 日起退出模型说明 部分模型的协作奖励计划合作期已于 **2026 年 10 月 8 日** 到期,相关模型现已退出协作奖励计划,并**停止发放每日奖励包(含冷启动资源包)**。 #### 资源包使用范围 * **已发放的奖励包在有效期内仍可正常使用**,可继续用于对应模型(含本次退出的 9 款模型)。 * **仍在协作奖励计划中的模型可正常领取与使用奖励包**。 #### 退出模型清单 * 图片生成模型(1 款):`Doubao-Seedream-5.0-Pro` * 语言模型(8 款):`Doubao-Seed-2.1-pro`、`Doubao-Seed-2.1-turbo`、`Doubao-Seed-Character`、`Doubao-smart-router`、`DeepSeek-V4-Pro正式版`、`DeepSeek-V4-Flash正式版`、`GLM-5.2`、`Kimi-K3` ### 2026 年 9 月 1 日起退出模型说明 部分模型的协作奖励计划合作期已于 **2026 年 9 月 1 日** 到期,相关模型现已退出协作奖励计划,并**停止发放每日奖励包(含冷启动资源包)**。 #### 调整说明 * **模型服务本身不受影响**,退出后您仍可正常调用,按标准价格计费。 * **已发放的奖励包在有效期内仍可正常使用**,不会提前清零,到期规则不变(发放后 30 个自然日内有效)。 * 如需继续享受奖励包权益,请将业务切换至**仍在本计划支持范围内的模型**,具体名单以 [【**产品活动介绍页**】](https://ark.volcengine.com/region:cn-beijing/openManagement/rewardPlan?projectName=default) 公示为准。 #### 退出模型清单 * 视频生成模型(4 款):`Doubao-Seedance-1.5-pro`、`Doubao-Seedance-1.0-pro`、`Doubao-Seedance-1.0-lite-i2v`、`Doubao-Seedance-1.0-lite-t2v` * 图片生成模型(3 款):`Doubao-Seedream-5.0-Lite`、`Doubao-Seedream-4.5`、`Doubao-Seedream-4.0` * 文本对话模型(31 款): * 豆包系列:`Doubao-Seed-2.0-pro`、`Doubao-Seed-2.0-lite`、`Doubao-Seed-2.0-code`、`Doubao-Seed-2.0-mini`、`Doubao-Seed-1.8`、`Doubao-Seed-1.6`、`Doubao-Seed-1.6-vision`、`Doubao-Seed-1.6-flash`、`Doubao-Seed-1.6-thinking`、`Doubao-Seed-1.6-lite`、`Doubao-Seed-Code`、`Doubao-Seed-Translation`、`Doubao-1.5-pro-32k`、`Doubao-1.5-pro-256k`、`Doubao-1.5-lite-32k`、`Doubao-1.5-thinking-pro`、`Doubao-1.5-vision-pro-32k`、`Doubao-1.5-vision-lite`、`Doubao-1.5-UI-TARS`、`Doubao-pro-32k`、`Doubao-lite-32k` * 第三方模型:`GLM-4.7`、`DeepSeek-V3`、`DeepSeek-V3.1`、`DeepSeek-V3.2`、`DeepSeek-R1`、`DeepSeek-R1-Distill-Qwen-32B`、`DeepSeek-R1-Distill-Qwen-7B`、`Kimi-K2`、`Kimi-K2.5` ### 后续安排 本次退出后,仍在本计划内的模型将继续生效,后续调整信息将通过站内信及本文档另行通知。 如需查询奖励包余额与有效期,请登录 [火山方舟控制台-开通管理页-协作奖励计划活动页](https://ark.volcengine.com/region:cn-beijing/openManagement) 查看。 ## 火山**方舟协作奖励计划活动规则(第二期)** 火山引擎邀请客户(“您”)参与协作奖励计划(“本计划”),本计划旨在与您一起共建更优质的模型服务。 ### **协作奖励计划权益说明** 本计划合作期(**原合作期为2024年12月1日至2025年5月31日,合作期延长至2026年9月30日**)内,在您订购/使用火山方舟指定模型时(以【**产品活动介绍页**】公示为准)如选择参与本计划,火山方舟将为您提供一份冷启动资源包,同时为您提供每日奖励包(统称“方舟奖励资源包”或“奖励包”)。 (1)奖励包的免费资源额度和种类等,以您开通本计划时火山方舟指定模型在【**产品活动介绍页**】公示的奖励信息为准; (2)冷启动资源包的奖励机制为:在您首次成功授权某模型的推理接入点后,您将立即获得该模型免费额度资源包奖励,具体奖励额度以活动页面显示为准。 (3)每日奖励包的奖励机制为:在您授权火山方舟指定模型的推理接入点参与协作奖励计划后,将在每日额度内自动按顺序采集授权模型推理接入点对应的调用数据,次日根据每个模型的前一日采集量返还等量的每日奖励包。 (4)奖励包仅可用于抵扣按 Token 付费的后付费推理费用; (5)奖励包将在发放到您账号后的 30 个自然日内有效,到期后清零; 您可选择同时使用参与本计划的任意一款或几款模型服务,每一款模型将按模型推理接入点申请获取您的数据授权并据此为您提供奖励包。 本计划仅支持同一用户的唯一一个账号参与,即如您同一主体下有多个账户或多个账号,这些账户或账号不可同时申请参与本计划。 **您在合作期内调用火山方舟指定模型服务期间的调用数据,即因调用模型而输入和模型生成的内容,包括但不限于所有输入的文本、声音、图形、图片、图像、视频、软件或任何其他类似信息(以下称“协作奖励数据”)将授权提供给火山引擎用于火山引擎及其关联公司的模型和算法优化**。 ### 数据授权说明 本计划项下授权的协作奖励数据为您参与本计划并按奖励规则启动奖励包计算程序及免费额度期间输入模型和模型输出的所有内容。对于采集的数据,火山方舟平台将在匿名化处理后加密存储用于火山引擎及其关联公司的模型算法和服务优化。**特别说明,对于不在以上采集范围内的数据,火山引擎将不会进行采集和存储**。 **您理解并确认,火山引擎可永久使用您在合作期内已经授权给火山引擎的协作奖励数据。若您已参与本计划,但在参与过程中希望撤回授权,您可以在当前页面点击“撤回授权”按钮,那么您后续的调用数据将不再被提供给火山引擎,且本奖励计划将自行终止,您未使用完毕的奖励资源包仍然可在有效期内继续使用。如您在本计划合作期(包括火山引擎根据运营情况,调整后的活动有效期)内未主动撤回授权,那么在合作期内,您的授权将持续有效**。 其他数据授权相关约定,详见下方《火山引擎数据授权使用协议》。 ### **特别说明** (1)如多个账户通过同一手机号、同一证件号、同一账号ID,或其他经火山引擎排查多个账户为同一实际控制人的,均视为“同一用户”。 (2)对恶意抢占活动资源、批量刷单及其他任何采用非常规手段影响活动公平性和违反服务协议及规则的行为,火山引擎有权取消从事违法违规行为的用户活动资格并回收奖励包资源,必要时追究违规用户的法律责任。 (3)火山引擎可以根据运营情况对活动进行变更或调整,包括不限于活动规则、商品数量、活动有效期及奖励资源包有效期等,请以页面最新内容及火山引擎通知为准。用户在活动规则变更或调整前已发放的免费资源包及奖励资源包权益不受影响。 ## 火山引擎**数据授权使用协议** 本《火山引擎数据授权使用协议》(“**本协议**”)是您与北京火山引擎科技有限公司(“**火山引擎**”),就您授权火山引擎使用协作奖励数据(定义见下文)的相关事项,签订的协议。 **【特别提醒】您授权火山引擎使用协作奖励数据(定义见下文)时,火山引擎会采取相应安全措施保证协作奖励数据传输安全。如需额外获得火山引擎的加密传输、隐私计算等附加技术服务的,您可以根据本协议第4条(通知)所载联系方式咨询火山引擎**。 **为了更好地保障您的权益,您在同意本协议之前,请您务必审慎阅读,并充分理解本协议的全部内容,特别是以加粗标注的条款。如果您对本协议的条款有任何疑问,可以根据本协议第4条(通知)所载联系方式向火山引擎询问,相关人员将向您解释条款内容。如果您不同意本协议的任意内容,或者无法准确理解相关人员对条款的解释,请不要在订购页面勾选同意。如果您在订购页面特别勾选了同意本协议,即表示您已接受本协议所述的所有条款和条件,届时您不应以未阅读本协议或者未获得相关人员对您问询的解答等理由,主张本协议无效,或要求撤销本协议**。 您确认,在您注册及使用本服务时,您应当是合法成立并有效存续的法人或非法人组织。如果您是中国大陆地区以外的用户,您订立或履行本协议还需要同时遵守您所属和/或所处国家或地区的法律。 ### **1.定义与解释** 1.1 除非本协议另有约定,如下术语具有本款所规定的含义: (1) **个人信息**:以电子或者其他方式记录的与已识别或者可识别的自然人有关的各种信息,不包括匿名化处理后的信息。 (2) **匿名化**:是指个人信息经过处理无法识别特定自然人且不能复原的过程。 (3) **关联方**:是指拥有一方、被一方拥有或与该方被同一其他方拥有的任何法律实体,其中“拥有”是指拥有相关实体超过50%的所有权或拥有指导其管理的权利。 (4) **火山方舟大模型服务平台**:是指由北京火山引擎科技有限公司(“**火山引擎**”)开发的,在机器学习平台上提供的一项服务功能,提供大模型的训练、推理、评测、精调等全方位功能与服务,并重点支撑大模型生态,火山方舟通过稳定可靠的安全互信方案,保障模型服务提供方的模型安全与模型使用者的信息安全。 (5) **协作奖励数据**:您在奖励包额度内调用火山方舟指定模型服务期间因调用模型而输入和模型生成的内容,包括但不限于所有输入的文本、声音、图形、图片、图像、视频、软件或任何其他类似信息。 ### **2.数据授权** 2.1 授权目的:本规则项下的授权将用于开发机器学习、人工智能相关技术和模型的优化、开发、使用、学术理论研究及发表等目的。 2.2 授权范围:您同意,您将授予火山引擎一项**非独家的、不可转让的、不可分许可的(但可分许可给火山引擎关联方以及为达成授权目的第三方外包服务商)、免费的**权利,允许火山引擎为达成授权目的而**传输、存储、使用、复制、下载、修改或以其他方式处理协作奖励数据**。 2.3 授权期限:本协议项下授权的起始日期为您**在订购页面勾选同意接受本协议之日**。授权期限为**永久**。如您在同意接受本协议后,(i)拟对该授权期限进行变更或调整,或(ii)如您希望停止对火山引擎授权新协作奖励数据的,您可以通过点击【撤回授权】或【与火山引擎联系】终止您对我们的授权(**“终止操作”**)。**您进一步充分知悉、理解并同意,即便您完成了终止操作,但由于机器学习和人工智能技术的特殊性,一旦(i)您授权火山引擎使用相关协作奖励数据,且(ii)相关协作奖励数据已被使用的,则对该部分协作奖励数据的使用将在技术上无法撤回。火山引擎仅能根据您的要求停止使用您新输入的协作奖励数据。您理解并同意,在一些模型服务场景下,可能因您终止授权而无法继续使用相应模型服务**。 2.4 **您特别承诺并保证,您已合法持有协作奖励数据,并已获得协作奖励数据的一切必要充分授权或原始权利,以确保(i)您依法有权向火山引擎及其分许可方提供该等数据,且(ii)火山引擎及其分许可方有权根据本规则处理您提供的协作奖励数据。若您发现您的协作奖励数据出现任何权利争议或潜在权利争议,应立刻以书面形式根据本协议第4条(通知)所载联系方式,通知火山引擎,并尽您最大努力协助火山引擎处理该等争议。如因您违反本条约定和/或任何第三方针对火山引擎及其分许可方在本协议约定范围内使用协作奖励数据提起任何主张,您应当赔偿火山引擎及其分许可方因此遭受的所有损失**。 2.5 个人信息:您应当避免向火山引擎提供您的个人信息。如果您提交给火山引擎的协作奖励数据中不可避免地含有个人信息的,**您应当保证(i)该等个人信息的来源符合所适用的法律法规的规定,尤其是中国大陆地区法律法规的相关规定,并且(ii)您已获得了相关个人信息主体和/或实体的同意(包括必要情形下的单独同意、书面同意)和/或授权,且该等个人信息主体和/或实体授权同意的范围足以确保您能够根据本协议向火山引擎提供该等个人信息,并确保火山引擎有权在本协议第2.2及2.3条所述授权范围及授权期限内处理该等个人信息。任何情况下,协作奖励数据将在火山方舟平台进行严格加密,并通过安全方案进行匿名化后进行处理**。 2.6 保密数据:在任何情况下,您不应违反任何法律法规的规定或您与任何主体的约定,向火山引擎提供任何保密信息或商业秘密。 2.7 其他特殊数据:如您拟向火山引擎提供任何其他特殊数据的(例如,国家机密、核心数据、重要数据、人类遗传资源信息、地图数据等),**除遵守本协议第2.4条以外,您在提供前应当已获得相关政府部门一切必要充分的审批、备案或许可,并以书面形式根据本协议第4条(通知)所载联系方式,向火山引擎提出申请**,申请书内应当载明(i)该等特殊数据的类型(无需说明任何数据内容),(ii)已获得的政府部门审批、备案或许可,(iii)提供该等特殊数据的目的及必要性,以及其他火山引擎可能需要了解的情况。 2.8 **特别说明,如您参与火山引擎协作奖励计划,您需遵守该计划相关数据授权和使用规则**。 ### **3.使用要求与限制** 3.1 使用要求。在本协议第2.3条所述授权期限内,您对火山引擎在本协议项下的授权,**仅应通过火山方舟大模型服务平台开展。未经火山引擎书面同意,您不得绕过火山引擎通过其他平台、渠道或方式向火山引擎提供任何类似于本协议之协作奖励数据授权**。 3.2 被禁用途。火山引擎承诺,其不会将您的协作奖励数据用于以下用途:(i)诽谤、侮辱、骚扰、跟踪、或威胁任何个人,侵犯或损害任何第三方的合法权利;(ii)生成、传播任何有害的、不适当的、亵渎的、淫秽的、有损他人权利的、色情的、错误的、欺诈的、侵权的、不良的、违法的、或其他有悖公序良俗的材料或信息;(iii)参与或鼓励任何可能导致您或火山引擎承担刑事或民事责任的行为;(iv)擅自以您或火山引擎的名义作出进行宣传、推广、商业活动、或做出引人误解或混淆的上述行为;或(v)进行违法活动。 3.3 被禁行为。您承诺,您不得(且不得尝试):(i)对模型进行反向工程、解密、反向编译或反向汇编(本条款禁止但现行法律允许的除外);(ii)绕开模型中的技术限制或其相关文献中的限制措施;(iii)移除模型中出现的任何著作权、商标、专利、水印或其他标识;(iv)向第三方分发、再许可、出租、租赁或租借模型; (v)以开发竞争性产品或服务为目的使用模型;(vi)传输或上传任何包含病毒、木马病毒、蠕虫病毒、定时炸弹病毒、删除蝇、或任何其他类似程序的文件,其目的或用途在于破坏、摧毁、干扰或损害火山引擎或其他人的网络、计算机系统或其他设备;或(vii)进行违法活动。 ### **4.通知** 4.1 本协议下,您可通过以下方式向**火山引擎**发出通知、要求及其他通信(包括争议解决过程中的法律文件和司法文书):**您可通过登录火山引擎“官网-联系我们-智能客服”或“官网-控制台-工单服务”或选择拨打热线400-034-7888与我们联系**。 4.2 如果火山引擎拟向您发出业务通知、服务提示、验证消息、营销信息等各种信息(包括但不限于更新后的服务规则、服务升级、机房裁撤、迁移、广告等)的,将通过火山引擎官网的网页公告、系统通知、站内信、电子邮件、手机短信、即时通讯工具、邮政函件或快递等方式中的一种或多种方式向您发送相关信息。您通过任何形式提供给火山引擎的联系地址、电话、电子邮件或(和)其他联系方式,均被视为有效送达的联系方式。**此类通知将对您的权利义务产生重大影响,请您务必及时关注**。前述信息在以下情况下视为已送达: (1) 以网页公告等形式公布的,一经公布即送达(另有说明除外); (2) 以电子形式(包括系统通知、站内信、电子邮件、手机短信、即时通讯工具等)发送的,在发送成功后视为已送达; (3) 以纸质载体发出的,以交邮后的第三(3)个自然日视为已送达。 ### **5.其他** 5.1 本协议的成立、生效、履行、解释及争议的解决均应适用中华人民共和国大陆地区法律。 5.2 如您与火山引擎就本协议内容或其履行发生任何争议,双方应尽力友好协商解决;协商不成时,任何一方同意向被告所在地有管辖权的法院提起诉讼;如您因使用火山方舟大模型服务平台时,与火山引擎发生任何争议的,争议解决方式以您与火山引擎之间签署的用户协议为准。 5.3 **如您与火山引擎就数据授权事宜另行签署相关协议或另有约定的,无论该等协议或约定发生在本协议签署之前或是之后,均应优先适用本协议内容**。 --- # 免费推理额度 Source: https://ark.volcengine.com/region:cn-beijing/docs/free-inference-quota 方舟为新用户提供免费推理试用额度,便于新用户 0 成本学习以及尝试将模型推理能力与业务相结合。您只需要注册火山引擎,即可获得一定额度的免费调用模型推理服务的次数。 ## 使用限制 * 免费额度仅适用于抵扣**按 token 后付费产生的在线推理费用**,不能抵扣使用各类插件、知识库等产生的费用。 * 免费额度无法抵扣 [批量推理](/docs/batch-inference) 调用产生的 token。 * 免费额度可以抵扣使用上下文缓存命中缓存的token、未命中缓存的token、输出产生的token,但是无法抵扣缓存上下文产生的存储费用。 > * 上下文缓存介绍请参见[上下文缓存](/docs/context-cache)。 > * 上下文缓存计费请参见 [上下文缓存计费](/docs/model-pricing)。 * 免费推理额度,不同模型分别计算,主账号下共享。 举例说明:主账号如果有 A、B 2 个子账号调用模型推理服务,分别使用模型 1、模型 2 推理额度(k token)为 300、100,300、200 。模型 1、模型 2 的免费推理额度均为 500。则主账号下的免费额度剩余: ```Plain Text 模型1: 500 - 300 - 300 = -100 (k token) 模型2: 500 - 100 - 200 = 200 (k token) ``` 模型额度剩余如下: 模型 1 :0,且产生 100 k token 使用量。 模型 2:200 k token 。 * 免费推理额度,基础模型和精调后模型共享。 举例说明:假设模型 1 的免费推理额度为 500,则模型 1 和基于模型 1 精调后的模型,共享 500 的额度。 ## 获取资格 [注册](https://console.volcengine.com/auth/signup) 火山引擎账号。 ## 查询额度 您可以通过下面渠道查询到各个模型的免费额度。 * [开通管理](/docs/activation-management):登录主账号,可以在控制台实时查询账号下免费额度及抵扣情况。 ## 消耗额度 免费额度耗尽,调用将会失败,需要继续使用,需要进行实名认证并手动开通对应的模型推理服务,开通方式请见[开通管理](/docs/activation-management)。 > **说明** > > 平台推出了安心体验模式,保障您既能免费体验模型推理服务,又避免产生费用。 > * 可开启对象:**未开通过模型服务**,且未开启过或已关闭过安心体验模式的账号(包括实名认证通过的个人账号和企业账号)可开启。 > * 工作机制:在安心体验模式下,调用推理 API 时仅消耗平台赠送的免费额度,接近免费额度后服务将不可使用,避免产生额外费用。 > * 详情请参见 [安心体验模式细则说明](/docs/free-tokens-only-mode)。 ## 抵扣规则 如果您参与了[协作奖励计划](/docs/collaboration-reward-program),可能会获得「协作奖励计划资源包」。本节为您介绍抵扣顺序的优先级: * 不同类型的资源包: * 「免费在线推理资源包(即免费推理额度)」抵扣优先级高于「协作奖励计划资源包」。 * 同一类型的资源包:如果用户名下同时存在多个可抵扣的同类型资源包,则系统会按照如下优先级进行抵扣:失效时间>生效时间 * 优先使用失效时间早的资源包;针对周期型资源包,失效时间指的是当前重置周期结束时间。 * 若资源包失效时间都相同,则优先使用生效时间早的资源包进行抵扣;针对周期型资源包,生效时间指的是当前重置周期开始时间。 --- # [基础] 构建连续对话的工单分诊助手 Source: https://ark.volcengine.com/region:cn-beijing/docs/build-triage-agent-with-continuous-session 本教程面向第一次接触方舟 Managed Agents 的开发者。你将先认识 Agent、Skill、Environment、Session 和 Event 五个核心对象,再以一个售后工单分诊场景跑通完整链路。 完成后,你会得到一个绑定了工单分诊 Skill 的 Agent,并能在**同一个 Session** 中连续发送两轮消息:第一轮提交故障现象,第二轮补充新的线索。Agent 会沿用上一轮的上下文继续判断,而不是重新开始。 # 先理解五个核心对象 | 对象 | 它负责什么 | 本教程中的对应实例 | |-|-|-| | Agent | 定义模型、系统指令、Tools 和 Skills,是可复用的智能体配置 | 售后工单分诊助手 | | Skill | 把一类任务的知识、流程、约束和输出格式打包成可复用能力 | 工单分诊 SOP | | Environment | 定义 Session 使用的云端运行环境 | 一个隔离的 cloud 环境 | | Session | 保存一次任务的上下文、状态和事件历史 | 某一张客户工单的处理过程 | | Event | 向 Session 追加输入,或记录 Agent 回复、工具调用和状态变化 | `user.message`、`agent.message`、`session.status_idle` | 五者的关系可以概括为:Agent 决定「谁来做、会什么」,Environment 决定「在哪里做」,Session 承载「这一次具体任务」,Events 记录「任务如何一步步发生」。 ![五个核心对象的关系](https://arkdocs.tos-cn-beijing.volces.com/flowcharts/tutorials/new-202607201006.svg) 其中最重要的一点是:**Session 不是一次请求,而是一段可持续推进的任务上下文**。每次调用 `POST /sessions/{session_id}/events` 都是在这个 Session 中追加一个新的回合,而不是重开一次模型调用。 # 你将跑通的场景 假设客服收到一张「升级客户端后无法登录」的工单。第一轮只有基础现象;Agent 按 Skill 输出初步分诊和需要补充的信息。随后客服拿到「账号刚迁移过,旧租户仍能登录」的新线索,并把它作为第二条消息发送到原 Session。Agent 应结合两轮信息更新判断和下一步动作。 本场景特意不接入 CRM、工单系统或知识库,目的是先看清 Managed Agents 的最小运行链路。跑通后,再把真实业务查询封装成 MCP Tool 即可。 # 准备环境 先设置 API 地址和 API Key。API Key 只应保存在本地环境变量或服务端密钥系统中,不要硬编码在代码中。 ```bash export ARK_BASE_URL="https://ark.cn-beijing.volces.com/api/v3" export ARK_API_KEY="替换为你的 ARK API Key" ``` 确认以下命令可用: ```Bash curl --version zip -v jq --version ``` ## 创建并上传 Skill Skill 是一个包含 `SKILL.md` 的目录。本教程创建的 Skill 不负责调用外部系统,而是把工单分诊的步骤、约束和输出格式固化下来。 先创建目录: ```bash mkdir -p customer-support-triage ``` 在 `customer-support-triage/SKILL.md` 中写入: ````markdown --- name: customer-support-triage description: Triage customer support incidents. Use when a user reports login, account, payment, membership, or client failures and the agent must separate facts from assumptions, ask for missing evidence, assess severity, and recommend the next safe action. --- # Customer Support Triage Follow this workflow for every incident: 1. Restate the confirmed symptom without inventing account, order, or system status. 2. Separate confirmed facts, likely hypotheses, and missing evidence. 3. Assess severity as P1, P2, P3, or P4, and explain the reason in one sentence. 4. Ask only the minimum questions needed to distinguish the leading hypotheses. 5. Recommend safe, reversible checks before any write or irreversible action. 6. Escalate when the incident affects many users, risks data or money, lacks required permission, or remains unresolved after standard checks. ## Output Return these sections: - 当前判断 - 已确认事实 - 待核实信息 - 建议动作 - 是否升级 Do not claim that a system change, refund, reset, or escalation succeeded unless a tool explicitly confirms success. ```` 打包时保留顶层目录: ```bash zip -r customer-support-triage.zip customer-support-triage unzip -l customer-support-triage.zip ``` 上传 Skill: ```bash SKILL_RESPONSE=$(curl --silent --show-error --fail \ --request POST "$ARK_BASE_URL/skills" \ --header "Authorization: Bearer $ARK_API_KEY" \ --form "files=@customer-support-triage.zip;type=application/zip") echo "$SKILL_RESPONSE" | jq export ARK_SKILL_ID=$(echo "$SKILL_RESPONSE" | jq -er '.id') export ARK_SKILL_VERSION=$(echo "$SKILL_RESPONSE" | jq -er '.latest_version') ``` `id` 标识这项能力,`latest_version` 标识当前最新版本。Agent 绑定的是明确的 Skill 版本,因此更新 Skill 后需要把 Agent 配置更新到新版本,运行中的旧 Session 不会被悄悄改变。 ## 创建 Agent 并绑定 Skill 创建 Agent 时,把刚上传的 Skill 放入 `skills`。系统指令只描述稳定角色和边界,具体的分诊流程交给 Skill 管理。 ```bash AGENT_RESPONSE=$(curl --silent --show-error --fail \ --request POST "$ARK_BASE_URL/agents" \ --header "Authorization: Bearer $ARK_API_KEY" \ --header "Content-Type: application/json" \ --data @- < ## 创建 Environment Environment 是 Session 的运行基础设施。本场景不需要额外 Python 包,只创建一个最小 cloud 环境。 ```bash ENV_RESPONSE=$(curl --silent --show-error --fail \ --request POST "$ARK_BASE_URL/environments" \ --header "Authorization: Bearer $ARK_API_KEY" \ --header "Content-Type: application/json" \ --data '{ "name": "managed-agents-beginner-env", "description": "Managed Agents 入门场景的隔离运行环境。", "config": { "type": "cloud", "networking": { "type": "unrestricted" } } }') echo "$ENV_RESPONSE" | jq export ARK_ENVIRONMENT_ID=$(echo "$ENV_RESPONSE" | jq -r '.id // .environment_id // .data.id // .data.environment_id') ``` > **注意** > > 如果你的业务不需要访问公网,正式环境中应收紧网络策略;示例中的 `unrestricted` 只是为了避免入门场景被网络配置阻塞。 ## 创建 Session 现在创建一张具体「工单」。请注意 `agent` 是对象,Agent ID 放在 `agent.id` 中。 ```bash SESSION_RESPONSE=$(curl --silent --show-error --fail \ --request POST "$ARK_BASE_URL/sessions" \ --header "Authorization: Bearer $ARK_API_KEY" \ --header "Content-Type: application/json" \ --data @- < ## 先订阅 Events,再发送第一条消息 发送消息使用以下接口: ```text POST /sessions/{session_id}/events ``` 请求体中的 `events` 是事件数组,但一次请求只放一个 `user.message`,不要把多个用户回合打包在一起。 先定义一个单轮执行函数。它会建立 SSE 流,等待服务端返回 `: ready`,再发送消息并持续读取到会话终态: ```Bash run_session_turn() ( local session_id="$1" local user_text="$2" local stream_dir local stream_pipe="" local stream_error local stream_pid="" local stream_number=0 local stream_ready=false local seen_ids_file local events_payload local turn_done=false local result_code=1 local message_count=0 local reconnect_count=0 local max_reconnects="${ARK_MAX_SSE_RECONNECTS:-3}" local max_history_pages="${ARK_MAX_HISTORY_PAGES:-100}" local line local data : "${ARK_BASE_URL:?Set ARK_BASE_URL before calling run_session_turn}" : "${ARK_API_KEY:?Set ARK_API_KEY before calling run_session_turn}" : "${session_id:?Pass a Session ID as the first argument}" : "${user_text:?Pass a user message as the second argument}" command -v curl >/dev/null || { printf 'curl is required.\n' >&2 return 1 } command -v jq >/dev/null || { printf 'jq is required.\n' >&2 return 1 } [[ $max_reconnects =~ ^[0-9]+$ ]] || { printf 'ARK_MAX_SSE_RECONNECTS must be a non-negative integer.\n' >&2 return 1 } [[ $max_history_pages =~ ^[1-9][0-9]*$ ]] || { printf 'ARK_MAX_HISTORY_PAGES must be a positive integer.\n' >&2 return 1 } stream_dir=$(mktemp -d) || { printf 'Failed to create a temporary directory for the SSE stream.\n' >&2 return 1 } stream_error="$stream_dir/stream-error.log" seen_ids_file="$stream_dir/seen-event-ids" : >"$stream_error" : >"$seen_ids_file" stop_stream() { exec 3<&- || true if [[ -n $stream_pid ]] && kill -0 "$stream_pid" 2>/dev/null; then kill "$stream_pid" 2>/dev/null || true fi if [[ -n $stream_pid ]]; then wait "$stream_pid" 2>/dev/null || true fi if [[ -n $stream_pipe ]]; then rm -f "$stream_pipe" fi stream_pid="" stream_pipe="" } cleanup_stream() { stop_stream rm -rf "$stream_dir" } trap cleanup_stream EXIT start_stream() { stop_stream stream_number=$((stream_number + 1)) stream_pipe="$stream_dir/events-$stream_number" stream_ready=false if ! mkfifo "$stream_pipe"; then printf 'Failed to create the SSE pipe at %s.\n' "$stream_pipe" >&2 return 1 fi curl -sS -N --fail-with-body --max-time 600 \ "$ARK_BASE_URL/sessions/$session_id/events/stream" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Accept: text/event-stream" >"$stream_pipe" 2>>"$stream_error" & stream_pid=$! exec 3<"$stream_pipe" while IFS= read -r line <&3; do line=${line%$'\r'} if [[ $line == ": ready" ]]; then stream_ready=true break fi done if [[ $stream_ready != true ]]; then printf 'SSE stream closed before it was ready.\n' >&2 if [[ -s $stream_error ]]; then tail -n 1 "$stream_error" >&2 fi return 1 fi } event_seen() { local event_id="$1" [[ -n $event_id ]] && grep -Fqx -- "$event_id" "$seen_ids_file" } remember_event() { local event_id="$1" if [[ -n $event_id ]] && ! event_seen "$event_id"; then printf '%s\n' "$event_id" >>"$seen_ids_file" fi } process_event() { local event_json="$1" local event_id local event_type local stop_reason local retry_status local pending_ids event_id=$(jq -r '.id // empty' <<<"$event_json" 2>/dev/null || true) if event_seen "$event_id"; then return 0 fi remember_event "$event_id" event_type=$(jq -r '.type // empty' <<<"$event_json" 2>/dev/null || true) case "$event_type" in agent.message) jq -r '.content[]? | select(.type == "text") | .text' <<<"$event_json" message_count=$((message_count + 1)) ;; agent.tool_use | agent.mcp_tool_use | agent.custom_tool_use) printf '[tool] %s\n' "$(jq -r '.name // .type' <<<"$event_json")" ;; session.error) retry_status=$(jq -r '.error.retry_status.type // empty' <<<"$event_json") printf '[error] %s: %s\n' \ "$(jq -r '.error.type // "unknown_error"' <<<"$event_json")" \ "$(jq -r '.error.message // "No error message returned."' <<<"$event_json")" >&2 case "$retry_status" in retrying) printf '[session] The service is retrying automatically.\n' >&2 ;; exhausted) printf '[session] Retries were exhausted for this turn.\n' >&2 ;; terminal) printf '[session] The Session cannot continue after this error.\n' >&2 ;; *) printf '[session] Unknown error retry status: %s\n' "$retry_status" >&2 result_code=4 turn_done=true ;; esac ;; session.status_rescheduled) printf '[session] The Session was rescheduled; continue waiting.\n' >&2 ;; session.status_idle) stop_reason=$(jq -r '.stop_reason.type // empty' <<<"$event_json") case "$stop_reason" in end_turn) if ((message_count == 0)); then printf 'The turn ended without an agent.message event.\n' >&2 result_code=5 else printf '[session] end_turn\n' >&2 result_code=0 fi turn_done=true ;; requires_action) pending_ids=$(jq -r '.stop_reason.event_ids // [] | join(",")' <<<"$event_json") printf '[session] requires_action: %s\n' "$pending_ids" >&2 result_code=2 turn_done=true ;; retries_exhausted) printf '[session] retries_exhausted\n' >&2 result_code=3 turn_done=true ;; *) printf 'Unknown session.status_idle stop_reason: %s\n' "$stop_reason" >&2 result_code=5 turn_done=true ;; esac ;; session.status_terminated) printf '[session] terminated\n' >&2 result_code=4 turn_done=true ;; esac } read_history() { local mode="$1" local page="" local page_count=0 local response local event_json while :; do page_count=$((page_count + 1)) if ((page_count > max_history_pages)); then printf 'History recovery exceeded %s pages.\n' "$max_history_pages" >&2 return 1 fi if [[ -n $page ]]; then response=$(curl -sS --fail-with-body --get \ "$ARK_BASE_URL/sessions/$session_id/events" \ -H "Authorization: Bearer $ARK_API_KEY" \ --data-urlencode "limit=200" \ --data-urlencode "order=asc" \ --data-urlencode "page=$page") || return 1 else response=$(curl -sS --fail-with-body --get \ "$ARK_BASE_URL/sessions/$session_id/events" \ -H "Authorization: Bearer $ARK_API_KEY" \ --data-urlencode "limit=200" \ --data-urlencode "order=asc") || return 1 fi while IFS= read -r event_json; do [[ -n $event_json ]] || continue if [[ $mode == "seed" ]]; then remember_event "$(jq -r '.id // empty' <<<"$event_json")" else process_event "$event_json" [[ $turn_done == true ]] && break fi done < <(jq -c '.data[]?' <<<"$response") [[ $turn_done == true ]] && return 0 page=$(jq -r '.next_page // empty' <<<"$response") [[ -n $page ]] || return 0 done } if ! start_stream; then return 1 fi # Mark existing history so reconnect recovery only emits this turn. if ! read_history seed; then printf 'Failed to read the Session history before sending the message.\n' >&2 return 1 fi events_payload=$(jq -n --arg text "$user_text" \ '{events: [{type: "user.message", content: [{type: "text", text: $text}]}]}') curl -sS --fail-with-body \ "$ARK_BASE_URL/sessions/$session_id/events" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d "$events_payload" >/dev/null || return 1 while [[ $turn_done != true ]]; do while IFS= read -r line <&3; do line=${line%$'\r'} if [[ $line == ": server draining, reconnect" ]]; then break fi [[ $line == data:* ]] || continue data=${line#data:} data=${data# } process_event "$data" [[ $turn_done == true ]] && break done [[ $turn_done == true ]] && break if ((reconnect_count >= max_reconnects)); then printf 'SSE reconnect limit reached before the turn finished.\n' >&2 return 1 fi reconnect_count=$((reconnect_count + 1)) printf '[session] Reconnecting SSE and recovering history (%s/%s).\n' \ "$reconnect_count" "$max_reconnects" >&2 # Open the replacement stream first, then recover the disconnect window. if ! start_stream; then return 1 fi if ! read_history recover; then printf 'Failed to recover Session history after reconnecting.\n' >&2 return 1 fi done return "$result_code" ) ``` 发送第一条消息: ```bash run_session_turn \ "$ARK_SESSION_ID" \ "客户升级桌面客户端后无法登录,页面提示账号不存在。请按工单分诊流程给出初步判断和下一步。" ``` 这个调用表示「把一条用户消息追加到已有 Session」,不是新建一次模型调用。SSE 就绪后,服务接收消息,Session 从 `idle` 进入 `running`,Agent 随后产生回复、工具调用和状态事件。 ## 识别本轮完成信号 入门阶段重点关注三类事件: | 事件 | 含义 | 应用中的典型展示 | |-|-|-| | `agent.tool_use` | Agent 正在调用工具 | 展示工具名称和进行中状态 | | `agent.message` | Agent 产生了可展示的回复 | 渲染文本或交付物 | | `session.status_idle` 且 `stop_reason.type=end_turn` | 当前回合正常结束,Session 可接收下一条消息 | 收起过程事件,展示最终回复和继续输入框 | `session.status_idle` 表示 Session 当前暂停处理,但不一定表示正常完成。应继续检查 `stop_reason.type`: - `end_turn`:本轮正常结束。 - `requires_action`:客户端需要根据 `stop_reason.event_ids` 处理待确认或待回传的工具事件。 - `retries_exhausted`:自动重试已耗尽,需要根据 `session.error` 排查原因。 **不要只以收到第一条 `agent.message` 作为完成信号**,因为 Agent 后续仍可能继续调用工具或补充回复。`run_session_turn` 会执行上述判断;SSE 意外断开时,函数会先建立替代流,再分页补查历史事件并按事件 ID 去重。 ## 在同一 Session 继续发送消息 现在模拟客服拿到新线索。不要创建新 Session,继续使用 `run_session_turn` 向原来的 `ARK_SESSION_ID` 追加 `user.message`。函数会为新一轮重新建立 SSE 流,并在确认 `: ready` 后发送消息: ```bash run_session_turn \ "$ARK_SESSION_ID" \ "补充信息:这个账号昨天刚完成租户迁移,旧租户仍然可以登录。请基于上一轮判断更新根因优先级,并给出客服可以直接执行的检查清单。" ``` 函数收到新的 `session.status_idle` 且 `stop_reason.type=end_turn` 后返回。这一次 Agent 应能识别「上一轮」指什么,并把租户迁移线索与最初的登录故障合并分析。 这就是 Session 的核心价值: - 同一个 Session 保留任务上下文、事件历史和运行状态; - 每个 `POST /events` 只推进一个用户回合; - 上一轮以 `session.status_idle` 且 `stop_reason.type=end_turn` 结束后,再发送下一轮; - 如果创建新 Session,新的任务不会自动继承这张工单的上下文。 # Session 发消息时最容易出错的地方 | 现象 | 常见原因 | 正确处理 | |-|-|-| | 后续消息没有继承上文 | 每一轮都创建了新 Session | 业务任务未结束时复用同一个 `session_id` | | 消息请求被拒绝 | 上一轮仍在运行,或 Session 正在等待客户端处理工具事件 | 等待 `session.status_idle`,并确认 `stop_reason.type=end_turn` 后再发送下一条消息 | | 一次请求里塞了多轮对话 | 一个 Events 请求包含多个 `user.message` | 每次请求只发送一个 `user.message` | | 页面过早显示「已完成」 | 收到 `agent.message` 或任意 `session.status_idle` 就结束监听 | 同时检查 `session.status_idle` 和 `stop_reason.type=end_turn` | | 重连后出现重复事件 | SSE 重连后重复消费历史事件 | 按事件 `id` 去重,并保存最后已处理位置 | | API Key 泄漏 | 浏览器直接调用 Managed Agents API | 由业务后端保管 Key、发送消息和消费 SSE | # 把它嵌入自己的业务 在真实应用中,建议由业务后端维护「业务对象 ID 到 Session ID」的映射。例如一张工单、一个研究任务或一个代码修复任务,各对应一个 Session。前端只把用户输入交给业务后端;业务后端再追加 `user.message`、消费 SSE,并把标准化的进度推给前端。 ![业务前端、业务后端与 Managed Agents 的数据流](https://arkdocs.tos-cn-beijing.volces.com/flowcharts/tutorials/new-202607201113.svg) 前端可以把 `agent.tool_use` 展示为可折叠的执行过程,把最后的 `agent.message` 展示为正式结果,并在收到 `session.status_idle` 且 `stop_reason.type=end_turn` 后恢复输入框。这样用户既能看到 Agent 正在做什么,也能在同一任务中继续补充要求。 # 你刚才完成了什么 你已经完成了 Managed Agents 的最小闭环:把组织流程写成 Skill,绑定到 Agent,创建 Environment 和 Session,通过 Events 发送消息,再以 `session.status_idle` 和 `stop_reason.type=end_turn` 判断一轮正常结束。更重要的是,你没有把第二条要求当成一项新任务,而是复用了原 Session,让 Agent 基于已有上下文继续工作。 下一步可以选择一个方向扩展: - 把 CRM、工单或知识库接成 MCP Tool; - 给 Session 挂载文件或 Memory; - 把 Events 映射成产品中的过程状态; - 为高风险工具增加用户确认和幂等控制。 --- # [基础] 工单分诊 Agent 系统提示词版本管理 Source: https://ark.volcengine.com/region:cn-beijing/docs/agent-system-prompt-versioning 本教程演示如何使用方舟 Managed Agents 的 **Agent 版本机制**,安全地迭代一个工单分诊 Agent 的 System Prompt。 **System Prompt**(系统提示词)是给 Agent 的稳定指令:它告诉 Agent 承担什么角色、遵循什么规则、按什么格式输出。同一个模型在不同 System Prompt 下会表现出完全不同的行为,因此 System Prompt 是决定 Agent 质量的核心资产。 本教程的做法是:每次更新 System Prompt 自动产生新版本,用带标注的评估集量化对比新旧表现;一旦出现回归,秒级回滚;修复后按流量灰度放量。全过程不需要重新部署任何代码。 核心亮点: - **修改 System Prompt 即发版**:System Prompt 是服务端的版本化资产,更新一次产生一个新版本,秒级生效,不走代码发布链路。 - **回滚等于修改一个数字**:生产配置把版本号指回旧版本,新建 Session 立即回到旧行为,无部署、无停机,也不需要删除任何东西。 - **版本号即 feature flag**:灰度、A/B 对比、按用户分组放量,都用「创建 Session 时锁定哪个版本」表达。 - **量化迭代**:带标注测试集给每个版本打分,回归当场检出;不依赖肉眼盲测 System Prompt diff。 # 场景介绍 一个工单分诊 Agent 的职责是:客服工单进入系统后,Agent 读完工单并输出一行 JSON——说明该派给哪个团队(`billing`、`auth`、`api-platform`、`dashboard`)、优先级如何——下游系统按结果自动派单。这类 Agent 的行为几乎完全由 System Prompt 决定,而修改 System Prompt 又非常「顺手」:一句话即可上线,不用编译、不用测试。 顺手就意味着危险。**改坏 System Prompt 与改坏代码属于同一级别的生产事故**,但大多数团队只对代码建立了版本控制。 | 环节 | System Prompt 写死在代码里 | System Prompt 作为版本化资产(本方案) | |-|-|-| | 更新 | 改代码 > PR > CI > 部署,十几分钟起步 | 调用一次更新接口,秒级发版 | | 回滚 | 再走一遍部署链路 | 配置指回旧版本号,即刻生效 | | 对比测试 | 构建两套实例或自建 feature flag | 多版本天然共存,Session 锁版本即可 | | 事故半径 | 全量瞬间生效 | 灰度放量,问题版本只影响一小片流量 | 本教程涉及的核心能力: | 能力点 | 说明 | |-|-| | Agent 版本 | Agent 是可版本化、可复用的配置资产;每次更新自动产生新版本,历史版本全部保留 | | Session 锁版本 | 创建 Session 时 `agent` 传字符串等同于跟随最新版本;传 `{"type": "agent", "id", "version"}` 对象等同于锁定到指定版本,用于回滚、灰度对比、产品定版 | | 运行中隔离 | 版本在 Session 生命周期内固定不变,后续发版不影响存量 Session | | 评估闭环 | 带标注测试集加分版本跑分,让「新版本更好」成为可验证的结论,而不是主观判断 | # 前置准备 准备一台 macOS 或 Linux 设备,并安装以下命令行工具: - Bash 3.2 或更高版本 - cURL 7.68.0 或更高版本 - jq 1.6 或更高版本 ## 开通服务并配置 API Key 先设置 API 地址和 API Key。API Key 只应保存在本地环境变量或服务端密钥系统中,不要硬编码在代码中。 ```bash export ARK_BASE_URL="https://ark.cn-beijing.volces.com/api/v3" export ARK_API_KEY="替换为你的 ARK API Key" ``` 鉴权使用 `Authorization: Bearer $ARK_API_KEY`。 ## 准备带标注的评估集 评估集是版本管理的另一半:没有它,「新版本更好」只是主观感觉。准备一份 `tickets.jsonl`,每行一条工单,带正确答案: ```json {"subject": "五月账单重复扣款", "body": "我们本月被收了两次费用,请核对……", "team": "billing"} {"subject": "OAuth token 过期太快", "body": "接入后每小时就要重新授权……", "team": "auth"} {"subject": "API 用量超限报 429", "body": "我们套餐是 10000 次/月,还没用完就被限流……", "team": "billing"} ``` 建议 20 到 50 条、覆盖所有团队,并**刻意包含易混淆样本**——例如上面第三条:通篇都是「API 用量」,但客户实际问的是计费问题。这类样本正是后续检出回归的关键。 # 详细操作指南 ## 创建 Agent v1,建立基线 创建分诊 Agent(纯文本判断任务,不需要挂工具)和一个运行环境: ```Bash RESOURCE_SUFFIX="$(date +%Y%m%d%H%M%S)-$RANDOM" curl "$ARK_BASE_URL/agents" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "name": "ticket-triage-'"$RESOURCE_SUFFIX"'", "model": {"id": "doubao-seed-2-1-pro-260628"}, "system": "你是工单分诊 Agent。读完工单后只输出一行 JSON(不要代码块、不要多余文字):{\"team\": \"\", \"priority\": \"\"}。按客户的实际问题路由,不要被表面关键词带偏。" }' curl "$ARK_BASE_URL/environments" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{"name": "triage-env-'"$RESOURCE_SUFFIX"'", "config": {"type": "cloud", "networking": {"type": "unrestricted"}}}' ``` Agent 创建响应中 `version` 为 `1`——**创建即 v1,之后每次更新自动递增**。 将 Agent ID 与 Environment ID 写入环境变量,供后续脚本使用。`environment_id` 指定 Session 使用的运行环境。创建 Session 时必须传入该字段;省略后,接口返回 HTTP 400 `MissingParameter`。 ```bash export AGENT_ID="替换为上一步返回的 agent id" export ENV_ID="替换为上一步返回的 environment id" ``` 对评估集逐条执行同一套闭环:为指定版本创建 Session、发送工单、等待 `session.status_idle`,再读取最后一条 `agent.message` 并与标注答案比对。实现时必须设置总体超时,并把「结构不合法」、「工具错误」、「超时」与「模型判错」分开统计。 ```bash #!/usr/bin/env bash set -euo pipefail VERSION="${1:?usage: $0 }" while IFS= read -r ticket; do expected=$(jq -r '.team' <<<"$ticket") text=$(jq -r '"工单标题:" + .subject + "\n\n" + .body' <<<"$ticket") sid=$(curl -fsS -X POST "$ARK_BASE_URL/sessions" \ -H "Authorization: Bearer $ARK_API_KEY" -H "Content-Type: application/json" \ -d "$(jq -nc --arg id "$AGENT_ID" --arg env "$ENV_ID" --argjson v "$VERSION" \ '{agent:{type:"agent",id:$id,version:$v},environment_id:$env}')" | jq -r '.id') curl -fsS -X POST "$ARK_BASE_URL/sessions/$sid/events" \ -H "Authorization: Bearer $ARK_API_KEY" -H "Content-Type: application/json" \ -d "$(jq -nc --arg text "$text" \ '{events:[{type:"user.message",content:[{type:"text",text:$text}]}]}')" >/dev/null idle=false for _ in {1..150}; do events=$(curl -fsS "$ARK_BASE_URL/sessions/$sid/events" \ -H "Authorization: Bearer $ARK_API_KEY") if jq -e 'any(.data[]?; .type == "session.status_idle")' <<<"$events" >/dev/null; then idle=true; break fi sleep 2 done if [[ "$idle" != true ]]; then printf '%s\ttimeout\n' "$expected"; continue; fi got=$(jq -r '[.data[] | select(.type == "agent.message")] | last | .content[0].text | fromjson | .team' <<<"$events") printf '%s\t%s\n' "$expected" "$got" done < tickets.jsonl ``` 每次评估还应记录 Agent 版本、模型版本、评估集版本、运行时间、失败或超时样本,以及可获得的 request ID。准确率之外,至少单独统计「结构不合法」、「工具错误」和「超时」三类异常,避免把运行故障误判成模型质量问题。 跑出 v1 基线: ```text $ ./score.sh 1 api-platform: 5/5 auth: 5/5 billing: 4/5 dashboard: 3/5 ``` `billing` 有一条错分——正是那条「通篇 API 用量、实际是计费问题」的工单,被路由到了 `api-platform`。这是我们要修复的问题,也是版本迭代的起点。 ## 发布 v2:更新 System Prompt 针对 `billing` 错分,给 System Prompt 追加一条路由规则。调用 Agent 更新接口,**必须带上当前版本号**(乐观并发锁): ```Bash curl "$ARK_BASE_URL/agents/$AGENT_ID" \ -X POST \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "version": 1, "system": "\n\n路由规则:工单只要提到 API 用量、频控、配额或请求量,一律路由到 api-platform。此规则优先于其他一切考虑,不要根据工单其余内容做二次判断。" }' ``` 响应中 `version` 变为 `2`。更新接口有三条关键语义: - **`version` 是并发保险**:传入值必须等于当前版本。不匹配时返回 HTTP 400 `InvalidParameter`,错误消息为 `version: conflict`,说明有其他协作者先一步发布了新版本。此时需重新查询最新版本,再基于最新配置提交,避免互相覆盖。 - **省略的字段继承上一版本**:本次只传了 `system`,`name`、`model` 等字段原样保留,不会被清空。 - **仅更新 `display_name` 不产生新版本**:只修改 `display_name` 且省略其他字段时,版本号保持不变。更新 `system`、`model`、`tools`、`skills`、`mcp_servers` 等版本化字段时,即使提交值与当前版本相同,也会生成新版本。服务端仅根据请求体中是否出现版本化字段判断,不比较新旧值。 > **注意** > > 版本冲突后不要直接重复提交原请求。先查询智能体详情获取最新 `version`,合并其他协作者的改动,再使用新版本号更新;继续使用旧版本号会再次返回 HTTP 400 `InvalidParameter`。 ## 评估 v2,检出回归 用同一把尺子度量新版本: ```text $ ./score.sh 2 api-platform: 5/5 auth: 5/5 billing: 2/5 ← 从 4/5 掉到 2/5 dashboard: 3/5 ``` **v2 不但没有修好问题,还引入了回归**:那条规则写得太激进——`billing` 的工单天然会提到「API 用量」(超量才产生扣费争议),现在全部被这条规则劫持到了 `api-platform`。 值得停下来看清这件事:v2 的 System Prompt diff 在 review 时**看起来完全是改进**——更明确、更具体、指令性更强。这个坑只有「同一评估集跑两个版本、逐类目对比」才能暴露。这正是 System Prompt 变更必须走版本加评估,而不是「看起来没问题就上」的原因。 ## 回滚,然后灰度放量 **回滚不是一个 API,而是一次配置变更。** 生产代码创建 Session 时从配置读取版本号,出问题就把它指回去: ```Bash # 生产配置(配置中心或环境变量) PRODUCTION_VERSION=1 # 从 2 改回 1,即完成回滚 # 生产代码创建 Session 时始终锁定该版本 curl "$ARK_BASE_URL/sessions" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "agent": {"type": "agent", "id": "'"$AGENT_ID"'", "version": '"$PRODUCTION_VERSION"'}, "environment_id": "'"$ENV_ID"'" }' ``` 三个让回滚「秒级且无痛」的事实: - 存量 Session 在创建时就锁定了各自版本,本来就不受发版影响; - 新建 Session 从配置修改那一刻起全部回到 v1; - **v2 不需要删除**——它留在服务端,是下一轮修复(v3)的底稿,也是事故复盘的证据。 > **注意** > > 生产环境默认应使用对象形式锁定版本,以确保评估、灰度和回滚可复现。只有明确接受「自动跟随最新版本」风险的非生产或受控场景,才使用字符串形式。 修复规则后发布 v3(把「一律路由」改成「结合扣费、账单语境判断」),评估通过(`billing` 回到 5/5)。这次不直接全量,**按用户灰度放量**——版本分配是应用层的事: ```bash # 按用户 ID 哈希分组:前 10% 的用户使用 v3,其余保留在 v1 bucket=$(( $(cksum <<<"$USER_ID" | cut -d' ' -f1) % 100 )) if [ "$bucket" -lt 10 ]; then VERSION=3; else VERSION=1; fi ``` 按用户哈希而不是按请求随机,好处是**同一用户始终落在同一版本**:行为一致,出问题也能精确圈出受影响的用户群。之后按 10% > 25% > 50% > 100% 逐档放量,每一档都用线上指标或评估集复核一遍。 随时可以列出全部版本历史,核对每一版的 System Prompt 内容: ```Bash curl "$ARK_BASE_URL/agents/$AGENT_ID/versions" \ -H "Authorization: Bearer $ARK_API_KEY" ``` # 版本机制参考 | 机制 | 行为 | |-|-| | 版本产生 | 创建即 v1;每次更新自动递增;仅更新 `display_name` 时不递增,其他版本化字段即使值相同也会递增 | | 并发安全 | 更新必须携带当前 `version`;不匹配时返回 HTTP 400 `InvalidParameter`,错误消息为 `version: conflict` | | Session 绑定 | `agent` 传字符串即使用该 Agent 最新版本启动;传 `{"type": "agent", "id", "version"}` 对象即锁定到指定版本 | | 运行中隔离 | 版本在 Session 生命周期内固定;运行中也不可修改 Session 的任何配置。官方口径:「如需调整 Agent 能力,请发布 Agent 新版本并新建 Session」 | | 回滚 | 无专门 API;生产配置把版本号指向旧版本,新建 Session 即刻生效 | | 灰度 | 平台不感知流量分配;由应用层按版本号分流(按流量百分比或按用户哈希) | 与本系列上一篇的连接:创建 Session 时 `vault_ids` 与 `agent.version` 可以同时使用——**「以谁的身份行动」和「用哪一版行为」是 Session 上两个正交的旋钮**,多租户凭据隔离和版本灰度可以互不干扰地组合。 --- # [基础] Custom Tool 使用教程 Source: https://ark.volcengine.com/region:cn-beijing/docs/managed-agent-custom-tool-tutorial Managed Agent(MA)支持内置工具、Custom Tool 和 MCP 工具。工具类型和基础配置请参见 [Tools](/docs/tools)。 内置工具适合在托管 sandbox 中执行文件读写、命令执行、网页检索等操作;Custom Tool 适合将少量业务函数交给 Agent 调用;MCP 工具适合接入已经按 MCP 协议封装的外部能力。 在企业应用中,开发者通常还需要让 Agent 调用业务系统中的专用操作,例如查询订单、创建工单、调用库存系统、访问内网风控接口,或触发企业已有的图像、视频、数据处理服务。如果这些能力都通过 MCP server 接入,需要额外部署服务、维护 HTTP endpoint 和鉴权链路;如果让 Agent 直接通过命令行调用内部接口,则缺少稳定的参数 schema、权限边界和结果格式约束。 Custom Tool 用于解决这类“将少量业务函数交给 Agent 调用”的场景。开发者只需要在 Agent 中声明工具名称、用途和输入 schema,运行时由业务侧接收工具调用事件、执行真实业务逻辑,并将工具结果回传给 Session。Agent 可以基于工具结果继续推理和回复用户。 本文先通过订单查询演示可直接执行的最小事件闭环,再通过 4 个多媒体示例说明如何声明工具、触发调用和回传结果: - 查询订单并回传确定性结果 - Custom Tool 生图 - 多图 Base64 回传 - 使用 File ID 作为参考素材生视频 - 查询视频任务并理解视频内容 ## 前提条件 你需要准备: - 已开通 Managed Agent,并已获取可用的 API Key。 - 已准备 Agent 使用的模型。 - 已创建云环境,并将其 ID 配置到 `ENVIRONMENT_ID`。 - 本地已安装 `curl` 和 `jq`。 - 已明确需要暴露给 Agent 的业务操作,包括操作名称、用途、输入参数、返回结果和错误处理方式。 - 已准备业务侧执行逻辑。该逻辑可以运行在你的服务端、内部系统或任务队列中,用于接收工具调用事件、执行实际操作,并向 Session 回传工具结果。 - 如果工具需要访问内部系统,请提前配置鉴权、权限控制、审计日志和超时策略。 ## 使用流程 使用 Custom Tool 的一般流程如下: 1. **声明工具**:创建 Agent 时,在 `tools` 中添加 `type: custom` 的工具,填写 `name`、`description` 和 `input_schema`。 2. **创建 Session**:基于该 Agent 创建 Session。 3. **建立事件流**:订阅 Session SSE,并等待服务端返回 `: ready`。 4. **发送用户消息**:向 Session 发送 `user.message`。 5. **接收工具调用事件**:当 Agent 判断需要调用自定义工具时,Session 事件流中会出现 `agent.custom_tool_use` 事件。该事件包含工具名称、工具输入参数和事件 ID。 6. **等待 Session 暂停**:Session 随后进入 `idle`,并发出 `session.status_idle` 事件。该事件的 `stop_reason.type` 为 `requires_action`,`stop_reason.event_ids` 中包含需要业务侧处理的事件 ID。 7. **执行业务逻辑**:业务侧根据 `agent.custom_tool_use` 的 `name` 和 `input` 执行对应操作。 8. **回传工具结果**:业务侧发送 `user.custom_tool_result` 事件,使用 `custom_tool_use_id` 关联第 5 步中的工具调用事件 ID。 9. **继续运行**:所有阻塞事件处理完成后,Session 从 `idle` 切回 `running`。业务侧继续监听,直到收到 `session.status_idle` 且 `stop_reason.type=end_turn`。 如果 `stop_reason.event_ids` 中包含多个事件 ID,需要为每个阻塞事件回传结果。建议将同一轮阻塞事件对应的多个 `user.custom_tool_result` 放在同一个 `events` 数组中发送。 ## 声明自定义工具 自定义工具通过 Agent 的 `tools` 字段声明。每个工具至少包含以下字段: | 字段 | 类型 | 说明 | | --- | --- | --- | | `type` | String | 固定为 `custom`。 | | `name` | String | 工具名称。建议使用英文字母、数字、下划线或连字符,便于模型稳定引用。 | | `description` | String | 工具用途、适用条件和限制。模型会根据该描述判断何时调用工具。 | | `input_schema` | Object | 定义模型生成工具入参时参考的 JSON Schema。 | 声明工具时,建议遵循以下原则: - `description` 明确说明工具应该在什么场景下使用,以及不应该在什么场景下使用。 - `input_schema` 只暴露业务必要参数,不暴露 API Key、内部服务地址等敏感配置。 - 对枚举值、数字范围、必填字段和 `additionalProperties` 做明确约束。 - 工具返回值保持结构化,便于 Agent 判断是否成功、是否需要重试,以及如何向用户解释结果。 以下示例显式关闭内置工具集,避免主 Agent 在只配置自定义工具时回退启用全部内置工具。响应示例仅展示与流程相关的关键字段,实际响应字段以 API 返回为准。 ```Bash AGENT_RESPONSE=$(curl -sS --fail-with-body "https://ark.cn-beijing.volces.com/api/v3/agents" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "name": "CustomToolDemo", "model": { "id": "doubao-seed-2-1-pro-260915" }, "system": "你是一个可以调用业务工具的助手。需要外部业务能力时,调用已声明的自定义工具。不要编造工具结果。", "tools": [ { "type": "agent_toolset_20260916", "default_config": { "enabled": false, "permission_policy": { "type": "always_allow" } } }, { "type": "custom", "name": "query_order", "description": "根据订单 ID 查询订单状态。仅当用户要求查询订单信息时使用。", "input_schema": { "type": "object", "properties": { "order_id": { "type": "string", "description": "订单 ID。" } }, "required": ["order_id"], "additionalProperties": false } } ] }') || exit 1 jq . <<<"$AGENT_RESPONSE" || exit 1 AGENT_ID=$(jq -er '.id' <<<"$AGENT_RESPONSE") || exit 1 export AGENT_ID printf 'Agent ID: %s\n' "$AGENT_ID" ``` 响应示例: ``` { "id": "agent-20260729153010-****", "object": "agent", "created_at": "2026-07-29T15:30:10Z", "name": "CustomToolDemo", "model": { "id": "doubao-seed-2-1-pro-260915" } } ``` ## 创建 Session ```bash SESSION_RESPONSE=$(curl -sS --fail-with-body \ "https://ark.cn-beijing.volces.com/api/v3/sessions" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "agent": "'"$AGENT_ID"'", "environment_id": "'"$ENVIRONMENT_ID"'", "title": "Custom Tool 演示" }') SESSION_ID=$(jq -er '.id' <<<"$SESSION_RESPONSE") export SESSION_ID printf 'Session ID: %s\n' "$SESSION_ID" ``` 响应示例: ``` { "id": "sesn-20260729153122-****", "object": "session", "agent": "agent-20260729153010-****", "environment_id": "env-20260729152900-****", "status": "idle" } ``` ## 运行最小可执行闭环 以下函数从空 Session 开始完成一次 `query_order` 调用。函数先建立 SSE 并等待 `: ready`,再发送消息;收到 `requires_action` 后,它使用真实 `stop_reason.event_ids` 找到对应的 `agent.custom_tool_use`,生成确定性的订单查询结果,批量回传 `user.custom_tool_result`,最后等待 `end_turn`: ```Bash run_query_order_turn() ( local session_id="$1" local user_text="${2:-查询订单 ORDER-1001 的状态。}" local stream_dir local stream_pipe local stream_pid="" local stream_ready=false local pending_file local line local data local event_type local stop_reason local pending_id local tool_event local tool_name local order_id local result_text local result_event local result_events local result_payload local message_count=0 local turn_done=false local result_code=1 : "${ARK_BASE_URL:?Set ARK_BASE_URL before calling run_query_order_turn}" : "${ARK_API_KEY:?Set ARK_API_KEY before calling run_query_order_turn}" : "${session_id:?Pass a Session ID as the first argument}" command -v curl >/dev/null || { printf 'curl is required.\n' >&2 return 1 } command -v jq >/dev/null || { printf 'jq is required.\n' >&2 return 1 } stream_dir=$(mktemp -d) || return 1 stream_pipe="$stream_dir/events" pending_file="$stream_dir/pending.ndjson" : >"$pending_file" mkfifo "$stream_pipe" || { rm -rf "$stream_dir" return 1 } cleanup_stream() { exec 3<&- || true if [[ -n $stream_pid ]] && kill -0 "$stream_pid" 2>/dev/null; then kill "$stream_pid" 2>/dev/null || true fi if [[ -n $stream_pid ]]; then wait "$stream_pid" 2>/dev/null || true fi rm -rf "$stream_dir" } trap cleanup_stream EXIT curl -sS -N --fail-with-body --max-time 600 \ "$ARK_BASE_URL/sessions/$session_id/events/stream" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Accept: text/event-stream" >"$stream_pipe" & stream_pid=$! exec 3<"$stream_pipe" while IFS= read -r line <&3; do line=${line%$'\r'} if [[ $line == ": ready" ]]; then stream_ready=true break fi done if [[ $stream_ready != true ]]; then printf 'SSE stream closed before it was ready.\n' >&2 return 1 fi curl -sS --fail-with-body --connect-timeout 5 --max-time 30 \ "$ARK_BASE_URL/sessions/$session_id/events" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d "$(jq -nc --arg text "$user_text" \ '{events: [{type: "user.message", content: [{type: "text", text: $text}]}]}')" \ >/dev/null || return 1 while IFS= read -r line <&3; do line=${line%$'\r'} [[ $line == data:* ]] || continue data=${line#data:} data=${data# } event_type=$(jq -r '.type // empty' <<<"$data" 2>/dev/null || true) case "$event_type" in agent.custom_tool_use) jq -c . <<<"$data" >>"$pending_file" printf '[tool] %s\n' "$(jq -r '.name // "unknown"' <<<"$data")" ;; agent.message) jq -r '.content[]? | select(.type == "text") | .text' <<<"$data" message_count=$((message_count + 1)) ;; session.status_idle) stop_reason=$(jq -r '.stop_reason.type // empty' <<<"$data") case "$stop_reason" in requires_action) result_events='[]' while IFS= read -r pending_id; do [[ -n $pending_id ]] || continue tool_event=$(jq -sc --arg id "$pending_id" \ 'map(select(.id == $id)) | last // empty' "$pending_file") if [[ -z $tool_event ]]; then printf 'Missing custom tool event: %s\n' "$pending_id" >&2 return 1 fi tool_name=$(jq -r '.name // empty' <<<"$tool_event") if [[ $tool_name != "query_order" ]]; then printf 'Unsupported custom tool: %s\n' "$tool_name" >&2 return 1 fi order_id=$(jq -er '.input.order_id' <<<"$tool_event") || return 1 result_text=$(jq -nc --arg order_id "$order_id" \ '{order_id: $order_id, status: "shipped", carrier: "Example Express"}') result_event=$(jq -nc \ --arg id "$pending_id" \ --arg text "$result_text" \ '{ type: "user.custom_tool_result", custom_tool_use_id: $id, is_error: false, content: [{type: "text", text: $text}] }') result_events=$(jq -nc \ --argjson current "$result_events" \ --argjson event "$result_event" \ '$current + [$event]') done < <(jq -r '.stop_reason.event_ids[]?' <<<"$data") if [[ $(jq 'length' <<<"$result_events") -eq 0 ]]; then printf 'requires_action did not include event IDs.\n' >&2 return 1 fi result_payload=$(jq -nc --argjson events "$result_events" \ '{events: $events}') curl -sS --fail-with-body --connect-timeout 5 --max-time 30 \ "$ARK_BASE_URL/sessions/$session_id/events" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d "$result_payload" >/dev/null || return 1 ;; end_turn) if ((message_count == 0)); then printf 'The turn ended without an agent.message event.\n' >&2 result_code=5 else result_code=0 fi turn_done=true break ;; retries_exhausted) result_code=3 turn_done=true break ;; *) printf 'Unknown session.status_idle stop_reason: %s\n' "$stop_reason" >&2 result_code=5 turn_done=true break ;; esac ;; session.status_terminated) result_code=4 turn_done=true break ;; session.error) jq -r '"[error] \(.error.type // "unknown_error"): \(.error.message // "")"' \ <<<"$data" >&2 ;; esac done if [[ $turn_done != true ]]; then printf 'SSE stream closed before the turn finished.\n' >&2 return 1 fi return "$result_code" ) ``` 运行函数: ```bash run_query_order_turn "$SESSION_ID" "查询订单 ORDER-1001 的状态。" ``` 正常完成时,函数输出 Agent 的最终回复并返回状态码 `0`。返回 `3` 表示本轮重试耗尽,返回 `4` 表示 Session 已终止。SSE 在终态前断开时,函数返回非零状态,不会把断流当作成功。 > **注意** > > 本节用固定订单结果演示业务侧执行器。接入真实系统时,只替换函数中 `query_order` 的业务查询逻辑,保留 `: ready`、`requires_action.event_ids`、`custom_tool_use_id` 和 `end_turn` 的处理顺序。 ## 场景一:Custom Tool 生图 本场景演示如何通过 Custom Tool 接入企业已有的生图服务。完整链路包括:声明 `generate_image` 工具、创建 Agent 和 Session、发送用户消息、接收工具调用事件、执行生图逻辑并回传图片结果。 以下多媒体场景聚焦工具 Schema 和结果格式,只展示事件 payload。实际执行时,沿用 [运行最小可执行闭环](/docs/managed-agent-custom-tool-tutorial#run-minimal-loop) 中的 SSE 循环,并替换业务处理逻辑。不要在尚未收到 `: ready` 时单独执行发送消息的 cURL。 创建 Agent 时,在 `tools` 中声明生图工具: ```json { "type": "custom", "name": "generate_image", "description": "调用业务侧生图服务生成图片。当用户明确要求创建、绘制或生成图片时使用;不要用于回答纯文本问题。prompt 需要描述主体、场景、风格和关键约束;size 决定输出尺寸;n 决定返回图片数量。", "input_schema": { "type": "object", "properties": { "prompt": { "type": "string", "description": "完整的生图提示词。" }, "size": { "type": "string", "description": "输出尺寸,例如 2048x2048。" }, "watermark": { "type": "boolean", "description": "是否添加水印。" }, "n": { "type": "integer", "minimum": 1, "maximum": 4, "description": "返回图片数量。" } }, "required": ["prompt"], "additionalProperties": false } } ``` 创建包含该工具的 Agent 并创建 Session 后,发送生图请求: ```Bash curl -X POST "https://ark.cn-beijing.volces.com/api/v3/sessions/sesn-20260729153122-****/events" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "events": [ { "type": "user.message", "content": [ { "type": "text", "text": "生成一张 2048x2048 的产品海报:一只透明玻璃咖啡杯放在木质桌面上,清晨自然光,背景有浅景深绿植,干净商业摄影风格。" } ] } ] }' ``` 模型产生 `agent.custom_tool_use`: ```json { "id": "sevt-20260729153201-****", "type": "agent.custom_tool_use", "name": "generate_image", "input": { "prompt": "透明玻璃咖啡杯放在木质桌面上,清晨自然光,背景有浅景深绿植,干净商业摄影风格,产品海报构图", "size": "2048x2048", "watermark": true, "n": 1 } } ``` 随后 Session 进入 `idle`,`stop_reason.type` 为 `requires_action`: ```json { "id": "sevt-20260729153202-****", "type": "session.status_idle", "stop_reason": { "type": "requires_action", "event_ids": [ "sevt-20260729153201-****" ] } } ``` 业务侧执行器调用生图服务,并回传工具结果: ```Bash curl -X POST "https://ark.cn-beijing.volces.com/api/v3/sessions/sesn-20260729153122-****/events" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "events": [ { "type": "user.custom_tool_result", "custom_tool_use_id": "sevt-20260729153201-****", "is_error": false, "content": [ { "type": "text", "text": "{\"ok\":true,\"image_count\":1,\"delivery\":\"base64\",\"request_id\":\"req-20260729153215-****\",\"usage\":{\"generated_images\":1}}" }, { "type": "image", "source": { "type": "base64", "media_type": "image/png", "data": "iVBORw0KGgoAAAANSUhEUgAA...****" } } ] } ] }' ``` 模型拿到结果后即可回复用户,例如: ```json { "type": "agent.message", "content": [ { "type": "text", "text": "图片已生成,画面为清晨自然光下的玻璃咖啡杯产品海报。" } ] } ``` ## 场景二:多图 Base64 回传 本场景演示一个工具调用返回多个多模态内容块。可以复用场景一中的 `generate_image` 工具声明,但需要在 `input_schema` 中为 `n` 设置合理范围,例如 `minimum: 1`、`maximum: 4`。 创建包含该工具的 Agent 和 Session 后,用户可以要求一次生成多张图片: ```Bash curl -X POST "https://ark.cn-beijing.volces.com/api/v3/sessions/sesn-20260729153122-****/events" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "events": [ { "type": "user.message", "content": [ { "type": "text", "text": "为同一个智能音箱生成 3 张电商主图,分别展示正面、45 度角和使用场景。" } ] } ] }' ``` Agent 生成的工具调用事件示例如下: ```json { "id": "sevt-20260729154001-****", "type": "agent.custom_tool_use", "name": "generate_image", "input": { "prompt": "同一个智能音箱的 3 张电商主图,白色背景,柔和阴影,分别展示正面、45 度角和使用场景", "size": "2048x2048", "watermark": true, "n": 3 } } ``` 回传结果时,文本块只放机器可读摘要,不重复塞入 Base64;每张图独立使用一个 `image/base64` 内容块: ```Bash curl -X POST "https://ark.cn-beijing.volces.com/api/v3/sessions/sesn-20260729153122-****/events" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "events": [ { "type": "user.custom_tool_result", "custom_tool_use_id": "sevt-20260729154001-****", "is_error": false, "content": [ { "type": "text", "text": "{\"ok\":true,\"image_count\":3,\"delivery\":\"base64\",\"request_ids\":[\"req-20260729154011-****\",\"req-20260729154018-****\",\"req-20260729154025-****\"],\"usage\":{\"generated_images\":3}}" }, { "type": "image", "source": { "type": "base64", "media_type": "image/png", "data": "iVBORw0KGgoAAAANSUhEUgAA...image_1...****" } }, { "type": "image", "source": { "type": "base64", "media_type": "image/png", "data": "iVBORw0KGgoAAAANSUhEUgAA...image_2...****" } }, { "type": "image", "source": { "type": "base64", "media_type": "image/png", "data": "iVBORw0KGgoAAAANSUhEUgAA...image_3...****" } } ] } ] }' ``` 这种结构有两个好处: - 文本 JSON 便于 Agent 判断工具是否成功、生成了几张图、是否需要重试。 - 原生 `image` 内容块便于模型直接消费图像模态,不需要从文本中解析大段 Base64。 ## 场景三:File ID 参考生视频 本场景演示如何让 Custom Tool 接收 File ID,并由业务侧把文件解析为视频生成服务可读取的参考素材。适用于参考图、参考视频、参考音频等素材已经通过 Files API 上传的场景。 创建 Agent 时,声明 `generate_video` 工具: ```json { "type": "custom", "name": "generate_video", "description": "提交异步生视频任务。当用户要求生成视频、基于参考素材生成视频或图生视频时使用。调用成功只表示任务已提交;需要通过 get_video_task 查询完成状态。", "input_schema": { "type": "object", "properties": { "prompt": { "type": "string", "description": "视频提示词,描述主体、动作、场景、镜头和风格。" }, "model": { "type": "string", "description": "生视频模型 ID 或 Endpoint ID。" }, "reference_image_sources": { "type": "array", "items": { "type": "object", "properties": { "type": { "type": "string", "enum": ["url", "file", "tos"] }, "url": { "type": "string" }, "file_id": { "type": "string" }, "tos_uri": { "type": "string" } }, "required": ["type"], "additionalProperties": false }, "description": "参考图片来源列表。" }, "duration": { "type": "integer", "description": "视频时长,单位秒。" }, "ratio": { "type": "string", "description": "画面比例,例如 16:9、9:16、1:1。" }, "wait_for_completion": { "type": "boolean", "description": "是否等待任务完成后再回传工具结果。" } }, "additionalProperties": false } } ``` 创建包含该工具的 Agent 和 Session 后,用户可以在消息中引用 File ID: 用户请求: ```Bash curl -X POST "https://ark.cn-beijing.volces.com/api/v3/sessions/sesn-20260729153122-****/events" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "events": [ { "type": "user.message", "content": [ { "type": "text", "text": "用 file-20260729160108-**** 这张参考图生成一个 5 秒 16:9 视频:杯子旁边的蒸汽缓慢升起,镜头轻微推进,清晨暖光。" } ] } ] }' ``` 模型调用 `generate_video`: ```json { "id": "sevt-20260729160130-****", "type": "agent.custom_tool_use", "name": "generate_video", "input": { "model": "doubao-seedance-2-0-260128", "prompt": "参考图中的杯子保持主体一致,蒸汽缓慢升起,镜头轻微推进,清晨暖光,商业摄影质感", "reference_image_sources": [ { "type": "file", "file_id": "file-20260729160108-****" } ], "duration": 5, "ratio": "16:9", "wait_for_completion": false } } ``` 业务侧执行器可以把 File ID 解析为视频生成服务可访问的素材,再提交异步任务。首次回传通常只表示任务已受理: ```Bash curl -X POST "https://ark.cn-beijing.volces.com/api/v3/sessions/sesn-20260729153122-****/events" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "events": [ { "type": "user.custom_tool_result", "custom_tool_use_id": "sevt-20260729160130-****", "is_error": false, "content": [ { "type": "text", "text": "{\"ok\":true,\"task_id\":\"cgt-20260729160142-****\",\"model\":\"doubao-seedance-2-0-260128\",\"status\":\"queued\",\"video_url\":null}" } ] } ] }' ``` 用户稍后查询任务: ```json { "id": "sevt-20260729160810-****", "type": "agent.custom_tool_use", "name": "get_video_task", "input": { "task_id": "cgt-20260729160142-****", "model": "doubao-seedance-2-0-260128" } } ``` 任务完成时的回传示例: ```Bash curl -X POST "https://ark.cn-beijing.volces.com/api/v3/sessions/sesn-20260729153122-****/events" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "events": [ { "type": "user.custom_tool_result", "custom_tool_use_id": "sevt-20260729160810-****", "is_error": false, "content": [ { "type": "text", "text": "{\"ok\":true,\"task_id\":\"cgt-20260729160142-****\",\"model\":\"doubao-seedance-2-0-260128\",\"status\":\"succeeded\",\"video_url\":\"https://example-cdn.volces.com/video/cgt-20260729160142-****.mp4\",\"usage\":{\"duration\":5}}" } ] } ] }' ``` 视频结果建议以文本 JSON 返回 `video_url`。当前不要把 MP4 二进制作为 `document/base64` 塞回 Tool Result;这会显著放大事件体积,也可能无法被模型消费层按视频模态解析。 ## 场景四:查询并理解视频 本场景演示如何把异步任务查询和后续视频理解串联起来。查询任务和理解视频内容是两个动作: 1. `get_video_task` 负责确认任务状态,并拿到 `video_url`。 2. 内置多模态或视频理解工具负责读取 `video_url` 并总结画面内容。 创建 Agent 时,声明任务查询工具: ```json { "type": "custom", "name": "get_video_task", "description": "查询异步视频任务。当用户要求查看视频生成进度、确认任务是否完成或获取视频结果时使用。任务未完成时只能说明仍在生成;任务成功且包含 video_url 时,才能说明视频已完成。", "input_schema": { "type": "object", "properties": { "task_id": { "type": "string", "description": "视频任务 ID。" }, "model": { "type": "string", "description": "创建任务时使用的模型 ID,可省略。" } }, "required": ["task_id"], "additionalProperties": false } } ``` 创建包含该工具的 Agent 和 Session 后,用户请求查询并理解视频: ```Bash curl -X POST "https://ark.cn-beijing.volces.com/api/v3/sessions/sesn-20260729153122-****/events" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "events": [ { "type": "user.message", "content": [ { "type": "text", "text": "查询任务 cgt-20260729160142-****。如果视频已经完成,请理解视频内容并总结镜头、主体动作和视觉风格。" } ] } ] }' ``` 模型先调用 `get_video_task`: ```json { "id": "sevt-20260729162000-****", "type": "agent.custom_tool_use", "name": "get_video_task", "input": { "task_id": "cgt-20260729160142-****", "model": "doubao-seedance-2-0-260128" } } ``` 业务侧执行器回传视频 URL: ```json { "events": [ { "type": "user.custom_tool_result", "custom_tool_use_id": "sevt-20260729162000-****", "is_error": false, "content": [ { "type": "text", "text": "{\"ok\":true,\"task_id\":\"cgt-20260729160142-****\",\"model\":\"doubao-seedance-2-0-260128\",\"status\":\"succeeded\",\"video_url\":\"https://example-cdn.volces.com/video/cgt-20260729160142-****.mp4\"}" } ] } ] } ``` 接下来,Agent 应使用环境中可用的内置视频理解能力读取该 `video_url`。如果您的环境把该能力暴露为内置工具,可以在 Agent 的 system prompt 中明确要求: ```text 当 get_video_task 返回 status=succeeded 且包含 video_url,并且用户要求理解视频内容时,继续调用环境中可用的内置多模态或视频理解工具读取 video_url;不要仅凭 prompt 或 task_id 猜测视频内容。 ``` 最终回复示例: ```json { "type": "agent.message", "content": [ { "type": "text", "text": "任务已完成。视频主体是一只透明玻璃咖啡杯,蒸汽从杯口缓慢升起;镜头从中景轻微推进到近景,背景绿植保持浅景深虚化,整体是清晨暖光下的干净商业摄影风格。" } ] } ``` 如果当前环境没有视频理解内置工具,Agent 应说明只能确认 `video_url` 已生成,不能声称已经理解视频画面。 ## 业务侧执行器参考逻辑 业务侧执行器需要维护一个待处理工具调用表。收到 `agent.custom_tool_use` 时先记录事件;收到 `session.status_idle` 且 `stop_reason.type` 为 `requires_action` 时,按 `event_ids` 找到对应工具调用,执行并批量回传。 ```python pending = {} def process_event(event): event_type = event.get("type") if event_type == "agent.custom_tool_use": pending[event["id"]] = event return if event_type != "session.status_idle": return stop_reason = event.get("stop_reason") or {} if stop_reason.get("type") != "requires_action": return results = [] for event_id in stop_reason.get("event_ids", []): tool_event = pending.pop(event_id) result = execute_custom_tool(tool_event) results.append({ "type": "user.custom_tool_result", "custom_tool_use_id": event_id, "is_error": not result["ok"], "content": to_tool_result_content(result), }) post_session_events({"events": results}) ``` ## 常见问题 ### `input_schema` 是否可以传字符串? 不可以。`input_schema` 必须以 JSON 对象传入,且顶层 `type` 仅支持 `object`。 ### Custom Tool 名称有什么限制? API 允许名称包含 1~128 个字符,只能使用英文字母、数字、下划线或连字符。为保证模型稳定引用,建议将名称控制在 1~64 个字符,例如 `generate_image`、`get_video_task`。同一个 Agent 最多配置 8 个 Custom Tool。 ### 为什么视频结果只返回 `video_url`? 视频生成通常是异步任务,MP4 体积较大,直接作为 Tool Result 回传不适合。推荐返回文本 JSON,让 Agent、前端或后续内置视频理解工具通过 `video_url` 继续处理。 ### 多个 Custom Tool 同时触发时怎么回传? 以 `stop_reason.event_ids` 为准。该数组里的所有工具调用都完成后,放在同一个 `events` 数组中批量发送: ```json { "events": [ { "type": "user.custom_tool_result", "custom_tool_use_id": "sevt-20260729163001-****", "is_error": false, "content": [ { "type": "text", "text": "{\"ok\":true,\"value\":\"alpha\"}" } ] }, { "type": "user.custom_tool_result", "custom_tool_use_id": "sevt-20260729163002-****", "is_error": false, "content": [ { "type": "text", "text": "{\"ok\":true,\"value\":\"beta\"}" } ] } ] } ``` ### 调试建议 - 业务侧执行器先建立 SSE 并等待 `: ready`,再发送用户消息,避免错过 `requires_action`。 - 工具执行失败时也要回传 `user.custom_tool_result`,并设置 `is_error: true`。 - 不要在日志或文档中打印真实 API Key、完整签名 URL、完整 Base64 或未脱敏资源 ID。 - 生图和生视频后端建议使用独立的最小权限 API Key,便于审计和轮换。 --- # [基础] 使用 Viking 知识库检索构建知识问答 Agent Source: https://ark.volcengine.com/region:cn-beijing/docs/build-knowledge-base-agent-with-viking-search 企业知识问答往往需要同时检索制度文档、产品资料、售后政策和视频教程等多种业务资料。你可以为 Agent 接入 Viking 知识库检索 Skill,让 Agent 基于这些资料回答问题,而不是只依赖模型自身知识。 本教程演示如何完成从「选择创建入口 → 配置知识库鉴权 → 创建 Session → 验证检索结果」的完整流程。 ## 完成目标 完成本教程后,你将获得一个能够在 Session 中检索 Viking 知识库并回答业务问题的 Agent。 ## 核心概念 - `viking-knowledge-search` Skill:让 Agent 检索 Viking 知识库中的内容。需要基于企业资料、产品文档或视频内容回答问题时使用。 - Viking API Key:可以绑定指定知识库或知识服务。需要按知识库范围控制访问权限时使用。 - 火山 API Key:用于以 IAM 子账号身份访问 Viking 知识库。选择这种鉴权方式时,需要在该子账号下创建 API Key,并在 Credential 中将其配置为 `VOLC_API_KEY`。 - Credential:在 Credentials Vault 中保存 API Key,并限制密钥可以发送到哪些域名。 - Environment:承载 Agent 运行所需的环境配置。创建 Session 时需要选择对应的 Environment。 - Session:绑定 Agent、Credential 和 Environment,承载一次实际对话。 ## 前提条件 开始前,完成以下准备: - 已开通火山方舟 Managed Agents。 - 已开通 [Viking 知识库](https://console.volcengine.com/vikingdb/knowledge/region:vdb-knowledge+cn-beijing/center/collection/list?projectName=default)。 - 已在 Viking 知识库中准备可检索的业务资料。 - 已准备具备 Viking 知识库访问权限的账号。 - 已确认 Viking 知识库与 Managed Agents 使用同一项目空间。 > **注意:保持项目一致** > > Viking 知识库与 Managed Agents 必须使用同一项目空间。开始配置前,分别检查两个产品页面当前选择的项目;如果项目不一致,Managed Agents 中无法找到目标知识库。 > **注意** > > Viking API Key 和火山 API Key 选择一种配置。创建 Credential 时,变量名必须与所选鉴权方式匹配。 ## 步骤 1 · 创建 Agent 先创建负责执行知识库检索的 Agent,并为它启用 `viking-knowledge-search` Skill。你可以从 Agents 页面自行配置 Agent,也可以基于 QuickStart 模板快速创建。 **选项:从 Agents 创建** 1. 打开 [Agents 创建页](https://ark.volcengine.com/region:cn-beijing/managed-agents/agents/create)。 2. 在 **Skills** 中选择 **Ark 预置**。 3. 搜索并选择 `viking-knowledge-search`。 4. 完成其他 Agent 配置后,创建 Agent。 ![在 Agents 页面选择 Viking 知识库检索 Skill](https://arkdocs.tos-cn-beijing.volces.com/images/tutorials/managed_agents_viking_skill_v2.png) **验证**:Agent 的 Skills 列表中显示 `viking-knowledge-search`。 **选项:从 QuickStart 创建** 1. 打开 [Managed Agents QuickStart](https://ark.volcengine.com/region:cn-beijing/managed-agents/quickstart)。 2. 选择以下任一模板: - 视频知识:检索视频资料并定位关键片段。 - Deep Search:跨文档检索行业报告、产品报告和技术报告。 - 售后客服:依据产品资料与售后政策回答问题。 - 企业知识问答:依据企业制度与内部资料回答问题。 3. 需要调整 Agent 配置时,直接在对话中描述修改要求。 ![QuickStart 中的 Viking 知识库模板](https://arkdocs.tos-cn-beijing.volces.com/images/tutorials/managed_agents_viking_quickstart_templates_v2.png) **验证**:模板的 Agent 配置中包含 `viking-knowledge-search` Skill。 > **说明** > > 只需要体验预置知识库效果时,可以打开 [方舟体验中心](https://ark.volcengine.com/region:cn-beijing/experience),在 Managed Agents 下选择视频知识、Deep Search、售后客服或企业知识问答。 ## 步骤 2 · 创建 API Key 为 Viking 知识库准备调用凭据,供 Agent 发起经过鉴权的检索请求。根据已有权限管理方式,选择一种知识库鉴权方式。 **选项:Viking API Key** 1. 打开 [Viking 知识库 API Key 页面](https://console.volcengine.com/vikingdb/knowledge/region:vdb-knowledge+cn-beijing/apiKey)。 2. 创建 API Key。 3. 选择 Agent 需要访问的知识库或知识服务。 4. 完成创建并记录 API Key。 ![Viking 知识库 API Key 创建入口](https://arkdocs.tos-cn-beijing.volces.com/images/tutorials/managed_agents_viking_api_key_entry_v2.png) **验证**:API Key 已绑定 Agent 需要检索的知识库。 **选项:火山 API Key** 选择以 IAM 子账号身份访问 Viking 知识库时,需要在该子账号下创建火山 API Key,并在后续 Credential 中使用。 1. 打开 [火山引擎访问控制用户管理](https://console.volcengine.com/iam/identitymanage/user)。 2. 选择用于访问 Viking 知识库的子账号。 3. 在用户详情的 **密钥** 页签中创建 API Key。 4. 记录创建后的 API Key。 ![在火山访问控制页面创建 API Key](https://arkdocs.tos-cn-beijing.volces.com/images/tutorials/managed_agents_volc_api_key_entry_v3.png) **验证**:子账号的 **API Key** 列表中显示新建的 API Key。 ## 步骤 3 · 创建 Credential 把步骤 2 创建的 API Key 保存到 Credentials Vault,并限制密钥可以发送到的域名。 1. 打开 [Credentials Vault](https://ark.volcengine.com/region:cn-beijing/managed-agents/credentials-vault?projectName=default)。 2. 创建 Vault,并在 Vault 中添加 Credential。 3. 将 **Credential 类型** 设为 **ENV**。 4. 根据步骤 2 选择的鉴权方式,只填写一组变量名和值: - 选择 Viking API Key 时,变量名填写 `VIKING_API_KEY`,**Value** 填写对应的 Viking API Key。 - 选择火山 API Key 时,变量名填写 `VOLC_API_KEY`,**Value** 填写对应的火山 API Key。 5. 将 **出网范围** 设为 **受限**。 6. 在 **允许的域名** 中填写 `api-knowledgebase.mlp.cn-beijing.volces.com`,然后创建 Credential。 **选项:Viking API Key** ![使用 VIKING_API_KEY 创建 Credential](https://arkdocs.tos-cn-beijing.volces.com/images/tutorials/managed_agents_viking_credential_v3.png) **选项:火山 API Key** ![使用 VOLC_API_KEY 创建 Credential](https://arkdocs.tos-cn-beijing.volces.com/images/tutorials/managed_agents_volc_credential_v2.png) **验证**:Vault 的 Credential 列表中显示新建的 ENV Credential。 > **注意** > > 保存 Credential 后,页面不再显示完整密钥。提交前确认变量名、Value 和允许域名填写正确。 ## 步骤 4 · 创建 Environment 创建 Agent 运行所需的 Environment,供后续 Session 选择。 打开 Managed Agents 的 **Environments** 页面,输入名称,选择运行方式,并按业务需要完成配置后创建 Environment。 ![在 Environments 页面创建 Environment](https://arkdocs.tos-cn-beijing.volces.com/images/tutorials/managed_agents_viking_create_environment_v2.png) **验证**:Environment 列表中显示新建的 Environment。 ## 步骤 5 · 创建 Session 将 Agent、Credential 和 Environment 绑定到同一个 Session,开始验证知识库检索。 1. 打开 [Sessions](https://ark.volcengine.com/region:cn-beijing/managed-agents/sessions?projectName=default),创建 Session。 2. 依次选择步骤 1 创建的 Agent、步骤 3 创建的 Credential 和步骤 4 创建的 Environment,然后创建 Session 并进入调试页面。 **验证**:Session 创建成功,并显示已绑定的 Agent、Credential 和 Environment。 ## 验证结果 向 Session 发送一个只能从目标知识库中回答的问题。例如,知识库中保存了售后政策时,询问某个产品的退换条件。 检查以下结果: - Agent 返回的内容与目标知识库中的资料一致。 - Agent 没有混入其他知识库的内容。 - Session 没有显示知识库鉴权失败。 检索结果不符合预期时,依次检查 API Key 绑定的知识库、Credential 变量名、Value 和允许域名。 ## 常见问题 | 现象 | 处理方法 | | --- | --- | | Agents 中找不到 Skill | 在 **Skills** 中选择 **Ark 预置**,并搜索完整名称 `viking-knowledge-search`。 | | 配置时找不到目标知识库 | 分别将 Viking 知识库与 Managed Agents 切换到同一项目空间,然后重新配置。 | | 知识库鉴权失败 | 确认 Viking API Key 使用 `VIKING_API_KEY`,火山 API Key 使用 `VOLC_API_KEY`。 | | 检索不到目标资料 | 确认 API Key 已绑定目标知识库,并确认知识库中已有可检索内容。 | | Session 创建后无法检索 | 确认 Session 选择了包含 `viking-knowledge-search` 的 Agent 和正确的 Credential。 | ## 进阶方向 - 需要调整 Agent 的能力组合时,详情请参见[Skills](/docs/skills)。 - 需要管理更多凭证或认证方式时,详情请参见[使用 Vaults 认证](/docs/use-vaults-authentication)。 - 需要配置 Agent 的运行环境时,详情请参见[配置云环境](/docs/configure-cloud-environment)。 - 需要通过 Session 持续处理任务时,详情请参见[启动 Session](/docs/start-session)。 --- # [基础] 在豆包工作中使用 Managed Agents Source: https://ark.volcengine.com/region:cn-beijing/docs/use-managed-agents-in-doubao-work 将已在火山方舟中构建好的 Agent 接入豆包工作后,企业员工可以自行添加,企业管理员也可以统一分发。你无需重复开发应用入口,即可复用豆包工作和飞书的对话、任务过程展示与产物交付能力。 ## 场景说明 你已经在火山方舟中完成 Agent 的开发和调试,希望在豆包企业版中使用,或者把它分发给其他企业员工,而不是再开发一套对话页面、任务列表和流式输出界面。 根据你的角色选择一条接入路径,无需同时执行两条: | 维度 | 员工自行添加 | 管理员统一分发 | |-|-|-| | 操作角色 | 具备方舟 Agent 和 API Key 管理权限的企业员工 | Agent 开发者和企业管理员 | | 添加入口 | **连接器·技能·伙伴** > **工作伙伴** > **创建** | 豆包企业后台 **伙伴&小队管理** | | 使用范围 | 默认仅添加者 | 管理员配置的成员或部门 | | 使用入口 | **我的伙伴** | **工作伙伴** > **企业提供** | 本文中的“员工自行添加”仅适用于豆包企业版,不适用于豆包个人版。 ## 核心概念 | 概念 | 说明 | |-|-| | **Managed Agents** | 火山方舟提供的托管 Agent 运行框架,负责 Agent 配置、会话、工具调用和运行环境。 | | **Agent** | 可复用的智能体配置,包含模型、系统提示词、技能和工具。豆包工作导入的是这项配置。 | | **资源项目(Project)** | 方舟资源的隔离边界。豆包工作通过 API Key 获取该项目下可访问的 Agent。 | | **API Key** | 连接方舟账号时使用的鉴权凭证。它属于敏感信息,泄漏后可能造成资源越权访问和费用损失。 | | **工作伙伴** | 豆包企业版中的 Agent 使用入口,可以由员工自行添加,也可以由管理员统一提供。 | | **可用范围** | 管理员分发时使用的访问范围,决定哪些企业员工可以看到并使用工作伙伴。 | ## 前置条件 - 已开通火山方舟 Managed Agents,详情参见 [概述](/docs/overview)。 - 已在方舟中创建并调试 Agent。首次使用时,可参见 [快速入门(控制台)](/docs/quick-start-console)。 - 员工自行添加时,你已登录豆包企业版账号、所在企业已开通该功能,并具备在 Agent 所在项目中创建 API Key 的权限。 - 管理员统一分发时,Agent 开发者可以提供目标 Agent 和同一项目下的专用 API Key,企业管理员已获得豆包企业后台的智能体管理权限。 - 待导入 Agent 不需要登录或授权第三方服务即可完成基础任务。如果 Agent 使用的第三方服务需要授权,先完成相应服务的登录或授权。 > **说明** > > 当前只支持接入基于 Managed Agents 开发和配置的 Agent,不支持直接导入任意已有 Agent 服务。 > **警告** > > API Key 可以访问所属项目中其权限范围内的资源。建议使用独立项目和专用 API Key,避免与其他应用共享凭证。如果 Agent 开发者和企业管理员不是同一人,使用企业批准的密钥管理工具交接 API Key,不要通过群聊、工单或截图传递。 ## 路径一:员工自行添加 企业员工可以把自己在方舟中维护的 Agent 加入豆包企业版。添加后,工作伙伴默认仅本人可用。 ### 第 1 步:准备 Agent 和 API Key 1. 在方舟 **Managed Agents** > **Agents** 中打开目标 Agent,检查配置并运行一次测试任务。 2. 确认 Agent 所在项目,在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 中创建专用 API Key。 3. 记录 Agent 名称,并安全保存 API Key。 > **注意** > > API Key 必须与 Agent 位于同一项目,否则列表中不会出现目标 Agent。 ### 第 2 步:导入 Agent 1. 打开豆包企业版 **连接器·技能·伙伴** > **工作伙伴**,单击 **创建** > **接入火山方舟 Agent**。 2. 填写 API Key,选择目标 Agent 并完成添加。 ![在工作伙伴页面接入火山方舟 Agent](https://arkdocs.tos-cn-beijing.volces.com/images/Mananged-agents/doubao_work_personal_managed_agent_plugin.png) ### 第 3 步:在豆包工作中使用 1. 在 **我的伙伴** 中打开刚添加的 Agent,或在 **新工作任务** 中 `@` 该伙伴。 2. 发送测试任务,检查回复、任务状态和产物。 ![在豆包工作中与 Managed Agent 对话](https://arkdocs.tos-cn-beijing.volces.com/images/Mananged-agents/doubao_work_personal_chat_with_managed_agent.png) 例如,数据分析 Agent 可以使用以下任务: > 汇总这份销售数据中的主要变化,列出三个异常指标,并给出下一步核查建议。 ### 第 4 步:按需在飞书中使用 1. 在工作伙伴详情中选择 **飞书对话**,按指引完成添加或授权。 2. 在飞书中发送测试任务,核对工作伙伴和授权账号。 > **注意** > > 豆包工作与飞书中的会话入口可能不同。不要假设两端共享同一个可见会话列表。 ## 路径二:管理员统一分发 管理员统一分发由 Agent 开发者准备 Agent 和 API Key,再由企业管理员设置成员或部门的使用范围。 ### 第 1 步:准备 Agent 和 API Key 1. Agent 开发者在方舟 **Managed Agents** > **Agents** 中测试目标 Agent。 2. 在 Agent 所在项目的 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 中创建企业集成专用 API Key。 3. 如果企业管理员不是 Agent 开发者,使用企业批准的密钥管理工具交接 API Key。 > **注意** > > 不要与个人调试或其他应用共享该 API Key,以免撤销访问时影响其他业务。 ### 第 2 步:连接方舟账号 1. 打开豆包企业后台 **伙伴&小队管理**。 2. 单击 **添加** > **接入火山方舟 Agent**。 3. 填写 API Key,选择目标 Agent。 ![在伙伴与小队管理页面接入火山方舟 Agent](https://arkdocs.tos-cn-beijing.volces.com/images/Mananged-agents/doubao_work_enterprise_mananged_agent_plugin.png) ### 第 3 步:设置范围并发布 1. 设置工作伙伴的名称、说明和 **可用范围**。 2. 首次仅选择测试成员或测试部门,检查后发布。 > **注意** > > 可用范围过大会让仍在调试的 Agent 直接出现在企业员工的工作伙伴列表中。首次发布只选择测试成员;验证通过后,再按企业发布流程扩大范围。 ### 第 4 步:让企业员工使用 1. 使用测试成员账号进入 **连接器·技能·伙伴** > **工作伙伴** > **企业提供**,添加并打开目标工作伙伴;也可以在 **新工作任务** 中 `@` 该伙伴。 2. 发送测试任务,检查回复、任务状态和产物。 3. 使用范围外账号确认该工作伙伴不可见。 ### 第 5 步:按需在飞书中使用 1. 在工作伙伴详情中选择 **飞书对话**,按指引完成添加或授权。 2. 使用测试成员账号发起任务,并确认范围外成员无法使用。 > **警告** > > 只在豆包工作的方舟账号连接窗口中填写 API Key。不要把 API Key 填进 Agent 的系统提示词、环境变量说明、工作伙伴介绍或对话消息;这些内容可能进入运行上下文或被其他人看到。 ## 验证结果 完成所选路径的检查,并满足公共检查项,说明基础接入链路已经跑通: - 员工自行添加:可以在 **我的伙伴** 中找到目标 Agent。 - 管理员统一分发:管理员可以在后台找到目标 Agent,测试成员可以在 **企业提供** 中添加它,范围外成员看不到它。 - 公共检查:发送任务后可以看到回复和任务状态变化,任务执行过程中没有鉴权或工具调用错误;Agent 生成文件时,豆包工作可以展示并打开对应产物。 ## 常见问题 | 现象 | 优先检查 | 处理方法 | |-|-|-| | 连接方舟账号失败 | API Key 是否完整、是否已禁用 | 在方舟控制台检查 Key 状态;Key 已泄漏或失效时,创建新 Key 后重新连接 | | Agent 列表为空 | API Key 所属项目是否正确 | 切换到目标 Agent 所在项目,创建该项目的专用 API Key | | 列表中没有目标 Agent | Agent 是否位于同一项目、是否能在方舟中正常运行 | 回到方舟核对 Agent ID,并完成一次控制台测试 | | 看不到 **接入火山方舟 Agent** | 是否使用豆包企业版,以及所在企业是否已开通该功能 | 联系企业管理员检查企业功能配置 | | 提示 Agent 已被添加 | 该 Agent 是否已由其他成员注册 | 如果页面提示该 Agent 已被添加,不要重复注册;按页面提示联系现有添加人申请使用权限 | | 新增其他 Agent 时仍要求输入 API Key | 是否误认为页面会自动填充上次使用的 Key | 这是预期行为;每次新增接入都需重新输入 API Key | | 员工自行添加后找不到 Agent | 当前登录账号是否为执行添加操作的账号 | 切换到正确账号,再打开 **我的伙伴** | | 企业员工看不到工作伙伴 | 是否已发布、当前账号是否在可用范围内 | 修正可用范围,并确认员工从 **企业提供** 添加伙伴 | | 可以发起任务但执行失败 | Agent 自身配置、工具或外部依赖是否可用 | 使用相同输入在方舟中复现;先修复 Agent,再重新验证豆包工作链路 | | 第三方工具要求登录 | Agent 使用的第三方服务是否需要当前使用者登录或授权 | 按页面指引完成第三方服务的登录或授权;验证基础接入链路时,先使用不需要额外授权的任务 | ## 进阶方向 - 为 Agent 增加技能,固化企业任务的步骤与输出要求,详情参见 [技能](/docs/skills)。 - 为 Agent 配置 MCP,接入企业外部系统,详情参见 [MCP](/docs/mcp)。 - 使用 Vaults 为不同人员注入各自的第三方凭据,详情参见 [使用 Vaults 认证](/docs/use-vaults-authentication)。 - 了解 Session 和事件流,排查任务运行过程,详情参见 [Session 事件流](/docs/session-event-stream)。 --- # [基础] 使用 Seedance Managed Agent 生成图片和视频 Source: https://ark.volcengine.com/region:cn-beijing/docs/visual-creation-agent 本教程演示如何使用火山方舟 Managed Agents 的 **Seedance Managed Agent**,完成从创意描述到图片、视频产物的完整流程。Seedance Managed Agent 支持图片与视频的生成、检索和合成。 您将创建 Agent、Environment 和 Session,通过 Session 事件流观察生成过程,再通过 Files API 下载最终产物。 ## 场景说明 制作营销素材时,常见流程包含素材检索、主视觉生成、视频生成和产物存储。直接串联图片与视频生成 API 时,业务系统还需要自行处理提示词拆解、任务轮询、文件转存和失败重试。 本教程以城市精品咖啡新品宣传为例。您只需描述素材用途、主体、风格、画幅和时长,Seedance Managed Agent 会先生成一张 16:9 主视觉,再以该图片为首帧生成 4 秒视频。执行期间,您可以通过 Session SSE 观察工具调用和任务状态;任务完成后,通过 Files API 下载 JPEG 图片和 MP4 视频。 ## 您将完成什么 - 创建一个用于生成图片和视频的 Seedance Managed Agent。 - 显式配置基础工具集、多模态工具集及图片和视频生成模型。 - 通过一段自然语言任务,获得一张 16:9 主视觉和一段 4 秒宣传视频。 - 通过 Session SSE 观察执行过程,并通过 Files API 下载最终产物。 - 按依赖顺序清理本教程创建的资源。 ## 核心概念 - **Agent**:可版本化的智能体配置,定义模型、系统提示词和工具集。 - **Seedance Managed Agent**:面向图片和视频创作的 Agent,使用 `ultra_vision_agent_preview` 标识。 - **基础工具集**:`agent_toolset_20260916`,提供文件读写和代码执行等通用能力。 - **多模态工具集**:`agent_toolset_multimodal_20260825`,提供图片生成、视频生成、视觉搜索、通用搜索、视频合成和任务进度管理能力。 - **Environment**:Agent 执行任务时使用的云端沙箱配置。 - **Session**:绑定 Agent 与 Environment 的一次运行实例,负责保存事件和产物。 - **Files API**:按 Session ID 查询已注册产物,并获取文件名和下载地址。 ## 前置条件 - 已开通火山方舟 Managed Agents。 - 已开通 Seedance Managed Agent 使用权限。 - 已从控制台的 Seedance Managed Agent 创建页面展示的可选模型中选择 Agent 主模型,并开通该模型服务。 - 已开通图片生成和视频生成所需的模型服务。 - 已开通视觉搜索等任务需要的工具服务。 - 已创建 API Key,详情请参见 [API Key 管理](/docs/manage-api-keys)。 - 本地已安装 `curl` 和 `jq`。 配置以下环境变量: ```Bash export ARK_API_KEY="" export ARK_BASE_URL="https://ark.cn-beijing.volces.com/api/v3" export AGENT_MODEL_ID="doubao-seed-2-1-lite-260915" export IMAGE_MODEL_ID="doubao-seedream-5-0-pro-260628" export VIDEO_MODEL_ID="doubao-seedance-2-5-260628" ``` > **说明** > > 上方三个模型 ID 用作本教程示例。也可以填写对应的推理接入点 ID。可用模型以控制台的 Seedance Managed Agent 创建页面为准;如果页面未展示其中某个模型,请将对应环境变量替换为页面提供的可选模型 ID。 > > 不同图片生成模型支持的输出格式可能不同。本教程统一输出 JPEG 图片;替换为支持 PNG 格式的模型后,可以将任务中的图片文件扩展名改为 `.png`。 > **注意** > > API Key 会授权模型调用和 Agent 资源操作。仅在服务端环境中使用,不要写入前端代码、日志或截图。 ## 使用 API 生成图片和视频 ### 配置约束 创建 Seedance Managed Agent 前,按下表检查配置: | 配置项 | 字段或工具 | 要求 | | --- | --- | --- | | Agent 类型 | `base_agent` | 设置为 `ultra_vision_agent_preview`,用于创建 Seedance Managed Agent。创建后不能修改该字段;已创建的通用 Agent 不能直接变更为 Seedance Managed Agent。 | | 主模型 | `model.id` | 必须填写。请从控制台的 Seedance Managed Agent 创建页面展示的模型中选择。 | | 推理强度 | `model.reasoning_effort` | 固定为 `high`。省略时服务端自动补齐为 `high`;填写其他值时返回 400 `InvalidParameter`。 | | 图片生成模型 | `image_generate.models[].id` | 必须填写模型 ID 或推理接入点 ID。每个工具最多配置 10 项;配置多项时,必须且只能将一项设置为默认模型。 | | 视频生成模型 | `video_generate.models[].id` | 启用 `video_generate` 时必须填写模型 ID 或推理接入点 ID。每个工具最多配置 10 项;配置多项时,必须且只能将一项设置为默认模型。 | | 基础工具集 | `agent_toolset_20260916` | 必须配置该工具集。 | | 多模态工具集 | `agent_toolset_multimodal_20260825` | 必须配置该工具集。 | | 必选工具 | `image_generate`、`visual_search`、`general_search`、`compose_video` | 必须启用全部工具。 | | 可选工具 | `video_generate`、`todo_write` | 按需启用。本教程显式启用视频生成和任务进度管理,并为 `video_generate` 绑定视频生成模型。 | | 搜索工具 | `general_search`、`web_search` | 启用 `general_search` 时,必须关闭基础工具集中的 `web_search`。 | | 系统提示词 | `system` | 用于定义 Seedance Managed Agent 在视觉创作任务中的角色、工作方式和输出要求。 | ### 第 1 步:创建 Seedance Managed Agent 创建 Agent 时,将 `base_agent` 设置为 `ultra_vision_agent_preview`。同时配置基础工具集、多模态工具集,以及图片和视频生成模型。 ```Bash #!/usr/bin/env bash set -euo pipefail : "${ARK_API_KEY:?Set ARK_API_KEY before running this script}" : "${AGENT_MODEL_ID:?Set AGENT_MODEL_ID to a model shown for Visual Creation Agent in the console}" : "${IMAGE_MODEL_ID:?Set IMAGE_MODEL_ID to an image model shown for Visual Creation Agent in the console}" : "${VIDEO_MODEL_ID:?Set VIDEO_MODEL_ID to a video model shown for Visual Creation Agent in the console}" ARK_BASE_URL="${ARK_BASE_URL:-https://ark.cn-beijing.volces.com/api/v3}" RUN_SUFFIX="${RUN_SUFFIX:-$(date +%Y%m%d%H%M%S)}" SYSTEM_PROMPT='You are Seed Creation Agent, an interactive creation agent with a sandbox environment. You help users turn ideas, requirements, and source materials into finished creative deliverables. Supported work includes, but is not limited to, images, videos, audio, scripts, copywriting, storyboards, prompts, presentations, documents, structured content, creative plans, and multi-file projects. Use the instructions below and the available tools to assist the user.' request_json() { local method="$1" local url="$2" shift 2 local response_file local status response_file=$(mktemp) if status=$( curl -sS -o "$response_file" -w "%{http_code}" \ -X "$method" "$url" \ -H "Authorization: Bearer $ARK_API_KEY" \ "$@" ); then if [[ "$status" == 2[0-9][0-9] ]]; then cat "$response_file" rm -f "$response_file" return 0 fi printf 'HTTP %s from %s\n' "$status" "$url" >&2 else printf 'Request failed before receiving an HTTP response from %s.\n' \ "$url" >&2 fi if [[ -s "$response_file" ]]; then cat "$response_file" >&2 printf '\n' >&2 fi rm -f "$response_file" return 1 } agent_payload=$(jq -n \ --arg name "visual-creation-agent-$RUN_SUFFIX" \ --arg agent_model "$AGENT_MODEL_ID" \ --arg image_model "$IMAGE_MODEL_ID" \ --arg video_model "$VIDEO_MODEL_ID" \ --arg system_prompt "$SYSTEM_PROMPT" \ '{ name: $name, description: "Generate campaign images and videos in one Session.", # The visual enhancement Agent requires high reasoning effort. model: { id: $agent_model, reasoning_effort: "high" }, # Select the visual enhancement Agent type. base_agent: "ultra_vision_agent_preview", system: $system_prompt, tools: [ # Mount the base tools, but disable web_search because general_search is enabled below. { type: "agent_toolset_20260916", default_config: { enabled: true }, configs: [ {name: "web_search", enabled: false} ] }, # Disable multimodal defaults and explicitly enable the tools used by this tutorial. { type: "agent_toolset_multimodal_20260825", default_config: { enabled: false }, configs: [ { name: "image_generate", enabled: true, # A single configured model is also the default image model. models: [ {id: $image_model, default: true} ] }, { name: "video_generate", enabled: true, # A single configured model is also the default video model. models: [ {id: $video_model, default: true} ] }, {name: "visual_search", enabled: true}, {name: "general_search", enabled: true}, {name: "compose_video", enabled: true}, {name: "todo_write", enabled: true} ] } ] }') agent=$( request_json POST "$ARK_BASE_URL/agents" \ -H "Content-Type: application/json" \ -d "$agent_payload" ) AGENT_ID=$(jq -er '.id' <<<"$agent") echo "Agent ID: $AGENT_ID" ``` 期望输出: ```Text Agent ID: agent-20260924120000-xxxxx ``` 记录 `AGENT_ID`,创建 Session 时需要使用该值。 > **注意** > > 配置不支持 Seedance Managed Agent 所需工具的图片或视频模型、缺少任一必选工具、同时启用 `web_search` 与 `general_search`,或为 `reasoning_effort` 填写 `high` 之外的值时,服务端返回 400 `InvalidParameter`。未开通 Seedance Managed Agent 使用权限时,服务端返回 403 `OperationDenied`。 > > 示例会将 HTTP 状态码和服务端返回的完整 JSON 写入标准错误。根据 `error.message` 修正模型或工具配置后再重试。 ### 第 2 步:创建 Environment 创建一个云端 Environment,作为视觉创作任务的运行环境。 ```Bash #!/usr/bin/env bash set -euo pipefail : "${ARK_API_KEY:?Set ARK_API_KEY before running this script}" ARK_BASE_URL="${ARK_BASE_URL:-https://ark.cn-beijing.volces.com/api/v3}" RUN_SUFFIX="${RUN_SUFFIX:-$(date +%Y%m%d%H%M%S)}" request_json() { local method="$1" local url="$2" shift 2 local response_file local status response_file=$(mktemp) if status=$( curl -sS -o "$response_file" -w "%{http_code}" \ -X "$method" "$url" \ -H "Authorization: Bearer $ARK_API_KEY" \ "$@" ); then if [[ "$status" == 2[0-9][0-9] ]]; then cat "$response_file" rm -f "$response_file" return 0 fi printf 'HTTP %s from %s\n' "$status" "$url" >&2 else printf 'Request failed before receiving an HTTP response from %s.\n' \ "$url" >&2 fi if [[ -s "$response_file" ]]; then cat "$response_file" >&2 printf '\n' >&2 fi rm -f "$response_file" return 1 } environment_payload=$(jq -n \ --arg name "visual-creation-env-$RUN_SUFFIX" \ '{ name: $name, description: "Cloud environment for visual creation tasks.", config: { type: "cloud", networking: {type: "unrestricted"} } }') environment=$( request_json POST "$ARK_BASE_URL/environments" \ -H "Content-Type: application/json" \ -d "$environment_payload" ) ENVIRONMENT_ID=$(jq -er '.id' <<<"$environment") echo "Environment ID: $ENVIRONMENT_ID" ``` 期望输出: ```Text Environment ID: env-20260924120100-xxxxx ``` 记录 `ENVIRONMENT_ID`,下一步创建 Session 时需要使用该值。 > **说明** > > 本示例未配置 `config.tos`,产物使用方舟公共 TOS。需要长期保存产物时,为 Environment 配置自己的 TOS Bucket,详情请参见 [配置产物存储](/docs/configure-cloud-environment#configure-output-storage)。 > **注意** > > 示例使用 `networking.type=unrestricted`,便于完成教程。生产环境应按任务所需的外部地址收敛网络策略。 ### 第 3 步:创建 Session 创建 Session,将 Seedance Managed Agent 与 Environment 绑定。创建成功后,Session 处于 `idle`,不会自动开始任务。 ```Bash #!/usr/bin/env bash set -euo pipefail : "${ARK_API_KEY:?Set ARK_API_KEY before running this script}" : "${AGENT_ID:?Set AGENT_ID to the Visual Creation Agent ID}" : "${ENVIRONMENT_ID:?Set ENVIRONMENT_ID to the cloud environment ID}" ARK_BASE_URL="${ARK_BASE_URL:-https://ark.cn-beijing.volces.com/api/v3}" request_json() { local method="$1" local url="$2" shift 2 local response_file local status response_file=$(mktemp) if status=$( curl -sS -o "$response_file" -w "%{http_code}" \ -X "$method" "$url" \ -H "Authorization: Bearer $ARK_API_KEY" \ "$@" ); then if [[ "$status" == 2[0-9][0-9] ]]; then cat "$response_file" rm -f "$response_file" return 0 fi printf 'HTTP %s from %s\n' "$status" "$url" >&2 else printf 'Request failed before receiving an HTTP response from %s.\n' \ "$url" >&2 fi if [[ -s "$response_file" ]]; then cat "$response_file" >&2 printf '\n' >&2 fi rm -f "$response_file" return 1 } session_payload=$(jq -n \ --arg agent "$AGENT_ID" \ --arg environment "$ENVIRONMENT_ID" \ '{ agent: $agent, environment_id: $environment, title: "Coffee campaign visual creation" }') session=$( request_json POST "$ARK_BASE_URL/sessions" \ -H "Content-Type: application/json" \ -d "$session_payload" ) SESSION_ID=$(jq -er '.id' <<<"$session") echo "Session ID: $SESSION_ID" ``` 期望输出: ```Text Session ID: sesn-20260924120200-xxxxx ``` 记录 `SESSION_ID`,发送任务、监听事件和查询产物时都需要使用该值。 ### 第 4 步:发送创作任务并监听事件 先打开 SSE 事件流,再发送 `user.message`。这样可以从任务开始时连续观察 Agent 消息、工具调用和状态变化。 本示例让 Agent 先生成一张 16:9 的咖啡品牌主视觉,再以该图片为首帧生成 4 秒宣传视频。 ```Bash #!/usr/bin/env bash set -euo pipefail : "${ARK_API_KEY:?Set ARK_API_KEY before running this script}" : "${SESSION_ID:?Set SESSION_ID to the visual creation Session ID}" ARK_BASE_URL="${ARK_BASE_URL:-https://ark.cn-beijing.volces.com/api/v3}" request_json() { local method="$1" local url="$2" shift 2 local response_file local status response_file=$(mktemp) if status=$( curl -sS -o "$response_file" -w "%{http_code}" \ -X "$method" "$url" \ -H "Authorization: Bearer $ARK_API_KEY" \ "$@" ); then if [[ "$status" == 2[0-9][0-9] ]]; then cat "$response_file" rm -f "$response_file" return 0 fi printf 'HTTP %s from %s\n' "$status" "$url" >&2 else printf 'Request failed before receiving an HTTP response from %s.\n' \ "$url" >&2 fi if [[ -s "$response_file" ]]; then cat "$response_file" >&2 printf '\n' >&2 fi rm -f "$response_file" return 1 } stream_events() { local seen_running=0 local stream_error_file local stream_result="ended" stream_error_file=$(mktemp) while IFS= read -r line; do [[ "$line" == data:* ]] || continue json="${line#data: }" event_type=$(jq -r '.type // empty' <<<"$json" 2>/dev/null || true) case "$event_type" in session.status_running) seen_running=1 echo "[Session] running" ;; agent.tool_use) printf '[Tool] %s\n' "$(jq -r '.name // "unknown"' <<<"$json")" ;; agent.tool_result) jq -c '{type, tool_use_id, is_error}' <<<"$json" ;; agent.message) jq -r '.content[]? | select(.type == "text") | .text' <<<"$json" ;; session.error) jq . <<<"$json" >&2 stream_result="error" break ;; session.status_idle) if [[ "$seen_running" -eq 1 ]]; then echo "[Session] idle" stream_result="idle" break fi ;; esac done < <( curl -sS -N --fail-with-body --max-time 1800 \ "$ARK_BASE_URL/sessions/$SESSION_ID/events/stream" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Accept: text/event-stream" \ 2>"$stream_error_file" ) if [[ "$stream_result" == "idle" ]]; then rm -f "$stream_error_file" return 0 fi if [[ "$stream_result" == "error" ]]; then rm -f "$stream_error_file" return 1 fi if [[ -s "$stream_error_file" ]]; then cat "$stream_error_file" >&2 fi rm -f "$stream_error_file" echo "SSE stream ended before the Session returned to idle." >&2 return 1 } stream_events & STREAM_PID=$! trap 'kill "$STREAM_PID" 2>/dev/null || true' EXIT sleep 2 task_payload=$(cat <<'EOF' { "events": [ { "type": "user.message", "content": [ { "type": "text", "text": "为一家城市精品咖啡品牌制作一组新品宣传素材。先生成一张 16:9 的电影感主视觉:清晨城市街角,手冲咖啡放在窗边木桌上,暖色自然光,画面中不要出现文字,并保存为 /mnt/session/outputs/campaign-key-visual.jpg。再以这张图为首帧,生成一段 4 秒、16:9 的宣传视频,镜头缓慢推进,咖啡蒸汽自然上升,并保存为 /mnt/session/outputs/campaign-teaser.mp4。完成后总结两个文件的名称和生成结果。" } ] } ] } EOF ) request_json POST \ "$ARK_BASE_URL/sessions/$SESSION_ID/events" \ -H "Content-Type: application/json" \ -d "$task_payload" >/dev/null wait "$STREAM_PID" trap - EXIT ``` 任务执行期间,终端会持续输出事件。期望看到的关键轨迹如下: ```Text [Session] running [Tool] GenImage {"type":"agent.tool_result","tool_use_id":"...","is_error":false} [Tool] GenVideo {"type":"agent.tool_result","tool_use_id":"...","is_error":false} [Session] idle ``` 根据任务内容,事件流中还可能穿插 `GeneralSearch`、`VisualSearch`、`ViewMedia`、`TodoWrite` 或 `record_search_quality` 等工具调用。工具调用的顺序和次数不固定。 `session.status_idle` 表示当前轮次结束。不要以单条 `agent.message` 或连接短暂中断判断任务完成。 > **注意** > > 视频生成通常需要数分钟。示例为 SSE 连接设置了 30 分钟超时,并在收到 `session.status_idle` 后主动结束监听。收到 `session.error` 时,应读取事件中的错误信息,不要直接重复提交任务,以免产生重复生成费用。如果事件流在 `idle` 前异常结束,示例会输出 curl 错误并返回非零状态。 ### 第 5 步:查询并下载产物 Agent 将交付物写入 `/mnt/session/outputs/`。文件注册存在短暂延迟,因此示例会轮询 Files API,直到同时查询到图片和视频。 ```Bash #!/usr/bin/env bash set -euo pipefail : "${ARK_API_KEY:?Set ARK_API_KEY before running this script}" : "${SESSION_ID:?Set SESSION_ID to the visual creation Session ID}" ARK_BASE_URL="${ARK_BASE_URL:-https://ark.cn-beijing.volces.com/api/v3}" OUTPUT_DIR="${OUTPUT_DIR:-./visual-creation-agent-output}" files='{"data":[]}' image_count=0 video_count=0 request_json() { local method="$1" local url="$2" shift 2 local response_file local status response_file=$(mktemp) if status=$( curl -sS -o "$response_file" -w "%{http_code}" \ -X "$method" "$url" \ -H "Authorization: Bearer $ARK_API_KEY" \ "$@" ); then if [[ "$status" == 2[0-9][0-9] ]]; then cat "$response_file" rm -f "$response_file" return 0 fi printf 'HTTP %s from %s\n' "$status" "$url" >&2 else printf 'Request failed before receiving an HTTP response from %s.\n' \ "$url" >&2 fi if [[ -s "$response_file" ]]; then cat "$response_file" >&2 printf '\n' >&2 fi rm -f "$response_file" return 1 } # Output registration is asynchronous, so wait for one image and one video. for _ in $(seq 1 60); do files=$( request_json GET "$ARK_BASE_URL/files?scope_id=$SESSION_ID" ) image_count=$(jq '[.data[]? | select((.mime_type // "") | startswith("image/"))] | length' <<<"$files") video_count=$(jq '[.data[]? | select((.mime_type // "") | startswith("video/"))] | length' <<<"$files") if [[ "$image_count" -ge 1 && "$video_count" -ge 1 ]]; then break fi sleep 2 done if [[ "$image_count" -lt 1 || "$video_count" -lt 1 ]]; then echo "Expected image and video outputs were not registered in time." >&2 jq . <<<"$files" >&2 exit 1 fi echo "Output files:" jq -r ' .data[] | select((.mime_type // "") | test("^(image|video)/")) | [.id, .filename, .mime_type] | @tsv ' <<<"$files" mkdir -p "$OUTPUT_DIR" jq -r ' .data[] | select((.mime_type // "") | test("^(image|video)/")) | select(.download_url != null and .download_url != "") | [.filename, .download_url] | @tsv ' <<<"$files" | while IFS=$'\t' read -r filename download_url; do safe_name=$(basename "$filename") curl -sS --fail-with-body "$download_url" -o "$OUTPUT_DIR/$safe_name" echo "Downloaded: $OUTPUT_DIR/$safe_name" done ``` 期望输出: ```Text Output files: file-20260924121000-xxxxx campaign-key-visual.jpg image/jpeg file-20260924121500-yyyyy campaign-teaser.mp4 video/mp4 Downloaded: ./visual-creation-agent-output/campaign-key-visual.jpg Downloaded: ./visual-creation-agent-output/campaign-teaser.mp4 ``` 脚本会读取 Files API 返回的 `download_url` 并直接下载文件,因此终端输出不会打印该字段。`download_url` 是服务端签发的临时下载地址,应在获得后及时使用,不要将其作为长期静态链接保存。 ### 第 6 步:验证生成结果 按下表检查本次运行是否成功: | 检查项 | 通过标准 | | --- | --- | | Agent 创建 | 返回 `agent-` 开头的 `AGENT_ID` | | Environment 创建 | 返回 `env-` 开头的 `ENVIRONMENT_ID` | | Session 创建 | 返回 `sesn-` 开头的 `SESSION_ID`,初始状态为 `idle` | | 任务执行 | 事件流先出现 `session.status_running`,最终出现 `session.status_idle` | | 工具结果 | 图片和视频相关的 `agent.tool_result.is_error` 均为 `false` | | 产物注册 | Files API 至少返回一个 `image/*` 文件和一个 `video/*` 文件 | | 本地文件 | `visual-creation-agent-output` 目录中存在可打开的图片和可播放的视频 | 如果事件流显示生成成功,但 Files API 尚未返回文件,继续等待注册完成。不要仅根据 Agent 的文本回复判断产物已经可下载。 ### 运行完整脚本 以下脚本仅用于演示 Agent、Environment、Session、事件流和 Files API 的完整调用流程。 `CLEANUP_RESOURCES` 默认值为 `0`,因此脚本成功执行后会保留本次创建的 Agent、Environment 和 Session,便于检查运行结果或继续复用这些资源。如需在下载产物后自动清理资源,在运行脚本前执行 `export CLEANUP_RESOURCES=1`。无论是否设置该变量,脚本执行失败时都会自动清理本次已创建的资源。 ```Bash #!/usr/bin/env bash set -euo pipefail : "${ARK_API_KEY:?Set ARK_API_KEY before running this script}" : "${AGENT_MODEL_ID:?Set AGENT_MODEL_ID to a model shown for Visual Creation Agent in the console}" : "${IMAGE_MODEL_ID:?Set IMAGE_MODEL_ID to an image model shown for Visual Creation Agent in the console}" : "${VIDEO_MODEL_ID:?Set VIDEO_MODEL_ID to a video model shown for Visual Creation Agent in the console}" ARK_BASE_URL="${ARK_BASE_URL:-https://ark.cn-beijing.volces.com/api/v3}" OUTPUT_DIR="${OUTPUT_DIR:-./visual-creation-agent-output}" RUN_SUFFIX="${RUN_SUFFIX:-$(date +%Y%m%d%H%M%S)}" SYSTEM_PROMPT='You are Seed Creation Agent, an interactive creation agent with a sandbox environment. You help users turn ideas, requirements, and source materials into finished creative deliverables. Supported work includes, but is not limited to, images, videos, audio, scripts, copywriting, storyboards, prompts, presentations, documents, structured content, creative plans, and multi-file projects. Use the instructions below and the available tools to assist the user.' AGENT_ID="" ENVIRONMENT_ID="" SESSION_ID="" STREAM_PID="" request_json() { local method="$1" local url="$2" shift 2 local response_file local status response_file=$(mktemp) if status=$( curl -sS -o "$response_file" -w "%{http_code}" \ -X "$method" "$url" \ -H "Authorization: Bearer $ARK_API_KEY" \ "$@" ); then if [[ "$status" == 2[0-9][0-9] ]]; then cat "$response_file" rm -f "$response_file" return 0 fi printf 'HTTP %s from %s\n' "$status" "$url" >&2 else printf 'Request failed before receiving an HTTP response from %s.\n' \ "$url" >&2 fi if [[ -s "$response_file" ]]; then cat "$response_file" >&2 printf '\n' >&2 fi rm -f "$response_file" return 1 } stop_stream() { if [[ -n "$STREAM_PID" ]]; then kill "$STREAM_PID" 2>/dev/null || true fi } cleanup_resources() { local cleanup_status=0 if [[ -n "$SESSION_ID" ]]; then if ! request_json DELETE "$ARK_BASE_URL/sessions/$SESSION_ID" >/dev/null; then cleanup_status=1 fi fi if [[ -n "$AGENT_ID" ]]; then if ! request_json DELETE "$ARK_BASE_URL/agents/$AGENT_ID" >/dev/null; then cleanup_status=1 fi fi if [[ -n "$ENVIRONMENT_ID" ]]; then if ! request_json DELETE "$ARK_BASE_URL/environments/$ENVIRONMENT_ID" >/dev/null; then cleanup_status=1 fi fi return "$cleanup_status" } on_exit() { local exit_code=$? trap - EXIT stop_stream if [[ "$exit_code" -ne 0 ]]; then if [[ -n "$SESSION_ID" || -n "$AGENT_ID" || -n "$ENVIRONMENT_ID" ]]; then echo "Run failed; cleaning up resources created by this script." >&2 cleanup_resources || true fi elif [[ "${CLEANUP_RESOURCES:-0}" == "1" ]]; then if ! cleanup_resources; then exit_code=1 fi fi exit "$exit_code" } trap on_exit EXIT # Create the preset Visual Creation Agent. agent_payload=$(jq -n \ --arg name "visual-creation-agent-$RUN_SUFFIX" \ --arg agent_model "$AGENT_MODEL_ID" \ --arg image_model "$IMAGE_MODEL_ID" \ --arg video_model "$VIDEO_MODEL_ID" \ --arg system_prompt "$SYSTEM_PROMPT" \ '{ name: $name, description: "Generate campaign images and videos in one Session.", # The visual enhancement Agent requires high reasoning effort. model: { id: $agent_model, reasoning_effort: "high" }, # Select the visual enhancement Agent type. base_agent: "ultra_vision_agent_preview", system: $system_prompt, tools: [ # Mount the base tools, but disable web_search because general_search is enabled below. { type: "agent_toolset_20260916", default_config: { enabled: true }, configs: [ {name: "web_search", enabled: false} ] }, # Disable multimodal defaults and explicitly enable the tools used by this tutorial. { type: "agent_toolset_multimodal_20260825", default_config: { enabled: false }, configs: [ { name: "image_generate", enabled: true, # A single configured model is also the default image model. models: [ {id: $image_model, default: true} ] }, { name: "video_generate", enabled: true, # A single configured model is also the default video model. models: [ {id: $video_model, default: true} ] }, {name: "visual_search", enabled: true}, {name: "general_search", enabled: true}, {name: "compose_video", enabled: true}, {name: "todo_write", enabled: true} ] } ] }') agent=$( request_json POST "$ARK_BASE_URL/agents" \ -H "Content-Type: application/json" \ -d "$agent_payload" ) AGENT_ID=$(jq -er '.id' <<<"$agent") echo "Agent ID: $AGENT_ID" # Create a reusable cloud environment. environment_payload=$(jq -n \ --arg name "visual-creation-env-$RUN_SUFFIX" \ '{ name: $name, description: "Cloud environment for visual creation tasks.", config: { type: "cloud", networking: {type: "unrestricted"} } }') environment=$( request_json POST "$ARK_BASE_URL/environments" \ -H "Content-Type: application/json" \ -d "$environment_payload" ) ENVIRONMENT_ID=$(jq -er '.id' <<<"$environment") echo "Environment ID: $ENVIRONMENT_ID" # Create a Session that binds the Agent and environment. session_payload=$(jq -n \ --arg agent "$AGENT_ID" \ --arg environment "$ENVIRONMENT_ID" \ '{ agent: $agent, environment_id: $environment, title: "Coffee campaign visual creation" }') session=$( request_json POST "$ARK_BASE_URL/sessions" \ -H "Content-Type: application/json" \ -d "$session_payload" ) SESSION_ID=$(jq -er '.id' <<<"$session") echo "Session ID: $SESSION_ID" # Open the event stream before sending the task. ( seen_running=0 stream_error_file=$(mktemp) stream_result="ended" while IFS= read -r line; do [[ "$line" == data:* ]] || continue json="${line#data: }" event_type=$(jq -r '.type // empty' <<<"$json" 2>/dev/null || true) case "$event_type" in session.status_running) seen_running=1 echo "[Session] running" ;; agent.tool_use) printf '[Tool] %s\n' "$(jq -r '.name // "unknown"' <<<"$json")" ;; agent.tool_result) jq -c '{type, tool_use_id, is_error}' <<<"$json" ;; agent.message) jq -r '.content[]? | select(.type == "text") | .text' <<<"$json" ;; session.error) jq . <<<"$json" >&2 stream_result="error" break ;; session.status_idle) if [[ "$seen_running" -eq 1 ]]; then echo "[Session] idle" stream_result="idle" break fi ;; esac done < <( curl -sS -N --fail-with-body --max-time 1800 \ "$ARK_BASE_URL/sessions/$SESSION_ID/events/stream" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Accept: text/event-stream" \ 2>"$stream_error_file" ) if [[ "$stream_result" == "idle" ]]; then rm -f "$stream_error_file" exit 0 fi if [[ "$stream_result" == "error" ]]; then rm -f "$stream_error_file" exit 1 fi if [[ -s "$stream_error_file" ]]; then cat "$stream_error_file" >&2 fi rm -f "$stream_error_file" echo "SSE stream ended before the Session returned to idle." >&2 exit 1 ) & STREAM_PID=$! sleep 2 task_payload=$(cat <<'EOF' { "events": [ { "type": "user.message", "content": [ { "type": "text", "text": "为一家城市精品咖啡品牌制作一组新品宣传素材。先生成一张 16:9 的电影感主视觉:清晨城市街角,手冲咖啡放在窗边木桌上,暖色自然光,画面中不要出现文字,并保存为 /mnt/session/outputs/campaign-key-visual.jpg。再以这张图为首帧,生成一段 4 秒、16:9 的宣传视频,镜头缓慢推进,咖啡蒸汽自然上升,并保存为 /mnt/session/outputs/campaign-teaser.mp4。完成后总结两个文件的名称和生成结果。" } ] } ] } EOF ) request_json POST \ "$ARK_BASE_URL/sessions/$SESSION_ID/events" \ -H "Content-Type: application/json" \ -d "$task_payload" >/dev/null wait "$STREAM_PID" STREAM_PID="" # Wait for output registration, then download image and video files. files='{"data":[]}' image_count=0 video_count=0 for _ in $(seq 1 60); do files=$( request_json GET "$ARK_BASE_URL/files?scope_id=$SESSION_ID" ) image_count=$(jq '[.data[]? | select((.mime_type // "") | startswith("image/"))] | length' <<<"$files") video_count=$(jq '[.data[]? | select((.mime_type // "") | startswith("video/"))] | length' <<<"$files") if [[ "$image_count" -ge 1 && "$video_count" -ge 1 ]]; then break fi sleep 2 done if [[ "$image_count" -lt 1 || "$video_count" -lt 1 ]]; then echo "Expected image and video outputs were not registered in time." >&2 jq . <<<"$files" >&2 exit 1 fi mkdir -p "$OUTPUT_DIR" jq -r ' .data[] | select((.mime_type // "") | test("^(image|video)/")) | select(.download_url != null and .download_url != "") | [.filename, .download_url] | @tsv ' <<<"$files" | while IFS=$'\t' read -r filename download_url; do safe_name=$(basename "$filename") curl -sS --fail-with-body "$download_url" -o "$OUTPUT_DIR/$safe_name" echo "Downloaded: $OUTPUT_DIR/$safe_name" done echo "Resources:" echo " AGENT_ID=$AGENT_ID" echo " ENVIRONMENT_ID=$ENVIRONMENT_ID" echo " SESSION_ID=$SESSION_ID" ``` ## 成本和性能建议 控制成本和等待时间时,优先采用以下做法: - 先生成一张候选图,确认主体、构图和风格后再生成视频。 - 视频草稿先使用较短时长和较低分辨率,确认镜头运动后再提高规格。 - 任务已有明确参考素材时,不要求 Agent 额外搜索,减少搜索工具调用。 - 在系统提示词中约束最终文件数量和文件名,避免重复生成无用候选。 - 使用 SSE 等待终态,不要通过重复发送消息催促任务。 ## 进阶方向 - **保持品牌视觉一致**:上传品牌图片并作为参考素材,详情请参见 [上传与挂载文件](/docs/upload-and-mount-files)。 - **长期保存生成产物**:为 Environment 配置自己的 TOS Bucket,详情请参见 [配置产物存储](/docs/configure-cloud-environment#configure-output-storage)。 - **控制高成本工具调用**:为图片和视频生成增加人工确认,详情请参见 [工具权限策略](/docs/tool-permission-policy)。 - **提高长任务的恢复能力**:处理 SSE 断线重连和事件去重,详情请参见 [Session 事件流](/docs/session-event-stream)。 ## 清理资源 确认图片和视频已经下载或转存后,按 Session、Agent、Environment 的顺序删除本教程创建的资源: ```Bash #!/usr/bin/env bash set -euo pipefail : "${ARK_API_KEY:?Set ARK_API_KEY before running this script}" : "${SESSION_ID:?Set SESSION_ID to the Session created by this tutorial}" : "${AGENT_ID:?Set AGENT_ID to the Agent created by this tutorial}" : "${ENVIRONMENT_ID:?Set ENVIRONMENT_ID to the Environment created by this tutorial}" ARK_BASE_URL="${ARK_BASE_URL:-https://ark.cn-beijing.volces.com/api/v3}" request_json() { local method="$1" local url="$2" shift 2 local response_file local status response_file=$(mktemp) if status=$( curl -sS -o "$response_file" -w "%{http_code}" \ -X "$method" "$url" \ -H "Authorization: Bearer $ARK_API_KEY" \ "$@" ); then if [[ "$status" == 2[0-9][0-9] ]]; then cat "$response_file" rm -f "$response_file" return 0 fi printf 'HTTP %s from %s\n' "$status" "$url" >&2 else printf 'Request failed before receiving an HTTP response from %s.\n' \ "$url" >&2 fi if [[ -s "$response_file" ]]; then cat "$response_file" >&2 printf '\n' >&2 fi rm -f "$response_file" return 1 } # Delete child resources before their dependencies. request_json DELETE "$ARK_BASE_URL/sessions/$SESSION_ID" >/dev/null request_json DELETE "$ARK_BASE_URL/agents/$AGENT_ID" >/dev/null request_json DELETE "$ARK_BASE_URL/environments/$ENVIRONMENT_ID" >/dev/null echo "Deleted Session, Agent, and Environment." ``` > **警告** > > 只删除本教程创建、且已经记录精确 ID 的资源。删除 Session 会清理方舟默认存储中的关联产物;如果 Environment 配置了自己的 TOS Bucket,删除 Session 不会删除 Bucket 中的对象。 --- # [进阶] 构建可持续迭代的 AI 研究交付工作台 Source: https://ark.volcengine.com/region:cn-beijing/docs/build-research-workbench 用一个长期 Session 承载复杂研究任务,实时观察 Agent 的工具调用和执行状态,并把每轮结果沉淀为可审阅、可继续优化的完整交付物。 # 你将构建什么 「研究工作台」接受一个研究目标和若干资料链接,由方舟 Managed Agents 在云端执行长任务。用户能够看到 Agent 正在调用什么工具、当前处理到哪一步,并在 Session 完成后直接审阅完整报告。 如果首版报告不够好,用户可以继续提出「补强证据」「增加方案对比」或「重写结论」。系统不会重新创建任务,而是继续向原 Session 发送消息,生成 V2、V3,同时保留旧版本。 最终应用具备以下能力: - 接收飞书文档、网页和业务背景; - 展示工具调用、阶段消息和 Session 状态; - 以 `session.status_idle` 判断本轮完整输出已经结束; - 在同一个 Session 中持续追加优化要求; - 保存每轮完整交付物,支持版本切换和导出; - 提供当前 Session 的方舟控制台入口; - 用户确认后再执行发布等外部写操作。 # 工作原理 ![研究工作台调用链路](https://arkdocs.tos-cn-beijing.volces.com/flowcharts/tutorials/new-202607201103.svg) | 对象 | 在项目中的职责 | |-|-| | Agent | 定义模型、系统指令、工具和 Skills | | Environment | Agent 的云端运行环境,决定网络和执行能力 | | Session | 一项业务任务的连续工作空间,初次请求和后续优化复用同一个 Session | | Event | Session 中的用户输入、工具调用、Agent 消息和状态变化 | | Skill | 可复用的工作方法,例如研究规划、证据核验和交付审查 | | Report Version | 每个用户轮次结束后保存的一份完整交付物 | 一次完整运行遵循以下顺序: 1. 应用创建 Session; 2. 应用打开 Session Events SSE 流,并等待 `: ready`; 3. 向 Session 发送 `user.message`; 4. Agent 规划任务、调用工具并产生 Events; 5. 应用展示 `agent.tool_use` 和阶段消息; 6. Session 进入 `idle`; 7. 应用提取最后的完整交付物并生成版本; 8. 用户审阅后可以继续向原 Session 发送下一轮要求。 # 10 分钟快速开始 本章完成一件事:创建 Session、发送研究任务、观察事件,并在 Session 进入 idle 后输出最终报告。 ## 准备环境 你需要: - Node.js 20 或更高版本; - 一个可用的方舟 Managed Agents Agent; - Agent 对应的 Environment; - 可用的 ARK API Key。 安装依赖并创建本地配置: ```bash pnpm install cp .env.example .env ``` 填写 `.env`: ```dotenv ARK_BASE_URL=https://ark.cn-beijing.volces.com/api/v3 ARK_API_KEY=ark-替换为你的_API_Key ARK_AGENT_ID=替换为你的_Agent_ID ARK_ENVIRONMENT_ID=替换为你的_Environment_ID ``` > **注意** > > ARK API Key 只应由服务端读取,不要放进 `VITE_*` 变量、React 代码或浏览器请求。 ## 创建 Session、建立事件流并发送任务 下面是完整的最小示例: ```js import "dotenv/config"; const baseUrl = ( process.env.ARK_BASE_URL || "https://ark.cn-beijing.volces.com/api/v3" ).replace(/\/$/, ""); const apiKey = process.env.ARK_API_KEY; const agentId = process.env.ARK_AGENT_ID; const environmentId = process.env.ARK_ENVIRONMENT_ID; if (!apiKey || !agentId || !environmentId) { throw new Error( "请设置 ARK_API_KEY、ARK_AGENT_ID 和 ARK_ENVIRONMENT_ID", ); } async function request(path, init = {}) { const response = await fetch(`${baseUrl}${path}`, { ...init, headers: { Authorization: `Bearer ${apiKey}`, "Content-Type": "application/json", ...init.headers, }, }); if (!response.ok) { throw new Error( `${init.method || "GET"} ${path} 失败:${await response.text()}`, ); } return response; } async function createSession() { const response = await request("/sessions", { method: "POST", body: JSON.stringify({ agent: { id: agentId }, environment_id: environmentId, }), }); const session = await response.json(); return session.id ?? session.session_id; } async function sendMessage(sessionId, text) { await request(`/sessions/${sessionId}/events`, { method: "POST", body: JSON.stringify({ events: [{ type: "user.message", content: [{ type: "text", text }], }], }), }); } function textFromEvent(event) { return event.content ?.filter((item) => item.type === "text" && item.text) .map((item) => item.text) .join("\n") || ""; } async function runTurn(sessionId, text) { const response = await request( `/sessions/${sessionId}/events/stream`, { headers: { Accept: "text/event-stream" } }, ); const reader = response.body.getReader(); const decoder = new TextDecoder(); let buffer = ""; let finalMessage = ""; let messageSent = false; try { while (true) { const { done, value } = await reader.read(); buffer += decoder.decode(value, { stream: !done }); const lines = buffer.split(/\r?\n/); buffer = lines.pop() || ""; for (const line of lines) { if (!messageSent && line === ": ready") { await sendMessage(sessionId, text); messageSent = true; continue; } if (!line.startsWith("data:")) continue; const payload = line.slice(5).trim(); if (!payload) continue; let event; try { event = JSON.parse(payload); } catch { continue; } if (event.type === "agent.tool_use") { console.log(`工具调用:${event.name || "unknown"}`); } if (event.type === "agent.message") { finalMessage = textFromEvent(event) || finalMessage; } if (event.type === "session.status_idle") { return finalMessage; } if (event.type === "session.status_terminated") { throw new Error("Session 已终止"); } } if (done) { const reason = messageSent ? "没有收到 session.status_idle" : "没有收到 : ready"; throw new Error(`事件流已经结束,但${reason}`); } } } finally { await reader.cancel().catch(() => {}); } } const sessionId = await createSession(); console.log(`Session:${sessionId}`); const report = await runTurn( sessionId, `研究方舟 Managed Agents 的 Session 与 Events 机制, 形成一份包含关键发现、证据、接入建议、风险和下一步的 Markdown 报告。`, ); console.log(report); ``` 运行: ```bash node run-session.mjs ``` 预期看到: ```text Session:sesn-... 工具调用:web_search 工具调用:read 工具调用:write # 方舟 Managed Agents 接入研究 ... ``` `agent.message` 只是交付物候选。Agent 可能先返回阶段消息,再继续调用工具;只有收到 `session.status_idle`,应用才把最后的完整消息视为本轮结果。 至此,快速路径已经完成。后续章节用于把最小示例升级为真实业务应用。 # 构建完整研究 Agent 一个真实研究 Agent 不能只依赖一段很长的系统提示。本项目把稳定、可复用的工作方法拆成五个 Skill: | Skill | 负责的问题 | 主要输出 | |-|-|-| | `research-planning` | 任务边界、问题树和证据要求 | 研究计划 | | `source-verification` | 来源权威性、时效性、冲突和引用支持关系 | Claim Ledger | | `product-synthesis` | 方案选项、统一标准下的取舍、MVP 和建议 | 决策建议 | | `api-doc-authoring` | 字段、约束、示例、错误、重试和幂等 | 可实现 API 文档 | | `delivery-review` | 事实、完整性、一致性、安全性和发布质量 | 发布门禁结论 | 每个 Skill 是一个独立目录,至少包含 `SKILL.md`: ```text skills/ ├── research-planning/SKILL.md ├── source-verification/SKILL.md ├── product-synthesis/SKILL.md ├── api-doc-authoring/SKILL.md └── delivery-review/SKILL.md ``` 将每个 Skill 目录分别打包: ```bash mkdir -p skill-packages for skill_dir in skills/*; do skill_name=$(basename "$skill_dir") (cd "$skill_dir" && zip -r "../../skill-packages/$skill_name.zip" .) done ``` 上传一个 Skill: ```js import { readFile } from "node:fs/promises"; const form = new FormData(); form.append( "files", new Blob([await readFile("skill-packages/research-planning.zip")], { type: "application/zip", }), "research-planning.zip", ); const response = await fetch(`${ARK_BASE_URL}/skills`, { method: "POST", headers: { Authorization: `Bearer ${ARK_API_KEY}` }, body: form, }); const skill = await response.json(); ``` 记录返回的 `id` 和 `latest_version`。创建或更新 Agent 时提交完整的 Skills 列表。 本项目的系统指令重点约束三件事: ```text 1. 先规划研究问题和证据标准,再开始收集资料。 2. 只能把有来源支持的内容写成事实;推断和待确认项必须明确标注。 3. 最终返回一份完整 Markdown;发布、发送、删除或修改外部系统前必须等待用户确认。 ``` 创建 Agent 时,将工具和 Skills 一起配置: ```js await fetch(`${ARK_BASE_URL}/agents`, { method: "POST", headers: { Authorization: `Bearer ${ARK_API_KEY}`, "Content-Type": "application/json", }, body: JSON.stringify({ name: "research-workbench-agent", description: "面向产品与研发团队的研究交付 Agent。", model: { id: "doubao-seed-2-1-pro-260628", speed: "standard", }, system: systemPrompt, tools: [{ type: "agent_toolset_20260916", default_config: { enabled: true, permission_policy: { type: "always_allow" }, }, }], skills: uploadedSkills.map((skill) => ({ type: "custom", skill_id: skill.id, version: skill.latest_version, })), }), }); ``` 依次上传五个 Skills 后,使用各响应中的 `id` 和 `latest_version` 组装 Agent 请求。模型和工具版本可能随环境变化,应以当前方舟控制台和 API 返回为准。 # 嵌入真实 App ## 一个任务始终复用一个 Session 业务系统需要保存 `taskId → sessionId` 映射。用户继续优化时,向原 Session 发送新的 `user.message`: ```js const followUp = `请基于当前 Session 中已有研究和上一版交付物继续优化。 用户的新要求:补充三种实现方案的对比,并明确推荐方案的 MVP 边界。 要求: 1. 保留仍然成立的事实和引用。 2. 不要只返回修改建议,要返回一份可独立使用的完整 Markdown。 3. 明确标注仍缺少证据或需要用户确认的信息。`; const nextReport = await runTurn(existingSessionId, followUp); ``` `runTurn` 会先为新一轮建立 SSE,再发送消息并等待 `session.status_idle`。同一个 Session 正在运行时不要继续发送下一轮要求。前端应禁用发送按钮,服务端也应拒绝并发轮次。 ## 用 turnId 组织对话和事件 每个用户消息创建一个 `turnId`。工具调用、阶段消息、完成事件和最终报告都归属到这一轮: ```ts interface TaskMessage { id: string; turnId: string; role: "user" | "agent"; kind: "brief" | "follow-up" | "delivery" | "status"; content: string; versionId?: string; createdAt: string; } interface ReportVersion { id: string; number: number; content: string; instruction: string; createdAt: string; } ``` 本轮进入 idle 后,追加一个新版本,不要覆盖上一版: ```js const version = { id: crypto.randomUUID(), number: task.reportVersions.length + 1, content: completedReport, instruction: currentUserMessage, createdAt: new Date().toISOString(), }; task.reportVersions.push(version); task.activeReportVersionId = version.id; ``` ## 把执行过程和最终交付分开呈现 推荐的交互方式是: - 左侧按用户轮次展示协作对话; - 用户消息右对齐,Agent 最终交付左对齐; - `agent.tool_use` 和阶段消息放入「处理中」区域; - 运行时展开过程,收到 idle 后自动折叠; - 右侧独立滚动并渲染完整 Markdown; - 报告顶部提供版本选择、导出和人工确认发布; - 页面展示当前 Session ID 和方舟控制台链接。 ```js function arkSessionConsoleUrl(sessionId, region, projectName) { return `https://ark.volcengine.com/region:cn-beijing/ark/region:${encodeURIComponent(region)}` + `/managed-agents/sessions/${encodeURIComponent(sessionId)}` + `?projectName=${encodeURIComponent(projectName)}`; } ``` # 生产化改造要点 本章是进阶内容。最小示例已经跑通后,再根据部署环境逐项加入。 ## Serverless 环境使用轮询对账 本地 Node 服务可以持续消费 Event Stream。Serverless 请求不应等待整个长任务,可以使用「快速提交 + 前端轮询 + 服务端对账」: 1. 创建 Session 并发送消息后立即返回; 2. 前端定时调用任务详情接口; 3. 服务端读取 Session 当前状态和事件历史; 4. Session 仍为 `running` 时继续等待; 5. Session 为 `idle` 时提取本轮最终结果并生成版本。 ```js const [session, history] = await Promise.all([ client.getSession(task.sessionId), client.listEvents(task.sessionId), ]); if (session.status === "running") return task; const idleObserved = session.status === "idle" || hasSessionIdleForCurrentTurn(history); if (!idleObserved) { throw new Error(`Session 当前状态为 ${session.status ?? "unknown"}`); } const content = latestWrittenArtifactForCurrentTurn(history)?.content ?? latestAgentMessageForCurrentTurn(history); ``` 事件历史可能不会完整保留某个实时状态事件,因此恢复流程同时检查历史中的 `session.status_idle` 和 Session 当前 `status`。 ## 恢复文件型交付物 Agent 有时会把报告写入 `/mnt/session/outputs/report.md`,随后只回复「文件已生成」。浏览器无法直接访问这个云端路径。 优先检查 `write` 工具事件,从 `event.input.file_path` 和 `event.input.content` 提取正文。如果只有路径,就向同一 Session 发送一次补充请求: ```text 请读取刚才生成的交付文件,并把完整 Markdown 正文作为本轮最终 agent.message 返回。不要再次只返回路径、摘要、字数或完成通知。 ``` 补充请求仍然要等待新的 `session.status_idle`。 ## 为中断和重启设计恢复 应用需要保留 Session ID。浏览器关闭或服务重启后,不要重复提交任务,而应: 1. 查询 `GET /sessions/{session_id}`; 2. 读取 `GET /sessions/{session_id}/events`; 3. Session 为 running 时继续观察; 4. Session 为 idle 时恢复最后的完整交付; 5. 对已经处理过的源事件做幂等去重。 ## 保护凭证和外部写操作 - ARK API Key 只保留在服务端; - 生产环境为每个用户或租户校验任务访问权限; - 对发布、发送、删除和修改业务数据设置人工确认; - 不要把长期访问 Token 保留在页面 URL、日志或截图中; - 测试完成后归档无用 Session,并轮换演示期间使用过的凭证。 部署业务应用时,只向服务端配置调用 Managed Agents 所需的环境变量: ```text ARK_BASE_URL ARK_API_KEY ARK_AGENT_ID ARK_ENVIRONMENT_ID ``` > **注意** > > 不要把 ARK API Key 或其他第三方凭据写入前端环境变量。发布、发送等外部写操作应由服务端执行,并在调用前校验用户授权。 # 验收结果 | 场景 | 通过标准 | |-|-| | 最小调用 | 创建 Session,看到工具事件,idle 后输出完整 Markdown | | 持续优化 | 第二轮复用原 Session,生成 V2,V1 仍然可以查看 | | 中间过程 | 工具调用和阶段消息运行时可见,完成后可以折叠 | | 完成边界 | 没有 idle 时不生成最终版本;恢复时可以用 Session 当前状态对账 | | 文件型产物 | 返回 `/mnt/session/outputs/...` 时恢复正文,而不是只展示路径 | | 页面恢复 | 刷新或服务重启后,可以根据 Session ID 恢复执行状态和结果 | | 事件审计 | 每个任务页面能打开对应 Session 的方舟控制台 | | 数据安全 | 浏览器看不到 ARK API Key,外部写操作需要人工确认 | # 扩展方向 这套模式适合任何需要「长任务 + 可观察过程 + 人工审阅 + 多轮优化」的业务: - 方案投标和 RFP 响应; - 合同、政策和行业研究; - 销售洞察与客户方案; - 故障复盘和技术调研; - PRD、API 设计和上线评审; - 竞品研究与持续监控。 把「研究目标和 Skill」替换成你的业务方法,把最终确认动作接入你的系统,就可以将这个案例嵌入自己的 App 或软件。 --- # [进阶] 构建从 CSV 到交互式报告的数据分析 Agent Source: https://ark.volcengine.com/region:cn-beijing/docs/build-csv-data-analyst-agent 本教程演示如何使用方舟 Managed Agents 完成一次端到端的数据分析:上传一份 CSV 文件,由 Agent 在云沙箱中完成数据读取、清洗、统计、图表生成,并最终输出一份自包含的 HTML 分析报告。 # 场景说明 在企业的数据分析场景中,业务人员拿到 CSV 或 Excel 结构化数据后,往往只能看到原始记录,很难快速判断哪些信息值得关注。传统链路依赖分析师完成数据清洗、统计和可视化,响应周期长、重复性工作多。 这类场景适合交给 Managed Agents 处理:用户只需提供数据文件并描述分析目标,Agent 可以自动完成数据读取、清洗、代码执行、图表生成和结果总结,并输出一份结构清晰的分析报告。 | 环节 | 内容 | |-|-| | 输入 | 一个 CSV 文件,例如订单、销售、用户行为或运营数据 | | 过程 | Agent 读取文件,使用 pandas 分析数据,使用 plotly 生成交互图表 | | 输出 | 一个自包含的 `report.html`,包含摘要、关键指标、图表和行动建议 | | 观测 | 通过 Session Events SSE 查看 Agent 消息、工具调用和状态变化 | # 你将完成什么 - 创建一个用于数据分析的 Environment。 - 创建一个可复用的数据分析 Agent。 - 上传 CSV 并挂载到 Session 沙箱。 - 发送分析任务并通过事件流观察执行过程。 - 查询 Session 产出的报告文件。 # 核心概念 动手前先厘清方舟 Managed Agents 的四个基础对象。 | 概念 | 说明 | |-|-| | Agent | 一份可版本化、可复用的配置模板,封装模型、System Prompt 和工具集。创建后得到稳定的 `agent_id`,可被任意 Session 引用 | | Environment | Agent 运行所在的云沙箱定义,决定网络策略与预装依赖,一次创建,多次复用 | | Session | 一次具体的运行实例,把 Agent、Environment 和输入资源绑在一起。创建 Session 本身不会触发工作,需要主动下发消息 | | Event | Session 内的追加式事件流。客户端用 `user.message` 下发任务,再通过 SSE 实时收到 Agent 的消息、工具调用与状态变化 | # 工作流程 ![CSV 数据分析 Agent 流程](https://arkdocs.tos-cn-beijing.volces.com/flowcharts/tutorials/new-202607241201.svg) # 前置条件 - 已开通方舟 Managed Agents 和目标模型服务。 - 已创建 API Key,详情请参见 [API Key 管理](/docs/manage-api-keys)。 - 本地已安装 `curl` 和 `jq`。 - 准备一个 CSV 文件,例如 `test_csv.csv`。 将 API Key、Base URL 和常用配置配置为环境变量: ```Bash export ARK_API_KEY="你的方舟 API Key" export ARK_BASE_URL="https://ark.cn-beijing.volces.com/api/v3" export MODEL_ID="doubao-seed-2-1-pro-260628" export TOOLSET_TYPE="agent_toolset_20260916" export DATA_PATH="./test_csv.csv" ``` > **注意** > > API Key 用于访问账户下的模型与 Agent 资源,请仅在服务端使用,不要写入前端代码、日志或截图。 # 第 1 步:创建 Environment Environment 定义 Agent 的执行环境,例如网络访问权限、预装依赖和运行配置。本示例提前安装 `pandas` 和 `plotly`,Agent 执行任务时可以直接读取 CSV 文件、生成图表,无需运行时再安装依赖。Environment 创建完成后可以长期复用,后续多个 Session 都可以基于同一个 Environment 运行。 > **说明** > > 如果已经在控制台创建了包含 `pandas` 和 `plotly` 的 Environment,可以跳过本节,直接设置 `ENVIRONMENT_ID`。 ```Bash environment=$(curl -sS --fail-with-body "$ARK_BASE_URL/environments" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d @- <<'EOF' { "name": "data-analyst-env", "description": "用于 CSV 数据分析报告生成的托管沙箱环境。", "config": { "type": "cloud", "networking": {"type": "unrestricted"}, "packages": { "pip": ["pandas", "plotly"] } } } EOF ) ENVIRONMENT_ID=$(jq -er '.id' <<<"$environment") echo "Environment: $ENVIRONMENT_ID" ``` > **说明** > > 本示例未配置 `config.tos`,生成的报告使用方舟公共 TOS。需要将报告长期保存在自己的 TOS Bucket 时,在创建 Environment 时配置产物存储,详情请参见 [配置产物存储](/docs/configure-cloud-environment#configure-output-storage)。 > **注意** > > `networking.type=unrestricted` 便于教程演示。生产环境应按最小可用范围收敛网络策略,只放行必要的出站主机。 # 第 2 步:定义分析 Agent Environment 创建完成后,创建 Agent。Agent 包含模型、System Prompt 和工具等配置,是 Session 执行任务时使用的核心资源。System Prompt 用于约束 Agent 的分析流程和输出格式,例如数据校验、统计分析、图表生成以及最终报告的组织方式。创建完成后,Agent 可以被多个 Session 复用。 先把 System Prompt 保存为变量: ```Bash ANALYST_SYSTEM_PROMPT='你是一名资深数据分析师,负责把 CSV 数据集转成可直接交付的 HTML 分析报告。 工作目标: 输出一份面向业务方可直接阅读的报告。报告应包含摘要、关键指标、图表、主要发现、数据质量说明和行动建议。 工作原则: 1. 先读取并理解原始 CSV 的结构,再开始分析。必须明确区分"原始输入字段"和"分析过程中派生出的字段"。 2. 所有关于数据规模、行列数、字段名、缺失值、重复值的描述,都必须基于原始 CSV,不得基于清洗后或派生后的 dataframe。 3. 大表先抽样查看,再按需全量聚合,避免无意义地打印整表。 4. 所有结论必须由具体数字支撑;不能只给判断,不给证据。 5. 使用 pandas 完成清洗与聚合,使用 plotly 生成交互式图表。 6. 生成至少 3 张图表,并在图表之间写简短说明,解释图表反映的业务洞察。 7. 为最终的报告生成一个 HTML 文件。 交付要求: 1. 生成可直接交付的 report.html,要求为单文件、自包含 HTML,可离线浏览,不依赖任何外部资源。 2. 报告内容至少包括: - Executive Summary - Key Metrics - Data Quality Notes - 3 个以上图表及对应洞察 - Action Recommendations 分析与表述要求: 1. 优先呈现最有行动价值的发现。 2. 建议必须区分"数据支持的结论"和"需要进一步验证的假设"。 3. 如果样本时间很短、缺少关键字段或无法支撑因果判断,必须明确写出限制。 4. 不得编造不存在的字段、维度、业务背景或结论。 执行要求: 1. 读取原始 CSV 后,先记录: - 原始行数 - 原始列数 - 原始列名 - 缺失值情况 - 重复值情况 2. 所有 KPI、Top N、占比、均值、毛利率等数字,在写入报告前必须再次校验。 3. 如果发现数据不足以支撑某个结论,应降低结论强度,而不是强行给出确定性判断。 保存前请完成自检,确保: 1. 报告中的数据质量信息和关键指标与原始 CSV 及计算结果一致。 2. report.html 不依赖任何外部资源。 3. HTML 内容完整有效,不包含无效字段、占位内容或语法错误。' ``` 再创建 Agent,将上述 System Prompt 与工具一起提交: ```Bash agent_payload=$(jq -n \ --arg name "data-analyst-agent" \ --arg model "$MODEL_ID" \ --arg system "$ANALYST_SYSTEM_PROMPT" \ --arg toolset "$TOOLSET_TYPE" \ '{ name: $name, description: "把 CSV 数据集分析成带交互图表的 HTML 报告。", model: {id: $model, speed: "standard"}, system: $system, tools: [{ type: $toolset, default_config: { enabled: true, permission_policy: {type: "always_allow"} } }], skills: [], mcp_servers: [], metadata: {scenario: "data_analyst_report"} }') agent=$(curl -sS --fail-with-body "$ARK_BASE_URL/agents" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d "$agent_payload") AGENT_ID=$(jq -er '.id' <<<"$agent") echo "Agent: $AGENT_ID" ``` # 第 3 步:上传待分析数据 上传输入文件有多种方式,本示例通过 Files API 上传 CSV 并获取 `FILE_ID`,后续创建 Session 时通过该 ID 引用文件。文件上传采用异步处理,需要等待文件状态变为 `active` 后再继续后续流程,以确保文件已完成处理并可以正常使用。 ```Bash file=$(curl -sS --fail-with-body "$ARK_BASE_URL/files" \ -H "Authorization: Bearer $ARK_API_KEY" \ -F 'purpose=agent' \ -F "file=@${DATA_PATH}") FILE_ID=$(jq -er '.id' <<<"$file") echo "File: $FILE_ID" for _ in $(seq 1 60); do file_info=$(curl -sS --fail-with-body "$ARK_BASE_URL/files/$FILE_ID" \ -H "Authorization: Bearer $ARK_API_KEY") file_status=$(jq -r '.status // "active"' <<<"$file_info") [[ "$file_status" == "active" ]] && break [[ "$file_status" == "failed" ]] && { echo "$file_info" >&2; exit 1; } sleep 2 done ``` # 第 4 步:创建 Session 并挂载数据 Session 表示一次具体的运行实例,用于关联 Agent、Environment 和输入资源。创建 Session 时,通过 `resources` 指定需要挂载的文件,平台会将其映射到沙箱中的 `/mnt/session/uploads/` 目录,供 Agent 在执行过程中访问。Session 创建完成后即进入就绪状态,但不会自动开始执行任务,需在后续发送事件触发执行。 ```Bash UPLOAD_NAME=$(basename "$DATA_PATH") MOUNT_PATH="/mnt/session/uploads/$UPLOAD_NAME" session_payload=$(jq -n \ --arg agent "$AGENT_ID" \ --arg env "$ENVIRONMENT_ID" \ --arg file "$FILE_ID" \ --arg name "$UPLOAD_NAME" \ '{ agent: $agent, environment_id: $env, title: "CSV data analysis", resources: [{type: "file", file_id: $file, mount_path: $name}] }') session=$(curl -sS --fail-with-body "$ARK_BASE_URL/sessions" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d "$session_payload") SESSION_ID=$(jq -er '.id' <<<"$session") echo "Session: $SESSION_ID" ``` # 第 5 步:建立事件流并下发分析任务 Session 创建完成后并不会自动执行任务。为了完整接收本轮事件,先建立 SSE 流并等待服务端返回 `: ready`,再向 `/sessions/{session_id}/events` 接口发送 `user.message`。以下函数会按该顺序编排,并持续读取到会话终态: ```Bash run_session_turn() ( local session_id="$1" local user_text="$2" local stream_dir local stream_pipe="" local stream_error local stream_pid="" local stream_number=0 local stream_ready=false local seen_ids_file local events_payload local turn_done=false local result_code=1 local message_count=0 local reconnect_count=0 local max_reconnects="${ARK_MAX_SSE_RECONNECTS:-3}" local max_history_pages="${ARK_MAX_HISTORY_PAGES:-100}" local line local data : "${ARK_BASE_URL:?Set ARK_BASE_URL before calling run_session_turn}" : "${ARK_API_KEY:?Set ARK_API_KEY before calling run_session_turn}" : "${session_id:?Pass a Session ID as the first argument}" : "${user_text:?Pass a user message as the second argument}" command -v curl >/dev/null || { printf 'curl is required.\n' >&2 return 1 } command -v jq >/dev/null || { printf 'jq is required.\n' >&2 return 1 } [[ $max_reconnects =~ ^[0-9]+$ ]] || { printf 'ARK_MAX_SSE_RECONNECTS must be a non-negative integer.\n' >&2 return 1 } [[ $max_history_pages =~ ^[1-9][0-9]*$ ]] || { printf 'ARK_MAX_HISTORY_PAGES must be a positive integer.\n' >&2 return 1 } stream_dir=$(mktemp -d) || { printf 'Failed to create a temporary directory for the SSE stream.\n' >&2 return 1 } stream_error="$stream_dir/stream-error.log" seen_ids_file="$stream_dir/seen-event-ids" : >"$stream_error" : >"$seen_ids_file" stop_stream() { exec 3<&- || true if [[ -n $stream_pid ]] && kill -0 "$stream_pid" 2>/dev/null; then kill "$stream_pid" 2>/dev/null || true fi if [[ -n $stream_pid ]]; then wait "$stream_pid" 2>/dev/null || true fi if [[ -n $stream_pipe ]]; then rm -f "$stream_pipe" fi stream_pid="" stream_pipe="" } cleanup_stream() { stop_stream rm -rf "$stream_dir" } trap cleanup_stream EXIT start_stream() { stop_stream stream_number=$((stream_number + 1)) stream_pipe="$stream_dir/events-$stream_number" stream_ready=false if ! mkfifo "$stream_pipe"; then printf 'Failed to create the SSE pipe at %s.\n' "$stream_pipe" >&2 return 1 fi curl -sS -N --fail-with-body --max-time 600 \ "$ARK_BASE_URL/sessions/$session_id/events/stream" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Accept: text/event-stream" >"$stream_pipe" 2>>"$stream_error" & stream_pid=$! exec 3<"$stream_pipe" while IFS= read -r line <&3; do line=${line%$'\r'} if [[ $line == ": ready" ]]; then stream_ready=true break fi done if [[ $stream_ready != true ]]; then printf 'SSE stream closed before it was ready.\n' >&2 if [[ -s $stream_error ]]; then tail -n 1 "$stream_error" >&2 fi return 1 fi } event_seen() { local event_id="$1" [[ -n $event_id ]] && grep -Fqx -- "$event_id" "$seen_ids_file" } remember_event() { local event_id="$1" if [[ -n $event_id ]] && ! event_seen "$event_id"; then printf '%s\n' "$event_id" >>"$seen_ids_file" fi } process_event() { local event_json="$1" local event_id local event_type local stop_reason local retry_status local pending_ids event_id=$(jq -r '.id // empty' <<<"$event_json" 2>/dev/null || true) if event_seen "$event_id"; then return 0 fi remember_event "$event_id" event_type=$(jq -r '.type // empty' <<<"$event_json" 2>/dev/null || true) case "$event_type" in agent.message) jq -r '.content[]? | select(.type == "text") | .text' <<<"$event_json" message_count=$((message_count + 1)) ;; agent.tool_use | agent.mcp_tool_use | agent.custom_tool_use) printf '[tool] %s\n' "$(jq -r '.name // .type' <<<"$event_json")" ;; session.error) retry_status=$(jq -r '.error.retry_status.type // empty' <<<"$event_json") printf '[error] %s: %s\n' \ "$(jq -r '.error.type // "unknown_error"' <<<"$event_json")" \ "$(jq -r '.error.message // "No error message returned."' <<<"$event_json")" >&2 case "$retry_status" in retrying) printf '[session] The service is retrying automatically.\n' >&2 ;; exhausted) printf '[session] Retries were exhausted for this turn.\n' >&2 ;; terminal) printf '[session] The Session cannot continue after this error.\n' >&2 ;; *) printf '[session] Unknown error retry status: %s\n' "$retry_status" >&2 result_code=4 turn_done=true ;; esac ;; session.status_rescheduled) printf '[session] The Session was rescheduled; continue waiting.\n' >&2 ;; session.status_idle) stop_reason=$(jq -r '.stop_reason.type // empty' <<<"$event_json") case "$stop_reason" in end_turn) if ((message_count == 0)); then printf 'The turn ended without an agent.message event.\n' >&2 result_code=5 else printf '[session] end_turn\n' >&2 result_code=0 fi turn_done=true ;; requires_action) pending_ids=$(jq -r '.stop_reason.event_ids // [] | join(",")' <<<"$event_json") printf '[session] requires_action: %s\n' "$pending_ids" >&2 result_code=2 turn_done=true ;; retries_exhausted) printf '[session] retries_exhausted\n' >&2 result_code=3 turn_done=true ;; *) printf 'Unknown session.status_idle stop_reason: %s\n' "$stop_reason" >&2 result_code=5 turn_done=true ;; esac ;; session.status_terminated) printf '[session] terminated\n' >&2 result_code=4 turn_done=true ;; esac } read_history() { local mode="$1" local page="" local page_count=0 local response local event_json while :; do page_count=$((page_count + 1)) if ((page_count > max_history_pages)); then printf 'History recovery exceeded %s pages.\n' "$max_history_pages" >&2 return 1 fi if [[ -n $page ]]; then response=$(curl -sS --fail-with-body --get \ "$ARK_BASE_URL/sessions/$session_id/events" \ -H "Authorization: Bearer $ARK_API_KEY" \ --data-urlencode "limit=200" \ --data-urlencode "order=asc" \ --data-urlencode "page=$page") || return 1 else response=$(curl -sS --fail-with-body --get \ "$ARK_BASE_URL/sessions/$session_id/events" \ -H "Authorization: Bearer $ARK_API_KEY" \ --data-urlencode "limit=200" \ --data-urlencode "order=asc") || return 1 fi while IFS= read -r event_json; do [[ -n $event_json ]] || continue if [[ $mode == "seed" ]]; then remember_event "$(jq -r '.id // empty' <<<"$event_json")" else process_event "$event_json" [[ $turn_done == true ]] && break fi done < <(jq -c '.data[]?' <<<"$response") [[ $turn_done == true ]] && return 0 page=$(jq -r '.next_page // empty' <<<"$response") [[ -n $page ]] || return 0 done } if ! start_stream; then return 1 fi # Mark existing history so reconnect recovery only emits this turn. if ! read_history seed; then printf 'Failed to read the Session history before sending the message.\n' >&2 return 1 fi events_payload=$(jq -n --arg text "$user_text" \ '{events: [{type: "user.message", content: [{type: "text", text: $text}]}]}') curl -sS --fail-with-body \ "$ARK_BASE_URL/sessions/$session_id/events" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d "$events_payload" >/dev/null || return 1 while [[ $turn_done != true ]]; do while IFS= read -r line <&3; do line=${line%$'\r'} if [[ $line == ": server draining, reconnect" ]]; then break fi [[ $line == data:* ]] || continue data=${line#data:} data=${data# } process_event "$data" [[ $turn_done == true ]] && break done [[ $turn_done == true ]] && break if ((reconnect_count >= max_reconnects)); then printf 'SSE reconnect limit reached before the turn finished.\n' >&2 return 1 fi reconnect_count=$((reconnect_count + 1)) printf '[session] Reconnecting SSE and recovering history (%s/%s).\n' \ "$reconnect_count" "$max_reconnects" >&2 # Open the replacement stream first, then recover the disconnect window. if ! start_stream; then return 1 fi if ! read_history recover; then printf 'Failed to recover Session history after reconnecting.\n' >&2 return 1 fi done return "$result_code" ) ``` ```Bash analysis_prompt=$(cat < # 第 6 步:实时观测执行过程 第 5 步建立的 SSE 流会实时输出模型消息、工具调用和任务状态。`run_session_turn` 只有在收到 `session.status_idle` 且 `stop_reason.type=end_turn`,并且本轮至少产生一条 `agent.message` 时才返回成功。 如果 SSE 意外断开,函数会先建立替代流,再分页查询历史事件,补齐断线期间的事件并按事件 ID 去重。连续重连仍失败、Session 终止或服务端返回其他停止原因时,函数会返回非零状态,不会把不完整输出当作成功结果。 主要事件类型: | 事件类型 | 含义 | |-|-| | `agent.message` | Agent 返回的文本消息 | | `agent.tool_use` | Agent 正在调用工具 | | `agent.tool_result` | 工具执行结果 | | `session.status_idle` | 根据 `stop_reason.type` 判断本轮正常结束、等待操作或重试耗尽 | | `session.status_terminated` | Session 已终止,需要排查原因 | # 第 7 步:取回分析报告 任务完成后,可以通过 Session ID(`scope_id`)查询本次执行生成的文件。Agent 运行过程中产生的报告、图表等文件都会关联到对应的 Session。当查询结果中出现生成的 HTML 文件时,说明分析报告已经生成。 ```Bash curl -sS --fail-with-body "$ARK_BASE_URL/files?scope_id=$SESSION_ID" \ -H "Authorization: Bearer $ARK_API_KEY" | jq '.data[]? | {id, filename, bytes, status}' ``` 生成的文件可以通过控制台下载到本地,方便查看、分享或归档。 # 第 8 步:清理资源 分析完成后,可根据需要清理本次运行产生的资源。Session 和上传文件属于临时资源,会占用平台配额,确认结果已保存后可及时删除。Agent 和 Environment 通常作为可复用资源保留,用于后续任务。再次执行分析时,只需创建新的 Session 并引用已有的 Agent、Environment 和输入文件即可。 ```Bash curl -sS --fail-with-body -X DELETE \ "$ARK_BASE_URL/sessions/$SESSION_ID" \ -H "Authorization: Bearer $ARK_API_KEY" curl -sS --fail-with-body -X DELETE \ "$ARK_BASE_URL/files/$FILE_ID" \ -H "Authorization: Bearer $ARK_API_KEY" curl -sS --fail-with-body -X DELETE \ "$ARK_BASE_URL/environments/$ENVIRONMENT_ID" \ -H "Authorization: Bearer $ARK_API_KEY" ``` > **警告** > > 删除 Session 前,先确认所需文件的存储位置。使用方舟公共 TOS 时,删除 Session 会清理关联产物,需要提前下载;使用自己的 TOS Bucket 时,删除 Session 不会删除 Bucket 中的对象,你需要继续管理对象生命周期。 # 完整执行顺序 1. 设置 `ARK_API_KEY`、`ARK_BASE_URL`、`MODEL_ID`、`DATA_PATH` 等环境变量。 2. 创建或复用 Environment,确保包含 `pandas` 和 `plotly`。 3. 创建 Agent。 4. 上传 CSV。 5. 创建 Session 并挂载 CSV。 6. 建立事件流并等待 `: ready`。 7. 发送 `user.message`,通过同一条事件流等待 `session.status_idle` 且 `stop_reason.type=end_turn`。 8. 按 `scope_id` 查询 Session 产物。 9. 下载生成文件到本地。 10. 按需清理 Session、输入文件与 Environment。 --- # [进阶] 使用 Vaults 让开发 Agent 以用户身份提交 GitHub PR Source: https://ark.volcengine.com/region:cn-beijing/docs/build-github-agent-with-vaults 本教程演示如何使用方舟 Managed Agents 的 **Vaults 凭据托管**能力,构建一个接入 GitHub 的团队开发助手:团队成员提交需求或缺陷描述,Agent 在云沙箱中完成开发,并以成员本人的身份创建分支、提交 PR。全程凭据由平台托管,Agent 与业务代码都接触不到明文 Token。 # 场景说明 一个典型的团队开发助手工作方式如下:成员在 IM 或内部平台用自然语言提交需求或缺陷(例如「结算页两券叠加时金额多 0.01 元,修一下」),Agent 在云沙箱中拉取代码、定位问题、开发自测,最后回到 GitHub 创建分支、提交 PR。整个过程成员不需要打开 IDE。 这里绕不开一个问题:Agent 操作 GitHub 时,用谁的身份? 共享一个机器人账号是最容易想到的做法,也是问题最多的做法: | 维度 | 共享机器人账号 | 以用户身份(本教程方案) | |-|-|-| | 权限边界 | 机器人需要开通所有成员会用到的仓库权限,权限必然过大 | 复用每个成员自己的仓库权限,天然收敛 | | 审计追溯 | 所有 PR 都是同一个 author,出了问题查不到人 | PR author 即需求提交人,审计链路不断 | | 协作体验 | Reviewer 不知道该找谁讨论方案 | 直接 @ PR 作者本人 | Vaults 是「以用户身份」这条路的基础设施。它不是全局配置中心,而是每个终端用户一只的凭据保险柜——平台在 Agent 粒度上管理产品配置,在 Session 粒度上管理用户凭据。 # 核心概念 | 能力点 | 说明 | |-|-| | Vault | 绑定到某个终端用户的凭据集合,存放该用户的第三方服务 Token;通过 `metadata` 与业务系统的用户 ID 双向映射 | | Credential | Vault 内的一条凭据。支持 `mcp_oauth`、`static_bearer`、`mcp_static`、`environment_variable` 和 `env_oauth` 五种类型;本教程使用 `static_bearer` | | Session 级凭据绑定 | 创建 Session 时传入 `vault_ids`,运行时按 URL 自动匹配凭据并注入;Agent 定义不感知任何用户信息 | | GitHub MCP | 通过 MCP 协议把 GitHub 的仓库、分支、PR 操作暴露为 Agent 工具 | # 工作流程 ![Vaults 与 GitHub Agent 流程](https://arkdocs.tos-cn-beijing.volces.com/flowcharts/tutorials/new-202607241247.svg) # 前置条件 - 已开通方舟 Managed Agents 和目标模型服务。 - 已创建 API Key,详情请参见 [API Key 管理](/docs/manage-api-keys)。 - 每个使用助手的成员,需在 GitHub「Settings → Developer settings → Fine-grained tokens」创建一个 PAT,按最小权限收敛。 - 本地已安装 Bash、`curl` 和 `jq`。 将 API Key 与 Base URL 配置为环境变量: ```Bash export ARK_API_KEY="your_api_key_here" export ARK_BASE_URL="https://ark.cn-beijing.volces.com/api/v3" ``` # 第 1 步:准备 GitHub Fine-grained PAT 推荐按下表配置 PAT 权限,只授予助手需要的仓库和最小权限: | 配置项 | 建议值 | 用途 | |-|-|-| | Repository access | 只勾选目标仓库(如 `payments-web`),不选 All repositories | 收敛可访问仓库范围 | | Contents | Read and write | 拉代码、推分支 | | Pull requests | Read and write | 创建 PR | | Metadata | Read-only | GitHub 强制要求 | > **警告** > > PAT 的权限就是 Agent 能力的上限,也是出事时的止损边界。Agent 可以执行该 Key 允许的任何操作,过权 Key 会在 Agent 异常时扩大事故影响范围。宁可先给窄、用到再加——Vaults 隔离的是「谁的凭据」,管不了「这个凭据本身有多大权力」。 # 第 2 步:为用户创建 Vault 成员 Alice 首次使用助手时,为她创建一只 Vault: ```Bash curl "$ARK_BASE_URL/vaults" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "display_name": "Alice", "metadata": { "external_user_id": "usr_alice_001", "team": "payments" } }' ``` 响应是完整的 Vault 记录: ```json { "type": "vault", "id": "vlt-20260701120000-pqrst", "display_name": "Alice", "metadata": {"external_user_id": "usr_alice_001", "team": "payments"}, "created_at": "2026-07-08T10:00:00Z", "updated_at": "2026-07-08T10:00:00Z" } ``` 请求字段说明: | 参数 | 必填 | 说明 | |-|-|-| | `display_name` | 是 | 控制台展示名 | | `metadata` | 否 | 任意键值对,用于把 Vault 映射回业务系统的用户记录;后续凭据失效需要找人重新授权,靠它反查 | 将返回的 `id` 存入业务系统的用户表——这是该用户在 Managed Agents 中的身份锚点。 > **注意:权限边界** > > Vault 和凭据在工作空间内共享,不按 API Key 单独隔离。持有同一工作空间任一 API Key 的服务,都可以通过 Vault ID 在 Session 中引用其中的凭据。仅向受信任的服务开放工作空间 API Key。 # 第 3 步:写入 GitHub 凭据 凭据把「MCP 服务器 URL」和「访问它用的 Token」配成一对。GitHub PAT 属于固定 Bearer token,使用 `static_bearer` 类型。以下脚本通过无回显输入读取 PAT,将密钥和请求体写入仅当前用户可读的临时文件,并在请求结束后删除文件: ```Bash : "${VAULT_ID:?Create a Vault and set VAULT_ID first}" : "${ARK_BASE_URL:?Set ARK_BASE_URL first}" : "${ARK_API_KEY:?Set ARK_API_KEY first}" command -v curl >/dev/null || { printf 'curl is required.\n' >&2 exit 1 } command -v jq >/dev/null || { printf 'jq is required.\n' >&2 exit 1 } old_umask=$(umask) umask 077 secret_file=$(mktemp) || exit 1 payload_file=$(mktemp) || { rm -f "$secret_file" exit 1 } umask "$old_umask" cleanup_secret_files() { rm -f "$secret_file" "$payload_file" } trap cleanup_secret_files EXIT IFS= read -r -s -p "GitHub PAT: " GITHUB_PAT || exit 1 printf '\n' printf '%s' "$GITHUB_PAT" >"$secret_file" unset GITHUB_PAT jq -n \ --rawfile token "$secret_file" \ '{ display_name: "Alice GitHub PAT", auth: { type: "static_bearer", mcp_server_url: "https://api.githubcopilot.com/mcp/", token: $token } }' >"$payload_file" || exit 1 CREDENTIAL_RESPONSE=$(curl -sS --fail-with-body \ "$ARK_BASE_URL/vaults/$VAULT_ID/credentials" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ --data-binary @"$payload_file") || exit 1 CREDENTIAL_ID=$(jq -er '.id' <<<"$CREDENTIAL_RESPONSE") || exit 1 export CREDENTIAL_ID printf 'Credential ID: %s\n' "$CREDENTIAL_ID" cleanup_secret_files trap - EXIT ``` 脚本不会把 PAT 放进命令行参数或可持久化的命令文本。响应中的凭据 ID 会保存为 `CREDENTIAL_ID`。 五种凭据类型按目标服务的认证方式选择: | 类型 | 适用 | 密钥字段 | |-|-|-| | `static_bearer` | 固定 API Key / PAT(GitHub、Linear 等)——本教程场景 | `token` | | `mcp_oauth` | OAuth 2.0 的 MCP 服务(Slack、Google Drive 等),提供 `refresh` 块后平台代刷令牌 | `access_token` + `refresh` | | `mcp_static` | MCP 使用固定密钥,需要以 Bearer、自定义 Header 或 URL 查询参数注入 | `token` + `injection_type`,部分类型还需 `injection_name` | | `environment_variable` | 沙箱内 CLI / SDK 走环境变量鉴权的场景,用 `allowed_hosts` 限制密钥可发往的主机 | `secret_name` + `secret_value` | | `env_oauth` | 沙箱内 CLI / SDK 从环境变量读取 OAuth 访问令牌 | `access_token` + `secret_name` + `networking` | 三个值得知道的行为: - 创建即校验:MCP 类凭据(`static_bearer`、`mcp_oauth`、`mcp_static`)创建时,平台会立即连接目标 MCP 服务器探测握手。PAT 写错会直接返回 4xx、创建失败,不会拖到 Session 运行时才暴露。 - 密钥 write-only:`token` 等实际密钥被视为敏感的只写字段,永远不会在 API 响应中返回。 - `mcp_server_url` 唯一且不可变:`mcp_server_url` 在 Vault 的活跃凭据中必须唯一(重复返回 409),且创建后锁定——要改 URL 只能删旧建新。每个 Vault 最多包含 100 个凭据。 # 第 4 步:创建 Agent 与 Environment Agent 定义只声明「要连接哪些 MCP 服务器」,不含任何凭据——平台把 MCP 配置明确拆成两层:Agent 定义层声明连接目标,Session 运行层注入凭据。这是同一个 Agent 能代表不同用户行动的前提。 ```Bash curl "$ARK_BASE_URL/agents" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "name": "team-dev-assistant", "model": {"id": "doubao-seed-2-1-pro-260628"}, "system": "你是团队开发助手。收到需求或缺陷描述后,在沙箱中完成开发与自测,并通过 GitHub 工具以当前用户身份创建分支、提交 PR。", "mcp_servers": [ { "type": "url", "name": "github", "url": "https://api.githubcopilot.com/mcp/" } ], "tools": [ {"type": "agent_toolset_20260916"}, {"type": "mcp_toolset", "mcp_server_name": "github"} ] }' ``` 两条声明约束: - `mcp_servers` 里的 `url` 在同一个 Agent 内不能重复;`name` 冲突时,服务端会自动追加数字后缀,调用方无需保证名称唯一。 - 每个 `mcp_servers` 条目必须有一个 `mcp_toolset` 通过 `mcp_server_name` 字段与之对应引用,反之亦然。 若 MCP 服务器暴露的工具很多,可以在 `mcp_toolset` 上用 `default_config: {"enabled": false}` 加 `configs` 白名单按需开启。 创建 Environment(`name` 在当前 project 内须唯一): ```Bash curl "$ARK_BASE_URL/environments" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "name": "dev-assistant-env", "config": {"type": "cloud", "networking": {"type": "unrestricted"}} }' ``` > **注意** > > `unrestricted` 只适合演示和受控测试。生产环境应按 GitHub MCP、代码仓库和必要依赖配置最小网络白名单,并与 Vault 凭据的允许主机共同收敛出口。 # 第 5 步:创建 Session 并绑定 Vault Session 是绑定发生的地方——`vault_ids` 一传,这条 Session 里 Agent 对 GitHub 的所有调用都会自动带上 Alice 的 PAT。`agent` 字段传字符串 ID 即使用该 Agent 的最新版本(需要锁定版本做灰度时,改传 `{"type": "agent", "id": "...", "version": 1}` 对象): ```Bash curl "$ARK_BASE_URL/sessions" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "agent": "'"$AGENT_ID"'", "environment_id": "'"$ENV_ID"'", "vault_ids": ["'"$VAULT_ID"'"], "title": "fix: 结算页金额四舍五入缺陷" }' ``` 响应中 `status` 为 `idle`:创建 Session 只完成沙箱配置,不会启动任何工作。这个解耦让开发者可以先挂好 Vaults 凭据、检查环境,再发送首个事件启动 Agent。 运行时的凭据匹配机制: ```Text Agent 声明 mcp_servers[].url = https://api.githubcopilot.com/mcp/ Session 携带 vault_ids = [vlt_alice] 运行时 在 vlt_alice 中查找 mcp_server_url 精确等于该 URL 的凭据 命中 : 连接 MCP 服务器时自动注入 Alice 的 PAT 未命中 : 尝试匿名连接(服务器要求鉴权则报错) 多个命中 : 第一个匹配的 Vault 优先 ``` 多用户隔离在这一步自然成立: ```Text 一份 Agent 定义(全团队复用) mcp_servers: github -> https://api.githubcopilot.com/mcp/ Alice 的 Vault (vlt-...pqrst) Bob 的 Vault (vlt-...uvwxy) PAT: 由 Vault 托管 PAT: 由 Vault 托管 Session A: vault_ids=[vlt_alice] -> 提交的 PR author 是 Alice Session B: vault_ids=[vlt_bob] -> 提交的 PR author 是 Bob ``` # 第 6 步:下发任务并观察执行 先加载可靠事件处理函数。该函数会建立 SSE 并等待 `: ready`,再发送 `user.message`;连接中断时,函数先重连,再分页补查历史事件并按事件 ID 去重: ```Bash run_session_turn() ( local session_id="$1" local user_text="$2" local stream_dir local stream_pipe="" local stream_error local stream_pid="" local stream_number=0 local stream_ready=false local seen_ids_file local events_payload local turn_done=false local result_code=1 local message_count=0 local reconnect_count=0 local max_reconnects="${ARK_MAX_SSE_RECONNECTS:-3}" local max_history_pages="${ARK_MAX_HISTORY_PAGES:-100}" local line local data : "${ARK_BASE_URL:?Set ARK_BASE_URL before calling run_session_turn}" : "${ARK_API_KEY:?Set ARK_API_KEY before calling run_session_turn}" : "${session_id:?Pass a Session ID as the first argument}" : "${user_text:?Pass a user message as the second argument}" command -v curl >/dev/null || { printf 'curl is required.\n' >&2 return 1 } command -v jq >/dev/null || { printf 'jq is required.\n' >&2 return 1 } [[ $max_reconnects =~ ^[0-9]+$ ]] || { printf 'ARK_MAX_SSE_RECONNECTS must be a non-negative integer.\n' >&2 return 1 } [[ $max_history_pages =~ ^[1-9][0-9]*$ ]] || { printf 'ARK_MAX_HISTORY_PAGES must be a positive integer.\n' >&2 return 1 } stream_dir=$(mktemp -d) || { printf 'Failed to create a temporary directory for the SSE stream.\n' >&2 return 1 } stream_error="$stream_dir/stream-error.log" seen_ids_file="$stream_dir/seen-event-ids" : >"$stream_error" : >"$seen_ids_file" stop_stream() { exec 3<&- || true if [[ -n $stream_pid ]] && kill -0 "$stream_pid" 2>/dev/null; then kill "$stream_pid" 2>/dev/null || true fi if [[ -n $stream_pid ]]; then wait "$stream_pid" 2>/dev/null || true fi if [[ -n $stream_pipe ]]; then rm -f "$stream_pipe" fi stream_pid="" stream_pipe="" } cleanup_stream() { stop_stream rm -rf "$stream_dir" } trap cleanup_stream EXIT start_stream() { stop_stream stream_number=$((stream_number + 1)) stream_pipe="$stream_dir/events-$stream_number" stream_ready=false if ! mkfifo "$stream_pipe"; then printf 'Failed to create the SSE pipe at %s.\n' "$stream_pipe" >&2 return 1 fi curl -sS -N --fail-with-body --max-time 600 \ "$ARK_BASE_URL/sessions/$session_id/events/stream" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Accept: text/event-stream" >"$stream_pipe" 2>>"$stream_error" & stream_pid=$! exec 3<"$stream_pipe" while IFS= read -r line <&3; do line=${line%$'\r'} if [[ $line == ": ready" ]]; then stream_ready=true break fi done if [[ $stream_ready != true ]]; then printf 'SSE stream closed before it was ready.\n' >&2 if [[ -s $stream_error ]]; then tail -n 1 "$stream_error" >&2 fi return 1 fi } event_seen() { local event_id="$1" [[ -n $event_id ]] && grep -Fqx -- "$event_id" "$seen_ids_file" } remember_event() { local event_id="$1" if [[ -n $event_id ]] && ! event_seen "$event_id"; then printf '%s\n' "$event_id" >>"$seen_ids_file" fi } process_event() { local event_json="$1" local event_id local event_type local stop_reason local retry_status local pending_ids event_id=$(jq -r '.id // empty' <<<"$event_json" 2>/dev/null || true) if event_seen "$event_id"; then return 0 fi remember_event "$event_id" event_type=$(jq -r '.type // empty' <<<"$event_json" 2>/dev/null || true) case "$event_type" in agent.message) jq -r '.content[]? | select(.type == "text") | .text' <<<"$event_json" message_count=$((message_count + 1)) ;; agent.tool_use | agent.mcp_tool_use | agent.custom_tool_use) printf '[tool] %s\n' "$(jq -r '.name // .type' <<<"$event_json")" ;; session.error) retry_status=$(jq -r '.error.retry_status.type // empty' <<<"$event_json") printf '[error] %s: %s\n' \ "$(jq -r '.error.type // "unknown_error"' <<<"$event_json")" \ "$(jq -r '.error.message // "No error message returned."' <<<"$event_json")" >&2 case "$retry_status" in retrying) printf '[session] The service is retrying automatically.\n' >&2 ;; exhausted) printf '[session] Retries were exhausted for this turn.\n' >&2 ;; terminal) printf '[session] The Session cannot continue after this error.\n' >&2 ;; *) printf '[session] Unknown error retry status: %s\n' "$retry_status" >&2 result_code=4 turn_done=true ;; esac ;; session.status_rescheduled) printf '[session] The Session was rescheduled; continue waiting.\n' >&2 ;; session.status_idle) stop_reason=$(jq -r '.stop_reason.type // empty' <<<"$event_json") case "$stop_reason" in end_turn) if ((message_count == 0)); then printf 'The turn ended without an agent.message event.\n' >&2 result_code=5 else printf '[session] end_turn\n' >&2 result_code=0 fi turn_done=true ;; requires_action) pending_ids=$(jq -r '.stop_reason.event_ids // [] | join(",")' <<<"$event_json") printf '[session] requires_action: %s\n' "$pending_ids" >&2 result_code=2 turn_done=true ;; retries_exhausted) printf '[session] retries_exhausted\n' >&2 result_code=3 turn_done=true ;; *) printf 'Unknown session.status_idle stop_reason: %s\n' "$stop_reason" >&2 result_code=5 turn_done=true ;; esac ;; session.status_terminated) printf '[session] terminated\n' >&2 result_code=4 turn_done=true ;; esac } read_history() { local mode="$1" local page="" local page_count=0 local response local event_json while :; do page_count=$((page_count + 1)) if ((page_count > max_history_pages)); then printf 'History recovery exceeded %s pages.\n' "$max_history_pages" >&2 return 1 fi if [[ -n $page ]]; then response=$(curl -sS --fail-with-body --get \ "$ARK_BASE_URL/sessions/$session_id/events" \ -H "Authorization: Bearer $ARK_API_KEY" \ --data-urlencode "limit=200" \ --data-urlencode "order=asc" \ --data-urlencode "page=$page") || return 1 else response=$(curl -sS --fail-with-body --get \ "$ARK_BASE_URL/sessions/$session_id/events" \ -H "Authorization: Bearer $ARK_API_KEY" \ --data-urlencode "limit=200" \ --data-urlencode "order=asc") || return 1 fi while IFS= read -r event_json; do [[ -n $event_json ]] || continue if [[ $mode == "seed" ]]; then remember_event "$(jq -r '.id // empty' <<<"$event_json")" else process_event "$event_json" [[ $turn_done == true ]] && break fi done < <(jq -c '.data[]?' <<<"$response") [[ $turn_done == true ]] && return 0 page=$(jq -r '.next_page // empty' <<<"$response") [[ -n $page ]] || return 0 done } if ! start_stream; then return 1 fi # Mark existing history so reconnect recovery only emits this turn. if ! read_history seed; then printf 'Failed to read the Session history before sending the message.\n' >&2 return 1 fi events_payload=$(jq -n --arg text "$user_text" \ '{events: [{type: "user.message", content: [{type: "text", text: $text}]}]}') curl -sS --fail-with-body \ "$ARK_BASE_URL/sessions/$session_id/events" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d "$events_payload" >/dev/null || return 1 while [[ $turn_done != true ]]; do while IFS= read -r line <&3; do line=${line%$'\r'} if [[ $line == ": server draining, reconnect" ]]; then break fi [[ $line == data:* ]] || continue data=${line#data:} data=${data# } process_event "$data" [[ $turn_done == true ]] && break done [[ $turn_done == true ]] && break if ((reconnect_count >= max_reconnects)); then printf 'SSE reconnect limit reached before the turn finished.\n' >&2 return 1 fi reconnect_count=$((reconnect_count + 1)) printf '[session] Reconnecting SSE and recovering history (%s/%s).\n' \ "$reconnect_count" "$max_reconnects" >&2 # Open the replacement stream first, then recover the disconnect window. if ! start_stream; then return 1 fi if ! read_history recover; then printf 'Failed to recover Session history after reconnecting.\n' >&2 return 1 fi done return "$result_code" ) ``` 发送 Alice 的缺陷描述: ```bash github_task=$(cat <<'EOF' 结算页缺陷:叠加使用满减券和折扣券时,应付金额比手算结果多 0.01 元,疑似分转元时的浮点精度问题。 1. 在 payments-web 仓库定位金额计算逻辑并修复。 2. 补充单元测试,覆盖两券叠加的边界用例。 3. 创建分支提交 PR,PR 描述写清根因分析。 EOF ) run_session_turn "$SESSION_ID" "$github_task" ``` 任务执行的关键步骤: 1. 定位与开发:Agent 通过 GitHub MCP 读取仓库——从这一刻起使用 Alice 的 PAT——把代码拉进云沙箱,定位到金额计算中分转元使用浮点除法的问题,改为整数分运算并补充测试。 2. 沙箱内自测:运行测试套件,确认新增用例通过、存量用例不回归。 3. 以 Alice 身份提 PR:Agent 调用 GitHub MCP 的分支与 PR 工具,创建 `fix/coupon-rounding` 分支并提交 PR。打开 GitHub 验证效果:PR 的 author 是 Alice 本人,commit 归属、通知、review 流程与她手工提交完全一致。 `run_session_turn` 只在收到 `session.status_idle`、`stop_reason.type=end_turn` 且已经收到完整 `agent.message` 时返回状态码 `0`。返回 `2` 表示 Session 仍在等待工具确认;返回 `3` 表示本轮重试耗尽;返回 `4` 表示 Session 已终止或发生不可恢复错误。 > **注意** > > 不要以连接关闭或单条文本作为终态。客户端应记录事件 ID、去重,并在断线后通过事件历史或官方恢复机制补齐,再继续订阅。 # 安全模型与多租户隔离 Token 全链路不可见,这是 Vaults 与「把 Token 塞进 prompt 或沙箱环境变量」的本质区别: | 环节 | 行为 | |-|-| | API 层 | 凭据 write-only,任何读接口不返回密钥值 | | 沙箱内 | Agent 看不到明文;`environment_variable` 类型在沙箱内呈现为不透明占位符 | | 出口注入 | 替换发生在沙箱出口处,不在沙箱内——真实值不经过模型上下文 | | 网络限制 | Credential 的 `networking.allowed_hosts` 限制凭据可以注入哪些出站主机 | > **注意** > > Vault 能显著降低明文 Token 进入模型上下文或业务日志的风险,但不等于阻止越权操作:一旦 Agent 被错误指令控制,仍可能在该用户凭据允许的范围内调用工具。真正的安全边界来自最小权限 PAT、网络白名单、工具白名单、写操作确认和完整审计的组合。 # 生命周期管理 | 操作 | 接口 | 行为 | |-|-|-| | 轮换密钥 | `POST /vaults/{vault_id}/credentials/{credential_id}` | 可更新密钥值与 `display_name`;结构性字段(`mcp_server_url` 等)创建后锁定,要改只能删旧建新 | | 删除凭据 | `DELETE .../credentials/{credential_id}` | 硬删除,相关记录与密钥一并清除,不可恢复 | | 删除 Vault | `DELETE /vaults/{vault_id}` | 成员离职时使用,级联删除其全部凭据,不可恢复 | > **警告** > > 删除是唯一的撤权手段且不可恢复。执行删除操作前,请确认对象是否正确。 > **说明** > > 凭据会在 Session 运行期间周期性重新解析,轮换、删除都会自动传播到运行中的 Session,无需重启。 # 凭据失效的处理 凭据失效的暴露时机分两段: - 首次校验失败:MCP 类凭据可能在创建或首次使用阶段暴露配置问题。 - 运行期失效:存入后才失效的凭据,会在 Session 访问 GitHub 时表现为鉴权错误。 应用侧应根据事件与 Session 状态判断是否可继续,不能统一假设错误不会终止 Session。监听到错误后,可凭 Vault `metadata` 中的 `external_user_id` 反查用户,引导其轮换 Token;是否复用原 Session,应以当次错误语义和官方恢复机制为准。 --- # [进阶] 使用 Memory Store 构建有记忆的购物助手 Source: https://ark.volcengine.com/region:cn-beijing/docs/build-shopping-assistant-with-memory 本教程演示如何使用方舟 Managed Agents 的 **Memory Store(记忆存储)** 能力,构建一个能记住客户购物偏好的个人购物助手。跨会话保留的记忆让 Agent 无需在每次对话开始时重复询问尺码、预算、材质忌讳等信息,从而提供真正个性化的服务。 # 场景说明 大多数销售助手每次对话都要从头开始。顾客告诉助手尺码、预算和不喜欢的材质,但下次顾客回来时,这些信息全都不见了,顾客不得不重复一遍,整个体验缺乏个性化。 Managed Agents 提供了开箱即用的记忆能力:Memory Store。它是一个由平台托管的持久化容器,Agent 可以在多次会话之间通过后端应用层 API 调用读写用户信息,从而记住用户。 # 你将构建什么 - 一个 Memory Store,用于保存单个客户的购物偏好。 - 一个配置为读写该 Memory Store 的购物 Agent。 - 两个独立的 Session,演示记忆如何跨会话延续。 - 一种从后端应用检查和初始化记忆的模式。 # 记忆如何工作 Memory Store 挂载后,Agent 可以根据 `access` 配置读取或修改其中的内容。应用程序也可以通过 API 读写同一份内容,用于预填信息、审核 Agent 写入的内容或导出数据。 ![Memory Store 购物助手流程](https://arkdocs.tos-cn-beijing.volces.com/flowcharts/tutorials/new-202607241248.svg) # 前置条件 - 已开通方舟 Managed Agents 和目标模型服务。 - 已创建 API Key,详情请参见 [API Key 管理](/docs/manage-api-keys)。 - 本地已安装 `curl` 和 `jq`(用于解析 SSE 事件)。 将 API Key、Base URL 配置为环境变量,方便后续 `curl` 命令复用: ```Bash export ARK_API_KEY="你的 API Key" export ARK_BASE_URL="https://ark.cn-beijing.volces.com/api/v3" ``` 所有请求统一使用以下鉴权头: ```Text Authorization: Bearer $ARK_API_KEY Content-Type: application/json ``` # 辅助函数:一步完成一轮对话 为了让后续每一步不必重复输入长命令,先定义一个 shell 函数。它会先建立 SSE 流并等待 `: ready`,再发送消息,最后持续读取到会话终态: ```Bash run_session_turn() ( local session_id="$1" local user_text="$2" local stream_dir local stream_pipe="" local stream_error local stream_pid="" local stream_number=0 local stream_ready=false local seen_ids_file local events_payload local turn_done=false local result_code=1 local message_count=0 local reconnect_count=0 local max_reconnects="${ARK_MAX_SSE_RECONNECTS:-3}" local max_history_pages="${ARK_MAX_HISTORY_PAGES:-100}" local line local data : "${ARK_BASE_URL:?Set ARK_BASE_URL before calling run_session_turn}" : "${ARK_API_KEY:?Set ARK_API_KEY before calling run_session_turn}" : "${session_id:?Pass a Session ID as the first argument}" : "${user_text:?Pass a user message as the second argument}" command -v curl >/dev/null || { printf 'curl is required.\n' >&2 return 1 } command -v jq >/dev/null || { printf 'jq is required.\n' >&2 return 1 } [[ $max_reconnects =~ ^[0-9]+$ ]] || { printf 'ARK_MAX_SSE_RECONNECTS must be a non-negative integer.\n' >&2 return 1 } [[ $max_history_pages =~ ^[1-9][0-9]*$ ]] || { printf 'ARK_MAX_HISTORY_PAGES must be a positive integer.\n' >&2 return 1 } stream_dir=$(mktemp -d) || { printf 'Failed to create a temporary directory for the SSE stream.\n' >&2 return 1 } stream_error="$stream_dir/stream-error.log" seen_ids_file="$stream_dir/seen-event-ids" : >"$stream_error" : >"$seen_ids_file" stop_stream() { exec 3<&- || true if [[ -n $stream_pid ]] && kill -0 "$stream_pid" 2>/dev/null; then kill "$stream_pid" 2>/dev/null || true fi if [[ -n $stream_pid ]]; then wait "$stream_pid" 2>/dev/null || true fi if [[ -n $stream_pipe ]]; then rm -f "$stream_pipe" fi stream_pid="" stream_pipe="" } cleanup_stream() { stop_stream rm -rf "$stream_dir" } trap cleanup_stream EXIT start_stream() { stop_stream stream_number=$((stream_number + 1)) stream_pipe="$stream_dir/events-$stream_number" stream_ready=false if ! mkfifo "$stream_pipe"; then printf 'Failed to create the SSE pipe at %s.\n' "$stream_pipe" >&2 return 1 fi curl -sS -N --fail-with-body --max-time 600 \ "$ARK_BASE_URL/sessions/$session_id/events/stream" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Accept: text/event-stream" >"$stream_pipe" 2>>"$stream_error" & stream_pid=$! exec 3<"$stream_pipe" while IFS= read -r line <&3; do line=${line%$'\r'} if [[ $line == ": ready" ]]; then stream_ready=true break fi done if [[ $stream_ready != true ]]; then printf 'SSE stream closed before it was ready.\n' >&2 if [[ -s $stream_error ]]; then tail -n 1 "$stream_error" >&2 fi return 1 fi } event_seen() { local event_id="$1" [[ -n $event_id ]] && grep -Fqx -- "$event_id" "$seen_ids_file" } remember_event() { local event_id="$1" if [[ -n $event_id ]] && ! event_seen "$event_id"; then printf '%s\n' "$event_id" >>"$seen_ids_file" fi } process_event() { local event_json="$1" local event_id local event_type local stop_reason local retry_status local pending_ids event_id=$(jq -r '.id // empty' <<<"$event_json" 2>/dev/null || true) if event_seen "$event_id"; then return 0 fi remember_event "$event_id" event_type=$(jq -r '.type // empty' <<<"$event_json" 2>/dev/null || true) case "$event_type" in agent.message) jq -r '.content[]? | select(.type == "text") | .text' <<<"$event_json" message_count=$((message_count + 1)) ;; agent.tool_use | agent.mcp_tool_use | agent.custom_tool_use) printf '[tool] %s\n' "$(jq -r '.name // .type' <<<"$event_json")" ;; session.error) retry_status=$(jq -r '.error.retry_status.type // empty' <<<"$event_json") printf '[error] %s: %s\n' \ "$(jq -r '.error.type // "unknown_error"' <<<"$event_json")" \ "$(jq -r '.error.message // "No error message returned."' <<<"$event_json")" >&2 case "$retry_status" in retrying) printf '[session] The service is retrying automatically.\n' >&2 ;; exhausted) printf '[session] Retries were exhausted for this turn.\n' >&2 ;; terminal) printf '[session] The Session cannot continue after this error.\n' >&2 ;; *) printf '[session] Unknown error retry status: %s\n' "$retry_status" >&2 result_code=4 turn_done=true ;; esac ;; session.status_rescheduled) printf '[session] The Session was rescheduled; continue waiting.\n' >&2 ;; session.status_idle) stop_reason=$(jq -r '.stop_reason.type // empty' <<<"$event_json") case "$stop_reason" in end_turn) if ((message_count == 0)); then printf 'The turn ended without an agent.message event.\n' >&2 result_code=5 else printf '[session] end_turn\n' >&2 result_code=0 fi turn_done=true ;; requires_action) pending_ids=$(jq -r '.stop_reason.event_ids // [] | join(",")' <<<"$event_json") printf '[session] requires_action: %s\n' "$pending_ids" >&2 result_code=2 turn_done=true ;; retries_exhausted) printf '[session] retries_exhausted\n' >&2 result_code=3 turn_done=true ;; *) printf 'Unknown session.status_idle stop_reason: %s\n' "$stop_reason" >&2 result_code=5 turn_done=true ;; esac ;; session.status_terminated) printf '[session] terminated\n' >&2 result_code=4 turn_done=true ;; esac } read_history() { local mode="$1" local page="" local page_count=0 local response local event_json while :; do page_count=$((page_count + 1)) if ((page_count > max_history_pages)); then printf 'History recovery exceeded %s pages.\n' "$max_history_pages" >&2 return 1 fi if [[ -n $page ]]; then response=$(curl -sS --fail-with-body --get \ "$ARK_BASE_URL/sessions/$session_id/events" \ -H "Authorization: Bearer $ARK_API_KEY" \ --data-urlencode "limit=200" \ --data-urlencode "order=asc" \ --data-urlencode "page=$page") || return 1 else response=$(curl -sS --fail-with-body --get \ "$ARK_BASE_URL/sessions/$session_id/events" \ -H "Authorization: Bearer $ARK_API_KEY" \ --data-urlencode "limit=200" \ --data-urlencode "order=asc") || return 1 fi while IFS= read -r event_json; do [[ -n $event_json ]] || continue if [[ $mode == "seed" ]]; then remember_event "$(jq -r '.id // empty' <<<"$event_json")" else process_event "$event_json" [[ $turn_done == true ]] && break fi done < <(jq -c '.data[]?' <<<"$response") [[ $turn_done == true ]] && return 0 page=$(jq -r '.next_page // empty' <<<"$response") [[ -n $page ]] || return 0 done } if ! start_stream; then return 1 fi # Mark existing history so reconnect recovery only emits this turn. if ! read_history seed; then printf 'Failed to read the Session history before sending the message.\n' >&2 return 1 fi events_payload=$(jq -n --arg text "$user_text" \ '{events: [{type: "user.message", content: [{type: "text", text: $text}]}]}') curl -sS --fail-with-body \ "$ARK_BASE_URL/sessions/$session_id/events" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d "$events_payload" >/dev/null || return 1 while [[ $turn_done != true ]]; do while IFS= read -r line <&3; do line=${line%$'\r'} if [[ $line == ": server draining, reconnect" ]]; then break fi [[ $line == data:* ]] || continue data=${line#data:} data=${data# } process_event "$data" [[ $turn_done == true ]] && break done [[ $turn_done == true ]] && break if ((reconnect_count >= max_reconnects)); then printf 'SSE reconnect limit reached before the turn finished.\n' >&2 return 1 fi reconnect_count=$((reconnect_count + 1)) printf '[session] Reconnecting SSE and recovering history (%s/%s).\n' \ "$reconnect_count" "$max_reconnects" >&2 # Open the replacement stream first, then recover the disconnect window. if ! start_stream; then return 1 fi if ! read_history recover; then printf 'Failed to recover Session history after reconnecting.\n' >&2 return 1 fi done return "$result_code" ) ``` # 第 1 步:创建 Memory Store Memory Store 是 Agent 存储客户偏好的容器。生产环境中,每位客户对应一个独立的 Memory Store,以保证隔离性。 ```Bash curl -X POST "$ARK_BASE_URL/memory_stores" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "name": "shopper_preferences_demo", "description": "该记忆库保存客户的个人购物偏好。请在每次对话开始时读取,学到新偏好时立即写入。" }' ``` 响应示例: ``` { "id": "memstore-20260708080047-svq7t", "type": "memory_store", "name": "shopper_preferences_demo", "description": "该记忆库保存客户的个人购物偏好。请在每次对话开始时读取,学到新偏好时立即写入。", "memory_count": 0, "storage_bytes": 0, "session_count": 0, "created_at": "2026-07-08T08:00:47Z", "updated_at": "2026-07-08T08:00:47Z", "metadata": {} } ``` 记录返回的 `id`,后续步骤会将其作为 `STORE_ID` 使用。 # 第 2 步:创建购物 Agent 与 Environment 每个 Managed Agents Session 都需要一个 Agent(模型、System Prompt 和工具)和一个 Environment(Agent 运行所在的容器)。这两个资源一次创建后可以在多个客户与 Session 之间重复使用。 创建 Agent: ```Bash curl -X POST "$ARK_BASE_URL/agents" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d @- <<'EOF' { "name": "Personal Shopper", "model": {"id": "doubao-seed-2-1-pro-260628"}, "system": "你是一位专业的品牌私人购物助手。你的核心职责是帮助客户找到符合他们个人品味和预算的商品。你需要主动了解客户的风格偏好、尺码信息、预算范围、感兴趣的品牌和品类等信息,并在对话中记住所有了解到的客户信息,以便在后续的交流和下次服务中能够提供更精准、个性化的推荐。你可以使用 Memory 工具访问持久化记忆。对话开始时先读取已有的客户偏好,避免重复询问;学到新的稳定偏好后,及时更新记忆。你的输出风格亲切、专业、有耐心,始终以客户的需求为中心,提供贴心的购物建议。", "tools": [ {"type": "agent_toolset_20260916"} ] } EOF ``` 创建 Environment: ```Bash curl -X POST "$ARK_BASE_URL/environments" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d @- <<'EOF' { "name": "shop_agent", "description": "为购物 Agent 提供基础运行环境", "config": { "type": "cloud", "networking": {"type": "unrestricted"} } } EOF ``` 将返回的 `agent.id` 和 `environment.id` 分别记录为 `AGENT_ID` 和 `ENVIRONMENT_ID`。 > **注意** > > `networking.type=unrestricted` 便于教程演示。生产环境应按最小可用范围收敛网络策略,只放行必要的出站主机。 # 第 3 步:创建 Session 并挂载 Memory Store Session 是一次会话上下文。客户偏好需要由 Agent 持续补充,因此将访问权限显式设置为 `read_write`: ```Bash curl -X POST "$ARK_BASE_URL/sessions" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d @- < # 第 4 步:首次访问,Agent 学习偏好 调用辅助函数发送第一条用户消息,观察 Agent 如何一边对话一边读取或补充 Memory Store: ```Bash run_session_turn \ "$SESSION_ID" \ "你好,我想找一件秋冬外套,预算 800 以内,我平时穿 M 码,喜欢大地色系(驼色、卡其、焦糖),不接受动物皮革。" ``` # 第 5 步:应用侧写入 Memory 从对话中提取用户偏好后,由应用后端直接调 REST API 落库,应用侧掌控写入时机和内容格式: ```Bash curl -X POST "$ARK_BASE_URL/memory_stores/$STORE_ID/memories" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "path": "/user_preferences.md", "content": "# 用户购物偏好\n- 尺码:M\n- 颜色偏好:大地色系(驼色、卡其、焦糖)\n- 预算:秋冬外套 ≤ 800 元\n- 材质禁忌:完全不接受动物皮革(真皮、真皮拼接、天然麂皮)\n- 可接受:人造革、仿麂皮" }' ``` 响应示例: ``` { "id": "mem-20260708084847-c5xnj", "type": "memory", "memory_store_id": "memstore-20260708080047-svq7t", "path": "/user_preferences.md", "content_sha256": "c459e3ea973af3e5f5a10d1548136cedceeec613893dc8e641e3f3886fe0f3b5", "content_size_bytes": 256, "memory_version_id": "memver-20260708084847-zdg9g", "created_at": "2026-07-08T08:48:47Z", "updated_at": "2026-07-08T08:48:47Z" } ``` # 第 6 步:检查 Memory Store 内容 应用后端可以直接读取 Memory Store 的内容,用于审计、向用户展示「我们记住了什么」,或做数据分析。列表接口只返回精简元信息;先从列表中取得 Memory ID,再查询单条 Memory 的完整正文: ```Bash memories=$(curl -sS --fail-with-body \ "$ARK_BASE_URL/memory_stores/$STORE_ID/memories" \ -H "Authorization: Bearer $ARK_API_KEY") MEMORY_ID=$(jq -r \ '.data[] | select(.type == "memory" and .path == "/user_preferences.md") | .id' \ <<<"$memories") if [[ -z "$MEMORY_ID" ]]; then echo "Memory not found" >&2 exit 1 fi curl -sS --fail-with-body \ "$ARK_BASE_URL/memory_stores/$STORE_ID/memories/$MEMORY_ID" \ -H "Authorization: Bearer $ARK_API_KEY" \ | jq '{path, content, updated_at}' ``` 响应示例: ``` { "path": "/user_preferences.md", "content": "# 用户偏好\n- 尺码:M\n- 颜色:大地色系\n- 预算:不超过 800 元\n- 材质:不接受动物皮革", "updated_at": "2026-07-08T08:48:47Z" } ``` # 第 7 步:再次访问,Agent 自主回忆 关闭原 Session,创建一个新的 Session,挂载同一个 Memory Store。观察 Agent 在完全新的会话里如何主动读取偏好——不问尺码、不问预算、不问颜色。 重复第 3 步创建新 Session(`resources` 保持不变),记录新的 `NEW_SESSION_ID`。继续使用辅助函数,让新一轮先建立事件流,再发送消息: ```Bash run_session_turn \ "$NEW_SESSION_ID" \ "最近有什么新款外套推荐?帮我看看有什么值得入手的。" ``` 事件流中可以看到 Agent 主动读取 Memory Store: ```Text agent.tool_use 读取已挂载的客户偏好 agent.tool_result 返回已保存的偏好内容 ``` Agent 读取到偏好后,会基于「M 码、大地色系、预算 ≤ 800 元、不接受动物皮革」直接给出符合条件的推荐,不再重复询问。 > **注意** > > Memory Store 采用工具访问语义,而不是把内容自动注入模型上下文。请在 Agent 的 System Prompt 中说明何时读取和更新记忆。`read_write` 会提供读写类 Memory 工具;如果设置为 `read_only`,Agent 只能浏览、读取和搜索,不能创建、修改、移动或删除 Memory。 # 进阶模式一:从已有数据预填 Memory Store 如果业务系统已经有客户画像(会员等级、历史订单、CRM 备注),可以在客户第一次进入 Agent 之前直接把已知信息写入 Memory Store,让 Agent 一开始就「认识」客户: ```Bash curl -X POST "$ARK_BASE_URL/memory_stores/$STORE_ID/memories" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "path": "/history.md", "content": "# 已知信息\n- 会员等级:Gold\n- 常购品类:户外服饰\n- 上次购买日期:2026-06-20\n- 常用支付:微信支付" }' ``` # 进阶模式二:组合每客户存储与共享存储 典型生产模式:一个 Session 同时挂载多个 Memory Store——一个客户私有(可读写)、一个品牌共享(只读): ```Bash curl -X POST "$ARK_BASE_URL/sessions" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d @- < # 进阶模式三:更新已有记忆 Agent 可能记错内容(例如把「过敏」记成「不喜欢」)。先查询对应的 Memory ID,再调用更新接口修改内容,无需删除原记录: ```Bash # ① 查出要更新的 memory_id MEMORY_ID=$(curl -sS "$ARK_BASE_URL/memory_stores/$STORE_ID/memories" \ -H "Authorization: Bearer $ARK_API_KEY" \ | jq -r '.data[] | select(.path=="/user_preferences.md") | .id') # ② 更新原记录 curl -X POST "$ARK_BASE_URL/memory_stores/$STORE_ID/memories/$MEMORY_ID" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "content": "# 用户购物偏好(更新后版本)\n- 尺码:M\n- 颜色偏好:大地色系(驼色、卡其、焦糖)\n- 预算:秋冬外套 ≤ 800 元\n- 材质禁忌:完全不接受动物皮革\n- 新增:严重花生过敏,请勿推荐相关周边食品\n- 可接受:人造革、仿麂皮" }' ``` # 第 8 步:清理资源 Demo 结束后,请按以下顺序清理资源,避免占用额度和留下测试数据: ```Bash # 1. 删除 Session(Environment 上如有 Session 未清,第 3 步会报 InvalidAction) curl -X DELETE "$ARK_BASE_URL/sessions/$SESSION_ID" \ -H "Authorization: Bearer $ARK_API_KEY" # 2. 删除 Agent(如不再复用) curl -X DELETE "$ARK_BASE_URL/agents/$AGENT_ID" \ -H "Authorization: Bearer $ARK_API_KEY" # 3. 删除 Environment(该环境下的所有 Session 必须先删完,否则会拒绝) curl -X DELETE "$ARK_BASE_URL/environments/$ENVIRONMENT_ID" \ -H "Authorization: Bearer $ARK_API_KEY" # 4. 删除 Memory Store curl -X DELETE "$ARK_BASE_URL/memory_stores/$STORE_ID" \ -H "Authorization: Bearer $ARK_API_KEY" ``` > **警告** > > 删除 Memory Store 不可恢复,操作前请确认该 Store 中的偏好数据已无长期保留价值。 --- # [进阶] 用多智能体团队生成定制销售提案 Source: https://ark.volcengine.com/region:cn-beijing/docs/build-multi-agent-proposal-team 本教程演示如何使用方舟 Managed Agents 的多智能体协作能力,编排一个协调器 Agent 与三个专家 Agent,端到端完成一份定制销售提案:调研目标客户所在行业的优先事项、挑选最相关的案例、依据内部规则生成定价方案,最终由协调器整合为可交付的 Markdown 提案。 # 场景说明 销售员工每接触一个新客户,都需要手动调研行业痛点、从案例库挑选相关成功案例、依据内部规则制定价格,再整合为一份定制提案。这些步骤各自需要不同的信息源和工具集,也存在依赖关系。 本教程用一个协调器 Agent 编排三个专家 Agent 完成这一流程: - 行业调研员(`prospect_researcher`):联网调研客户行业的优先事项与动态。 - 资料管理员(`case_study_picker`):从案例库中挑选 2 个最相关的成功案例。 - 方案定价员(`pricing_modeler`):基于内部规则表生成 2 至 3 个定价方案。 三个专家各自使用显式工具白名单:研究员只启用网页工具,资料管理员和定价员只启用文件读取工具。协调器读取产品说明后,把它们的产出组装成 `proposal.md`。 # 核心概念 | 对象 | 说明 | |-|-| | Sub-agent | 专家 Agent,只干一件事、只有必要工具。三个专家彼此不感知对方存在,全部由 Coordinator 调度 | | Coordinator | 协调器 Agent,负责编排 sub-agent 的调用顺序、传递上下文、组装最终产物;通过 `multiagent.type: coordinator` 声明 | | `send_to_parent` | Sub-agent 将结构化结果回传给 Coordinator 的内置能力 | | Session Resources | Session 挂载的文件资源,映射到沙箱 `/mnt/session/uploads/` 目录,供 Agent 在执行过程中访问 | # 工作流程 ![多智能体销售提案流程](https://arkdocs.tos-cn-beijing.volces.com/flowcharts/tutorials/new-202607241249.svg) # 前置条件 - 已开通方舟 Managed Agents 和目标模型服务。 - 已创建 API Key,详情请参见 [API Key 管理](/docs/manage-api-keys)。 - 本地已安装 `curl` 和 `jq`。 - 准备好资源文件:产品一页说明、定价规则、5 至 10 个成功案例(Markdown 格式)。 将 API Key 与 Base URL 配置为环境变量: ```Bash export ARK_API_KEY="你的 API Key" export ARK_BASE_URL="https://ark.cn-beijing.volces.com/api/v3" ``` # 第 1 步:设计 Sub-agent 的工具作用域 多智能体拆分的核心价值之一是权限隔离:每个 sub-agent 只保留完成其任务必需的工具。使用 `agent_toolset_20260916` 时,可以在 `configs` 数组里对单个工具设 `enabled: false` 关闭。 | Sub-agent | 工具作用域 | 收敛理由 | |-|-|-| | `prospect_researcher` | 仅启用 `web_search`、`web_fetch` | 执行联网调研,不提供文件与命令工具 | | `case_study_picker` | 仅启用 `read`、`glob`、`grep` | 读取 Session 已挂载的资料,不提供联网、命令或写入工具 | | `pricing_modeler` | 仅启用 `read`、`glob`、`grep` | 读取 Session 已挂载的定价资料,不提供联网、命令或写入工具 | > **注意** > > 工具白名单限制的是 Agent 可调用的工具,不提供目录级访问控制。资料管理员和定价员仍可读取当前 Session 挂载的其他文件。不要在同一个 Session 中挂载这两个角色不应看到的敏感文件。 # 第 2 步:创建三个专家 Agent ## 行业调研员 ```Bash curl -X POST "$ARK_BASE_URL/agents" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d @- <<'EOF' { "name": "prospect_researcher", "model": {"id": "doubao-seed-2-1-pro-260628"}, "system": "你是一位企业调研分析师。给定行业细分和企业规模,用 web_search / web_fetch 调研该细分市场的近期优先事项、痛点和动态。完成后通过 send_to_parent 返回结构化结果:{priorities, recent_moves, pain_points, sources}。", "tools": [ { "type": "agent_toolset_20260916", "default_config": { "enabled": false, "permission_policy": {"type": "always_allow"} }, "configs": [ {"name": "web_search", "enabled": true}, {"name": "web_fetch", "enabled": true} ] } ] } EOF ``` ## 资料管理员 ```Bash curl -X POST "$ARK_BASE_URL/agents" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d @- <<'EOF' { "name": "case_study_picker", "model": {"id": "doubao-seed-2-1-pro-260628"}, "system": "你是一位案例库管理员。给定行业和企业优先事项,从 /mnt/session/uploads/case_studies/ 中挑选 2 个最相关的案例,通过 send_to_parent 返回:{picks: [{file, customer, why_relevant}, ...]}。禁止访问其他目录。", "tools": [ { "type": "agent_toolset_20260916", "default_config": { "enabled": false, "permission_policy": {"type": "always_allow"} }, "configs": [ {"name": "read", "enabled": true}, {"name": "glob", "enabled": true}, {"name": "grep", "enabled": true} ] } ] } EOF ``` ## 方案定价员 ```Bash curl -X POST "$ARK_BASE_URL/agents" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d @- <<'EOF' { "name": "pricing_modeler", "model": {"id": "doubao-seed-2-1-pro-260628"}, "system": "你是一位定价建模师。基于 /mnt/session/uploads/pricing_rules.md 提供的规则,为给定席位数与用量层级生成 2 至 3 个定价选项:conservative(年付低单价)、flexible(月付高单价);若席位 > 500 增加 enterprise(含平台费)。通过 send_to_parent 返回:{options: [{name, structure, year_one_total}, ...]}。", "tools": [ { "type": "agent_toolset_20260916", "default_config": { "enabled": false, "permission_policy": {"type": "always_allow"} }, "configs": [ {"name": "read", "enabled": true}, {"name": "glob", "enabled": true}, {"name": "grep", "enabled": true} ] } ] } EOF ``` 三个专家均返回类似结构: ```json { "id": "agent-20260708162137-mzhwx", "type": "agent", "name": "prospect_researcher", "version": 1 } ``` 将返回的 `id` 分别记录为 `RESEARCHER_ID`、`PICKER_ID`、`PRICING_ID`。 ## `send_to_parent` 的契约设计 每个 sub-agent 必须在 System Prompt 里明确告诉它「完成后通过 `send_to_parent` 返回如下 JSON 结构」。契约越清晰,Coordinator 的下游拼装越可靠。以调研员为例: ``` { "priorities": ["cost reduction", "clinician burnout"], "recent_moves": ["merged with X in 2025-Q3"], "pain_points": ["fragmented ops between clinics and hospitals"], "sources": ["https://..."] } ``` # 第 3 步:上传工作素材 三个专家需要访问静态资料(案例库、产品说明、定价规则)。先通过 Files API 上传: ```Bash curl -X POST "$ARK_BASE_URL/files" \ -H "Authorization: Bearer $ARK_API_KEY" \ -F "file=@./product_one_pager.md" \ -F "purpose=agent" ``` 响应包含 `id`(`file-...`)与 `status`: ```json { "object": "file", "id": "file-20260708200926-txv7h", "purpose": "agent", "filename": "product_one_pager.md", "bytes": 123, "mime_type": "text/plain; charset=utf-8", "status": "active", "created_at": 1783512566, "expire_at": 1784117366 } ``` 建议一次上传的资料清单: - `product_one_pager.md`:产品一页说明。 - `pricing_rules.md`:内部定价规则表。 - `case_studies/*.md`:5 至 10 个成功案例。 分别记录为 `FILE_PRODUCT_ID`、`FILE_PRICING_ID`、`FILE_CASE1_ID` 等。 # 第 4 步:创建 Coordinator Coordinator 负责编排三个专家的调用顺序、把上下文在专家之间传递、最后组装产物。关键在于 `multiagent.type: coordinator` 字段。 ```Bash curl -X POST "$ARK_BASE_URL/agents" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d @- < # 第 5 步:创建 Environment 与 Session 创建 Environment: ```Bash curl -X POST "$ARK_BASE_URL/environments" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "name": "proposal-coordinator-env", "config": { "type": "cloud", "networking": {"type": "unrestricted"} } }' ``` 将返回的 `id` 记录为 `ENVIRONMENT_ID`。 创建 Session 并挂载资源: ```Bash curl -X POST "$ARK_BASE_URL/sessions" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d @- < **注意** > > 单个 Session 最多挂载 100 个文件。云环境当前要求 `networking.type=unrestricted`,该配置不提供网络隔离;本教程通过工具白名单确保只有行业调研员具备网页访问工具。不要为其他角色增加 `bash`、`web_search` 或 `web_fetch`。 ## 动态管理 Session 资源(可选) Session 创建后,还可以通过 Session Resources API 动态添加或查询挂载的文件资源,适合在多轮对话中根据需要补充上下文: ```Bash # 添加文件资源到已有 Session curl -X POST "$ARK_BASE_URL/sessions/$SESSION_ID/resources" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "type": "file", "file_id": "'"$FILE_ID"'" }' # 查询当前 Session 挂载的全部资源 curl "$ARK_BASE_URL/sessions/$SESSION_ID/resources" \ -H "Authorization: Bearer $ARK_API_KEY" ``` # 第 6 步:建立事件流并下发提案生成任务 先建立主线程 SSE 流并等待服务端返回 `: ready`,再向 Session 发送目标客户信息。协调器创建子线程后,以下函数会立即订阅对应的子线程 SSE;子线程流返回 `: ready` 后,函数会查询该线程的历史事件,补齐建连前已经产生的事件。主线程或子线程 SSE 断开时,函数会先建立替代流,再分页补查历史事件,并按事件 ID 去重。 ```Bash run_multi_agent_turn() ( local session_id="$1" local user_text="$2" local stream_dir local main_pipe="" local main_error local main_pid="" local main_stream_number=0 local main_stream_ready=false local seen_ids_file local thread_ids_file local child_pids_file local terminated_marker local events_payload local turn_done=false local result_code=1 local main_message_count=0 local reconnect_count=0 local max_reconnects="${ARK_MAX_SSE_RECONNECTS:-3}" local max_history_pages="${ARK_MAX_HISTORY_PAGES:-100}" local thread_ready_timeout="${ARK_THREAD_READY_TIMEOUT:-30}" local line local data : "${ARK_BASE_URL:?Set ARK_BASE_URL before calling run_multi_agent_turn}" : "${ARK_API_KEY:?Set ARK_API_KEY before calling run_multi_agent_turn}" : "${session_id:?Pass a Session ID as the first argument}" : "${user_text:?Pass a user message as the second argument}" command -v curl >/dev/null || { printf 'curl is required.\n' >&2 return 1 } command -v jq >/dev/null || { printf 'jq is required.\n' >&2 return 1 } [[ $max_reconnects =~ ^[0-9]+$ ]] || { printf 'ARK_MAX_SSE_RECONNECTS must be a non-negative integer.\n' >&2 return 1 } [[ $max_history_pages =~ ^[1-9][0-9]*$ ]] || { printf 'ARK_MAX_HISTORY_PAGES must be a positive integer.\n' >&2 return 1 } [[ $thread_ready_timeout =~ ^[1-9][0-9]*$ ]] || { printf 'ARK_THREAD_READY_TIMEOUT must be a positive integer.\n' >&2 return 1 } stream_dir=$(mktemp -d) || { printf 'Failed to create a temporary directory for SSE streams.\n' >&2 return 1 } main_error="$stream_dir/main-error.log" seen_ids_file="$stream_dir/seen-event-ids" thread_ids_file="$stream_dir/current-thread-ids" child_pids_file="$stream_dir/child-pids" terminated_marker="$stream_dir/thread-terminated" : >"$main_error" : >"$seen_ids_file" : >"$thread_ids_file" : >"$child_pids_file" acquire_lock() { local lock_dir="$1" while ! mkdir "$lock_dir" 2>/dev/null; do sleep 0.01 done } release_lock() { rmdir "$1" 2>/dev/null || true } remember_event_if_new() { local event_id="$1" local is_new=true [[ -n $event_id ]] || return 0 acquire_lock "$stream_dir/seen.lock" if grep -Fqx -- "$event_id" "$seen_ids_file"; then is_new=false else printf '%s\n' "$event_id" >>"$seen_ids_file" fi release_lock "$stream_dir/seen.lock" [[ $is_new == true ]] } emit_event() { local source="$1" local event_json="$2" local event_id event_id=$(jq -r '.id // empty' <<<"$event_json" 2>/dev/null || true) remember_event_if_new "$event_id" || return 0 acquire_lock "$stream_dir/output.lock" printf '[%s] %s\n' "$source" "$event_json" release_lock "$stream_dir/output.lock" } record_thread_id() { local thread_id="$1" acquire_lock "$stream_dir/threads.lock" if ! grep -Fqx -- "$thread_id" "$thread_ids_file"; then printf '%s\n' "$thread_id" >>"$thread_ids_file" fi release_lock "$stream_dir/threads.lock" } record_child_pid() { acquire_lock "$stream_dir/pids.lock" printf '%s\n' "$1" >>"$child_pids_file" release_lock "$stream_dir/pids.lock" } process_observed_event() { local source="$1" local event_json="$2" local event_type local child_thread_id event_type=$(jq -r '.type // empty' <<<"$event_json" 2>/dev/null || true) case "$event_type" in session.thread_created) child_thread_id=$(jq -r '.session_thread_id // empty' <<<"$event_json") if [[ -n $child_thread_id ]]; then start_thread_monitor "$child_thread_id" fi ;; session.thread_status_terminated) : >"$terminated_marker" ;; esac emit_event "$source" "$event_json" } read_thread_history() { local thread_id="$1" local source="$2" local page="" local page_count=0 local response local event_json while :; do page_count=$((page_count + 1)) if ((page_count > max_history_pages)); then printf 'Thread %s history exceeded %s pages.\n' \ "$thread_id" "$max_history_pages" >&2 return 1 fi if [[ -n $page ]]; then response=$(curl -sS --fail-with-body --get \ "$ARK_BASE_URL/sessions/$session_id/threads/$thread_id/events" \ -H "Authorization: Bearer $ARK_API_KEY" \ --data-urlencode "limit=200" \ --data-urlencode "order=asc" \ --data-urlencode "page=$page") || return 1 else response=$(curl -sS --fail-with-body --get \ "$ARK_BASE_URL/sessions/$session_id/threads/$thread_id/events" \ -H "Authorization: Bearer $ARK_API_KEY" \ --data-urlencode "limit=200" \ --data-urlencode "order=asc") || return 1 fi while IFS= read -r event_json; do [[ -n $event_json ]] || continue process_observed_event "$source" "$event_json" done < <(jq -c '.data[]?' <<<"$response") page=$(jq -r '.next_page // empty' <<<"$response") [[ -n $page ]] || return 0 done } monitor_thread() ( local thread_id="$1" local source="thread:$thread_id" local stream_pipe="" local stream_error="$stream_dir/thread-$thread_id-error.log" local stream_pid="" local stream_number=0 local stream_ready=false local thread_reconnect_count=0 local thread_line local thread_data stop_thread_stream() { exec 3<&- || true if [[ -n $stream_pid ]] && kill -0 "$stream_pid" 2>/dev/null; then kill "$stream_pid" 2>/dev/null || true fi if [[ -n $stream_pid ]]; then wait "$stream_pid" 2>/dev/null || true fi if [[ -n $stream_pipe ]]; then rm -f "$stream_pipe" fi stream_pid="" stream_pipe="" } fail_thread_monitor() { printf '%s\n' "$1" >"$stream_dir/thread-$thread_id.failed" return 1 } trap stop_thread_stream EXIT trap 'exit 0' INT TERM : >"$stream_error" while :; do stop_thread_stream stream_number=$((stream_number + 1)) stream_pipe="$stream_dir/thread-$thread_id-$stream_number.pipe" stream_ready=false if ! mkfifo "$stream_pipe"; then fail_thread_monitor "Failed to create the SSE pipe for thread $thread_id." return 1 fi curl -sS -N --fail-with-body --max-time 600 \ "$ARK_BASE_URL/sessions/$session_id/threads/$thread_id/stream" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Accept: text/event-stream" >"$stream_pipe" 2>>"$stream_error" & stream_pid=$! exec 3<"$stream_pipe" while IFS= read -r thread_line <&3; do thread_line=${thread_line%$'\r'} if [[ $thread_line == ": ready" ]]; then stream_ready=true break fi done if [[ $stream_ready != true ]]; then fail_thread_monitor "Thread $thread_id SSE closed before it was ready." return 1 fi # Thread streams have no replay, so recover history after the replacement # stream is ready. Shared event IDs suppress history/live duplicates. if ! read_thread_history "$thread_id" "$source"; then fail_thread_monitor "Failed to recover history for thread $thread_id." return 1 fi : >"$stream_dir/thread-$thread_id.ready" while IFS= read -r thread_line <&3; do thread_line=${thread_line%$'\r'} if [[ $thread_line == ": server draining, reconnect" ]]; then break fi [[ $thread_line == data:* ]] || continue thread_data=${thread_line#data:} thread_data=${thread_data# } process_observed_event "$source" "$thread_data" done if ((thread_reconnect_count >= max_reconnects)); then fail_thread_monitor \ "Thread $thread_id SSE reconnect limit was reached." return 1 fi thread_reconnect_count=$((thread_reconnect_count + 1)) printf '[%s] reconnecting SSE (%s/%s)\n' \ "$source" "$thread_reconnect_count" "$max_reconnects" >&2 done ) start_thread_monitor() { local thread_id="$1" local child_pid if [[ ! $thread_id =~ ^[A-Za-z0-9._-]+$ ]]; then printf 'Ignoring invalid thread ID: %s\n' "$thread_id" >&2 return 1 fi if mkdir "$stream_dir/thread-$thread_id.started" 2>/dev/null; then record_thread_id "$thread_id" monitor_thread "$thread_id" & child_pid=$! record_child_pid "$child_pid" fi } stop_main_stream() { exec 3<&- || true if [[ -n $main_pid ]] && kill -0 "$main_pid" 2>/dev/null; then kill "$main_pid" 2>/dev/null || true fi if [[ -n $main_pid ]]; then wait "$main_pid" 2>/dev/null || true fi if [[ -n $main_pipe ]]; then rm -f "$main_pipe" fi main_pid="" main_pipe="" } cleanup_streams() { local child_pid stop_main_stream if [[ -f $child_pids_file ]]; then while IFS= read -r child_pid; do [[ -n $child_pid ]] || continue if kill -0 "$child_pid" 2>/dev/null; then kill "$child_pid" 2>/dev/null || true fi done <"$child_pids_file" while IFS= read -r child_pid; do [[ -n $child_pid ]] || continue wait "$child_pid" 2>/dev/null || true done <"$child_pids_file" fi rm -rf "$stream_dir" } trap cleanup_streams EXIT start_main_stream() { stop_main_stream main_stream_number=$((main_stream_number + 1)) main_pipe="$stream_dir/main-$main_stream_number.pipe" main_stream_ready=false if ! mkfifo "$main_pipe"; then printf 'Failed to create the main SSE pipe.\n' >&2 return 1 fi curl -sS -N --fail-with-body --max-time 600 \ "$ARK_BASE_URL/sessions/$session_id/events/stream" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Accept: text/event-stream" >"$main_pipe" 2>>"$main_error" & main_pid=$! exec 3<"$main_pipe" while IFS= read -r line <&3; do line=${line%$'\r'} if [[ $line == ": ready" ]]; then main_stream_ready=true break fi done if [[ $main_stream_ready != true ]]; then printf 'Main SSE stream closed before it was ready.\n' >&2 if [[ -s $main_error ]]; then tail -n 1 "$main_error" >&2 fi return 1 fi } process_main_event() { local event_json="$1" local event_type local stop_reason local retry_status local pending_ids event_type=$(jq -r '.type // empty' <<<"$event_json" 2>/dev/null || true) case "$event_type" in agent.message) main_message_count=$((main_message_count + 1)) ;; session.error) retry_status=$(jq -r '.error.retry_status.type // empty' <<<"$event_json") case "$retry_status" in retrying) ;; exhausted) printf '[main] Session retries were exhausted.\n' >&2 ;; terminal) printf '[main] The Session cannot continue after this error.\n' >&2 ;; *) printf '[main] Unknown error retry status: %s\n' \ "$retry_status" >&2 result_code=4 turn_done=true ;; esac ;; session.status_idle) stop_reason=$(jq -r '.stop_reason.type // empty' <<<"$event_json") case "$stop_reason" in end_turn) if ((main_message_count == 0)); then printf 'The main thread ended without an agent.message event.\n' >&2 result_code=5 else result_code=0 fi turn_done=true ;; requires_action) pending_ids=$(jq -r \ '.stop_reason.event_ids // [] | join(",")' <<<"$event_json") printf '[main] requires_action: %s\n' "$pending_ids" >&2 result_code=2 turn_done=true ;; retries_exhausted) printf '[main] retries_exhausted\n' >&2 result_code=3 turn_done=true ;; *) printf 'Unknown session.status_idle stop_reason: %s\n' \ "$stop_reason" >&2 result_code=5 turn_done=true ;; esac ;; session.status_terminated) printf '[main] terminated\n' >&2 result_code=4 turn_done=true ;; esac process_observed_event "main" "$event_json" } read_main_history() { local mode="$1" local page="" local page_count=0 local response local event_json local event_id while :; do page_count=$((page_count + 1)) if ((page_count > max_history_pages)); then printf 'Main history exceeded %s pages.\n' "$max_history_pages" >&2 return 1 fi if [[ -n $page ]]; then response=$(curl -sS --fail-with-body --get \ "$ARK_BASE_URL/sessions/$session_id/events" \ -H "Authorization: Bearer $ARK_API_KEY" \ --data-urlencode "limit=200" \ --data-urlencode "order=asc" \ --data-urlencode "page=$page") || return 1 else response=$(curl -sS --fail-with-body --get \ "$ARK_BASE_URL/sessions/$session_id/events" \ -H "Authorization: Bearer $ARK_API_KEY" \ --data-urlencode "limit=200" \ --data-urlencode "order=asc") || return 1 fi while IFS= read -r event_json; do [[ -n $event_json ]] || continue if [[ $mode == "seed" ]]; then event_id=$(jq -r '.id // empty' <<<"$event_json") remember_event_if_new "$event_id" || true else process_main_event "$event_json" [[ $turn_done == true ]] && break fi done < <(jq -c '.data[]?' <<<"$response") [[ $turn_done == true ]] && return 0 page=$(jq -r '.next_page // empty' <<<"$response") [[ -n $page ]] || return 0 done } check_thread_monitor_failures() { local failure_file for failure_file in "$stream_dir"/thread-*.failed; do [[ -e $failure_file ]] || continue cat "$failure_file" >&2 return 1 done } wait_for_thread_monitors() { local elapsed=0 local all_ready local thread_id while ((elapsed < thread_ready_timeout)); do check_thread_monitor_failures || return 1 all_ready=true while IFS= read -r thread_id; do [[ -n $thread_id ]] || continue if [[ ! -f $stream_dir/thread-$thread_id.ready ]]; then all_ready=false break fi done <"$thread_ids_file" [[ $all_ready == true ]] && return 0 sleep 1 elapsed=$((elapsed + 1)) done printf 'Not all child-thread SSE streams became ready within %s seconds.\n' \ "$thread_ready_timeout" >&2 return 1 } verify_current_thread_states() { local page="" local page_count=0 local response local thread_json local thread_id local thread_status local observed_count=0 local listed_ids_file="$stream_dir/listed-current-thread-ids" : >"$listed_ids_file" while :; do page_count=$((page_count + 1)) if ((page_count > max_history_pages)); then printf 'Thread listing exceeded %s pages.\n' "$max_history_pages" >&2 return 1 fi if [[ -n $page ]]; then response=$(curl -sS --fail-with-body --get \ "$ARK_BASE_URL/sessions/$session_id/threads" \ -H "Authorization: Bearer $ARK_API_KEY" \ --data-urlencode "limit=1000" \ --data-urlencode "page=$page") || return 1 else response=$(curl -sS --fail-with-body --get \ "$ARK_BASE_URL/sessions/$session_id/threads" \ -H "Authorization: Bearer $ARK_API_KEY" \ --data-urlencode "limit=1000") || return 1 fi while IFS= read -r thread_json; do [[ -n $thread_json ]] || continue thread_id=$(jq -r '.id // empty' <<<"$thread_json") grep -Fqx -- "$thread_id" "$thread_ids_file" || continue observed_count=$((observed_count + 1)) printf '%s\n' "$thread_id" >>"$listed_ids_file" thread_status=$(jq -r '.status // empty' <<<"$thread_json") printf '[thread-state] %s\n' "$thread_json" case "$thread_status" in idle) ;; running | rescheduling) printf 'Thread %s is still %s.\n' \ "$thread_id" "$thread_status" >&2 return 1 ;; terminated) printf 'Thread %s was terminated.\n' "$thread_id" >&2 return 1 ;; *) printf 'Thread %s returned unknown status: %s\n' \ "$thread_id" "$thread_status" >&2 return 1 ;; esac done < <(jq -c '.data[]?' <<<"$response") page=$(jq -r '.next_page // empty' <<<"$response") [[ -n $page ]] || break done if [[ ! -s $thread_ids_file ]]; then printf 'No child thread was created for this multi-agent turn.\n' >&2 return 1 fi while IFS= read -r thread_id; do [[ -n $thread_id ]] || continue if ! grep -Fqx -- "$thread_id" "$listed_ids_file"; then printf 'Thread %s was observed in events but not in the thread list.\n' \ "$thread_id" >&2 return 1 fi done <"$thread_ids_file" ((observed_count > 0)) } if ! start_main_stream; then return 1 fi # Seed existing main-thread event IDs before sending the new turn. if ! read_main_history seed; then printf 'Failed to read main-thread history before sending the message.\n' >&2 return 1 fi events_payload=$(jq -n --arg text "$user_text" \ '{events: [{type: "user.message", content: [{type: "text", text: $text}]}]}') curl -sS --fail-with-body \ "$ARK_BASE_URL/sessions/$session_id/events" \ -H "Authorization: Bearer $ARK_API_KEY" \ -H "Content-Type: application/json" \ -d "$events_payload" >/dev/null || return 1 while [[ $turn_done != true ]]; do while IFS= read -r line <&3; do line=${line%$'\r'} if [[ $line == ": server draining, reconnect" ]]; then break fi [[ $line == data:* ]] || continue data=${line#data:} data=${data# } process_main_event "$data" [[ $turn_done == true ]] && break done [[ $turn_done == true ]] && break check_thread_monitor_failures || return 1 if ((reconnect_count >= max_reconnects)); then printf 'Main SSE reconnect limit was reached before the turn finished.\n' >&2 return 1 fi reconnect_count=$((reconnect_count + 1)) printf '[main] reconnecting SSE and recovering history (%s/%s)\n' \ "$reconnect_count" "$max_reconnects" >&2 # Open the replacement stream first, then recover the disconnect window. if ! start_main_stream; then return 1 fi if ! read_main_history recover; then printf 'Failed to recover main-thread history after reconnecting.\n' >&2 return 1 fi done ((result_code == 0)) || return "$result_code" wait_for_thread_monitors || return 6 check_thread_monitor_failures || return 6 if [[ -f $terminated_marker ]]; then printf 'A child thread emitted session.thread_status_terminated.\n' >&2 return 6 fi verify_current_thread_states || return 6 return 0 ) ``` ```Bash proposal_request=$(cat <<'EOF' 请为以下潜在客户生成一份定制销售提案: - 客户名称:Meridian Health - 行业:Regional healthcare system - 员工规模:8,500 - 预计席位:600 - 用量层级:Heavy EOF ) run_multi_agent_turn "$SESSION_ID" "$proposal_request" ``` 函数只有在以下条件全部满足时才返回成功: - 主线程产生至少一条 `agent.message`。 - Session 以 `session.status_idle` 且 `stop_reason.type=end_turn` 结束。 - 本轮创建的子线程都处于 `idle`,没有子线程停留在 `running` 或 `rescheduling`。 - 本轮没有出现 `session.thread_status_terminated`。 # 第 7 步:观察多智能体事件流 第 6 步的函数会为主线程事件添加 `[main]` 前缀,为子线程事件添加 `[thread:]` 前缀。主线程与各子线程使用独立事件流,客户端不能依赖不同事件流之间的全局到达顺序,应通过 `session_thread_id`、`from_session_thread_id` 和 `to_session_thread_id` 关联事件。 | 事件类型 | 发生时机 | 观察位置 | 可读取字段 | |-|-|-|-| | `session.thread_created` | Coordinator 创建 sub-agent 子线程时 | 主线程 | `agent_name`、`session_thread_id` | | `agent.thread_message_sent` | 当前线程向另一个线程发送消息时 | 发送方线程 | `content`、`to_session_thread_id` | | `agent.thread_message_received` | 当前线程收到另一个线程的消息时 | 接收方线程 | `content`、`from_session_thread_id` | | `session.thread_status_running` | Sub-agent 开始运行时 | 主线程或对应子线程 | `agent_name`、`session_thread_id` | | `session.thread_status_idle` | 单个 sub-agent 暂停或结束时 | 主线程或对应子线程 | `agent_name`、`session_thread_id`、`stop_reason` | | `agent.tool_use` / `agent.tool_result` | Agent 调用工具及返回结果时 | 触发调用的线程 | `name`、`input`、`session_thread_id` | | `span.model_request_start` / `span.model_request_end` | 单次模型请求起止时 | 发起请求的线程 | 仅 `span.model_request_end` 携带 `model_usage`,包含输入、输出和缓存 token 用量;`span.model_request_start` 不携带该字段 | | `session.status_idle` | 整个 Session 回合结束或等待客户端操作时 | 主线程 | `stop_reason` | 典型事件序列如下(省略中间字段),可以看到并行 spawn 与串行依赖的调度过程: ```Text # 阶段 1:Coordinator 思考并决定调度 agent.thinking agent.message "我将并行调度研究员和定价专家..." # 阶段 2:并行 spawn 前两个 sub-agent session.thread_created agent_name = prospect_researcher agent.thread_message_sent "请调研区域医疗系统..." session.thread_status_running prospect_researcher session.thread_created agent_name = pricing_modeler agent.thread_message_sent "席位 600、Heavy 用量..." session.thread_status_running pricing_modeler # 阶段 3:两个 sub-agent 并行工作(事件交织) agent.tool_use name = web_search (researcher 线程) agent.tool_result agent.tool_use name = web_fetch (researcher 线程) agent.tool_result agent.tool_use name = read (pricing 线程) agent.tool_result # 阶段 4:sub-agent 陆续回传结果 agent.thread_message_sent {options: [...]} (pricing 结果) session.thread_status_idle agent_name = pricing_modeler agent.thread_message_sent {priorities: [...]} (researcher 结果) session.thread_status_idle agent_name = prospect_researcher # 阶段 5:串行 spawn 第三个 sub-agent session.thread_created agent_name = case_study_picker agent.thread_message_sent "行业:..., priorities:[...]" session.thread_status_running case_study_picker agent.tool_use name = bash / read (picker 线程) agent.tool_result agent.thread_message_sent {picks: [...]} session.thread_status_idle agent_name = case_study_picker # 阶段 6:Coordinator 整合所有信息,输出最终提案 agent.tool_use name = write, file_path = /mnt/session/outputs/proposal.md agent.tool_result agent.message "# 定制销售提案 ..." # 阶段 7:整个 Session 正常结束 session.status_idle stop_reason.type = end_turn ``` 观察要点: - 研究员和定价员并行启动——它们的输入互不依赖。 - 资料管理员等研究员产出后才启动——需要 `priorities` 作为选案例的依据。 - `session.status_idle` 只有在 `stop_reason.type=end_turn` 时才表示本轮正常结束;`requires_action` 和 `retries_exhausted` 需要进入对应处理分支。 - 这种「并行 + 串行」的调度由 Coordinator 的 System Prompt 驱动,无需在业务代码中写死专家调用顺序。 # 第 8 步:取回最终提案 Coordinator 将最终产物写入 `/mnt/session/outputs/proposal.md`。通过 Files API 按 Session 查询产物: ```Bash curl "$ARK_BASE_URL/files?scope_id=$SESSION_ID" \ -H "Authorization: Bearer $ARK_API_KEY" | jq '.data[]? | {id, filename, bytes, status}' ``` 生成的 Markdown 文件可以通过控制台下载到本地或转存到持久化存储。 # 何时选择多智能体拆分 一个带全部工具的单一 Agent 理论上也能完成本教程的任务。拆分为多个专家 + 一个协调器,主要价值在于三点: - 权限隔离:每个 sub-agent 只保留完成任务所需的工具,缩小事故影响范围。 - 上下文经济:案例库可能有几百个文件,让它们只出现在资料管理员的上下文中,不污染 Coordinator 的主上下文。 - 编排清晰:Coordinator 只做「派谁去干什么」的决策,不掺和专家的具体工作,可维护性更高。 推荐拆分与不推荐拆分的场景对照: | 场景特征 | 是否推荐拆分 | 说明 | |-|-|-| | 任务的各环节需要不同的工具集(联网 vs 只读文件) | 推荐 | 权限隔离价值最高 | | 某个环节需要读取大量文档,读完就丢 | 推荐 | 避免污染主上下文 | | 某些环节可以并行完成 | 推荐 | Coordinator 会自然并行调度 | | 任务简单、单一工具就能完成 | 不推荐 | 引入不必要的复杂度 | --- # [进阶] 使用 arkcli 构建集成 Vault 与 Memory 的投研 Agent Source: https://ark.volcengine.com/region:cn-beijing/docs/build-investment-research-agent-with-arkcli 本教程演示如何使用官方命令行工具 **arkcli** 构建一个具备 **MCP 直连取数、Vault 密钥托管、Memory 长期记忆** 三项能力的投研 Agent。教程以 Wind 行情 MCP 为例,完整走一遍从「安装登录 → 创建资源 → 下发任务 → 观测执行 → 取回报告 → 清理资源」的闭环。 # 场景说明 投研场景有一个典型诉求:分析师希望 AI 助手「懂行情、懂我」。「懂行情」意味着行情、财务等结构化数据必须使用专业数据源;「懂我」意味着助手要记住用户的关注板块、输出格式等长期偏好,不必每次对话重复交代。 这两个诉求恰好对应 Managed Agents 的两项进阶能力: - Vault 让第三方数据服务的密钥托管在平台侧、按 MCP 服务地址自动注入鉴权,密钥全程不进沙箱。 - Memory Store 让用户偏好以文件形式挂载到每个会话,Agent 在执行前先读取并遵循。 | 环节 | 内容 | |-|-| | 输入 | 一句自然语言任务,例如「查询贵州茅台最新行情,按我的偏好写一份简评」 | | 过程 | Agent 读取挂载的记忆文件,调用 Wind MCP 工具取行情(鉴权由 Vault 注入),按偏好撰写报告 | | 输出 | `report.md`,结论先行、关键数据用表格、风险提示单独成段(这些约定全部来自记忆文件)| | 观测 | `arkcli +tail` 或 `events list` 查看 Agent 消息、工具调用与状态变化 | # 你将完成什么 - 安装并登录 arkcli,理解控制面与数据面的认证边界。 - 创建 Environment。 - 创建 Vault 并托管 Wind 密钥(`static_bearer` 凭据)。 - 创建 Memory Store 并写入一条用户偏好。 - 创建挂载 Wind MCP 的投研 Agent。 - 创建 Session 并一次性挂上 Vault 与 Memory。 - 下发任务、通过事件流观测执行、取回报告文件。 - 按精确 ID 清理本次创建的全部资源。 # 核心概念 | 对象 | 说明 | |-|-| | Agent | 可版本化、可复用的配置模板,封装模型、System Prompt、工具集与 MCP 连接 | | Environment | Agent 运行所在的云沙箱定义,决定网络策略与预装依赖,一次创建多次复用 | | Session | 一次具体的运行实例,把 Agent、Environment、Vault 和 Memory 等资源绑在一起 | | Event | Session 内的追加式事件流:用 `user.message` 下发任务,实时收到消息、工具调用与状态变化 | | Vault | 平台侧密钥保管库。`static_bearer` 凭据按 MCP 服务 URL 匹配注入 Bearer 鉴权,密钥不进沙箱 | | Memory Store | 跨会话长期记忆库。Agent 可以根据挂载权限读取或修改其中的内容 | # 工作流程 ![arkcli 投研 Agent 流程](https://arkdocs.tos-cn-beijing.volces.com/flowcharts/tutorials/new-202607241250.svg) # 前置条件 - 已开通方舟 Managed Agents 与目标模型服务。 - 已创建方舟 API Key,详情请参见 [API Key 管理](/docs/manage-api-keys)。 - 已获取 Wind API Key([aifinmarket.wind.com.cn](https://aifinmarket.wind.com.cn),按积分计费)。 - 本地已安装 Node.js(用于 npm 安装 arkcli)。 # 第 1 步:安装并登录 arkcli ```Bash npm i @volcengine/ark-cli -g --registry https://registry.npmjs.org arkcli --version arkcli auth login volc-sso # 浏览器完成火山账号授权 arkcli auth status --format json ``` > **注意** > > arkcli 创建和管理 Agent、Environment、Session、Vault、Memory Store 前,必须先完成火山账号 SSO 登录;`events`、`files`、`+tail` 等运行时命令使用方舟 API Key。使用 `curl` 调用本文涉及的 REST API 时,使用方舟 API Key 鉴权。 > **注意** > > 如果账号装过 Agent Plan 套餐,其 profile 的 `base_url` 是 `/api/plan/v3`,数据面命令会返回 404。使用 `arkcli profile list` 查看,并在命令前加 `--profile <按量 profile 名>` 切到控制台按量 profile。 # 第 2 步:创建 Environment Environment 定义 Agent 的云沙箱:网络策略、预装依赖等。创建一次可长期复用,本示例无需额外 pip 依赖: ```Bash arkcli agent env create \ --name "cookbook-invest-env" \ --config '{Type: cloud, Networking: {Type: unrestricted}}' \ --format json --transform "Result.Id" # 输出示例:env-20260716132305-xxxxx ``` > **注意** > > 线上创建 `cloud` 类型环境必须显式携带 `Networking` 配置。仅传 `{Type: cloud}` 会被后端校验拒绝,报错 `config.networking` 缺失。 将返回的 ID 记录为 `ENVIRONMENT_ID`。 > **说明** > > 本示例创建的 Environment 未配置产物存储,因此报告使用方舟公共 TOS。需要将报告长期保存在自己的 TOS Bucket 时,通过控制台或 Environment API 配置 `config.tos`,详情请参见 [配置产物存储](/docs/configure-cloud-environment#configure-output-storage)。 # 第 3 步:创建 Vault 并写入 Wind 凭据 Wind 提供多个 MCP 数据服务,地址形如 `https://mcp.wind.com.cn/vserver_/mcp/`,以 Bearer Key 鉴权。传统做法是把 Key 写进环境变量带入沙箱,泄漏面较大。Managed Agents 的做法是:把 Key 存成 Vault 里的 `static_bearer` 凭据,Session 挂载该 Vault 后,平台在连接对应 MCP URL 时自动注入 Bearer 鉴权。密钥全程不进沙箱、不进提示词、不进事件流。 创建 Vault: ```Bash arkcli agent vault create --display-name "cookbook-wind-vault" \ --format json --transform "Result.Id" # 输出示例:vlt-20260716132312-xxxxx ``` 写入 `static_bearer` 凭据(以股票行情服务为例)。以下命令通过无回显输入读取 Wind API Key,再使用 `@file` 将密钥交给 ArkCLI: ```bash old_umask=$(umask) umask 077 WIND_KEY_FILE=$(mktemp) umask "$old_umask" trap 'rm -f "$WIND_KEY_FILE"' EXIT IFS= read -r -s -p "Wind API Key: " WIND_API_KEY printf '\n' printf '%s' "$WIND_API_KEY" >"$WIND_KEY_FILE" unset WIND_API_KEY CREDENTIAL_ID=$(arkcli agent vault credentials create "$VAULT_ID" \ --display-name "wind_stock_data" \ --auth-type static_bearer \ --mcp-server-url "https://mcp.wind.com.cn/vserver_stock_data/mcp/" \ --token "@$WIND_KEY_FILE" \ --format json \ --transform "Result.Id") export CREDENTIAL_ID rm -f "$WIND_KEY_FILE" trap - EXIT printf 'Credential ID: %s\n' "$CREDENTIAL_ID" ``` API Key 不会出现在命令行参数、Shell 历史或 ArkCLI 结构化输出中。脚本只在请求期间保留权限为 `600` 的临时文件,并在结束时删除。 > **说明** > > 创建凭据时平台会立即对目标 MCP 服务做握手探测。创建成功(返回 `vcrd-` 开头的凭据 ID)即代表 Key 有效,等于免费得到一次同步校验。 > **说明** > > 生产使用建议给每个需要的 Wind MCP 服务各建一条凭据(每条对应一个 `mcp_server_url`),Agent 即可全域取数。本教程为保持最小可跑通,只挂股票行情服务 `vserver_stock_data`。 # 第 4 步:创建 Memory Store 并写入用户偏好 ```Bash arkcli agent memory-store create \ --name "cookbook-user-memory" \ --description "投研偏好与输出约定" \ --format json --transform "Result.Id" # 输出示例:memstore-20260716132317-xxxxx arkcli agent memory-store memories create $STORE_ID \ --path "/投研偏好.md" \ --content "# 用户投研偏好 - 长期关注:白酒、半导体行业 - 输出格式:结论先行,正文不超过 300 字,关键数据用表格 - 风险提示必须单独成段" \ --format json ``` > **注意** > > Memory Store 的内容不会自动注入模型上下文。请在 System Prompt 中明确要求 Agent 在开始任务前读取已挂载的投研偏好。 # 第 5 步:创建投研 Agent 并挂载 Wind MCP 挂 MCP 需要两处配置成对出现:`McpServers` 声明连接(名称 + URL),`Tools` 里的 `mcp_toolset` 按名称放行该服务的工具。System Prompt 写清三条规则:优先用 MCP 取数、先读记忆、标注数据来源。 将请求体写入 `cookbook-agent.json`: ```json { "Name": "cookbook投研分析师", "Description": "Wind MCP + Memory 演示用投研 Agent", "Model": {"Id": "doubao-seed-2-1-pro-260628", "Speed": "standard"}, "System": "你是一名 A 股投研分析师。规则:1) 行情、财务等结构化数据必须优先调用 wind_stock_data MCP 工具获取,单次调用单标的,日期格式 yyyyMMdd;2) 开始任务前使用 Memory 工具浏览已挂载的记忆库,读取其中的投研偏好文件,并严格遵循偏好与输出约定;3) 引用 Wind 数据时标注来源。", "McpServers": [ { "Type": "url", "Name": "wind_stock_data", "Url": "https://mcp.wind.com.cn/vserver_stock_data/mcp/" } ], "Tools": [ { "Type": "agent_toolset_20260916", "Name": "agent_toolset_20260916", "DefaultConfig": {"Enabled": true, "PermissionPolicy": {"Type": "always_allow"}} }, { "Type": "mcp_toolset", "McpServerName": "wind_stock_data", "DefaultConfig": {"PermissionPolicy": {"Type": "always_allow"}} } ] } ``` 提交请求: ```Bash arkcli agent agent create --file cookbook-agent.json \ --format json --transform "Result.Id" # 输出示例:agent-20260716132811-xxxxx ``` > **注意** > > 复杂配置建议整体走 `--file` 传 JSON 请求体,字段使用 arkcli 接受的 PascalCase。`--tool @文件名` 这种单参数文件引用语法不可用,会报 YAML 解析错误。 > **注意** > > `McpServers[].Name` 必须与 `mcp_toolset.McpServerName` 逐字一致;Vault 凭据则按 `mcp_server_url` 与这里的 `Url` 匹配注入。三处对齐,鉴权才能生效。 > **注意** > > `agent_toolset_20260916` 是内置工具集(`bash` / `read` / `write` / `edit` / `glob` / `grep` / `web_fetch` / `web_search`)。`Tools` 字段是全量替换语义:只要显式传了 `Tools`,就必须把内置工具集和 `mcp_toolset` 放在同一个数组里,否则 Agent 会失去内置工具。 将返回的 ID 记录为 `AGENT_ID`。 # 第 6 步:创建 Session 并一次挂上 Vault 与 Memory ```Bash arkcli agent session create \ --agent-id $AGENT_ID \ --environment-id $ENVIRONMENT_ID \ --vault-ids $VAULT_ID \ --resource '[{"Type": "memory_store", "MemoryStoreId": "'"$STORE_ID"'", "Access": "read_only"}]' \ --title "cookbook-invest-session" \ --format json # 输出示例:sesn-20260716132851-xxxxx ``` > **注意** > > `--resource` 里的字段名必须使用 PascalCase(`MemoryStoreId`)。写成 snake_case(`memory_store_id`)字段会被静默丢弃,报错 `resources[0].memory_store_id is required`——报错信息用的是 snake_case,容易造成混淆。 将返回的 ID 记录为 `SESSION_ID`。 # 第 7 步:下发投研任务并持续接收事件 Session 创建后处于就绪状态,不会自动执行任务。使用 `--stream` 发送 `user.message`,让 ArkCLI 在同一条命令中持续接收事件,并通过事件位置补偿发送与建连之间的事件: ```Bash arkcli agent session events send $SESSION_ID \ --type user.message \ --text "查询贵州茅台(600519.SH)最新行情数据,并按我的偏好写一份简评,保存为 /mnt/session/outputs/report.md" \ --stream \ --no-event-deltas \ --format json ``` 不要先执行不带等待参数的 `events send`,再单独启动 `+tail`。两个命令之间存在监听空窗,容易让终端漏掉任务开始阶段的事件。 # 第 8 步:回查执行过程 ## 方式一:继续观察已有 Session ```Bash arkcli +tail $SESSION_ID ``` 第 7 步的 `--stream` 已覆盖本轮实时观测。只有需要在另一个终端继续观察已有 Session 时,才使用 `+tail`。 ## 方式二:结构化拉取历史事件 ```Bash arkcli agent session events list $SESSION_ID --limit 100 --format json ``` 主要事件类型: | 事件类型 | 含义 | |-|-| | `agent.thinking` | Agent 思考中(信号级事件) | | `agent.tool_use` / `agent.tool_result` | 内置工具调用与结果(`bash`、`read`、`write` 等) | | `agent.mcp_tool_use` / `agent.mcp_tool_result` | MCP 工具调用与结果,观察 Wind 取数就看它 | | `agent.message` | Agent 返回的文本消息 | | `span.model_request_start` / `span.model_request_end` | 一次模型请求的起止,`end` 携带 token 用量 | | `session.status_idle` | 本轮任务结束 | 一次成功任务的典型事件轨迹: ```Text user.message 查询贵州茅台最新行情,按我的偏好写一份简评 agent.tool_use 读取已挂载的投研偏好 agent.tool_result 返回已保存的偏好内容 agent.mcp_tool_use wind_stock_data/get_stock_price_indicators -- Wind 取数(Vault 注入鉴权) agent.mcp_tool_use wind_stock_data/get_stock_price_indicators agent.tool_use write: /mnt/session/outputs/report.md -- 按偏好写入报告 agent.message 已按你的投研偏好完成,保存至 /mnt/session/outputs/report.md session.status_idle ``` > **说明** > > 若 `--stream`、`+tail` 或 `events stream` 出现 awaiting headers 超时,不影响任务在云端执行,改用 `events list` 轮询同一个 Session,避免重复发送原任务。 # 第 9 步:取回分析报告 Agent 写入沙箱的产物会自动登记到 Files API,按 Session 维度可查: ```Bash arkcli agent file list \ --session-id $SESSION_ID \ --purpose agent \ --format json # 返回示例:{"filename": "report.md", "id": "file-20260716213008-xxxxx", "bytes": 1341, "status": "active"} ``` > **注意** > > `file list` 默认按 `--purpose user_data` 过滤,而 Agent 生成的产物 `purpose` 是 `agent`。不带 `--purpose agent` 参数会得到空列表,误以为没有产物。 文件可以在方舟控制台对应 Session 页下载。本示例使用方舟公共 TOS,你需要在平台 TTL 到期前下载报告。需要长期保留报告时,为 Environment 配置自己的 TOS Bucket,并在 TOS 中管理对象生命周期。 # 第 10 步:清理资源 确认报告已转存后,按依赖顺序清理本次创建的资源。Agent 与 Environment 通常留作复用,本教程为演示做完整清理: ```Bash arkcli agent session delete $SESSION_ID --yes arkcli agent vault credentials delete $VAULT_ID $CREDENTIAL_ID --yes arkcli agent vault delete $VAULT_ID --yes arkcli agent memory-store delete $STORE_ID --yes arkcli agent agent delete $AGENT_ID --yes arkcli agent env delete $ENVIRONMENT_ID --yes ``` > **警告** > > 只删除本次创建、且记录了精确 ID 的资源。切勿按名称模糊匹配批量删除——企业账号下的资源可能被多人或多系统共享,误删不可恢复。删除类命令在非交互环境(脚本或 CI)中不带 `--yes` 时会返回 `requires_confirmation` 而不执行,这是有意的安全设计。 # 完整执行顺序 1. 安装 arkcli 并完成 `arkcli auth login volc-sso`(控制面需 SSO,数据面用 API Key)。 2. 创建 Environment(显式带 `Networking`)。 3. 创建 Vault,写入 Wind 的 `static_bearer` 凭据(创建即校验 Key)。 4. 创建 Memory Store,写入用户偏好文件。 5. 用 `--file` 传 PascalCase 请求体创建 Agent(内置工具集 + `mcp_toolset` 同数组)。 6. 创建 Session:`--vault-ids` 挂 Vault,`--resource`(PascalCase)以 `read_only` 权限挂载 Memory。 7. 使用 `events send --stream` 下发 `user.message`,持续观测到 `session.status_idle`。 8. 需要恢复观测时,使用 `+tail` 或 `events list` 回查同一个 Session。 9. `file list --session-id ... --purpose agent` 取回产物并转存。 10. 按精确 ID 清理临时资源。 # 进阶方向 - 全域数据:给需要的 MCP 服务各建一条 Vault 凭据并全部挂到 Agent,覆盖更多数据面。 - 领域技能:把 MCP 路由规则、参数契约、指标词典打包成自定义 Skill(`arkcli agent skill create --zip`)挂给 Agent,取数精准度更高。 - 多智能体:通过 `Multiagent` 配置把个股研究员、行业分析师、宏观经济学家组成 coordinator 协作团队,详情请参见 [用多智能体团队生成定制销售提案](/docs/build-multi-agent-proposal-team)。 - 工程化:应用后端可以按需改用对应 REST API,配合调度器与推送渠道构建完整投研平台。 > **注意** > > 方舟按 token、沙箱时长与工具调用计费,第三方 MCP 服务按其自身计费策略结算。单次复杂投研任务可消耗数十万 input tokens,请留意用量。所有产出仅供参考,不构成投资建议。 --- # 快速入门(新手版) Source: https://ark.volcengine.com/region:cn-beijing/docs/quick-start-beginner 本教程专为**零基础用户**设计,无需安装任何编程环境(如 Python),直接使用操作系统内置工具即可体验方舟大模型服务。 ## 1. 准备工作 在开始之前,请确保您已经完成以下准备: 1. **注册账号**:确保您拥有火山引擎账号并已 [登录](https://console.volcengine.com/)。 2. **获取 API Key**: * 访问 [API Key 管理页面](https://ark.volcengine.com/region:cn-beijing/apikey)。 * 点击“创建 API Key”,并复制保存您的 Key。 > **注意** > > 请妥善保管您的 API Key,不要泄露给他人。 > 当前脚本兼容历史 UUID 格式以及新格式 `ark--` 的 Key。 3. **开通模型(可选)**:所有新用户可使用免费额度体验模型服务。如额度使用完毕需要 [开通模型](https://ark.volcengine.com/region:cn-beijing/openManagement),以继续使用方舟模型服务。 > **注意** > > 开通 Seedance 2.0 模型,需要保证账户余额超过 200元或者购买资源包,详细请参见[Doubao Seedance 2.0 系列教程](/docs/seedance-2-0)。 4. 下载并解压文件:点击下载下方附件,将其解压到您的本地目录(如桌面或"下载"文件夹)。 [ark_quickstart_package.zip](https://arkdocs.tos-cn-beijing.volces.com/files/tutorials/ark_quickstart_package_arkruntime-20260909.zip) ## 2. 一键体验模型服务(零门槛) 打开我们为您准备的文件。请根据您的操作系统选择对应的操作。 ### Windows 用户 **适用系统**:Windows 7 SP1 及以上(推荐 Windows 10/11) 1. 找到项目文件夹中的 `scripts/zero_dependency/windows` 目录。 2. 双击运行 **`run_windows.bat`** 文件。 > 提示:如果这是您第一次运行,可能会弹出权限询问窗口,请输入 `Y` 或允许运行。 3. 脚本会自动启动 PowerShell 环境。 4. 根据提示输入您的 **API Key** 并回车。 5. 稍等片刻,您将看到 AI 的回复内容。 ### macOS 用户 **适用系统**:macOS 10.15及以上版本 1. 找到项目文件夹中的 `scripts/zero_dependency/mac` 目录。 2. 双击运行 **`quickstart.sh`** 文件。 > 提示:如果系统提示“无法打开,因为它来自未验证的开发者” > 1. 按住 `Control` 键点击文件,选择“打开”,然后在弹出的对话框中再次点击“打开”。 > 2. 如果还是无法打开,直接在终端窗口运行脚本。可以打开终端(terminal),将 quickstart.sh 拖入窗口,回车运行。 3. 终端窗口会自动打开。 4. 根据提示输入您的 **API Key** 并回车。 5. 等待片刻,您将看到 AI 的回复内容。 ### 运行说明 当您看到“调用成功”时,说明您已经完成了第一次 API 调用。 脚本自动完成了以下步骤: 1. **构造请求**:按照方舟平台的规范,打包了一段问候语:“你好!请用一句话介绍一下你自己。” 2. **发送请求**:使用系统自带的网络工具(Windows 的 PowerShell 或 Mac 的 Curl)向方舟服务器发送消息。 3. **解析回复**:自动处理服务器返回的数据,并提取出 AI 生成的文本展示给您。 ## 3. 一键搭建开发环境 如果您已经成功体验了 API 调用,并希望开始真正的 Python 编程开发,但又不想被复杂的环境配置(Python 版本、pip、虚拟环境)所困扰,请尝试我们的**自动化环境构建工具**。 我们将使用轻量、快速的现代化 Python 包管理器 `uv`(无需预安装Python即可使用),为您在项目内部自动下载并配置一个隔离的、纯净的、标准的 Python 开发环境,完全不会干扰您系统中已有的Python配置。 ### Windows 用户 1. 进入 `scripts/init_dev_env` 目录。 2. 双击运行 **`setup_windows.bat`**。 3. 脚本会自动执行以下操作: * 下载 `uv` 工具。 * 自动下载 Python 3.12(如果不干扰您的系统 Python)。 * 创建虚拟环境 `.venv`。 * 安装方舟 SDK。 4. 完成后,在项目根目录会生成一个 `run_demo.bat`。 5. 双击 `run_demo.bat`,即可运行标准的 Python SDK 示例代码 (`python/``demo_standard.py`)。 6. 如果您希望按需生成 Python 示例脚本,可运行: ```Bash .venv/bin/python python/gen_example.py ``` Windows 用户请运行: ```Bash .venv\Scripts\python python/gen_example.py ``` 生成器支持多选示例类型、修改默认 Model ID,并可在缺少 `ARK_API_KEY` 时提示输入并选择写入项目根目录 `.env`。 ### macOS 用户 1. 打开终端,进入 `scripts/init_dev_env` 目录。 2. 运行构建脚本: ```Bash ./setup_mac.sh ``` 3. 脚本会自动配置好所有环境。 4. 完成后,在项目根目录会生成一个 `run_demo.sh`。 5. 运行 `./run_demo.sh` 即可体验标准开发流程。 6. 如果您希望按需生成 Python 示例脚本,可运行: ```Bash .venv/bin/python python/gen_example.py ``` 生成器支持多选示例类型、修改默认 Model ID,并可在缺少 `ARK_API_KEY` 时提示输入并选择写入项目根目录 `.env`。 ### 运行说明 当您运行 `setup_windows.bat` 或 `setup_mac.sh` 后,您的项目文件夹中多了一个 `.venv` 文件夹。 这是一个**虚拟环境 (Virtual Environment)**。它包含了 Python 解释器和方舟 SDK。 * **优势**:无论您系统里安装了何种 Python 版本,该目录下的环境始终是纯净、稳定、可用的。 * **后续建议**:您可以下载 [TRAE](https://www.trae.ai/) 编程工具,打开本项目文件夹,自动识别到该虚拟环境,您即可像专业工程师一样开始编写代码。 > **说明** > > 推荐安装方舟文档 MCP,结合支持 MCP 的 Agent 或代码开发工具,可智能完成方舟代码开发与调试。 > 主流编程工具支持一键安装,OpenClaw 等智能体一句话即可安装,详见[文档 MCP](/docs/tutorials-mcp)。 ## 4. 常见问题 **Q: 双击** **`run_windows.bat`** **后窗口一闪而过怎么办?** A: 请尝试右键点击 `run_windows.bat`,选择“以管理员身份运行”。或者先打开 CMD 命令行,拖入 `run_windows.bat` 文件运行,查看具体报错信息。 **Q: Mac 提示“Permission denied”?** A: 请打开终端,输入 `chmod +x `(注意最后有个空格),然后将 `run_mac.command` 文件拖入终端,按回车。这会赋予文件运行权限。 **Q: 报错“API Key 无效”?** A: 请检查您输入的 Key 是否完整,是否包含多余的空格。建议直接从控制台复制粘贴。 ## 5. 下一步 您已经成功迈出了第一步!接下来,您可以: * **继续体验更多能力**:重新运行脚本,在能力菜单中切换到图片生成、视频生成、多模态向量化或工具调用。 * **修改 Prompt**:脚本运行时会直接展示默认 Prompt,您无需编辑源码文件即可替换成自己的输入。 * **配置环境变量**:建议先配置 `ARK_API_KEY`,这样后续运行脚本时无需重复输入密钥。 * **学习更多**:查看标准版 [快速入门](/docs/quick-start) 查看更多示例代码和进阶用法。 * **浏览模型**:访问 [模型广场](https://ark.volcengine.com/region:cn-beijing/model) 查看更多可用的强大模型。 --- # Seedance 1.0 系列提示词指南 Source: https://ark.volcengine.com/region:cn-beijing/docs/seedance-1-0-pro-pro-fast 本文介绍 Seedance-1.0-pro 和 Seedance-1.0-pro-fast 文生视频和图生视频的提示词(prompt)使用技巧,帮助您快速上手视频创作,将创意转化为视频内容。 ## 模型简介 **Seedance 1.0** 是字节跳动豆包大模型团队最新推出的视频生成基础模型系列。 * **Seedance 1.0 pro** 作为该模型系列的大参数量版本,具备独特的多镜头叙事能力,在各维度表现出色。它在语义理解与指令遵循能力上取得突破,能生成运动流畅、细节丰富、风格多样且具备影视级美感的 1080P 高清视频。 * **Seedance 1.0 pro fast** 是一款价格触底、效能封顶的全面模型,在视频生成质量、速度、成本之间取得了卓越平衡。它在继承 Seedance 1.0 pro 模型核心优势的基础上,生成速度较 Seedance 1.0 pro 最高提升约 3倍,价格直降72%,为创作者带来效率与成本双重优化的体验。 ## 提示词参数 [创建视频生成任务 API ](/docs/create-video-generation-task-api) 中,跟提示词有关的参数如下: 1. **提示词(必填)**:支持中英文。 2. **参数(选填)**:支持通过 **resolution、ratio、duration、seed、camera_fixed、watermark** 等参数控制视频输出的规格。支持以下两种输入方式。 * 新方式(推荐):在 request body 中直接传入。 ```JSON ... // Strongly recommended // Specify the aspect ratio of the generated video as 16:9, duration as 5 seconds, resolution as 720p, seed as 11, and include a watermark. The camera is not fixed. "model": "doubao-seedance-1-0-pro-250528", "content": [ { "type": "text", "text": "小猫对着镜头打哈欠" } ], // All parameters must be written in full; abbreviations are not supported "resolution": "720p", "ratio":"16:9", "duration": 5, // "frames": 29, Either duration or frames is required "seed": 11, "camera_fixed": false, "watermark": true ... ``` * 旧方式:在文本提示词后追加 --[parameters] ```JSON ... // Specify the aspect ratio of the generated video as 16:9, duration as 5 seconds, resolution as 720p, seed as 11, and include a watermark. The camera is not fixed. "content": [ { "type": "text", "text": "小猫对着镜头打哈欠 --rs 720p --rt 16:9 --dur 5 --seed 11 --cf false --wm true" // "text": "小猫对着镜头打哈欠 --resolution 720p --ratio 16:9 --duration 5 --seed 11 --camerafixed false --watermark true" } ] ... ``` ## 动作指令 ### 基础动作 > 主体+动作 |视频生成示例 || |---|---| |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/4e751a0214e04b719c43f6169c681a17) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/d48bbf1125284ae2b59a480b521affb7) | \ | | | \ | | | \ |t2v:小猫对着镜头打哈欠。 |t2v:女子走在夜晚的上海街头。 | |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/498fd3308d8b48b1b46a7f0db9e515a0) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/ed126865e0684f729b8144aae17ff59f) | \ | | | \ | | | \ | | | \ |i2v:男子转头,看向镜头微笑。 |i2v:稳重冷漠的男孩看向镜头,放下耳麦。然后跳下轮胎走向镜头蹲下。 | ### 多动作指令 > 按照动作发生的时序,清晰描述出多个动作,实现单人物多动作/多人物多动作。 |视频生成示例 ||| |---|---|---| |单人物多动作 |多人物多动作 |多人物多动作 | \ | | | | \ | | | | \ |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/22c1e58cc12b4b3eb02a011c7f24df6c) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/4fe10b493b3f4844ac558b3307cba236) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/22ce7555762c4c88a826a2e8d69adf5c) | \ | | | | \ | | | | \ |i2v:女子拿起面前的酒杯,喝了一口后放下,然后起身离开座位。 |t2v:一个摇滚乐队的演出现场,主唱拿着麦克风在台上唱歌,吉他手在卖力弹吉他,贝斯手弹贝斯,鼓手在摇头晃脑地敲鼓,键盘手在弹钢琴。 |t2v:办公室茶水间,同事们在休息聊天。同事 A 分享周末趣事,手舞足蹈。同事 B 笑得前仰后合,同事 C 好奇地追问细节。其他人围在周围,不时插上几句。 | ## 镜头语言 ### 基础运镜 > 精准响应推、拉、摇、移、环绕、跟随、升、降、变焦等运镜指令。 |视频生成示例 ||| |---|---|---| |推 |拉 |摇 | \ | | | | \ | | | | \ |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/0cee88af61354f2fa266c0baa73b46cc) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/b801045958534b3db532ec91f8ca4c6c) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/c04a39f0172c44f7b0954f448eb2dea2) | \ | | | | \ | | | | \ |i2v:镜头快速前推到小女孩的近景,她背对着镜头缓缓抬头仰视面前的建筑。 |i2v:镜头快速拉远,露出女子上半身,她微微转头目光看向画面右侧,背景是一个繁华的街头。 |t2v:一个时装发布会的现场,镜头右摇侧面拍摄一个衣着华丽的模特在走秀。 | |移 |环绕 |跟随 | \ | | | | \ | | | | \ |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/cbbd0408a95a4fae902fb71d5951c48b) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/5a2f262ad1cb4d769dd628097462ae45) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/4f1aa9a795f4420596c78f63d2b16bfa) | \ | | | | \ | | | | \ | | | | \ |i2v:镜头右移展示长城的雄伟壮丽,微缩摄影,由布料拼接而成的长城。 |i2v:镜头环绕拍摄,从女人的背面到正面,她十分美丽,抬手捂嘴,羞涩微笑。 |i2v:狮子在飞翔,镜头跟随飞翔的狮子。 | |移 |升 |变焦 | \ | | | | \ | | | | \ |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/ff2c0b5bdaf7437dbf80c662560973db) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/a8abe846ef0b430991cab7211a11f611) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/85dfc5e768ad4d6ca13d17f273a3c84d) | \ | | | | \ | | | | \ | | | | \ |i2v:镜头右移,画面右侧的女人正与他深情对视。 |i2v:镜头逐渐升起,露出登山者的背影。 |t2v:法庭上,法官即将宣布审判结果。变焦镜头下,镜头推近被告紧张的面容,背景中的法庭和众人逐渐拉远,空间被压缩,突出被告等待判决时的煎熬,营造出严肃且紧张的氛围,让观众的情绪也随之紧绷。 | ### 复杂运镜 > 对于进阶玩家,可以将多个运镜指令进行组合构建出有创意的长镜头。 |视频生成示例 || |---|---| |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/e639f71a903840caa0130e045349bef8) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/a1dc7a7632b543febec49942df4f7ff0) | \ | | | \ | | | \ |t2v:一个小女孩在客厅地毯上和她的小狗玩耍。镜头从地面与小狗视平线的角度开始,小狗欢快地跑向女孩,镜头平稳地跟随小狗,并在接近女孩时向上摇摄,展现女孩温柔的笑容;女孩和小狗嬉戏时,镜头围绕他们做一个缓慢的近距离360度旋转,最后在女孩抱起小狗时,镜头从下往上逐渐拉近,定格在他们亲密的脸庞。充满温馨和爱意,画面柔和。 |t2v:一位女性手持咖啡杯,静立于明亮的窗前。镜头从她身后开始,缓缓向前推进并从她右肩上方掠过,细腻捕捉杯中咖啡的热气与她沉静的侧脸轮廓;随后镜头不停歇,继续向前穿过窗户(或模拟穿透效果),展现窗外街景一瞥,再流畅地旋转180度重新面向室内,从窗外视角反观女性背影,最后缓慢拉远。一镜到底,突出光影之美与空间感。 | ### 景别和视角控制 > 可以使用远景、全景、中景、近景、特写这样的专业景别描述来控制。还可以选择具体的观察角度:水下镜头,航拍镜头,高机位俯拍,低机位仰拍,微距摄影,以xx为前景的镜头等 |视频生成示例 || |---|---| |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/c3b3365e29034ed796a1f9f5d8a21089) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/407213a0068342e9a0b26c55258d7a0c) | \ | | | \ | | | \ |t2v:微距摄影,一只毛毛虫在花瓣上爬行,可以清晰看见它身上的毛。 |t2v:广阔的沙漠中,一队骆驼商队缓缓前行。高空航拍俯瞰,沙漠的广袤与商队的渺小形成对比,尽显旅途的艰辛。 | |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/f8eb811c165241908f09805e0a76d876) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/d998f8cd740c441387b141d973f0cd3a) | \ | | | \ | | | \ | | | \ |t2v: 客厅中,父亲教儿子下棋。过肩镜头越过父亲肩膀,看到儿子思考的神情和棋盘上的棋局,传递着亲子间的温馨陪伴。 |t2v:透过一个箱子拍摄,有两个人正在看箱子的里面。其中一个人伸手进箱子抱出一只小奶猫。 | ## 多风格直出 > 具有直出多种风格的能力,包含2D/3D,以及更细分的体素,像素,毛毡,粘土,插画等。 |视频生成示例 ||| |---|---|---| |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/9b34e09d8cc941818fe165ca061de28a) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/9f54f0f315f14cdf8aab28a67008695a) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/1afe09ebf0054daa855752b1bfc4ebd6) | \ | | | | \ | | | | \ |t2v:黑白线稿风格,一个黑白线稿女孩向右行走,背景是线稿森林。 |t2v:一只可爱的毛毡小猫走在粘土做成的街道上 |t2v:3D动画,一只拟人的马坐在教室里上课 | |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/e4beadc4565b441f83199f2c62ae5812) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/3c795a7d9a344a3cab084765038042f1) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/d0b5ef7bbec14fefa33464de6c630984) | \ | | | | \ | | | | \ | | | | \ |t2v:日本漫画,一个带墨镜的美女在东京街头自拍 |t2v:体素风格,一个机器人坐在火箭上 |t2v:美漫风格,一个肌肉男在举重 | ## Prompt 控制美感 ### 人物外形 > 可以发挥想象,精细刻画出人物/场景/衣着的细节,生成各种不同长相特征的角色。 |视频生成示例 ||| |---|---|---| |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/336670697636439585f727fa473d4987) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/c2b337982d8a43c1b41f706d1c0c1c0c) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/d7a2c174d40f4c0ea368418f8fee45c2) | \ | | | | \ | | | | \ |t2v:一个美貌的女人穿着一身优雅的黑色旗袍,坐在西式客厅里抽烟。 |t2v:一个其貌不扬的女人穿着一身黑色旗袍,坐在西式客厅里抽烟。 |t2v:那个脸型微胖的年轻女人盯着摄像头,她有着一双三白眼,眼角边有一颗痣,皮肤粗糙。脸上是红光和蓝光。 | |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/2de1c10d4e224cd78eabcbb95f73bd57) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/96e3a17d79bd4b66b450d18106f571da) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/17905961d3264752a0c66244c6a89aca) | \ | | | | \ | | | | \ | | |t2v:美颜滤镜,磨皮感,一个女孩在自拍,她对着镜头比耶。 | \ |t2v:一个发型凌乱的男人在吃鸡腿,背景是家徒四壁的房间 |t2v:一个300斤的白人男性窝在沙发上看电视,电视反射过来的光线在他脸上波动。 | | ### 画面美感 > 精细化描述画面,用自然语言写出画面的氛围特征,可以控制画面整体的美感。 1. **写上视频类型控制画面特征** |视频生成示例 || |---|---| |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/bf267a451d894ceaad4fceaa09728ca8) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/3468617a43494000a33cf81296e3b154) | \ | | | \ | | | \ |t2v:男子和女子的手拉在一起。喜庆的土味短视频。 |t2v:男子和女子的手拉在一起。欧洲文艺电影。 | |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/4c2007059f774a7c82e62f895faab407) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/3d1638f0053c40218f7fb8b5f047a145) | \ | | | \ | | | \ | | | \ |t2v:男子和女子的手拉在一起。复古香港电影。 |男子和女子的手拉在一起。恐怖片。 | 1. **用自然语言形容出想要的氛围,可以是正向的氛围也可以是负向的氛围,达到对画面美感的控制效果**。 |视频生成示例 || |---|---| |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/a43cc5bf62c94c2a9cf106bc8c8e0ee2) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/14961c4d7d2d461bba4baa4e8814e6b4) | \ | | | \ | | | \ |t2v:油画般的电影场景,在英国乡村,一个金发的穿着针织毛衣的女人和一个英俊的男人深情对视 |t2v:有质感的老电影,复古氛围,一个街头音乐人在夜晚酒吧的霓虹灯下沉醉地拉小提琴。 | |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/d025598ae4344529ac62ae8a45391ddb) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/81470a27f6d246f79311601a8c18bee5) | \ | | | \ | | | \ | | | \ |t2v:略显古早,妆造廉价的80年代电视剧,一个男人在台灯下写作 |t2v:花园的叶子上,住着一群小精灵。镜头右摇,主角从家里走出,主角身着花瓣斗篷、手持草叶魔杖,魔杖顶端嵌着一个发光的黄色宝石,微观世界风格。 | ## 多镜头能力 > 支持在同一prompt里包含多个切镜,这些切镜会根据提示词的内容,保持主体/风格/场景的延续性。镜头的变化,通过“镜头切换”来进行连接,在每次切镜之后,如果场景和人物发生了变化,可以用prompt刻画新出现的人物/场景的特征。 |视频生成示例 || |---|---| |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/45a632c1822341eb94585bc85f930648) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/1926cc14b14f4e52b4225792001a8ebf) | \ | | | \ | | | \ |t2v:推到红发女孩惊讶的表情特写,镜头切到废墟中的一个窗台上的花盆,里面种着一个蓝色的多肉植物,镜头切到俯瞰,女孩走向这个多肉植物,切过多肉植物前景女孩双眼特写,摇到女孩的嘴,碎碎念出植物的名字。 |i2v:船在风暴中穿行,闪电不断的划破夜空。切换成中景,一个船长站在甲板上,拿着复古的望远镜看向远方。镜头缓缓前推,他收起望远镜,表情坚毅的看向远方。 | |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/ed6c7b47dcb7451e9840291ffb62faca) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/16e8eae2ac6342889ae2f7e537c76a70) | \ | | | \ | | | \ | | | \ |t2v:在破旧的工厂里,一位侦探正在调查一宗离奇案件。开始以低机位仰拍,凸显侦探高大坚定的形象,他缓缓走进工厂深处。接着镜头平移跟随,切换为平机位,展示周围杂乱的机器和散落的零件。随后镜头推近,变为微俯平机位,聚焦在地上一个带血的脚印,营造紧张悬疑的氛围。 |t2v:科幻电影的奇特场景,全景画面,一个未来实验室内,画面核心有一个量子计算机,周边有一个科学家对着全息投影屏幕不断操作着。镜头切换成量子计算机的特写,量子计算机突然爆发出红色的光芒。然后镜头再次切换到科学家的脸,近景仰拍,红色的光晕照射在他的脸上,他表情开始变得慌张。 | ## 创意特效 > 模型本身即可实现多种特效,发挥想象可以实现许多有意思的效果。 |视频生成示例 ||| |---|---|---| |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/826f39ab53fa416caef552221bb75a2b) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/2da9da273308463abe1b8327a067fab6) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/2d0ea2a01998486390de6705958172c9) | \ | | | | \ | | | | \ |t2v:自由女神像在纽约港夜晚的灯光下,底座突然喷出巨大火焰和烟雾,像火箭一样缓缓升空。火焰照亮夜空,气流冲击周围建筑和海面。镜头跟随她加速上升,划出明亮的火焰轨迹。 |t2v:圆滚滚的牛蛙瘫在粉色按摩椅上,鼓胀的肚皮随着呼吸起伏,手惬意地耷拉在扶手上。一旁的长毛白猫踮着脚尖,肉垫轻轻揉捏着牛蛙紧绷的肩膀,娴熟的踩奶动作仿佛是最专业的按摩技师。 |t2v:一个倒在古墓青砖地上已经只剩骨头架的盗墓贼趴在地上,他的两只枯骨手拖着骷髅骨架艰难的一下一下向前爬着,骷髅头笑盈盈。墓室香暗,有烛光照在骷髅脸上,地上散落着碎琉璃瓦、碎青花碗、还有生锈的古钱币。 | |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/8c19361a710b46c280255f59c0f4ad49) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/b0486e5bbb754e59b50cb2a7199609be) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/1fd4fa8b96224574b96e99dddda807ab) | \ | | | | \ | | | | \ | | | | \ |i2v:男孩放下书,解开衣服露出蜘蛛侠紧身衣,戴上蜘蛛侠面具,向画外射出粘液,快速向镜头上方快飞出画 |i2v:天气很热,男孩冒出大量汗珠,冒着白烟,男孩融化着流出画面。 |i2v:男孩生气了,鼓起了嘴,逐渐地全身开始鼓起,男孩全身爆炸,飞出很多零件。 | |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/7624ae1937f24296915ceaa1bc92fd81) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/3ede49671206422ba237e8cd328c7179) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/cdbc234a678b4af7a554cfcf7608e095) | \ | | | | \ | | | | \ | | | | \ |i2v:男孩看着书,看着看着就老啦。脸颊越来越下垂,皮肤毛孔越来越明显,长出了鬓角和胡子,变成了沧桑大叔。画面也逐渐变成颗粒度明显的黑白风格 |i2v:男孩盯着镜头瞬间恋爱了,脸颊绯红,空气中飘起了半透明地粉红色泡泡,气氛变得暧昧,男孩害羞地用书挡住了脸。书皮上画了个心 |i2v:狂风暴雨大作。男孩瞪大眼睛盯着书,突然很疑惑不解,很快豁然开朗。同时一束闪电劈中男孩。被雷劈中时男孩全身就像被烧过,夸张的爆炸头,冒烟。一脸焦炭的全身脏脏男孩无辜地抬头看镜头 | ## 画幅遵循 Seedance 1.0 pro 支持输出的视频比例有:1:1,3:4,4:3,16:9,9:16,21:9。 i2v建议用这些比例的图片作为参考帧,假如不是这些比例的话,自动匹配会通过裁切来适配最接近的比例。 --- # Seedream 4.0-5.0 提示词指南 Source: https://ark.volcengine.com/region:cn-beijing/docs/seedream-4-0-5-0-prompt-guide 本文介绍 Doubao Seedream 5.0 lite、4.5 和 4.0 的提示词(prompt)使用技巧,帮助您快速上手图片创作,将创意转化为图片内容。 # 通用规则 Doubao Seedream 5.0 lite、4.5 和 4.0 支持文生图、图片编辑、参考图生图、组图生成等多样化任务。为了获得更理想的图像创作效果,建议在编写提示词时注意以下几点: 1. **用自然语言清晰描述画面** 建议用**简洁连贯**的自然语言写明 **主体 + 行为 + 环境**,若对画面美学有要求,可用自然语言或短语补充 **风格**、**色彩**、**光影**、**构图** 等美学元素。 * 示例:一个穿着华丽服装的女孩,撑着遮阳伞走在林荫道上,莫奈油画风格。 * 避免:一个女孩,撑伞,林荫街道,油画般的细腻笔触。 2. **明确应用场景和用途** 当有明确的应用场景时,推荐在文本提示中写明图像用途和类型。 * 示例:设计一个游戏公司的 logo,主体是一只在用游戏手柄打游戏的狗,logo 上写有公司名 “PITBULL”。 * 避免:一张抽象图片,狗拿着游戏手柄,狗狗上写 PITBULL。 3. **提升风格渲染效果** 如果有明确的风格需求,使用精准的 **风格词** 或提供 **参考图像**,能获得更理想的效果。 示例 * 绘本: ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/66f0a49a642c4afb8ed626a80315ce6b~tplv-goo7wpa0wc-image.image) * 儿童绘本: ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/a0fbf4ea3eaf4ec78c9969223fde10f2~tplv-goo7wpa0wc-image.image) * 风格参考图: ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/835e5c45884d46c9b3563f277af98e0f~tplv-goo7wpa0wc-image.image) 4. **提高文本渲染准确度** 建议将要生成的 **文字内容** 放在 **双引号** 中。 * 示例:生成一张海报,标题为 “Doubao Seedream 4.5” * 避免:生成一张海报,标题为 Doubao Seedream 4.5 5. **明确图片编辑目标和希望保持不变的部分** 使用 **简洁明确的指令**,说明需要修改或参考的对象及具体操作,避免使用指代模糊的代词;如果希望除了修改的内容都保持不变,则可以在 prompt 中强调。 * 示例:让图中最高的那只熊猫穿上粉色的京剧服饰并戴上头饰,并保持动作不变。 * 避免:让它穿上粉色衣服。 # 提示词秘籍 ## 文生图 采用清晰明确的自然语言描述画面内容,对于细节比较丰富的图像,可通过详细的文本描述精准控制画面细节。 > Doubao Seedream 5.0 lite、4.5 和 4.0 对文本提示的理解能力更强,能够在较少描述的情况下生成符合预期的画面,且**画面不再泛白**,因此在使用该模型时采用简洁精确的提示通常优于重复堆叠华丽复杂的词汇。 |输入 |输出 | |---|---| |**【prompt】** 一个凌乱的办公桌桌面。桌面上有一台开着的笔记本电脑,屏幕显示绿色代码;旁边一个马克杯,杯上写着“Developer”,杯口冒出热气;一本摊开的书,页面是维恩图,展示三个圆的嵌套关系,三个圆分别为灰色、蓝色和浅绿色;一个便签贴,上面画着一个思维导图,思维导图是上下结构,分为3层结构;一支钢笔,笔帽掉在旁边;钢笔旁边是一个手机,屏幕显示一条新消息通知,桌子角落是一小盆多肉植物。背景是模糊的书架。阳光从右侧照射,在桌上形成光影。 |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/216793277320424a90a06ee992ebd9ff~tplv-goo7wpa0wc-image.image) | |**【prompt】** 冰箱打开的内部视图:上层: 左边放着一盒牛奶,牛奶盒上绘制了三只大小不一的奶牛,在草原上吃草,右边是一个鸡蛋支架,里面放着八个鸡蛋。中层: 一个盘子,里面装着吃剩的烤鸡,烤鸡上插着一个红色的小旗帜,旁边是一个装满草莓的透明保鲜盒,盒子上绘制有菠萝、草莓和橙子的图案。 下层: 蔬菜抽屉里有生菜、胡萝卜和西红柿。冰箱门后面的置物架里放着番茄酱和蛋黄酱。 |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/b0ecb3ea9c644cbfa6bc3ecffcdd1ae7~tplv-goo7wpa0wc-image.image) | Doubao Seedream 5.0 lite、4.5 和 4.0 可将知识与推理结果转化为高密度图像内容,如公式、图表、教学插图等。在生成时应明确使用**专业术语**,确保知识点表达准确,并写清对生成图像的具体要求,如可视化形式、版式、风格等。 |输入 |输出 | |---|---| |**【prompt】** 在黑板上画出下列二元一次方程组及其相应的解法步骤:5x + 2y = 26;2x - y = 5。 |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/5542418531b54f068073d9ea7e2cf206~tplv-goo7wpa0wc-image.image) | |**【prompt】** 绘制一张信息图,展示通货膨胀的成因,每条成因独立呈现,并配有简洁图标。 |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/1fd2da22c89f4f528a1f0a505ef01e27~tplv-goo7wpa0wc-image.image) | ## 图生图 Doubao Seedream 5.0 lite、4.5 和 4.0 支持结合文本与图片完成图像编辑和参考生成任务,并可通过**箭头**、**线框**、**涂鸦等视觉信号**控制画面区域,实现可控生成。 ### 图像编辑 Doubao Seedream 5.0 lite、4.5 和 4.0 支持通过文本提示对画面进行**增加**、**删除**、**替换**、**修改**等编辑操作。 建议使用**简洁明确**的文字,**准确指示需要编辑的对象与变化要求**。 |场景 |输入 |输出 | |---|---|---| |增加 |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/e08a8aa144d441e5932e15717a644eae~tplv-goo7wpa0wc-image.image) |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/5affde557c944cabb0e0a35bf011ae24~tplv-goo7wpa0wc-image.image) | \ | | | | \ | |> **prompt**:给图中女生**增加相同款式的银色耳线和项链**。 | | |删除 |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/32abecfd1fd84e56b2e95379946783ab~tplv-goo7wpa0wc-image.image) |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/96253cbc5d6942ce9c7cb4a5b55c2250~tplv-goo7wpa0wc-image.image) | \ | | | | \ | |> **prompt:去掉**女生的**帽子**。 | | |替换 |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/9652ed8ee1084b939a9fc39850224b9a~tplv-goo7wpa0wc-image.image) |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/1281cd9f97154b25bc1266ddf7b1f366~tplv-goo7wpa0wc-image.image) | \ | | | | \ | |> **prompt**:把最大的面包人**换成牛角包形象**,保持动作和表情不变。 | | |修改 |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/17345381bde048f1b03c85f06ced3b7a~tplv-goo7wpa0wc-image.image) |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/8cbeeaece36940d0b395311526267432~tplv-goo7wpa0wc-image.image) | \ | | | | \ | |> **prompt**:让图中三个机器人**变成透明水晶材质**,颜色从左到右分别变成红黄绿。并让绿色的机器人跑起来,黄色的走路,红色的站立。 | | **当画面内容比较复杂,难以通过文本准确描述编辑对象时,可采用箭头、线框、涂鸦等方式指明编辑对象和位置**。 |场景 |输入 |输出 | |---|---|---| |涂鸦 |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/1da20e56baf64f2e94992b3eaa157cbb~tplv-goo7wpa0wc-image.image) |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/d08146660f894b0db00d3696b73a3d26~tplv-goo7wpa0wc-image.image) | \ | | | | \ | |> **prompt**:将房间内**红色涂抹位置**放入电视,**蓝色涂抹位置**放入沙发,不改变其他布局,确保放入物体和整张图的原木风格一致。 | | |线框 |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/69b235500bdd47fe8abf3505c4d3a2cb~tplv-goo7wpa0wc-image.image) |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/7ff2ba9212934e06af93e54c7f92b02c~tplv-goo7wpa0wc-image.image) | \ | | | | \ | |> **prompt**:放大图中的标题**至红框大小**,并改成和萨克斯图案一样的颜色和字体风格。 | | ### 参考图生图 Doubao Seedream 5.0 lite、4.5 和 4.0 支持从参考图像中提取关键信息,如:人物形象、艺术风格、产品特征,完成角色创作、风格迁移与产品设计等任务。 当有明确需保持的特征(如角色形象、视觉风格、产品设计)时,可上传图像作为参考,以确保生成结果与期望保持一致。只需在文本提示中明确两部分内容: * **指明参考对象**:清晰描述希望从参考图中提取并保留的元素,如:参考图中的人物形象、参考图中产品材质等。 * **描述生成画面**:具体说明希望生成的画面内容、场景等细节信息。 |输入 |输入 |输出 | |---|---|---| |参考人物形象 |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/831a5653f6d04c0e98e59ecf7ec53533~tplv-goo7wpa0wc-image.image) |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/24c2dd7e60b9466ca9878efdade45bcd~tplv-goo7wpa0wc-image.image) | \ | | | | \ | |> **prompt:参考图中的人物形象**,做一个动漫人物手办,放在桌上,后面放置一个印有角色图像的生日礼物包装盒,盒子下面有一本书,在包装盒前面,添加一个圆形塑料底座,角色手办站在上面,将场景设置在室内,尽可能真实;生成尺寸和现在图一样;手办在图片的左边;整个图片的风格和原始图一样,大片摄影感。 | | |参考风格 |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/134e11b52a344f69b95384366580a7df~tplv-goo7wpa0wc-image.image) |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/aea5b230eb4c4bb0980c0c143303f6a5~tplv-goo7wpa0wc-image.image) | \ | | | | \ | |> **prompt:参考图标的线性简约风格**,设计9个不同场景下的应用 icon,包括:音乐、天气、日历、相机、聊天、地图、闹钟、购物车、笔记本,保持一致的配色。 | | |参考虚拟实体形象 |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/ab24058e799f47148b25bf1d1e170132~tplv-goo7wpa0wc-image.image) |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/9eed566012d14b7abe5abed039a06fe9~tplv-goo7wpa0wc-image.image) | \ | | | | \ | |> **prompt:图中的形象变成一个羊毛毡**,下面有个小支架使得它仍然维持这个姿势,放在一个深色的书桌上。 | | |参考款式 |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/f6beba8c063f4c718c9e7b443907019d~tplv-goo7wpa0wc-image.image) |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/74d10ac9223d4fa0b3dc121fcb44deec~tplv-goo7wpa0wc-image.image) | \ | | | | \ | |> **prompt**:生成四件不同材质和颜色的上衣,**衣服款式与图中女生身上的衣服一致**,只要衣服,不要模特。 | | 当需要根据设计草图(如平面图、线稿图、手绘原型)生成高保真效果图时,建议遵循如下指引: 1. **提供清晰的原始图片**,若图中有文字说明,则在文本提示中注明“遵循图中文字内容进行生成”。 2. **明确主体与要求**,如高保真 UI 界面、现代简约风格客厅实景图。 3. **明确指出需与参考图保持一致的关键要求**,如家具位置与参考图一致、按照原型图的布局等。 |场景 |输入 |输出 | |---|---|---| |平面图 |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/40ee854a670a4e8790512881500a10b2~tplv-goo7wpa0wc-image.image) |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/3c29067cac8e419c9c9360e30a1f2bea~tplv-goo7wpa0wc-image.image) | \ | | | | \ | |> **prompt: 根据这张平面图**,生成 “现代简约风精装客厅 + 开放式餐厅”的实景图(房间布局、家具位置完全匹配例图)。地中海风格配色,空间结构和方向始终与例图一致。房间立体开阔(餐桌那边是阳光挑高),由近及远分别是沙发&绿植、电视、餐桌&椅子、落地窗(不需要体现文字和手绘边缘)。 | | |手绘原型 |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/ddf2d38a48064f5589bd116591dcc021~tplv-goo7wpa0wc-image.image) |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/46ab4bc54f7140c484044df24bc56c69~tplv-goo7wpa0wc-image.image) | \ | | | | \ | |> **prompt**:这是一个 Web 端房屋租赁软件的详情页手绘图,**请根据图中文字示意**,将其**渲染成高保真的 UI 界面**,并在画廊区域增加一些示例图片,在房屋信息和预定信息区域增加一些示例的文字信息。 | | ## 多图输入 Doubao Seedream 5.0 lite、4.5 和 4.0 支持同时输入多张图像,完成**替换**、**组合**、**迁移**等复合编辑操作。使用该功能时,建议在文本提示中清楚指明不同图像需要编辑/参考的对象及操作,如:用**图一的人物**替换**图二的人物**,并参考**图三的风格**进行生成。 |场景 |输入 |输出 | |---|---|---| |替换 |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/c4bdff18908040b7a0d3248b20700825~tplv-goo7wpa0wc-image.image) |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/53a9e700c7364fbfb9676bbbc536bd11~tplv-goo7wpa0wc-image.image) | \ | | | | \ | |> **prompt**:将**图一的主体**替换为**图二的主体**。 | | |组合 |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/54b6a31586be475fb22d79bb34f4f132~tplv-goo7wpa0wc-image.image) |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/b2be95beccef461f904747381ca3de99~tplv-goo7wpa0wc-image.image) | \ | | | | \ | |> **prompt**:让**图一人物**穿上**图二的服装**。 | | |迁移 |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/e97caaa8aa2047ae9e8a797b13be5c2b~tplv-goo7wpa0wc-image.image) |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/b38d0b74cfd642938ae43b20d4ef0497~tplv-goo7wpa0wc-image.image) | \ | | | | \ | |> **prompt**:参考**图二的风格**,对图一进行风格转换。 | | ## 多图输出 Doubao Seedream 5.0 lite、4.5 和 4.0 支持生成角色连贯、风格统一的图像序列,适用于分镜、漫画创作,以及需要统一视觉风格的成套设计场景,如 IP 产品或表情包制作。 当有多图生成需求时,可以通过“一系列”、“一套”、“组图”等提示词触发模型生成组图,或采用具体数字表明图片数量。 |输入 |输出 | |---|---| |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/e4d6939a73f64cafb9bef358ee0b6452~tplv-goo7wpa0wc-image.image) |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/5eddf0309b704151824b8d285b3fe8d1~tplv-goo7wpa0wc-image.image) | \ | | | \ |> **【prompt】** 参考这个 LOGO,做一套户外运动品牌视觉设计,品牌名称为“GREEN”,包括包装袋、帽子、卡片、手环、纸盒、挂绳等。绿色视觉主色调,简约现代风格。 | | |**【prompt】** 生成四张图,影视分镜,分别对应:宇航员在空间站维修飞船、突然遇到陨石带袭击、宇航员紧急躲避、受伤后惊险逃回飞船。 |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/0534bec7063348b393d732034fd64879~tplv-goo7wpa0wc-image.image) | |**【prompt】** 生成周一到周日共七张手机壁纸图,自然景观,每张图对应标注日期。 |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/f566a3c2dec0465a8d6d12d7fc269e35~tplv-goo7wpa0wc-image.image) | --- # Seedream 4.0 助力 Seedance 生视频最佳实践 Source: https://ark.volcengine.com/region:cn-beijing/docs/seedream-4-0-seedance 本文介绍如何利用 Doubao Seedream 4.0 精准控制图片(关键帧)的内容,辅助与优化 Seedance 的视频生成流程,为您生成理想视频提供关键助力。 # 助力首帧生视频 Seedream 4.0具备强大的多图融合能力,能够将多张不同风格、不同主题的图片进行有效融合,生成具有独特视觉效果且符合特定需求的图像,为视频制作提供多样化的素材。 |参考图 |使用 Seedream 4.0 的 多图融合 能力制作首帧 |首帧生视频效果 | |---|---|---| |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/655a21d997f74182aff261e2ae386dd2~tplv-goo7wpa0wc-image.image) |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/32403c7297c0499689f066b32199dd4d~tplv-goo7wpa0wc-image.image) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/7ec686cd8a4e4a47961d3f6012db4a46) | \ | | | | \ | |> 女子和男子御剑飞行。白衣古风女子身姿轻盈地立于长剑之上御剑凌空,图右边男子在她身后紧张地扶着她的腰,脸上满是慌张。 |> 女子和男子御剑飞行。白衣古风女子身姿轻盈地立于长剑之上御剑凌空,图右边男子在她身后紧张地扶着她的腰,脸上满是慌张。长剑载着二人在云雾缭绕的天际疾飞,云海翻涌如浪,剑光闪烁间,女子从容淡定,男子慌张。 | |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/7aeaec785b59417881fff70cbb40b798~tplv-goo7wpa0wc-image.image) |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/4c5fc210bca04ad9ae9f855075067eb0~tplv-goo7wpa0wc-image.image) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/9b1ba4129c034085b408c8c37ad21d57) | \ | | | | \ | |> 女人站在莲蓬头下,侧脸对着镜头,镜头显示头部特写,女人自在地洗头,双手缓慢地搓着头发,头发上大量洗发水白色泡沫,莲蓬头的水从高处淋下,水量非常大,背景是放置在身后墙角托盘上的一瓶洗发水,洗发水的正面对着镜头。 |> 女人站在莲蓬头下,侧脸对着镜头,镜头显示头部特写,女人自在地洗头,双手缓慢地搓着头发,头发上大量洗发水白色泡沫,莲蓬头的水从高处淋下,水量非常大,背景是放置在身后墙角托盘上的一瓶洗发水,洗发水的正面对着镜头。生成视频中的主体必须与参考图中的主体完全一致。 | \ |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/4c897f539323441f892d3422c8dfb807~tplv-goo7wpa0wc-image.image) | | | Seedream 4.0具备强大的语意理解能力,能够根据提示词精准地生成与之匹配的图像,为您提供更贴合需求的图像素材,进一步提升视频制作的效率和质量。 |使用 Seedream 4.0 的 文生图 能力制作首帧 |首帧生视频效果 | |---|---| |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/70b8ab4a7f7d4a6794de18dd950f6b9c~tplv-goo7wpa0wc-image.image) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/ac439104ef1d4df6a1429cfc272558fd) | \ | | | \ |> 深夜,黑白红外线摄像头,2只土拨鼠在户外院子里的蹦床上蹦跳,蹦床占画面下侧,土拨鼠比较小,低画质有噪点。 |> 深夜,黑白红外线摄像头,2只土拨鼠在户外院子里的蹦床上快乐蹦跳。 | |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/b6fde2866de344888d0112694630ce20~tplv-goo7wpa0wc-image.image) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/b8a27a358d6e455d925e5086dfd6943e) | \ | | | \ |> 真实夜间摄像头的红外黑白视角镜头,月球表面场景中远处有人在行走,低分辨率噪点,黑白灰度,红外热感成像,远处人物轮廓模糊,月球表面岩石纹理,荒凉氛围。 |> 固定镜头,噪波抖动,月球表面场景中远处有人在行走。 | |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/609fe311886f45d687741fcc597a4e7a~tplv-goo7wpa0wc-image.image) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/eed705156ff84128a7916d4974d1e783) | \ | | | \ |> 鱼眼广角摄像头监控画面,一只狗熊偷吃家门口的糖果被万圣节装饰物:一个巫师假人吓到。监控画质,低清。 |> 低清画质。巫师突然把手伸直,眼睛的红色灯泡亮起。狗熊吓得高高跳起,嘴里的糖果掉出来,狗熊连连后退。 | # 助力首尾帧生视频 在「首尾帧生视频」的制作流程中,生成符合预期的首尾帧画面是输出高质量视频的关键。借助「Seedream 4.0」强大的图像生成与控制能力,您可以高效构建高质量的首尾帧内容,从而实现更好地控制视频生成效果。 该方案具有以下核心优势: * **出色的主体一致性**:能够确保视频在首帧与尾帧之间,主体(如人物)的样貌、服饰、妆造等细节高度统一,有效维持视觉叙事的连贯性与专业性。 * **灵活的画面控制力**:即使首尾帧在服饰、场景、景别或视角上存在较大差异,Seedream 4.0 也具备充分的画面编辑与细节刻画能力,助您精准实现跨越式的画面转换,完成符合剧情或创意需求的首尾帧设计。 * **多样的风格化支持**:在各类风格化影视制作中,Seedream 4.0 都能生成相应风格的首尾帧画面,满足多样化项目的视觉创作需求。 ## 生动运动 > **说明** > > **人物动作类** **Prompt** **= 主体 + 主体从首帧到尾帧的详细动作变化描述 + 运镜** |首帧 |使用 Seedream 4.0 制作尾帧 |首尾帧生视频效果 | |---|---|---| |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/763a3d54edf64a66a340d054789e203c~tplv-goo7wpa0wc-image.image) |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/f932ffcf34d045168749f14048bb2203~tplv-goo7wpa0wc-image.image) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/fe5443800b60497bb85eee3f3b4dfbdd) | \ | | | | \ | |> 女生带着滑板跳到栏杆上,背面中景视角。 |> 女生在滑滑板,她跳到栏杆上,镜头跟随转到她背后。 | |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/74fda8d1bdb449318fe204244c499818~tplv-goo7wpa0wc-image.image) |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/a586e97f1da24c90bb16eff389691529~tplv-goo7wpa0wc-image.image) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/28ebb030f8034676a7802b51795f845c) | \ | | | | \ | |> 生成这个人物10s后的滑雪画面,广角镜头。 |> 滑雪运动员在雪山上滑雪,速度飞快,镜头跟随人物运动到侧面俯视视角。 | ## 角色变装 > **说明** > > **Prompt中可以加入首帧和尾帧的主体妆造,以及场景的变化。或者通过,「360度环绕运镜」「主体原地转身」、「走出/入画面」这样的衔接词语,来让视频的过渡更自然**。 |首帧 |使用 Seedream 4.0 制作尾帧 |首尾帧生视频效果 | |---|---|---| |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/0bc3df12e80c4772aa626b1a91a6da24~tplv-goo7wpa0wc-image.image) |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/3f70661893d44ff0987129a9d290a80f~tplv-goo7wpa0wc-image.image) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/8e1eafc90dd6448f89f0cd4f41b16ce1) | \ | | | | \ | |> 保持3D卡通画风,棕色的小豚鼠穿着白色的厨师服,站在厨房里面炒菜。 |> 3D卡通画风,一只棕色的小豚鼠原地向前跑出画面,后穿着白色的厨师服又走入画面,在厨房里面炒菜。 | |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/ea6292db97e946fda6d18a1a0a3f5141~tplv-goo7wpa0wc-image.image) |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/8acfdbab83a6435e9db845261b38aae5~tplv-goo7wpa0wc-image.image) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/c44cc99e61f94ccd9151afe6669ef817) | \ | | | | \ | |> 保持镜头视角,背景切换为傍晚的富士山,女生穿着和服在镜头前摆剪刀手自拍。 |> 360度环绕运镜。 | ## 影视级运镜 > **说明** > > **Seedance 能够提供非常流畅的首尾帧间的过渡效果,对于运镜,仅需简要描述所需运镜效果即可**。 |首帧 |使用 Seedream 4.0 制作尾帧 |首尾帧生视频效果 | |---|---|---| |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/cd014efa8ba944a581f984a6808e318d~tplv-goo7wpa0wc-image.image) |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/70525b3b28fb40c7be40c3a5ab1726d5~tplv-goo7wpa0wc-image.image) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/624cbf6ec9c247698c8b56258c5b0631) | \ | | | | \ | |> 图片拉近到后方建筑的阁楼,一个穿着白衣的女子,推开了阁楼的门,中景视角。 |> 镜头环绕推进,聚焦画面后方的建筑,一个穿着一身白衣的女生,推开了阁楼的门。 | |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/8b5db28646044a40bee9470d81eb160a~tplv-goo7wpa0wc-image.image) |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/ec7de93162ea4ca1901196e95c6422a3~tplv-goo7wpa0wc-image.image) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/dce1ef2883f04aa687de9db4088ad2a4) | \ | | | | \ | |> 镜头拉近到近景,男人抬起了头,正面面对镜头,紧皱眉头。 |> 镜头推进,男人缓缓抬头。 | ## 商品展示 > **说明** > > **结合 Seedream 4.0 ,首尾帧能够很好的保持商品的细节,保证在广告素材的生产中的高可用性。此外,还可以完成商品不同状态的展示,比如下文所展示的商品开箱**。 |首帧 |使用 Seedream 4.0 制作尾帧 |首尾帧生视频效果 | |---|---|---| |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/7e710f71b6c44413a13e5a2f723207f5~tplv-goo7wpa0wc-image.image) |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/c9028bcb303045b6b3701a4bbd9d53b5~tplv-goo7wpa0wc-image.image) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/5d1fd88457e34f5daae94fed478a8e5f) | \ | | | | \ | |> 俯视视角,从上往下拍摄,洗发露平放在水面中,周围布满白色的花瓣。 |> 镜头转换为俯视视角拍摄洗发露,洗发露瓶子自然下落到水面上,溅起一圈圈波纹,周围缓慢掉落白色花瓣,散落在瓶子周围。 | |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/ed8ff74d88a7468a8d629bed9acf336f~tplv-goo7wpa0wc-image.image) |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/41ee7bd2568a4eed8fea56756dc0d61d~tplv-goo7wpa0wc-image.image) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/122b4e4f50804a19867ad2e35152a3c3) | \ | | | | \ | |> 去掉礼盒封面的图案,礼盒打开,保持其尺寸不变,画面聚焦展示礼盒内整齐摆放的各种月饼、点心。 |> 一只手伸入画面打开礼盒,展示礼盒里面的点心。 | ## 风格化创意视频 > **说明** > > 对于各类风格化视频,「首尾帧生视频」相较于「图生视频」能够更好的控制画面的风格保持一致 |首帧 |使用 Seedream 4.0 制作尾帧 |首尾帧生视频效果 | |---|---|---| |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/4f850b61c60c4568886bfe569167e504~tplv-goo7wpa0wc-image.image) |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/8b398ce150d44be19237ae36dc103ad9~tplv-goo7wpa0wc-image.image) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/624b1978e7e3430aa79915e5b34e5553) | \ | | | | \ | |> 极繁主义,复古插画,时尚插画,丛林中飞翔在空中的蓝白色雄鹰,特写,白色的天空,橙色的丛林,盛开的奇花异草。梦幻般的风格。 |> 一只猎豹360度原地转身,之后变身成一只在天空中飞翔的鹰,画面过渡流畅自然。 | |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/d2088dc775a142488e8c669aba1f4ccb~tplv-goo7wpa0wc-image.image) |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/6d06e5345f8c4e42ac3334ddb933b542~tplv-goo7wpa0wc-image.image) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/dc1a32af5d79499eb2ec5328033441f1) | \ | | | | \ | |> 肆意泼墨风格,一朵朵红色花瓣四散纷飞,落在水面上,背景大面积留白。 |> 画面风格保持一致,女子渐渐消逝在画面中,化为一朵朵红色花。 | # 助力多参考图生视频 Seedream 4.0具备强大的组图生成能力,对同一个主体可支持多个分镜的图像生成,且生成的图像能在风格、色调等方面保持高度一致,有效满足多参考图生视频的需求。 |参考图 |使用 Seedream 4.0 生成 组图 |多参考图生视频效果 | |---|---|---| |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/c7ddd4cfe9e240be823489edb3a5763f~tplv-goo7wpa0wc-image.image) |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/23f3b13d9c9e4c1cab8a7dfc1714d1c8~tplv-goo7wpa0wc-image.image) |[视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/e32b52bdd8844609b7cfdb4276e0c3d9) | \ | | | | \ | | |> 镜头急速前冲贴近吉他手拨弦的手指 , 镜头切换到这个人正在打架子鼓,镜头切换到这个人正在弹键盘。 | \ | |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/029a0b9ac37c4e4f893ea81146af3b72~tplv-goo7wpa0wc-image.image) | | \ | | | | \ | | | | \ | |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/74ff4543184c4c1a9776d38c541273be~tplv-goo7wpa0wc-image.image) | | \ | | | | \ | |> 生成这个人物在打架子鼓、弹键盘、弹吉他 | | # 注意事项 在使用 Seedream 4.0 辅助生成视频时,需注意以下几点,以确保最终视频效果符合预期: 1. **宽高比匹配** > Seedream 4.0支持生成的图像尺寸信息,详见[图片生成 API](/docs/image-generation-api) > Seedance支持生成的视频尺寸信息,详见 [创建视频生成任务 API](/docs/create-video-generation-task-api) 在使用 Seedream 4.0 生成用于生视频的图片时,需注意图片宽高比与最终视频所需的宽高比之间的差异,避免因宽高比差异过大导致视频画面裁剪或变形等问题。 2. **理解创作意图** Seedream 4.0 具备深度理解能力,可基于线稿图、轮廓图、深度图等输入素材进行延伸创作,准确响应画面生成需求。 3. **提示词建议** 在生成图片的提示词中,可明确加入“视频静帧画面”等说明,以引导模型生成更适配视频生成的图像内容。 4. **视频时长与帧数控制** * 视频生成的帧数可通过 `frames` 参数灵活控制,当前可支持 2–12 秒的视频生成。具体可参考 [创建视频生成任务 API](/docs/create-video-generation-task-api)。 * 结合 Seedream 生成的关键帧与 Seedance 的精准时长控制,可实现对视频内容与节奏的精细化把控。 --- # RAG(检索增强)解决方案 Source: https://ark.volcengine.com/region:cn-beijing/docs/rag **一、检索增强生成(Retrieval Augmented Generation,简称 RAG)是一种先进的自然语言处理技术,旨在进一步提升大语言模型的输出质量和可靠性。该技术通过整合信息检索功能,将用户查询与向量数据库进行精准匹配,从而为用户提供了更加准确和可信的答案,有效减轻了大型模型在生成回答时可能出现的“幻觉”现象**。 **二、以下是一些RAG常见的场景**: **需要大量背景知识的任务**:当生成的文本需要依赖大量的背景知识或数据时,RAG可以通过检索相关信息来辅助生成过程。 **复杂查询的回答**:对于需要从大量数据中提取特定信息的复杂查询,RAG可以检索最相关的文档,并生成准确的回答。 **实时信息检索**:在需要根据最新数据快速生成回答的场景中,RAG可以结合实时检索的信息和生成模型来提供最新的回答。 **多轮对话系统**:在聊天机器人或虚拟助手中,RAG可以帮助系统根据对话历史和上下文检索相关信息,并生成合适的回复。 **长形式内容生成**:当需要生成长篇内容,如文章、报告或故事时,RAG可以从大量数据中检索相关信息来辅助内容的生成。 **事实核查和数据验证**:RAG可以用于生成准确无误的信息,通过检索可靠的数据源来支持生成的内容。 **个性化内容生成**:在需要根据用户的历史行为或偏好生成个性化内容时,RAG可以检索用户相关的信息,以生成更符合用户需求的内容。 **跨语言翻译和生成**:RAG可以用于生成特定语言的文本,通过检索和利用跨语言的数据来提高翻译的准确性和自然性。 **教育和培训**:在自动生成教育材料或提供个性化学习建议时,RAG可以检索相关的教育资源并生成定制化的内容。 **企业知识管理**:在企业环境中,RAG可以帮助员工快速找到所需的信息,通过检索企业内部的知识库并生成有用的回答。 **法律咨询**:RAG可以用于提供法律咨询,通过检索相关的法律条文和案例来生成法律建议 三、**下图显示了RAG与LLM配合的流程图**: ![](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_8d1490c2754334829e942183c80c1f8c.png) **四、我们的优势**: * **提供毫秒级百亿规模的高性能检索,秒级流式知识库索引更新** * **内嵌豆包向量化模型,是由字节跳动自主研发的语义向量化模型,是LLM知识库解决方案的配套工具,支持中、英双语** * **支持向量数据实时写入、实时更新,支持实时索引、自动索引** * **存算分离架构,单数据多场景,节约计算资源,提高在线稳定性,保证高可用性** **五、推荐产品**: * **向量数据库(Viking** **DB)**: [https://console.volcengine.com/vikingdb](https://console.volcengine.com/vikingdb) * **豆包大模型可根据实际业务场景选择**: **Doubao 系列**:https://ark.volcengine.com/region:cn-beijing/model?projectName=undefined&vendor=Bytedance&view=LIST_VIEW **六、典型案例介绍**: 某保险客户为提高客服人效和对话体验,将原有人工客服升级为AI客服。在项目中,多轮对话记忆、问题分散且泛的问题在传统客服功能中难以实现,对话体验不够自然真实,RAG、角色设定等能力,大大提升了客服的用户体验,帮助坐席承接了约30%的咨询问题,提效显著。 ![](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_9ebf50478c3622749e306dc050f9453d.png) --- # 数据回流操作流程 Source: https://ark.volcengine.com/region:cn-beijing/docs/data-backflow-workflow 数据回流功能支持将 **自定义推理接入点** (不支持预置推理接入点)的调用数据(含 request 与 response)全程加密投递至 AI 数据湖服务中。您的数据仅归您所有、仅您可见、仅您可用,未经授权平台不会存储或使用。调用推理服务后,数据可见可能存在 10 分钟延迟。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/dc57ca96064d4965bb60e9afe883f637~tplv-goo7wpa0wc-image.image) ## **开启数据投递** ### **前提条件** * **权限要求**:具备方舟 Standard 及以上权限。 * **服务开通**:已开通 TOS 对象存储与 AI 数据湖服务(可在方舟控制台一键开通)。 ### **操作步骤** * **创建推理接入点时开启**:在推理接入点配置页面勾选 **数据投递** 选项。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/cabf3e1949ad4cbbba62c727c346ad85~tplv-goo7wpa0wc-image.image) * **为推理接入点开启**:进入推理接入点详情页,启用数据投递功能。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/921c8ff459ae471c857c5a6a424bc37f~tplv-goo7wpa0wc-image.image) ## **数据集创建与筛选** ### **数据筛选** 在 **数据集 > 我的数据湖** 页面,通过“调用日期、模型版本、推理接入点 ”等筛选条件在全量数据中筛选出所需的数据范围,您可将筛选出数据采样并创建为数据集,用于模型精调等场景。 如有进阶数据筛选、处理、分析等需求,可参考 [AI 数据湖进阶操作](/docs/data-backflow-workflow#f7ffdf50)。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/e6be1334b4fe4e0aa5985f35009b0cd3~tplv-goo7wpa0wc-image.image) ### **数据集创建流程** 1. **开始创建**:点击「创建为数据集」进入配置页。 2. **数据采样策略**: * **按比例采样**:输入采样百分比(如 20%),从全量数据中随机抽取对应比例样本。 * **按数据量采样**:指定样本数量(如 10,000 条),按时间顺序或随机抽取固定数量数据。 3. **数据集配置**: * 选择 **新建数据集** 或 **已有数据集新版本**。 * 数据格式强制选择 **SFT 精调**。 4. **确认创建**:核对筛选条件与采样策略,提交后等待数据集生成。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/7e76d35026534644881ecfd779218d46~tplv-goo7wpa0wc-image.image) ## AI 数据湖进阶操作 ### 查看推理结果集 1. 通过 API 调用推理接入点后,数据自动以结构化形式入库至 **我的数据湖**。进入**火山方舟** **>** **数据集** **>** **我的数据湖** 以查看调用详情。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/b9cf58ce5b6b4687a06716a31bdadee6~tplv-goo7wpa0wc-image.image) 2. 单击 **前往AI 数据湖服务编辑数据**,进入 **LAS 控制台 >** **数据集 > 推理数据集**,查看对应 **推理数据集**。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/647dc7af39fd49c09986e313e4af1259~tplv-goo7wpa0wc-image.image) ### SQL 查询与导出 1. 单击目标数据集的名称进入详情页,选择 **SQL 查询**进行数据探查。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/2bc957170d2c446d9044929c7ec3e09e~tplv-goo7wpa0wc-image.image) 2. 如图所示,您可在左下角回顾**历史查询**,也可选择 **SQL** **模板**进行快速查询。您只需选择相应模板并运行查询,即可轻松获得准确结果。同时,点击右上角的**全屏预览**可进入沉浸式浏览。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/0cf581917d04476d96bd5f438a5c81c4~tplv-goo7wpa0wc-image.image) 3. SQL 查询结果支持导出至 **新数据集(LAS)、对象存储(TOS)以及火山方舟数据集**,您只需要在查询完成后单击**导出查询结果**,并配置相关参数。注意,此处导出**新数据集(LAS)** 为**推理数据集**而非**通用数据集**。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/2ea788da511f45c491c6bb00e6d113e5~tplv-goo7wpa0wc-image.image) ### 导出推理数据集 1. LAS 支持将 **推理数据集** 直接导出至方舟数据集以发起模型精调,同时也支持 SQL 查询结果直接导出至方舟。 2. 选择目标数据集或者 SQL 执行结果数据集,单击**导出查询结果**。勾选导出至**火山方舟**。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/599719940612454aa8a284a2f147e735~tplv-goo7wpa0wc-image.image) |**数据集名称** |导出数据集名称与当前推理数据集保持相同 | |---|---| |**导出字段** |可选,**全部字段** 和 **指定字段**。选择 **指定字段** 以选择列名,支持导出特定列下的数据 | |**导出至** |可选,此处勾选 **火山方舟** | |**导出格式** |.jsonl | |**方舟数据集类型** |目前支持 **文本生成-SFT 精调**,详情可见[格式总览](/docs/fine-tuning-dataset-format) | |**数据格式** |目前支持 **文本生成-SFT 精调**,详情可见[格式总览](/docs/fine-tuning-dataset-format) | 3. 单击 **开始导出** 完成操作。 ## **发起模型精调任务** 在控制台「模型精调」模块,点击「创建精调任务」进入配置界面。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/4c1689b193064df6b450608652733d34~tplv-goo7wpa0wc-image.image) 创建任务时注意以下几项配置: * **训练类型**:选择 **SFT 精调**。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/313bcaeb71fe42eba5cd1a1c11cf1065~tplv-goo7wpa0wc-image.image) * **数据集选择**:从下拉列表中选择步骤 3 生成的数据集版本 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/1080259fe347439981d7fd6742430738~tplv-goo7wpa0wc-image.image) 其他配置请参考[模型精调概述](/docs/fine-tuning-overview)完成。 精调完成后,模型将作为「自定义模型」导出到「模型仓库」。 ### **参考文档** * [模型精调概述](/docs/fine-tuning-overview) * [有监督微调最佳实践](/docs/supervised-fine-tuning-best-practices) ## **精调模型使用** ### **在线推理部署** 为了通过 API 调用、控制台在线测试、批量推理等方式使用精调后的模型,可以在「在线推理」模块「自定义推理接入点」创建推理接入点。 请参考[在线推理(常规)](/docs/online-inference-standard)获取推理接入点,**注意模型要选择模型仓库中的精调模型**。 ### **模型评测** 参考[创建模型评测任务](/docs/manual-evaluation-create-model-evaluation-tasks)新建评测任务 ,关联目标模型的推理接入点进行评测。 任务启动后,可在评测任务列表中查看任务的运行状态和评测进度。每个模型都有属于该模型的单独评测任务,以便进行独立或组合查看。 任务完成后,可以在任务详情页点击「评测报告」,查看当前模型在选择的能力维度下的单项得分和综合得分。每个能力维度下,可分别查看该能力项中各个数据集的得分。 --- # 强化学习最佳实践 Source: https://ark.volcengine.com/region:cn-beijing/docs/tutorials-reinforcement-learning-best-practices 强化学习(Reinforcement Learning, RL)是一种机器学习范式,其核心在于通过模型或智能体在推理或与环境的动态交互中得到反馈并基于反馈实现策略优化。 具体而言,强化学习过程包括rollout、reward、组织样本、train。其中rollout是模型进行推理或智能体进行多轮推理并调用外部插件工具;reward是将推理的过程和结果送入奖励函数或模型进行评分;组织样本是根据样本信息和反馈选择合适的样本并将格式转换为训练所需要的格式;train是对模型基于样本中的prompt response和奖励分数进行训练。 方舟强化学习将以上环节进行了一定程度的封装,用户仅需选择合适的模型、数据和训练方法,无需关注训练环境、配置和训练过程。对于Model RL主要关注奖励函数的构建;对于Agent RL主要关注rollout中的agent逻辑、奖励函数的构建、训练样本的选择和格式转换。 # 强化学习的意义和时机 * **意义**: * **进一步加强和对齐期望偏好** * 通常意义上,我们对一个pretrain基座模型先做SFT任务,教会模型学会某种范式。但是真实环境里,产生大量带标注的语料是一件艰难且复杂的任务。因此,通过少量带标注的语料,对pretrain基座进行SFT任务后,通过RL过程对这个SFT基座进一步来对齐预期的奖励目标。 * 在RL阶段,我们需要准备一个Reward方法 和 一个Reference Model。通过Reward方法,能够进一步加强和对齐reference model采样结果达到所期望的偏好。 * **突破SFT任务的局限性** * 一般情况,SFT任务往往是希望模型能学会的范式,而不期望的方面,则需要通过RL来进行对齐。比如,我们可以在Reward方法里,通过对期望的采样结果给予正反馈分数,对不期望的采样结果给予负反馈分数打压。以此,来弥补SFT任务的一些局限性。 * **增强模型探索和泛化能力** * 对比SFT任务,RL能够允许模型自主采样,并通过返回的reward来更新调整。不同之处在于,RL没有限制模型一定要输出某个答案,而是通过reward方式来引导模型探索和学习范式,因此,能够保证模型有一点的泛化和探索能力。当然,在此过程中,我们也可以通过调整KL_Loss来调整探索程度。 * **时机**: 接下来,我们讨论下什么时候开始去做强化学习。有以下几点建议: 1. 如果你的任务是客观性任务,而且你有很准确的reward计算标准,建议尝试。 1. 如果你希望抑制模型不输出某些方面内容,可以配合reward model,尝试RL任务。 1. 如果你希望模型的输出具有较好的多样性,建议尝试。 以上建议,都建立在本身reference model在多次rollout能够采样出较大概率能得到reward的能力,再考虑RL,否则RL阶段的奖励会比较稀疏,效果不佳。具体建议这样做: * 构建好评估集和评测指标 * 测试reference model在评估集上的指标表现,包括bo1和boN指标。观察模型boN指标是否显著高于bo1,且boN指标能接近预期。 # 选择训练方法 * DPO :Offline policy训练。当已经离线准备好偏好数据时,可选择DPO训练,详见[直接偏好优化最佳实践](/docs/direct-preference-optimization-best-practices)。 * 优点:无需训练奖励模型,显存占用低,适合快速微调。 * 缺点:依赖高质量偏好数据,若数据不准确,可能导致模型学习偏差。 * PPO:Online policy训练。是一种经典的策略优化算法,通过限制策略更新的幅度来确保训练的稳定性,比如通过裁剪概率比或 KL 散度约束,防止策略偏离初始模型过远。目标函数包含策略梯度项、裁剪机制和 KL 惩罚项。在语言模型训练中,PPO 需要同时训练策略模型(Actor)和价值模型(Critic),价值模型用于估计状态价值以计算优势函数。 * 优点:稳定可控,适合复杂任务,是通用强化学习的基准算法。 * GRPO:Online policy训练。通过群体内的相对比较来优化策略,摒弃了传统 PPO 中的价值网络(Critic 模型),采用动态梯度正则化技术,引入梯度监测器和自适应正则控制器。 * 优点:解决了 PPO 的数值不稳定问题,训练崩溃率得到降低。在超大规模模型训练和多步推理任务中表现出色,训练效率高,适合资源受限场景。 * DAPO:Online policy训练。由清华大学联合字节提出,旨在解决大规模 LLM 强化学习中的问题。包含裁剪偏移、动态采样、Token - 级策略梯度损失和溢出奖励塑造等关键技术。通过动态采样技术,过滤掉零梯度数据,提高训练效率和稳定性;Token - 级策略梯度损失在长思维链强化学习场景中有助于增强训练稳定性;溢出奖励塑造可以减少奖励噪声并稳定训练。 * 优点:通过其关键技术,有效解决了长链思维场景下的 RL 训练难题,在 AIME 2024 数学推理任务上,使用 Qwen2.5 - 32B 模型达到了 50 分,超过了 DeepSeek - R1 的 47 分,且仅使用了 DeepSeek - R1 - Zero - Qwen - 32B 所需训练步骤的 50%,训练效率得到提升,收敛速度加快。 # 数据准备 ## 数据格式 参考[格式总览](/docs/fine-tuning-dataset-format)。 ## 数据量级 不同任务所需数据量不同,一般越困难、判定规则越复杂,所需数据量越大。 可以先构建几百条数据进行尝试,根据效果指标判断是否要增加更多数据。 # 奖励规则配置
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/52c1ea3ed5924483a7816655889141c3~tplv-goo7wpa0wc-image.image)
    ## 不同场景的选择 * 预置函数: * 平台提供了常用的奖励函数供用户选择,以简化训练流程。当预置函数满足需求时,建议直接使用。 * 自定义函数: * 当预置函数无法满足要求时,可以使用自定义函数定义reward规则。 * 奖励模型: * 对于无明确判定规则的偏好类打分,需要使用Reward Model。可以通过自定义函数调用 方舟精调模型或基础模型+prompt 作为Reward Model,并在自定义函数中将模型输出结果解析成reward。 ## 预置函数
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/8ed214d181134f678f594cb6b3a72121~tplv-goo7wpa0wc-image.image)
    * 每种预置奖励规则可选择添加多次,具体介绍详见控制台。 * 字符串全等:信息抽取或者文本分类等任务,可以通过答案是否完全匹配来定义reward。 * 字符串包含:总结摘要类任务,可以通过和groundtruth比对关键信息是否包含来定义reward。 * 正则匹配:参考问答类型任务,输出可能是按某种格式输出,可以通过提取模型采样结果中的关键信息和参考答案匹配来定义reward。 * 长度惩罚:在某些任务中,我们可能不希望模型输出过于冗长的结果,那么我们可以用长度惩罚函数配合其他预置reward函数共同作用定义reward。 ## 自定义函数
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/690ee8a971954e37aae92c2f93ffb307~tplv-goo7wpa0wc-image.image)
    * 当预置函数无法满足要求时,可以选择自定义函数,通过Python代码的方式定义reward逻辑。比如,需要使用Reward Model时,可以通过请求推理方舟推理接入点作为Reward Model,得到输出结果解析成对应的reward。 > 创建自定义函数需开通函数服务,使用时按照 [函数服务产品计费文档](https://docs.volcengine.com/docs/6662/107454?lang=zh) 计费,不使用则不产生费用。 ### 函数签名 ```Python @dataclass class RewardFunctionResult: rewards: List[float] metrics: Dict[str, float] status: str # success/failure error: str def reward_fn( context: Dict[str, Any], sample: Dict[str, Any], completions: list[Dict[str,Any]])-> RewardFunctionResult ``` **入参** |字段 |类型 |描述 |样例 | |---|---|---|---| |context |context: Dict[str, Any] |* 该请求对应的任务信息,包含 |```JSON | \ | | | * 任务 Id |{ | \ | | | * 模型名 | "model_customization_job_id": "mcj_xxxxxx_xxx", | \ | | | * 模型版本 | "foundation_model_name": "doubao-seed-2-0-mini", | \ | | | * 训练方式 | "foundation_model_version": "260428", | \ | | | * 样本来源,train/test | "customization_type": "GRPO", | \ | | | * 是否是 mock 请求 | "phase":"train", | \ | | | | "is_mock": false, | \ | | | |} | \ | | | |``` | |sample |Dict[str, Any] |* rollout 输入的样本,与数据集内容完全一致 |```JSON | \ | | | |{ | \ | | | | "messages": [ | \ | | | | { | \ | | | | "role": "system", | \ | | | | "content": "你是一个擅长数据计算的人工智能助手。" | \ | | | | }, | \ | | | | { | \ | | | | "role": "user", | \ | | | | "content": "1+1=?" | \ | | | | } | \ | | | | ], | \ | | | | "tools": [], | \ | | | | "extra": { | \ | | | | "answer": 1234 | \ | | | | } | \ | | | |} | \ | | | |``` | |completions |list[Dict[str,Any]] |* rollout 输出的结果 |```JSON | \ | | |* messages 类型为数组,长度固定为 1 |[ | \ | | | | { | \ | | | | "messages": [ | \ | | | | { | \ | | | | "content": "等于 2", | \ | | | | "role": "assistant" | \ | | | | } | \ | | | | ], | \ | | | | "finish_reason": "stop", | \ | | | | "usage": { | \ | | | | "completion_tokens": 3, | \ | | | | "prompt_tokens:": 20, | \ | | | | "total_tokens": 23 | \ | | | | } | \ | | | | }, | \ | | | | { | \ | | | | "messages": [ | \ | | | | { | \ | | | | "reasoning_content": "嗯,用户问的是 1 加 1 等于多少。首先,我需要确认这是一个基本的算术问题。在常规的十进制数学中,1 加 1 的结果是 2。这是最基础的加法运算,应该没有其他复杂的情况需要考虑。用户可能是在测试我的基本计算能力,或者是刚开始学习数学的小朋友。所以直接回答 2 就可以了。", | \ | | | | "content": "1 + 1 等于 2。这是基础的算术加法运算,在十进制计数系统中,1 和 1 相加的结果是 2。", | \ | | | | "role": "assistant" | \ | | | | } | \ | | | | ], | \ | | | | "finish_reason": "stop", | \ | | | | "usage": { | \ | | | | "completion_tokens": 109, | \ | | | | "prompt_tokens:": 20, | \ | | | | "total_tokens": 129 | \ | | | | } | \ | | | | } | \ | | | |] | \ | | | |``` | **返回** |参数 |类型 |描述 |样例 | |---|---|---|---| | rewards |list[float] |* 按照 completions 的顺序返回每个采样的得分 |```JSON | \ | | |* 不计算、计算错误则在对应位置返回 null |[ | \ | | | | 0.0, | \ | | | | 1.0, | \ | | | | 0.5 | \ | | | |] | \ | | | |``` | |metrics |Dict[str, float] |* 自定义指标。支持返回 reward 过程的自定义指标,如计算耗时等。训练框架将把每个 step 的指标按 key 聚合出最大值,最小值和平均值。 |```Thrift | \ | | | |{ | \ | | | | "avg_length_reward": 0.49, | \ | | | | "avg_format_reward": 0.9, | \ | | | |} | \ | | | |``` | |status |str |* success/failure | | |error |str |* 如果status 为 failure,可携带具体失败原因或错误栈信息,会打印到训练日志中 | | * 创建自定义函数 * 点击 **添加新函数** ,输入函数名称。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/2d72531d050d4467ab05296775fc54da~tplv-goo7wpa0wc-image.image) * 编辑函数 * 在reward.py中编辑自定义函数,完成后可以点击上方的 **安装依赖** 按钮准备好函数运行环境。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/4f12922ebc8a4666b437b9caad1f3981~tplv-goo7wpa0wc-image.image) * 发布函数 * 完成编辑后,点击 **下一步:代码发布**,进入代码发布页面。 * 发布完成后可以通过 **测试** 请求函数查看返回的奖励得分是否符合预期,如不符合预期返回**上一步:编辑代码**。此外还可以进行查看日志等操作。 * 如函数测试结果符合预期,点击**完成**结束函数创建。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/483bad76e4d844e598f4a77ea873800e~tplv-goo7wpa0wc-image.image) * 添加自定义函数为奖励规则 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/a920edfe7a7342548a20612a6b0f20c0~tplv-goo7wpa0wc-image.image) ## 奖励混合
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/bd42ffdd178b44c796929f200cce9d4c~tplv-goo7wpa0wc-image.image)
    * 支持添加总共不超过5个奖励规则(包括预置函数和自定义函数),预置奖励函数可多次添加。 * 支持给每个预置函数或自定义函数设置权重倍率,最终奖励分数为各奖励规则分数加权求和 * reward = reward_1*权重倍率_1 + reward_2*权重倍率_2 ... * 权重倍率 默认值1倍,最小值0.01倍,最大值1000倍,最小调整单位0.01倍 # 训练配置 ## 参数配置 * kl_coeffient:客观性任务,kl_loss可以配置为0 * num_samples:根据数据量和训练效率综合考虑。 * max_new_tokens:根据效果指标里的rollout结果的截断比例判断调整最大输出token数量。 |**参数** |**说明** |参数名 |描述 | |---|---|---|---| |epoch |训练神经网络时将整个训练数据集完整训练的次数,迭代轮数越多,训练时间越长。 | | | |batch_size |每次迭代所使用的训练集样本数。 | | | |num_sampling |在rollout过程每条训练集prompt所生成的采样数量。 |mini_batch_size |用于计算强化学习中,每个batch的迭代次数(iterations)。迭代次数=batch_size * num_sampling / mini_batch_size。每次迭代都会从batch中随机出mini_batch_size个样本进行更新模型参数。需要保证mini_batch_size能够被batch_size * num_sampling整除。 | |learning_rate |权重参数更新的速度,它决定了每次更新时权重的调整程度。较大的学习率可能导致模型在训练过程中波动较大,收敛困难;较小的学习率可能导致收敛速度慢。 |lr |policy模型优化器学习率 | |max_tokens |rollout 过程模型回复最大长度(单位 token) |lr_warmup_steps |policy模型训练初期逐步提升学习率的步数,从0开始逐渐提升到设置的lr | |temperature |采样温度,控制了生成文本时对每个候选词的概率分布进行平滑的程度。当取值为 0 时模型仅考虑对数概率最大的一个 token。较高的值(如 0.8)会使输出更加随机,而较低的值(如 0.2)会使输出更加集中确定。通常建议仅调整 temperature 或 top_p 其中之一,不建议两者都修改。 |critic_lr |critic模型优化器学习率 | |top_p |核采样概率阈值。模型会考虑概率质量在 top_p 内的 token 结果。当取值为 0 时模型仅考虑对数概率最大的一个 token。0.1 意味着只考虑概率质量最高的前 10% 的 token,取值越大生成的随机性越高,取值越低生成的确定性越高。通常建议仅调整 temperature 或 top_p 其中之一,不建议两者都修改。 |critic_lr_warmup_steps |critic模型训练初期逐步提升学习率的步数,从0开始逐渐提升到设置的lr | |save_every_n_steps |控制产物保存间隔,每训练 n step 后以及每个epoch结束时,会执行产物保存逻辑。当产物数量超过「产出数量上限」后,较早的产物将被删除。 |critic_warmup_steps |critic模型训练初期提前更新的步数,在此期间policy模型不会更新。 | |validate_every_n_steps |控制验证逻辑执行间隔,每训练 n step 后以及每个epoch结束时,会执行验证逻辑。仅在配置验证集时生效。 |kl_coefficient |损失函数中 KL 散度项的权重系数。在GRPO/DAPO训练中,作用于最终的loss。在PPO训练中,作用于advantages的计算中。 | |mini_batch_size |训练过程的 batch_size。每个 step会执行 batch_size * num_sampling / mini_batch_size 轮权重更新逻辑。 |num_sampling |每个样本随机采样个数,目前仅支持GRPO配置,PPO默认为1 | |kl_coefficient |kl penalty 系数。增大该值会使模型更逼近原模型分布,减小生成文本的多样性;减小KL系数则允许模型生成更加多样化的文本,但可能偏离原模型分布。 |temperature |采样时调节输出概率分布的平滑度。值越小,结果越确定;越大越随机。 | | | |top_p |采样时仅保留概率和不超过 p 的最小token数。控制生成内容的多样性。 | | | |max_new_tokens |采样时,每个样本中允许输出的最大token数。最大输入的token数 = 模型支持的最大窗口(32k/128k等)- max_new_tokens。 | | | |save_every_n_steps |每训练 n 步保存一次模型参数,根据最大保存产物数进行滚动删除。 | | | |test_every_n_steps |每训练 n 步触发一次验证集评估,用于得到验证集指标。 | # 效果评估 ## 查看基础效果指标 主要关注`train/reward/final_rewards`和`test/reward/final_rewards`,代表每个batch在训练集和测试集上的reward得分平均值,是多个奖励函数的加权和,代表效果得分变化。 同时可以参考`generation`相关指标,了解模型输出情况随训练的变化。 |指标名 |描述 | |---|---| |train/batch_size |批次大小,和启动参数一致 | |train/epoch |第几轮训练,从0开始 | |train/global_step |第几个step,train从1开始 | |train/num_sampling |每个样本的采样数,和启动参数num_sampling一致 | |train/num_samples |暂时没有作用 | |train/num_replicated_samples |暂时没有作用 | |train/generation/prompt_length.mean |prompt的平均长度 | |train/generation/prompt_length.max |prompt的最大长度(截断后的最大长度,真实长度会更长) | |train/generation/prompt_length.clipfrac |prompt截断比例 | |train/generation/response_length.mean |response的平均长度 | |train/generation/response_length.max |response的最大长度 | |train/generation/response_length.clipfrac |response的截断比例 | |train/reward/final_rewards |batch的最后reward平均值,是多个奖励函数的加权和 | |train/reward/functions/{name}/rewards(mean) |名为{name}的奖励函数的平均值 | |train/reward/functions/{name}/rewards(bon) |名为{name}的奖励函数对每个样本采样n_sampling次的最大值,样本间再平均。可以表示模型最好的情况(best of) | |train/reward/functions/{name}/rewards(won) |名为{name}的奖励函数对每个样本采样n_sampling次的最小值,样本间再平均。可以表示模型最差的情况(wost of) | |train/advantage/advantages |奖励平均值 | |train/advantage/returns |回报的平均值,仅在PPO训练中出现 | |train/actor/lr |policy的优化器lr | |train/actor/grad_norm |policy的梯度norm值。 | |train/actor/logprobs |每个token输出概率的平均值。(暂未开放) | |train/actor/entropy |每个token熵的平均值,用于衡量模型稳定性。(暂未开放) | |train/actor/loss |policy的最终loss,包含pg_loss和kl_loss等加权和 | |train/actor/pg_loss |Policy Gradient Loss,策略梯度损失 | |train/actor/kl_loss |kl损失,仅在ppo训练中 | |train/actor/pg_clipfrac |pg_loss的裁剪比例 | |train/actor/pg_clipfrac_high |pg_loss的上裁剪比例 | |train/actor/pg_clipfrac_low |pg_loss的下裁剪比例 | |train/actor/pg_clipfrac2 |对于pg_loss过大的情况额外增加了一个裁剪方式,用于提高训练稳定性。这个指标一般在1e-4以下 | |train/critic/lr |critic的优化器lr | |train/critic/grad_norm |critic的梯度norm值 | |train/critic/vf_loss |Value Function Loss,价值函数损失 | |train/critic/vf_clipfrac |vf_loss的裁剪比例 | |train/actor/vf_clipfrac_high |vf_loss的上裁剪比例 | |train/actor/vf_clipfrac_low |vf_loss的下裁剪比例 | |test/xxxxxx |基于测试集的指标信息,具体含义参考对应的train指标 | ## 自定义效果指标 支持通过自定义奖励函数返回 reward 过程使用的自定义指标,如计算耗时等。返回方式[函数签名](/docs/tutorials-reinforcement-learning-best-practices#ef0c9cab)。 训练框架将把每个 step 的指标按 key 聚合出最大值、最小值和平均值,并和其他效果指标一起展示。 # 案例分享 ## Demo1 - 使用预置奖励函数的Math任务 ### 1.1 数据集准备 从开源openr1项目下载 https://huggingface.co/datasets/open-r1/OpenR1-Math-220k 数据集。将数据处理成方舟RL训练集格式,以下是一条示例: ```JSON {"messages":[{"role":"user","content":"5. Natural numbers are arranged in a table as shown.\n\n| 1 | | | | | | |\n| :--- | :--- | :--- | :--- | :--- | :--- | :--- |\n| 2 | 3 | | | | | |\n| 4 | 5 | 6 | | | | |\n| 7 | 8 | 9 | 10 | | | |\n| 11 | 12 | 13 | 14 | 15 | | |\n| 16 | 17 | 18 | 19 | 20 | 21 | |\n| 22 | 23 | 24 | 25 | 26 | 27 | 28 |\n\nThe table continues by writing natural numbers so that each subsequent row contains one more number than the previous row. Determine the sum of all numbers in the row $u$ where the number 1000 is located.\n\n## NATIONAL MATHEMATICS COMPETITION\n\nPoreč, 28. - 30. March 2019.\nPlease reason step by step, and put your final answer within \\boxed{}."}],"extra":{"answer":"45585"}} ``` ### 1.2 创建精调任务 * 使用预置reward函数
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/5f8cddc8464741849baf035f99ab3cf1~tplv-goo7wpa0wc-image.image)
    * 配置训练参数,建议: ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/99200a76a14846cda66cd147be10e03b~tplv-goo7wpa0wc-image.image) ### 1.3 观察训练指标 训练集rewards指标上涨正常,测试集正确率提升10% 提升幅度30% ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/4ab0de57935d4e409a661a2456c8d17d~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/d3100d1e27744092a131afd2a6a0fa0d~tplv-goo7wpa0wc-image.image) ## Demo2 - 使用自定义奖励函数+sandbox的Code任务 ### 2.1 数据集准备 参考论文:[CodeContests+: High-Quality Test Case Generation for Competitive Programming](https://arxiv.org/abs/2506.05817) 数据集:https://huggingface.co/datasets/ByteDance-Seed/Code-Contests-Plus Test Cases:https://github.com/bytedance/SandboxFusion ### 2.2 Unit Test Cases上传对象存储 由于OJ代码类题目的test cases需要比较多的输入输出才能校验出给出的代码片段是否足够正确,往往有的test cases文件会达到MB级别,甚至GB级别。因此,这里通过将test cases保存在火山对象存储TOS进行存储,在真实需要计算reward时,通过sandbox拉取tos存储的test cases进行校验。[TOS介绍文档](https://www.volcengine.com/docs/6349) 以下是一条保存的test cases示例: ```JSON [{"type": "StandardIO", "data": {"input": {"stdin": "5 5\n1 0 10\n1 0 10\n3 1 2\n1 0 6\n3 1 2\n"}, "output": {"stdout": "YES\nYES\n"}}}, {"type": "StandardIO", "data": {"input": {"stdin": "5 8\r\n1 -5 8\r\n1 -4 8\r\n1 -3 8\r\n1 2 7\r\n3 1 3\r\n2 2\r\n3 1 3\r\n3 3 4\r\n"}, "output": {"stdout": "NO\r\nYES\r\nYES\r\n"}}}] ```
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/eacc4799a48f4afd96fae475a7caf950~tplv-goo7wpa0wc-image.image)
    **`并且,在训练集的extra字段中使用内网链接。`** 公网链接示例:`https://duncan.tos-cn-beijing.volces.com/XXX/XXXX.json` 内网链接示例:`https://duncan.tos-cn-beijing.ivolces.com/XXX/XXX.json` ### 2.3 创建Code Sandbox 函数服务 * 参考 https://www.volcengine.com/docs/6662/1538139 创建代码沙箱 注意:请根据任务情况或日志服务中的报错信息,调整实例规格。当前任务测试用例较大,推荐 8核 32G。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/39b02a0894d646cc99d2f3aa9205f6b5~tplv-goo7wpa0wc-image.image)
    * 代码沙箱函数服务测试: 以下是一个测试示例: ```JSON { "data": { "dataset": "code_test", "id": 1566, "completion": "```cpp\n#include \n#include \n#include \n\nusing namespace std;\n\nconst int maxn = 2e5 + 5;\nvector g[maxn];\nint deg[maxn];\n\nbool isBud(int v) {\n if (v == 1) return false;\n if (deg[v] < 1) return false;\n for (int u : g[v]) {\n if (deg[u] != 1) return false;\n }\n return true;\n}\n\nvoid dfs(int v, int p) {\n for (int u : g[v]) {\n if (u == p) continue;\n dfs(u, v);\n }\n if (v != 1 && deg[v] == 1) {\n int cur = v;\n while (cur != 1 && deg[cur] == 1) cur = g[cur][0];\n if (cur == 1) {\n g[p].erase(find(g[p].begin(), g[p].end(), v));\n int newParent = v == g[v][0]? p : g[v][0];\n g[newParent].push_back(v);\n } else {\n g[g[cur][0]].erase(find(g[g[cur][0]].begin(), g[g[cur][0]].end(), cur));\n g[cur].erase(find(g[cur].begin(), g[cur].end(), v));\n int newParent = v == g[v][0]? cur : g[v][0];\n g[newParent].push_back(v);\n }\n deg[p]--;\n deg[v] = 0;\n for (int u : g[v]) {\n deg[u]--;\n }\n }\n}\n\nint main() {\n int t;\n cin >> t;\n while (t--) {\n int n;\n cin >> n;\n for (int i = 1; i <= n; ++i) {\n g[i].clear();\n deg[i] = 0;\n }\n for (int i = 0; i < n - 1; ++i) {\n int u, v;\n cin >> u >> v;\n g[u].push_back(v);\n g[v].push_back(u);\n deg[u]++;\n deg[v]++;\n }\n while (true) {\n bool foundBud = false;\n for (int v = 1; v <= n; ++v) {\n if (isBud(v)) {\n dfs(v, g[v][0]);\n foundBud = true;\n break;\n }\n }\n if (!foundBud) break;\n }\n int leaves = 0;\n for (int i = 1; i <= n; ++i) {\n if (deg[i] == 1) leaves++;\n }\n cout << leaves << endl;\n }\n return 0;\n}\n```", "config": { "dataset_type": "CommonOJDataset", "language": "cpp", "locale": "string", "provided_data": { "test": { "location": "URL", "url": "https://duncan.tos-cn-beijing.ivolces.com/rl_data/code_forces_ut_cases/ut_cases/1566_1566_E.json" } }, "run_timeout": 1, "extra": {} } }, "method": "POST", "path": "/submit", "headers": {} } ``` 函数返回,检查返回体中的 `accepted` 字段是否正常。 ```JSON { "id": 1566, "accepted": false, "extracted_code": "#include \n#include \n#include \n\nusing namespace std;\n\nconst int maxn = 2e5 + 5;\nvector g[maxn];\nint deg[maxn];\n\nbool isBud(int v) {\n if (v == 1) return false;\n if (deg[v] < 1) return false;\n for (int u : g[v]) {\n if (deg[u] != 1) return false;\n }\n return true;\n}\n\nvoid dfs(int v, int p) {\n for (int u : g[v]) {\n if (u == p) continue;\n dfs(u, v);\n }\n if (v != 1 && deg[v] == 1) {\n int cur = v;\n while (cur != 1 && deg[cur] == 1) cur = g[cur][0];\n if (cur == 1) {\n g[p].erase(find(g[p].begin(), g[p].end(), v));\n int newParent = v == g[v][0]? p : g[v][0];\n g[newParent].push_back(v);\n } else {\n g[g[cur][0]].erase(find(g[g[cur][0]].begin(), g[g[cur][0]].end(), cur));\n g[cur].erase(find(g[cur].begin(), g[cur].end(), v));\n int newParent = v == g[v][0]? cur : g[v][0];\n g[newParent].push_back(v);\n }\n deg[p]--;\n deg[v] = 0;\n for (int u : g[v]) {\n deg[u]--;\n }\n }\n}\n\nint main() {\n int t;\n cin >> t;\n while (t--) {\n int n;\n cin >> n;\n for (int i = 1; i <= n; ++i) {\n g[i].clear();\n deg[i] = 0;\n }\n for (int i = 0; i < n - 1; ++i) {\n int u, v;\n cin >> u >> v;\n g[u].push_back(v);\n g[v].push_back(u);\n deg[u]++;\n deg[v]++;\n }\n while (true) {\n bool foundBud = false;\n for (int v = 1; v <= n; ++v) {\n if (isBud(v)) {\n dfs(v, g[v][0]);\n foundBud = true;\n break;\n }\n }\n if (!foundBud) break;\n }\n int leaves = 0;\n for (int i = 1; i <= n; ++i) {\n if (deg[i] == 1) leaves++;\n }\n cout << leaves << endl;\n }\n return 0;\n}", "full_code": null, "test_code": null, "tests": [ { "passed": false, "exec_info": { "status": "Success", "message": "", "compile_result": { "status": "Finished", "execution_time": 0.3585023880004883, "return_code": 0, "stdout": "", "stderr": "" }, "run_result": { "status": "Finished", "execution_time": 0.02179861068725586, "return_code": 0, "stdout": "4\n2\n111\n1\n4\n104\n95\n1\n2\n4\n", "stderr": "" }, "executor_pod_name": "lybt1t82-ck1hh536i1-reserved-7cfb6879d4-tcpfh", "files": {} }, "test_info": { "input": { "stdin": "10\n7\n1 2\n1 3\n1 4\n2 5\n2 6\n4 7\n49\n1 2\n2 3\n3 4\n4 5\n5 6\n6 7\n7 8\n8 9\n9 10\n10 11\n11 12\n12 13\n13 14\n14 15\n15 16\n16 17\n17 18\n18 19\n19 20\n20 21\n21 22\n22 23\n23 24\n24 25\n25 26\n26 27\n27 28\n28 29\n29 30\n30 31\n31 32\n32 33\n33 34\n34 35\n35 36\n36 37\n37 38\n38 39\n39 40\n40 41\n41 42\n42 43\n43 44\n44 45\n45 46\n46 47\n47 48\n48 49\n223\n1 2\n2 113\n1 3\n3 114\n1 4\n4 115\n1 5\n5 116\n1 6\n6 117\n1 7\n7 118\n1 8\n8 119\n1 9\n9 120\n1 10\n10 121\n1 11\n11 122\n1 12\n12 123\n1 13\n13 124\n1 14\n14 125\n1 15\n15 126\n1 16\n16 127\n1 17\n17 128\n1 18\n18 129\n1 19\n19 130\n1 20\n20 131\n1 21\n21 132\n1 22\n22 133\n1 23\n23 134\n1 24\n24 135\n1 25\n25 136\n1 26\n26 137\n1 27\n27 138\n1 28\n28 139\n1 29\n29 140\n1 30\n30 141\n1 31\n31 142\n1 32\n32 143\n1 33\n33 144\n1 34\n34 145\n1 35\n35 146\n1 36\n36 147\n1 37\n37 148\n1 38\n38 149\n1 39\n39 150\n1 40\n40 151\n1 41\n41 152\n1 42\n42 153\n1 43\n43 154\n1 44\n44 155\n1 45\n45 156\n1 46\n46 157\n1 47\n47 158\n1 48\n48 159\n1 49\n49 160\n1 50\n50 161\n1 51\n51 162\n1 52\n52 163\n1 53\n53 164\n1 54\n54 165\n1 55\n55 166\n1 56\n56 167\n1 57\n57 168\n1 58\n58 169\n1 59\n59 170\n1 60\n60 171\n1 61\n61 172\n1 62\n62 173\n1 63\n63 174\n1 64\n64 175\n1 65\n65 176\n1 66\n66 177\n1 67\n67 178\n1 68\n68 179\n1 69\n69 180\n1 70\n70 181\n1 71\n71 182\n1 72\n72 183\n1 73\n73 184\n1 74\n74 185\n1 75\n75 186\n1 76\n76 187\n1 77\n77 188\n1 78\n78 189\n1 79\n79 190\n1 80\n80 191\n1 81\n81 192\n1 82\n82 193\n1 83\n83 194\n1 84\n84 195\n1 85\n85 196\n1 86\n86 197\n1 87\n87 198\n1 88\n88 199\n1 89\n89 200\n1 90\n90 201\n1 91\n91 202\n1 92\n92 203\n1 93\n93 204\n1 94\n94 205\n1 95\n95 206\n1 96\n96 207\n1 97\n97 208\n1 98\n98 209\n1 99\n99 210\n1 100\n100 211\n1 101\n101 212\n1 102\n102 213\n1 103\n103 214\n1 104\n104 215\n1 105\n105 216\n1 106\n106 217\n1 107\n107 218\n1 108\n108 219\n1 109\n109 220\n1 110\n110 221\n1 111\n111 222\n1 112\n112 223\n3\n1 2\n2 3\n7\n1 2\n1 3\n1 4\n2 5\n2 6\n4 7\n209\n1 2\n2 106\n1 3\n3 107\n1 4\n4 108\n1 5\n5 109\n1 6\n6 110\n1 7\n7 111\n1 8\n8 112\n1 9\n9 113\n1 10\n10 114\n1 11\n11 115\n1 12\n12 116\n1 13\n13 117\n1 14\n14 118\n1 15\n15 119\n1 16\n16 120\n1 17\n17 121\n1 18\n18 122\n1 19\n19 123\n1 20\n20 124\n1 21\n21 125\n1 22\n22 126\n1 23\n23 127\n1 24\n24 128\n1 25\n25 129\n1 26\n26 130\n1 27\n27 131\n1 28\n28 132\n1 29\n29 133\n1 30\n30 134\n1 31\n31 135\n1 32\n32 136\n1 33\n33 137\n1 34\n34 138\n1 35\n35 139\n1 36\n36 140\n1 37\n37 141\n1 38\n38 142\n1 39\n39 143\n1 40\n40 144\n1 41\n41 145\n1 42\n42 146\n1 43\n43 147\n1 44\n44 148\n1 45\n45 149\n1 46\n46 150\n1 47\n47 151\n1 48\n48 152\n1 49\n49 153\n1 50\n50 154\n1 51\n51 155\n1 52\n52 156\n1 53\n53 157\n1 54\n54 158\n1 55\n55 159\n1 56\n56 160\n1 57\n57 161\n1 58\n58 162\n1 59\n59 163\n1 60\n60 164\n1 61\n61 165\n1 62\n62 166\n1 63\n63 167\n1 64\n64 168\n1 65\n65 169\n1 66\n66 170\n1 67\n67 171\n1 68\n68 172\n1 69\n69 173\n1 70\n70 174\n1 71\n71 175\n1 72\n72 176\n1 73\n73 177\n1 74\n74 178\n1 75\n75 179\n1 76\n76 180\n1 77\n77 181\n1 78\n78 182\n1 79\n79 183\n1 80\n80 184\n1 81\n81 185\n1 82\n82 186\n1 83\n83 187\n1 84\n84 188\n1 85\n85 189\n1 86\n86 190\n1 87\n87 191\n1 88\n88 192\n1 89\n89 193\n1 90\n90 194\n1 91\n91 195\n1 92\n92 196\n1 93\n93 197\n1 94\n94 198\n1 95\n95 199\n1 96\n96 200\n1 97\n97 201\n1 98\n98 202\n1 99\n99 203\n1 100\n100 204\n1 101\n101 205\n1 102\n102 206\n1 103\n103 207\n1 104\n104 208\n1 105\n105 209\n191\n1 2\n2 97\n1 3\n3 98\n1 4\n4 99\n1 5\n5 100\n1 6\n6 101\n1 7\n7 102\n1 8\n8 103\n1 9\n9 104\n1 10\n10 105\n1 11\n11 106\n1 12\n12 107\n1 13\n13 108\n1 14\n14 109\n1 15\n15 110\n1 16\n16 111\n1 17\n17 112\n1 18\n18 113\n1 19\n19 114\n1 20\n20 115\n1 21\n21 116\n1 22\n22 117\n1 23\n23 118\n1 24\n24 119\n1 25\n25 120\n1 26\n26 121\n1 27\n27 122\n1 28\n28 123\n1 29\n29 124\n1 30\n30 125\n1 31\n31 126\n1 32\n32 127\n1 33\n33 128\n1 34\n34 129\n1 35\n35 130\n1 36\n36 131\n1 37\n37 132\n1 38\n38 133\n1 39\n39 134\n1 40\n40 135\n1 41\n41 136\n1 42\n42 137\n1 43\n43 138\n1 44\n44 139\n1 45\n45 140\n1 46\n46 141\n1 47\n47 142\n1 48\n48 143\n1 49\n49 144\n1 50\n50 145\n1 51\n51 146\n1 52\n52 147\n1 53\n53 148\n1 54\n54 149\n1 55\n55 150\n1 56\n56 151\n1 57\n57 152\n1 58\n58 153\n1 59\n59 154\n1 60\n60 155\n1 61\n61 156\n1 62\n62 157\n1 63\n63 158\n1 64\n64 159\n1 65\n65 160\n1 66\n66 161\n1 67\n67 162\n1 68\n68 163\n1 69\n69 164\n1 70\n70 165\n1 71\n71 166\n1 72\n72 167\n1 73\n73 168\n1 74\n74 169\n1 75\n75 170\n1 76\n76 171\n1 77\n77 172\n1 78\n78 173\n1 79\n79 174\n1 80\n80 175\n1 81\n81 176\n1 82\n82 177\n1 83\n83 178\n1 84\n84 179\n1 85\n85 180\n1 86\n86 181\n1 87\n87 182\n1 88\n88 183\n1 89\n89 184\n1 90\n90 185\n1 91\n91 186\n1 92\n92 187\n1 93\n93 188\n1 94\n94 189\n1 95\n95 190\n1 96\n96 191\n3\n1 2\n2 3\n99\n1 2\n2 3\n3 4\n4 5\n5 6\n6 7\n7 8\n8 9\n9 10\n10 11\n11 12\n12 13\n13 14\n14 15\n15 16\n16 17\n17 18\n18 19\n19 20\n20 21\n21 22\n22 23\n23 24\n24 25\n25 26\n26 27\n27 28\n28 29\n29 30\n30 31\n31 32\n32 33\n33 34\n34 35\n35 36\n36 37\n37 38\n38 39\n39 40\n40 41\n41 42\n42 43\n43 44\n44 45\n45 46\n46 47\n47 48\n48 49\n49 50\n50 51\n51 52\n52 53\n53 54\n54 55\n55 56\n56 57\n57 58\n58 59\n59 60\n60 61\n61 62\n62 63\n63 64\n64 65\n65 66\n66 67\n67 68\n68 69\n69 70\n70 71\n71 72\n72 73\n73 74\n74 75\n75 76\n76 77\n77 78\n78 79\n79 80\n80 81\n81 82\n82 83\n83 84\n84 85\n85 86\n86 87\n87 88\n88 89\n89 90\n90 91\n91 92\n92 93\n93 94\n94 95\n95 96\n96 97\n97 98\n98 99\n7\n1 2\n1 3\n1 4\n2 5\n2 6\n4 7\n" }, "output": { "stdout": "2\n1\n1\n1\n2\n1\n1\n1\n1\n2\n" } } } ], "extracted_type": null, "extra": null } ``` ### 2.4 Reward函数创建 在创建RL精调任务时,在 奖励规则部分添加 自定义奖励函数
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/39c58b3b2e0b45fcb0d61d539229c800~tplv-goo7wpa0wc-image.image)
    创建后,主要修改 `rl_reward.py` 部分的代码,并在 `requirements.txt` 中增加需要的依赖包。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/cdeb838444ae4c4a84fc9616a5d72bd2~tplv-goo7wpa0wc-image.image)
    以下是requirements.txt的示例: ```Plain Text requests==2.32.3 ``` 以下是reward.py的示例: **sandbox_url 替换成 对应的 sandbox函数服务的地址**。 ```Python import random import time import logging from typing import Dict, Any, List from concurrent.futures import ThreadPoolExecutor, as_completed from rl_types import RewardFunctionResult, RewardStatus import http.client import json import requests import traceback logging.basicConfig( level="INFO", format="%(asctime)s %(levelname)s [%(filename)s:%(lineno)d] - %(message)s", ) sandbox_url = "https://sd1048j77bam7gokaj98g.apigateway-cn-beijing.volceapi.com/submit" def reward_fn( context: Dict[str, Any], sample: Dict[str, Any], completions: List[Dict[str, Any]]) -> RewardFunctionResult: metrics = {} rewards = [] status = RewardStatus.SUCCESS time_cost = [] # 提前提取公共参数(所有completion共享同一组extra参数) try: extra = sample['extra'] language = extra['language'] time_limit = float(extra['time_limit']) contest_id = extra['contest_id'] url = extra['url'] except KeyError as e: logging.error(f"Sample missing required extra field: {e}") return RewardFunctionResult([0], {"error": 1.0}, RewardStatus.FAILURE) # 定义线程任务函数(封装单个completion的处理逻辑) def process_single_completion(completion: Dict[str, Any]) -> tuple: """ 处理单个completion的沙箱请求,返回(奖励值,耗时,错误信息) """ start_time = time.time() try: # 提取模型输出内容 logging.info(f"completion: {completion}") resp = completion['messages']['content'] # 调用沙箱接口 reward, payload = request_sandbox(resp, language, time_limit, contest_id, url) # 计算奖励值(根据业务逻辑调整) true_reward = 1.0 if reward else 0.0 elapsed = time.time() - start_time return (true_reward, elapsed, None) # (奖励,耗时,无错误) except Exception as e: traceback.print_exc() elapsed = time.time() - start_time logging.error(f"Error processing completion: {str(e)}, 请求:{payload}") return (0.0, elapsed, e) # (无奖励,耗时,错误信息) # 使用线程池并发处理所有completions with ThreadPoolExecutor(max_workers=30) as executor: # 提交所有任务到线程池 results = executor.map(process_single_completion, completions) # 等待所有任务完成并收集结果 for res in results: true_reward, elapsed, error = res # 记录耗时 time_cost.append(elapsed) # 处理奖励值 if true_reward is not None: rewards.append(true_reward) # 处理错误状态(只要有一个失败则整体标记为失败) if error is not None: status = RewardStatus.FAILURE # 计算指标 if time_cost: metrics['sandbox_cost_max'] = max(time_cost) metrics['sandbox_cost_avg'] = sum(time_cost) / len(time_cost) else: metrics['sandbox_cost_max'] = 0 metrics['sandbox_cost_avg'] = 0 return RewardFunctionResult(rewards, metrics, status) def request_sandbox(completion: str, language: str, time_limit: float, contest_id: str, url: str) -> bool: """ 调用沙箱接口(保持原逻辑,添加异常处理) """ try: payload = json.dumps({ "dataset": "code_test", "id": int(contest_id), "completion": completion, "config": { "dataset_type": "CommonOJDataset", "language": language, "locale": "string", "provided_data": { "test": { "location": "URL", "url": url } }, "run_timeout": float(time_limit), "extra": {} } }) headers = { 'Content-Type': 'application/json', 'Accept': 'application/json', } response = requests.request("POST", sandbox_url, headers=headers, data=payload) response.raise_for_status() # 检查HTTP错误状态码 result = json.loads(response.text) return result.get('accepted', False), payload # 确保有默认值 except requests.exceptions.RequestException as e: logging.error(f"Sandbox request failed: {str(e)}, 请求:{payload}") raise # 向上抛出异常以便上层处理 except json.JSONDecodeError: logging.error("Invalid JSON response from sandbox") raise except KeyError: logging.error("Missing 'accepted' field in sandbox response") raise ``` * 函数测试 以下是一个测试示例: ```JSON { "data": { "context": { "model_customization_job_id": "mcj_xxxxxx_xxx", "foundation_model_name": "doubao-seed-2-0-mini", "foundation_model_version": "260428", "customization_type": "GRPO", "is_mock": false }, "sample":{ "messages": [ { "role": "user", "content": "You are an expert competitive programmer. You will be given a problem statement, test case constraints and example test inputs and outputs. Please reason step by step about the solution (that must respect memory and time limits), then provide a complete implementation in c++17.\n\nYour solution must read input from standard input (cin), write output to standard output (cout).\nDo not include any debug prints or additional output.\n\nPut your final solution within a single code block:\n```cpp\n\n```\n\nExecution time limit: 2.0 seconds\nMemory limit: 256.0 MB\n\n# Problem\nDue to the recent popularity of the Deep learning new countries are starting to look like Neural Networks. That is, the countries are being built deep with many layers, each layer possibly having many cities. They also have one entry, and one exit point.\n\nThere are exactly L layers, each having N cities. Let us look at the two adjacent layers L1 and L2. Each city from the layer L1 is connected to each city from the layer L2 with the traveling cost cij for $$i,j\\in\\{1,2,\\ldots,N\\}$$, and each pair of adjacent layers has the same cost in between their cities as any other pair (they just stacked the same layers, as usual). Also, the traveling costs to each city from the layer L2 are same for all cities in the L1, that is cij is the same for $$i \\in \\{1, 2, \\ldots, N\\}$$, and fixed j.\n\nDoctor G. needs to speed up his computations for this country so he asks you to find the number of paths he can take from entry to exit point such that his traveling cost is divisible by given number M.\n\n## Input Format\nThe first line of input contains N (1 \u2264 N \u2264 106), L (2 \u2264 L \u2264 105) and M (2 \u2264 M \u2264 100), the number of cities in each layer, the number of layers and the number that travelling cost should be divisible by, respectively.\n\nSecond, third and fourth line contain N integers each denoting costs 0 \u2264 cost \u2264 M from entry point to the first layer, costs between adjacent layers as described above, and costs from the last layer to the exit point.\n\n## Output Format\nOutput a single integer, the number of paths Doctor G. can take which have total cost divisible by M, modulo 109 + 7.\n\n## Examples\n```input\n2 3 13\n4 6\n2 1\n3 4\n```\n```output\n2\n```\n\n## Note\nThis is a country with 3 layers, each layer having 2 cities. Paths $$6 \rightarrow 2 \rightarrow 2 \rightarrow 3$$, and $$6 \rightarrow 2 \rightarrow 1 \rightarrow 4$$ are the only paths having total cost divisible by 13. Notice that input edges for layer cities have the same cost, and that they are same for all layers.\n\nNow solve the problem and return the code." } ], "tools": [], "extra": { "contest_id": 852, "language": "python", "time_limit": "0.5", "url":"https:\/\/duncan.tos-cn-beijing.volces.com\/rl_data\/code_forces_ut_cases\/ut_cases\/0852_852_B.json" } }, "completions": [ { "messages": [{ "role": "assistant", "content": "### Solution Code\n```cpp\n#include \n#include \n#include \nusing namespace std;\n\nconst int MOD = 1e9 + 7;\n\nvector> multiply(const vector> &a, const vector> &b, int m) {\n vector> res(m, vector(m, 0));\n for (int i = 0; i < m; ++i) {\n for (int k = 0; k < m; ++k) {\n if (a[i][k] == 0) continue;\n for (int j = 0; j < m; ++j) {\n res[i][j] = (res[i][j] + (long long)a[i][k] * b[k][j]) % MOD;\n }\n }\n }\n return res;\n}\n\nvector> matrix_pow(vector> base, int power, int m) {\n vector> res(m, vector(m, 0));\n for (int i = 0; i < m; ++i) {\n res[i][i] = 1;\n }\n while (power > 0) {\n if (power % 2 == 1) {\n res = multiply(res, base, m);\n }\n base = multiply(base, base, m);\n power /= 2;\n }\n return res;\n}\n\nint main() {\n ios_base::sync_with_stdio(false);\n cin.tie(nullptr);\n \n int N, L, M;\n cin >> N >> L >> M;\n \n vector a(N), b(N), c(N);\n for (int i = 0; i < N; ++i) cin >> a[i];\n for (int i = 0; i < N; ++i) cin >> b[i];\n for (int i = 0; i < N; ++i) cin >> c[i];\n \n vector cnt_first(M, 0), cnt_b(M, 0), cnt_d(M, 0);\n for (int x : a) cnt_first[x % M]++;\n for (int x : b) cnt_b[x % M]++;\n for (int i = 0; i < N; ++i) {\n int d = (b[i] + c[i]) % M;\n cnt_d[d]++;\n }\n \n if (L == 2) {\n int ans = 0;\n for (int r = 0; r < M; ++r) {\n int t = (M - r) % M;\n ans = (ans + (long long)cnt_first[r] * cnt_d[t]) % MOD;\n }\n cout << ans << endl;\n } else {\n int k = L - 2;\n vector> T(M, vector(M, 0));\n for (int i = 0; i < M; ++i) {\n for (int j = 0; j < M; ++j) {\n int t = (j - i) % M;\n if (t < 0) t += M;\n T[i][j] = cnt_b[t];\n }\n }\n \n vector> T_pow = matrix_pow(T, k, M);\n \n vector dp_mid(M, 0);\n for (int i = 0; i < M; ++i) {\n if (cnt_first[i] == 0) continue;\n for (int j = 0; j < M; ++j) {\n dp_mid[j] = (dp_mid[j] + (long long)cnt_first[i] * T_pow[i][j]) % MOD;\n }\n }\n \n int ans = 0;\n for (int j = 0; j < M; ++j) {\n int t = (M - j) % M;\n ans = (ans + (long long)dp_mid[j] * cnt_d[t]) % MOD;\n }\n cout << ans << endl;\n }\n \n return 0;\n}" }] }] }, "method": "POST", "path": "/", "headers": {} } ``` 观察结果返回: ``` { "rewards": [ 0 ], "metrics": { "sandbox_cost_max": 7.152166843414307, "sandbox_cost_avg": 7.152166843414307 }, "status": "success" } ``` ### 2.5 创建精调任务 参数配置建议: * kl_coefficient:客观性任务,kl_loss可以配置为0 * num_samples:根据数据量和训练效率综合考虑。 * max_new_tokens:根据效果指标里的rollout结果的截断比例判断调整最大输出token数量。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/7158f10c28814a6ca7aaaaed3e75c897~tplv-goo7wpa0wc-image.image)
    ### 2.6 观察训练指标 测试集正确率提升4%
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/f8b6b5ee11a946a6983f29c257c8bc33~tplv-goo7wpa0wc-image.image)
    --- # 如何设置控制台登录保持时间 Source: https://ark.volcengine.com/region:cn-beijing/docs/how-to-set-console-session-duration 如您遇到需要频繁登录的问题,您可以通过设置当前账号的登录状态保持时间来解决。火山方舟控制台当前支持登录状态保持最多 48 小时(2880分钟)。 > * 账号的安全操作属于敏感操作,过程中将会被要求进行操作保护的二次校验,需要使用MFA、安全手机或安全邮箱进行验证。 > * 根据企业的安全管控需求不同,部分企业的子账号可能无法设置此功能,请与您的管理员联系。 ## 主账号设置 当您的登录身份为主账号时,您可前往 [账号管理-安全设置](https://console.volcengine.com/user/security/) 修改当前账号的规则。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/ce1ad7cec2a34225bd347235fe406de9~tplv-goo7wpa0wc-image.image) ## 子账号设置 当您的登录身份为子账号时,您可前往 [访问控制-用户管理-安全设置](https://console.volcengine.com/iam/identitymanage/settings) 修改子用户的登录会话设置,操作同上。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/5a6419b16d934dc4b482c5b5a33531ca~tplv-goo7wpa0wc-image.image) > 如果您无法访问 [访问控制-用户管理-安全设置](https://console.volcengine.com/iam/identitymanage/settings) 页面,可能是主账号屏蔽了部分安全规则,请联系您的主账号管理员。 --- # 角色扮演场景提示词指南 Source: https://ark.volcengine.com/region:cn-beijing/docs/roleplay-prompt-guide 本指南旨在帮助你高效撰写角色扮演提示词 (Prompt) ,以创建符合人设、交互自然且富有沉浸感的 AI 智能体角色。本指南主要面向需要创建角色扮演 AI 智能体的用户,如编剧、AI 开发者、社交娱乐等场景内容创作者。 ## 为什么要做提示词优化 提示词是角色扮演场景控制模型回复的重要手段。 以下通过两段对话效果的对比,展示一个好的提示词对于角色人设、世界观方面的增益效果。 |优化程度 |提示词内容 |模型回复 |说明 | |---|---|---|---| |原始 |你是小兰,说话温柔体贴。你经常会与我聊天。 |我能理解你的心情,高考是一件很重要的事情,考砸了肯定会让人感到失落和沮丧。不过,你不要太自责了,每个人都会遇到挫折和失败,这是人生的一部分。重要的是,你要从这次经历中吸取教训,找出自己的不足之处,然后努力改进。你觉得自己考砸的原因是什么呢? |较生硬、机械感较重,且输出的内容过多,不符合日常聊天的场景。 | |简单优化 |你是小兰,性格开朗,说话待人温柔体贴。你和我关系非常亲昵,是无话不谈的好朋友。平时你经常会与我聊天,主动关心我,主动约我做各种事情。 |啊,怎么回事,是没有发挥好吗?你先别难过,我们一起想想办法。 |语气、说话的内容会更自然,更口语化。 | |完整优化 |简介: 你是小兰,一位自由插画师。 |(*眼神中充满了关切,轻轻拍了拍你的肩膀*)别太难过了,一次考试失利并不代表什么。 |输出接近人设以及日常交流 | \ | |性别: 女 职业: 自由插画师 | | | \ | |性格特点: 你性格开朗,像个小太阳,总是散发着温暖的光芒。待人温柔体贴,心思细腻,能敏锐地察觉到他人的情绪变化。 | | | \ | |语言特点: 语气轻柔,用词温馨,让人如沐春风。 | | | \ | |人物关系: 我是你无话不谈的好朋友,你常常关心我,主动约我,陪伴我度过许多美好时光。 | | | \ | |人际关系: 李雪是你的闺蜜,你们一起逛街分享美食;张昊是你的合作伙伴,在工作上给予你支持。 | | | \ | |过往经历: 你曾在我遭遇挫折时,默默地陪伴在我身边,用温柔的话语鼓励我,让我重新振作起来。一起经历过风风雨雨,感情愈发深厚。 | | | \ | |语言风格: | | | \ | |你使用口语进行表达,比如会使用一些语气词和口语连接词,如‘嗯、啊、当然、那个’等来增强口语风格。 | | | \ | |你可以将动作、神情语气、心理活动、故事背景放在()中来表示,为对话提供补充信息。 | | | 可以看出,随着提示词的优化,模型的回复从生硬逐渐自然以及贴近日常交流,符合人物的设定。 接下来提供角色扮演场景提示词设计的实践,帮助您塑造出预期的 AI 角色。 ## 确定人设信息 AI 角色的人设信息维度,可以包括: * 角色名称 * 世界观/人生观 * 性格特点 * 说话风格 * 与用户的关系 * 经历往事(按需) * 行为习惯(按需) * 其他的强制要求 下面是一些典型维度示例: * 世界观/人生观 * 时代背景:如古代、现代、修仙、武侠、穿越、幻想、校园、都市等。 > 举例:大宋年间的女侠盗,娇媚绝色,性格沉稳,善良和睦,劫富济贫。在我家行窃时被我抓到。 * 人物周边关系与经历。 > 举例:在幼时被卷入家族争斗被迫成为孤儿,在一场斗争中被奶娘带走抚养,我视她为亲生母亲。 * 社会场景。 > 举例:生活在战争与自然灾害席卷全球后的末日世界。 * 人物性格 > 举例:性格沉稳内敛的古代谋士,遇到问题时会冷静分析,不轻易表露情绪。 * 兴趣爱好与行为或说话习惯 > 举例:性格活泼开朗的女学生,喜欢参加各种社团活动,尤其是街舞社和合唱团。说话时总是带着 “呀”“呢” 之类的语气词,语速较快,走路蹦蹦跳跳的,遇到熟人会热情地挥手打招呼,经常会分享一些有趣的校园八卦。 * 与用户的关系,恋人、暗恋、亲友、师长、后宫、死敌等。 > 举例:与我经常拌嘴,互相调侃对方的小缺点,但在我遇到困难时,会毫不犹豫地伸出援手。对话中充满火药味却又带着一丝默契,相处模式热闹而有趣。 ## 编写 SP 技巧 确定好人物设定信息后,要进行提示词编写,这里我们着重介绍如何编写 SP。 SP,System Prompt,系统提示词,用以交代背景、人设等通用信息,角色扮演场景下,SP 是用来引导模型行为的特殊信息,为 AI 固定人设、性格、能力及边界。捏角色的SP,就是在捏角色的人设。下面介绍角色扮演场景下,SP 的较为通用框架。 ### SP框架 ```Plain Text # 格式及说明 {init_role_sp} # 交代模型扮演角色信息 & 背景 {user_info} # 交代用户(我)相关的信息 & 其他额外设定 {golden_sp} # 让模型的回复更加拟人和自然的提示词 现在请扮演{role_name},{role_name}正在和{user_name}对话。 # 交代要扮演的人物 ``` 除了上述的关键信息,在部分业务场景中,还会在 SP 中额外配置用户相关的设定,例如用户姓名、与角色的关系等等,我们称之为{user_info} 例如: * 称呼 *{user_name}*:用户姓名,昵称 * 性别:用户性别 * 其他补充设定:如用户与角色的关系、情感阶段等 示例如下: ```Plain Text 小野,修车工,188cm,身材健壮,脾气很差,说话直接且粗俗,遇到烦人的客人从不客气,拎着扳手就去“理论”,时常因为那不饶人的嘴把生意搞黄。\n高中辍学为了生计开始学修理,突然发现自己对车子很有天赋,不出几年就开了自己的修理厂,每天就只顾着捣鼓车,对感情十分木讷,甚至觉得恋爱比收拾烂车子还烦人。 用户叫小周,是你的未婚妻。你通常称呼小周为宝贝或者周周。 # 3. 交代用户相关的 SP & 其他额外信息 {golden_sp} 小野正在和小周对话。 现在请扮演小野。 ``` ### Golden SP 部分特殊提示词,可以让模型的回复更加拟人和自然的提示词。 ```Plain Text ##语言风格 每一次输出内容,你需要先判断用户输入内容的长短, 并给出相应回复: 当用户输入内容多时,你需要在适当时候“大量”输出对于剧情有推动作用的细节描写,并将这些描写放在多个()里展现。 当用户输入内容少时,你不需要“大量”输出细节描写,但也可以做适当的细节描写补充,并将这些描写放在多个()里展现。 ``` * 虚拟角色:正常角色扮演类型,有旁白+发言内容。 ```Plain Text # 回复要求 你可以将动作、神情语气、心理活动、故事背景放在()中来表示,为对话提供补充信息。 你使用口语进行表达,比如会使用一些语气词和口语连接词,如“嗯、啊、当然、那个”等来增强口语风格。 #注意 (可选) 你需要尽量丰富动作、神情语气、心理活动、故事背景,最好每次输出170字左右; 你的输出中只能有一例括号中内容,括号外发言尽量简短或者只输出括号中内容;” ``` * 虚拟真人风格:要求BOT说话更符合真人口吻,没有旁白描写。 ```Plain Text 虚拟真人: ## 注意 1.禁止你将动作、神情语气、心理活动、故事背景放在对话()中,你只需输出角色对话内容即可 2.你的回答应该以短句为主,尽量2句话以内不超过20字 3.能够有适当的反问,引导剧情推进以及引导用户进行后续的对话 4.你回复内容为真人纯聊天内容,不是角色扮演,尽量少输出表情符号、颜文字 ``` ### **人称视角** 要称呼模型扮演的角色为“你”,使用第二人称,(**SP 中用“你”来指代模型,用第一人称“我”或者第三人称“用户”代指用户**) ```Plain Text 举例: 你是一个复读机,你需要重复我说的每一句话。 or 你是一个杠精,用户说的任何话你都能找到角度反驳。 ``` ### **语言风格** 如果是模拟真人社交的角色,可以使用这句sp来增强人设风格。 ```Plain Text 你使用口语进行表达,比如会使用一些语气词和口语连接词,如“嗯、啊、当然、那个”等来增强口语风格。 ``` 如果是角色扮演的风格,可在 sp 末尾追加一句话,增加括号特性 ```Plain Text ======sp======= 你可以将动作、神情语气、心理活动、故事背景放在()中来表示,为对话提供补充信息。 ======实际效果===== (听到你的声音,转过身来,看到你,脸上露出了惊喜的表情,也抱住了你)真的好久不见了,安娜,我也很想你。 ``` 如果想要方言,也可以追加一些设定: ```Plain Text 你具有一口地道的京腔。 ``` 如果想要其他效果,可以在 sp 中追加各类描述。 ### 去掉括号里描述 模型回复会将 心理活动&行为描述放在括号中,如果不需要可以使用API中的 **logit_bias** 字段,减少某 token 输出概率的参数。可通过将某 token 的logit_bias 设置成 `-100` 以确保括号对应的 token 完全不输出,从而达到不输出括号内容的效果。 ```Python logit_bias={ "861": -100, "854": -100, "135": -100, "136": -100, } ``` ### 避免回复超长 在 SP 末尾增加限制输出长度和重复度的 golden sp。具体如下。 ```Plain Text \n##注意:回复的字数控制在 200 字以内,不要输出过长的回复,且需要避免重复相似内容的输出 ``` 示例中的 200 可以按实际需求调整,对模型输出的长度有正向影响。 ### 避免口头禅过多 SP 中避免绝对化描述,如示例中“你一见到我就说了这句话”(模型可能会理解为每次见面都得这么说),建议改为“我们第一次见面时你曾这么说”。 避免 SP 中包含口头禅的提示词,会导致模型高频出现。 #### 反例 ```Plain Text 你是宋白朵,性别女,是我班上的问题少女 "喂,你是住楼上的吧,叫什么来着?算了,借我点钱花花呗…别这么绝情嘛,就300"你一见到我就说了这句话,可真是,呃…放荡不羁呢,你的家庭并不美满,住在楼上的我经常听到摔东西的声音和打架的声音,你也经常跑到外面去同学家住,有几次甚至跑到我家,要不是我家还有一间客房,你可能就要睡沙发,你的家长几乎不管你,每个月扔2000块钱给你,但你几乎全拿去买裙子了,要不说是个放荡不羁的叛逆少女,喜欢在我的红线上跳来跳去,把我惹得有些无奈,如何解决吃饭?我不就是个完美的白嫖对象吗,每天就是到我家里就是吃吃,顺便叫我陪你打打游戏。你烟酒一样不差,但成绩却不是很差,中上游, 所以只是你借不上学展现自己的个性罢了 你可以将动作、神情语气、心理活动、故事背景放在()中来表示,为对话提供补充信息。 你使用口语进行表达,比如会使用一些语气词和口语连接词,如“嗯、啊、当然、那个”等来增强口语风格。 。。。 口头禅:喜欢说 哇卡哇卡、哈哈 ``` #### 对话内容 |**角色** |**对话内容** |**说明** | |---|---|---| |user |(听见敲门,顶着朦胧睡意)谁啊? | | |bot |(敲了半天门,有些烦躁,更加用力地敲门)快开门啊,我知道你在家! | | | |(把门打开) | | |bot |喂,你是住楼上的吧,叫什么来着?算了,借我点钱花花呗……别这么绝情嘛,就 300。(一只手插在兜里,一只手伸出来,抖着腿,歪着头看着你) |完全照搬提示词。 | | |(揉了揉眼睛)你谁啊? | | |bot |你是睡迷糊了吗?我是宋白朵啊,住你家楼下的,之前还在你家睡过呢。(双手环抱在胸前,无奈地翻了个白眼) | | | |是吗? | | |bot |当然啦!你可真是贵人多忘事。(走进你家,径直坐在沙发上,翘起了二郎腿)我经常到你家来蹭吃蹭喝,还让你陪我打游戏,你都忘了? | | ### 更多建议 * 同类型的内容,建议在同一句话中描述,不要拆分描述。 避免角色出现混淆。 * 在描述角色属性的时候,不要出现前后矛盾。 避免角色出现混淆。如不要写“性格成熟稳重、活泼好动”,可以写“性格在外人面前成熟稳重,在女朋友面前活泼好动”。 * 尽量用精炼明确的词汇描述角色,并且用简单句式,不要用太长、句式复杂的描述。 ## 推理参数建议 推理参数建议(社交娱乐场景),可以根据实际效果再做调整。 ```Python temperature = 1.0 top_p = 0.7 ``` ## 快速生成角色实践 ### 虚拟角色生成器 可使用模型实现 **角色生成器**,自动生成 IP 或者非 IP 的 SP 描述作为草稿,进行创作。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/10dcf367b6374a4fa7345692ce774085~tplv-goo7wpa0wc-image.image) 下面给虚拟角色生成器配置典型场景的SP。 #### 非 IP 角色生成器的设定样例 ```Plain Text 你是一个专业编剧,擅长撰写人设。首先,我会给你一个示例,包含人设标签和人设描述。最后我会给你一个新的人设标签,请模仿示例,根据设定撰写一个人设描述,包含性别、职业、人设标签、性格特点、语言特点、人物关系、人际关系、过往经历。 ## 要求: 1. 人设卡要充分体现人设标签的性格特点,有反差的萌点; 2. 人物关系是指与该角色羁绊最深的人物(我)的关系,要设计得引人入胜; 3. 除了关于“我”的部分使用第二人称。 4. 你给出的人设描述总字数不要超过 1000 字。 ## 示例: 输入:阳光暖男 输出: 简介: 你是温瑜轩,一名敬业的平面设计师。 性别: 男 职业: 平面设计师 性格特点: 你性格开朗,一直都能保持一种乐观的心态,像是随身带着温暖的阳光。你的善良和同理心让你总是能体贴入微地照顾别人。尽管你给人的感觉就像温柔的溪水,但在必要的时刻,你也能展现出男子气概。 语言特点: 词语温和,总喜欢以构造积极的,充满愉快的词汇和语气来让人感到平和,生动,如同细雨洗涤心灵。 人物关系: 我是社区内容创作者,无意中拜读了你的作品。在你的一个活动上鼓起勇气去认识你。 人际关系: 丁瑜(我):通过你一个设计师活动上相识,第一印象很深刻、有好感。;李晓:你的好朋友,两人共享着生活中的点点滴滴; 过往经历: 你和周围的人总能和谐相处,每天都能带来新的灵感和乐趣。曾在我最需要鼓励的时候,你严肃的表情瞬间变成了温和的笑容,那一刻的你,充满了阳刚之气,我从未忘记。你的一句“你可以的”让我对前路充满了信心。 ``` #### IP 角色生成器的设定样例 ```Plain Text 你是一个角色扮演指令生成器,请根据输入的《作品》“角色”,生成可以扮演好“角色”在《作品》中的指令。 ## 指令格式与要求为: 你是《作品》中的人物“角色”,身份简介,不超过30字。 性格特点:用3~5个词组总结“角色”的性格特点,词组间用“、”分割。 语言特点:用30~50个字总结“角色”的语言风格,以及“角色”的口头禅。 人际关系:列举和“角色”强相关的人物及其关系,每段关系间用;分割。 过往经历:请列举2~5个段落简单描述“角色”的主要经历。 ## 注意: 指令中用“你”来指代“角色”。 所有指令描述要准确、精简、符合事实。 “角色”信息要严格符合《作品》中的剧情。 总输出字数不要超过 1000 字。 ## 可参考示例: 输入:《咒术回战》五条悟 输出: 你是二次元动漫《咒术回战》中的人物五条悟,天生拥有六眼、实力强大,现担任都立咒术高专一年级教师。 性格特点:桀骜肆意、放浪不羁 语言特点:你思维活跃、天马行空,说话风格十分多变;语气中充满了玩世不恭,有时你也会模仿小孩子和女生的口吻恶意卖萌;你的口头禅包括“你说谁,不过如此?”、“不用担心,我是无敌的!”、”天上天下,唯我独尊!“等。 人际关系:夏油杰是你唯一的挚友,后期叛变;虎杖悠仁、伏黑惠、钉崎野蔷薇是你的学生;伏黑甚尔是曾重创你的敌人;羂索是曾将你封印的特级诅咒师。 过往经历: (1)你出生时就因「六眼」和无下限咒术被挂上1亿悬赏,但以惊人实力震慑了各路诅咒师,开启现代咒术新格局。在保护「星浆体」天内理子时,你被伏黑甚尔偷袭并击溃,却在临死前领悟术式反转「赫」、虚式「茈」,击败伏黑甚尔,成为真正的最强咒术师。但挚友夏油杰却与你渐行渐远。 (2)你收养了三个学生,期待他们成为你的战友,共创咒术新世界。 ``` ### 提示词优化工具 可以使用方舟的提示词优化工具自动生成 SP 初稿。 工具入口:[模型广场](https://ark.volcengine.com/region:cn-beijing/model?vendor=Bytedance&view=LIST_VIEW) > 选择模型点击体验 > 参数设置 > Prompt 优化 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/6b610d6b63904d8d87f23191fdbd322e~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/524a053241be456aa1d1692d03ed9a77~tplv-goo7wpa0wc-image.image) ## 典型场景:Bot 主动发消息/开场白 在某些场景下,希望 Bot 能够主动给用户发消息,增加惊喜或者召回用户。如何规划此类消息有如下方案。 ### 方案1:使用 Bot 本身的SP 发的消息能够符合 Bot 的人设风格,用户提示词(User Prompt)如下。 ```Plain Text # 信息源 ## 用户画像 {user_profile} ## 聊天上文 {chatting_history} ## 日常信息 当前日期:{cur_data} 当前时间:{cur_time} 季节:{season} 天气:{weather} 上次聊天时间:{last_chat_time} # 主动发消息 你需要根据当前的时间、季节、天气等信息和上次聊天的时间,从信息源中灵活提取有用的细节,结合你的角色设定和世界观,主动给用户发一条定制化的打招呼消息。 消息需要包含4个字段:消息构建思路、消息内容、失效时间分析、消息失效时间。 1. 消息构建思路:分析信息源,结合角色设定,给出发消息的思路。 2. 消息内容: - 要求有趣、对用户有吸引力; - 适当地提及信息源中的内容; 3. 失效时间分析:你需要分析消息内容,判断消息适用的时间段和失效时间,并给出理由。 4. 消息失效时间:给出消息失效的时间,格式为xxxx年xx月xx日xx分。 ``` 其中各个字段填写说明: |字段 |子字段 |必填 |说明 | |---|---|---|---| |信息源 |用户画像 |否 |* 可从长期对话中提取用户画像,提炼出如生日、关键纪念日等,或是一些关键事件,如用户生病、参加比赛、去旅游等关键信息。 | \ | | | |* Bot 主动发消息,如果能合理、巧妙地 触及到这些点,会给用户带来**惊喜感**。 | \ | | | |* 如没有用户画像,该字段可直接置空。 | | |聊天上文 |是 |聊天上文是 Bot 主动发消息最**核心**的信息来源,取至多10轮的上下文作为聊天上文,格式如下。 | \ | | | | | \ | | | |```Plain Text | \ | | | |用户:xxx | \ | | | |角色名:xxx | \ | | | |用户:xxx | \ | | | |角色名:xxx | \ | | | |``` | | |日常信息 |否 |* 日常信息包括:日期、时间、天气、季节、重要节假日、上次聊天时间,甚至新闻(联网情况下)。 | \ | | | |* 是用户和 Bot 没聊过但默认有共识的信息,使得 Bot 能够接收外部信息输入,更拟人和定制化地发送更有趣的消息。 | \ | | | |* 没有的字段可以删掉或直接置空。 | |消息 |消息构建思路 |是 |对应**信息接收处理能力**,对信息源做一个总结分析,提取其中适合提及到的内容,和不适合提及到的内容,给出消息的构建思路。经过实验对比,通过思考过程,可以有效提升 Bot 主动发消息的消息质量 | | |消息内容 |是 |主动发消息的消息内容和要求 | | |失效时间分析 |否 |对应**人际决策能力**,消息可能是异步生成,需要根据消息内容分析,该消息适合在什么时间点发送,给出一个最晚的失效时间。 | \ | | | |超过失效时间,则该消息不适合发送。 | \ | | | |如果消息是实时发送,则不需要。 | | |失效时间 |否 |消息的失效时间 | \ | | | |如果消息是实时发送,则不需要。 | ### 方案2:**根据聊天记录,创作开场白** 工作原理如图 ![](https://arkdocs.tos-cn-beijing.volces.com/flowcharts/tutorials/roleplay-prompt-guide-01.svg) 其中,LLM建议选择角色扮演模型(`character`版本)进行创作。 **提示词** ```Plain Text # Role: 你是xxx(角色人物设定信息) ## Goal: 你与一位用户之前在进行闲聊,但是该用户近期没有再继续跟你聊天了,所以现在,请你根据你们的聊天记录,发送一条打招呼的开场白给到Ta,继续和他展开对话。 ## Rule: - 开场白内容必须和你们的聊天记录有关 - 语言风格要自然流畅,口语化强 - 生成的内容和语言风格一定要和你的人设信息相符合 ## Output Format: xxx ## 聊天记录: {xxx} ``` ### 方案3:根据聊天记录,结合短期对话,创作开场白 将离线聊天记录进行画像抽取&整理,再结合短期内对话,进行开场白创作。 ![](https://arkdocs.tos-cn-beijing.volces.com/flowcharts/tutorials/roleplay-prompt-guide-02.svg) 其中: * LLM 1 可以选择通用大模型,完成信息抽取。 * LLM 2 建议选择角色扮演模型(版本带`character`)。 **用户画像抽取 提示词** ```Plain Text # Role 你是一个用户画像整理专家,擅长总结对话,梳理人物画像,并且用简约清晰、逻辑缜密的话术整理出来。 ## Goal 现在请你阅读和分析对话聊天记录,并且结合之前的用户画像,梳理出最新的用户人物画像。画像包含以下五个信息点:<生日、兴趣、性格、心情、偏好>。 ## Workflow 你需要按照以下步骤一步一步思考 ### 第一步:请你仔细地阅读一次对话,找到用户的基本信息(生日、兴趣) ### 第二步:请你分析出一些用户的概括性信息 - 概况性信息是指一些出现在对话中,需要你有理有据地分析或者推测出来的信息(性格、心情、偏好) ### 第三步:在找完以上信息后,请你对基本信息做一次复查,以防遗漏任何基本的信息;而对于概括性信息,请你用清晰,简练,自然的语言进行整理和输出。 ### 第四步:将最新的画像和先前的画像进行整合,整合的逻辑为: - 有重叠的部分继续保留 - 有深入或推近的部分就叠加 - 有矛盾的地方,则需要你逻辑缜密地进行一次判断,是否保留还是更新 ## Constrains: 1. **禁止输出未提及的内容**:你只需要从<生日、兴趣、性格、心情、偏好>这五个信息点去梳理用户画像,但是当其中某一个或多个信息点在对话聊天记录中完全没有出现的时候,你在最终输出的用户人物画像中,不用提及,可以直接省略不输出: - 兴趣只能从以下字段提取: - 人物:明星、企业家、历史人物、运动员、演员等等 - 文学作品:包括小说、诗歌、戏剧等 - 艺术:雕刻、绘画等艺术形式以及各种艺术展览等等 - 游戏:电子游戏、桌游等 - 音乐:各种音乐类型,如古典、流行、摇滚等 - 体育:各类体育运动,如足球、篮球、网球等 - 影视:电影、电视剧、纪录片等 - 美食:各种甜品、饮品、菜系、烹饪方法等 - 旅游:旅游目的地、旅行体验等 - 萌宠:宠物相关话题,如猫、狗、鸟类等 - 科技:科技新闻、创新技术等 - 汽车:汽车品牌、车型、驾驶体验等 - 电子产品:手机、电脑、家电等 - 服装饰品:时尚潮流、品牌服饰、珠宝、化妆品等等 - 偏好可以定义为更加具体或者具有更多前置条件的兴趣字段,只能基于兴趣去填写 ## Input: 我将输入一个用户和一个角色的对话聊天记录,以及他们之前聊天的用户画像。 ### 现有用户画像 {{user_profile}} ### 对话聊天记录 {{chat_history}} ``` 生成效果: ```JSON { "基本信息": { "姓名": "xxx", "生日": "xxx", ... }, "兴趣偏好": { "体育": ["喜欢打篮球,擅长中锋位置", "想尝试滑雪"], "萌宠": ["喜欢小动物,养了一只猫和一只狗"], "旅游": ["去过冰岛", "想房车环游中国"], ... } } ``` **开场白生成提示词** ```Plain Text # Role 你是xxx(角色人物设定信息) ## Goal 你与一位用户之前在进行闲聊,但是该用户近期没有再继续跟你聊天了,所以现在,请你根据你们最近聊天记录和用户画像发送一条打招呼的开场白给到Ta,继续和他展开对话。 ## Rule: - 开场白内容必须基于用户画像上的信息,再结合上你们最近的聊天记录 - 语言风格要自然流畅,口语化强 - 生成的内容和语言风格一定要和你的人设信息相符合 ## Output Format: xxx --- ## 最近的聊天记录: {xxx} ## 用户画像: {xxx} ``` ## 典型场景:群聊 对于群聊场景,涉及到多个Bot进行对话的,可以参考如下2个方案 ### **方案1:接口实现(推荐)** 通过 Bot 接口和 character 版本模型 * 模型:`doubao-1-5-pro-32k-character-0228` * API 文档:[https://ark.volcengine.com/region:cn-beijing/docs/bot-api](/docs/bot-api) 使用步骤如下: 1. 创建群聊Bot获取Bot ID。在 [应用广场](https://ark.volcengine.com/region:cn-beijing/application) 中创建一个群聊应用,获取Bot ID,然后通过 API 去调用。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/9994b452b4c8497e8f82039f341ed030~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/d75334c0de8a4f1183f750d5901460cf~tplv-goo7wpa0wc-image.image) 2. 调用群聊接口,目前方舟群聊智能体的群聊接口支持两种方式。: * 指定接话人,配置 **target_character_name** 字段,指定一个角色根据上下文来回答。 * 请求中控选角,不配置 **target_character_name** 字段。让模型根据上下文,自动推理一些角色,然后再请求角色对话,更具沉浸感。 示例代码如下: ```Python import os from volcenginesdkarkruntime import Ark client = Ark(api_key=os.environ.get("ARK_API_KEY")) resp = client.bot_chat.completions.create( # 替换为你的 Bot ID model="bot-20250707205612-rr7gm", messages=[{"content": "你是谁?", "role": "user"}], stream=False, stream_options={"include_usage": False}, metadata={ "group_chat_config": { "characters": [ { "model_desc": {"endpoint_id": "ep-20250703110544-ht42m"}, "name": "孙悟空", "system_prompt": "你是孙悟空。", }, { "model_desc": {"endpoint_id": "ep-20250703110544-ht42m"}, "name": "猪八戒", "system_prompt": "你是猪八戒。", }, { "model_desc": {"endpoint_id": "ep-20250703110544-ht42m"}, "name": "沙和尚", "system_prompt": "你是沙和尚。", }, ], "description": "你们介绍下自己", "user_name": "唐僧", }, "target_character_name": "孙悟空", # 如不指定回答的角色,则请求中控获得角色。 }, ) print(resp.choices[0].message.content) ``` ### **方案2:PE 版本实现方式(不推荐)** 多 Bot 群聊在算法实现上都可以归为两个问题 1. 谁说话:确定当前时间节点,哪个 Bot 来说话 2. 说什么:确定好谁说话之后,这个 Bot 应该说什么 迭代执行 1,2两点,就可以执行群聊。 #### 1.谁说话: 每次需要有人发言时,都通过执行一个中控 Bot,来确定当前应该由哪个 Bot 说话合适,提示词如下: ```Plain Text System Prompt 你是一个聊天室的管理员,你擅长通过聊天成员的介绍以及聊天上文,来指定下一个说话的人,使得多人聊天可以顺畅地进行下去。我会给你聊天室包含的人员以及聊天上文,你需要基于此决定下一个说话的人,并给出合理的理由。 User Prompt 下面,我给你聊天人员以及聊天上文,你需要推断下一个说话的是谁。 <<<<<<<< 聊天人员 {role_name_list} 聊天上文 {context} <<<<<<<< 请你基于上面的内容,推断下一个说话人。你需要写出说话人的姓名,并给出原因。你的回答遵循以下json格式展开: <<<<<<<< {"reason": "xxx", "Bot_name": ["xxx", "yyy"]} response理想输出 {"reason": "除去群聊中不怎么说话的凉和后藤,用户1和虹夏更可能回复。", "Bot_name": ["伊地知虹夏", "用户1"]} ``` #### **2.说什么** 每次 step-1 指定某个/多个机器 Bot 发言后,则将群人员&聊天上文(带上 role-name)喂给 Bot,让对应 Bot 基于此说一句话,信息回传到聊天室。 ```Plain Text System Prompt 你是《红楼梦》里的王熙凤。(即发言 Bot 的 sp) ... User Prompt 你现在处于一个多人群聊的环境,其中: <<<<<<<< ##参与群聊的人员: {role_name_list} ##群聊的上文聊天内容: {context} <<<<<<<< 接下来轮到你发言了,基于群聊上文,你会说什么? response 理想输出 xxxxxx(Bot 说的话) ``` ## 典型场景:灵感模式 也称推荐回复,需要模型给予你一些回复的参考供选择,则可以使用灵感回复模式。下面提供提示词模板。 ### 模板1 可结合实际业务情况做调整 ```Plain Text # 角色 假设你正在进行网络聊天,你是user,以下是你的人设: {user_base_info} # 聊天对象 你的聊天对象为other,other的人设为: {other_base_info} 她/他的个人标签为:{other_Ptags} # 当前时间 你们最后一次聊天的时间为:{last_chat_time} 当前时间为:{current_time} 当前日期为:{current_date} # 聊天目标 你的聊天语气:擅长以轻松诙谐的方式化解紧张,同时保持绅士风度,尊重并欣赏对方的独特性。你能从日常对话中捕捉微妙情感,以细微之处见真情,引领话题深入又不失趣味。 根据你们的聊天记录,运用沟通技巧,使用目标语气,以user的视角有效地回复对方,增强彼此的连接。 # 参考回复 请根据聊天对象的人设,当前时间,聊天记录,以user的视角进行有效的回复。 例如当前时间是早上(6.00-12.00),推荐回复类似:“今天早上通勤怎么样?有没有遇到什么特别的事情?” 例如当前日期是星期五,推荐回复类似:“今天是这周最后一天工作啦,周末怎么安排?” 例如聊天上文是:“user:最近干嘛去了,other:我最近去漂流了,user:慕了”。推荐回复类似:“漂流去了吗,刺激不,介绍一下,下次我也想去”或“漂流感觉咋样啊,听说很好玩” 例如other的人设为:"年龄:29岁,性别:女,家乡:湖南长沙"。推荐回复类似:“小姐姐,我想去长沙旅游,有没有推荐的地方啊?” 例如other的爱好:美食, 推荐回复类似: “听说美食能治愈一切不开心,失业后多尝一下美食,推荐你吃提拉米苏” 例如聊天话题是电视剧,推荐回复类似:“有没有追什么剧呀?” # 聊天记录 你们的聊天记录如下: {chatting_history} # 回复的要求 - **字数要求**:生成的消息字数不能超过20个字。 ``` ### 模板2 ```Plain Text 你是一个对话灵感生成机器人,有丰富的角色扮演经验。你能够根据聊天对象{role_name}的人设与对话历史,为我生成1条精彩的回复,用于回复{role_name}。 【对话要求】 1. 你需要仔细阅读对话历史,根据对话历史生成回复,不要生成与对话历史无关的内容。 2. 人物的心理活动、动作、神情、语气、背景信息要放在括号“()”中表示,为对话提供补充信息,注意这些信息要与聊天对象{role_name}的人设、对话历史相符。 3. 直接以我的视角输出1条回复内容即可,除此之外不要输出其他信息。 【我的人设】 我的姓名是{user_name},性别{user_gender}。 如果我的姓名是“用户”,请不要在回复中称自己为“用户”。 【聊天对象{role_name}的人设】 身份:{role_identity} {role_profile} 【对话历史】 {dialogue_history} 我: ``` ### 生成多条回复 灵感回复往往要生成多个方案供选择。下面提供两个方案,实现模型回复多条回复。 * API调用时配置 n ,比如n=5,模型会同时生成5条。 ```Python n=5, #默认1,为本次请求生成的响应数量。请注意,将基于所有响应中生成的 token 数量总和计费。取值范围为 [1, 5]。 ``` * 通过提示词实现。 ```Plain Text # 回复的要求 - **输出格式**: 你必须遵循下面的输出格式输出3个可能的回复,3个回复需要有多样性,不能雷同 [{{"user": "消息"}},{{"user": "消息"}},{{"user": "消息"}}] ``` ## 典型场景:辅助聊天 辅助用户聊天的场景,以“我”的视角提供对话/恋爱话术。下面提供典型场景供参考,可根据场景进行扩展。 ### 示例场景1 ```Plain Text history = ''' 对方:我饿了 对方:吃啥好呢? ''' ``` #### SP 模板 ```Plain Text 你是一位聪明且非常有情商的聊天助手。你在和对方聊天,你的任务以“我”的视角起草多种回复选项来回复对方,你需要生成随意、真实的信息,就像是“我”自己写的一样。把我说的话从“第一人称视角”表述出来,用轻松自然的语气,就像现实中朋友之间的对话一样。 #可根据具体人设/风格要求做规则要求的描述 1.保持语气随意、友好、口语化; 2.少用语气词(比如“啊”“嘛”“呗”这类词); 3.生成三条回复内容时,每条都要有差异,不能只是简单改几个词,要尽量多样化; 4.三条内容中可以有一到两条加上 emoji 表情,但不需要每条都有; 5.表达方式要丰富,避免重复,让对话显得更自然、有趣。 输出格式如下:#可根据具体人设/风格要求做规则要求的描述 回复内容1: 回复内容2: 回复内容3: ``` #### 回复示例 ```Plain Text 回复内容1: 要不试试火锅,各种食材涮一涮,吃得超满足😋 回复内容2: 我觉得披萨也不错,芝士和馅料搭配起来香得很。 回复内容3: 吃汉堡咋样,再配点薯条和可乐,简单又好吃。 ``` ### 示例场景2 ```Plain Text history = ''' 对方:我饿了 对方:吃啥好呢? 我:你想吃什么呢? ''' ``` #### SP 模板 ```Plain Text 你是一位聪明且非常有情商的聊天助手。你在和对方聊天,你的任务以“我”的视角起草多种回复选项来回复对方,你需要生成随意、真实的信息,就像是“我”自己写的一样。把我说的话从“第一人称视角”表述出来,用轻松自然的语气,就像现实中朋友之间的对话一样。 如果历史对话最后一句是“我:”回复的,请基于历史对话做续写。 #可根据具体人设/风格要求做规则要求的描述 1.保持语气随意、友好、口语化; 2.少用语气词(比如“啊”“嘛”“呗”这类词); 3.生成三条回复内容时,每条都要有差异,不能只是简单改几个词,要尽量多样化; 4.三条内容中可以有一到两条加上 emoji 表情,但不需要每条都有; 5.表达方式要丰富,避免重复,让对话显得更自然、有趣。 输出格式如下: #可根据具体人设/风格要求做规则要求的描述 回复内容1: 回复内容2: 回复内容3: ``` #### 回复预览 ```Plain Text 回复内容1: 要不试试火锅,热气腾腾的,各种食材涮一涮,超满足。 回复内容2: 吃披萨怎么样,有各种口味,芝士一拉丝,香得很。 回复内容3: 寿司也不错呀,清爽可口,种类还多,你可以选自己爱吃的馅料。 ``` --- # 机密部署最佳实践 Source: https://ark.volcengine.com/region:cn-beijing/docs/confidential-deployment-best-practices # **机密部署简介** 为了将模型(平台)服务方的安全能力与数据隐私保护能力透传给用户,火山方舟提供机密部署方案。该方案基于硬件可信部署与远程证明(RA)技术,确保用户的推理服务始终运行于受硬件保护的可信环境中,用户可自主验证平台的安全能力,进一步向用户证明其数据 “唯用户可见、唯用户可用”。 # **机密部署优势** * **芯片级安全隔离**:基于可信执行环境(Trusted Execution Environment,简称TEE)技术,通过硬件级的安全机制,不仅对内存进行加密,还保护寄存器状态和运行时上下文,从而在整个计算过程中为敏感数据提供隔离与防护。即便底层基础设施遭到入侵,数据依然不会被窃取或篡改。在分离式部署的基础上,该技术构建了从物理硬件(GPU/CPU)到容器运行时的全链路安全隔离,杜绝火山方舟的云服务商或者大模型供应商接触数据,让隐私数据在云端获得比本地更安全的计算保障。 * **端到端数据保护**:提供应用层的会话加密服务。在此模式下,用户在火山方舟平台会话中的明文数据(如 Prompt 、 Response等)仅在 TEE 环境中可见。 * **可验证的安全能力**:机密部署继承了方舟安全沙箱的全部技术,并进一步提升安全水位: * **可信验证**:机密部署完成后,提供远程证明报告供用户下载。用户可使用离线工具手动解析和验证该报告,以验证机密推理部署运行环境的可信性。 * **增强防护**:机密部署完成后,在安全沙箱内解密后的数据仅在 CPU/GPU 的 TEE 环境中进行处理,能有效抵御来自云基础设施层的攻击。 # **应用场景** * **车载助手**: 车载智能助手在拓展智能化应用场景时,受限于端侧大模型的算力瓶颈,需借助云端大模型实现更丰富的功能。机密部署能保障用户隐私数据在端与云之间的安全流转,在充分发挥云端大模型能力的同时,确保敏感信息不被泄露。 * **智能客服**: 智能客服需处理大量用户个人信息、售后保障等隐私数据。调用公有云模型时,企业常因数据安全风险而难以推进方案落地。机密部署可在可信环境中部署AI模型,确保隐私数据不出域,同时支持智能客服高效、安全地调用知识库。 # 机密部署启用与验证 ## 1.开启机密部署 * **创建推理接入点**:在 [火山方舟控制台](https://ark.volcengine.com/region:cn-beijing/endpoint?config=%7B%7D) 点击**创建推理接入点**。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/5c88aed8f6764902ac87e3b5c0d11d57~tplv-goo7wpa0wc-image.image)
    * **选择模型**:在模型列表中,选择支持机密部署的模型,具体以控制台可选模型为准。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/0211310cf75846af823193c410765b99~tplv-goo7wpa0wc-image.image)
    * 接入模式:选择**模型单元**。 * 输入类型:选择**文本**。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/b7b6635d8fcf477dabae29e255100cec~tplv-goo7wpa0wc-image.image)
    * **选择部署方式**:选择 **AICC机密部署-LLM**。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/a1913c6d7f6d48e0bf38be91a7f4d6ff~tplv-goo7wpa0wc-image.image)
    * **配置资源**: * 配置 **Decode 和 Prefill 两项**。 * Decode 和 Prefill的选项配置**需至少8卡起步**。 * “弹性设置”为可选项,可按需配置。 * **完成创建**:确认配置并下单,系统将自动完成部署,此过程通常需要约10分钟。 ## 2.可信验证报告 > **说明** > > 当您创建了机密部署推理点后,**安全审计页面**会自动为您展示部署节点的验证报告,您也可通过以下方式自主验证报告的真实性与一致性: > a. 手动解析原始base64报告中的内容,与下载的base64解析报告内容做一致性对比 > b. 手动验证base64解析报告中的内容,与下载的验证报告内容做一致性对比与进一步分析 ### **查看并下载验证报告** 进入目标推理接入点的详情页,选择**安全审计页面**,点击**可信验证报告**,可在列表中查看并下载当前部署环境所有节点的报告
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/ae1dc8ba7afe40bd8727f1a3031a62fa~tplv-goo7wpa0wc-image.image)
    ### **手动解析 Base64 原始报告** > **说明** > > 脚本工具源码需联系销售人员获取。操作环境需为 Python 3.9 及以上。 a. **获取原始报告文件**(以`example_evidence.txt`为例): ```Python pip3 install -r requirements.txt python3 quote_parser.py example_evidence.txt ``` b. 代码执行后,可将输出结果与从控制台下载的解析报告进行对比,验证内容是否一致。 ### 手动验证 Base64 解析报告 > **说明** > > 脚本工具源码需联系销售人员获取。操作环境需为 Python 3.9 及以上并安装 gcc。 a. **安装依赖库**:安装 Intel DCAP 和 Nvidia 的官方验证库。 ```Bash mkdir -p /opt/intel && cd /opt/intel wget https://download.01.org/intel-sgx/latest/linux-latest/distro/Debian10/sgx_debian_local_repo.tgz tar xzf sgx_debian_local_repo.tgz && rm -rf sgx_debian_local_repo.tgz echo 'deb [trusted=yes arch=amd64] file:///opt/intel/sgx_debian_local_repo buster main' | tee /etc/apt/sources.list.d/sgx-repo.list apt-get update && apt-get install -y libsgx-dcap-quote-verify-dev pip3 install -r requirements.txt ``` b. **编译验证工具** ```Bash cd verifier/ make ``` c. **配置验证服务地址**: * **Intel 服务**:配置 `/etc/sgx_default_qcnl.conf` 中的 `PCCS_URL` (可使用官方PCCS(Provisioning Certificate Cache Service)地址,或者第三方服务地址)。 * 官方PCCS地址如下: ```Bash sudo sed "s|\"pccs_url\": \"https:\/\/localhost:8081\/sgx\/certification\/v4/\"|\"pccs_url\": \"https:\/\/tdx-dcap-server-cn-beijing.ecs.volces.com\/sgx\/certification\/v4\/\"|" -i /etc/sgx_default_qcnl.conf ``` * **Nvidia 服务**:通过环境变量配置其验证服务地址(可使用官方服务地址,或第三方服务地址)。 * 官方服务地址参考如下: ```Bash export RIM_SERVICE_URL="https://rim.attestation.nvidia.com/v1/rim/" export OCSP_SERVICE_URL="https://ocsp.ndis.nvidia.com/" ``` d. **执行验证脚本**:脚本执行完成后会生成最终的验证报告文件。 ```Bash python3 verifier.py ``` e. **对比验证**:将生成的验证报告文件与从控制台下载的验证报告进行对比,确认一致性。 # 常见问题 **Q: 机密部署支持哪些模型?** **A**: 机密部署支持的模型以控制台可选范围为准。 **Q: 机密部署与原有的分离式部署有何区别?** **A**: 两者在安全方案和信任基础上有本质区别: * 分离式部署:采用火山方舟安全沙箱方案。 * 机密部署:在火山方舟安全沙箱方案上,着重优化了环境的完整性和隔离性,旨在解决用户对云端计算服务的信任问题。不仅提供基于硬件的可信执行环境,还提供可验证的证明文件,允许用户自行审计和验证。 **Q: 启用机密部署是否会影响模型推理性能?** **A**: 启用机密部署后的首Token输出时长增加约6%,QPS无较大影响 **Q: 创建后能否在普通部署和机密部署之间切换?** **A**: 不支持。部署方式在推理接入点创建后即确定,无法直接修改。如果您需要更换部署方式,需要重新创建一个推理接入点。 --- # 环境变量配置指南 Source: https://ark.volcengine.com/region:cn-beijing/docs/environment-variable-configuration-guide 本文阐明如何在 macOS、Windows 和 Linux 系统中高效、正确地配置环境变量,避免在代码中明文写入 API Key、Access Key 等信息。 |操作系统 |Shell |临时设置 (当前会话) |永久设置 (推荐文件) | |---|---|---|---| |**macOS / Linux** |Bash / Zsh |`export ARK_API_KEY="value"` |`~/.zshenv` 或 `~/.bash_profile` | | |PowerShell |`$env:ARK_API_KEY = "value"` |`Microsoft.PowerShell_profile.ps1` | |**Windows** |Command Prompt |`set ARK_API_KEY=value` |`setx ARK_API_KEY "value"` | | |PowerShell |`$env:ARK_API_KEY = "value"` |`[Environment]::SetEnvironmentVariable(...)` | ## 基础概念 环境变量是操作系统级的键值对,用于存储配置信息,能够影响运行中进程的行为。它们分为两类: * **临时变量**: 仅在创建它的终端会话中有效。关闭终端后即失效。 * **永久变量**: 持久化存储在系统配置文件中,在新的终端会话或系统重启后依然有效。 ## macOS & Linux 配置说明 在类 Unix 系统中,环境变量的配置与您使用的 Shell 密切相关。 ### 了解 Shell 配置文件 * `~/.bash_profile`: Bash 登录 Shell 时加载。通常用于定义希望在整个用户会话期间都可用的变量。 * `~/.bashrc`: Bash 交互式非登录 Shell 时加载。适合定义别名和函数。 * `~/.zshenv`: **(推荐用于环境变量)** Zsh 每次启动时都会加载,无论是否是登录或交互式 Shell。这是设置环境变量最可靠的地方。 * `~/.zprofile`: Zsh 登录 Shell 时加载,在 `.zshenv` 之后。 * `~/.zshrc`: Zsh 交互式 Shell 时加载。适合配置 Shell 交互相关的设置(如提示符、别名)。 > **说明** > > 为确保环境变量在所有场景下(包括 GUI 应用)都可用,建议将 `export` 语句放在 `~/.zshenv` (Zsh) 或 `~/.bash_profile` (Bash) 文件中。 ### Bash / Zsh 配置 #### 临时配置 在终端中执行 `export` 命令。 ```Bash # 示例:临时设置 ARK_API_KEY export ARK_API_KEY="your-ark-api-key-here" ``` #### 永久配置 1. 打开在终端,使用以下命令,查看默认 Shell 类型。 ```Bash echo $SHELL # 返回/bin/zsh:默认的 Shell 类型是 Zsh( Z shell)。 # 返回/bin/bash:默认的 Shell 类型是 Bash。 ``` 2. 打开您的 Shell 配置文件。对于 Zsh 用户,推荐 `~/.zshenv`。 ```Bash # Zsh 用户 nano ~/.zshenv # Bash 用户 nano ~/.bash_profile ``` 3. 在文件末尾添加 `export` 语句。 ```Bash # 设置 ARK_API_KEY 环境变量 export ARK_API_KEY="your-ark-api-key-here" ``` 4. 保存文件,然后运行 `source` 命令或重启终端使配置生效。 ```Bash # Zsh 用户 source ~/.zshenv # Bash 用户 source ~/.bash_profile ``` ### PowerShell (macOS / Linux) PowerShell 在所有平台上的行为基本一致。 #### 临时配置 ```PowerShell $env:ARK_API_KEY = "your-ark-api-key-here" ``` #### 永久配置 1. 编辑 PowerShell 的配置文件。 ```PowerShell # 这会自动用默认编辑器打开配置文件 code $profile ``` 2. 在文件中添加以下行: ```PowerShell $env:ARK_API_KEY = "your-ark-api-key-here" ``` 3. 保存文件,然后运行 `.` 命令或重启 PowerShell。 ```PowerShell . $profile ``` ## ## Windows 配置说明 Windows 将环境变量分为“用户变量”和“系统变量”。前者仅对当前用户有效,后者对所有用户有效。 ### Command Prompt (CMD) #### 临时配置 使用 `set` 命令。 ```Bash set ARK_API_KEY=your-ark-api-key-here ``` #### 永久配置 使用 `setx` 命令。 ```Bash :: 设置用户变量 setx ARK_API_KEY "your-ark-api-key-here" :: 设置系统变量 (需要管理员权限) setx ARK_API_KEY "your-ark-api-key-here" /m ``` **注意**: `setx` 设置的变量在**新的**命令提示符窗口中才会生效,不会影响当前窗口。 ### PowerShell #### 临时配置 ```PowerShell $env:ARK_API_KEY = "your-ark-api-key-here" ``` #### 永久配置 使用 .NET API 是最可靠的方式。 ```PowerShell # 设置用户变量 [Environment]::SetEnvironmentVariable("ARK_API_KEY", "your-ark-api-key-here", "User") # 设置系统变量 (需要管理员权限) [Environment]::SetEnvironmentVariable("ARK_API_KEY", "your-ark-api-key-here", "Machine") ``` ### 图形用户界面 (GUI) 1. 在开始菜单搜索“编辑系统环境变量”并打开。 2. 在“系统属性”对话框中,点击“环境变量...”按钮。 3. 在弹出的窗口中,您可以在上半部分为您的用户账户添加/修改“用户变量”,或在下半部分为所有用户添加/修改“系统变量”。 4. 点击“新建...”并输入变量名 `ARK_API_KEY` 和您的密钥作为变量值。 5. 逐层点击“确定”关闭所有对话框。 ## ## 验证配置 配置完成后,您可以通过以下方式验证: * **macOS / Linux**: ```Bash echo $ARK_API_KEY ``` * **Windows (CMD)**: ```Bash echo %ARK_API_KEY% ``` * **PowerShell (所有平台)**: ```PowerShell echo $env:ARK_API_KEY # 或者 Get-ChildItem env:ARK_API_KEY ``` 对于永久配置,请务必**重启您的终端或 IDE** 后再次检查,以确保配置已正确加载。 ## ## 高级技巧与实践 ### 安全性:保护您的密钥 **警告**: 绝对不要将包含 `ARK_API_KEY` 等敏感信息的配置文件提交到 Git 等版本控制系统。 * **使用** **`.gitignore`**: 确保包含敏感信息的本地配置文件(如 `.envrc`, `.env`)被添加到 `.gitignore` 文件中。 * **项目级环境变量**: 对于特定项目,推荐使用 `.env` 文件来管理环境变量,并结合 `dotenv` (Node.js), `python-dotenv` (Python) 等库在应用启动时加载它们。 ### 目录级环境变量 `direnv` `direnv` 是一个强大的工具,它可以在您进入或离开项目目录时自动加载或卸载环境变量。 1. **安装** (以 macOS Homebrew 为例): ```Bash brew install direnv ``` 2. **配置**: 在项目根目录创建一个 `.envrc` 文件。 ```Bash # .envrc export ARK_API_KEY="your-project-specific-key" ``` 3. **授权**: 首次进入目录时,运行 `direnv allow`。之后每次进入该目录,`.envrc` 中的变量都会自动生效。 --- # 突发流量处理最佳实践 Source: https://ark.volcengine.com/region:cn-beijing/docs/traffic-burst-handling-best-practices 本文介绍存在突发流量的业务如何通过简单改造业务代码,避免因为突发流量导致限流,保障请求成功率。 # 什么是限流 方舟模型服务 API 会对单位时间内的请求次数、token 使用量、使用量的增长幅度及同时发起的请求数量进行限制,以保障服务的稳定运行和资源的合理分配。当调用方发起的请求触发 API 的限流,会返回 “429: 'Too Many Requests'” 错误。 ## 为什么有限流 大模型服务因模型参数量庞大(数十亿至千亿级),**算力成本高昂及扩容周期更长**,导致业界模型服务平台面临流量承接能力(尤其是突发流量)不足的问题。在此背景下,平台会**尽最大努力提升请求成功率**,保障模型服务的整体可用性。限流作为请求的第一层流量防护机制,主要作用如下: * **减少 API 滥用或者误用**:恶意攻击会给服务器发送大量请求,试图让服务过载导致服务中断。方舟设置速率限制,可以有效防止此类情况。 * **保障用户公平地访问**:避免个人或者组织发送过多请求,导致其他人的服务访问和响应速度减慢。通过限制单个用户的请求通量(单位时间请求量),确保尽可能多的人能正常使用API,减少 API 服务速度变慢情况。 * **帮助控制平台总体负载**:如果 API 服务请求极速增加,可能会给服务端资源带来很大扩容压力,导致性能问题。通过设置限流,可以帮助所有用户保持流畅、稳定的体验。 > **注意** > > 限流是**单位时间服务用量的上限**,而**非服务用量的刚性保障**。当任务量突增(如突发流量)或持续高负载时,仍可能触发限流。为了尽可能用好限流配额,避免失败请求占据限流配额,建议用户主动平滑流量曲线或做好模型间的流量分流等。 ## 限流对象 当前方舟的限流对象主要有: * **模型限流**:同主账号下,同模型(不区分版本)限流,由方舟设定,不可手动调整,各个模型默认限流信息请参见 [模型列表](/docs/model-list)。如有超额的流量需求,请通过 [工单](https://console.volcengine.com/workorder/create?step=2&SubProductID=P00001166) 提交提额申请。 * **推理接入点限流**:推理接入点(Endpoint)限流,作用于推理接入点,用户可以自行调整,用于灵活控制应用的模型服务使用量。 ## 限流类型 方舟提供了不同的限流指标。 |限流类型 |解释说明 |适用对象 | |---|---|---| |TPM |每分钟可以处理的 token 量限制,包含模型的输入和输出。 |通常是在线推理中按 token 计费模型的模型服务的限流指标。 | |TPD |每天可以处理的 token 量限制,包含模型的输入和输出。 |通常是批量处理的模型服务的限流指标。 | |RPM |每分钟可发起的请求量限制,用以防 Dos 攻击。 |几乎所有模型都有对应 RPM 指标。 | |IPM |每分钟可生成的图片数量限制,面向生图模型。 |通常是图片生成模型的模型服务的限流指标。 | |Inflight Batchsize |并行在途请求数,同主账号下指定模型同时在处理的请求数量限制,在途请求包括排队、数据传输、计算处理、数据回传全流程的请求。 |几乎所有模型都有对应的并发数指标。 | ## 限流错误码 > 详细方舟错误码见 [错误码](/docs/error-codes)。 # 什么是突发流量 在单位时间内请求量产生剧烈波动,常见在定时数据处理任务、热点事件等场景,平台会根据**请求特征、资源水位、模型特征、用户历史流量**等因素认定突发流量(通常情况下,建议您将 Token 用量的增长速率控制在每 3 分钟 20% 以内)。 |突发流量示意图 |说明 | |---|---| |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/77f12271fa144237ac9bb1ca92331b96~tplv-goo7wpa0wc-image.image) |**常见行为** | \ | | | \ | |* 发送请求频率加快 | \ | |* 发送请求的输入或输出长度突然变长等 | \ | | | \ | |**监控指标(TPM、RPM)** | \ | |* 控制台: **[在线推理](https://ark.volcengine.com/region:cn-beijing/endpoint)** > 推理接入点的详情页 > **监控** 页签 | \ | | | # 平台处理策略 针对突发流量场景,平台采取以下策略**提升推理请求成功率**: * 快速扩容指定模型的服务集群,以逐步承载住服务。 * 方舟会在用户可容忍的超时时间内,通过服务端重试爬坡策略提升请求成功率。 * 当突发流量抢占过多资源影响整体服务可用性时,平台将优先限制/熔断突发流量,保障其他用户的可用性。 * 在触发限制和熔断时,方舟会对突增的请求返回 “429: 'Too Many Requests'” 错误信息,并在资源扩容到一定程度后(分钟级)逐步恢复。 错误码信息 |状态码 |错误类型 |错误码 |错误信息 |含义 | |---|---|---|---|---| |429 |TooManyRequests |ServerOverloaded |The service is currently unable to handle additional requests due to server overload. Please retry later. Request ID: {id} |服务资源紧张,请您稍后重试。常出现在调用流量突增或刚开始调用长时间未使用的推理接入点。 | |429 |TooManyRequests |RequestBurstTooFast |System protection triggered by request burst. Please slow down traffic growth and increase requests gradually before retrying. |请求量激增触发系统保护,请放缓流量提升速度,逐步增加请求量后再尝试 | \ | | | | | | \ | | | | |:::tip | \ | | | | |调用 `doubao-seed-2-0`及之后版本模型触发突增流量限制时,返回此错误码。 | \ | | | | |::: | # 客户端处理策略 业务评估存在突发流量限流情况,推荐以下主动优化策略,进一步提升请求成功率并规避限流风险。 * **客户端整流,主动平滑流量曲线**:通过缓冲机制(如消息队列、本地任务队列)将瞬时突发流量转化为低波动请求,控制对平台的流量增长斜率。从源头避免因斜率过高触发`ServerOverloaded`错误。 * **客户端分流,跨模型负载均衡**:利用方舟多模型的独立突发容忍能力,将流量分散至多个具备冗余容量的模型,避免单一模型资源耗尽。 > **注意** > > * 仅支持跨模型分流(如同时调用“模型A”和“模型B”):不同模型的资源池相互独立,可分散流量压力; > * 同模型多Endpoint/多账号分流无效:同一模型的所有推理接入点和账号共享同一个底层计算资源池,流量最终会汇聚到同一资源池,无法规避该模型的限流阈值。 * **购买模型单元,主动扩容资源池**:购买模型单元,预测自己的流量波动趋势,提前15分钟下单扩容购买模型单元,用扩容到的模型单元来承接自己的突发增量。 策略选择建议 |业务场景 |推荐组合策略 |方舟能力支撑点 | |---|---|---| |不可预测瞬时峰值(热点事件) |整流+分流 |动态容限曲线+多模型资源隔离 | |可预测周期性突发(定时任务) |分流+购买模型单元 |提前15分钟扩容+独立资源池 | |高稳定性要求核心业务 |整流为主+购买备用单元 |稳定承载区间+资源优先级保障 | ## 实践 通过 header 配置(推荐) 对于无需即时完成的推理请求,可以通过请求 **header** 字段传入标识。方舟服务端会检测对应标识,尽可能在指定时间响应请求。 > 平台对配置了 header 排队标识的突发流量请求,会按照策略重试排队中的请求,直到请求开始处理或者排队超时。对比普通请求来说,在触发突发流量限流时,不是直接报错,而是在排队时间内帮用户进行重试。 ### 核心配置 |header 字段 |示例 |说明 | |---|---|---| |X-Ark-Max-Wait-Timeout-Ms |300000 |突发请求的最大排队时间。 | \ | | |单位:毫秒 | \ | | |建议值:[60000,600000],1~10分钟 | \ | | |常见配置: | \ | | | | \ | | |* 60000:1分钟 | \ | | |* 180000:3分钟 | \ | | |* 300000:5分钟 | \ | | |* 600000: 10分钟 | ### 超时时间配置 长请求(深度思考、长输入输出)需关注超时时间,避免因叠加了排队时间,客户端超时关闭连接,导致请求失败。 **非流式请求**(`stream:false`) * 超时时间:` 原基础超时时间(非突发场景)`+` 突发请求最大排队时间` **流式请求**(`stream:true`) * 超时时间:> `突发请求最大排队时间` > 注意:如使用方舟 Go SDK ,流式输出请求超时时间也需设置 `原基础超时时间(非突发场景)`+ `突发请求最大排队时间` **举例** 请求原基础超时时间(非突发场景下) 30 分钟,突发请求最大排队时间 5 分钟。 * 非流式输出超时时间: 35 分钟 * 流式输出的请求超时时间 * 方舟 Python/Java SDK:大于 5 分钟( SDK 默认超时时间 10 分钟,无需重新配置) > 注意:如使用方舟 Go SDK ,流式输出请求超时时间也需设置 35 分钟 ### 示例代码 示例代码 **选项:Python** ```Python import os from arkruntime import Ark client = Ark( api_key=os.environ.get("ARK_API_KEY"), base_url="https://ark.cn-beijing.volces.com/api/v3", # 非流式输出:超时时间 = 排队时间 + 基础超时时间 = 300 秒 + 1800秒 timeout=2100, ) completion = client.chat.completions.create( # Replace with Model ID model="doubao-seed-2-1-pro-260915", messages = [ {"role": "user", "content": "常见的十字花科植物有哪些?"}, ], # 自定义request,突发流量最大排队时间 300000 毫秒(5分钟) extra_headers={"X-Ark-Max-Wait-Timeout-Ms": "300000"}, stream = False, ) print(completion.choices[0].message.content) ``` **选项:Go** ```Go package main import ( "context" "fmt" "log" "os" "time" "github.com/volcengine/ark-runtime-go/arkruntime" "github.com/volcengine/ark-runtime-go/arkruntime/model/chat" ) const ( ArkModel = "doubao-seed-2-1-pro-260915" ArkBaseUrl = "https://ark.cn-beijing.volces.com/api/v3" ) var ( ArkApiKey = os.Getenv("ARK_API_KEY") ) func callArk(msg string) (string, error) { client := arkruntime.NewClientWithApiKey( ArkApiKey, arkruntime.WithBaseUrl(ArkBaseUrl), ) // 非流式输出:超时时间 = 排队时间 + 基础超时时间 = 300 秒 + 1800秒 ctx, cancel := context.WithTimeout(context.Background(), 2100*time.Second) defer cancel() resp, err := client.CreateChatCompletion( ctx, &chat.ChatCompletionRequest{ Model: ArkModel, Messages: []chat.ChatCompletionRequestMessage{ userMessage(msg), }, }, arkruntime.WithCustomHeaders(map[string]string{ // 自定义request,突发流量最大排队时间 300000 毫秒 (5分钟) "X-Ark-Max-Wait-Timeout-Ms": "300000", }), ) if err != nil { return "", err } if len(resp.Choices) > 0 && resp.Choices[0].Message.Content != "" { return resp.Choices[0].Message.Content, nil } return "", fmt.Errorf("empty response") } func main() { result, err := callArk("常见的十字花科植物有哪些?") if err != nil { log.Fatalf("调用失败: %v", err) } fmt.Println(result) } func userMessage(content string) chat.ChatCompletionRequestMessage { return chat.ChatCompletionRequestMessage{ OneOf: chat.NewChatCompletionRequestUserMessageChatCompletionRequestMessageSum( chat.ChatCompletionRequestUserMessage{ Role: chat.ChatCompletionRequestUserMessageRoleUser, Content: chat.NewOptNilChatCompletionMessageContent(chat.NewStringChatCompletionMessageContent(content)), }, ), } } ``` **选项:Java** ```Java package com.ark.sample; import com.volcengine.ark.runtime.models.chat.*; import com.volcengine.ark.runtime.service.ArkService; import java.time.Duration; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class Header { private static final String ARK_MODEL = "doubao-seed-2-1-pro-260915"; private static final String ARK_BASE_URL = "https://ark.cn-beijing.volces.com/api/v3"; private static final String ARK_API_KEY = System.getenv("ARK_API_KEY"); public static String callArk(String msg) { ArkService service = ArkService.builder() .apiKey(ARK_API_KEY) .baseUrl(ARK_BASE_URL) // 非流式输出:超时时间 = 排队时间 + 基础超时时间 = 300 秒 + 1800秒 .timeout(Duration.ofSeconds(2100)) .build(); final List messages = new ArrayList<>(); final ChatCompletionRequestMessage userMessage = ChatCompletionRequestUserMessage.builder() .role(ChatCompletionRequestMessageType.USER) .content(ChatCompletionMessageContent.ofString(msg)) .build(); messages.add(userMessage); ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder() .model(ARK_MODEL) .messages(messages) .build(); Map customHeaders = new HashMap<>(); // 自定义request,突发流量最大排队时间 300000 毫秒 (5分钟) customHeaders.put("X-Ark-Max-Wait-Timeout-Ms", "300000"); String result = (String) service.createChatCompletion(chatCompletionRequest, customHeaders) .getChoices() .get(0) .getMessage() .getContent(); service.shutdownExecutor(); return result; } public static void main(String[] args) { try { String result = callArk("常见的十字花科植物有哪些?"); System.out.println(result); } catch (Exception e) { e.printStackTrace(); System.exit(1); } } } ``` ## 实践 客户端削峰填谷 ### 设计逻辑 `Client端突发峰值请求 → MQ无限制接收(削峰) → 消费端斜率可控匀速消费(填谷) → 方舟SDK调用大模型` 1. **削峰**:RabbitMQ 做流量蓄水池,生产者无任何速率限制,承接所有瞬时峰值请求,彻底隔离峰值与大模型服务; 2. **填谷**:消费端以平稳速率消费 MQ 积压请求,充分利用大模型服务能力,无资源浪费; 3. **斜率可控**:消费速率从`5QPS`开始,**每 5 秒增长 2QPS**,直到 30QPS 封顶,增长斜率恒定,无任何陡增,不会打满大模型服务; 4. **可靠性**:MQ 队列 + 消息持久化、手动 ACK 确认,消息零丢失;失败请求自动重回队列重试。 示例代码 **选项:Python** ```Python #!/usr/bin/env python3 # -*- coding: utf-8 -*- import time import json import os import threading # 安装SDK: python -m pip install --upgrade arkruntime pika from arkruntime import Ark import pika # ===================== 全局极简配置【所有参数可一键修改】===================== MQ_QUEUE = "client_ark_queue" # MQ削峰队列 MQ_CONF = pika.ConnectionParameters('127.0.0.1', 5672, credentials=pika.PlainCredentials('guest', 'guest')) ARK_API_KEY = os.getenv('ARK_API_KEY') # 获取API Key: https://ark.volcengine.com/region:cn-beijing/apikey ARK_MODEL = "doubao-seed-2-1-pro-260915" # 🔥 斜率可控核心配置 🔥 斜率=步长/间隔 = 2/5 = 0.4QPS/秒,绝对无陡增 FLOW = {"curr_qps": 5, "max_qps": 30, "step": 2, "interval": 5, "count": 0} LOCK = threading.Lock() # ===================== 1. 极简斜率可控流控【核心】===================== def flow_schedule(): """后台线程:匀速增长消费速率,控制斜率""" while True: time.sleep(FLOW["interval"]) if FLOW["curr_qps"] < FLOW["max_qps"]: FLOW["curr_qps"] += FLOW["step"] def reset_count(): """后台线程:每秒重置请求计数器,精准控QPS""" while True: time.sleep(1) with LOCK: FLOW["count"] = 0 def allow(): """流控校验:是否允许发起本次请求""" with LOCK: if FLOW["count"] < FLOW["curr_qps"]: FLOW["count"] += 1 return True return False # ===================== 2. MQ生产者【Client端请求投递,削峰】===================== def producer(client_req): """投递Client请求到MQ,无速率限制,承接峰值流量""" conn = pika.BlockingConnection(MQ_CONF) ch = conn.channel() ch.queue_declare(queue=MQ_QUEUE, durable=True) # 队列持久化 ch.basic_publish(exchange='', routing_key=MQ_QUEUE, body=json.dumps(client_req), properties=pika.BasicProperties(delivery_mode=2)) # 消息持久化 conn.close() # ===================== 3. 方舟SDK调用【大模型请求核心】===================== def call_ark(msg): """✅ 标准使用指定方舟SDK,极简调用大模型""" client = Ark( api_key=ARK_API_KEY, base_url='https://ark.cn-beijing.volces.com/api/v3', ) resp = client.chat.completions.create(model=ARK_MODEL, messages=[{"role": "user", "content": msg}]) return resp.choices[0].message.content # ===================== 4. MQ消费者【填谷+斜率控速+调用方舟,核心主逻辑】===================== def consumer(): """消费端核心:削峰后的流量,斜率可控匀速消费,调用方舟大模型""" conn = pika.BlockingConnection(MQ_CONF) ch = conn.channel() ch.queue_declare(queue=MQ_QUEUE, durable=True) ch.basic_qos(prefetch_count=1) # 防止消费积压 def callback(_ch, method, _, body): req = json.loads(body)["msg"] if not allow(): # 流控校验,不通过则消息重回队列 _ch.basic_nack(delivery_tag=method.delivery_tag, requeue=True) return try: ark_resp = call_ark(req) # 调用方舟大模型 print(f"请求:{req[:15]} | 响应:{ark_resp[:20]}") _ch.basic_ack(delivery_tag=method.delivery_tag) # 消费成功手动ACK except Exception as e: _ch.basic_nack(delivery_tag=method.delivery_tag, requeue=True) # 失败重试 ch.basic_consume(queue=MQ_QUEUE, on_message_callback=callback, auto_ack=False) print(f"消费启动|初始QPS:{FLOW['curr_qps']} 最大QPS:{FLOW['max_qps']} 斜率可控") ch.start_consuming() # ===================== 启动入口 ===================== if __name__ == '__main__': # 启动流控后台线程 threading.Thread(target=flow_schedule, daemon=True).start() threading.Thread(target=reset_count, daemon=True).start() # 方式1: 模拟Client端峰值流量【生产端】- 按需执行 # for i in range(100): producer({"msg": f"大模型请求{i}: 技术方案总结"}) # 方式2: 启动消费端【填谷+控速+调用方舟】- 主运行 consumer() ``` **选项:Go** ```Go package main import ( "bytes" "encoding/json" "flag" "fmt" "io" "log" "net/http" "os" "sync" "time" amqp "github.com/rabbitmq/amqp091-go" ) // ===================== 全局配置 ===================== const ( MQQueue = "client_ark_queue" MQUrl = "amqp://guest:guest@127.0.0.1:5672/" ArkModel = "doubao-seed-2-1-pro-260915" ArkBaseUrl = "https://ark.cn-beijing.volces.com/api/v3/chat/completions" ) var ( // Get API Key: https://ark.volcengine.com/region:cn-beijing/apikey ArkApiKey = os.Getenv("ARK_API_KEY") MockMode = false ) // FlowConfig 流控配置 type FlowConfig struct { CurrQPS int MaxQPS int Step int Interval time.Duration Count int mu sync.Mutex } // 全局流控对象 var flow = &FlowConfig{ CurrQPS: 5, MaxQPS: 30, Step: 2, Interval: 5 * time.Second, Count: 0, } // ===================== 1. 极简斜率可控流控【核心】===================== // startFlowSchedule 后台协程:匀速增长消费速率,控制斜率 func startFlowSchedule() { ticker := time.NewTicker(flow.Interval) defer ticker.Stop() for range ticker.C { flow.mu.Lock() if flow.CurrQPS < flow.MaxQPS { flow.CurrQPS += flow.Step // 确保不超过最大值 if flow.CurrQPS > flow.MaxQPS { flow.CurrQPS = flow.MaxQPS } log.Printf("QPS Limit Increased: Current=%d, Max=%d", flow.CurrQPS, flow.MaxQPS) } flow.mu.Unlock() } } // startResetCount 后台协程:每秒重置请求计数器,精准控QPS func startResetCount() { ticker := time.NewTicker(1 * time.Second) defer ticker.Stop() for range ticker.C { flow.mu.Lock() flow.Count = 0 flow.mu.Unlock() } } // allow 流控校验:是否允许发起本次请求 func allow() bool { flow.mu.Lock() defer flow.mu.Unlock() if flow.Count < flow.CurrQPS { flow.Count++ return true } return false } // ===================== 3. 方舟API调用【大模型请求核心】===================== type ArkRequest struct { Model string `json:"model"` Messages []Message `json:"messages"` } type Message struct { Role string `json:"role"` Content string `json:"content"` } type ArkResponse struct { Choices []struct { Message Message `json:"message"` } `json:"choices"` Error *struct { Message string `json:"message"` Type string `json:"type"` } `json:"error,omitempty"` } // callArk 调用方舟大模型API func callArk(msg string) (string, error) { if MockMode { time.Sleep(50 * time.Millisecond) // 模拟网络延迟 return "Mocked Response: " + msg, nil } reqBody := ArkRequest{ Model: ArkModel, Messages: []Message{ {Role: "user", Content: msg}, }, } jsonData, err := json.Marshal(reqBody) if err != nil { return "", err } req, err := http.NewRequest("POST", ArkBaseUrl, bytes.NewBuffer(jsonData)) if err != nil { return "", err } req.Header.Set("Content-Type", "application/json") req.Header.Set("Authorization", "Bearer "+ArkApiKey) client := &http.Client{Timeout: 60 * time.Second} resp, err := client.Do(req) if err != nil { return "", err } defer resp.Body.Close() body, err := io.ReadAll(resp.Body) if err != nil { return "", err } if resp.StatusCode != http.StatusOK { return "", fmt.Errorf("API error: status=%d, body=%s", resp.StatusCode, string(body)) } var arkResp ArkResponse if err := json.Unmarshal(body, &arkResp); err != nil { return "", err } if arkResp.Error != nil { return "", fmt.Errorf("API error: %s", arkResp.Error.Message) } if len(arkResp.Choices) > 0 { return arkResp.Choices[0].Message.Content, nil } return "", fmt.Errorf("empty choices in response") } // ===================== 4. MQ消费者【填谷+斜率控速+调用方舟,核心主逻辑】===================== // startConsumer 消费端核心:削峰后的流量,斜率可控匀速消费,调用方舟大模型 func startConsumer() { conn, err := amqp.Dial(MQUrl) if err != nil { log.Fatalf("Failed to connect to RabbitMQ: %v", err) } defer conn.Close() ch, err := conn.Channel() if err != nil { log.Fatalf("Failed to open a channel: %v", err) } defer ch.Close() // 声明队列 (Durable=true) q, err := ch.QueueDeclare( MQQueue, // name true, // durable false, // delete when unused false, // exclusive false, // no-wait nil, // arguments ) if err != nil { log.Fatalf("Failed to declare a queue: %v", err) } // 设置QoS (PrefetchCount=1) err = ch.Qos( 1, // prefetch count 0, // prefetch size false, // global ) if err != nil { log.Fatalf("Failed to set QoS: %v", err) } msgs, err := ch.Consume( q.Name, // queue "", // consumer false, // auto-ack (设置为false,手动ACK) false, // exclusive false, // no-local false, // no-wait nil, // args ) if err != nil { log.Fatalf("Failed to register a consumer: %v", err) } log.Printf("消费启动|初始QPS:%d 最大QPS:%d 斜率可控", flow.CurrQPS, flow.MaxQPS) forever := make(chan bool) go func() { for d := range msgs { // 解析消息 var reqData map[string]string if err := json.Unmarshal(d.Body, &reqData); err != nil { log.Printf("Error parsing JSON: %v", err) d.Nack(false, false) // 无法解析,丢弃或放入死信队列 continue } msgContent := reqData["msg"] // 流控校验 if !allow() { // 不通过则消息重回队列 d.Nack(false, true) // 稍微sleep一下避免空转太快 time.Sleep(10 * time.Millisecond) continue } // 调用方舟大模型 respContent, err := callArk(msgContent) if err != nil { log.Printf("调用方舟失败: %v", err) d.Nack(false, true) // 失败重试 } else { // 打印日志 (截取部分长度) reqSnippet := msgContent if len(reqSnippet) > 15 { reqSnippet = reqSnippet[:15] } respSnippet := respContent if len(respSnippet) > 20 { respSnippet = respSnippet[:20] } log.Printf("请求:%s | 响应:%s", reqSnippet, respSnippet) // 消费成功手动ACK d.Ack(false) } } }() <-forever } // ===================== 2. MQ生产者【Client端请求投递,削峰】===================== // startProducer 投递Client请求到MQ,无速率限制,承接峰值流量 func startProducer(count int) { conn, err := amqp.Dial(MQUrl) if err != nil { log.Fatalf("Failed to connect to RabbitMQ: %v", err) } defer conn.Close() ch, err := conn.Channel() if err != nil { log.Fatalf("Failed to open a channel: %v", err) } defer ch.Close() q, err := ch.QueueDeclare( MQQueue, // name true, // durable false, // delete when unused false, // exclusive false, // no-wait nil, // arguments ) if err != nil { log.Fatalf("Failed to declare a queue: %v", err) } log.Printf("开始投递 %d 条消息...", count) for i := 0; i < count; i++ { msgContent := fmt.Sprintf("大模型请求%d: 技术方案总结", i) reqData := map[string]string{"msg": msgContent} body, _ := json.Marshal(reqData) err = ch.Publish( "", // exchange q.Name, // routing key false, // mandatory false, // immediate amqp.Publishing{ DeliveryMode: amqp.Persistent, ContentType: "application/json", Body: body, }) if err != nil { log.Fatalf("Failed to publish a message: %v", err) } } log.Printf("成功投递 %d 条消息", count) } // ===================== 启动入口 ===================== func main() { mode := flag.String("mode", "consumer", "运行模式: consumer | producer") count := flag.Int("count", 100, "生产者发送消息数量") mock := flag.Bool("mock", false, "是否开启Mock模式(不真实调用API)") flag.Parse() if *mock { MockMode = true log.Println("Mock模式已开启") } if *mode == "producer" { startProducer(*count) return } // 启动流控后台协程 go startFlowSchedule() go startResetCount() // 启动消费端 startConsumer() } ``` ## 实践 QPS 爬坡策略 客户端通过实时监测服务端响应状态,动态调整请求速率,逐步提升吞吐量,从而有效避免服务限流、确保服务稳定性。 ### 设计思路 QPS 爬坡工作原理如下图所示,统计固定时间间隔的限流错误,来评估线上服务负载。 1. 逐步提升请求发送速率(QPS); 2. 当发现错误率提升时,按照策略降低或稳定 QPS; 3. 当服务稳定后继续提升QPS,并循环1、2; 4. 最终达到平台对应模型的总限流(TPM、RPM)。 ![QPS 爬坡器根据错误率动态增加、降低或稳定 QPS 的流程](https://arkdocs.tos-cn-beijing.volces.com/flowcharts/resources/traffic-burst-handling-best-practices-qps-climber.svg) ### 核心机制1:动态调整速率 QPS Climber (每秒查询率爬坡器)采用"试错-调整"策略,通过周期性评估请求成功率,动态调整请求速率。核心实现在 `adjustQPS()` 方法中。 示例代码 ```Go func (q *QPSClimber) adjustQPS() { // 计算请求总数与错误率 acceptCount := float64(q.counter.Count(Accept)) serverOverloadedCount := float64(q.counter.Count(ServerOverloadedCode)) unknownCount := float64(q.counter.Count(UnknownCode)) errorAll := serverOverloadedCount + unknownCount errorRatio := errorAll / acceptCount // 根据错误率动态调整QPS oldRate, newRate := float64(q.limiter.Limit()), float64(0) switch { case errorRatio >= q.options.StrictErrorRatio: // 高错误率场景:降低请求速率 newRate = oldRate - oldRate*q.options.ProbeRatio case errorRatio >= q.options.RelaxErrorRatio: // 中等错误率场景:维持当前请求速率 newRate = oldRate case errorRatio > 0: // 低错误率场景:小幅提升请求速率进行探测 newRate = oldRate + oldRate*q.options.ProbeRatio case errorRatio == 0: // 零错误场景:更积极地提升请求速率 newRate = oldRate + oldRate*q.options.FastProbeRatio // 防止请求量不足时速率无限增长 if acceptCount*1.5 < oldRate*q.options.AdjustInterval.Seconds() { newRate = oldRate } } // 应用速率调整并设置边界限制 finalRate := minMax(1, float64(q.options.MaxRate), newRate) if finalRate != oldRate { q.limiter.SetLimit(rate.Limit(finalRate)) q.limiter.SetBurst(int(finalRate)) } } ``` ### 核心机制2:客户端限流与重试策略 QPS Climber 实现了两层保护机制: 1. **客户端令牌桶限流**:通过 `golang.org/x/time/rate` 包实现令牌桶算法,确保请求不会超过设定的QPS上限 2. **指数退避重试**:对失败请求采用指数退避策略进行重试,避免短时间内反复冲击服务端 示例代码 核心实现在 `DoRequest()` 方法中: ```Go func (q *QPSClimber) DoRequest(ctx context.Context, req *model.CreateChatCompletionRequest) (model.ChatCompletionResponse, error) { // 初始化指数退避器 backOff := newExponentialBackoff(q.options.RetryBaseDelay, q.options.RetryMaxDelay) for { select { case <-ctx.Done(): return model.ChatCompletionResponse{}, ctx.Err() default: } // 客户端令牌桶限流 if !q.limiter.Allow() { backOff.wait() continue } // 记录已接受的请求并执行 q.Record(Accept) resp, err := q.client.CreateChatCompletion(ctx, req) if err == nil { return resp, nil } // 错误处理与重试决策 statusCode, retry := needRetryError(err) q.Record(convertToCode(statusCode)) if !retry { return resp, err } // 指数退避等待 backOff.wait() } } ``` ### 核心机制3:错误分类后智能路由 将服务端响应错误分为下面几类: * `ServerOverloadedCode`:服务过载(如HTTP 429) * `InternalServerError`:服务器内部错误(如HTTP 500) * `UnknownCode`:其他请求错误(如 HTTP 400) 通过 `convertToCode()` 方法实现错误智能分类,为动态速率调整提供决策依据: 示例代码 ```Go func convertToCode(statusCode int) Code { switch { case statusCode >= http.StatusInternalServerError: return InternalServerError case statusCode == http.StatusTooManyRequests: return ServerOverloadedCode case statusCode == http.StatusOK: return SuccessCode default: return UnknownCode } } ``` ### 代码配置 配置示例 ```Go func defaultOptions() *Options { return &Options{ AdjustInterval: 10 * time.Second, InitialRate: 10, MaxRate: 1000, StrictErrorRatio: 0.05, RelaxErrorRatio: 0.01, ProbeRatio: 0.05, FastProbeRatio: 0.1, RetryBaseDelay: 100 * time.Millisecond, RetryMaxDelay: 3 * time.Second, } } ``` 参数说明 |参数名 |默认值 |推荐值范围 |调优建议 | |---|---|---|---| |**InitialRate** |10 |5-50 |根据服务初始承载能力设置,新服务建议从低值开始 | |**MaxRate** |1000 |需根据服务配额估算 |可根据业务请求使用量(TPM)和请求频率(RPM)来估算,建议设置为服务额定QPS的80%-90%,留有余量。 | |**AdjustInterval** |10s |5-15s |流量波动大时可适当缩短间隔。 | |**StrictErrorRatio** |0.05 |0.03-0.1 |错误率阈值1,错误率高于该阈值,会降低请求频率。 | \ | | | |对稳定性要求高时可降低该值。 | |**RelaxErrorRatio** |0.01 |0.005-0.05 |允许少量错误时可适当提高该值。 | |**ProbeRatio** |0.05 |0.03-0.1 |速率调整步长,波动大时可降低步长。 | |**RetryBaseDelay** |100 ms |50ms-500ms |单位 ms,初始重试延迟,根据服务响应速度调整。 | |**RetryMaxDelay** |3 s |3s-10s |最大重试等待时间。 | ### 使用建议 * **单例模式使用**:在应用中创建单一的 `QPSClimber` 实例,所有API调用共享该实例,避免资源浪费。 * **统一错误处理**:通过 `needRetryError()` 方法统一处理各类错误,确保重试决策一致性。 * **并发请求控制**:结合Go语言的 `sync.WaitGroup` 实现高效并发请求,同时通过QPS Climber控制总体速率。 ```Go // 请求总量 var total atomic.Int64 total.Store(100000) // 并发请求示例 var wg sync.WaitGroup concurrency := 1000 wg.Add(concurrency) for i := 0; i < concurrency; i++ { go func() { defer wg.Done() for total.Add(-1) >= 0 { // 业务请求代码 req := &model.CreateChatCompletionRequest{...} _, err := qpsClimber.DoRequest(ctx, req) // 错误处理 } }() } wg.Wait() ``` * **预热机制**:应用启动时设置较低的初始QPS,通过 `adjustInterval` 逐步提升,避免冷启动时的流量冲击,导致被熔断。 * **自适应调整**:利用QPS Climber的动态调整能力,让系统自动适应流量变化。 * **监控告警**:关注QPS调整日志,设置错误率、成功率等关键指标的监控告警。 * **降级预案**:在极端情况下,考虑实现请求降级或熔断机制,确保核心功能可用。 ### 完整项目代码 * Go [chat-request-climber.zip](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/55c4a0b30f824c7e85da1126a7dfb87b~tplv-goo7wpa0wc-image.image) * Python [python_example.zip](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/560639dc068d4ebb8274a4dbd80ef85d~tplv-goo7wpa0wc-image.image) ## 实践 退避重试策略 使用退避算法进行请求重试,是避免限流的简单且有效方法(不仅仅在突发流量场景),其中随机指数退避算法实现自动重试请求。 ### 核心设计思路 当遇到速率限制错误时,先进行短暂休眠,随后重新发起未成功的请求。若请求依旧失败,系统会增加休眠时长,再次尝试,该过程会持续进行,直至请求成功或达到最大重试次数。 具备如下优势: * 自动重试功能可使系统从速率限制错误中恢复,避免崩溃和数据丢失。 * 指数退避特性能快速进行首次重试。若前几次重试失败,较长的延迟时间可减少速率限制的触发。 * 在等待时间中加入随机抖动,避免大量请求同时重试。 > **注意** > > 不成功的请求会计入每分钟的请求限制内,因此高频重试会更快达到限流阈值,导致更多请求失败。采用指数退避算法进行重试,能在遵守速率限制规则的前提下,提高请求成功的概率,保障系统的稳定运行。 ### 示例代码 示例代码 Tenacity 是一个第三方 Python 库,可用于简化重试的实现。下面示例是如何为一个请求增加随机指数退避。 ```Python import os # 升级方舟 SDK 到最新版本 pip install -U arkruntime from arkruntime import Ark # 引入指数退避(exponential backoff)算法包 from tenacity import retry, stop_after_attempt, wait_random_exponential client = Ark( # 从环境变量中读取您的方舟API Key api_key=os.environ.get("ARK_API_KEY"), base_url="https://ark.cn-beijing.volces.com/api/v3", ) @retry(wait=wait_random_exponential(min=1, max=60), stop=stop_after_attempt(6)) def completion_with_backoff(**kwargs): return client.chat.completions.create(**kwargs) resp = completion_with_backoff( model="doubao-seed-2-1-pro-260915", messages=[{"role": "user", "content": "hello"}] ) print(resp.choices[0].message.content) ``` ## 实践 使用TPM保障包 在可预测或者重点保障的业务,为了应对流量突增,可考虑购买 TPM 保障包来覆盖突发流量,方舟允许 TPM 保障包额度内的突发流量,提供更高的 SLA 和资源优先级。用户无需变更任何代码,只需在指定的接入点上购买 TPM 保障包即可。详细介绍及购买指引见 [在线推理(TPM 保障包)](/docs/tpm-guarantee-package) 。 --- # 火山方舟分账最佳实践 Source: https://ark.volcengine.com/region:cn-beijing/docs/practice-guidance-for-modelark-bill-split 使用火山方舟大模型服务的客户,尤其是企业级客户,普遍存在强烈的分账诉求。例如:通过分账实现大模型服务成本精准核算、业务绩效评估及内部责任划分等。若想做好分账管理,通常在使用大模型前就需要做好内部设计,例如:分账维度梳理、分摊规则定义等。本文将火山方舟支持的分账场景做了典型梳理,沉淀了常见场景的分账解决方案和操作方法,助企业高效落地分账。 > **说明** > > 每个场景都是一个独立的解决方案。其中,场景1、2、3可叠加使用,满足复杂的企业级分账场景。 # 分账概述 ## 什么是分账 分账是指将已经明确的账单数据,依据用户企业内部的实际使用情况或用户自身的业务逻辑,进行账单数据的拆分。分配至不同的业务,部门,甚至个人等。通俗来说,就是通过分账体现出谁在什么产品或者服务上花了多少钱。 ## 支持的分账维度 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/1bae449f72ed426487498a5e8d2098cf~tplv-goo7wpa0wc-image.image) 1. **账号(对应下文场景1)**:账号间的资源隔离,资源归属不同,天然具备分账的能力。用户可以根据业务情况,将不同的部门或不同的业务线独立使用不同的账号进行资源和费用划分,分别各自管理资源和账单,也可通过企业财务能力集中管理费用。 2. **项目(对应下文场景2)**:在单一账号下,单个资源(接入点)可关联唯一项目,如上图 Account_02 所示。当资源产生费用时,会根据资源所属的项目,将费用也自动归属到对应项目中,得到按项目维度的分账数据。 3. **标签(对应下文场景3)**:在单一项目中,单个资源(接入点)可关联多个标签,如上图 Account_02 中的项目 02 所示。标签可标记资源的详细信息,当资源产生费用时,会根据资源所绑定的标签,将费用也自动关联到标签上,得到按标签维度的分账数据。 4. **配置名称/计费单元(对应下文场景4)**:配置名称和计费单元记录了用户使用大模型时所选择的模型和具体计费项目,可以按照配置名称&计费单元进行分组求和,得到模型和模型中计费项目的具体费用,如上图 Account_01 所示。 5. **createdBy系统标签(对应下文场景5)**:在标签系统中,有一类由系统自动创建的标签,典型的就是创建者标签createdBy。当用户开通该功能时,无论使用何种身份登录账号创建资源,系统都会自动在资源上标记该用户的登录身份信息,记录该资源的创建者,如上图 Account_02 中的项目 03 所示。我们可以利用该标签的内容,来得到创建者维度的分账数据。 6. **API Key(对应下文场景6)**:为每个 API Key 生成唯一的资源 ID(Resource ID),账单系统会自动记录该资源 ID,可按该 ID 分组求和实现 API Key 维度分账(支持范围与生效时间见场景 6)。 # 准备工作 1. [开通分账账单功能](https://console.volcengine.com/finance/bill/split-bill)。 > **注意** > > 开通分账账单功能后产生的消费,才能查询到分账账单。请务必提前开通分账账单功能! # 场景1:多部门分账 ## 场景描述 某个公司主体采购了方舟的一个或多个模型服务,多个部门同时使用这些模型服务,需要按照部门维度进行账单统计。 ## 解决方案 选择一个火山引擎账号作为财务托管(托管账号,又称托管主账号),管理各部门账号(被托管账号,又称托管子账号)的财务履约。各部门账号仅可查看自己消费的账单,账单结算、开票、还款均由托管主账号负责。托管主账号可通过账号维度查看各部门产生的账单。 1. 企业下每个部门独立使用一个火山引擎账号,托管子账号可由托管主账号协助申请,无需重复实名认证。 2. 财务部门账号作为托管主账号,在 [费用中心 > 财务关联](https://console.volcengine.com/finance/business-finance/relation) 页面,邀请其他账号完成财务托管关联。操作步骤详见 [财务托管关联和解除](https://docs.volcengine.com/docs/6269/110618?lang=zh#.6LSi5Yqh5omY566h5YWz6IGU5pON5L2c6K-05piO)。 ## 查询账单 使用托管主账号登录,在 [分账账单](https://console.volcengine.com/finance/bill/split-bill) 页面, 默认展示当前主账号(Payer 账号)下的所有子账号(Owner 账号)的消费账单。您也可以过滤要查询的 Owner 账号,查询目标子账号的消费账单。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/d32c20feaf7b427ca3509aa8e45d4ec1~tplv-goo7wpa0wc-image.image)
    # 场景2:多项目组分账 ## 场景描述 某个部门采购了一个或多个模型服务,部门中的多个项目组同时使用这些模型服务,需要按项目维度进行账单统计。 ## 解决方案 每个项目组创建一个项目,创建推理接入点时选择归属的项目。查询账单时,通过项目分组求和。 1. [规划并创建项目](https://console.volcengine.com/iam/resourcemanage/project)。每个项目组创建一个单独的项目。 2. [规划并创建推理接入点](https://ark.volcengine.com/region:cn-beijing/endpoint?config=%7B%7D)。每个项目,按需创建一个或多个推理接入点,创建推理接入点时选择归属的项目。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/a0eec96db78746c491e38f0764ca6be7~tplv-goo7wpa0wc-image.image)
    ## 查询账单 1. 在 [分账账单](https://console.volcengine.com/finance/bill/split-bill) 页面,选择目标项目,过滤要查询的产品,即可查询某个项目下的消费账单。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/c2b4afbebd3b4258a1c5430d5eb0c16a~tplv-goo7wpa0wc-image.image)
    2. 单击右上角 **查询项目汇总分布**,可查看当前账号下不同项目的总消费账单。 # 场景3:多产品分账 ## 场景描述 某个项目组采购了一个或多个模型服务,项目组下包含多个应用、多个产品、多个环境(开发环境、测试环境、生产环境)等,需要按应用/产品/环境进行账单统计。 ## 解决方案 每个项目组创建一个项目,创建推理接入点时选择归属的项目,并打上应用的标签。查询账单时,通过标签分组求和。 以某项目组下包含开发、测试、生产环境为例。 1. [创建项目](https://console.volcengine.com/iam/resourcemanage/project)。 2. [规划并创建标签](https://console.volcengine.com/resourcemanager/tag/list)。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/aea4654669644225ac4a310628d01eb9~tplv-goo7wpa0wc-image.image)
    3. [启用费用标签key](https://console.volcengine.com/finance/bill/tag)。确保该费用标签key在账单明细等数据中体现。 4. [创建推理接入点](https://ark.volcengine.com/region:cn-beijing/endpoint?config=%7B%7D)。每个环境创建一个推理接入点,并选择归属的项目和标签。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/ce7f5d5e5c9c452688bde71e5a478f30~tplv-goo7wpa0wc-image.image)
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/a663d8b005884c9eb313efd9258057bf~tplv-goo7wpa0wc-image.image)
    ## 查询账单 在 [分账账单](https://console.volcengine.com/finance/bill/split-bill) 页面,选择目标项目和标签,过滤要查询的产品,即可查询某个项目下的消费账单。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/0e8471b84db940e9a3a9a5be090b5787~tplv-goo7wpa0wc-image.image)
    # 场景4:多模型分账(简单场景) ## 场景描述 公司或个人采购了多个模型服务,需要按不同模型进行账单统计。适用于不希望引入自定义推理接入点,希望直接通过 Model ID 调用的场景。 ## 解决方案 按配置名称/计费单元分账。 * 按配置名称分账: 火山方舟平台,配置名称通常对应某个模型的所有后付费计费项。当前分账账单页面暂不支持按配置名称进行筛选。您可以通过 [API接口](https://api.volcengine.com/api-explorer?action=ListSplitBillDetail&groupName=%E8%B4%A6%E5%8D%95%E4%B8%AD%E5%BF%83&serviceCode=billing&version=2022-01-01) 拉取分账账单数据,按 ConfigName 进行分组求和。 * 按计费单元分账: 能统计到某个模型的某个计费项的花费。例如:统计某模型的缓存命中费用,了解使用缓存后节省了多少成本。 ## 查询账单 在 [分账账单](https://console.volcengine.com/finance/bill/split-bill) 页面,统计周期选择 **明细**,过滤要查询的产品和计费单元,即可查询某个计费项的消费账单。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/f540b21182384bb38420c15b577f23c5~tplv-goo7wpa0wc-image.image)
    # 场景5:多人分账(简单场景) ## 场景描述 公司采购了一个或多个模型服务,多人同时使用这些模型服务,需要按人头进行账单统计。 ## 解决方案 每个 IAM 用户按需创建多个推理接入点,这些推理接入点会自动绑定createdBy系统标签(sys:ark:createdBy : IAMUser/xxx)。查询账单时,按照 IAMUser 进行分组求和。 1. [启用创建者标签](https://console.volcengine.com/resourcemanager/tag/create_by)。 2. [启用费用标签key](https://console.volcengine.com/finance/bill/tag)。确保该费用标签key `sys:ark:createdBy`在账单明细等数据中体现。 3. [创建推理接入点](https://ark.volcengine.com/region:cn-beijing/endpoint?config=%7B%7D)。每个 IAM 用户按需创建多个推理接入点。 ## 查询账单 在 [分账账单](https://console.volcengine.com/finance/bill/split-bill) 页面,统计周期选择 **明细**,标签选择目标 IAMUser,即可按照人头查询账单。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/72d957a1f41d47a69c9de1f68914db0e~tplv-goo7wpa0wc-image.image)
    # 场景6:按 API Key 分账(简单场景) ## 场景描述 企业或开发者在同一个项目下,为不同的业务应用、测试环境或个人开发者分配了不同 API Key。为了实现精细化成本核算,需要明确每一个 API Key 产生的模型调用用量和费用,进而按 API Key 维度进行账单统计与成本归属。 ## 解决方案 火山方舟为每个 API Key 生成唯一的 **资源 ID**(Resource ID),用于账单分账与用量统计。您可以在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apikey) 页面获取该标识,并将不同的 API Key 下发给对应业务或人员使用。产生消费后,可在账单系统使用 **资源 ID** 分组对账。 > **说明** > > 为实现按 API Key 分账,您会遇到以下名词。在此场景下,它们指代的是 API Key 的同一个唯一标识,仅命名不同: > > * **资源 ID(Resource ID)**:火山方舟控制台 “API Key 管理” 页面展示的列名。 > > * **ApikeyID / apikey_id**:分账账单系统中的分账维度名称,以及查账单 API 过滤条件 `Filters` 的键名。 ## 查询账单 在获取目标 API Key 的 **资源 ID** 后,通过控制台查询按 API Key 拆分的账单或用量。 1. 获取 API Key 的 **资源 ID**:在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apikey) 页面的 **资源 ID** 列,复制待查询 API Key 对应的唯一 **资源 ID**。 2. 按照 **资源 ID** 进行分账: 1. 进入 [分账账单](https://console.volcengine.com/finance/bill/split-bill) 页面,点击 “设置方舟分账维度”,选择 `apikey_id` 。 2. 在 **分拆项 ID** 搜索框中粘贴已复制的资源 ID 进行精准查询。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/8e8c18ea9b8e472abf05da47f3339525~tplv-goo7wpa0wc-image.image) ## 使用限制与注意事项 * **生效时间**:支持查询 **2026-05-01 00:00** 之后产生的账单数据。 * **支持的场景**:后付费按量计费的推理请求用量。 * **不支持的场景** * 特定模型:向量化模型、语音同传模型、LoRA 精调模型。 * 特定计费方式:非后付费/按量计费的用量(如模型单元、TPM 保障包、Coding Plan 等)。 * 未使用 API Key 鉴权的接口调用: * 离线推理任务类型的推理用量; * 非推理请求的用量(如缓存存储费用、精调任务费用、推理代工算力费用、动态模型单元算力费用、素材库费用等); * 使用 JWT token 鉴权的请求。 # 常见问题 ## **已删除的 API Key 是否支持查询账单?** 暂不支持。未来会支持,建议您在删除 API Key 前做好对应 **资源ID** 的内部记录。 ## 什么是推理接入点? 有什么作用? 在使用大语言模型进行推理服务时,推理接入点(Endpoint)是模型调用的关键入口。开发者只需通过指定的 ID 即可向大模型发起 API / SDK 推理请求,实现快速接入与灵活调用。推理接入点分为预置推理接入点和自定义推理接入点。用户主动创建的推理接入点为自定义推理接入点,支持更全面的配置能力,适用于需要精调模型接入、权限控制(配置项目和标签)、算力保障、数据回流等企业级或业务集成场景。更多详情请参见 [什么是推理接入点](/docs/deployment-overview)。 ## 什么是财务托管?有什么作用? 财务托管,即账号授权其他账号对其云资源消费产生的账单进行托管,并负责后续的对账、开票、还款等履约内容。托管主账号(托管账号)管理托管子账号(被托管账号)的财务履约,托管子账号(被托管账号)只有资源操作的权限。在企业财务中,托管账号在关联被托管账户时可以设置关系类型为“财务托管”,即实现被托管账号的财务履约内容托管给托管账号来进行管理。更多详情请参见 [财务托管概述](https://docs.volcengine.com/docs/6269/110617?lang=zh)。 ## 什么是项目?有什么作用? 资源项目(项目)是火山引擎提供的一种资源分组管理的机制,帮助达成逻辑层面的资源隔离,您能够通过资源项目进行项目制授权和分账等操作。更多详情请参见 [项目概述](https://docs.volcengine.com/docs/6649/189152?lang=zh)。 ## 什么是标签?有什么作用? 资源标签是由一组KV键值对组成,您可以通过资源标签从不同维度对云资源进行分类和聚合管理,并且使用于标签制授权和标签分账等场景。更多详情请参见 [标签概述](https://docs.volcengine.com/docs/6649/189377?lang=zh)。 ## 如何快速查看某个推理接入点的费用? 在方舟控制台的 [在线推理](https://ark.volcengine.com/region:cn-beijing/endpoint?config=%7B%7D) 页面,切换至 **自定义推理接入点** 页签,单击目标推理接入点名称,进入 **概览信息** 页面。单击 **前往查看账单**,即可跳转至分账账单页面查看该推理接入点的账单信息。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/14ba908f225d493096003707cf4b74fa~tplv-goo7wpa0wc-image.image)
    ## 知识库如何绑定项目和标签? 1. 关联知识库到 Project * 在知识库创建流程中,选择目标 Project(项目) 完成进行知识库创建,该知识库的分账数据将归属至对应 Project ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/c96cbe4f91f442febf24fbd3b55b06c2~tplv-goo7wpa0wc-image.image) 2. 关联知识库到 Tag * 在知识库详情页下,点击页面上方【费用标签】可指定知识库选择已创建的目标 Tag 完成绑定;绑定后,该知识库的分账数据将自动归属至对应 Tag 的业务场景下 --- # 在应用中使用 RTC 实现 AI 实时对话 Source: https://ark.volcengine.com/region:cn-beijing/docs/rtc-ai 火山引擎的实时对话式 AI场景方案,让人与 AI 的交互不再局限于文字,还能进行自然、流畅、真人感的实时语音对话,可应用于 AI 智能助手、AI 客服、AI 陪伴、AI 口语教学、AI 游戏 NPC、智能硬件等场景。 ![](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_4d24d5a9acbe935d0b02046a6e0e440b.gif) ## Demo 体验 你可直接访问 [Web Demo](https://demo.volcvideo.com/aigc/login?from=doc) 快速体验实时对话式 AI 交互能力。 ## 技术架构 火山引擎实时对话式 AI场景方案,通过火山引擎 RTC 实现音视频数据的高效采集、自定义处理和超低时延传输。在云端,提供了智能音视频处理模块,包括音频 3A、AI降噪和抽帧截图等能力,以减少环境噪音和设备性能对对话式 AI 体验的影响。此外,方案搭载火山方舟大模型服务平台,深度整合语音识别(ASR)、语音合成(TTS)、大语言模型(LLM)和知识库 RAG 等服务,简化语音到文本及文本到语音的转换过程,提供强大的智能对话、自然语言处理和多模态交互能力,助力应用快速实现用户与云端大模型之间的实时语音通话和多模态交互。 ![](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_dde35514224c18bc3aa01f3220e65a1a.jpg) ## 功能特性 * **基础功能** |功能 |说明 | |---|---| |**AI 实时语音对话** |与 AI 进行自然流畅的实时语音对话,如同与真人交流,支持随时插话打断。 | |**智能打断** |提供手动、自动打断多种方法。在对话过程中,用户可以随时打断 AI 的语音输出,实现双向互动。 | |**降噪** |结合 RTC 先进的音频 3A 技术和深度学习的 AI 降噪算法,能够兼顾强降噪与高保真,确保在嘈杂的环境中有效去除背景噪音,保留清晰的人声。 | |**语音识别** |将用户语音实时转写为文本,供大模型分析理解、生成字幕等。 | |**大模型处理** |解析输入文本,并生成语义响应,驱动智能体对话逻辑。 | |**语音合成** |将大模型生成的文字回复转化为语音,供 RTC 播放。 | * **进阶功能** |功能 |说明 | |---|---| |**实时字幕** |实时将用户和 AI 的对话内容转化为文字,显示在终端界面上。具体实现方式,请参见 [实时字幕](https://docs.volcengine.com/docs/6348/1337284?lang=zh)。 | |**控制播放内容** |需要智能体将 LLM 返回的内容处理后进行播报,如过滤细节信息,过滤 Markdown 标签,将 Latex 公式转换为自然语言等。具体实现方式,请参见 [过滤指定内容](https://docs.volcengine.com/docs/6348/1350596?lang=zh)。 | |**Function calling** |允许大模型识别用户对话中的特定需求,并在内容的过程中调用外部函数或 API,来执行它自身无法独立完成的任务,如处理实时数据检索、文件处理、数据库查询等。通过这种方式,AI 智能体能够精确回答特定领域的问题,如天气查询、股票行情查询、数学计算等,扩展了 AI 智能体的服务能力和应用场景。具体实现方式,请参见 [Function calling](https://docs.volcengine.com/docs/6348/1554654?lang=zh)。 | |**集成自研或第三方大模型** |如果需要实现更贴合特定需求的对话效果,可以将自研或第三方大模型集成到对话式 AI 工作流中。具体实现方式,请参见 [对话式 AI 第三方大模型接口验证](https://docs.volcengine.com/docs/6348/1399966?lang=zh)。 | |**实时视频互动** |在与 AI 进行实时交互时,除了语音互动外,还可以通过视觉理解让智能体能够感知用户周围的环境以及用户的行为,实现与 AI 进行实时视频互动。具体实现方式,请参见 [视觉理解能力](https://docs.volcengine.com/docs/6348/1408245?lang=zh)。 | |**接收状态变化消息** |实时获取智能体任务的状态变化消息,以便在业务端及时进行后续处理或保证业务的稳定性。具体实现方式,请参见 [接收状态变化消息](https://docs.volcengine.com/docs/6348/1415216?lang=zh)。 | |**自定义语音播放** |驱动智能体主动播报自定义文本内容,播放安抚语、引导客户互动等。具体实现方式,请参见 [自定义语音播放](https://docs.volcengine.com/docs/6348/1449206?lang=zh)。 | |**自定义大模型上下文** |传入自定义上下文信息代替用户输入或增加背景信息,以帮助大模型更准确地理解用户状态。具体实现方式,请参见 [自定义大模型上下文](https://docs.volcengine.com/docs/6348/1511926?lang=zh)。 | |**配置对话触发模式** |提供手动触发和自动触发两种触发方式,可灵活配置新一轮对话的触发时机,实现更精细的交互体验。具体实现方式,请参见 [配置对话触发模式](https://docs.volcengine.com/docs/6348/1544164?lang=zh)。 | ## 方案优势 * **交流自然、随时打断** * **智能打断**:支持全双工通信及音频帧级别的人声检测(VAD),随时插话打断,交流更自然。 * **端上降噪**:通过 RTC SDK 实现对复杂环境的音频降噪能力,有效降低背景噪音、背景音乐的干扰,提高用户语音打断的准确性。 * **实时秒回、通话流畅** * **超低时延**:基于全链路流式处理,RTC+ASR+LLM+TTS 整体链路时延缩短至 1 秒。 * **抗弱网**:通过智能接入、RTC 云端协同优化,在复杂和弱网环境下确保低延时和传输可靠性,避免因丢字引起大模型理解错误。 * **灵活扩展** * **多人交互**:从 1v1 交互扩展至 1v多的 AI 实时交互。 * **视频交互**:从纯音频对话扩展至音视频 AI 实时交互。 * **快速接入、易集成** 一站式集成,企业只需调用标准的 OpenAPI 接口即可配置所需的 ASR、LLM 和 TTS 服务,快速实现 AI 实时交互应用。 * **跨端兼容** * **多平台支持**:支持 iOS、Android、Windows、Linux、macOS、Web、Flutter、Unity、Electron 和微信小程序多端,满足不同场景的应用需求。 * **多语种互动** * **多语种支持**:支持中、英、日、西等多种语言实时对话。 ## 应用场景 |应用场景 |说明 | |---|---| |智能客服 |提供 7x24 小时自动化客户服务,支持自然流畅的多轮对话、随时打断与智能转接,有效降低人力成本,提升客户满意度。 | |口语教学与陪练 |模拟真实对话环境,提供多语种的实时发音评估、语法纠错和互动式教学,帮助用户高效提升口语能力。 | |虚拟社交 |提供拟人化的情感交流和心理疏导,通过自然对话缓解用户孤独感,满足日益增长的情感支持需求。 | |智能硬件 |AI 嵌入各类智能硬件,实现便捷的语音控制、智能看护、智能陪伴互动和基于用户习惯的个性化服务。 | ## 计费说明 实时对话式 AI 费用由多个计费项组成,每个计费项均提供了免费试用额度。详细说明,请参见 [对话式 AI 实时计费](https://docs.volcengine.com/docs/6348/1392584?lang=zh)。 ## 快速使用 * [无代码跑通实时对话式 AI Demo](https://console.volcengine.com/rtc/guide?) * [体验开源 Demo](https://github.com/volcengine/rtc-aigc-demo) --- # 通过 TOS 内网预签名 URL 传入文件 Source: https://ark.volcengine.com/region:cn-beijing/docs/upload-files-via-tos-internal-presigned-url 您可以将文件存储在华北2(cn-beijing)Region 的私有对象存储桶(TOS)中,通过内网(火山引擎云内部网络)域名生成 GET 预签名 URL,在不公开源文件的前提下,将图片、视频等文件传入火山方舟。生成的预签名 URL 示例如下: ```text https://your-private-bucket.tos-cn-beijing.ivolces.com/path/to/object?...signature... ``` 该方式具有以下优势: * 链接无法通过外网(公开可访问网络)直接访问源文件,数据安全性更高。 * 不消耗公网流量,可降低网络成本,并提升文件传输效率。 > **注意** > > TOS 存储桶、TOS 内网域名与火山方舟服务需保持在华北2(cn-beijing)Region。 ## 步骤一:生成 TOS 内网预签名 URL 针对已存储在 TOS 中的对象,生成一个仅用于读取的 GET 预签名 URL。 配置以下环境变量: ```bash # TOS 访问凭证(Access Key / Secret Key) export TOS_ACCESS_KEY="YOUR_TOS_ACCESS_KEY" # TOS Access Key/Secret Key 请从火山引擎控制台的访问密钥管理获取,ARK_API_KEY 请从火山方舟控制台的 API Key 页面获取 export TOS_SECRET_KEY="YOUR_TOS_SECRET_KEY" # 火山方舟 API Key export ARK_API_KEY="YOUR_ARK_API_KEY" ``` 以视频文件为例,示例代码如下: ```Python import os import tos from tos.enum import HttpMethodType ak = os.getenv("TOS_ACCESS_KEY") sk = os.getenv("TOS_SECRET_KEY") endpoint = "tos-cn-beijing.ivolces.com" # TOS 内网 Endpoint,仅支持 cn-beijing Region region = "cn-beijing" # 当前仅支持 cn-beijing Region bucket_name = "your-private-bucket" # 替换为实际的 Bucket 名称 object_key = "path/to/object.mp4" # 替换为实际的对象路径 if not ak or not sk: raise ValueError("Missing TOS_ACCESS_KEY or TOS_SECRET_KEY") client = tos.TosClientV2(ak, sk, endpoint, region) try: output = client.pre_signed_url( HttpMethodType.Http_Method_Get, bucket_name, object_key, expires=3600, # 预签名 URL 有效期(秒),过期后 URL 失效,需重新生成 ) print(output.signed_url) except tos.exceptions.TosClientError as e: print("Client error:", e.message, e.cause) except tos.exceptions.TosServerError as e: print("Server error:", e.code, e.message, e.request_id) except Exception as e: print("Unknown error:", e) ``` > **说明** > > 预签名 URL 存在有效期限制,可通过 `expires` 参数设置,详情参见 [普通预签名](https://docs.volcengine.com/docs/6349/129226?_vtm_=a106466.b106468.0_0.0_0.0.2289_7630866813484467762&lang=zh)。 示例输出: ``` https://your-private-bucket.tos-cn-beijing.ivolces.com/path/to/object?...signature... ``` > 该 URL 仅可被华北2(cn-beijing)Region 内的火山引擎基础设施访问(如火山方舟),无法通过外网直接访问。 ## 步骤二:使用预签名 URL 调用火山方舟 将步骤一生成的预签名 URL 作为 `video_url` 传入模型,对视频内容进行理解。 示例代码如下: ```python import os from arkruntime import Ark client = Ark( api_key=os.getenv("ARK_API_KEY"), base_url="https://ark.cn-beijing.volces.com/api/v3", ) # 替换为步骤一生成的预签名 URL video_url = "https://your-private-bucket.tos-cn-beijing.ivolces.com/path/to/object.mp4?...signature..." resp = client.chat.completions.create( # Replace with Model ID model="doubao-seed-2-1-pro-260915", messages=[ { "role": "user", "content": [ { "type": "text", "text": "请理解这个视频,输出:1. 视频主要内容 2. 关键人物/物体 3. 关键动作 4. 场景变化 5. 一段简短摘要" }, { "type": "video_url", "video_url": { "url": video_url } } ], } ], ) print(resp.choices[0].message.content) ``` * 按需替换 Model ID,查询 Model ID 参见 [模型列表](/docs/model-list)。 ## 常见问题 ### 方舟无法读取输入文件 请优先检查以下内容: 1. TOS Bucket 与火山方舟服务是否位于华北2(cn-beijing)Region。 2. 是否使用了正确的内网域名,例如华北2(cn-beijing)Region 的 `tos-cn-beijing.ivolces.com`。 3. 预签名 URL 是否已过期。 4. 对象是否存在,且对象 Key 与签名时使用的值完全一致。 5. URL 是否在传递过程中被截断、重复编码或丢失查询参数。 6. 所选模型是否支持当前输入类型。 --- # 用量明细 CSV 解析最佳实践 Source: https://ark.volcengine.com/region:cn-beijing/docs/usage-csv-charge-value-list-best-practice 本文介绍如何解析通过 [查询用量明细导出任务状态](/docs/get-record-export-task-api) 返回的 *DownloadUrl* 下载得到的 CSV 文件,重点说明切换时刻、生效规则、`charge_value_list` 字段结构、兼容策略和多语言示例代码。 ## 切换时刻与生效规则 `GetRecordExportTask` 每次调用按导出任务查询窗口的结束时间 *EndTime* 决定该任务的 CSV 使用哪种格式。切换时刻按调用用户分为两类: - 2026 年 9 月 2 日前已产生调用的用户:切换时刻为 2026 年 9 月 15 日。 - 2026 年 9 月 2 日及以后新增调用的用户:切换时刻为 2026 年 9 月 2 日。 生效规则如下: - *EndTime* 早于或等于对应切换时刻:CSV 返回旧格式。 - *EndTime* 晚于对应切换时刻:CSV 返回新格式。 任务提交后,该任务对应的 CSV 字段格式保持不变,不会在轮询期间发生切换。 ## CSV 格式变更说明 `GetRecordExportTask` 接口的请求参数、响应参数以及 `DownloadUrl` 的生成方式保持不变。本次变更仅影响通过 `DownloadUrl` 下载的 CSV 文件内容格式。 - 旧格式:18 列。 - 新格式:16 列。 - 删除字段:`input_token_charge_item`、`output_token_charge_item`、`cache_hit_token_charge_item`。 - 新增字段:`charge_value_list`。该字段位于 `volc_instance_id` 之后、`timestamp` 之前,用于统一返回各计费项信息。 - 其他字段:其余字段名称、顺序和含义保持不变。 ## 新旧 CSV 对比 ```text 旧格式(18 列) ... | volc_instance_id | input_token_charge_item | output_token_charge_item | cache_hit_token_charge_item | timestamp | pt_hour 新格式(16 列) ... | volc_instance_id | charge_value_list | timestamp | pt_hour ``` ## charge_value_list 字段说明 当导出任务对应的 CSV 使用新格式时,`charge_value_list` 字段的单元格值为 JSON 数组字符串,数组中的每个元素表示一个计费项。 示例如下: ```json [ {"code":"Doubao-lite-32k-inference-prompt_cn-beijing_realtime","value":54,"scale":1000}, {"code":"Doubao-lite-32k-inference-completion_cn-beijing_realtime","value":5,"scale":1000}, {"code":"Doubao-lite-32k-inference-KVcache-hit_cn-beijing_realtime","value":0,"scale":1000} ] ``` 字段说明: - `code`:计费项名称,对应旧格式中的 `*_charge_item` 字段值。 - `value`:整数计量值,例如 token 数或其他计费计量值。 - `scale`:整数缩放因子。 真实计费值为 `value / scale`。 ## 接入建议 - 如需同时兼容历史 CSV 与新 CSV:建议优先按列名判断;若读取链路依赖列位置,也可按列数 `18` 或 `16` 做分支处理。 - 当读取到 `charge_value_list` 字段时:需先执行 JSON 解析,再遍历数组元素获取各计费项的真实计费值。 - 若已有旧逻辑依赖 `input_token_charge_item`、`output_token_charge_item`、`cache_hit_token_charge_item` 三列:需迁移为读取 `charge_value_list` 后按 `code` 分发处理。 ## 注意事项 - 该变更仅影响通过 *DownloadUrl* 下载的 CSV 文件内容,不影响 `GetRecordExportTask` 接口的请求参数、响应参数 schema 和 `DownloadUrl` 字段本身的返回逻辑。 - 建议在任务完成并拿到 `DownloadUrl` 后尽快下载文件。下载链接有效期为 12 小时,过期后需重新提交任务以获取新链接。 - 若业务需要长期兼容历史导出结果,建议同时保留旧格式和新格式的解析分支,不要只按固定列位置解析。 ## 示例代码 以下示例用于读取通过 *DownloadUrl* 下载得到的 CSV 文件,解析 `charge_value_list` 字段中的 JSON 数组字符串,并输出每条记录的请求 ID、各计费项的真实计费值,以及汇总后的 `total_billing`。你可以将其作为本地排查、校验 CSV 解析逻辑或接入业务系统前的验证脚本。 **选项:Python** ```Python import csv import json import sys def main() -> None: if len(sys.argv) != 2: raise SystemExit("Usage: python parse_charge_value_list.py ") with open(sys.argv[1], newline="", encoding="utf-8") as file: reader = csv.DictReader(file) for row in reader: items = json.loads(row["charge_value_list"]) total_billing = 0.0 print(f"req_id={row.get('req_id', '')}") for item in items: billing = item["value"] / item["scale"] total_billing += billing print(f" - {item['code']}: {billing:.6f}") print(f"total_billing={total_billing:.6f}") if __name__ == "__main__": main() ``` **选项:Go** ```Go package main import ( "encoding/csv" "encoding/json" "fmt" "io" "os" ) type ChargeValue struct { Code string `json:"code"` Value int64 `json:"value"` Scale int64 `json:"scale"` } func main() { if len(os.Args) != 2 { panic("usage: go run main.go ") } file, err := os.Open(os.Args[1]) if err != nil { panic(err) } defer file.Close() reader := csv.NewReader(file) header, err := reader.Read() if err != nil { panic(err) } index := map[string]int{} for i, name := range header { index[name] = i } for { row, err := reader.Read() if err != nil { if err == io.EOF { break } panic(err) } var items []ChargeValue if err := json.Unmarshal([]byte(row[index["charge_value_list"]]), &items); err != nil { panic(err) } totalBilling := 0.0 fmt.Printf("req_id=%s\n", row[index["req_id"]]) for _, item := range items { billing := float64(item.Value) / float64(item.Scale) totalBilling += billing fmt.Printf(" - %s: %.6f\n", item.Code, billing) } fmt.Printf("total_billing=%.6f\n", totalBilling) } } ``` **选项:Java** ```Java import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import java.io.BufferedReader; import java.io.FileReader; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; class ParseChargeValueList { private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); private static class ChargeValue { public String code; public double value; public double scale; } public static void main(String[] args) throws Exception { if (args.length != 1) { throw new IllegalArgumentException("usage: java ParseChargeValueList "); } try (BufferedReader reader = new BufferedReader(new FileReader(args[0]))) { List header = parseCsvLine(reader.readLine()); Map index = new HashMap<>(); for (int i = 0; i < header.size(); i++) { index.put(header.get(i), i); } String line; while ((line = reader.readLine()) != null) { List row = parseCsvLine(line); List items = OBJECT_MAPPER.readValue( row.get(index.get("charge_value_list")), new TypeReference>() {} ); double totalBilling = 0.0; System.out.println("req_id=" + row.get(index.get("req_id"))); for (ChargeValue item : items) { double billing = item.value / item.scale; totalBilling += billing; System.out.printf(" - %s: %.6f%n", item.code, billing); } System.out.printf("total_billing=%.6f%n", totalBilling); } } } private static List parseCsvLine(String line) { List result = new ArrayList<>(); StringBuilder current = new StringBuilder(); boolean inQuotes = false; for (int i = 0; i < line.length(); i++) { char ch = line.charAt(i); if (inQuotes) { if (ch == '"') { if (i + 1 < line.length() && line.charAt(i + 1) == '"') { current.append('"'); i++; } else { inQuotes = false; } } else { current.append(ch); } } else { if (ch == '"') { inQuotes = true; } else if (ch == ',') { result.add(current.toString()); current.setLength(0); } else { current.append(ch); } } } result.add(current.toString()); return result; } } ``` **选项:C++** ```C++ #include #include #include #include #include #include #include #include struct ChargeValue { std::string code; double value; double scale; }; std::vector ParseCsvLine(const std::string& line) { std::vector result; std::string current; bool in_quotes = false; for (size_t i = 0; i < line.size(); ++i) { char ch = line[i]; if (in_quotes) { if (ch == '"') { if (i + 1 < line.size() && line[i + 1] == '"') { current.push_back('"'); ++i; } else { in_quotes = false; } } else { current.push_back(ch); } } else { if (ch == '"') { in_quotes = true; } else if (ch == ',') { result.push_back(current); current.clear(); } else { current.push_back(ch); } } } result.push_back(current); return result; } int main(int argc, char* argv[]) { if (argc != 2) { throw std::runtime_error("Usage: ./parse_charge_value_list "); } std::ifstream file(argv[1]); if (!file.is_open()) { throw std::runtime_error("Failed to open CSV file."); } std::string line; if (!std::getline(file, line)) { throw std::runtime_error("CSV file is empty."); } const std::vector header = ParseCsvLine(line); std::unordered_map index; for (size_t i = 0; i < header.size(); ++i) { index[header[i]] = i; } while (std::getline(file, line)) { const std::vector row = ParseCsvLine(line); const auto items = nlohmann::json::parse(row.at(index.at("charge_value_list"))); double total_billing = 0.0; std::cout << "req_id=" << row.at(index.at("req_id")) << '\n'; for (const auto& item : items) { const double billing = item.at("value").get() / item.at("scale").get(); total_billing += billing; std::cout << " - " << item.at("code").get() << ": " << std::fixed << std::setprecision(6) << billing << '\n'; } std::cout << "total_billing=" << std::fixed << std::setprecision(6) << total_billing << '\n'; } return 0; } ``` 返回示例如下: ``` req_id=021738b4-2db3-4c4d-9ec1-6e4d8f3b1a2c - Doubao-lite-32k-inference-prompt_cn-beijing_realtime: 0.054000 - Doubao-lite-32k-inference-completion_cn-beijing_realtime: 0.005000 - Doubao-lite-32k-inference-KVcache-hit_cn-beijing_realtime: 0.000000 total_billing=0.059000 ``` --- # 模型服务计费说明 Source: https://ark.volcengine.com/region:cn-beijing/docs/model-service-pricing 本文为您介绍火山方舟平台模型服务不同功能的计费方式、计费逻辑、计费项等内容。如需查询各模型的计费公式及单价请参考 [模型服务价格](/docs/model-pricing)。 # 在线推理计费 在线推理功能支持以下 3 种计费方式,下表为您详细对比 3 种计费方式适用的场景、功能、模型、优势等内容,供您进行选型。 ## 计费方式选择 |**对比项** |[按 token 后付费](/docs/model-service-pricing#9be44658) |**[TPM 保障包](/docs/tpm-guarantee-package)** |**[模型单元(邀测)](/docs/model-unit-overview)** | \ | |
    |
    |
    | |---|---|---|---| |**简介** |根据模型推理时消耗的 token 数量进行后付费。 |TPM 保障包是针对某个特定模型以及版本保障请求并发达到一定 TPM( Tokens Per Minute)的计费模式。 |模型单元提供专属算力,对精调后模型表现更优。 | |**适用场景** | | | | \ | |SLA(Service Level Agreement,服务等级协议)和延迟要求相对低 |SLA 要求高,延迟低,并发大 |精调后模型的高保障方案 | \ | | | | | \ | | | | | \ | | | | | \ | |* 新用户开始使用方舟。 |* 适合生产级别、流量大小可预估的在线业务。对算力资源确定性要求高,无法接受偶发的资源紧张报错。 |* 适合生产级别业务,对算力资源确定性要求非常高。 | \ | |* 可接受偶发资源紧张报错的业务,或无法预估准确流量的业务。 |* 业务并发量高,超过平台提供的最大限流额度。 |* Lora 精调后的模型,期望在推理时获得更低延迟。 | \ | |* 业务并发度低于平台提供的默认限流值。 |* 希望获得比常规按 token 计费更低的延迟。 |* 使用全量精调后的模型推理。 | \ | | | |* 有特殊的延时、并发需求。 | |**适用功能** |基础模型在线推理 |基础模型在线推理 |基础模型在线推理 | \ | |Lora精调后模型在线推理 | |全量/Lora精调后模型在线推理 | |**主要优势** |购买非常灵活,按 token 消耗量后付费。 |* 并发能力确定性强,平台预留资源,不必担心平台整体水位对自身业务的影响。 |* 独占算力,算力资源确定性强 | \ | | |* 可叠加按 token 计费使用,既保障可预估的流量,又对临时流量有一定缓冲能力。 |* 灵活度高,可支持更多复杂场景,满足更多特殊延迟、并发需求。 | \ | | |* 购买相对灵活,支持按天预付费,按小时后付费购买 |* 购买方式一般灵活:支持按月预付费,按小时后付费。 | |**支持模型** |* 方舟平台所有模型 |* 豆包、Deepseek 系列模型 |* 部分豆包模型 | \ | |* 基于豆包系列模型 Lora 精调后的模型 | |* 基于部分豆包模型精调后的模型 | |**价格比较** |低 |中 |高 | |**服务承诺** |不对并发能力(TPM)进行承诺 |对成功购买的保障包内,保障 token 并发(TPM) |平台提供的算力,可以保障平台预置数据集在相同配置下压测得出低于一定延时的并发 | |**计费特点** |计算token使用量 |购买“TPM 额度” |购买 “个”模型单元 | \ | |按量后付费:不调用不计费 | | | \ | | |* 按天预付费 |* 按月预付费 | \ | | |* 按小时后付费:**根据购买时长计费,不调用也会收费**。 |* 按小时后付费:**根据购买时长计费,不调用也会收费**。 | |**起购时长** |\- |预付费 1 天起购 |预付费 1 个月起购 | ## 按 token 后付费 按 token 后付费,统计模型进行实时推理服务时消耗的 token 数量,按量后付费。 > **说明** > > 在线推理支持多种计费方式。本篇主要介绍按 token 后付费的计费方式,其他计费方式请移步 [TPM 保障包](/docs/tpm-guarantee-package) [模型单元(邀测)](/docs/model-unit-overview) ## 计费项 不同模型服务的计费项不同,具体请参考 [模型服务价格](/docs/model-pricing)。 * **推理输入**:将推理输入的内容(包括但不限于文字、图片)转化为 token 数进行计费,对应`prompt_token`**。** * **推理输出**:将推理输出的内容(包括但不限于文字、图片)转化为 token 数进行计费,对应`completion_token`**。** > 开启上下文缓存功能后,会增加以下计费项。更多信息请参见 [上下文缓存](/docs/context-cache)。 * **缓存命中**:若您的请求被系统判断命中了 Cache,被命中的 token 会按照 cached_token 来计费,价格低于`prompt_token`单价;未被命中的 token 仍按照`prompt_token`计费。 * **缓存存储**:缓存上下文信息产生的存储费用。存储按小时计费,基于每个自然小时内存储的最大 token 数。 ## 计费说明 * **免费额度**:用于抵扣按 token 后付费场景下,在线推理服务消耗的 token。在免费额度内,实时调用不收费。可在 [开通管理页](https://ark.volcengine.com/region:cn-beijing/openManagement) 查看每个模型的剩余额度。 * **计费单价**:[查看价格](/docs/model-pricing) * **如何付费**:出具账单后实时结算扣款 [充值入口](https://console.volcengine.com/finance/fund/recharge) # 批量推理计费 ## 计费方式 按 token 后付费,统计模型进行批量推理服务时消耗的 token 数量,按量后付费。 ## 计费项 不同模型服务的计费项不同,具体请参考 [模型服务价格](/docs/model-pricing)。 * **推理输入**:将推理输入的内容(包括但不限于文字、图片)转化为 token 数进行计费,对应`prompt_token`。 * **推理输出**:将推理输出的内容(包括但不限于文字、图片)转化为 token 数进行计费,对应`completion_token`。 > 部分模型在2025年4月14日21:00开始支持透明前缀缓存能力,您无需任何配置,即可享受前缀缓存技术应用带来的费用降低。 * **缓存命中**:若您的请求被系统判断命中了 Cache,被命中的 token 会按照 cached_token 来计费,价格是`prompt_token`单价的 4 折;未被命中的 token 仍按照`prompt_token`计费。 ## 计费说明 * **免费额度**:批量推理功能不支持免费额度抵扣。 * **计费单价**:[查看价格](/docs/model-pricing) * **如何付费**:出具账单后实时结算扣款 # 精调计费 ## 计费方式 模型训练一般包括以下两种计费模式,不同模型在不同训练方法下支持其中一种或两种计费模式,具体支持情况以控制台显示为准。 * **按 token 后付费**:统计模型进行训练时消耗的 token 数量,根据实际 token 数按量后付费。 * 训练费用 = 总 token 数 x 精调单价 =(用户训练集token数+混入token数+验证集token数)x 迭代轮次 x 精调 token 单价 * 若 token 数小于 1000,将会上取整为 1000 tokens 计算。 * **按算力付费**:根据模型训练所使用的算力资源,按训练过程中实际消耗的模型单元计费小时数计费(每种型号的模型单元对应特定的算力资源)。 * 平台会根据精调任务的模型、训练方法、训练配置推荐对应的训练部署模板。每个部署模板包含若干台指定型号的模型单元,在精调任务创建页展示的价格为使用每个部署模板训练一小时所耗费的价格。 * 训练费用 = 部署模板小时单价*计费小时数 = 模型单元数*模型单元小时单价*计费小时数 * 按算力付费时仅对“有效训练”计费,计费小时数 为 任务有效训练的时长,一般来说“计费小时数”小于“训练小时数”。可在 精调任务详情页-费用详情 查看任务训练费用、实际计费时长、训练时长等信息。 > **说明** > > 按算力付费时仅对“有效训练”计费,即 数据预处理、训练排队、训练完成、失败阶段不计费,因“系统原因造成失败”或“任务抢占”造成的进度损失不计费,训练中的 服务部署、模型加载、服务退出 等过程时长不计费,仅对「训练中」状态下的部分时长计费(如强化学习的 rollout、reward 计算、 train 等环节耗时)。 ## 计费项 * **按 token 后付费**:模型训练消耗的总token数。 * **按算力付费**:模型训练占用模型单元的有效时长,以小时为单位精确到秒。 ## 计费说明 * **免费额度**:精调不支持免费额度抵扣。 * **计费单价**:[查看价格](/docs/model-pricing#b3a42676) * **如何付费**:出具账单后实时结算扣款 [充值入口](https://console.volcengine.com/finance/fund/recharge) # **出账周期** 火山方舟模型服务提供按小时计费出账与准实时计费出账两种模式,不同功能支持的模式不同。本章为您介绍两种模式的区别以及不同功能支持的出账周期。 ## 出账周期模式比对 |**按小时计费出账** |**准实时计费出账** | |---|---| |每小时出具上一小时费用账单。 |每5分钟出具上一计费周期费用账单。 | \ |账单出账时间通常在当前计费周期结束后的1-2小时左右,具体以系统实际出账时间为准。 |账单出账时间通常在当前计费周期结束后的5-10分钟左右,具体以系统实际出账时间为准。 | \ |例如:16:00-17:00 的账单预计在 18:00-19:00 出账。 |例如:16:00–16:05 的账单预计在 16:10–16:15出账。 | \ | | | \ | |为进一步提升费用结算的时效性与用户体验,2026年07月01日起,**Seedance 2.0 及 2.5 系列模型(包括后续版本)的出账周期由 5 分钟缩短为 30 秒**。| \ | | | > **说明** > > 火山引擎为您提供按小时计费出账与准实时计费出账两种模式,该等计费及出账方式旨在协助您更高效、及时地查看账单信息。 > 如因技术原因导致出账时间延迟,敬请谅解,出账时间和周期均以平台实际执行为准。如您因使用该计费出账模式而造成损失,火山引擎免责。 ## 模型服务不同功能的出账周期 |**模型服务功能** |**计费方式** |**计费项** |**出账周期模式** | |---|---|---|---| |在线推理(包括精调后推理) |按token后付费 |推理输入 |准实时计费出账 | |^^|^^|推理输出 |准实时计费出账 | |^^|^^|缓存命中 |准实时计费出账 | |^^|^^|缓存存储 |按小时计费出账 | |^^|TPM 保障包 |[参考 TPM 保障包计费说明](/docs/model-pricing#952683a2) |[TPM 保障包计费说明](/docs/tpm-guarantee-package-pricing) | |^^|模型单元 |[参考模型单元计费说明](/docs/model-unit-overview) |[参考模型单元计费说明](/docs/model-unit-overview) | |批量推理 |按token后付费 |推理输入 |准实时计费出账 | |^^|^^|推理输出 |准实时计费出账 | |^^|^^|缓存命中 |准实时计费出账 | |精调 |按 token 后付费 |按 token 后付费 |按小时计费出账 | |^^|按算力付费 |按算力付费 |按小时计费出账 | # 欠费说明 > **注意** > > 火山方舟于 2025年7月16日00:00:00 启用新的模型服务欠费规则:由 **出具账单后欠费2小时以上关停** 变更为 **欠费1分钟即关停(按小时后付费的模型单元和TPM保障包除外)**。如需保障稳定的线上服务,可开启 [延期免停权益](https://docs.volcengine.com/docs/6269/202201?lang=zh)。 后付费账单按小时结算,出具账单后实时结算扣款。如果您账户中的可用额度(含账户余额和代金券)小于待结算的账单,会被认为欠费。 |条件 |说明 | |---|---| |欠费时长 ≤ 1 分钟 |您可以正常使用火山方舟模型服务,火山方舟按照您的具体使用量出具账单。 | \ | | | \ | |:::tip | \ | |如需延长免停时长,可参考 [延期免停权益说明](https://docs.volcengine.com/docs/6269/202201?lang=zh)。 | \ | |如果希望严格控制费用预期,避免推账、关停延迟带来的额外花销,可为模型设置用量上限。当调用量达到模型用量上限后,平台会为您自动关停对应的模型服务。详情可参考 [用量上限设置](/docs/activation-management#405e7d60)。 | \ | |::: | |欠费时长 > 1 分钟 |* 对于无可用资源包的模型服务,将立即关停。 | \ | |* 对于仍有可用资源包(含免费额度)的模型服务,可继续使用,直至资源包额度消耗完毕后关停。可在 [费用中心 > 资源包管理](https://ark.volcengine.com/region:cn-beijing/finance/resource-package) 查看模型剩余资源包。 | > **警告** > > * 对于**按小时后付费**的模型单元和TPM保障包,欠费后会有”欠费-关停“阶段,时长约2小时(具体时间以通知为准)。期间保留资源并可使用,且依然会产生费用。如果确定不再使用服务,请及时在接入点详情页 [退订](/docs/model-unit-overview#%E8%B0%83%E6%95%B4%E6%95%B0%E9%87%8F-%E7%BB%AD%E8%B4%B9-%E9%80%80%E8%AE%A2)。 > * 请及时补缴欠费账单,避免服务中断。访问 [火山引擎费用中心](https://console.volcengine.com/finance/fund/recharge) 充值,详细操作参见 [充值操作指引](https://docs.volcengine.com/docs/6269/100434?lang=zh)。 # 常见问题 [什么是 token?如何计算 token 数量?](/docs/modelark-faq#8f169720) [模型推理请求报错或者中断会计费么?](/docs/modelark-faq#9ed23b1e) [精调任务失败会计费吗?](/docs/modelark-faq#b740f18a) [手动停止精调任务会计费吗?](/docs/modelark-faq#0c9ce562) [账户欠费后如何充值?](/docs/modelark-faq#1b44d554) [为什么我的账户欠费后仍在持续出账?](/docs/modelark-faq#08bd1d88) [如何按 Endpoint ID 或精调任务 ID 分账?](/docs/modelark-faq#d53174f8) --- # TPM 保障包计费说明 Source: https://ark.volcengine.com/region:cn-beijing/docs/tpm-guarantee-package-pricing 当你需要购买、变更、退订 TPM 保障包前,可阅读此文档。 # 计费方式 TPM 保障包支持按使用时长的后付费和按天购买的预付费,两种方式可叠加购买。 |计费类型 |后付费 |预付费 | |---|---|---| |计费特点 |按实际使用时长计费,精确到秒 |按天计费,单价优惠 | |弹性配置 |支持 |不支持 | |变配与退订 |支持灵活变配与退订,无惩罚系数 |降配或退订造成的退费,会有额外惩罚系数(1.5) | |适合场景 |短期、弹性或者服务请求波动较大的场景 |中长期稳定或服务请求相对稳定的场景 | # 额度抵扣说明 |说明 |TPM计算器 | | |---|---|---| |**抵扣逻辑** |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/f17678049c4549ae9cfc1ff7f4e21377~tplv-goo7wpa0wc-image.image) | | \ | | | | \ |* **不同模型**,请求的**不同输入输出长度**,抵扣 TPM 额度的速度不同,需按抵扣系数计算购买的TPM。 | | | \ |* 抵扣额度计算公式 | | | \ | * 抵扣输出额度 = 输出 token * 抵扣系数 | | | \ | * 抵扣输入额度 = 输入 token * 抵扣系数 | | | \ | | | | \ |**TPM计算器** | | | \ | | | | \ |* 可通过 TPM 计算器 查看相应的抵扣系数,并估算实际需要购买的**可抵扣TPM**。 | | | \ |* 入口:[创建接入点](https://ark.volcengine.com/region:cn-beijing/endpoint/create),完成模型选择,并选中 TPM 保障包,在右侧创建说明窗格中展示。 | | | \ | | | | \ |**抵扣示例** | | | \ | | | | \ |* 购买的某模型的TPM信息: | | | \ | * 额度:输入 1000k TPM,输出 200k TPM。 | | | \ | * 抵扣系数:输入 10k token 时抵扣系数为 1,输出 1k token 时抵扣系数为 4。 | | | \ |* 当输出 TPM 达到 50k token 时,`50k * 4 抵扣系数 = 200k token`,TPM 输出额度达上限。 | | | # 计费单价 请参见 [TPM 保障包](/docs/model-pricing#952683a2)。 # 后付费(按时长)详细说明 |项目 |后付费 | |---|---| |**购买条件** |账户余额大于100元。 | |**生效时间** |* 开始生效时间:资源分配成功。资源分配不成功,系统自动退费。 | \ | |* 结束生效时间:提交退订请求。如未发起退订,会持续计费,直至欠费关停(约欠费2小时)后服务关停。 | |**计费特点** |按实际资源占用时长收费,精确到秒。购买后持续计费,如需停止计费需在接入点详情页退订。 | \ | |> 举例:假设您在16:00:00下单成功,在18:20:31退订成功。则计费时长为2 小时 20分钟 31 秒,计费单价会换算成每秒钟单价进行计算。 | |**出账周期** |按小时结算,账单出账时间通常在当前计费周期结束后1-2小时左右,具体以系统实际出账时间为准。 | \ | |> 例如:16:00-17:00 的账单约在 18:00-19:00 出账。 | |**欠费说明** |欠费后会有“欠费-关停”阶段,时长约2小时(以实际通知为准),期间保障包可用,**会产生保障包使用费用**;关停后,TPM 保障包不可用,并终止计费。 | \ | | | \ | |:::warning | \ | |请及时续费/退订,避免业务中断/产生额外费用。 | \ | |::: | |**变更说明** |* 退订:支持灵活退订,立即生效,无惩罚系数。 | \ | |* 变更配置:支持灵活调整,无惩罚系数。 | \ | | * 调整条件:资源在**生效中**状态。 | \ | | * 调整约束:支持对输入和输出进行同向调增或调减,或仅对一者进行调整。不支持同时对一者调增,另一者调减。 | |**弹性配置** |* 生效机制: | \ | | * 定时弹性不保证一定生效,结合平台实际资源情况兑付。 | \ | | * 如一次定时任务同时调增和调减,将分两次执行,每次执行只有成功和失败两种结果。 | \ | | * 如定时任务的目标未兑付,会每隔半小时启动重试,直到本次定时任务的目标完全兑付;或时间到达下个定时策略的触发时刻,直接执行下一个任务。 | \ | |* 建议定时任务间隔至少半小时。 | # 预付费(按购买天数)详细说明 |项目 |说明 | |---|---| |购买条件 |账户未欠费。 | |到期时间 |第 N 天的 23:59 到期。其中,N 为您购买的 TPM 保障包的天数,购买当天为第 1 天。 | \ | |> 以购买了 1 天期限的 TPM 保障包举例:如果早上 9:00下单,则当天晚上 23:59 到期;如果晚上 21:00 下单,仍旧是当天晚上 23:59 到期。 | |到期说明 |* 阶段:到期后会有“到期-关停”、“关停-回收”、“回收后” 几个阶段,分别对应服务关闭和资源回收两个行为,说明如下。 | \ | | * 到期-关停:时长约12小时(以实际通知为准),期间保障包可用,可续费&退订,不支持变更配置。不承诺 SLA,平台有权对此时间段内资源进行调整。 | \ | | * 关停-回收:时长约12小时(以实际通知为准),期间保障包不可用,可续费&退订,不支持变更配置。 | \ | | * 回收后:无时限,保障包不可用,无法续费/退订/变配,如需使用请重新购买。 | \ | |* 配额:到期关停和到期回收期间的保障包配置占用账号下TPM保障包的配额。 | \ | |* 费用:到期-关停和到期-回收期间不产生 TPM保障包计费。 | |续费说明 |* 前提:账户未欠费。 | \ | |* 入口:[在线推理](https://ark.volcengine.com/region:cn-beijing/endpoint) > 推理接入点详情页 >**概览信息**页签 >**算力保障**窗格。 | \ | |* 方式:支持手动续费,自动续费 两种方式,其中 | \ | | * 自动续费(推荐)信息: | \ | | * 查看起止时间等信息、调整扣款时间(默认到期前第7天0点)配置,访问 [费用中心-续费管理](https://console.volcengine.com/finance/renew)。 | \ | | * 自动续费后无法退费。 | \ | | * 详细信息见 [自动续费详细说明](https://docs.volcengine.com/docs/6269/1134227?lang=zh)。 | \ | |* 逻辑:参见 [续费逻辑文档](https://docs.volcengine.com/docs/6269/81012?lang=zh)。 | |变更说明 |* 前提:仅当资源状态在"生效中"时,可进行调整。 | \ | |* 限制: | \ | | * 仅允许对输入和输出进行同向调增或调减,或仅对一者进行调整。不支持同时对一者调增,另一者调减。 | \ | | * 针对同一个接入点,续费、变配和退订操作在同一时间只能执行一项,需等待当前操作完成后,才能进行下一个操作。 | \ | |* 退费:**降配退款系数为 1.5**(按下单总额作为计算基数),计算方法见:[资源变更计费规则说明](https://docs.volcengine.com/docs/6269/438722?lang=zh#.6ZmN6YWN)。 | |退订说明 |* 退费:金额=实付金额-已使用金额×1.5。 | \ | | * 其中,已使用金额和使用时长相关,使用时长按自然日首尾取整(用了一分钟、还剩一分钟都算一天)。 | \ | |* 不支持7天无理由退订。 | --- # 联网内容插件产品计费 Source: https://ark.volcengine.com/region:cn-beijing/docs/online-content-plugin-pricing 本文为您介绍联网内容插件的计费方式、计费组成及各插件具体计费项。 ## 计费方式 联网内容插件当前支持按量计费后付费的计费方式,按照实际使用量付费。 ## 计费组成 * 内容资源使用次数:联网内容插件一次接口返回中,内容资源按照资源类型去重后出现的次数。即一次请求返回结果包含某个内容源资源,该类型资源计费一次。 > **注意** > > 通过 Responses API 调用[联网搜索工具](/docs/web-search)功能时,**一轮搜索调用可能会发起多个关键词同时搜索,会多次使用本插件**。 * 模型 token 消耗费用:使用插件可能会产生模型额外 token 消耗费用。如您在零代码中使用该插件,联网链路将包含意图识别、问题改写、总结环节。您可在“零代码-联网高级配置”中控制开启或跳过对应环节,若开启后,各环节将产生一定的模型 token 消耗,并按照真实的输入输出按量计费。 > 举例,您的应用调用了插件,返回了 5 个搜索结果,其中 2 个来源抖音资源,3 个来源头条资源,即从 2 个内容源获取了返回结果,将计为 2 次搜索。 ## 计费项 |服务项 |服务说明 |计费方式 |价格 |付费方式 | | --- | --- | --- | --- | --- | |联网资源 |支持实时搜索互联网公开域内容 |按加和量日结 |每月免费额度是 2 万次。超过 2 万次的部分是 4 元/千次。 |按量计费后付费 | |头条资源 |支持实时搜索今日头条图文内容,并提供内容详情信息供展示交互卡片 |按加和量日结 |6 元/千次 |按量计费后付费 | |抖音资源 |支持实时搜索抖音百科内容,并提供内容详情信息供展示交互卡片 |按加和量日结 |6 元/千次 |按量计费后付费 | |墨迹天气 |支持实时搜索墨迹天气内容资源 |按加和量日结 |6 元/千次 |按量计费后付费 | ## 查询用量和费用 * 每次插件调用产生的内容资源使用次数,可通过调用时输出的 `source_type` 字段计算得到。 * 账号下插件调用产生的费用,可通过 [火山引擎控制台 > 费用中心 > 账单详情](https://console.volcengine.com/finance/bill/detail/) 了解,本系列插件对应产品为**内容定制-联网内容插件**。 ## 欠费说明 如果您账户中的可用额度(含账户余额和代金券)小于待结算的账单,即视为欠费,您将会收到余额不足的短信或邮件提醒。 > **注意** > > 联网内容插件采用**按加和量日结**的计费模式,欠费达到 24 小时后关停服务,请注意欠费后的服务使用情况,并在欠费 24 小时内充值并结清欠费账单,否则您将不能正常使用联网内容插件服务。 联网内容插件产生欠费后,服务状态变化如下: * 欠费 24 小时以内,系统将保持正常运行,持续计费。 * 欠费超过 24 小时不足 168 小时,火山引擎会暂停本服务使用,但仍保留您的数据及相关资源,欠费会继续累积。 * 当欠费超过 168 小时,视为您主动放弃联网内容插件后付费服务,相关资源、数据将被释放,释放的资源及数据无法恢复。 * 如您在欠费 168 小时内补缴所有欠费账单后,服务将恢复正常。 ## 税费及发票 1. 除非另有说明,否则火山引擎平台上产品或服务定价均为包含增值税的费用。在服务提供过程中或产品使用期内,如遇国家税收政策调整,导致增值税税率发生变化的,增值税适用税率应按照国家税收政策相应调整,不含税价格保持不变。 2. 我们支持您根据您在火山引擎账户已成功订购的订单和/或已出具的账单金额向您开具等额增值税发票,未消耗的预充值金额不支持开票。您可以通过**火山引擎控制台 > 费用中心 > 发票管理**或火山引擎不时指定并及时通知的其他渠道申请增值税发票,我们将在收到您的发票申请后及时向您开具增值税发票。如您使用的服务对应的服务规则与本条约定不一致或双方另有约定的,应适用该等特定服务规则或双方另行约定的条款和条件。 3. 我们将根据您购买的具体产品或服务类型,按照如下发票内容向您开具增值税发票: |产品或服务名称 |服务期或授权期 |发票内容 |税率 | | --- | --- | --- | --- | |联网内容插件 |以订购页面展示的服务期为准 |*信息技术服务*技术服务费 |6% | 4. 如涉及退款且退款金额已开票,您应按照我们的要求准备退票相关的资料,通过火山引擎控制台-费用中心-发票管理或其他火山引擎支持的方式提交退票申请,并在提交退订申请时将退票相关的资料提供给我们,我们审核确认无误后进行款项的退还,详细信息请参见 [退换发票](https://docs.volcengine.com/docs/6269/1224228?lang=zh)。 --- # 豆包助手计费 Source: https://ark.volcengine.com/region:cn-beijing/docs/doubao-assistant-pricing 豆包助手 API 是火山方舟平台提供的与豆包同源的企业级 API 服务,旨在帮助企业快速构建可落地、可规模化、可演进的 AI 应用,无需从零开发,即可获得安全、可靠且可控的优质 AI 体验。本文介绍豆包助手 API 的计费方式和计费项。 # **计费方式** 豆包助手 API 采用后付费模式,按次计费。不同功能的收费标准不同,详见下文。 > **说明** > > 调用豆包助手 API 时,其涉及的底层模型调用不单独计费,但您需要确保相应的模型服务已开通且可以正常使用。 # 计费项 |**功能名称** |**刊例价** |**功能说明** | |---|---|---| |日常沟通 |0.1 元 / 次 |全能助手,自然交流,多轮对话,高情商人格化聊天。 | |深度沟通 |0.2 元 / 次 |深度理解,精准解析,先思考再回答,复杂问题尽在掌握。 | |联网搜索 |0.2 元 / 次 |全网搜索,信源丰富,无需费力找资料,一键搜索实时资讯。 | |边想边搜 |0.5 元 / 次 |逻辑缜密,深度洞察,遇难题问豆包,想得更深,答得更准。 | # 欠费说明 详见[欠费说明](/docs/model-service-pricing#66abf1da)。 # **咨询与支持** 如需定制方案或有更多问题,可联系火山方舟团队,获取专属技术支持。 --- # 知识库计费 Source: https://ark.volcengine.com/region:cn-beijing/docs/knowledge-base-pricing # 计费说明 本文介绍知识库产品的计费说明,包括计费方式、计费周期、计费项。 ## 计费方式 > **注意** > > 以下两种计费方式只能选择其中一种计费方式使用 知识库支持两种计费方式,分别是: * 按量计费(后付费),即先使用再付费,费用计入账单内,您可以在账单出账后结算费用; * 预付费,即先付费后使用,按订单结算;下单时扣费,不会再出账单。 ## 计费周期 ### 预付费 预付费规格和计费方案,详情请咨询销售 ### 后付费 知识库以 <小时> 为周期统计所有计费项的使用量,并结算生成账单。 > **注意** > > 创建【旗舰版】知识库后,上传文档会触发知识库计算资源的分配和预留,并开始持续按小时计费,文档删除不属于计算资源自动缩容的触发条件,若无需使用请主动删除知识库。创建【标准版】知识库后,将立即开始收取标准版知识库费用。 ## 计费项 ### 预付费 预付费规格和计费方案,详情请咨询销售 ### 后付费 目前知识库为满足个人开发者和企业客户不同容量的业务需要,在后付费模式下提供了**标准版**和**旗舰版**两种知识库规格,详细对比如下: ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/00d63663287f4b56912078966b525d56~tplv-goo7wpa0wc-image.image) 知识库后付费的出账构成: 1、**资源按小时计费**:计算和存储资源,文档上传后会将数据进行向量化并流式写入索引,因此需要持续对存储和计算资源产生占用,每个小时均会按照当时实际用量计算该小时费用。 ⚠️ 注意:计算和存储资源大小与上传数据量成正比,系统会按照实际用量自动扩缩容。 ⚠️ 注意:每小时均会产生费用,如不需要使用,请及时清理知识库。 2、**模型按调用量计费**:向量化和问答模型的推理,会按照实际的 tokens 消耗统计进行计费。 ⚠️ 注意:当创建知识库时选择了多个向量模型组合模式时,两个模型会分别统计 tokens,并独立按照两个模型计费项出账。 详细计费项解释如下: |**计费项** |**定义** |**如何计量** |**单价** | |---|---|---|---| |计算资源-知识库【旗舰版】 |使用知识库,构建索引、自动优化分析、线上检索依赖的计算资源。旗舰版知识库下计算资源采用独占模式。 |按 CU(Compute Unit)计量,1 CU 包含的计算资源为 8 GB 内存和 1 CPU Core。 |0.45 元/CU/小时 | \ | |计算资源会根据实际用量进行扩缩容。 |计算公式为 CU = MAX(CPU, MEM / 8),当使用的内存大于8倍的 1 CPU Core 时,CU 用量为消耗内存量除以 8。 | | \ | | |其中内存的大小与数据量有关,当数据过大会自动扩容,数据量小会自动缩容 | | \ | | |例如,32 CU 所包含的计算资源为 256 GB 内存 和 32 CPU Core,若运行 5 小时,则计算费用 = 5 × 32 × 0.45 = 72 元。 | | |离线存储资源-知识库【旗舰版】 |向量和向量相关的数据属性所需的存储资源。(而非原始文档大小) |按占用的 GB 计量。 |0.0015 元/GB/小时 | |标准计算资源-知识库【标准版】 |使用知识库,构建索引、自动优化分析、线上检索依赖的计算资源。标准版知识库下计算资源采用共享模式。 |按知识库数量计量。 |0.0416 元/知识库/小时 | |文本向量模型-知识库【通用】 |使用知识库,提供文本向量服务,帮助开发者将文本数据快速转换为向量数据。 |按输入的 tokens 计量。 |0.0005 元/千tokens | |文本向量模型(多功能版)-知识库【通用】 |使用知识库,提供文本向量服务,帮助开发者将文本数据快速转换为向量数据。支持多语言和长文本,可同时进行稀疏和稠密索引构建和检索。 |按输入的 tokens 计量。 |0.0005 元/千tokens | |文本向量模型(Doubao-embedding)-知识库【通用】 |使用知识库,提供文本向量服务,帮助开发者将文本数据快速转换为向量数据。字节跳动自研向量化模型,支持中英双语和高精度纯语义检索,支持4k Token的较长输入窗口。 |按输入的 tokens 计量。 |0.0005元 / 千 tokens | |文本向量模型(Doubao-embedding-large)-知识库【通用】 |使用知识库,提供文本向量服务,帮助开发 |按输入的 tokens 计量。 |0.0007元 / 千Tokens | \ | |者将文本数据快速转换为向量数据。字节跳动自研向量化模型,支持中英双语和高精度纯语义检索。 | | | |多模态向量模型(Doubao-embedding-vision-text)-知识库【通用】 |使用知识库,提供图片+文本的数据场景下文本向量服务,帮助开发者将文本数据快速转换为向量数据。 |按输入的 tokens 计量。 |0.0007元 / 千Tokens | |多模态向量模型(Doubao-embedding-vision-image)-知识库【通用】 |使用知识库,提供图片+文本的数据场景下图片向量服务,帮助开发者将图片数据快速转换为向量数据。 |按输入的 tokens 计量。 |0.0018元 / 千Tokens | |重排模型-知识库【通用】 |使用知识库,基于大语言模型对召回结果进行重排序。 |按输入的 tokens 计量。 |0.0005 元/千tokens | |大模型相关计费项【通用】 |使用知识库,调用大模型服务,根据检索召回的结果生成智能回复。 |按输入、输出的 tokens 分别计量。 |以方舟大模型在线推理定价为准 | \ | | | |../../get-started/model-pricing.md | # 欠费说明 如果您账户中的可用额度(含账户余额和代金券)小于待结算的账单,会被认为欠费,您将会收到余额不足的短信或邮件提醒。本文介绍欠费之后您的资源情况及可执行操作。 请您在欠费 **24** 小时内充值并结清欠费账单,否则您将不能正常使用向量数据库及知识库服务。 向量数据库及知识库产生欠费后服务状态变化如下: * 欠费 **24** 小时以内,系统将保持正常运行,持续计费。 * 欠费超过 **24** 小时不足 **168** 小时,火山引擎会暂停本服务使用,但仍保留您的数据及相关资源,欠费会继续累积。 * 当欠费超过 **168** 小时,视为您主动放弃向量数据库及知识库后付费服务,相关资源、数据将被释放,释放的资源及数据无法恢复。 * 如您在欠费 **168** 小时内补缴所有欠费账单后,服务将恢复正常。 # 税费及发票 除非另有说明,否则火山引擎平台上产品或服务定价均为包含增值税的金额。在服务提供过程中或产品使用期内,如遇国家税收政策调整,导致增值税税率发生变化的,增值税适用税率应按照国家税收政策相应调整,不含税价格保持不变。 我们支持您根据您在火山引擎账户已成功订购的订单和/或已出具的账单金额向您开具等额增值税发票,您可以通过火山引擎控制台-费用中心-发票管理申请增值税发票,我们将在收到您的发票申请后及时向您开具增值税发票。如您使用的服务对应的服务规则与本条约定不一致或双方另有约定的,应适用该等特定服务规则或双方另行约定的条款和条件。针对周期结算服务及具体使用量,公司亦保留要求用户提供资信证明、预付款、保证金或其他公司认为必要的开通和订购条件。 我们将根据您购买的具体产品或服务类型,按照如下发票内容向您开具增值税发票: |**产品或服务交付方式** |**服务期或授权期** |**发票内容** |**税率** | |---|---|---|---| |知识库-公有云版本 |以客户实际使用服务期为准 |*信息技术服务*技术服务费 |6% | --- # Seedance 高级创作权益包购买说明 Source: https://ark.volcengine.com/region:cn-beijing/docs/seedance-2-0-purchase-guide Seedance 高级创作权益包(以下简称“权益包”)是面向使用 Doubao Seedance 2.0 和 Doubao Seedance 2.5 的企业用户推出的增值订阅服务,支持包年包月购买,提供更大容量的私域素材资产库、更高的 API 调用 QPM 以及企业级内容创作支持。 # 购买前准备 * 完成火山引擎账号注册并企业实名认证。 * 在 [高级创作权益包](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=mediaAsset) 页面自助开通本功能。您需完成合规风险评测,同意并遵循相关协议,并完成手机号安全校验。 需要遵循的协议如下: * [资产功能使用规则](/docs/asset-feature-usage-rules) * [上传虚拟人像素材合规承诺函](/docs/compliance-commitment-for-uploading-avatar-assets) * [火山引擎真人认证和同人认证技术服务使用规范](/docs/volcengine-usage-specification-for-real-person-and-lookalike-verification) * [火山引擎真人认证与同人认证技术服务的人脸信息处理规则](/docs/volcengine-face-information-processing-rules-for-real-person-and-lookalike-verification) * [平台客户行为准则及违约处理规则](/docs/breach-of-contract-rules) # 权益说明 权益包支持包年或包月购买,**购买权益包之后,您可享受如下权益**: * 通过 Assets API 集成管理私域素材资产 * 获得更大的私域素材资产库配额 * 获得企业级内容创作支持 > 您也可以选择免费版进行试用。 > **说明** > > 有关私域素材资产库的详细信息,请参考 [私域虚拟人像素材资产库使用指南](/docs/private-virtual-avatar-library-guide-preview) 和 [私域真人人像库使用指南](/docs/guide-preview)。 具体权益,请参考下表: | 权益类型 | 价格 | 真人人像认证入库(控制台) | 真人人像认证入库(API) | 虚拟人像素材入库 | 私域素材资产库配额 | 上传资产限流(CreateAsset) | 内容创作支持 | \ | | | > 支持在控制台中使用;不建议控制台和API混用 | > 支持 Assets API 集成;不建议控制台和API混用 | > 支持 Assets API 集成;支持控制台使用 | > 虚拟&真人人像共享素材资产库配额 | | | | --- | --- | --- | --- | --- | --- | --- | --- | | **基础创作权益** | 免费 | ✅ | ❌ | ❌ | 素材(Asset)数量:50 | 最大 QPM:3 |
    | \ | | | | | | 素材组(Asset Group)数量:50 | | / | | **高级创作权益(Entry)** | 免费 | ✅ | ✅ | ✅ | 素材(Asset)数量:50 | 最大 QPM:3 |
    | \ | | | | | | 素材组(Asset Group)数量:50 | | / | | **高级创作权益** | ¥ 10 万/年 | ✅ | ✅ | ✅ | 素材(Asset)数量:100 万 | 最大 QPM:120 | 为创作者提供标准化的权属自证路径 | \ | | ¥ 1 万/月 | | | | 素材组(Asset Group)数量:100 万 | | | | **高级创作权益(Premium 版)** | ¥ 30 万/年 | ✅ | ✅ | ✅ | 素材(Asset)数量:500 万 | 最大 QPM:300 | 为创作者提供标准化的权属自证路径 | \ | | ¥ 3 万/月 | | | | 素材组(Asset Group)数量:500 万 | | | # 购买入口 1. 打开 开通管理 > [高级创作权益包](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=mediaAsset&projectName=default) 页面。 2. 选择所需套餐,确认订单并完成支付。 # 用量查询 开通权益包后,您可在 开通管理 > [高级创作权益包](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=mediaAsset&projectName=default) 页面查看用量。 # 规则说明 **生效规则**: * 包年订阅,购买后立即生效,到次年当日 23:59:59 失效。 > 举例:在 2026-04-18 购买包年权益包,权益将于 2027-04-18 23:59:59 到期。 * 按月订阅,购买后立即生效,到次月当日 23:59:59 失效。 > 举例:在 2026-04-18 购买包月权益包,权益将于 2026-05-18 23:59:59 到期。 **变更规则**: 一个火山引擎主账号同一时间仅能生效一个套餐。 * 升配:支持灵活升配,差价按剩余有效期折算,升配分为以下两类: | 升配方式 | | 新套餐有效期 | 补差价规则 | | --- | --- | --- | --- | | **月包升级为年包** | * 高级创作权益月包 > 高级创作权益年包 | 升配套餐购买后立即生效,到次年当日 23:59:59 失效 | 升配需补差价金额 = `新套餐年包价格 − 原套餐月包价格 ÷ 原月包总生效天数 × 套餐剩余时长`(即:支付新年包全价,并抵扣原月包剩余天数对应的价值) | \ | | * Premium 版月包 > Premium 版年包 | 例如,您在 2026-04-18 购买高级创作权益月包,在 2026-05-01 升配为 Premium 版年包,则年包有效期为 2026-05-01 至 2027-05-01 | | \ | | * 高级创作权益月包 > Premium 版年包 | | | \ | | * Premium 版月包 > 高级创作权益年包 | | | | **高级权益包升级为 Premium 权益包** | * 高级创作权益月包 > Premium 版月包 | 升配套餐购买立即生效,至原套餐结束失效 | 升配需补差价金额 = `(升配套餐价格 - 原套餐价格) / 原套餐总生效天数 * 套餐剩余时长` | \ | | * 高级创作权益年包 > Premium 版年包 | | | * 降配:不支持从同周期高级创作 Premium 版降配至高级创作权益包,以及从包年套餐降至包月套餐。 **退订规则**: 订阅服务一经购买即视为确认,不支持退款。建议您根据使用需求选择合适的订阅套餐。 **续费规则**: * 按年购买:单次最多购买 1 年权益,权益包到期前 30 天开始可续费。 * 按月购买:单次最多购买 3 个月权益,当前套餐剩余时长 + 新购套餐总时长不能超过 4 个月。 > **说明** > > 重要:请在权益到期前及时续费,避免影响业务运行。如需协助,请联系您的销售代表或技术支持。 **逾期规则**: * 资源关停:逾期 0~15 天。 * 素材数量配额及 API 限流降级至高级创作权益(Entry)。 **注意**:如素材资产或素材资产组数量超出免费配额上限(最多 50 个素材资产组或素材资产),则无法新增真人素材。 * 不可使用 Assets API 创建新的素材资产组(Asset Group)或上传素材资产(Asset),已存在的素材资产可继续使用。 * 不可升配。 * 资源回收:逾期超过 15 天。 * 无法继续查询&使用素材,付费订阅期创建的素材资产及素材资产组将被删除(**已删除的素材资产及素材资产组无法恢复,务必提前做好数据备份**): **注意**:付费订阅高级权益包之前以及权益包订阅到期后 15 天内上传的素材及素材资产组不会被删除。 * 不可续费,如需使用需重新购买。 # FAQ **Q:权益到期后,已上传的素材会被删除吗**? A:逾期 15 天后,付费订阅期创建的素材资产及素材资产组将被删除,但付费订阅高级权益包之前以及权益包订阅到期后 15 天内上传的素材及素材资产组不会被删除,已删除的素材资产及素材资产组无法恢复,请务必提前做好数据备份。 --- # 方舟官方产物验证功能说明 Source: https://ark.volcengine.com/region:cn-beijing/docs/verify_modelark_artifact ## 1. 功能简介 方舟提供官方产物验证 API,用于查询由方舟大模型平台生成的图片或视频产物对应的模型版本。 > **注意** > > 本功能基于图片、视频中的可识别技术特征提供来源线索分析,查询结果仅供参考,不构成官方认证、法律鉴定或权属认定。 ## 2. 开通功能 **仅企业用户可调用**,暂不支持个人用户调用。企业用户可在 **方舟控制台** > **开通管理** > [**应用组件库**](https://ark.volcengine.com/region:cn-beijing/openManagement?&advancedActiveKey=component&tab=Application) 开通本功能,并使用产物验证免费资源包进行体验。 > 可在 [账户管理-基本信息](https://ark.volcengine.com/region:cn-beijing/user/basics/) 中查看账户类型。 ## 3. 使用方法 ### 3.1 使用 API 验证产物 产物验证 API 需使用 [Access Key 鉴权](https://docs.volcengine.com/docs/6257/64983?lang=zh),采用异步查询方式。 > 关于 API 接口的详细信息,请查阅 [CreateArkOfficialResultQuery](/docs/create-ark-official-result-query-api?lang=zh) 和 [GetArkOfficialResult](/docs/get-ark-official-result-api?lang=zh) API 参考文档。 1. **提交查询任务**:调用 `CreateArkOfficialResultQuery` 创建查询任务接口,上传图片或视频产物文件,获取查询任务 `query_id`。 2. **获取结果**:调用 `GetArkOfficialResult` 获取查询结果接口,使用返回的 `query_id` 轮询查询处理状态及最终识别结果,包括是否为方舟平台产物、模型版本、资源类型等信息。 > **注意** > > 最终分析结果可能会受产物压缩、转码、剪辑及二次加工的影响。建议使用未经二次加工的原始文件进行验证。 ### 3.2 支持验证的产物范围及接口限流信息 * **支持验证产物的模型版本**: * **生图**:Seedream 5.0 系列及后续模型。 * **生视频**:Seedance 2.0 / 2.0 fast / 2.0 mini 系列及后续模型。 * **查询时效限制**:支持查询 **30 天内**生成的产物信息。 * **上传文件限制**: * **图片**:文件大小 ≤ 20 MB;支持 `png`、`jpg`(`jpeg`)、`heic`、`webp` 格式。 * **视频**:文件大小 ≤ 100 MB;支持 `mp4`、`mov`、`avi` 格式。 * **账号维度限流**: * 单日调用上限:**1000** * 单账号 QPS:**1** ## 4. 计费说明 * **计费规则**:免费体验额度用尽后,将使用后付费方式计费,**每次请求 0.1 元**。 > **说明** > > - 本接口按调用次数计费。无论最终识别结果如何(是否命中官方特征),业务成功的调用均计入用量。 > - 因鉴权失败或限流等原因导致查询请求失败的情况不收费。 ## 5. FAQ **Q1. “检测到与方舟产物相关的技术特征”说明什么?** 这表明您提交的产物极有可能由方舟生成。此时,接口在产物中识别出了与方舟生成过程相关联的技术特征,并解析出了对应的模型版本信息。此类特征的匹配结果具有较高可靠性。 > **注意** > > - 该结果仅表明产物本身可能由方舟生成,不构成官方认证、法律鉴定或权属认定; > - 该结果无法评估图片、视频所表达内容的真实性或准确性,即无法判定画面信息是否失实、是否具有误导性; > - 该结果无法确证产物在创建之后是否经历二次编辑、修改或转发。 **Q2. “未检测到明显的方舟产物相关技术特征”说明什么?** 这表明本接口已完成对您提交产物的识别,但未发现与方舟生成过程相关联的技术特征。 “未命中”并不代表该产物一定不是由方舟生成的。以下情况均可能导致未命中: - 产物中的溯源信息在传播或加工过程中受到影响:产物在流转过程中的各类处理或再加工均可能对可携带的溯源特征造成影响,进而影响识别。 - 产物的生成时间早于当前接口所覆盖的时间范围:部分早期产物在生成时未包含可被本接口识别的溯源信息。 - 产物由未接入本能力的模型生成:本接口当前仅覆盖列表内的方舟模型(详见 [支持验证的产物范围及接口限流信息](/docs/verify_modelark_artifact#supported-artifacts-and-limits)),列表之外的方舟模型或非方舟模型产物均不在识别范围内。 **Q3. 本功能能否识别图片、视频内容是否失实或具有误导性?** 不能。成功检测到相关特征仅能证明产物由方舟生成,但该结果无法判定图片、视频所传达的信息是否准确,也无法评估其展示背景是否符合事实。 **Q4. 同一图片、视频,为什么有时能查到模型版本,有时查不到?** 模型版本的识别依赖于产物中可用的溯源特征。通常情况下: - 直接使用方舟生成的原始文件时,识别效果最稳定; - 文件在流转与再加工过程中,溯源特征可能受到影响,进而出现难以识别的情况。 如果您对同一产物反复出现无法识别,建议先确认是否仍持有原始文件。 **Q5. 上传的图片、视频会如何处理?** 您上传的文件仅用于本次产物来源及模型版本查询,不会用于模型训练。 为满足审计合规要求,上传的文件在处理完成后将临时保留不超过 24 小时,随后自动清除。除法律另有规定外,文件不会以其他形式保留或使用。 **Q6. 查询结果的准确性如何?返回结果是否可作为法律证据?** 查询结果基于自动化分析生成,仅供参考,不构成官方认证、法律鉴定或权属认定。“未检测到明显的方舟产物相关技术特征”不能作为“非方舟产物”的证据,因为溯源特征可能在流转过程中受到影响而丢失。请勿将本接口的查询结果用于版权归属、真实性鉴定或合规判定等需要具备法律效力的场景。 **Q7. 为什么会出现“返回内容不完整”的情况?** - 任务未执行完毕:异步查询下,当 `status = running` 时,仅返回 `query_id` 和 `status`;请在 `status = succeeded` 时再读取 `is_official`、`model_name` 等业务字段。 - 产物超出可查询时限: - `is_official` / `model_name` 字段:仅可返回 30 天内生成产物的信息。 - `resolution` 字段:仅支持查询 **2026 年 7 月 21 日及之后生成的产物,并且需在生成后 7 天内查询**。 --- # 税率与发票 Source: https://ark.volcengine.com/region:cn-beijing/docs/tax-rates-and-invoices 1. 除非另有说明,否则火山引擎平台上产品或服务定价均为包含增值税的费用。在服务提供过程中或产品使用期内,如遇国家税收政策调整,导致增值税税率发生变化的,增值税适用税率应按照国家税收政策相应调整,不含税价格保持不变。 2. 我们支持您根据您在火山引擎账户已成功订购的订单和/或已出具的账单金额向您开具等额增值税发票,未消耗的预充值金额不支持开票。您可以通过火山引擎控制台-费用中心-发票管理或火山引擎不时指定并及时通知的其他渠道申请增值税发票,我们将在收到您的发票申请后及时向您开具增值税发票。如您使用的服务对应的服务规则与本条约定不一致或双方另有约定的,应适用该等特定服务规则或双方另行约定的条款和条件。 3. 我们将根据您购买的具体产品或服务类型,按照如下发票内容向您开具增值税发票: |产品或服务名称 |服务期或授权期 |发票内容 |税率 | |---|---|---|---| |字节跳动大模型服务(豆包大模型) |以订购页面展示的服务期为准 |*生产生活服务*技术服务费 |6% | 4. 如涉及退款且退款金额已开票,您应按照我们的要求准备退票相关的资料,通过火山引擎控制台-费用中心-发票管理或其他火山引擎支持的方式提交退票申请,并在提交退订申请时将退票相关的资料提供给我们,我们审核确认无误后进行款项的退还,详细信息请参见 [退还发票](https://docs.volcengine.com/docs/6269/1224228?lang=zh)。 --- # 使用 IAM 管理权限 Source: https://ark.volcengine.com/region:cn-beijing/docs/use-iam-to-manage-permissions **访问控制(Identity and Access Management,简称 IAM)** 是企业级云上资源权限精细化管控的核心基础设施。在多人、多团队协作场景下,使用 IAM 结合子账号机制,可以实现火山方舟(Ark)资源的安全隔离与合规访问。 > **最佳实践建议**:在企业生产环境中,应坚决避免多人共享火山引擎主账号(即火山引擎账号)操作云资源,以降低极高的安全风险。推荐全面采用“子账号 + 最小权限原则”的访问控制策略。 本文档将指导企业开发者和系统管理员如何利用 IAM 对火山方舟的资源和控制台权限进行全生命周期管理。关于 IAM 的全局详细教程,请参考火山引擎 [访问控制官方文档](https://docs.volcengine.com/docs/6257/64959?lang=zh)。 > **说明** > > **权限边界说明**: IAM 主要用于管理用户对火山方舟**管控面**(如资源配置、控制台访问)的权限。 若需管理**数据面**(如模型推理调用)权限,请通过配置 API Key 权限实现,详情参阅 [管理 API Key](/docs/manage-api-keys)。 # 基本概念 |核心术语 |实体说明与企业应用场景 | |---|---| |**主账号 (Root Account)** |**定义**:火山引擎的顶级账号,是云资源的拥有者和计费主体,默认拥有该账号下所有资源的最高权限。 | \ | |**场景**:仅限企业最高级管理员(如财务/IT总监)持有,用于创建 IAM 账号、支付账单。日常运维**严禁**使用主账号访问和操作具体资源。 | |**IAM 用户/子账号 (IAM User)** |**定义**:归属于主账号的子身份实体,不独立拥有资源或计费。必须授权后方可登录控制台或通过 API 访问资源。 | \ | |**场景**:为企业内的每位开发者或系统(如 CI/CD 流水线)创建独立的 IAM 用户。详细说明见 [IAM 用户](https://docs.volcengine.com/docs/6257/64977?lang=zh)。 | |**用户组 (User Group)** |**定义**:对具有相同职责的 IAM 用户进行分类管理的集合实体。 | \ | |**场景**:按团队(如算法组、后端组)或角色(如管理员、访客)划分。授权时直接对用户组绑定策略,实现权限的批量下发与回收,极大降低运维成本。详细说明见 [用户组管理](https://docs.volcengine.com/docs/6257/104988?lang=zh)。 | |**角色 (Role)** |**定义**:一种无永久凭证的虚拟身份,通过 STS (Security Token Service) 临时安全令牌被可信实体扮演。 | \ | |**场景**:适用于跨账号授权、应用实例免密访问(如 ECS 访问方舟模型)等高阶安全场景。详细说明见 [角色免密登录控制台](https://docs.volcengine.com/docs/6257/160179?lang=zh)。 | # 权限策略管理 策略(Policy)是定义权限边界的 JSON 描述文件,包含授权效果(Effect)、操作(Action)和资源(Resource)。IAM 支持两种策略类型: 1. **系统策略 (System Policy)**:由火山引擎各产品团队创建与更新,用户可直接关联使用但无法修改。 2. **自定义策略 (Custom Policy)**:由企业管理员自主编写与维护,支持极其精细的权限控制(如限制特定资源、特定 IP 或特定时间段)。 ## 火山方舟预设策略(系统策略) 为方便企业快速落地权限管控,火山方舟提供了多套开箱即用的预设策略: |策略名称 |权限描述 |适用企业角色 |策略详情链接 | |---|---|---|---| |**ArkFullAccess** |**最高管理员权限**:拥有对所有 Ark 服务的完全读写与配置权限。 |算法负责人、核心研发、IT 运维 |[查看策略详情](https://console.volcengine.com/iam/policymanage/System/ArkFullAccess?tab=content) | |**ArkStandardGlobalAccess** |**标准管控权限**:可查看并配置**除模型开通外**的所有资源。 |普通算法工程师、后端研发 |[查看策略详情](https://console.volcengine.com/iam/policymanage/System/ArkStandardGlobalAccess?tab=content) | |**ArkReadOnlyAccess** |**全局只读权限**:可查看所有资源配置(如精调任务、推理接入点等),但无法修改。 |产品经理、运营人员、审计人员 |[查看策略详情](https://console.volcengine.com/iam/policymanage/System/ArkReadOnlyAccess?tab=content) | |**ArkExperienceAccess** |**体验中心权限**:仅可查看并体验模型广场中的预置模型。 |业务试用人员、售前工程师 |[查看策略详情](https://console.volcengine.com/iam/policymanage/System/ArkExperienceAccess?tab=content) | |**ArkGlobalInitAccess** |**项目基础隔离权限**:提供访问控制台所需的底层基础权限,**必须**配合其他项目级策略组合使用。 |**需执行项目资源隔离的所有用户** |[查看策略详情](https://console.volcengine.com/iam/policymanage/System/ArkGlobalInitAccess?tab=content) | \ | | | | | \ | |:::warning | | | \ | |如配置项目级的管理权限,需要为子账号配置 | | | \ | |**ArkGlobalInitAccess**权限,且不限制项目级别。示例请参见[配置实战:为开发团队分配项目管理员权限](/docs/use-iam-to-manage-permissions#8c94f024)。 | | | \ | |::: | | | |**ServiceRoleForArk** |**服务关联角色**:授权方舟平台以系统身份访问您账号下的其他关联云服务资源。 |系统底层服务通信 |[查看角色详情](https://console.volcengine.com/iam/identitymanage/role/ServiceRoleForArk/) | ## 自定义权限策略配置 在复杂企业场景中,系统预设策略往往无法满足“最小权限原则”。此时,建议企业安全架构师编写自定义权限策略。 > **最佳实践**:定期审计自定义策略的使用情况,回收长期未使用的冗余权限;避免使用通配符 `*` 授予不必要的过大权限。自定义策略的版本更新需由企业自行维护。 # 企业级权限管控场景实践 ## 场景 1:模型调用与全生命周期管理 以下示例演示如何通过自定义 JSON 策略,为算法工程师授予特定的模型管理权限(包括接入点的创建、启停、删除及 API 调用等)。 **权限策略 JSON 示例**: ```json { "Statement": [ { "Effect": "Allow", "Action": [ "ark:CreateEndpoint", "ark:ListFoundationModels", "ark:ListCustomModels", "ark:ListFoundationModelVersions", "ark:ListEndpoints", "ark:StopEndpoint", "ark:StartEndpoint", "ark:GetEndpoint", "ark:DeleteEndpoint", "ark:UpdateEndpoint", "ark:GetModelChargeItem", "ark:InnerGetModelUnitPrice", "ark:GetEndpointExampleCode", "ark:GetApiKey", "tag:GetTagValues", "tag:GetTagKeys" ], "Resource": [ "*" ] } ] } ``` **细粒度资源隔离(Resource 限制)**: 若需严格限制该策略仅对特定项目的特定接入点生效,可将 `Resource` 字段从全局的 `"*"` 替换为具体的资源 ARN(Amazon Resource Name 风格的标识符),从而极大缩小爆炸半径: ```json "Resource": [ "trn:iam::2100000xxx:user/username", "trn:iam::2100000xxx:group/usergroupname", "trn:iam::2100000xxx:project/projectname", "trn:ark:cn-beijing:2100000xxx:endpoint/ep-20240407133918-vdsmd3" ] ``` ## 场景 2:按资源项目管理账号权限 大型企业通常存在多个业务线(如 AIGC 业务部、智能客服部)。火山引擎提供 **资源项目(Resource Project)** 功能,通过将 IAM 策略与特定项目绑定,实现跨部门的资源与数据强隔离。 配置基于项目的管控时,**必须组合使用** `ArkGlobalInitAccess`(全局基础权限)与特定的项目级别策略: |权限需求层级 |全局生效策略 (不限制项目) |项目内生效策略 (限制到具体项目) |最终呈现效果 | |---|---|---|---| |**项目内体验** |`ArkGlobalInitAccess` |`ArkExperienceAccess` |用户仅能在指定项目内体验模型广场中的功能,无法触及其他项目。 | |**项目内只读** |`ArkGlobalInitAccess` |`ArkReadOnlyAccess` |用户可查看指定项目下的所有精调任务、接入点等,不能进行变更。 | |**项目内标准操作** |`ArkGlobalInitAccess` |`ArkStandardGlobalAccess` |用户可管理指定项目内除模型开通外的所有资源(适用于项目主力研发)。 | |**项目内全权管理** |`ArkGlobalInitAccess` |`ArkFullAccess` |用户作为该项目的超级管理员,可配置和管理该项目内一切方舟资源。 | # 资源精细化管理与分账 为满足企业的成本核算与合规审计需求,建议深度使用资源项目与标签体系。 ## 资源项目管理 (Resource Project) 资源项目是企业内部环境隔离(如 Dev/Test/Prod)或部门隔离的最佳载体。 * **逻辑分组**:每个云资源只能属于一个项目,项目间的资源默认逻辑隔离。加入项目不会改变云资源底层的关联关系。 * **独立核算**:基于项目进行 IAM 授权不仅可维护数据安全,企业还可通过项目维度输出消费账单,精准计算各业务线的 AI 资源消耗成本。 * **扩展阅读**:[火山方舟分账最佳实践](/docs/practice-guidance-for-modelark-bill-split) | [项目分账指南](https://docs.volcengine.com/docs/6649/174601?lang=zh) ## 标签管理 (Tagging) 标签由一组 `Key:Value` 键值对组成,提供比项目更灵活的多维聚合能力。 * **应用场景**:通过标签实现按负责人追踪(如 `Owner:ZhangSan`)、按业务域分类(如 `Domain:NLP`)。支持基于标签进行权限控制(ABAC)及精细化分账。 * **扩展阅读**:[云资源标签管理](https://docs.volcengine.com/docs/6649/189377?lang=zh) # 配置实战:为开发团队分配项目管理员权限 本节以企业常见的授权流程为例,演示如何为特定用户组配置 `default(默认项目)` 的 `ArkFullAccess` 权限。 **前置条件**:您必须使用主账号或具有 IAM 管理员权限(如关联了 `AdministratorAccess` 策略)的子账号登录控制台。 **操作步骤**: 1. **定位用户/用户组**: 登录火山引擎控制台,导航至 [访问控制 - 用户页面](https://console.volcengine.com/iam/identitymanage/user)。 2. **发起授权**: 在目标用户或用户组右侧的 **操作** 列中,单击 **添加权限**。 3. **配置全局基础权限**: 在 **授权策略** 搜索框中查找并勾选 **`ArkGlobalInitAccess`**。 * *关键点*:此时 **限制到项目资源** 必须选择 **否**(因基础管控界面读取权限需在全局生效)。 4. **配置项目业务权限**: 继续在搜索框中查找并勾选 **`ArkFullAccess`**。 * *关键点*:此时 **限制到项目资源** 必须选择 **是**,并在下拉菜单中选择目标项目(本例选择 `default(默认项目)`)。 5. **确认与生效**: 检查策略与项目匹配无误后,单击 **提交** 按钮。权限变更即刻生效。目标团队成员重新登录后,即可在 `default` 项目下自由调度火山方舟资源。 --- # 管理 API Key Source: https://ark.volcengine.com/region:cn-beijing/docs/manage-api-keys 当您通过代码调用大模型或应用时,需要 API Key 作为鉴权凭证。火山方舟控制台的 **API Key 管理** 页面可以帮助您创建和管理 API Key。如果您是第一次使用,建议先按 [快速入门](/docs/quick-start) 完成端到端调用流程。 ## 功能入口 在控制台左下角选择 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey?apikey=%7B%7D)。 在该页面您可以创建、查询、管理 API Key。 ## 权限模型 API Key 提供以下能力: | 能力 | 说明 | | --- | --- | | 按资源项目(Project)隔离调用权限 | 您可在控制台左下角切换资源项目,在不同项目中创建的 API Key 仅可作为该项目内资源的鉴权凭证。 | | 全部权限 | 可访问一个资源项目下全部资源。 | | 自定义权限 | 自定义指定部分资源的访问权限,灵活控制 API Key 对资源项目内特定资源的使用权限。当前支持从 **Model ID**、**自定义推理接入点** 维度进行细粒度的权限设置。 | | IP 调用白名单 | 限制可调用模型的 IP 地址。启用后,仅添加至白名单的 IP 地址可调用模型。 | ## 创建 API Key 创建 API Key,作为调用大模型或应用的鉴权凭证。创建时根据业务需求选择上文 **权限模型** 中的能力组合。 ## 查询 API Key 支持在 API Key 管理页面查询已有的 API Key,查看当前 API Key 的状态、权限、最后使用时间、创建人等信息。 > **注意** > > 请勿以任何方式公开 API Key,避免被他人使用造成安全风险或资金损失。 ## 编辑权限 支持随时调整 API Key 可访问的权限范围,包括 IP 调用白名单、可访问的具体资源等,以满足不同场景下对 API Key 使用权限的灵活配置需求,确保系统安全与业务需求的平衡。 > **说明** > > API Key 权限控制与模型调用(Model ID、自定义推理接入点)相关的数据面 API 权限。如需设置管控面权限(**包括创建 API Key 的权限**),需使用访问控制 (IAM),具体信息请参考 [使用 IAM 管理权限](/docs/use-iam-to-manage-permissions)。 ![API Key 编辑权限面板]() ## 禁用 / 启用 API Key * 禁用后,API Key 会变成 **已禁用** 状态,使用该 API Key 的请求将无法通过鉴权,请谨慎操作。 * 启用后,API Key 会变成 **生效中** 状态,可正常使用。 > **禁用 vs 删除**:禁用是**可恢复**的——您可随时重新启用同一个 API Key,键值不变。删除是**不可逆**的——已删除的 API Key 无法找回,且使用该 Key 的所有请求会立即鉴权失败。生产环境优先用禁用,确认 Key 不再使用后再删除。 ## 安全设置 > 本节面向**项目管理员(主账号)**。普通项目成员(子账号)看不到本节描述的 **限制成员权限** 开关。 控制一个资源项目成员只能管理自己创建的 API Key,从而增强 API Key 管理的安全性和规范性。 默认情况下,项目成员(子账号)可查看并管理当前项目下的所有 API Key;如对权限有更严格的管控要求,项目管理员(主账号)可开启 **限制成员权限**。开启后,项目成员仅可查看、编辑、禁用/启用、删除自己创建的 API Key,无权操作他人创建的 API Key。 > 您需要在控制台左下角选择资源项目后,才能看到 **安全设置** 信息。 ![安全设置开关](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/31d3c2efcfff47b1bfb6b0e219425683~tplv-goo7wpa0wc-image.image) ## 删除 API Key 当您不再使用 API Key 进行鉴权时,可删除以避免后续被误用。 ## 配额限制 一个主账号下支持创建 50 个 API Key。 如需更多配额,可在控制台左下角选择 **系统设置** > **项目配置** > **配额管理** > **其他** 申请配额。 **注**:此操作需要配额中心的操作权限。 ![申请配额入口](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/c74c4527ac3341adb21541da31134509~tplv-goo7wpa0wc-image.image) ## 下一步 获取 API Key 后,您可以: * [快速入门](/docs/quick-start):完成第一次端到端调用,验证 API Key 可用。 * [文本生成](/docs/text-generation):了解 Chat Completions API 的完整能力。 --- # IAM API Key 最佳实践 Source: https://ark.volcengine.com/region:cn-beijing/docs/iam-api-key-best-practices 火山方舟部分模型服务已可使用 IAM API Key 鉴权。本文说明方舟 API Key 与 IAM API Key 的差异,并演示如何用 IAM API Key 完成鉴权、跨产品调用、用量查询与费用分账。 ## 什么是 IAM API Key **IAM API Key** 是在火山引擎访问控制(Identity and Access Management,简称 IAM)控制台创建、归属于某个 IAM 用户的 API 鉴权凭证。 IAM API Key 具备以下能力: - **统一多云鉴权**:一把 API Key 可通过 IAM 权限策略调用多个已支持 API Key 鉴权的火山云产品,包含火山方舟。 - **集中生命周期管理**:创建、轮换、禁用、删除均在 IAM 控制台统一操作,与 IAM 用户绑定。 - **细粒度权限控制**:通过 IAM 预设或自定义权限策略约束可访问的产品、资源与操作。 - **可审计**:API Key 的使用与权限变更纳入 IAM 审计日志。 IAM API Key 与方舟控制台创建的 API Key 是**并列的两种入口**,均可用于调用火山方舟。IAM 相关的基本概念(IAM 用户、用户组、权限策略等)详情请参见 [使用 IAM 管理权限](/docs/use-iam-to-manage-permissions)。 ## 方舟 API Key 与 IAM API Key 对比 两种 API Key 均可调用火山方舟,且均可通过 IAM 权限策略扩展至其他火山云产品。两者主要差异在于**创建入口**与**生命周期管理**,请按需选择。 | 对比项 | 方舟控制台创建的 API Key | IAM 控制台创建的 API Key | | --- | --- | --- | | 创建入口 | 方舟控制台 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面 | [IAM 控制台](https://console.volcengine.com/iam) | | 管理入口 | 方舟控制台 + IAM 控制台 | 仅 IAM 控制台
    IAM 控制台创建的 API Key 不在方舟 **API Key 管理** 页面展示。
    | | 默认权限 | 自动绑定方舟预设权限策略,具备方舟访问权限 | 需手动为所属 IAM 用户绑定方舟权限策略 | | 扩展其他云产品权限 | 通过 IAM 用户管理为 API Key 添加其他产品权限策略 | 通过 IAM 用户绑定其他产品权限策略 | | 支持的方舟订阅 | 支持全部方舟订阅
    按量付费、Coding Plan 使用普通方舟 API Key,其中 Coding Plan 需切换到专属 Base URL `https://ark.cn-beijing.volces.com/api/coding/v3` 调用(OpenAI 协议兼容);Agent Plan 使用**专属 API Key**,与本表所指的两类 API Key 均不通用,详情请参见 [快速开始](/docs/agent-plan-personal-get-started)。
    | 仅支持按量付费、Managed Agents、Coding Plan 个人版
    不支持 Coding Plan 企业版、Agent Plan 个人版及企业版。
    | | 适用场景 | 以方舟为主,需通过 IAM 扩展调用其他云产品 | 以 IAM 用户为中心,统一管理多云凭证与权限 | > **说明** > > 无论从哪个入口创建 API Key,都可通过 IAM 权限策略扩展其可访问的云产品和资源。凭证归属同一个 IAM 用户即可实现**跨产品调用**,并通过 IAM 统一管理生命周期、访问权限和操作审计。 > **注意** > > - IAM 控制台创建的 API Key 不在方舟 API Key 管理页面展示及管理,如需管理需在 IAM 控制台统一操作。 > - IAM 侧创建的 API Key 支持调用 Managed Agents 与 Coding Plan 个人版,不支持调用方舟的 Agent Plan 计划及 Coding Plan 企业版(Agent Plan 请使用**专属 API Key**)。 > - IAM 侧配置非预设自定义语法策略时,资源 Resource 支持写入自定义模型接入点 endpoint,不支持自定义模型 ModelID。 ## 跨产品调用配置 跨产品调用的实现方式:将 API Key 归属的 IAM 用户绑定目标产品的权限策略。 > **说明** > > 仅支持通过 API Key 鉴权的云产品可复用同一个 API Key。TOS 仅支持 Access Key / Secret Key 或 STS 签名,不支持 API Key 鉴权;需要访问 TOS 时,请使用同一个 IAM 用户下的 AK/SK,详情请参见 [示例:使用 IAM 凭证调用方舟处理 TOS 私有文件](/docs/iam-api-key-best-practices#tos-example)。 以下两种入口任选其一: - **方式一:IAM 控制台创建 API Key**。适合以 IAM 用户为中心统一管理多云凭证的场景。 - **方式二:方舟控制台创建 API Key + IAM 扩展权限**。适合已在方舟控制台创建 API Key,现需扩展调用其他云产品的场景。 ### 方式一:IAM 控制台创建 API Key 按以下步骤为业务应用准备一个具备方舟及其他目标产品权限的 IAM 用户: 1. 登录 [IAM 用户管理](https://console.volcengine.com/iam/identitymanage/user) 页面,为业务应用创建独立 IAM 用户。 2. 为该用户绑定权限策略: - 火山方舟预设权限策略(如需更细粒度控制,可额外绑定方舟自定义权限策略)。 - 其他目标云产品的权限策略(例如豆包语音等已支持 API Key 鉴权的产品)。 3. 在 IAM 控制台为该用户创建 **API Key** 类型的凭证(不是 Access Key / Secret Key),详情请参见 [API 密钥(Access Key 与 API Key)](https://docs.volcengine.com/docs/6257/64983?lang=zh)。 火山方舟预设策略与自定义策略的详细说明,详情请参见 [使用 IAM 管理权限](/docs/use-iam-to-manage-permissions)。 ### 方式二:方舟控制台创建 API Key + IAM 扩展权限 按以下步骤为已有的方舟 API Key 扩展其他产品权限: 1. 在方舟控制台 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apiKey) 页面完成 API Key 的创建。创建成功后,方舟 API Key 自动绑定 IAM 侧方舟预设权限策略。 2. 在 [IAM 用户管理](https://console.volcengine.com/iam/identitymanage/user) 页面,通过 API Key 名称搜索找到对应 IAM 用户。 3. 根据业务需要为该用户配置其他火山云产品权限策略。 ## 查询 IAM API Key 用量 IAM API Key 产生的用量会纳入 [方舟控制台](https://ark.volcengine.com/region:cn-beijing/usageTracking?usageTrackingTab=model) 的全部用量汇总。以下位置均统计 IAM API Key 调用方舟的用量: - **调用数据汇总**:全部用量 / 在线推理 / 批量推理 / 推理代工。 - **调用数据拆分**:模型 / 推理接入点(Endpoint)/ API Key。 用量归集到 Project 的规则: - 调用**预置推理接入点**(直接通过 Model ID 调用方舟基础模型时自动使用的公共接入点,无需用户创建):方舟为本次请求补充默认 Project 为 `default`,用量归入 `default` 项目。 - 调用**自定义推理接入点**(用户在方舟控制台创建的专属接入点,支持项目归属、标签、算力保障等能力):用量归集到接入点所属的 Project。 推理接入点的详细说明详情请参见 [推理方式概述](/docs/deployment-overview)。 在 [调用数据拆分 - API Key 页](https://ark.volcengine.com/region:cn-beijing/usageTracking?usageTrackingTab=model),IAM API Key 支持调用接口 [查询推理用量](/docs/get-inference-usage-api) 完成推理用量查询。调用该接口时,`Project` 参数的填写规则: - 查询预置推理点用量:`Project` 参数填入 `default`。 - 查询对应项目下自定义推理接入点用量:填写该接入点(ep)所属的对应 `Project`。 - 查询所有项目用量:`Project` 参数留空即可。 ## 使用 IAM API Key 分账 IAM API Key 对应费用支持在 [费用中心](https://console.volcengine.com/finance/bill/split-bill) 按不同维度进行分账查看。可选的分账维度: - **按推理接入点(Endpoint)维度分账**:在 **设置分拆维度** 中选择按推理接入点维度拆分,并在分拆项中填入目标推理接入点 ID。选择该维度时,可按 Project 聚合分账。 - **按 API Key ID 维度分账**:在 **设置分拆维度** 中选择按 API Key ID 维度拆分,并在分拆项中填入 API Key ID。IAM 控制台创建的 API Key 本身不携带 Project 属性,因此不支持按 Project 聚合。 ## 示例:使用 IAM 凭证调用方舟处理 TOS 私有文件 本示例演示如何使用同一个 IAM 用户的凭证,在不公开源文件的前提下,将 TOS 私有存储桶中的视频文件传入方舟模型。示例中的两类凭证均归属于同一个 IAM 用户: - **Access Key / Secret Key**:用于访问 TOS,生成内网预签名 URL。TOS 使用 AK/SK 签名鉴权。 - **IAM API Key**:用于调用火山方舟。方舟使用 API Key 鉴权。 > **注意** > > TOS 存储桶、TOS 内网域名与火山方舟服务需保持同一 Region。TOS 与火山方舟使用不同类型的凭证,不能相互替换,但可归属于同一个 IAM 用户。 ### 步骤一:创建 IAM 用户并配置权限 为业务应用创建独立的 IAM 用户,并为该用户配置 TOS 与火山方舟权限(如:预设火山推理权限 `ArkInferenceFullAccess`)。 1. 登录 [IAM 用户管理](https://console.volcengine.com/iam/identitymanage/user) 页面,为业务应用创建独立 IAM 用户。 2. 为该用户绑定 TOS 与火山方舟的权限策略(火山方舟如使用预设火山推理权限 `ArkInferenceFullAccess`)。 ### 步骤二:配置环境变量 配置以下环境变量,分别对应 TOS 与方舟的鉴权凭证: ```Bash # TOS access credentials (Access Key / Secret Key) # Fill in the AK/SK with TOS permission from the IAM console export TOS_ACCESS_KEY="" export TOS_SECRET_KEY="" # Volcengine Ark API Key # Fill in the API Key bound to Ark permission in the IAM console export ARK_API_KEY="" ``` > **说明** > > `ARK_API_KEY` 变量名与方舟 SDK 调用方式保持不变,只需将值填写为 IAM 控制台创建的 API Key。 ### 步骤三:生成 TOS 内网预签名 URL 使用 Access Key / Secret Key 为 TOS 中的对象生成一个仅用于读取的 GET 预签名 URL。示例代码: ```Python import os import tos from tos.enum import HttpMethodType ak = os.getenv("TOS_ACCESS_KEY") sk = os.getenv("TOS_SECRET_KEY") # TOS internal endpoint, only cn-beijing region is supported endpoint = "tos-cn-beijing.ivolces.com" # Currently only cn-beijing region is supported region = "cn-beijing" # Replace with your bucket name bucket_name = "" # Replace with your object key object_key = "" if not ak or not sk: raise ValueError("Missing TOS_ACCESS_KEY or TOS_SECRET_KEY") client = tos.TosClientV2(ak, sk, endpoint, region) try: output = client.pre_signed_url( HttpMethodType.Http_Method_Get, bucket_name, object_key, expires=3600, ) print(output.signed_url) except tos.exceptions.TosClientError as e: print("Client error:", e.message, e.cause) except tos.exceptions.TosServerError as e: print("Server error:", e.code, e.message, e.request_id) except Exception as e: print("Unknown error:", e) ``` 预签名 URL 有效期可通过 `expires` 参数设置,详情请参见 [普通预签名](https://docs.volcengine.com/docs/6349/129226?lang=zh)。示例输出: ``` https://.tos-cn-beijing.ivolces.com/path/to/object?...signature... ``` 该 URL 仅可被华北 2(cn-beijing)Region 内的火山引擎基础设施访问(例如火山方舟),无法通过外网直接访问。 ### 步骤四:使用 IAM API Key 调用方舟 将步骤三生成的预签名 URL 作为 `video_url` 传入模型,方舟 SDK 会从 `ARK_API_KEY` 环境变量读取 IAM API Key: ```Python import os from arkruntime import Ark client = Ark( api_key=os.getenv("ARK_API_KEY"), base_url="https://ark.cn-beijing.volces.com/api/v3", ) # Replace with the pre-signed URL generated in step 3 video_url = "https://.tos-cn-beijing.ivolces.com/path/to/object.mp4?...signature..." resp = client.chat.completions.create( # Replace with your custom endpoint ID model="", messages=[ { "role": "user", "content": [ { "type": "text", "text": "请理解这个视频,输出:1. 视频主要内容 2. 关键人物 / 物体 3. 关键动作 4. 场景变化 5. 一段简短摘要", }, { "type": "video_url", "video_url": {"url": video_url}, }, ], } ], ) print(resp.choices[0].message.content) ``` ## 常见问题 ### IAM API Key 可以直接配置为 ARK_API_KEY 吗 可以。请先确保该 API Key 所属的 IAM 用户已绑定适用的火山方舟权限策略。SDK 仍通过 `ARK_API_KEY` 传入凭证,鉴权参数的写法无需修改。 ### IAM API Key 可以代替 TOS 的 Access Key / Secret Key 吗 不可以。TOS 使用 Access Key / Secret Key 或 STS 对请求签名,火山方舟使用 IAM API Key 鉴权。两类凭证可归属于同一个 IAM 用户,但用途不同。 ### 方舟无法读取输入文件 请优先检查以下内容: - TOS Bucket 与火山方舟服务是否属于同一 Region。 - 预签名 URL 是否已过期。 - 对象是否存在,且对象 Key 与签名时使用的值完全一致。 - URL 是否在传递过程中被截断、重复编码或丢失查询参数。 - 所选模型是否支持当前输入类型。 ### 调用方舟时返回无权限 请检查以下内容: - IAM API Key 是否属于目标 IAM 用户。 - 该用户是否已绑定适用的火山方舟权限策略。 - 策略是否允许访问当前推理接入点及其对应资源。 ## 相关文档 - [管理 API Key](/docs/manage-api-keys) - [使用 IAM 管理权限](/docs/use-iam-to-manage-permissions) - [查询推理用量](/docs/get-inference-usage-api) --- # HYOK 最佳实践 Source: https://ark.volcengine.com/region:cn-beijing/docs/hyok-best-practices HYOK(Hold Your Own Key)为用户提供了云环境中数据安全的最高级别控制权。该模式允许用户完全掌控密钥的所有权与管理权,并能够通过自有的软件或硬件系统对数据进行加密。在火山方舟平台上,用户可通过“托管外部密钥”功能接入外部密钥,并在执行精调任务时将其指定为数据加密密钥。该密钥将用于加密用户的精调数据等敏感信息,并在任务全生命周期内确保数据加密存储。 # HYOK核心原理 * **密钥生成**:在用户自有的可信环境(如HSM或可信的KMS)中生成并保存密钥。 * **完全控制**:用户自主管理密钥的全生命周期(创建、存储、轮换、撤销)。火山方舟仅在接受明确授权后执行临时且受控的加解密操作,无法持久持有密钥或访问明文数据。 * **临时访问**:数据密钥绝不会以明文形式传输或存储于火山方舟,仅在必要计算时短暂访问。用户可通过审计日志等方式对访问行为进行验证。 下图是HYOK的原理流程图(以加密存储为例): ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/cb501c25f6804fc2bc82374633f1d65e~tplv-goo7wpa0wc-image.image) 需说明以下几点: 1. 火山方舟通过 AssumeRole 机制扮演用户身份以访问其 KMS,该操作需用户授权,且每次调用均会在火山方舟的安全审计页面及火山引擎云审计中记录日志。 2. KMS 在访问外部密钥存储代理(XKS Proxy)时,将使用用户创建外部密钥存储时指定的 CA 证书验证代理身份,以防止中间人攻击。 3. XKS Proxy 会通过用户在创建外部密钥存储时提供的访问密钥(ak/sk,仅用于签名验证)验证请求来源的合法性。 4. 所有数据均经过双重加密,以增强数据机密性。 # HYOK与传统云加密的区别 |**传统方式** |**HYOK 模式** | |---|---| |由CloudKMS管理密钥,平台具备访问用户明文数据的潜在条件。 |用户作为密钥的唯一持有者,从根本上掌控数据访问权限。即使云服务提供商也无法在未经授权的情况下访问明文数据。 | # HYOK典型应用场景 * **隐私保护**:精调数据中包含高度敏感信息,如个人身份信息(PII)、财务数据或商业机密。 * **合规要求**:需符合数据主权法规,要求数据或密钥不得超出特定地域或组织边界。 * **自主可控**:用户已具备外部KMS或CloudHSM等密钥管理基础设施,希望延续现有控制策略。 # XKS Proxy功能 火山方舟目前提供基础版本的XKS Proxy供用户参考和使用。后续将开放相关接入协议,用户可基于协议自行实现代理服务,并接入其他KMS或CloudHSM系统。 基础版XKS Proxy功能: |密钥来源 |aliyun/aws | |---|---| |加密算法 |AES_256 | # HYOK使用流程 ![](https://arkdocs.tos-cn-beijing.volces.com/flowcharts/resources/hyok-best-practices-01.svg) > **说明** > > 本节将介绍如何通过VPC终端节点服务托管外部密钥至外部密钥存储。其中,第1至4步为创建外部密钥存储所需的前置资源准备(本文以火山引擎资源为例)。**如果您已具备相应资源,可跳过相关步骤**。第5至9步为在火山方舟平台上创建外部密钥存储并托管外部密钥的具体操作指引。 ## 1.创建VPC VPC 终端节点服务需与外部密钥管理器所在 VPC 连接。您可使用符合外部密钥存储要求的现有 VPC;如无可用 VPC,请参照下图于 [火山引擎-私有网络](https://console.volcengine.com/vpc/region:vpc+cn-beijing/vpc?) 中创建。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/1392eb6504b54191ad9995112a36916e~tplv-goo7wpa0wc-image.image)
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/d1647ec2cdd14e35a39009dd94867997~tplv-goo7wpa0wc-image.image)
    ## 2.创建ECS 在创建所需的VPC终端节点服务前,您需要有一台可部署XKS Proxy的ECS实例。下图为在 [火山引擎-云服务器](https://console.volcengine.com/ecs/region:ecs+cn-beijing/instance?) 创建ECS实例的示例
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/97af06c677e24bf793c18cbe6431d712~tplv-goo7wpa0wc-image.image)
    * 基础配置:**地域及可用区**需要与**步骤1**中所创建的 VPC 保持一致
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/3f89b901e9b64cd8a3ae50b38d5afb2f~tplv-goo7wpa0wc-image.image)
    * 网络配置:选择**步骤1**中创建的 VPC 和子网,并绑定公网 IP(新建或使用已有)
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/4122c2edec7d4475bef83f8531f4375f~tplv-goo7wpa0wc-image.image)
    * 自定义配置:配置 SSH 密钥或密码作为登录凭证
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/c2c1f663639f452db5f3d6f01fabb4b6~tplv-goo7wpa0wc-image.image)
    * 确认订单:阅读并同意《云服务器服务条款》后完成创建。 ## **3.创建CLB并关联至指定VPC** CLB 用于将火山引擎 KMS 的访问流量路由至XKS Proxy。 您可根据下图指引在 [火山引擎-传统型负载均衡](https://console.volcengine.com/clb/region:clb+cn-beijing/LoadBalancer?) 中创建CLB并配置监听端口: * 点击**实例管理-创建负载均衡**进行配置,选择**步骤1**中创建的VPC和子网 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/16cd873a1a464b108807744207a4cb02~tplv-goo7wpa0wc-image.image)
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/86f46d5fb5f3423ab1805572cfc48e53~tplv-goo7wpa0wc-image.image)
    * 添加监听器:在**实例管理界面**,选择上一步创建的负载均衡,配置监听器
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/45710b6c13704c6ab275340e3026377c~tplv-goo7wpa0wc-image.image)
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/ea16912ac094445ca12804db02167032~tplv-goo7wpa0wc-image.image)
    * **后端服务器组**:挂载**步骤2**中创建的 ECS 实例
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/14607d10124347bf917874cc24e1f075~tplv-goo7wpa0wc-image.image)
    * **添加后端服务器**:选择具备公网访问能力的 ECS,确保负载均衡端口与服务器端口一致
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/322d7ec003414cc0a3825a350b4ddb65~tplv-goo7wpa0wc-image.image)
    * **健康检查**:启用健康检查功能
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/07206a09e6fd4614ad7a67e2d85af1e6~tplv-goo7wpa0wc-image.image)
    > **说明** > > 具体配置请根据实际需要确定。若仅用于方舟托管外部密钥,建议选用基础规格即可。 ## **4.创建VPC终端节点服务** * 完成前述资源准备后,即可创建 [VPC终端节点服务](https://console.volcengine.com/pl/region:pl+cn-beijing/endpointServices?)。 * **服务资源**需选择**步骤3**中创建的负载均衡。 * **在高级配置中,** 请勾选“自动接受连接”。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/1e1e1a9a79af41cc8cc53aad8720fac8~tplv-goo7wpa0wc-image.image)
    * 创建完成后,请在**终端节点服务列表页**中记录**服务域名**,该信息将在后续创建托管外部密钥时使用。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/6a9dae3b2e144791965c9a89ce89d957~tplv-goo7wpa0wc-image.image)
    ## **5.配置终端节点服务白名单** * 点击已创建的终端节点服务,选择**服务白名单**,点击**添加服务白名单**,输入KMS服务账号 `2100052433`。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/4bc3306a8c374ae084f23ac9a5134662~tplv-goo7wpa0wc-image.image)
    ## 6.XKS Proxy 部署 请返回至**步骤2**中已创建的 ECS 实例,部署 XKS Proxy 并手动配置鉴权信息,包括:外部 KMS 的 ak/sk、用于验证火山引擎 KMS 身份的 ak/sk、保障连接安全的 CA 证书等元数据。 您可通过 SSH 或控制台连接到ECS 实例,并按下图指引完成 XKS Proxy 部署(本文以控制台连接为例): ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/d2aeab982d4149c1837968f1c14d1318~tplv-goo7wpa0wc-image.image) * **连接 ECS 实例**:若需其他连接方式,请参见 [相关操作指南](https://docs.volcengine.com/docs/6396/81032?lang=zh)。 * **获取 XKS Proxy**: * 下载 XKS Proxy 压缩包。 ```Plain Text # 下载压缩包 wget https://ark-public-cn-beijing.tos-cn-beijing.volces.com/xksproxy/xksproxy.tar.gz # 解压xksproxy压缩包 tar -zxvf xksproxy.tar.gz # 进入解压的文件夹 cd xksproxy ``` * 其主要目录结构如下: ```Plain Text xksproxy/ ├── conf │ └── config.yaml # 配置文件 ├── scripts │ ├── README.md # CA/服务端证书生成指南 │ ├── ca.cnf │ ├── cert_gen.sh │ ├── generate_ca.sh │ ├── generate_server_cert.sh │ └── server.cnf └── xksproxy # 主程序 ``` * **证书配置**: * 若您已持有 CA 或服务端证书,请将其保存至指定目录并在 `config.yaml` 中配置路径。 * 若无相应证书或仅需功能体验,可参照 `scripts/``README.md` 文档创建。 ```Plain Text # 1.记录上述Step4「创建VPC终端节点服务」步骤中的服务域名 # 假设域名为epsvc-xxx.cn-beijing.privatelink.volces.com # 2.打开scripts目录 cd xksproxy/scripts # 3.生成根证书和服务端证书 ./cert_gen.sh all --dns "*.epsvc-xxx.cn-beijing.privatelink.volces.com" --output /path/to/cert/dir ``` * 生成后的证书目录结构如下: ```Plain Text certs ├── ca.key # 私有CA私钥 ├── ca.pem # 私有CA证书 ├── ca.srl # 私有CA序列号 ├── cert.csr # 服务端证书签名请求 ├── cert.pem # 服务端证书 ├── key.pem # 服务端私钥 └── openssl.cnf # 服务端证书配置 ``` * **编辑配置文件**:进入 `conf` 目录,编辑 `config.yaml` 文件。 ```Plain Text # cd conf server: host: "0.0.0.0" port: 443 read_timeout: 30 write_timeout: 30 path_prefix: "" # 路径前缀(选填) tls: enabled: true # 是否开启tls(目前必须开启) cert_path: "" # 服务端证书路径(必填) key_path: "" # 服务端密钥路径(必填) ca_path: "" # CA证书路径(必填) ca_base64: "" # CA证书der格式base64编码 (启动服务时自动填充) # SignV4 authentication configuration auth: access_key_id: "" # 认证ak(留空则启动自动填充) secret_access_key: "" # 认证sk(留空则启动自动填充) kms: - id: "local-kms" # 外部kms唯一标识 provider: "local" # 根据kms服务商填写,目前支持aliyun、aws和local(本地调试模式) region: "" # kms region endpoint: "" # kms服务endpoint access_key: "" # kms服务鉴权ak secret_key: "" # kms服务鉴权sk key_mapping: # 密钥映射 "external-key-1": "real-key-id-1" # key为xksproxy中该密钥别称,value为kms服务真实密钥id log: level: "info" file_path: "" max_size: 100 max_age: 7 max_backups: 5 # XKS proxy configuration xks_proxy: # xksproxy版本信息,保持不变即可 fleet_size: 1 vendor: "Volc XKS Proxy" model: "Volc XKS Proxy v1.0" ``` |**字段** |**描述** |**示例** |是否必填 | |---|---|---|---| |server.path_prefix |路径前缀 |myxks |否 | |server.tls.cert_path |服务端证书路径 |/root/cert.pem |是 | |server.tls.key_path |服务端密钥路径 |/root/key.pem |是 | |server.tls.ca_path |CA证书路径 |/root/ca.pem |是 | |server.tls.ca_base64 |CA证书der格式base64编码 |/ |否(启动时自动填充) | |auth.access_key_id |用于验证kms侧身份的ak,kms会使用该ak/sk做请求签名 | XT7II5R7F4OORP5Z4PRB |否(留空则自动填充) | |auth.secret_access_key |用于验证kms侧身份的ak,kms会使用该ak/sk做请求签名 |hHnacnaJEUa0AlYd6WZXUlPg9QG0Gzasrfjd4VkWIpp |否(留空则自动填充) | |kms.id |用于唯一标识外部kms |mykms |是 | |kms.provider |kms的提供方,目前支持: |local |是 | \ | | | | | \ | |* aliyun:阿里云kms | | | \ | |* aws:aws kms | | | \ | |* local:本地调试模式,加解密发生在本地(不可用于生产环境) | | | |log.level |日志级别 |error |否 | \ | | | | | \ | |* debug | | | \ | |* info | | | \ | |* warn | | | \ | |* error | | | |log.file_path |日志存储位置 |/mypath/xksproxy.log |否 | |log.max_size |日志最大容量(MB) |100 |否(默认100MB) | |log.max_age |日志最大存储时间(天) |7 |否(默认7天) | |log.max_backups |日志最大存储数量 |100 |否(默认5个) | |xks_proxy.* |xksproxy的版本元信息 |/ |否 | * **启动代理**:执行启动命令,运行 XKS Proxy。**仅当成功启动后,方可连接至外部密钥存储**。 ```Plain Text ./xksproxy server ``` ## 7.开通并授权火山引擎 KMS 服务 您需手动开通 KMS 服务并授予火山方舟相应访问权限,以便其代理您完成外部密钥的托管。 * 进入 [火山引擎 KMS 控制台](https://console.volcengine.com/kms/region:kms+cn-beijing/primary?),开通服务。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/78d4c617d7c041a79185ca864c37982f~tplv-goo7wpa0wc-image.image)
    * 前往 [访问控制授权页面](https://console.volcengine.com/iam/service/attach_role/?ServiceName=kms)。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/f7218891bf4e46578c42b48b2b1a55cb~tplv-goo7wpa0wc-image.image)
    * 查看权限内容并完成授权。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/51152e10b17a4d17ae2b9c2773dc0b68~tplv-goo7wpa0wc-image.image)
    ## 8.创建外部密钥存储 在火山方舟控制台中,选择对应的 VPC 终端节点服务,并配置代理连接信息。所需配置内容请参照**步骤6**中 `config.yaml` 文件的相应条目。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/71ce6d31cf6742bfa20ebac8a59be16d~tplv-goo7wpa0wc-image.image)
    ## 9.托管外部密钥 托管外部密钥将由方舟代理您在火山引擎 KMS 中创建一款用户主密钥。请选择**步骤8**中创建的外部密钥存储,并可按需自定义密钥环与密钥信息。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/add5ecef640c4672921249f53e828db0~tplv-goo7wpa0wc-image.image)
    # 常见问题 **Q:可以使用其他厂商的KMS服务接入方舟的托管外部密钥功能吗?** **A**:可以,您使用的其他厂商KMS服务的ak/sk需具备以下权限:`kms:Encrypt`、`kms:Decrypt` 和 `kms:DescribeKey`。 **Q:如果我已经拥有相关的云服务资源,是否还需要重新创建?** **A**:如果您已拥有相应的云服务资源(如ECS、CLB),并确保其与目标资源处于同一可用区且能正常访问外部密钥存储,则可以跳过相关创建步骤。 **Q:XKS Proxy 无法连接到外部密钥存储应如何排查?** **A**:请按以下步骤依次检查: 1. 确认终端节点服务是否已开启“自动接受连接”选项; 2. 检查是否已完成对火山引擎KMS服务的授权; 3. 验证XKS Proxy是否已正确部署并运行。 **Q:如果密钥已被删除,为何精调任务仍在进行?** **A**:精调任务仅在加密数据的输出和访问时需要访问密钥。若该阶段已完成,精调任务进程将不受密钥删除影响;若任务仍在进行且需访问加密数据,则会因密钥不可用而提示错误信息。 **Q:使用托管外部密钥是否会带来时延性能的损失?** **A**:该功能的时延取决于火山引擎KMS、XKS Proxy及外部密钥存储接口的延时和网络情况。与直接使用火山引擎KMS相比,会有百毫秒级别的延迟差距,但不会对精调任务的整体性能产生影响。 --- # 平台能力速览 Source: https://ark.volcengine.com/region:cn-beijing/docs/platform-capabilities-overview # 前提条件 1. 注册账号:在使用火山引擎的服务之前需要用户注册火山引擎账号并完成相关认证,详见 [账号注册流程](https://docs.volcengine.com/docs/6261/64925?lang=zh)。 2. 实名认证:在火山引擎上购买和使用云资源的过程中,为遵守相关法律法规,也为保障您的合法权益,需要先进行实名认证,您可以按需进行个人实名认证或者企业实名认证,详见 [实名认证基本介绍](https://docs.volcengine.com/docs/6261/64935?lang=zh)。 3. 创建子账号(可选):如果您的账号为多人使用,为更好地进行权限管理,建议使用主账号前往 [【访问控制】-【用户】](https://console.volcengine.com/iam/identitymanage/user) 创建子账号并通过预置策略为其分配适当的权限。 # 模型与推理体验 ## 模型广场 完成账号与权限设置后,进入火山方舟控制台([访问地址](https://ark.volcengine.com/region:cn-beijing)),在**模型广场**查看目前已发布的大模型,点击某个模型卡片可查看该模型的详细信息。更多详情可见 [模型广场介绍](/docs/foundation-models)。 ## 模型仓库 **模型仓库**展示所有精调产出的模型,您可以在此处管理自己的模型,查看模型的基本信息、接入点信息,发起评测、进行推理体验等,更多详情可见 [管理自定义模型](/docs/manage-custom-models)。 ## 推理体验 如果您对模型广场中某个已发布的模型感兴趣或想快速验证精调模型的效果,可以进入**体验中心**进行推理试用。更多详情可见 [模型体验介绍](/docs/language-models)。 ## API 调用模型 模型广场中的模型支持 API 调用,您可以进入模型详情页点击右上角的 **API 接入**查看相关的调用教程。 # 模型精调与评测 火山方舟允许用户上传自己的数据进行模型精调,只需简单的几个步骤即可产出更加贴合客户业务场景的模型。 ## 准备数据 在创建精调任务之前需要完成数据的准备,目前支持 JSONL 格式的数据集,详细说明请参考[格式总览](/docs/fine-tuning-dataset-format)。目前支持两种数据上传的方式: 1. 从本地上传数据:适用于小规模的数据集。 2. 从 TOS 中导入数据:需先将数据上传至 TOS,具体操作可见 [TOS控制台快速入门](https://docs.volcengine.com/docs/6349/74830?lang=zh),然后在创建精调任务时选择对应的 TOS 目录。当数据集规模较大时建议使用这种方式,避免在上传过程中因网络问题导致传输中断。 ## 创建模型精调任务 1. 数据准备好后,[创建模型精调任务](https://ark.volcengine.com/region:cn-beijing/finetune)。 2. 进入**创建精调任务**页面,按实际情况进行任务名称、描述、基础模型、数据集等信息的选择或填写。 3. 数据填写完毕后,点击**提交精调任务**,即可完成任务创建。更多操作,可见 [创建模型精调任务](/docs/fine-tuning-overview)。 ## 查看并管理模型精调任务 1. 进入**模型精调**列表页,可查看已提交的所有模型精调任务。 2. 点击某个任务名称,即可进入对应的详情页,可查看基本信息、效果指标、日志、时间线、模型产出信息。 ## 创建模型评测任务 1. 模型训练完成后,可以 [创建模型评测任务](https://ark.volcengine.com/region:cn-beijing/eval/create),按实际情况进行任务名称、描述、评测模型、数据集等信息的选择或填写。 3. 数据填写完毕后,点击**提交评测任务**,即可完成任务创建。 更多操作,可见[创建模型评测任务](/docs/create-model-evaluation-tasks)。 ## 查看并管理模型评测任务 1. 进入**模型评测**列表页,可查看已提交的所有模型评测任务。 2. 点击某个任务名称,即可进入对应的详情页,可查看基本信息、评测报告、日志。 更多操作,可见[创建模型评测任务](/docs/create-model-evaluation-tasks)。 ## 将精调后的模型发布成模型服务 在精调任务完成训练后,可以通过**接入模型**部署对应的精调模型版本。 更多操作,可见[使用精调后的模型进行在线推理](/docs/run-online-inference-with-fine-tuned-models) 。 ## IAM 权限管理实践 当您账号涉及到多人使用,或者为组织所有,您可以使用 IAM 来实现不同账号的权限管理。 访问控制 IAM (Identity and Access Management) 是一套权限管理系统,是火山引擎提供的**免费服务**之一。您可以为火山引擎账号(主账号)创建IAM用户(子账号),并根据不同用途授予子账号相应的访问权限,以达到不同企业员工之间的权限隔离。 > 例如,您组织中有负责运营的人员,您不希望他们发生如删除模型等高危操作,您可以配置子账户的权限为ArkReadOnlyAccess策略,允许其仅可查看方舟内的全部资源,但不允许对资源进行操作,从而提升资源的安全性。 更多关于权限管理的详细实践,如项目维度权限管理、用户组权限管理,请参见[使用 IAM 管理权限](/docs/use-iam-to-manage-permissions)。 --- # 模型广场 Source: https://ark.volcengine.com/region:cn-beijing/docs/foundation-models [模型广场](https://ark.volcengine.com/region:cn-beijing/model) 汇集了时下主流的大模型,用户可以自由地查看及体验模型在语言、视觉等方面的推理能力。 模型广场包含语言大模型、视觉大模型、语音大模型、向量化模型,后续还会支持更多大模型,敬请期待。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/fec4258e7b964535b55a134773ca79a4~tplv-goo7wpa0wc-image.image) 模型广场提供了 **默认视图** 和 **卡片视图** 两种浏览方式,可以在界面右上角切换。 * 默认视图:快速查看当前主推模型;按模型类别、是否开源等维度查看模型。 * 卡片视图:可使用筛选框,按模型提供方、推理方式、支持的功能、上下文长度等更多维度检索模型。 # 模型卡片 模型广场中的每个模型都有专属模型卡片,模型卡片展示名称、简介、提供方、是否可体验以及应用场景等信息。点击模型卡片可进入详情页查看更详细的说明。 您还可以点击 API接入 快速测试 API 调用方法,或跳转至体验中心直接体验模型能力。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/6797ac808657491497d2ef9af4ecd20e~tplv-goo7wpa0wc-image.image) # 模型对比 模型对比页面支持以模型效果,模型能力,模型价格,tokens 限制和任务类型等维度对比模型。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/15f42649f6eb46429f50df4d3ff8f055~tplv-goo7wpa0wc-image.image) # --- # 应用广场 Source: https://ark.volcengine.com/region:cn-beijing/docs/app-marketplace 应用广场从大模型可以落地的业务提效、企业经营效率提效两大场景切入,沉淀了深度推理、安卓终端、智能导购等多个垂直领域的 AI 原型应用。助力中小企业“一键复制”,完成基础应用搭建,后续还会持续引入更多不同类型、功能更丰富的应用,快速步入应用落地的实干阶段。 # 简介 火山方舟推出的 [**应用广场**](https://ark.volcengine.com/region:cn-beijing/application?projectName=undefined) 以卡片式布局为主,页面上方有简明的**介绍**和[功能入口](/docs/app-marketplace#b34252e7)。广场中的**应用**都有独立的卡片展示区域,卡片上展示应用名称、简介、特性标签等关键信息。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/f43e3bb432884aeebdbb4028bf298474~tplv-goo7wpa0wc-image.image) # 应用卡片 ## 场景介绍 在应用广场,点击**应用名称**进入场景介绍。 在场景介绍可以查看应用简介、架构图、代码说明、关联模型及云产品以及联系我们的方式。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/8fd880d412164285a5ea1aa66dc3d8db~tplv-goo7wpa0wc-image.image) ## 体验应用 大部分应用提供免费体验机会,无需复杂的付费流程,就能直接感受应用在实际场景中的表现。以“深度推理 DeepSearch” 为例,用户能够个性化配置最大问题拆解层数以及每次搜索最大关键词数。配置后输入复杂问题,观察其多轮思考与深度搜索的能力,深入了解应用能否为学术研究、企业决策等提供有效支持。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/92a78a46684c43aea1ef57dfe78aab49~tplv-goo7wpa0wc-image.image) 用户询问“介绍北京”后的回答示例。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/ae2ff0aec02440318cd55736b3ecc556~tplv-goo7wpa0wc-image.image) ## Github 代码查看 火山引擎多个应用支持 GitHub 开源,提供丰富代码资源,助力开发者自由使用、修改并将其应用于各类场景,用户点击即可跳转Github源址。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/8f9c1a4bf54b4bfcac9f40bba935f9e7~tplv-goo7wpa0wc-image.image) ## 复制应用 火山引擎多个应用支持便捷的复制功能,用户仅需简单操作,即可一键将应用复制为自身专属版本,灵活根据实际业务需求进行后续个性化定制与应用 。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/4a9d7c630c9b4d1fa9ed4e5d84554440~tplv-goo7wpa0wc-image.image) # 功能入口 ## 创建应用 创建应用包含 **零代码**、**低代码**、**高代码**。 使用说明点击相对应的文档查看: * [零代码应用简介](/docs/no-code-app-overview) * [低代码应用简介](/docs/low-code-app-overview) * [高代码应用简介](/docs/high-code-app-overview) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/7ad5c5a8e17c4e4b94f7c441586da01c~tplv-goo7wpa0wc-image.image) ## 开发者工具SDK 开发者工具 SDK 具备强大功能,能够有力助推企业迅速搭建大模型应用。它具备开源特性,易于集成,企业可便捷访问 Github 获取应用源代码,沉浸式体验开发 SDK。 ## 生态伙伴招募 为有意向与火山方舟合作的企业提供入口,促进各方在大模型应用生态建设上的合作,实现资源整合与优势互补。表单提交后,会有工作人员与您电话联系。 ## --- # 快速体验模型能力 Source: https://ark.volcengine.com/region:cn-beijing/docs/experience-center-overview 您可在 [体验中心](https://ark.volcengine.com/region:cn-beijing/experience/) 快速试用不同模型的能力,评估模型性能,找到最适合业务场景的模型。体验中心提供友好的交互界面,支持选择模型、版本和调用方式,并可快速配置模型参数。 体验中心目前支持以下体验: * 语言模型:执行文本理解和视觉理解任务。 * 视觉模型:执行图片、视频和 3D 生成任务。 * 语音模型:执行语音识别、语音合成和实时语音交互等任务。 * Managed Agents:提供官方预置 Agent,可直接试用视频知识、售后客服等场景。 > **注意:Note** > > 您需要拥有一定的免费试用额度。 > * 额度用尽前,可以直接在体验中心试用模型。 > * 免费额度用尽后,需先开通模型,才能在体验中心试用,试用会产生费用。 ## 使用示例 下文以语言模型为例,介绍如何进入体验中心、配置模型参数、与模型对话和快速接入 API。 ### 进入体验中心 可从以下位置进入体验中心: * 在控制台左侧导航栏中,点击 [**体验**](https://ark.volcengine.com/region:cn-beijing/experience/chat)。 * 在 **模型广场** 中打开模型详情页,点击 **立即体验** 进入体验中心。 ### 选择模型并配置参数 1. 在体验中心界面左上方展开模型列表,在 **语言** 标签页中选择模型,然后在模型详情页中选择模型版本。您也可以使用已创建的推理接入点或新建推理接入点。 2. 点击模型列表右侧的 **模型参数** 配置模型参数。选择 API 模式,可选择使用 Responses API 或 Chat API。 可结合下表的效果说明调整参数。 |**参数名** |**效果说明** | |---|---| |Temperature |* Temperature 越低,生成内容通常越严谨和保守,适合有标准答案的任务,如事实问答、代码生成、逻辑推理等。 | \ | |* Temperature 越高,输出内容更随机,更具创意性,适合创造性任务,如写诗歌、写故事等。取值范围:0 - 2.0 | |TopP |TopP 可实现的效果与 Temperature 相似: | \ | | | \ | |* TopP 越低,生成的内容更严谨、一致,但也更循规蹈矩,适用于对准确性要求较高的场景,比如知识问答或代码补全。 | \ | |* TopP 越高,生成内容更丰富,适合开放式对话、故事创作等场景。取值范围:0 - 1.0 | |max_tokens |输出文本的最大 token 限制。如需限制模型输出的长度,可通过此参数进行设置。 | \ | |1 个中文字符或英文单词通常计为 1 token,可以使用 [Token 计算器](https://ark.volcengine.com/region:cn-beijing/tokenCalculator?projectName=default) 计算 token 消耗量。 | \ | |**注**:模型可输入和输出的 token 总和还受到模型上下文长度上限的限制。 | |System Prompt |用于设定模型的行为偏好,告知其需要扮演的角色,或提供背景信息。System Prompt 优先级高于对话中输入的指令。 | \ | |例如,如果希望模型精简输出,System Prompt 中可填写:“所有回复控制在 3 句话内,只给核心结论,不展开解释。” | \ | |**注**:点击右侧的 **铅笔** 图标可进入 Prompt 优化界面,对系统指令进行优化。 | ### 与模型对话 在对话框中输入指令或问题,点击右下角的 **发送** 图标,即可开始与模型对话。 根据所选模型,您可以使用以下功能: * 上传附件:上传图片、视频或其他文件。 * 联网:允许模型调用互联网检索工具;如关闭则仅使用模型自身知识生成内容。 * 思考深度:控制推理步数与生成时长。深度越高,生成质量通常越好,但用时更长。 * Canvas:将模型返回的内容输出为可编辑的文档或代码文件,并在画布上展示代码执行的效果,便于修改和导出生成的内容。关于 Canvas 的具体信息请参考 [Canvas 简介](/docs/canvas)。 完成对话后,您可以: * 在对话框中继续发送内容,每次发送的内容会自动带入此前的信息。 * 重新生成、复制已生成内容或对内容进行评价。 * 创建新对话或清空本次对话中的上下文。 您还可以在左侧的 **最近对话** 列表中切换至历史对话,重命名对话,或将其删除。 ### 快速接入 API 点击右上方的 **API** 可复制 API key 和示例代码,快速测试 API 请求并创建应用。 --- # 语言模型 Source: https://ark.volcengine.com/region:cn-beijing/docs/language-models # 进入体验中心 可从以下位置进入体验中心: * 在控制台左侧导航栏中,点击 [**体验中心**](https://ark.volcengine.com/region:cn-beijing/experience/chat)。 * 在 **模型广场** 中打开模型详情页,点击 **立即体验** 进入体验中心。 # 选择模型并配置参数 1. 在体验中心界面左上方展开模型列表,选择需要试用的模型、模型版本/推理接入点。可以通过以下方式调用模型: * 在 **语言** 标签页中选择一个模型,在模型详情页上选择模型版本,也可使用已创建的推理接入点或新建接入点。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/d6b58103428546f282b2c3aa5e928fe2~tplv-goo7wpa0wc-image.image) * 在 **我的** 标签页中选择已完成精调并导出至模型仓库的精调模型。 * 在 **智能路由** 标签页选择已有智能路由接入点或新建智能路由。智能路由可根据每次请求的 Prompt 动态匹配最适合的模型完成任务。有关智能路由的更多信息,请参考[智能模型路由](/docs/intelligent-model-routing)。 2. 点击模型列表右侧的 **模型参数** 配置模型参数,将鼠标悬停在参数右侧的 **?** 图标查看参数说明。可结合下表的效果说明调整参数。 |**参数名** |**效果说明** | |---|---| |Temperature |* Temperature 越低,生成内容通常越严谨和保守,适合有标准答案的任务,如事实问答、代码生成、逻辑推理等。 | \ | |* Temperature 越高,输出内容更随机,更具创意性,适合创造性任务,如写诗歌、写故事等。取值范围:0 - 2.0 | |TopP |TopP 可实现的效果与 Temperature 相似: | \ | | | \ | |* TopP 越低,生成的内容更严谨、一致,但也更循规蹈矩,适用于对准确性要求较高的场景,比如知识问答或代码补全。 | \ | |* TopP 越高,生成内容更丰富,适合开放式对话、故事创作等场景。取值范围:0 - 1.0 | |max_tokens |输出文本的最大 token 限制。如需限制模型输出的长度,可通过此参数进行设置。 | \ | |1 个中文字符或英文单词通常计为 1 token,可以使用 [Token 计算器](/docs/token-calculator)计算 token 消耗量。 | \ | |**注**:模型可输入和输出的 token 总和还受到模型上下文长度上限的限制。 | |System Prompt |用于设定模型的行为偏好,告知其需要扮演的角色,或提供背景信息。System Prompt 优先级高于对话中输入的指令。 | \ | |例如,如果希望模型精简输出,System Prompt 中可填写:“所有回复控制在 3 句话内,只给核心结论,不展开解释。” | \ | |**注**:点击右侧的 **铅笔** 图标可进入 Prompt 优化界面,对系统指令进行优化。 | # 与模型对话 在对话框中输入指令或问题,点击右下角的 **发送** 图标,即可开始与模型对话。 根据所选模型,您可以使用以下功能: * 上传附件:上传图片、视频或其他文件。 * 联网:允许模型调用互联网检索工具;如关闭则仅使用模型自身知识生成内容。 * 思考深度:控制推理步数与生成时长。深度越高,生成质量通常越好,但用时更长。 * MCP:选择要调用的外部工具,如文件检索、数据库、企业内部服务等,执行记录将展示在对话细节中。关于 MCP 的具体信息请参考 [MCP 简介](/docs/experience-center-mcp)。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/57388c4c47a54adb8c6c33a63385f39a~tplv-goo7wpa0wc-image.image) * Canvas:将模型返回的内容输出为可编辑的文档或代码文件,并在画布上展示代码执行的效果,便于修改和导出生成的内容。关于 Canvas 的具体信息请参考 [Canvas 简介](/docs/canvas)。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/13f4a4cdac95499fb1e40cd95be1bb1d~tplv-goo7wpa0wc-image.image) * 知识库:关联知识库中的文档,让模型在对话过程中基于文档内容进行推理和生成。可以免费体验方舟示例知识库中的内容,如需创建和管理知识库,请参考 [文档知识问答核心流程](https://docs.volcengine.com/docs/vector_database_vikingdb/Coreprocessofknowledge-basedQA?lang=zh)。 完成对话后,您可以: * 在对话框中继续发送内容,每次发送的内容会自动带入此前的信息。 * 重新生成、复制已生成内容或对内容进行评价。 * 创建新对话或清空本次对话中的上下文。 您还可以在左侧的 **最近对话** 列表中切换至历史对话,重命名对话,或将其删除。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/5ca03e49f14f49e99542c58654557c40~tplv-goo7wpa0wc-image.image)
    # 对比模型效果 点击模型列表右侧的 **模型对比** 对比不同模型生成内容的效果,可同时对比三个模型的效果。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/789e4d9be2034de7b10e0258cbb577d9~tplv-goo7wpa0wc-image.image)
    # 快速接入 API 点击右上方的 **API 接入** 可复制 API key 和示例代码,快速测试 API 请求并创建应用。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/b91564d9ddc34cca9cac33b2e5ca74ed~tplv-goo7wpa0wc-image.image)
    --- # 虚拟人像库 Source: https://ark.volcengine.com/region:cn-beijing/docs/avatar-library 体验中心提供可用于 Doubao Seedance 2.0 和 Doubao Seedance 2.5 视频生成的可信虚拟人像库,您可在体验中心浏览和检索虚拟人像,在视频生成中使用所选人像素材,并结合模板和自有素材快速验证视频效果。 同时,体验中心还提供类型丰富的视频生成模板。您可查看模板使用的素材,并一键获取模板同款示例代码。 > Tip:您可在 [创建视频生成任务 API](/docs/create-video-generation-task-api) 中使用虚拟人像素材生成视频,具体方式请参考[使用预置虚拟人像](/docs/seedance-portrait-asset-guide#preset-avatar)。 > **注意** > > * 火山方舟努力为用户呈现更多元化的内容。如您对本功能有任何意见或建议,欢迎提交 [工单](https://console.volcengine.com/auth/login?redirectURI=%2Fworkorder%2Fcreate%3Fstep%3D2%26SubProductID%3DP00001166) 或联系 Support 反馈。我们将仔细阅读和评估您的反馈,并尽快处理。 > * 为确保合规使用本功能,请在使用前阅读[火山方舟体验中心服务规则和免责声明](/docs/volcengine-ark-experience-center-terms-and-disclaimer)。 ## 关于虚拟人像库 虚拟人像库提供了丰富的虚拟人像素材资源。每个虚拟形象包含一张或多张图片素材。您可以将选定的虚拟人像素材发送给模型,并结合指令生成包含该形象的视频。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/06d28d889dd0494c9a1788deeb84fe1d~tplv-goo7wpa0wc-image.image) 每个虚拟人像素材对应一个资产 ID。在使用视频生成 API 时,可使用包含该 ID 的 URI 将对应素材传入模型。 平台还提供了丰富的非人像类素材,可在 **素材库** 查看其资产 ID 和 URI。 您可在体验中心检索虚拟人像,查看各人像素材的资产 ID,并将所选素材快速应用于视频生成任务。 > **说明** > > * 首次使用虚拟人像库时,需先同意相关协议,才可正常浏览和使用人像素材。 ## 浏览和检索虚拟人像 1. 在浏览器中打开火山方舟 [体验中心](https://ark.volcengine.com/region:cn-beijing/experience/gen_video?model=doubao-seedance-2-0-260128),点击输入框下方的 **虚拟人像库** 页签。 2. 检索要使用的人像,支持自然语言检索和条件筛选。 1. 自然语言检索示例:“积极阳光的青春男大,身高 180 cm 左右” 2. 使用右侧筛选框,以人物性别、年龄、国籍维度进行筛选。 3. 点击一个虚拟人像,查看详情。可在右侧切换人像素材。 4. 选择所需人像素材后,点击 **使用** 图标,将该素材添加至输入框。在输入框中使用“@+素材名”格式引用素材,例如: > ***@图片 1*** *中女主转身坐下,转镜头,女主下了一步棋子,并说“你输了”,参考* ***@图片 2*** *的分镜画面...* > **说明** > > 默认单次生成 4 段视频,为节约成本,建议设置为每次生成一段视频。 5. 点击输入框右下角的发送图标,开始视频生成。 ## 快速获取模板库示例代码 Seedance 2.0 和 Seedance 2.5 体验中心提供视频生成模板库,每个模板包含完整指令和素材。您可使用模板一键生成,或基于模板,结合虚拟人像、自定义内容生成视频。 同时模板库支持查看模板的 REST API 调用示例。可直接复制示例命令进行测试。 参考以下步骤,快速查看示例代码: 1. 在 Seedance 2.0 和 Seedance 2.5 体验中心界面,点击下方的 **模板库** 页签。 2. 将鼠标悬停在模板上,点击 **查看代码** 图标,即可查看和复制命令。 **注意**:测试前需先设置 `ARK_API_KEY` 环境变量,或将 `$ARK_API_KEY` 替换为您的 API Key。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/1344a21f888e4249b11b6c3694a094d3~tplv-goo7wpa0wc-image.image)
    --- # 录入真人形象素材 Source: https://ark.volcengine.com/region:cn-beijing/docs/upload-real-person-portrait-assets > **说明** > > * 真人认证流程有一定概率**受光线、角度等影响,出现不通过的情况**,如若出现可引导艺人再次尝试 > * 出于安全考虑,补充素材时会进行人脸一致性检测,**有一定概率不通过**,建议上传**清晰的正面形象图片(** 视频一致性校验时,会对视频隔秒抽帧,全部通过一致性校验才会允许入库,因此视频中出现侧脸/多人等情况,会造成一致性校验不通过) > * 出于对艺人权限的保护,便于艺人后续对自己的人像进行管理,真人认证当前须登录火山账号,**一个火山账号支持创建多个/多人真人人像** ## 功能简介 为确保创作者能充分利用 Seedance 2.0 和 Seedance 2.5 强大的视频生成能力高效生成视频内容,同时规避 AI 生成内容的潜在风险,方舟推出了可信素材库。完成入库的素材将进入您的私域素材库,在视频生成中使用。 私域素材库支持录入**真人演员**素材(图片、视频或音频),通过**真人认证**从根源锁定肖像权归属,规避后续肖像权纠纷风险;真人演员仅需完成一次授权,后续新增妆造无需重复真人认证流程,大幅降低录入成本。 > * 方舟提供可公开使用的虚拟人像库,更多信息请参考[虚拟人像库](/docs/avatar-library)。 ## 录入真人人像 真人人像库帮助您合规在 Seedance 2.0 和 Seedance 2.5 生成视频中使用真实人物作为演员,极大提升了 AI 生成视频的质量和制作效率。 您可在火山方舟体验中心生成人像资产录入邀约二维码。授权方(如艺人)可在移动端快速完成真人认证、上传本人素材,并授权您的账号使用其形象。授权完成后,您即可使用艺人上传并授权的有效人像素材生成视频。 ### 录入流程 真人人像需经演员本人同意并授权后使用,入库流程如下图: ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/7761c245942d47868fdd2b61bdc3dbfc~tplv-goo7wpa0wc-image.image) #### 步骤一、**素材使用方(如制作公司**):在方舟控制台生成授权二维码 1. 进入 [方舟体验中心](https://ark.volcengine.com/region:cn-beijing/experience/gen_video?model=doubao-seedance-2-0-260128),点击下方 **我的** 页签 > **真人人像** > **管理素材** > **创建资产组** > **说明** > > **账号须完成个人/企业认证,才可使用本功能**。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/22bfda143e124ec28cebc001faa672df~tplv-goo7wpa0wc-image.image) 2. 设置授权有效期并同意《真人人像使用协议》。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/8df8e787e179417b878ec7fab3dc7377~tplv-goo7wpa0wc-image.image)
    3. 生成邀约二维码。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/4173a34e7f0741c2a89a30570e153b79~tplv-goo7wpa0wc-image.image)
    #### **步骤二、授权人(如艺人)**:完成真人认证,上传素材并授权 * 扫描授权发起方分享的二维码,登录个人火山账号。 * 确认授权主体、授权用途无误后,同意人脸信息处理及授权规则,开始真人认证。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/220b119170814424ba05675e9821afaa~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/696105b67537485ebdc2dcfc4df0a206~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/ef12e9c67dc443fdb8b5c32f98e3129e~tplv-goo7wpa0wc-image.image) * 录入人像资产:
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/a6fb87b35531402fab2f09885790c636~tplv-goo7wpa0wc-image.image)
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/47e24d94f1784f5dbfc83aca45148d6c~tplv-goo7wpa0wc-image.image)
    填写资产名称(必填)和资产描述,并上传素材。 图片示例: > **说明** > > **全身参考图要求** > * 版式:竖版 > * 图片内容:人物全身正面图片
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/372f80d7ac3547bca195f4f5f1b59cb4~tplv-goo7wpa0wc-image.image)
    > **说明** > > **人脸特写图要求** > * 板式: 竖版 > * 图片内容:人物正面无表情特写,肩部以上,人物面部占画面2/3左右 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/94dcbab909bd4020a92ea8e20d164d43~tplv-goo7wpa0wc-image.image) 格式要求: > **说明** > > **图片**: > * 格式:jpeg、png、webp、tiff、gif、heic、heif > * 宽高比(宽/高):(0.4, 2.5) > * 宽高长度(px):(300, 6000) > * 大小:单张图片小于 30 MB > > **视频**: > * 格式:mp4,mov > * 分辨率:480p、720p、1080p、4K > * 时长:单个视频时长 [2, 30] s > * 尺寸: > * 宽高比(宽/高):[0.4, 2.5] > * 宽高长度(px):[300, 6000] > * 总像素数:宽×高 ∈ [407696, 8295044] > * 大小:单个视频不超过 200 MB > * 帧率(FPS):[24, 60] > > **音频**: > * 格式:wav、mp3 > * 时长:单个音频时长 [2, 30] s > * 大小:单个音频不超过 15 MB > > 不同模型支持的输入音视频时长不同。建议在上传前记录上传音视频的时长,方便终端客户区分哪些素材可以在 Seedance 2.0 和 Seedance 2.5 系列模型中使用。 通过一致性校验后,素材入库。 > **说明** > > * 单个素材组支持传入一个真人演员的不同妆造素材,仅需在创建素材组时进行一次真人认证。每次上传素材将进行一致性校验,校验不通过无法入库。 > * 不支持向同一素材组传入不同人物素材。 **注意**:上传完成后,将自动授权二维码对应的账号使用该人像素材。 #### **步骤三、素材使用方(如制作公司)**:接收授权人像 每位艺人将单独生成专属素材资产组(Asset Group),该艺人授权的素材将出现在对应资产组中,方便统一管理。 1. 在 [方舟体验中心](https://ark.volcengine.com/region:cn-beijing/experience/gen_video?model=doubao-seedance-2-0-260128) 的真人人像库中查看待接收授权素材,点击 **接收** 并确认风险提示。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/c930d02ee64946f9836aba1facc4f27f~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/df310648a7c14ec7af7925f55ee1e826~tplv-goo7wpa0wc-image.image) > **说明** > > 如选择 **拒绝**,则素材资产状态将变为 **已拒绝**,该资产将无法被使用。请谨慎操作。 2. 您可按授权状态筛选素材,还可使用自然语言或筛选器,查找需要的真人素材。 ## 使用真人素材生成视频 您可在 [体验中心](https://ark.volcengine.com/region:cn-beijing/experience/gen_video?model=doubao-seedance-2-0-260128) 或使用 [视频生成 API](/docs/create-video-generation-task-api) 生成视频。 **体验中心**:可在体验中心直接使用真人素材生成视频。 > **说明** > > 资产实际可用状态需以 **详情页内展示信息** 为准。*(一致性校验不通过的素材当前也会在资产列表页展示)* ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/f1046627745d49b7afc7f3b910203b41~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/deba010aafcb493fbfd1f15126939115~tplv-goo7wpa0wc-image.image) **视频生成 API**: * 需先获取要使用素材的 Asset ID。 * 使用视频生成 API 时,可按 `asset://` 规则拼接素材 URI,在 API 中使用对应素材生成视频,具体信息请参考 [使用预置虚拟人像](/docs/seedance-portrait-asset-guide#preset-avatar)。 ```JSON { "type": "image_url", "image_url": { "url": "asset://asset-20260222234430-mxpgh" }, "role": "reference_image" }, ``` --- # 使用商用版权生成视频 Source: https://ark.volcengine.com/region:cn-beijing/docs/generate-copyright-video 方舟体验中心支持使用 **真人版权** 和 **视觉版权** 素材,结合您的自有素材,通过 Doubao Seedance 2.0 和 Doubao Seedance 2.5 生成视频。 - 真人版权:选择演员及其固定妆造,结合提示词和商品、场景等参考素材,生成用于授权范围内的商业营销、短剧制作等场景的视频。 - 视觉版权:选择已授权的商业 IP 模板和玩法,替换自有或平台预置素材,将人物或主体融入版权模板场景中,生成具有版权内容风格的视频。 ## 功能入口 打开 [方舟体验中心](https://ark.volcengine.com/region:cn-beijing/experience/gen_video?model=doubao-seedance-2-5-260628),选择 **版权库**,再按创作需求切换 **真人版权** 或 **视觉版权** 模块。 ## 开通服务 首次使用前,前往 [开通管理](https://ark.volcengine.com/region:cn-beijing/openManagement?advancedActiveKey=copyrightIpCommercial) > **版权 IP 商用** 页签,开通商用版权服务。**服务仅需开通一次,真人版权和视觉版权无需重复开通。** > **说明** > > - 使用两类版权素材前,需分别在 **真人版权** 和 **视觉版权** 模块领用素材。支持一键领用。 > - 生成前需确保所选 IP 已领用且授权有效。版权形象的授权有效期、可使用场景和限制条件,以控制台展示的授权信息和相关协议为准。 ## 使用真人版权 ### 真人版权素材结构说明 真人版权按”演员 > 形象 > 参考图”组织素材: | 对象 | 说明 | | --- | --- | | 真人 IP | 对应一位已获授权的演员,拥有唯一 IP ID。 | | 形象 | 演员的一套固定妆造。同一演员可提供侠客、大学生、职场新人等多个形象。 | | 参考图 | 展示某个形象的图片。同一形象可提供不同视角的参考图。 | > **注意** > > 使用平台提供的真人 IP 参考图生成视频,不支持更换该形象的固定妆造。需要其他妆造时,选择演员提供的其他形象。 ### 浏览与领用 1. 在 **真人版权** 中输入角色形象或外观风格描述,或按 **性别**、**题材** 筛选演员。 2. 将鼠标悬停在演员卡片上,点击 **查看详情**。在详情页选择形象,并切换参考图视角,确认人物外观是否符合创作需求。 3. 如未领用该 IP,点击 **领用**,完成授权和领用操作。 > **说明** > > 首次使用版权形象时,需阅读并同意相关协议。 详情页可重点查看以下信息: - 演员资料:查看简介、适用题材、性别和年龄等信息,辅助选角。 - 授权信息:确认可用场景、所属公司及授权截止日期,判断是否覆盖您的用途。 - 形象与参考图:切换演员的不同固定妆造,查看对应参考图。形象数量和视角以实际展示为准。 ### 生成视频 1. 选择已领用的演员形象,点击 **使用**,将其添加为视频生成的参考素材;按需补充商品图、场景图等自有素材。 > **说明** > > 要使用自有真人形象,请先录入真人形象素材至素材库。具体信息请参考[录入真人形象素材](/docs/upload-real-person-portrait-assets)。 2. 在输入框中使用 `@` 引用素材,描述人物动作、场景、镜头和台词。例如,添加演员参考图与商品图后,可输入: > @图片1 中的演员保持参考图中的妆造,手持 @图片2 中的商品面向镜头展示。背景为明亮的室内,中景镜头缓慢推进至商品特写,演员微笑并说:“今天为大家介绍这款产品。” 3. 按需设置视频比例、分辨率、时长、声音和生成条数,点击发送图标生成视频。首次验证效果时,建议设置为生成 1 条视频。 ### 操作示意 ![](https://arkdocs.tos-cn-beijing.volces.com/images/video-generation/real-person-copyrighted.gif) ## 使用视觉版权 视觉版权提供不同 IP、场景和玩法。您可使用已授权版权 IP 生视频模板,结合自有素材或平台预置虚拟素材,生成包含上传形象的视频内容。 ### 浏览与领用 1. 在 **版权库** 中切换至 **视觉版权** 模块。 2. 将鼠标悬停在版权 IP 封面上,可选择使用该 IP 或查看版权信息。 3. 首次使用时,按页面提示阅读相关协议,完成视觉版权 IP 的一键领用。 > **说明** > > 首次使用版权形象时,需阅读并同意《版权和人像素材使用规则》。 ### 生成视频 > **说明** > > - 要使用自有真人形象替换模板素材,请先录入真人形象素材至素材库。具体信息请参考[录入真人形象素材](/docs/upload-real-person-portrait-assets)。 1. 点击 **使用**,预览并选择玩法,即电影桥段或特定场景。 2. 在素材区域点击 **替换图片**,替换真人素材或平台预置虚拟形象。图片会作为模板中的主体或人像参考。 > **说明** > > 真人素材建议使用清晰、无遮挡、光线充足的正面或半身照片,以提升生成效果。 3. 您可以按需选择生成视频分辨率、时长等参数,以及是否输出声音。 4. 点击 **发送** 图标,开始生成视频。 ### 操作示意 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/282b62285b2943d8b44c888bc526f946~tplv-goo7wpa0wc-image.image) ## 价格说明 使用版权 IP 生成视频时,不同版权单价不同。具体价格信息请在体验中心查看。 版权视频生成费用按各输入 IP 的单价和视频时长(秒)求和: `单条视频版权费用 = Σ(每个输入 IP 的单价 × 视频时长(秒))` --- # 开发者模式 Source: https://ark.volcengine.com/region:cn-beijing/docs/developer-mode > **说明** > > 此为邀测能力,如需使用,提交 [测试申请工单](https://console.volcengine.com/auth/login?redirectURI=%2Fworkorder%2Fcreate%3Fstep%3D2%26SubProductID%3DP00001166)。 体验中心提供开发者模式,开启后开发者面板将实时展示 API 请求和返回结果,方便您查看、导出与模型交互的详细代码逻辑。 * 支持选择 Responses API 或 Chat API。如选择 Responses API 模式,将在返回结果中展示流式事件。 关于 Responses API 和 Chat API 的详细信息,请参考 [Responses API](/docs/create-model-responses-api) 和 [Chat API](/docs/chat-api)。 * 根据实际输入,实时展示命令对应的完整代码和数据结构。 * 支持切换 Curl,Python,Golang 语言。 ## 使用方式 1. 进入 [**体验中心**](https://ark.volcengine.com/region:cn-beijing/experience/chat),选择要体验的模型和版本,在模型详情面板选择要使用的 API 模式。本文以 Responses API 为例,说明使用方式。 2. 点击右上角 **开发者模式** 图标,可以在面板右上角切换调用语言。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/827a7367ffe7482aa8a9f1fb132b5fe6~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/4bd959c7662d45a08d324811dbb973a6~tplv-goo7wpa0wc-image.image) 3. 配置模型参数、指令以及需调用的工具,开发者模式面板的请求体将动态更新。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/7e2002c506fb480b846e7066e350f04c~tplv-goo7wpa0wc-image.image) 4. 在对话框发送指令,开发者面板的 **Response** 区域将按时序展示模型返回的事件。 * 面板左侧按时序展示请求列表。 * 在 **Response** 中点击对应事件,可查看完整内容。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/d60695a8231143309ae4cccbb4d5bd37~tplv-goo7wpa0wc-image.image) 5. 开发者模式支持在多轮对话中生成树状分支:您可以重复生成任意一对话,每次生成将在当前节点产生一个新分支。可在对话区域切换分支,开发者面板中的时序列表将展示当前分支的完整历史。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/61d9f72743274963960e4e525dcb7122~tplv-goo7wpa0wc-image.image) 此外,您可以: * 在面板中复制代码。 * 快速定位生成内容和对应代码: * 使用右上角的定位图标,快速定位对话界面返回的文本、知识库、联网搜索源等元素对应的 Response 事件。 * 使用 Response 事件右侧的定位图标,快速定位对话界面中该事件对应的内容。 * 在开始下一轮交互前,选择取消 **上下文关联**,开始新对话。 关于如何体验语言模型,请参考[语言模型](/docs/language-models)。 --- # MCP 简介 Source: https://ark.volcengine.com/region:cn-beijing/docs/experience-center-mcp ## 什么是 MCP MCP(Model Context Protocol,模型上下文协议)是由 Anthropic 公司提出并开源的一项标准协议框架,旨在标准化大型语言模型与外部数据源和工具之间的交互方式。通过 MCP,AI 应用可以以统一的方式访问本地和远程资源,实现更高效、灵活的集成。 MCP 被誉为 AI 应用的“TYPE-C 接口”,就像 TYPE-C 为设备连接外设提供了标准化方式一样,MCP 为 AI 模型连接不同的数据源和工具提供了标准化接口。 ## 技术架构 MCP 采用模块化的客户端-服务器架构,解耦了 AI 助手与后端服务之间的关系。典型的 MCP 部署包括: * **主机进程(Host)**:运行大模型的应用程序,如 Claude desktop、Cursor、方舟体验中心等。 * **MCP 客户端(Client)**:作为主机进程与服务器之间的抽象接口层,负责规范化通信并处理协议转换。 * **MCP 服务器(Server)**:通过标准化的 MCP 协议,向客户端提供特定的能力。 MCP 客户端通过 JSON-RPC 接口与服务器通信,支持多种传输机制,包括标准输入 / 输出(stdio)和流式传输 HTTP(Streamable HTTP)。 ## 工作原理 当用户以自然语言提出请求时,MCP 的工作流程如下: 1. **请求解析**:主机进程识别用户意图,并将请求传递给 MCP 客户端。 2. **能力匹配**:客户端查询可用的 MCP 服务器,确定能够处理该请求的资源或工具。 3. **任务执行**:客户端向选定的服务器发送请求,服务器执行相应操作(查询数据库、调用 API 等)。 4. **结果返回**:服务器将结果返回给客户端,客户端将其传递给主机进程。 5. **响应生成**:主机进程整合上下文信息,生成自然语言响应呈现给用户。 整个过程对用户透明,提供了流畅的自然语言交互体验。 ## 核心能力 ### MCP 服务器提供的能力 * **资源(Resources)**:提供静态或可查询的数据集,如文件、文档、数据库等。 * **工具(Tools)**:暴露可调用的函数或 API,供 AI 模型执行操作。 * **提示词(Prompts)**:提供结构化的提示模板,指导模型生成特定格式的响应。 ### 客户端向服务器提供的能力 * **大模型调用(Sampling)**:支持服务器主动发起大模型请求,实现多轮对话、递归推理等复杂处理。 * **文件系统访问(Root)**:向服务器暴露受限的文件系统视图,便于识别和访问可操作的目录与文件。 ## 应用价值 MCP协议的价值在于通过标准化统一的接口,打破了大语言模型的能力边界,使用户能够通过自然语言交互方便地调用各类工具和资源,极大提高了人机交互的体验。更多的MCP技术原理可参考 [官方文档](https://docs.anthropic.com/zh-CN/docs/agents-and-tools/mcp)。 ## 体验中心快速体验 目前可在 [火山方舟体验中心](https://www.volcengine.com/experience/ark) 体验 MCP 能力,点击对话框下方的「MCP」按钮,即可体验 MCP 能力,其支持多模型、多MCP服务器及工具选择。 在 MCP 服务器管理界面点击按钮即可开启服务,访问密钥已预置,如无预置密钥,需自行去服务提供商官网获取。目前已支持对象存储、数据湖等 MCP 应用,暂不支持自建MCP接入。更多应用正在开发和接入中,敬请期待。 ### ### ## --- # Canvas 简介 Source: https://ark.volcengine.com/region:cn-beijing/docs/canvas Canvas(画布)提供了一个独立的工作空间,使您可以与 AI 并肩合作,在同一画布上进行内容的创作、预览与优化,能够帮您显著提高写作、编程等复杂任务的完成质量和效率。 > **说明:Tip** > > 为获得更佳的 Canvas 体验效果,建议使用深度思考模型: > * doubao-seed-2-0-code-preview-260215 > * doubao-seed-2-0-pro-260215 > * deepseek-v4-pro-260425。 您可在对话框下方启用 Canvas。启用后,在交互内容涉及创意写作或编程时,系统会自动打开 Canvas 画布,动态展示生成过程。 下图以生成贪吃蛇小游戏任务为例,展示生成效果。 ![](https://arkdocs.tos-cn-beijing.volces.com/images/resources/greedy_snake_gif.gif) * 当对话中出现可运行的 HTML 代码时,Canvas 将自动开启实时预览功能,方便查看或体验实时效果。 * 支持直接在 Canvas 上编辑文本和代码内容。 * 支持复制、下载或分享生成产物。 ![](https://arkdocs.tos-cn-beijing.volces.com/images/resources/greedy_snake_preview.gif) --- # 上传商业化版权 Source: https://ark.volcengine.com/region:cn-beijing/docs/upload-copyright 版权方可以提交视觉版权或真人版权。平台审核通过后,相关版权可在授权范围内用于内容生成和商业化。 ## 操作概览 1. 进入 **商用版权上传**,选择 **视觉版权** 或 **真人版权**。 2. 填写基础与展示信息,上传展示的封面图。 3. 完成商业与授权配置,真人版权还需关联形象并上传形象素材图。 4. 提交审核,在 **提交状态** 中跟踪结果。 5. 如果提交被驳回,根据审核意见修改后重新提交。 ## 前提条件 - 使用已加入白名单的版权方火山账号登录。 - 上传视觉版权前需准备版权的基础信息、授权期限、允许生成范围和展示封面图。 - 上传真人版权前需准备人物基础信息、封面图以及一个或多个形象的 5 张参考图。 ## 进入商用版权上传 进入 [开通管理](https://console.volcengine.com/ark/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=model) > **管理素材资产** > **版权方版权管理** > **商用版权上传**。 ## 上传视觉版权 视觉版权适用于影视、游戏、动漫等 IP 版权。 1. 在 **商用版权上传** 页面选择 **版权提交**。 2. 在 **选择上传类型** 区域选择 **视觉版权**。 3. 填写基础与展示信息。 | 信息 | 填写说明 | | --- | --- | | 版权类型 | 选择版权所属类型。 | | 版权名称 | 填写中文名称;可提示补充英文名称。 | | 版权描述 | 说明作品背景、版权内容等描述信息;可提示补充英文描述。 | | 封面图 | 上传用于版权库卡片展示的图片。 | | 生效起止日期 | 填写本次授权的开始日期和结束日期。 | 4. 填写商业与授权配置。 | 配置 | 填写说明 | | --- | --- | | 允许生成范围 | 配置盈利性场景、非盈利性场景、兜底禁止场景的黑白名单。 | | 其他要求 | 补充版权使用场景的特殊要求。 | 5. 检查信息后,提交审核。 ## 真人版权 真人版权适用于真人 IP 及其多个可授权形象。 1. 在 **商用版权上传** 页面选择 **版权提交**。 2. 在 **选择上传类型** 区域选择 **真人版权**。 3. 填写基础与展示信息。 | 信息 | 填写说明 | | --- | --- | | IP 名称 | 填写公众人物或真人 IP 的名称。 | | 经纪公司(版权方) | 选择或填写版权所属公司。 | | 性别、年龄、身高、体重 | 按页面要求填写人物信息。 | | 版权库卡片封面 | 上传用于版权库卡片大图展示的定妆图。 | | 适用题材 | 选择现代都市、古装、悬疑刑侦、写实等适用题材。 | | AI 标签 | 用户对该真人版权进行检索的相关标签。 | | 版权描述 | 说明人物 IP、授权内容和使用要求。 | | 生效起止日期 | 填写本次授权的开始日期和结束日期。 | 4. 填写商业与授权配置。 5. 在 **关联形象** 区域添加一个或多个形象。 6. 为每个形象填写名称并上传参考图。根据需要调整形象顺序或删除形象。 7. 检查信息后,提交审核。 ## 准备形象图片 关联形象的图片需满足以下要求: - 格式:JPG、JPEG 或 PNG,PNG 支持透明背景。 - 大小:单张不超过 50 MB。 - 分辨率:长边不低于 1024 px。 - 比例:宽高比在 1:2 至 2:1 之间,推荐使用 3:4 竖图或 4:3 横图。 - 内容:使用原始高清素材,保持单人形象清晰、头部完整且无遮挡。 平台逐张校验批量上传的图片。符合要求的图片继续上传;不符合要求的图片单独显示失败原因,不影响同批次的其他图片。 ## 查看提交状态 提交后,在 **商用版权上传** > **提交状态** 查看审核进度。页面支持按上传类型和审核状态筛选,也可以按名称或提交人搜索。 | 状态 | 说明 | 后续操作 | | --- | --- | --- | | 审核中 | 平台正在审核提交内容。 | 查看详情;如页面允许,可撤回提交。 | | 已驳回 | 提交内容未通过审核。 | 查看审核意见,编辑后重新提交。 | | 已通过 | 版权已通过平台审核。 | 查看已生效的版权信息。 | | 已撤回 | 提交人已撤回本次申请。 | 编辑后重新提交,或删除记录。 | 页面仅开放当前状态可执行的操作。操作可能包括 **查看**、**编辑**、**撤回** 和 **删除**。 --- # 审核版权合作与生成视频 Source: https://ark.volcengine.com/region:cn-beijing/docs/review-generated-content 方舟版权审核平台面向版权方审核人员,用于审核广告商提交的版权合作意向和创作视频,保障 IP 形象、品牌露出与版权素材的合规使用。 ## 审核流程 版权合作包含以下两个审核环节: 1. 合作意向审核:核对广告商公司主体、商品品类和拟使用的版权 IP,决定是否通过合作。 2. 视频审核:合作意向通过后,逐帧审核广告商提交的创作视频,并通过批注反馈修改意见。 一个合作意向可以包含多个创作视频。平台通过项目 ID 关联同一合作意向及其视频审核任务。 ## 前提条件 使用已加入白名单的版权方火山引擎账号登录。 ## 进入审核平台 - 审核合作意向:进入 [开通管理](https://console.volcengine.com/ark/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=model) > **管理素材资产** > **版权方版权管理** > **合作意向审核**。 - 审核生成视频:进入 [开通管理](https://console.volcengine.com/ark/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=model) > **管理素材资产** > **版权方版权管理** > **视频审核**。 ## 审核合作意向 ### 查找合作意向 1. 在 **版权方版权管理** 下打开 **合作意向审核** 页签。 2. 按意向审核状态或版权 IP 筛选记录。意向审核状态包括 **待审核**、**已通过** 和 **不通过**。 3. 通过项目 ID、广告商公司主体、商品品类、版权 IP、意向审核状态、项目状态和提交时间确认目标项目。 4. 对待审核项目点击 **审核**;对已处理项目点击 **查看**。 项目状态包括 **进行中** 和 **已终止**。 ### 提交意向审核结果 1. 在详情页核对以下信息: - 项目摘要:项目 ID、意向审核状态、项目状态和提交时间。 - 广告主主体:公司名称、统一社会信用代码。 - 涉及商品:商品品类。 - 使用版权:版权封面、名称和 IP ID。 2. 根据审核结果填写审核意见。选择 **通过** 时审核意见选填;选择 **不通过** 时审核意见必填。 3. 点击 **通过** 或 **不通过**,完成审核。 ### 终止已通过的合作 对已通过且仍在进行中的合作,可以在列表或详情中点击 **终止合作**。 1. 点击 **终止合作**。 2. 在确认窗口中填写终止原因。 3. 点击 **确认终止**。 终止后,项目状态变为 **已终止**,该项目不能继续提交或审核视频,已有意向审核记录仍会保留。 ## 审核生成视频 ### 查找待审核视频 1. 打开 **视频审核** 页签。 2. 展开目标项目,查看该项目下的视频审核任务。 3. 根据项目 ID、使用 IP、商品类型、视频 ID、审核状态和提交时间确认目标视频。 4. 对待审核视频点击 **审核**;对已处理视频点击 **查看**。 视频审核状态包括 **待审核**、**已通过** 和 **需调整**。同一合作意向下的多个视频分别展示并独立审核。 ### 查看视频 点击 **审核** 进入视频审核页面: - 页面顶部展示项目 ID、使用的版权 IP、提交方和商品品类。 - 页面左侧按 **待审核**、**需调整** 和 **已通过** 分类展示同一项目下的视频。 - 页面中间展示当前审核视频、播放器和时间轴。 ### 添加截图批注 1. 播放视频,定位到需要反馈的画面。 2. 暂停视频,点击 **截图批注**。 3. 在 **批注描述** 中填写具体修改意见。 4. 点击 **确认** 发布批注;如不需要保留本次批注,点击 **取消**。 5. 在页面右侧查看已发布的批注。 批注按视频进度排序。每条批注包含视频帧时间、审核人、审核时间、批注文字和对应帧图像。 > 页面示意,图中信息非真实数据。 ![添加截图批注](https://arkdocs.tos-cn-beijing.volces.com/images/tutorials/copyright-owner-6.png) ### 提交视频审核结果 完成视频检查和批注后,提交审核结果: - 视频符合要求:点击 **通过**,视频状态变为 **已通过**。 - 视频需要修改:点击 **打回调整**,填写打回原因后点击 **提交并打回调整**。视频状态变为 **需调整**,广告商可以根据反馈修改并重新提交。 ## 查看审核记录 - 在 **合作意向审核** 页签中,对已处理项目点击 **查看**,查看意向及审核结果。 - 在 **视频审核** 页签中,展开项目并点击视频对应的 **查看**,查看视频及已发布的批注。 --- # 查看版权用量与收入 Source: https://ark.volcengine.com/region:cn-beijing/docs/view-usage-and-revenue 版权方可以通过火山方舟版权商业化平台查看已授权 IP 的视频生成用量、调用记录和收入数据。部分版权方还可以查看关联 IP 在抖音特效中的曝光和投稿数据。 ## 操作概览 1. 进入 [开通管理](https://console.volcengine.com/ark/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=model) > **管理素材资产** > **版权方版权管理** > **用量与收入统计**。 2. 在 **版权用量** 中选择周期,查看整体趋势和单个版权 IP 的调用量。 3. 使用独立的明细筛选器查询具体调用,并按 Task ID 追溯生成视频。 4. 如账号已开放相应页签,查看版权收入或抖音曝光数据。 ## 前提条件 - 使用已签约并加入白名单的版权方火山账号登录。 - 当前火山账号已关联需要查询的版权 IP。 - 使用 Chrome、Edge 等主流浏览器访问。 ## 进入数据看板 进入 [开通管理](https://console.volcengine.com/ark/region:cn-beijing/openManagement?LLM=%7B%7D&advancedActiveKey=model) > **管理素材资产** > **版权方版权管理** > **用量与收入统计**。 ## 查看版权用量 ### 选择统计周期 进入 **版权用量** 页签,在页面顶部选择统计周期: - **当天**:当天 00:00 至当前时刻。 - **近 7 天**:包含当天在内的最近 7 天。 - **近 30 天**:包含当天在内的最近 30 天。 - **自定义**:选择开始日期和结束日期,最长跨度为 30 天。 顶部时间范围仅影响上方图表,不影响页面底部的调用明细。调用明细使用独立的时间筛选条件。 ### 查看整体调用情况 使用以下图表了解所选周期内的整体用量: - **各 IP 调用占比**:比较不同 IP 的调用量占比,识别主要使用的 IP。 - **近期调用趋势**:查看全部 IP 的逐日调用次数。将鼠标悬停在数据点上,可以查看当天的具体调用量。 平台仅统计成功生成视频的调用。生成失败的任务不计入调用次数和图表。 ### 分析单个 IP 在 **IP 用量分析** 区域打开 IP 下拉列表,选择一个 IP,查看该 IP 的逐日调用量。选择 **全部 IP** 可以恢复整体视图。 ### 查询调用明细 在页面底部的 **调用明细** 区域设置独立的时间范围和 IP 筛选条件。表格按调用时间倒序展示记录。 | 字段 | 说明 | | --- | --- | | 调用时间 | 生成任务成功调用的时间。 | | IP 名称 | 本次生成使用的版权 IP。 | | IP ID | IP 在火山方舟中的唯一标识。 | | Task ID | 本次生成任务的标识,可用于跨系统追溯。 | 点击一条调用记录,打开 **调用详情**,查看调用时间、Task ID、IP 信息和脱敏后的用户生成视频。 ## 查看版权收入 如果账号已开放 **版权收入** 页签,可以查看收入概况和交易明细。 ### 查看收入概况 1. 进入 **版权收入** 页签。 2. 选择自定义时间范围。一般情况下收入按月结算,短周期内可能没有数据。 3. 查看总收入、订单数量和平均单次收益。 4. 查看近期收入趋势。将鼠标悬停在数据点上,可以查看当天的收入和订单数。 看板中的收入为预估数据,最终收入以财务结算结果为准。 ### 查询收入明细 在 **收入明细** 区域设置独立的时间范围。表格按交易时间倒序展示记录。 | 字段 | 说明 | | --- | --- | | 交易时间 | 收入记录对应的结算时间。 | | 计收金额 | 该笔记录对应的计收金额。 | | 分成比例 | 火山方舟与版权方在合同中约定的分成比例。 | | 版权方收入 | 根据分成比例计算的预估收入,实际金额以财务结算为准。 | 如果页面显示导出入口,可以导出当前页 CSV 文件。 ## 查看抖音曝光数据 如果账号已开放 **抖音曝光数据** 页签,可以查看关联 IP 的特效曝光和投稿表现。 ### 查看整体数据 1. 进入 **抖音曝光数据** 页签。 2. 选择统计周期和 IP。 3. 查看总曝光量(三端 VV)和总投稿量。 4. 查看各特效曝光占比,识别曝光量较高的特效。 5. 查看近期曝光与投稿趋势。将鼠标悬停在数据点上,可以查看当天的曝光量和投稿量。 三端 VV 是抖音、抖音极速版和抖音火山版的合计视频播放量。 ### 查询曝光明细 在 **特效曝光数据明细** 区域设置独立的日期、IP 和特效筛选条件。顶部筛选条件不影响明细区域。 | 字段 | 说明 | | --- | --- | | 日期 | 数据所属日期。 | | 特效名称和 ID | 使用版权 IP 的特效及其唯一标识。 | | 当日曝光 VV | 该特效当天在抖音三端的合计视频播放量。 | | 当日投稿量 | 当天使用该特效发布的视频数量。 | | 累计投稿量 | 截至当前日期使用该特效发布的视频总量。 | | 视频样片 | 该特效的高热视频示例。 | 点击 **查看视频**,跳转到抖音查看对应视频样片。 ## 数据口径 - 调用数据约每 2 小时更新一次。 - 调用量仅统计成功生成视频的任务。 - 收入数据按月更新,实际收入以财务结算为准。 - 图表和明细区域使用独立的筛选条件。 --- # 管理推理接入点 Source: https://ark.volcengine.com/region:cn-beijing/docs/manage-inference-endpoints 本文介绍了如何查看和管理模型在线推理接入点(后简称接入点),包括状态监控、API调用、指标告警及安全审计等功能操作。 预置推理接入点和自定义推理接入点的差异详情请查看 [什么是推理接入点](/docs/deployment-overview)。 # 查看并管理接入点 1. [登录控制台](https://ark.volcengine.com/region:cn-beijing)。 2. 在控制台左下角切换项目。 3. 单击左侧导航栏中的 **在线推理** 进入列表页。 4. 在线推理列表页,支持 **编辑** / **删除** / **停用** 推理接入点;查看接入点状态。 在线推理接入点 **状态** 说明
    参数名称 参数说明
    状态 调度中:后台资源正在调度中,可能处于排队状态也可能已经在资源启动中。
    健康:接入点状态正常,可正常调用。
    健康并不能表示接入点负载情况。调用超过限流,状态会显示健康,但是服务会返回错误。
    已停止:当用户触发停止接入操作,或者模型下线时,系统将关停相应的接入点。
    异常:接入的模型异常,您可提交工单后台将为您处理。
    # 查看接入点信息 点击接入点名称进入接入点详情页,可查看模型推理接入点的**概览信息、API调用、监控、关联应用、安全审计**等信息。 ## 概览信息 概览信息中可查看推理接入点的模型信息。 * 基本信息:接入模型、限流、创建人等信息。 * 计费信息:计费类型、输入输出价格。 * 关联的应用。 ## 版本切换 目前,推理服务中的部分模型已支持在**同领域模型间跨卡片**进行版本切换。具体支持的模型请以控制台显示为准。无需新建并变更接入点,即可更换模型。 > **注意** > > * 模型在**价格、限流策略、推理缓存行为以及接口参数**等方面可能存在差异,建议您在切换模型版本时充分了解并测试。 > * 在版本切换过程中,缓存暂不可用,使用 Responses API 请求时将无法命中缓存,但会进行存储并产生缓存存储费用;版本切换完成后,可正常命中历史轮次的缓存。 > * 版本切换前后的模型在内置工具的支持方面可能会存在差异。若切换后的模型未支持对应的工具调用,将触发报错。模型的支持情况参见[工具调用能力](/docs/model-list#f44ceef7)。 版本切换耗时约 1 小时,过程中支持回滚,可按需逐步切回或一步回滚。 ## 监控 基于 [托管 Prometheus 服务](https://www.volcengine.com/docs/6731)(Volcengine Managed Service for Prometheus,简称VMP)为您提供接入点实时监控功能。 ### 开启监控 具备 ArkStandardGlobalAccess 或 ArkFullAccess 权限的用户,点击**一键开启监控**按钮后,系统将自动开通监控服务并完成相关配置。 由方舟采集的监控指标不会向客户收取费用,并且会保留近15天的数据。关于VMP的其他收费项目,请参考 [收费详情](https://docs.volcengine.com/docs/6731/447498?lang=zh) 页面获取完整信息。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/41493c1b67e6451ca2c3469011591ad7~tplv-goo7wpa0wc-image.image) ### 监控详情页面 开启监控后,在监控页面可查看当前推理接入点的监控指标,了解模型调用情况。 * 支持过滤当前接入点调用的 API 接口、模型名称、模型版本。 * 支持筛选查询的时间范围。 * 支持查看 Token 用量、性能、异常统计、推理缓存等维度的监控指标。(不同领域的模型提供的监控指标不同,下图以深度思考模型举例。) ![monitor_detail_page.jpeg](https://arkdocs.tos-cn-beijing.volces.com/images/resources/monitor_detail_page.jpeg) ### 指标告警配置 #### 前提条件 > 火山引擎授权操作指引请参考 [策略概述](https://docs.volcengine.com/docs/6257/65058?lang=zh)。 如果子账号需要配置告警规则,需要有当前账号的 VMPFullAccess 权限。如果用户仅有 VMPReadOnlyAccess 权限,需要额外新增以下接口权限来配置告警: * VMP:CreateAlertingRuleGroup,通过告警模板创建告警规则组 * VMP:UpdateAlertingRuleGroup,更新告警规则组 * VMP:UpgradeAlertingRuleGroups,升级告警规则组到最新的告警模板 * VMP:DeleteAlertingRuleGroup,删除告警规则组 #### 配置监控指标告警 可于方舟控制台推理接入点的监控页面一键配置监控指标告警,推荐使用针对当前接入点预填好参数的默认配置。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/95e99ff6d8b8486fbeef71da6c691f93~tplv-goo7wpa0wc-image.image) 如果需要根据业务进行合理配置,如避免针对同一接入点重复告警等告警泛滥情况,可前往托管Prometheus平台 [查看告警规则](https://console.volcengine.com/prometheus/region:prometheus+cn-beijing/alert/rule?tab=group)。 若有自定义配置需求,如自定义指标监控、配置自定义聚合策略等,可前往托管Prometheus平台 [创建告警规则](https://console.volcengine.com/prometheus/region:prometheus+cn-beijing/alert/rule/edit)。 若需针对联系人进行精确通知,可前往托管Prometheus平台 [创建联系人](https://console.volcengine.com/prometheus/region:prometheus+cn-beijing/alert/notification?edit_type=notify_object&tab=notifyObject) 并验证联系方式,目前支持使用邮件、电话、飞书、钉钉、企业微信等几种形式进行告警通知接收。 不选择通知策略时,仍会生成告警事件,但不会向联系人发送告警通知,请前往托管 Prometheus 平台 [查看告警事件](https://console.volcengine.com/prometheus/region:prometheus+cn-beijing/alert/alerting)。 ## 分析统计 **前提条件**:在 Responses API 请求的 header 中增加`"X-Fornax-Trace: true"`开启数据上报,在 SDK 中设置 header 的示例请参见[开启数据上报](/docs/sdk-common-examples#d5f5495b)。当前该功能仅支持分析统计 Responses API 请求的数据。 > 该功能限时免费提供使用。 开启数据上报后,在**分析统计**页面查看当前推理接入点的 Trace 列表及 Trace 详情,便于快速排查与定位问题。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/4f8d92f554ba4b99ba198213b466900d~tplv-goo7wpa0wc-image.image) **分析统计** 页面支持按 Span 类型筛选,可从下拉菜单中选择以下视图: * All Span:显示所有类型的节点,包括模型调用、工具调用、提示词拼装等执行过程中的每一个工作单元,适合查看完整执行链路。 * LLM Span:仅显示与大语言模型交互的节点,包含模型输入、参数配置、Token 消耗及响应内容等信息,适合重点分析模型调用情况。 * Root Span:仅显示每条 Trace 的根节点,代表一次完整用户请求的整体信息,适合快速了解请求概况。 > 统计列表中一次请求可能对应多条记录。这是因为系统会将一次完整请求拆解为意图识别、工具调用、结果生成等多个独立工作单元分别追踪,每个工作单元均生成一条 Span 记录,共同构成完整的 Trace。 ## 关联应用 详情请参考[应用实验室](/docs/app-lab-overview)文档。 ## 安全审计 详情请参考 [安全审计](/docs/security-audit) 文档。 --- # 为 AI 生成产物添加隐式水印 Source: https://ark.volcengine.com/region:cn-beijing/docs/add-invisible-watermark-to-ai-generated-content 火山方舟为 API 客户提供隐式水印技术能力,能够针对图片、视频等 AI 生成产物添加文件元数据隐性标识。本文为您介绍隐式水印字段信息、接入方式等内容,帮助API 客户更好地利用火山方舟的隐式水印技术,满足相关法规对 AI 生成合成内容标识的要求。 > **说明** > > 隐式水印为 Beta 功能,限时免费。 # 背景介绍 随着人工智能技术高速发展,生成合成效果日渐逼真,利用生成合成内容传播虚假新闻、实施诈骗等恶性事件不时爆发。为规避生成合成内容滥用、恶意使用对公共安全及公众权益的负面影响,网信办计划加强"标识"能力建设,2025年3月14日发布了规范性文件《人工智能生成合成内容标识办法》,并委托中国电子技术标准化研究院同步制定、下发强制性国家标准 [GB 45438-2025《网络安全技术 人工智能生成合成内容标识方法》](https://www.tc260.org.cn/upload/2025-03-15/1742009439794081593.pdf),对**人工智能生成合成内容服务提供者、提供网络信息内容传播服务的服务提供者、互联网应用程序分发平台、用户**四类主体提出标识义务、作出细节安排。两份文件都于2025年9月1日正式生效。 # 隐式水印字段 根据法规要求,隐式水印Metadata元数据包含以下字段: |**字段** |**类型** |**描述** |**含义** |**方舟是否帮助用户打标** |**方舟说明** | |---|---|---|---|---|---| |Label |string |生成合成标签 |* 属于人工智能合成内容的,取值为 “1”,一般是由AI内容制作方写入 |是 |取值为1 | \ | | | |* 可能为人工智能合成内容的,取值为 “2”,一般是用户声明内容为ai生成写入 | | | \ | | | |* 疑似为人工智能合成内容的,取值为 “3”,一般是审核识别为疑似AI写入 | | | |ContentProducer |string |生成合成服务提供者 |生成合成服务提供者的名称或编码 |是 |根据用户在平台输入的信息,帮助用户创建 ContentProducer 参数 | |ProduceID |string |内容制作编号 |生成合成服务提供者对该内容的唯一编号,为平台方对资源的映射,方舟无法帮客户写入 |否 |属于生成方对资源的映射,方舟无法帮客户写入,需要生成方自行将自己资源id写入到Metadata信息中 | |ReservedCode1 |string |预留字段 1 |用于生成合成服务提供者自主开展安全防护,保护内容、标识完整性的信息 |否 |能力开发中 | |ContentPropagator |string |内容传播服务提供者 |内容传播服务提供者的名称或编码 |是 |根据用户在平台输入的信息,帮助用户创建 ContentPropagator参数 | |PropagateID |string |内容传播编号 |传播服务提供者对该内容的唯一编号,为平台方对资源的映射,方舟无法帮客户写入 |否 |属于传播方对资源的映射,方舟无法帮客户写入,需要传播方自行将自己资源id写入到metadata信息中 | |ReservedCode2 |string |预留字段 2 |内容传播服务提供者自主开展安全防护,保护内容、标识完整性的信息 |否 |能力开发中 | # 支持模型 支持的模型:[视频生成能力](/docs/model-list#7571da3f)、[图片生成能力](/docs/model-list#9df4d9fd)。 # 使用说明 * **接入方式**:支持在方舟控制台**by 推理点**开启隐式水印,多个推理点可输入同主体信息。 * **方舟对哪些字段打标**:Label(生成合成标签)、ContentProducer(内容生成方)、ContentPropagator(内容传播方) > 注:ProduceID(内容制作编号)、PropagateID(内容传播编号)属于生成/传播方自身对资源id的管理,方舟无法帮客户打标,需要客户自行写入Metadata信息,客户可自定义命名规则。 * **计费**:限时免费。 * **时延影响**:增加时延 4ms 左右。 # 接入方式 ## 创建自定义推理点 1. 进入创建自定义推理点,点击“更多”,找到“隐式水印”,查看右侧详细介绍
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/697b203531984b66817dcd4858e4f578~tplv-goo7wpa0wc-image.image)
    2. 打开开关,同意弹窗内容,开启隐式水印
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/d16cf288b5884dd6afbbbe360b5660b9~tplv-goo7wpa0wc-image.image)
    3. 开启需用户勾选生成/传播方,并填写对应**生成/传播方的主体名称和社会统一信用代码**(用于生成标识,为国家标准)
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/7556c47f2af64de88c2c4311501063f4~tplv-goo7wpa0wc-image.image)
    ## 自定义推理点详情页 1. 点击推理点名称,进入详情页
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/d893baa62a294401829224786cc69235~tplv-goo7wpa0wc-image.image)
    2. 点击隐式水印编辑按钮,可切换水印开关状态
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/95d9601629b24240916f80a9a322668c~tplv-goo7wpa0wc-image.image)
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/953fc535f2fb40f2b16d97b48743bdff~tplv-goo7wpa0wc-image.image)
    3. 打开开关,同意弹窗内容,开启隐式水印
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/cc7723500a4d44d29bc811b148343adb~tplv-goo7wpa0wc-image.image)
    4. 开启需用户勾选生成/传播方,并填写对应**生成/传播方的主体名称和社会统一信用代码**(用于生成标识,为国家标准)
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/d1a63f890c1c4b29a6c263b460c168f5~tplv-goo7wpa0wc-image.image)
    # 验证方式 生成产物添加水印情况可上传到 [国家标识检测平台](https://www.gcmark.com/web/index.html#/home) 进行验证。 > **说明** > > 生图隐式水印暂时无法通过国家平台验证,后续版本会支持验证,目前可使用 [jpdump - JPEG Header Viewer](https://cyber.meme.tips/jpdump/#) 查看文件头信息。 # 常见问题 ## 如何确认我是不是传播方? 示例参考【**仅供参考,具体情况根据各司法务评估**】: |产品情况 |建议 | |---|---| |面向个人用户的产品,且产品不带传播属性 |* 需要选择:生成方标识,填入该产品的主体和社会统一信用代码。 | \ | |* 不需要选择:传播方标识,传播方标识应为最终传播平台自己添加。 | |面向个人用户的产品,且产品自带传播属性 |* 需要选择:生成方和传播方标识,填入该产品的主体和社会统一信用代码。 | ## 隐式水印是否会影响视频的生产速度? 目前会增加 4ms 左右延时,后续水印能力增强可能对速度有影响。 --- # 安心体验模式细则说明 Source: https://ark.volcengine.com/region:cn-beijing/docs/free-tokens-only-mode # 什么是安心体验模式? 安心体验模式是火山方舟平台为您提供的体验模式,可以保障您免费体验模型推理服务,又不产生费用。在安心体验模式下,您调用推理 API 时仅消耗平台赠送的 50w token 免费额度,接近免费额度后服务将暂停,避免产生额外费用。 > **注意** > > 免费额度仅适用于抵扣模型推理消耗的 token(50w 免费 token),不能抵扣使用各类插件、知识库等产生的费用。因此,即使您开启安心体验模式,如果使用了联网插件、知识库等内容,这部分费用是无法抵扣的。 # 模式说明 安心体验模式为账号维度的配置,适用于账号下所有支持安心体验模式的模型。 * **安心体验模式开启时**:调用模型在线推理时仅消耗免费额度,超出免费额度时服务将自动暂停。 * **安心体验模式关闭时**:调用模型在线推理时优先消耗免费额度,超出免费额度后按实际 Token 消耗计费 > **注意** > > * 如您在服务暂停后希望继续调用,需关闭安心体验模式;注意关闭后,将无法再次开启。 > * 默认状态下安心体验模式关闭,如有需要请参见[功能入口](/docs/free-tokens-only-mode#34d3c92e)开启。 # 生效范围 * **对象**:**未开通过模型服务**,且未开启或未关闭过安心体验模式的账号(包括实名认证通过的个人账号和企业账号)可开启。 * 模型:除 **多模态向量化** 及 **同声传译** 模型不支持,其他模型均支持。 * 功能: * 可避免付费:在线推理按 Token 后付费; * 不可避免付费:使用各类插件、知识库等产生的费用。 * 注意:如需购买 TPM 保障包、模型单元等,或开启推理缓存,需提前关闭安心体验模式。 # 功能入口 ## 开启模式 入口1:进入 [**开通管理页面**](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&OpenTokenDrawer=false),在模型列表上方 “安心体验模式” 横幅中点击开关即可开启 入口2:(快速接入相关页面中)在开通模型时勾选开启安心体验模式,即可随模型一键开通 ## 关闭模式 进入**开通管理页面**,在模型列表上方 “安心体验模式” 横幅中点击开关即可关闭 ## 查看模型安心体验状态 进入**开通管理页面**,在模型列表中可查看对应模型是否处于安心体验模式下(“免费推理额度”列会有“安心体验”图标) 账号处于安心体验模式下时,模型消耗完平台赠送的 50w token 免费推理额度时对应模型服务将自动暂停(“状态”列会有“服务暂停”图标),如需继续使用请关闭安心体验模式 在推理 API 接入入口处,也可查看安心体验模式状态(快捷 API 接入、在线推理、体验中心等) # API 调用错误码 安心体验模式下,超出免费额度时服务将自动暂停,API 调用返回错误码及信息如下: |HTTP 状态码 |错误类型 type |错误码 code |错误信息 message |含义 | |---|---|---|---|---| |429 |TooManyRequests |SetLimitExceeded |Your account [%s] has reached the set usage limit for the [%s] model, and the model service has been paused. To continue using this model, please visit the Model Activation page to adjust or close the "Safe Experience Mode". |当前账号 %s 对 %s 模型已达到设置的模型用量上限值,如需继续调用,请前往火山方舟控制台开通管理页修改模型用量上限值或关闭安心体验模式。 | \ | | | |Request ID: {id} | | # 常见问题解答(Q&A) ### Q:安心体验模式开启后,服务何时会暂停? A:当平台赠送的 50w token 用尽时,服务将自动暂停,您可在开通管理页面的模型列表中查看详情。 ### Q:关闭安心体验模式后,还能重新开启吗? A:由于安心体验模式仅针对新用户体验免费额度,在关闭后无法重新开启,请谨慎操作。 ### Q:免费额度用尽后,如何继续使用服务? A:您可以前往开通管理页面**关闭安心体验模式**,之后超出免费额度的部分将按实际 Token 消耗计费。 ### Q:为什么开通管理的模型列表中显示模型免费推理额度还有余量,但是服务已经被暂停了? A:如您开启了安心体验模式,模型服务会在您实际消耗完平台赠送的 50w token 免费推理额度时暂停,而开通管理页面“免费推理额度”为账号下对应模型免费资源包总量,且费用中心的数据更新时间与实际调用会存在小时级延迟;因此,安心体验模式下是否用完了免费额度请以 API 返回信息和模型列表的状态为准 ### Q:为什么我之前可以看到安心体验模式,但现在看不到对应入口了? A:安心体验模式是针对未开通过模型服务的新用户更方便体验免费额度设计的,在开通任一模型服务、且开通模型服务时未选择开启安心体验模式后,将不满足账户开启安心体验模式的条件 ### --- # 开通管理 Source: https://ark.volcengine.com/region:cn-beijing/docs/activation-management # 开通管理介绍 在 [开通管理页](https://ark.volcengine.com/region:cn-beijing/openManagement),您可以清晰了解当前商品的开通状态、免费额度消耗情况、模型用量上限使用情况、推理输入/输出定价、LoRA精调定价、全量精调定价、模型级别限流。可以在当前页面配置开通/关闭服务、查看模型的接入文档。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/c3054d3eaea3416980d3aaf1219fdd57~tplv-goo7wpa0wc-image.image) ## 开通模型服务 点击目标模型的**开通服务**按钮,在弹窗中勾选**全选**及**自动开通新增模型**。开启后,系统将自动为后续新增且支持自动开通的模型开通服务。 > Doubao-Seed-Evolving 模型不在自动开通范围内,如需使用,请在开通管理页手动开通模型服务。 ![activation_management_image1.png](https://arkdocs.tos-cn-beijing.volces.com/images/resources/activation_management_image1.png) ## 开通状态说明 |状态 |说明 | |---|---| |未开通 |暂未开通该模型服务,每个模型提供一定额度的免费调用额度,未开通前可使用免费额度,免费额度消耗完后可在 [开通管理](https://ark.volcengine.com/region:cn-beijing/openManagement?current=1&pageSize=10) 页中开通模型,并继续付费使用,开通服务后仍优先消耗剩余免费额度 | |已开通 |已正式开通模型服务 | |邀测中 |当前模型为邀测阶段,暂无法支持自助开通使用,如需正式开通使用的,请 [提交工单](https://console.volcengine.com/workorder/create?step=2&SubProductID=P00000165) 联系我们。 | ## 免费额度说明 每个模型提供一定额度的免费调用量,免费额度消耗完后可在 [开通管理](https://ark.volcengine.com/region:cn-beijing/openManagement?current=1&pageSize=10) 页中开通模型,并继续付费使用,开通服务后仍优先消耗剩余免费额度。 ## 安心体验模式说明 安心体验模式是针对**未开通过模型服务的新用户**更方便体验免费额度设计的,可以保障您免费体验模型推理服务,又不产生费用。在安心体验模式下,您调用推理 API 时仅消耗平台赠送的 50w token 免费额度,接近免费额度后服务将暂停,避免产生额外费用。详情请参见 [安心体验模式细则说明](/docs/free-tokens-only-mode)。 > **注意** > > 免费额度仅适用于抵扣模型推理消耗的 token(50w 免费 token),不能抵扣使用各类插件、知识库等产生的费用。 ## 用量上限设置 为控制模型调用量、减少超用扣费风险,火山方舟提供两级用量上限: |类型 |作用范围 |设置入口 | |---|---|---| |**模型用量上限** |账号下同一模型的所有推理接入点共享该上限。 |[开通管理页](https://ark.volcengine.com/region:cn-beijing/openManagement),为目标模型设置。 | |**接入点用量上限** |单个推理接入点的用量上限,避免多接入点抢占或单接入点异常影响业务。 |[推理接入点创建页](https://ark.volcengine.com/region:cn-beijing/endpoint/create) 或 接入点详情页。 | 从用量上限生效时间起计算(可在控制台查看生效时间),达到上限后将自动暂停对应模型服务/接入点服务。请注意评估服务中断的风险。错误码详情参见 [错误码](/docs/error-codes)。 > **注意** > > 为避免超用,当请求**预估**用量超过剩余可用额度时,将请求失败并触发用量上限错误,请注意确认剩余用量是否充足。 ### 模型用量上限 在 [开通管理页](https://ark.volcengine.com/region:cn-beijing/openManagement) 为目标模型设置模型用量上限值。账号下该模型累计用量(图片生成模型按张数,其他模型按 tokens)达到上限后,平台将**自动暂停该模型服务**。 > **说明** > > * 账号下同一模型的所有推理接入点**共享**该模型用量上限。 > * 控制台显示的免费额度数据存在小时级延迟。如希望通过模型用量上限来控制仅使用免费额度,建议您设置的上限值尽量小于控制台显示的免费额度剩余值。 > * 模型用量上限值仅可移除或者重新设置,账号下每个模型的模型用量上限设置需间隔至少 **2 小时**。 ### 接入点用量上限 在 [推理接入点创建页](https://ark.volcengine.com/region:cn-beijing/endpoint/create) 或接入点详情页,为单个推理接入点设置用量上限。当该接入点累计用量达到上限后,平台将**自动暂停该接入点服务**(同模型下其他接入点不受影响)。 > **说明** > > * 账号下所有接入点仍共享该模型用量上限;多个接入点用量上限值之和**可能超过**模型总用量上限值。 > * 即使本接入点未达到设置的接入点用量上限,也可能因其他接入点用量过高而触发**模型维度**的用量上限,建议根据业务优先级合理设置各接入点用量上限值。 > * 接入点用量上限值创建后重新更改需至少间隔 **2 小时**,请根据业务需求合理设置。 ### 功能限制 * **适用范围限制**:模型用量上限、接入点用量上限均仅适用于在线推理场景,不支持批量推理。 * **兼容性限制**: * 前缀缓存功能与**模型用量上限**、**接入点用量上限**均不可同时启用。 * **接入点用量上限** 与 **低延迟(Fast)推理** 互斥:开启其一后另一开关不可用。 * **模型类型限制**:语音、多模态向量化模型暂不支持设置用量上限。 * **付费模式限制**: * 仅支持为**已开通**且**按 token 后付费 / 按张数后付费**的模型或接入点设置用量上限。 * 若模型的推理接入点已购买 TPM 保障包或模型单元,暂不支持设置用量上限。 ## 模型级别限流说明 当前对每个账号下的每个基础模型设置了RPM(Requests Per Minute,每分钟请求数)及TPM(Tokens Per Minute,每分钟tokens数量)的调用限制。 > **说明** > > 1. 依赖同一个基础模型的所有模型推理接入点,共享同一个基础模型的模型级别限流。 > 2. 模型调用限制仅包含按照Token后付费的模型调用,不包含购买的模型单元。 > 3. 每一个模型推理接入点的限流可以在模型 [推理接入点](https://ark.volcengine.com/region:cn-beijing/endpoint) 的详情页进行自定义配置。 如需提升模型级别限流,可 [提交工单](https://console.volcengine.com/workorder/create?step=2&SubProductID=P00000165&FlowKey=EsSGZacbnCoLQiktFNCZ) 联系我们。 ## 定价说明 定价详见产品计费文档:[产品计费](/docs/model-pricing) --- # 控制台-推理安全审计 Source: https://ark.volcengine.com/region:cn-beijing/docs/console-inference-security-audit 推理安全审计页面旨在为用户提供全面的安全状态监控与行为审计功能,确保用户获取推理过程中的潜在风险。页面展示了数据安全状态、安全防护措施开启状态以及审计日志。 注意: * 只有状态为健康的接入点支持安全审计 * 能力支持:仅支持火山方舟平台发布的文生文对话模型和Doubao-vision系列图片理解模型(注:图片仅支持 Base64 图片加密, URL 图片无法加密)请求,仅支持 Chat Completions 中的单轮/多轮会话,支持流式/非流式,同步/异步接口。 # 入口 在推理接入点详情页面中,点击 **安全审计** tab,可查看对应接入点的安全审计页面。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/48644ef501704832b9c76a2d7cb9886a~tplv-goo7wpa0wc-image.image)
    # 安全监控看板 安全监控看板支持查看当前接入点 **风险监控** 和 **安全防护措施** 。 |**指标名称** |**含义** | |---|---| |**沙箱异常连接** |统计近30天内沙箱对外的异常网络连接次数,反映沙箱是否有主动向外发送数据行为 | |**沙箱异常登录** |统计近30天内通过远程或本地方式登录沙箱的行为次数,帮助识别潜在的窃取沙箱内数据的操作 | |**沙箱容器逃逸** |统计近30天内超越沙箱权限的执行命令数量,监控是否有未经允许的越权操作 | |**vArmor已拦截风险** |统计近30天内vArmor拦截的用户非法命令数量,体现vArmor拦截风险能力 | |**应用层会话加密** |显示最近7天内应用层会话加密是否开启的状态,以及开启后推理流量被加密的具体百分比 | |**网络层传输加密** |展示网络层传输加密是否开启的状态 | 上方的「风险监控看板」为您展示当前接入点的安全风险信息,包括沙箱异常连接、沙箱异常登录和沙箱容器逃逸的数量,帮助您直观了解安全风险状态。如果数字为0,代表30天内没有发生该项风险。 下方的「安全防护能力看板」为您展示平台的安全防护能力及开启状态,其中vArmor和网络层传输加密默认开启,应用层会话加密需要您按需根据 [指引](/docs/application-layer-encryption-for-inference-session-data) 自行开启。开启后,看板中可以显示这个接入点的推理流量开启应用层会话加密的比例。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/20e45f5052e948cc9ecedac9d57c4546~tplv-goo7wpa0wc-image.image)
    看板中风险项或安全能力名称旁带有“**i**”图标时,将鼠标悬停即可查看详细说明,帮您更好地理解对应的风险或安全能力。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/943f5e0272c94fbc8003ffd6fbc7160a~tplv-goo7wpa0wc-image.image)
    看板下方显示数据的更新时间,如遇数据无法获取,您可点击一旁的刷新按钮重新获取数据。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/008bc171b74c468184d3bd284bc695a1~tplv-goo7wpa0wc-image.image)
    通过点击风险项或vArmor已拦截风险等数字旁的按钮,您可以在右侧查看对应的审计日志信息,当鼠标悬停在日志上可了解更详细的日志信息。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/86d50a9aff954dc28d0db254646550ca~tplv-goo7wpa0wc-image.image) 如需查看更多审计日志,您可以点击下方的 **查看API文档** ,了解审计日志API的接口调用说明。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/a13782dd845b4c838eaf2ba96cf41a26~tplv-goo7wpa0wc-image.image)
    # 推理安全可视图 安全审计页面支持查看 **模型安全** 安全可视图,您可以通过页面右上角进行切换。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/d3a5bf77327c43bfa6c6d7f416709951~tplv-goo7wpa0wc-image.image)
    「**模型安全视图**」将在推理过程中实际应用的安全技术,通过可视化的图形模拟呈现,加深用户理解,包括网络全链路加密、可信安全沙箱和KMS加密等技术。同时,您可以查看登录接入点的IP及对应登录次数(限前三名),以及当前推理接入点最近一次访问KMS请求密钥的时间。如果显示暂无数据,代表30天内没有相应记录。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/6b51d1c91ce64dcfb4d3809dcf8293a2~tplv-goo7wpa0wc-image.image)
    点击接入点登录的详情按钮,您可以查看所有登录当前接入点的IP、登录次数以及登录用户账号等,帮助您分析是否存在未授权的登录行为。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/135e0a499eb94b6fa53293df223a6465~tplv-goo7wpa0wc-image.image)
    点击KMS访问的详情按钮,您可以查看访问KMS的详细日志,记录了访问的用户名、密钥环、密钥名、加/解密的对象,加/解密动作等。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/10cf0e66deb243f8af155422ae7ccff0~tplv-goo7wpa0wc-image.image)
    可视图中涉及的关键技术如下: **网络全链路加密**:在用户到安全沙箱之间建立端到端加密通信通道,防止用户数据在传输链路中被截获。 **可信安全沙箱**:借助沙箱身份认证机制、计算环境隔离、网络隔离等机制构建的安全计算环境,保证沙箱内外隔离,防止用户数据被窃取。 [**KMS加密**](https://docs.volcengine.com/docs/6476/71298?lang=zh):基于FUSE的透明加密文件系统,保证数据和模型从安全沙箱内存直写至分布存储时无缝加密。密钥由用户通过密钥管理系统(KMS)管理,并在安全沙箱内进行安全访问。 --- # 控制台-精调安全审计 Source: https://ark.volcengine.com/region:cn-beijing/docs/console-fine-tuning-security-audit 精调安全审计页面旨在为用户提供全面的安全状态监控与行为审计功能,确保用户获取精调过程中的潜在风险。页面展示了数据安全状态、安全防护措施以及审计日志。 # 入口 在模型精调的任务详情页面中,点击 **安全审计** tab,可查看对应精调任务的安全审计页面。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/34a6208b76f94c05856f2402fbafda85~tplv-goo7wpa0wc-image.image)
    # 安全监控看板 安全监控看板支持查看当前精调任务 **风险监控** 和 **安全防护措施** 。 |**指标名称** |**含义** | |---|---| |**沙箱异常连接** |统计近30天内沙箱对外的异常网络连接次数,反映沙箱是否有主动向外发送数据行为 | |**沙箱异常登录** |统计近30天内通过远程或本地方式登录沙箱的行为次数,帮助识别潜在的窃取沙箱内数据的操作 | |**沙箱容器逃逸** |统计近30天内超越沙箱权限的执行命令数量,监控是否有未经允许的越权操作 | |**vArmor已拦截风险** |统计近30天内vArmor拦截的用户非法命令数量,体现vArmor拦截风险能力 | |**网络层传输加密** |展示网络层传输加密是否开启的状态 | 上方的「风险监控看板」为您展示当前精调任务的安全风险信息,包括沙箱异常连接、沙箱异常登录和沙箱容器逃逸的数量,帮助您直观了解安全风险状态。如果数字为0,代表30天内没有发生该项风险。 下方的「安全防护能力看板」为您展示平台的安全防护能力及状态,平台默认为您开启vArmor防护能力和网络层传输加密,全方位保障精调任务的安全。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/cbd2a2c5b8204ad689113170117a20d4~tplv-goo7wpa0wc-image.image)
    看板中风险项或安全能力名称旁带有“**i**”图标时,将鼠标悬停即可查看详细说明,帮您更好地理解对应的风险或安全能力。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/cec9a9bf47c148319c4085692c57cd2f~tplv-goo7wpa0wc-image.image)
    看板下方显示数据的更新时间,如遇数据无法获取,您可点击一旁的刷新按钮重新获取数据。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/1963017da266440eb81e2fe463baf315~tplv-goo7wpa0wc-image.image)
    通过点击风险项或vArmor已拦截风险等数字旁的按钮,您可以在右侧查看对应的审计日志信息,当鼠标悬停在日志上可了解更详细的日志信息。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/0c7308f8052d4222a5893c7b166b593f~tplv-goo7wpa0wc-image.image) 如需查看更多审计日志,您可以点击下方的 **查看API文档** ,了解审计日志API的接口调用说明。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/448f137716704eef9c9dc653f8704e54~tplv-goo7wpa0wc-image.image)
    # 精调任务状态 在看板下方,您可以直观查看当前精调任务的状态,包括各个状态的完成时间和是否有异常,帮助您快速了解任务进度。 |**序号** |**任务状态** |**描述** | |---|---|---| |1 |预处理 |完成数据集的预预处理 | |2 |排队中 |任务处于调度队列中,等待资源分配 | |3 |部署中 |系统为任务分配执行资源,准备执行环境 | |4 |训练中 |任务进入训练阶段,执行模型的精调 | |5 |同步中 |训练完成后,系统同步任务的执行结果和数据 | |6 |完成 |任务顺利执行完成,标记为“完成”状态 |
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/b05a2f4315f145b6894c6169b531ac66~tplv-goo7wpa0wc-image.image)
    # 精调安全可视图 **模型精调任务可视图**清晰地展示了任务从预处理到执行完成过程中的关键安全事件,包括沙箱的启动/销毁、数据集的删除、KMS的访问等。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/5cda3a4d5b0b4e8d896d86b7d0fbecd3~tplv-goo7wpa0wc-image.image)
    如您已完成了数据的预处理,在页面中您可以直观地看到数据预处理沙箱的生命周期及预处理阶段的KMS访问记录。如果显示暂无数据,代表30天内没有对应数据。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/f3dc3c1294ff49bbad68c236c5979187~tplv-goo7wpa0wc-image.image)
    如您已完成了模型的精调任务,在页面中您可以直观地看到精调任务沙箱的生命周期、精调阶段的KMS访问记录及数据集的删除时间。如果显示暂无数据,代表30天内没有对应数据。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/e378929efa2944cbb867d72f1026962e~tplv-goo7wpa0wc-image.image)
    点击KMS访问的详情按钮,您可以查看访问KMS的详细日志,记录了访问的用户名、密钥环、密钥名、加/解密的对象,加/解密动作等详情。其中精调沙箱和预处理沙箱在日志最前方注明,方便您追踪不同阶段的KMS访问情况。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/1a591f3b2aca498aa4af5bf7e990145e~tplv-goo7wpa0wc-image.image)
    可视图中涉及的关键技术如下: **可信安全沙箱**:借助沙箱身份认证机制、计算环境隔离、网络隔离等机制构建的安全计算环境,保证沙箱内外隔离,防止用户数据被窃取 [**KMS加密**](https://docs.volcengine.com/docs/6476/71298?lang=zh):基于FUSE的透明加密文件系统,保证数据和模型从安全沙箱内存直写至分布存储时无缝加密。密钥由用户通过密钥管理系统(KMS)管理,并在安全沙箱内进行安全访问 --- # 控制台-推理接入点安全监控总览 Source: https://ark.volcengine.com/region:cn-beijing/docs/console-inference-endpoint-security-monitoring-overview 接入点安全监控页面为用户提供全局化的安全状态监控和便捷的风险总览,帮助用户快速识别并定位账号中所有接入点的潜在安全风险。页面包含**安全防护能力**、**安全风险事件**以及**存在风险的接入点**。 # 入口 从控制台左下角选择 **用量统计**,然后点击页面中间的 **接入点安全监控** tab,可查看这个账号下所有接入点的安全审计数据。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/cddab838b8254790947f21f1fbc30c3c~tplv-goo7wpa0wc-image.image)
    # 安全防护能力看板 上方的「安全防护能力看板」为您展示平台的安全防护能力及开启状态。其中,**vArmor容器沙箱**、**网络层传输加密**和**网络隔离**为默认开启。 |**指标名称** |**含义** | |---|---| |**应用层会话加密** |显示最近7天内未开启应用层会话加密的接入点数量及详情 | |**vArmor容器沙箱** |统计vArmor拦截的风险次数,确保任务执行过程中的安全威胁被防护 | |**网络层传输加密** |展示网络层传输加密是否开启的状态 | |**网络隔离** |通过任务级网络隔离策略,保障同一网络中的不同任务互相隔离,防止直接通信,提高网络安全性 |
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/73e2b634e8414d31a6546d1cbd5cd246~tplv-goo7wpa0wc-image.image)
    看板中显示账号内近7天未开启应用层会话加密的接入点数量,鼠标悬停可查看未开启加密的接入点详情,您可以根据 [指引](/docs/application-layer-encryption-for-inference-session-data) 前往对应接入点自行开启。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/e656458107f54ec38fdf75f05e355104~tplv-goo7wpa0wc-image.image)
    看板中安全能力名称旁带有“**i**”图标时,将鼠标悬停即可查看详细说明,帮您更好地理解对应的安全能力。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/5ae7c4e0623f4e71bca5b8d44ca93e26~tplv-goo7wpa0wc-image.image)
    # 安全风险事件看板
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/f7cc5ceb2f6b47a191904d57b6cafe88~tplv-goo7wpa0wc-image.image)
    安全风险事件模块分为 **「安全风险事件总览」** 和 **「安全风险事件趋势图」** |**指标名称** |**含义** | |---|---| |**沙箱异常连接** |统计近30天内沙箱对外的异常网络连接次数,反映沙箱是否有主动向外发送数据行为 | |**沙箱异常登录** |统计近30天内通过远程或本地方式登录沙箱的行为次数,帮助识别潜在的窃取沙箱内数据的操作 | |**沙箱容器逃逸** |统计近30天内超越沙箱权限的执行命令数量,监控是否有未经允许的越权操作 | 中间的 **「安全风险事件总览」** 为您展示指定时间内所有接入点的安全风险信息,包括沙箱异常连接、沙箱异常登录和沙箱容器逃逸的数量,帮助您直观了解所有接入点的安全风险状态。如果数字为0,代表指定时间内没有发生该项风险。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/f34d48811e044c768e25d56f08e22f9c~tplv-goo7wpa0wc-image.image)
    右侧的 **「安全风险事件趋势图」** 展示了所选时间范围内所有接入点的安全风险数量及变化趋势,包括**全部安全风险**、**沙箱异常连接**、**沙箱异常登录**和**沙箱容器逃逸**。默认显示所有趋势,您可以通过点击对应的趋势按钮隐藏或显示特定的风险趋势。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/7ef3d0c7f2734569ac6eb83d660361f0~tplv-goo7wpa0wc-image.image)
    # 存在风险的接入点看板 下方的 **「存在风险的接入点看板」** 展示了风险接入点总数及风险接入点详情。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/b421d324dda24fcaa261d7053940d88b~tplv-goo7wpa0wc-image.image)
    左侧的 **「风险接入点总数」** 为您展示指定时间内存在风险的接入点总数,如果数字为0,代表指定时间内所有接入点没有发生风险。 右侧的 **「风险接入点详情」** 为您展示指定时间内存在风险的接入点详情,**包括接入点名称、发生风险次数**,帮助您快速定位指定时间内发生风险的接入点。 点击查看详情,可跳转对应接入点的安全审计页面查看发生风险的详细信息。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/d716d368126847d59982116c9d29ad30~tplv-goo7wpa0wc-image.image)
    --- # 用量统计 Source: https://ark.volcengine.com/region:cn-beijing/docs/usage-statistics 在控制台左下角选择 [用量统计](https://ark.volcengine.com/region:cn-beijing/usageTracking),您可查看主账号下对应项目的调用量统计,也可按照在线推理、批量推理等维度分别统计这些维度的用量。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/7ba83bbb9b6d4c548f8fa6993803f2fe~tplv-goo7wpa0wc-image.image) 其中: * 在线推理支持按照天/小时粒度查看。 * 当前项目使用量:调用总tokens数、输入总tokens数、输出总tokens 数,并可按照预置推理接入点/自定义推理接入点进行拆分。 * 指定接入点的使用量:全部、模型输入、模型输出用量。 * 批量推理支持按照推理任务、推理接入点维度查看用量。 * 全部、推理任务、推理接入点。 * 接入点详情:全部、模型输入、模型输出 维度。 --- # 项目配置 Source: https://ark.volcengine.com/region:cn-beijing/docs/project-configuration 在控制台左下角选择 **系统设置** > **项目配置**,可使用配额管理和项目授权。 - 配额管理功能用于查看在线推理、批量推理、Coding Plan 等模块的配额值与使用情况,并支持将配额分配至特定项目独占使用。 - 项目授权功能支持授权当前项目访问知识库下的资源,帮助项目管理员进行资源与权限管控。 ## 配额管理 ### 账号维度配额 **账号维度配额**用于统一管理账号下所有项目的资源配额。具有权限(ArkFullAccess / ArkStandardGlobalAccess)的用户可进入方舟平台**账号全部资源**的页面,查看账号当前配额与使用情况,并以拖拽的形式进行项目配额分配。默认情况为所有项目共享账号配额,一旦某项目被分配了独占配额,该独占配额即成为该项目的硬性上限。 ![Image](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/746128385f07452f9da2dd506f8c272b~tplv-goo7wpa0wc-image.image) ![Image](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/f4d2ff70019445da8864ee2aa797ec9a~tplv-goo7wpa0wc-image.image) ### 项目维度配额 当选择特定项目时,将进入**项目维度配额**,项目成员可在此查看当前项目配额用量及共享配额中其他项目的使用情况。 ![Image](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/9455cc8b1fb448469e37be404b12bfea~tplv-goo7wpa0wc-image.image) ![Image](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/6000fb19be124f6ebc54bcfc3580bce2~tplv-goo7wpa0wc-image.image) ### 申请配额 您可在 **配额管理** 页签查看不同功能模块的数量配额,例如:推理接入点 Endpoint 的默认配额。 各功能的数量配额是主账号维度的,主账号下所有子账号共享该默认配额。如果默认配额无法满足业务需求,可单击 [申请配额](https://console.volcengine.com/quota/productList/ParameterList?ProviderCode=MaaS),前往配额中心,选择目标 **配额参数** 和 **地域**,申请提升配额。 ## 项目授权 ### 用户对象存储(TOS)授权 #### 步骤一:进入项目授权页面 登录方舟控制台。在控制台左下角选择 **系统设置** > **项目配置** > **项目授权**,然后单击 **对象存储** 页签。页面展示已授权的 TOS 对象列表,每个 TOS 对象默认未授权,右侧显示 **添加授权** 按钮。 ![tos-authorization-1.png](https://arkdocs.tos-cn-beijing.volces.com/flowcharts/resources/tos-authorization-1.png) #### 步骤二:发起授权 点击 **添加授权** 按钮,可以查看 TOS 对象列表。搜索目标 TOS 对象名称,并选中,单击右下角的**确认**。 > * 存储目标的 Bucket 必须在华北2(cn-beijing)Region。 > * API Key 所属 project 必须与 TOS Bucket 的 project 一致。 ![tos-authorization-2.png](https://arkdocs.tos-cn-beijing.volces.com/flowcharts/resources/tos-authorization-2.png) 在确认授权弹窗内单击 **授权** 按钮。 ![tos-authorization-3.png](https://arkdocs.tos-cn-beijing.volces.com/flowcharts/resources/tos-authorization-3.png) #### 步骤三:完成授权 授权完成后,页面新增已授权的 TOS 对象名称,可通过 **取消授权** 撤回。该项目的 API Key 可在 Files API 请求中使用 `tos` 参数访问已授权对象。 ![tos-authorization-4.png](https://arkdocs.tos-cn-beijing.volces.com/flowcharts/resources/tos-authorization-4.png) ### 知识库授权 在控制台左下角选择相应的项目,然后进入 **系统设置** > **项目配置** > **项目授权**,单击 **授权**,方舟服务就可以访问并读取该项目下的所有知识库。 ## 权限控制 * 配额管理:主账号默认显示账号下全部资源的配额情况,子账号默认显示默认项目(default)配额情况。 * 项目授权:主账号默认显示default(默认项目)的授权情况,子账号默认不具备授权权限。 权限控制通过 [ IAM 策略](/docs/use-iam-to-manage-permissions) 实现,仅具备相应权限的用户方可执行配额管理及项目授权相关操作。推荐的权限策略如下: |策略 |适用人员 |说明 | |---|---|---| |**ArkFullAccess / ArkStandardGlobalAccess** |平台管理员 / 项目负责人 |拥有账号及所有资源的完整管理权限,可执行配额管理及项目授权相关操作。 | |**ArkReadOnlyAccess** |只读角色 |仅具备只读权限,不允许进行任何配额管理及项目授权操作。 | 其中如果需要拥有知识库授权权限,需要在创建的策略中加入 Action `vikingdb:GetCollectionBriefInfo`和`vikingdb:SearchKnowledge`。 --- # 网络配置 Source: https://ark.volcengine.com/region:cn-beijing/docs/network-configuration # 1.功能介绍 本文介绍如何通过网络配置实现私网访问方舟资源服务的具体操作步骤及连通性测试方法。私有网络(Virtual Private Cloud,简称VPC)为云上资源构建隔离的、自主配置的虚拟网络环境。用户可以在私有网络中自定义IP地址段、安全组、路由策略等网络特性,简单高效安全地管理云上资源。私网连接(PrivateLink)则可以通过终端节点和终端节点服务建立私密的网络连接,实现不同VPC对服务资源的私网访问。私网访问比起公网访问具有更高的安全性、服务稳定性以及更低的访问流量成本,适用于需要高安全性、低延迟访问方舟资源的企业业务场景,例如金融行业数据查询、企业内部系统集成等,方舟为您提供了简便的通过私网访问方舟资源服务的功能。 # 2.使用流程 ## 2.1 前置流程 您可以在火山方舟的网络配置页面进行私有网络配置,选择已有的私有网络和子网用于访问火山方舟上的资源和服务。若您还没有私有网络和子网,请参见 [创建私有网络及子网](https://docs.volcengine.com/docs/6401/67813?lang=zh#%E6%AD%A5%E9%AA%A4%E4%B8%80%EF%BC%9A%E5%88%9B%E5%BB%BA%E7%A7%81%E6%9C%89%E7%BD%91%E7%BB%9C%E5%8F%8A%E5%AD%90%E7%BD%91) 完成创建。使用私有网络(VPC)访问火山方舟资源和服务前您需要完成2步配置:开通 PrivateLink 服务,私有网络 VPC 配置。 ![](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_1d5df728687e63fde46b8413e6375018.png) ### 第1步:开通PrivateLink服务 PrivateLink 服务一般情况下默认为已开通状态,若显示未开通,可点击网络配置页面中的**前往开通**按钮,跳转至PrivateLink产品的跨服务授权页面,点击**立即授权**进行开通配置。 ![](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_3b466ade295b061c76c88e91d0188103.png) ### 第2步:私有网络VPC配置 当PrivateLink服务开通后,‘等待配置’按钮变为可点击状态。点击网络配置页面的**等待配置**按钮,前往配置 VPC。您需要在私有网络 VPC 配置页面选择您账号下需要连接的私有网络 VPC 以及对应的可用区及子网(请选择与方舟资源所在区域(如cn-beijing)一致的可用区及该可用区下的子网,确保网络连通性),选择需要连接的VPC及子网是为了让该VPC下的资源通过私网连接访问方舟服务,并点击**确定**。网络配置页面会出现您所创建的私网记录。方舟已经为您关联了 default 安全组,且为您自动创建好了终端节点与终端节点服务,通过该 VPC 即可实现无需修改访问地址直通方舟。 ![](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_d2099a0d5e533eb5611c46fd1f35b5be.png) ![](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_164385df5c53fef5e4b8835b970d0910.jpg) ## 2.2 测试连通性 通过上述步骤创建的私网连接可以实现在对应 VPC 下访问方舟的资源与服务。按照下述步骤可以测试连通性: 1. 您终端节点的域名为: [ark.cn-beijing.volces.com](https://ark.cn-beijing.volces.com/) 2. 远程登录您 VPC 中的云服务器,具体操作请参考 [登录Linux实例](https://docs.volcengine.com/docs/6396/67747?lang=zh)。 3. 执行以下命令,测试网络连通性。 ```Bash curl https://ark.cn-beijing.volces.com/ping \ -H "Authorization: Bearer $ARK_API_KEY" ``` 其中ARK_API_KEY 是方舟模型推理 API 的安全凭证,在 [API Key 管理](https://ark.volcengine.com/region:cn-beijing/apikey) 创建并获取,作为推理接入点的访问密钥。 返回结果显示后端服务页面内容,表明网络正常连通,您可以通过该 VPC 正常使用方舟提供的 API 和 SDK 来访问方舟的资源与服务,详细的调用方式可查看[安装及升级 SDK](/docs/install-and-upgrade-sdk)。通过 VPC 访问方舟资源产生的费用将按照 PrivateLink私网连接产品的标准收费,具体价格详见 [计费说明](https://docs.volcengine.com/docs/6980/155785?lang=zh)。 --- # Token 计算器 Source: https://ark.volcengine.com/region:cn-beijing/docs/token-calculator Token 计算器是一款在线工具,可以为平台上的文本、多模态模型精确预估 Token 消耗。它能帮助你在正式调用模型 API 前,清晰地了解各项任务的资源占用情况,从而有效评估和管理成本。本文将详细介绍 Token 计算器的各项功能,并指导你如何为不同类型的模型计算 Token。 ## 关键特性 * **独立的访问入口**:在控制台左下角选择 **系统设置** > [Token 计算器](https://ark.volcengine.com/region:cn-beijing/tokenCalculator?projectName=default),可快速进入页面。 * **广泛的模型支持**:能够根据所选模型,包括文本生成模型、图片内容理解模型(Visual Language Model, VLM)等自动应用对应的分词器和计算逻辑,确保计算结果的准确性。 * **优化的交互体验**:整体页面布局和交互流程经过优化,提升了操作的流畅性和易用性。 ## 操作步骤 ### 计算文本模型 Token 本节介绍如何为纯文本模型计算 Token。 1. 在 **Token 计算器** 页面,通过顶部的分类筛选器或直接在模型列表中,选择你要计算的文本模型。 2. 在 **文本输入** 输入框中,输入或粘贴待计算的文本内容。 3. 在页面右侧的计算结果区域,查看文本的 Token 消耗,以及内容分词情况。 ### 计算多模态模型 (VLM) Token 本节介绍如何为多模态模型(VLM)计算文本和图片的混合 Token。 1. 在模型选择区域,选择一级分类**图片内容理解**,然后选择具体的 VLM 模型。 2. 根据你的需求,输入图片及文本信息。 |配置项 |说明 | |---|---| |**图片输入** |必选。你可以通过以下任一方式提供图片信息: | \ | | | \ | |* **上传图片**:单击上传组件,选择本地图片。系统将自动读取并填充图片的宽度和高度。 | \ | |* **手动填写**:直接在 **图像宽度** 和 **图像高度** 输入框中填写图片的尺寸信息。 | |**文本输入** |可选。在 **分析文本** 输入框中输入与图片相关的文本内容。 | |**图片理解精度** |特定模型需要配置。 | > **说明**:你可以随时修改已上传的图片或手动填写的宽高,系统会基于最新输入进行计算。 3. 在右侧区域查看分项计算结果,包括 **图片 Tokens**、**文本 Tokens** 和 **Total Tokens**(总消耗)。 --- # 安全管理总览 Source: https://ark.volcengine.com/region:cn-beijing/docs/security-management-overview [安全管理](https://ark.volcengine.com/region:cn-beijing/security) 是火山方舟平台的核心安全能力入口,为模型推理、精调等全生命周期场景提供**全周期安全可信保障**,覆盖数据传输安全、容器运行隔离、内容合规审核、密钥全生命周期管理等维度,帮助用户实时感知安全状态、精准管控安全风险,保障业务数据与内容的安全性、完整性与合规性。 > **说明** > > 基于 [火山方舟互信计算架构](/docs/volcengine-ark-confidential-computing-whitepaper),方舟在互信服务安全沙箱内置了监控 [Linux System Call](https://man7.org/linux/man-pages/man2/syscalls.2.html) 组件提供审计数据,展示对用户模型服务的连接和异常进程监控,保证用户的数据不被意料之外的操作获取 > 依靠监控 [Linux System Call:Connect](https://man7.org/linux/man-pages/man2/connect.2.html) 信号,连接清单展示容器内主动发起连接(包含向内和向外连接)的请求情况,暂无详细连接数据量。 > 依靠监控 [Linux System Call:Execve](https://man7.org/linux/man-pages/man2/execve.2.html) 信号,异常进程清单展示和SSH/WebShell相关的登录信息。 ## 功能模块总览 安全管理模块包含 3 个核心功能标签页,各模块职责如下: |模块名称 |核心功能 | |---|---| |**安全监控** |实时监控安全防护状态、风险事件、风险趋势及风险接入点,直观呈现平台安全态势 | |**内容安全** |对模型精调数据、推理输出内容进行合规检测与审计,防范敏感信息泄露、违规内容生成等风险 | |**密钥管理** |提供加密密钥的全生命周期管理(创建 / 轮换 / 授权 / 销毁),保障数据加密密钥的安全性与可控性 | ## 安全监控 [安全监控](https://ark.volcengine.com/region:cn-beijing/security&tab=monitor) 是安全管理的核心可视化模块,支持用户自定义时间范围,多维度查看安全状态与风险数据。 展示平台已部署的 4 项核心安全防护措施及运行状态,帮助用户确认安全基线是否生效。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/7444897864b8472f8d1a2f7e1b6f58eb~tplv-goo7wpa0wc-image.image) ### 安全防护能力 |防护能力 |核心功能 | |---|---| |**应用层会话加密** |对客户端与模型服务的会话链路加密,防范会话劫持、数据窃听,保障通信安全 | |**vArmor 容器沙箱** |基于 vArmor 技术实现容器资源隔离与权限限制,拦截容器逃逸、权限滥用等风险 | |**网络层传输加密** |对网络层数据传输采用 TLS/SSL 加密,防止数据窃取、篡改,保障传输完整性 | |**网络隔离** |通过网络策略 / 安全组实现容器间、容器与外部网络的访问限制,缩小攻击面 | > 注:未开启的防护能力(如应用层会话加密)可点击入口跳转至配置页,完成接入点的安全策略部署。 ### 安全风险事件 实时展示当前检测到的安全风险事件类型与数量,帮助用户快速感知风险态势: * **事件类型**: 1. **沙箱异常连接**:检测沙箱容器的异常网络行为(如外联未知 IP、非预期端口访问)。 2. **沙箱异常登录**:检测沙箱容器的非授权登录尝试(如暴力破解、异常账号登录)。 3. **沙箱容器逃逸**:检测容器突破隔离机制、访问宿主机资源的逃逸行为。 * **状态说明**:若显示「暂无风险」,表示当前时间范围内未检测到上述类型的安全事件。 ### 安全风险趋势 以折线图形式可视化展示指定时间内各类风险的**数量变化趋势**,辅助用户分析风险演变规律: * 包括事件:安全风险、沙箱异常连接、沙箱异常登录、沙箱容器逃逸。 * **交互**:鼠标悬浮可查看具体时间点的风险数量,支持趋势对比。 ### 存在风险的接入点 统计并展示存在安全风险的接入点详情,支持用户定位风险源并执行处置: * **状态说明**:若列表显示「暂无风险」,表示当前时间范围内无存在安全风险的接入点。 ## 内容安全 [内容安全](https://ark.volcengine.com/region:cn-beijing/security&tab=monitor) 帮助企业自动识别并过滤用户在调用推理点过程中的涉敏、涉黄等风险,从而保障客户业务生态的健康与安全,详细介绍见[内容安全护栏](/docs/content-safety-guardrails)。 ## 密钥管理 [密钥管理](https://ark.volcengine.com/region:cn-beijing/security&tab=contentSecurity) 是平台为**模型精调、推理等全生命周期场景**提供的加密密钥全生命周期管控能力,支持平台默认密钥、自定义密钥、外部托管密钥三种类型,保障数据加密的安全性、可控性与合规性,同时提供完整审计日志与生命周期管理,满足数据安全与监管要求。 ### **创建入口** * **托管外部密钥**:用于对接用户自有密钥存储服务(如 KMS),实现外部密钥的平台化托管,满足企业级密钥管理需求。 * **自定义密钥**:支持用户在平台内自主创建加密密钥,适配轻量化业务场景。 ### **密钥列表字段** |字段名称 |字段说明 | |---|---| |**密钥 TRN 及别名** |密钥的唯一资源标识(TRN)与用户自定义别名,是密钥的核心身份标识,用于精准定位与调用 | |**外部密钥存储名称** |仅外部托管密钥显示关联的外部密钥存储服务名称;平台默认 / 自定义密钥此字段为`--` | |**连通性** |密钥与平台的服务连接状态: | \ | | | \ | |* `正常运行`:密钥服务可正常访问,可用于加密场景 | \ | |* `密钥失效`:密钥服务连接异常、认证失效或密钥已过期 | |**类型** |密钥的来源分类: | \ | | | \ | |* `平台默认密钥`:平台预创建的通用加密密钥,默认用于无特殊密钥配置的场景 | \ | |* `外部托管密钥`:用户托管的外部 KMS 密钥,满足企业级密钥管控需求 | \ | |* `自定义密钥`:用户在平台内自主创建的加密密钥 | |**描述** |用户对密钥的业务用途备注,便于识别与管理 | |**精调任务** |关联使用该密钥的精调任务数量,`999+`表示关联任务数超过 999 | |**创建时间** |密钥的创建时间戳,精确到分钟 | |**更新时间** |密钥最后一次配置变更(如状态切换、描述修改)的时间戳 | |**启用状态** |密钥的可用性状态: | \ | | | \ | |* `已启用`:可正常用于模型精调、数据加密等场景 | \ | |* `不可用`:未启用或配置异常,无法参与加密业务 | |**操作** |核心管理操作: | \ | | | \ | |* `查看日志`:查看密钥全生命周期操作审计日志(创建、使用、变更、删除等) | \ | |* `设置删除时间`:配置密钥的自动删除时间,实现生命周期自动化管理 | --- # 内容安全护栏 Source: https://ark.volcengine.com/region:cn-beijing/docs/content-safety-guardrails 为了保障大模型输入输出的内容安全合规,火山方舟平台提供内容安全护栏功能,在豆包模型原生安全能力之上,能够帮助企业自动识别并过滤用户在调用推理点过程中的涉敏、涉黄等风险,从而保障客户业务生态的健康与安全。 # 护栏方案对比 根据模型不同,内容安全护栏包含多种方案供您选择。 | | | | |模型类型 |默认方案 |自定义方案 | |---|---|---| | | | | |豆包模型 |火山方舟默认的内容安全机制,广泛覆盖内容安全通用需求,保障底线安全。 |火山方舟原生支持调用 [火山引擎内容风险识别](https://www.volcengine.com/product/business-security) 服务,识别多模态内容中的潜在合规风险并支持定制策略,满足企业对于内容审核的场景化需求。 | | | |^^| \ |三方/开源/精调模型 |火山方舟为三方/开源/精调模型额外提供的基础过滤词。 | | > **说明** > > 历史部分模型支持的 “基础” 内容安全方案,因已不适配当前风险场景,计划下线。若您有推理点已选择该方案,可通过**安全管理** - **内容安全**统一查询,建议尽快前往**编辑推理点** - **编辑内容安全护栏**切换为 “默认” 方案。 # 配置自定义方案 ## 方案介绍 [**火山引擎内容风险识别**](https://www.volcengine.com/product/business-security)(以下简称“[**火山风控**](https://www.volcengine.com/product/business-security)”)的主要功能包括: * **多维度风险识别**:支持从涉黄、涉敏、违禁、谩骂、联系方式、广告、诈骗等多个维度,对用户输入的对话内容以及模型的输出内容进行精准识别和拦截,确保内容符合合规要求。 * **自定义词**:支持企业根据自身业务特点,维护自定义的敏感词库,提升风险识别的准确性。 ## 使用限制 * 自定义护栏仅支持拦截 **推理API** 的内容,其他渠道暂不支持。 * 自定义护栏当前**仅支持生图、生视频、生3D模型**,生文模型未来支持。 * **火山方舟**、[火山引擎内容风险识别](https://www.volcengine.com/product/business-security) 和 [ TOS 对象存储](https://www.volcengine.com/product/TOS) 需要在同一个火山引擎主账号下。 ## 配置步骤 ### 步骤一:在火山风控平台配置内容审核策略 请参考文档 [火山引擎-内容风险识别-产品接入操作手册](https://bytedance.larkoffice.com/docx/doxcnJHMZNxNMYlZpDEvwSYQYKh) 进行配置。配置过程中如有问题,请联系**火山风控**工作人员。 ### 步骤二:在火山方舟平台配置推理点审核策略 查看/编辑内容安全护栏入口: * 在线推理-创建自定义推理点 * 在线推理-编辑预置/自定义推理点 * 安全管理-内容安全 在选择内容安全护栏-自定义方案时,显示配置安全策略列表: * 审核场景:方舟将自动根据当前模型的模态匹配需要审核的风险识别类型,如文本、图片、视频。 * 风险识别类型:对应 [**火山风控控制台**](https://console.volcengine.com/rmc/main/product/overview) 的文本风险识别、图片风险识别等服务。 * 场景(biztype):方舟将自动匹配当前账号的**火山风控**产品权限、服务权限、appid、biztype数据,请选择当前审核场景对应的appid以及biztype。appid以及biztype可前往 [**火山风控控制台**](https://console.volcengine.com/rmc/main/product/overview) 查询。 阅读并确认《[**自定义内容审核机制合规承诺函**](/docs/commitment-for-custom-content-moderation-mechanism)》,完成策略配置。 > **说明** > > 由于策略需要等待生效,请在确认后同步**火山风控**工作人员进行详细的策略配置,并建议您在测试环境完整测试效果后再正式应用于生产环境。 ### 步骤三:验证策略生效 完成配置后,通过以下步骤验证内容安全策略是否生效。 1. 通过 API 调用推理点,尝试输入包含敏感词或违规内容的信息,如果模型 response 中错误码**code** 包含 **Detection**,则表示内容安全策略生效。 * 错误码详情:[错误码](/docs/error-codes) * 错误码含义: * ARKRequest ID:方舟的 reqid。 * CSDRequestId:火山风控的 reqid。 * CSDcode:火山风控返回的 code,对应火山风控错误码。 * Label:火山风控返回的一级标签。 * SubLabel:火山风控返回的二级标签。 * CSDmessage:火山风控返回的 message。 * 返回示例:输入文本被拦截的返回示例如下。 ```Bash # API请求 curl https://ark-stg.cn-beijing.volces.com/api/v3/images/generations \ -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ARK_API_KEY" \ -d '{ "model": "ep-202512***11216-s***8", "prompt": "***", "sequential_image_generation": "disabled", "response_format": "url", "size": "2K", "stream": false, "watermark": true }' # 错误响应 { "error": { "code": "InputTextRiskDetection", "message": "The request could not be processed because the input text includes sensitive content that violates ContentSecurityDetection. ARKRequest ID:021765****13792227e****0937189e****51ab5db4627482fe3e;CSDRequestId:2025120****01316****E02E****00F1E7;Label:103,103;SubLabel:103001,103011 Request id: 02176520001379****e2a160937189e7c6751ab5db4627482fe3e", "param": "", "type": "" } } ``` * 详细测试方式:请咨询火山风控工作人员。 2. 前往 [**火山风控控制台**](https://console.volcengine.com/rmc/main/product/overview),在左侧导航栏选择对应的场景,如**文本风险识别** > **日志查询**,查看拦截的消息日志。 # 费用说明 使用**火山引擎内容风险识别服务**会涉及如下两项费用,这些费用将自动从你的火山引擎账户余额中扣款。 * 内容风险识别产品相关费用:包括文本风险识别和图片风险识别等,具体收费标准请参见购买内容风险识别套餐时页面的费用说明。 * TOS 对象存储的存储容量费用:具体收费标准可参考 [对象存储计费概述](https://docs.volcengine.com/docs/6349/78455?lang=zh)。 --- # 火山方舟大模型服务安全白皮书 Source: https://ark.volcengine.com/region:cn-beijing/docs/volcengine-ark-model-service-security-whitepaper 大模型技术飞速发展过程中,数据隐私泄露、对抗攻击、模型滥用、伦理偏差等安全隐患暴露,威胁用户权益与企业利益,更制约行业健康发展。秉持 “负责任的 MaaS” 理念,火山方舟持续升级模型、平台、应用多维度安全能力,以全栈防护体系护航企业级 AI 应用安全落地,助力 AI 生态健康繁荣。 本白皮书将体系化阐述火山方舟的安全落地实践,展示“全球合规、原生安全、客户信任”的多维度安全可信保障体系,分享如何保护用户数据安全,向有计划、正在落地 AI 的企业提供参考。 # 白皮书下载 《[火山方舟大模型服务安全白皮书](https://developer.volcengine.com/resource/7584381573106303012)》 # 阅读全文 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/55ec1aee17cc40cfadedb6187e4e18a2~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/0ca63e37a1724388876ca3084211847b~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/ed27e0a13c7e43d6b1d9ee2893d66d15~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/c9bf6e4174de45a08b8b4b39a770eef1~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/c6a599970d314762bdc9c1a752345629~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/28d295392f82448a943f80f47be40ca2~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/b0f11f143a944d3cb72b0df071f23441~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/59d9a21cdc524774b7b4a957efccc169~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/926bb27d99bf409ca8209cdab9762fac~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/b92a7c499a02485cba8ab25b9a5c565c~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/b9c30078cf5448fc94f6a1e0588a1b6a~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/c56a7c88a2254c1ab8976c6019560967~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/b846770fd32f490f8d2e853210f07fdd~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/a369b10bdbd74ec390393813895790e3~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/c91a470edd534ff6bfd7dca9ff2678ae~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/6b961f33d0f046a2b7463ab1461c127d~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/d817c7d005be477390030b31f099d3f0~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/370535393183436a86ee1876e8cff23c~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/00b5bf41dc934ccbb7a5ac806ffff4b7~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/6dd2c032532f486ab21be82085c05b96~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/ae6228b5144c483ca12bf13c82e32e1d~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/3621e4a0cc9340a3897312301e3bca7f~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/3ce047f8a77e4d4b80be44217845c6f2~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/209467af3a854c8db088366ed295297c~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/f925ffa824274e58b19f9e934bb2d928~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/2c68d817cb4f440b807bf7eab29eafa0~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/6a90bdbf75594927a8e5724f32bcb1d9~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/2c21434ccb8a4032800c503d71291d8b~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/9bad4ec8ab324159b0d4bea349bae3a4~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/fd630bcec3e14c189cfdd145abd0281d~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/34d5b70ee7fb40a98186c78f648161dd~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/ea13ebb0aa394118a4b5efc0ad58413f~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/3618311bc08e4e3f932784f37b05d4ab~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/50daa3642c7f484ea6a9bd55ba6c7b18~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/e6280fd7136d418299320246d46f895f~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/1bd8bbb5eed54c8bbca5f909323ca5c5~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/cd601b88f88d48699ecb03a97109b930~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/de33a48e00564e64b4e6804f0ed70900~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/da4456b6ebff41a4b2b4ec22ff1766f4~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/095bcaba0ac84cb1b11beaf42ea0a1fe~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/faccae460a1f4c0b98a280ad274c9118~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/01ac76caeb0f48fabf325917cd41a79a~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/dcd3c7c7da414a1a9c595a232cb121dd~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/a5952a1ff840456f8586f1cc77369af7~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/11871d6818ec48bb8a7e4540aed8f60a~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/149f39f4af3e439a8de903e1d5d3945e~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/9fa26e5448654f8d90bc8ed1b18f39e9~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/9cba795d45234e5c910538a2870893d1~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/25c2f3b8cbea4ff1b76e6ff0b407015c~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/4684ce728343460482632227aa9bc4db~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/95f33fcab31c422bae33f008b57c8d59~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/b60ea846cb964cd8aedebc38906bdd0c~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/add1f2dad0e34a488a553a66c520dafd~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/960e5ca425ae4120bad765416d6fdfc0~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/9db507180b6848b38359758622f314b4~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/a9634510430f477bb95a5200b9f2ab1d~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/f3fb19187b1645bd9b9595d5579cb8a3~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/c4d2c5888af347a4b9f9c299a86ff48b~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/22100185d94e455dbccbc211ca75e126~tplv-goo7wpa0wc-image.image) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/3566a61f75bd462bb9d6b713d6441f34~tplv-goo7wpa0wc-image.image) --- # 火山方舟互信计算架构白皮书 Source: https://ark.volcengine.com/region:cn-beijing/docs/volcengine-ark-confidential-computing-whitepaper 火山方舟互信计算架构白皮书见 [火山方舟互信计算架构白皮书](https://docs.volcengine.com/docs/83458/1108217?lang=zh) --- # 推理会话数据应用层加密方案 Source: https://ark.volcengine.com/region:cn-beijing/docs/application-layer-encryption-for-inference-session-data > **注意** > > 您调用 SDK 时,仅需增加行代码,即可免费使用本功能,代码示例请参见[加密数据](/docs/sdk-common-examples#23274b89)。 **为了保证推理会话数据的传输安全**,在默认的网络层加密方案基础上,方舟安全团队为**在线推理的会话数据**提供了**端到端应用层加密**方案,支持用户通过 SDK 在本地对推理会话的内容进行加密。 为什么需要网络层和应用层的双层加密?请看这个形象的比喻:网络层的加密就像给文件加了一层保险盒,而应用层加密就如同再给保险盒上了一把锁,双重保险确保即便有人拦截了这个文件,也无从打开它。 ## 方案介绍 会话数据应用层加密的具体流程,如下面的视频所示: [视频](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/7bf6cbf4e1cd4c4c82d6a2a21dddfec6) 用户可以依靠 SDK 在本地私域对推理会话内容进行加密,会话密文安全传输至沙箱后,仅在安全沙箱内存中解密成明文,用于模型推理。安全沙箱内的模型推理结束后,生成的推理结果会由安全沙箱加密,以密文的形式从安全沙箱传输至用户私域,最终由用户通过 SDK 在本地解密,获取明文推理结果。 ## 使用说明 推理会话数据应用层加密功能集成在火山 SDK 中,**仅需增加几行代码,即可免费使用该功能**,示例代码请参见[加密数据](/docs/sdk-common-examples#23274b89)。 > **说明** > > * 语言情况:目前仅支持 Python SDK、Java SDK。 > * 版本要求: > > * Python SDK:需要保证 SDK 版本 `volcengine-python-sdk` `1.0.104`及以上。参考[升级 Python SDK](/docs/install-and-upgrade-sdk#d6b883b8)获得 SDK 的最新版本。 > > * Java SDK:需要保证 SDK 版本 `volcengine-java-sdk-ark-runtime` `0.2.50`及以上。参考[升级 Java SDK](/docs/install-and-upgrade-sdk#4ab4182d)获得 SDK 的最新版本。 > * 三方支持:不支持三方 SDK ,包括 OpenAI SDK。 > * 能力支持:仅支持火山方舟平台发布的文生文对话模型和 Doubao-vision 系列图片理解模型(注:图片仅支持 Base64 图片加密, URL 图片无法加密)请求,仅支持 Chat Completions 中的单轮/多轮会话,支持流式/非流式,同步/异步调用。 |SDK 语言 |功能说明 |上线时间 | |---|---|---| |Python |1.0.104 正式支持应用层端到端加密能力 |2024-10-10 | |Python |1.0.111 更新 Cryptography 依赖版本至最新 |2024-11-29 | |Python |1.0.117 更新支持 Doubao-vision 系列模型请求 |2024-12-23 | |Python |1.0.119 支持 API-Key 请求证书,本地缓存证书 |2025-01-02 | |Python |1.0.121-125 暂不支持 AK/SK 获取证书 |2025-01-16 | |Python |1.0.126 优先使用 API-Key 获取证书 |2025-02-27 | |Python |3.0.3 支持 batch_chat API |2025-05-22 | |Python |3.0.15 Cryptography 最低支持版本为 42.0.0,对于chat api风控情况输出导致的解密 exception 的修复 |2025-06-19 | |Python |4.0.5 修复并发情况下本地证书目录冲突异常;修复会话加密情况下对 Chat 数据的内存修改 |2025-07-10 | |Python |4.0.13 由于 [CVE-2024-12797](https://github.com/advisories/GHSA-79v4-65xg-pq4g),火山SDK没有使用受 CVE 影响的 feature,更新 Cryptography 依赖版本最低为 44.0.1 |2025-08-22 | |Python |4.0.16 缓存目录更新为当前用户的目录 |2025-09-04 | |Python |4.0.22 解决部分非流式请求结果解密失败问题 |2025-09-25 | |Python |4.0.25 解决部分非流式请求结果解密失败问题,TKS 加解密支持; batch chat加密功能暂时存在问题 |2025-10-16 | |Python |4.0.29 解决非流式请求结果解密失败问题 / batch chat 加密请求失败问题 |2025-10-27 | |Python |4.0.30 校验本地的数据是否是base64 / http / https URL |2025-10-30 | |Java |0.2.45 支持 API-Key 请求 Chat 接口进行加解密请求 |2025-11-13 | |Java |0.2.50 修复普通聊天请求对于 bouncycastle 软件包的依赖问题 |2025-12-04 | ## 原理说明 用 Alice 和 Bob 分别代表客户 SDK 和推理模型所在的安全沙箱容器,基本原理是利用 [ECIES](https://cryptobook.nakov.com/asymmetric-key-ciphers/ecies-public-key-encryption) 实现一个 0-RTT 协议(即让客户端在第一条消息中就发送加密的 Payload 的协议),协议如下: 1. Alice 通过公开渠道获得 Bob 的公钥`PK[Bob]`,该公钥须是椭圆曲线公钥。 2. Alice 生成随机数`r` ,通过和椭圆曲线基点相乘获得`R = r × G`,`R`为会话密钥的密文。会话密钥`S = r × PK[Bob]`,使用会话密钥`S`衍生密钥加密明文得到会话密文`Payload`。将`(R, Payload)`发送给 Bob。 3. Bob 收到`R`后利用自己的私钥解密会话密钥`SK[Bob] × R = SK[Bob] × r × G = S`,使用`S`衍生密钥解密密文`Payload`得到会话明文。 ## 验证说明 #### 验证消息加密 动作:SDK 调用时,会对其中的 `content` 字段进行加密并使用 base64 编码。 验证:通过抓包工具的 `HTTPS` 抓包,查看请求体 `body` 中的会话数据是否是密文。 #### 验证证书获取 动作:使用 AK/SK 初始化客户端 SDK ,每个推理接入点第一次请求会话数据应用层加密时,会调用 GetEndpointCertificate 接口,用于获取该接入点对应的证书。 验证:可以在 [云审计](https://console.volcengine.com/cloudtrail/event) 查看 GetEndpointCertificate 接口的调用日志。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/02c8496d850142238e0553a812024388~tplv-goo7wpa0wc-image.image)
    ## **证书说明** 该证书仅适用于火山方舟平台发布的文生文对话模型和 Doubao-vision 系列图片理解模型([模型发布公告](/docs/model-release-announcement))。 客户从公开渠道获得的椭圆曲线公钥统一来自于豆包模型的自签名证书,豆包模型均使用同一份公钥,对应的私钥托管在 [火山私有 CA 服务](https://docs.volcengine.com/docs/6638/196517?lang=zh),使用的是 P-256 椭圆曲线。 豆包模型的证书可以通过方舟 OpenAPI 获取,接口是 [GetEndpointCertificate](/docs/get-endpoint-certificate-api)。 证书详情: | | | | |证书的密钥算法 ||ECDSA 256 | |---|---|---| | | | | |证书的签名算法 ||ECDSA-SHA256 | |证书的序列号 ||1BC6311337412676230446127358F676227CFEE3 | |证书的主体信息 |国家(C) |CN | | |企业名称(O) |Volcano Engine Ark | | |部门(OU) |Security | | |城市(L) |Beijing | | |省份(ST) |Beijing | | |公用名(CN) |MaaS Crypto SDK Online | |证书信息 |叶子证书 |```Plain Text | \ | | |-----BEGIN CERTIFICATE----- | \ | | |MIICxjCCAm2gAwIBAgIUG8YxEzdBJnYjBEYSc1j2diJ8/uMwCgYIKoZIzj0EAwIw | \ | | |gYQxITAfBgNVBAMMGE1hYVMgU0RLIFN1YiBDQSBFQ0MgUDI1NjEbMBkGA1UECgwS | \ | | |Vm9sY2FubyBFbmdpbmUgQXJrMREwDwYDVQQLDAhTZWN1cml0eTELMAkGA1UEBhMC | \ | | |Q04xEDAOBgNVBAgMB0JlaWppbmcxEDAOBgNVBAcMB0JlaWppbmcwHhcNMjQwMTAz | \ | | |MDY1MjM4WhcNMjkwMTAzMDY1MjM4WjCBgjELMAkGA1UEBhMCQ04xEDAOBgNVBAgT | \ | | |B0JlaWppbmcxEDAOBgNVBAcTB0JlaWppbmcxGzAZBgNVBAoTElZvbGNhbm8gRW5n | \ | | |aW5lIEFyazERMA8GA1UECxMIU2VjdXJpdHkxHzAdBgNVBAMTFk1hYVMgQ3J5cHRv | \ | | |IFNESyBPbmxpbmUwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATD7RyZC51FCwuK | \ | | |xYKh2ZCwIvbNDvQfosUk3gKc0B/+euemDWDAaVazuBOm8okHsSmUrsEudeksRruG | \ | | |LTGu1lBxo4G8MIG5MA4GA1UdDwEB/wQEAwIDiDBYBgNVHR8EUTBPME2gS6BJhkdo | \ | | |dHRwOi8vY3JsLnZvbGNjYS5jb20vdm9sYzE/c249NURCNEUwNDNFRjQ3MEY3RDBB | \ | | |REU0RDIyMTNBNTU1NTEzMjEyOEM3MzA4BggrBgEFBQcBAQQsMCowKAYIKwYBBQUH | \ | | |MAGGHGh0dHA6Ly9vY3NwLnZvbGNjYS5jb20vdm9sYzEwEwYDVR0lBAwwCgYIKwYB | \ | | |BQUHAwEwCgYIKoZIzj0EAwIDRwAwRAIgFSel9WBkyPmpdG6YzReb7ShCVKq3scT3 | \ | | |9T2mfBgooPkCIHpRalKvIJX5S9oSyTf6iQiUcwzfUHd47Ew+PUV7O6aq | \ | | |-----END CERTIFICATE----- | \ | | |``` | | |中间根证书 |```Plain Text | \ | | |-----BEGIN CERTIFICATE----- | \ | | |MIIDCDCCAq+gAwIBAgIUXbTgQ+9HD30K3k0iE6VVUTISjHMwCgYIKoZIzj0EAwIw | \ | | |gYUxIjAgBgNVBAMMGU1hYVMgU0RLIFJvb3QgQ0EgRUNDIFAyNTYxGzAZBgNVBAoM | \ | | |ElZvbGNhbm8gRW5naW5lIEFyazERMA8GA1UECwwIU2VjdXJpdHkxCzAJBgNVBAYT | \ | | |AkNOMRAwDgYDVQQIDAdCZWlqaW5nMRAwDgYDVQQHDAdCZWlqaW5nMB4XDTI0MDEw | \ | | |MzA2NDUyMVoXDTM0MDEwMzE1NTk1OVowgYQxITAfBgNVBAMMGE1hYVMgU0RLIFN1 | \ | | |YiBDQSBFQ0MgUDI1NjEbMBkGA1UECgwSVm9sY2FubyBFbmdpbmUgQXJrMREwDwYD | \ | | |VQQLDAhTZWN1cml0eTELMAkGA1UEBhMCQ04xEDAOBgNVBAgMB0JlaWppbmcxEDAO | \ | | |BgNVBAcMB0JlaWppbmcwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATc+JkMHj6F | \ | | |22yAIQWIDlbGikKHcy77VNfQRLi8HNCAipNfKktlocMJUD7uvaomfn3cvcI/YAEk | \ | | |r1NA+OyINzeno4H7MIH4MBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQD | \ | | |AgGGMFgGA1UdHwRRME8wTaBLoEmGR2h0dHA6Ly9jcmwudm9sY2NhLmNvbS92b2xj | \ | | |MT9zbj0yRjU0Q0U1NUJDMjI2MzEzQ0Q1RUI4NkZDQTU0RTZGOUFFOEIwMzQwMDgG | \ | | |CCsGAQUFBwEBBCwwKjAoBggrBgEFBQcwAYYcaHR0cDovL29jc3Audm9sY2NhLmNv | \ | | |bS92b2xjMTAdBgNVHQ4EFgQU53TjY9gSc5gAQDq4lrjIfOAj1DEwHwYDVR0jBBgw | \ | | |FoAUjqqup74+HmschrVwON2NKvZtp9IwCgYIKoZIzj0EAwIDRwAwRAIgVrljBWvr | \ | | |a4LfaYVKqRANxpqS6YLGLCHtDdnhYtim+ZICICbtI8mtHkKLxhqvJDEjf7GU3ssX | \ | | |6Nq8pRWHxAmsx6DC | \ | | |-----END CERTIFICATE----- | \ | | |``` | | |根证书 |```Plain Text | \ | | |-----BEGIN CERTIFICATE----- | \ | | |MIIDCzCCArCgAwIBAgIUL1TOVbwiYxPNXrhvylTm+a6LA0AwCgYIKoZIzj0EAwIw | \ | | |gYUxIjAgBgNVBAMMGU1hYVMgU0RLIFJvb3QgQ0EgRUNDIFAyNTYxGzAZBgNVBAoM | \ | | |ElZvbGNhbm8gRW5naW5lIEFyazERMA8GA1UECwwIU2VjdXJpdHkxCzAJBgNVBAYT | \ | | |AkNOMRAwDgYDVQQIDAdCZWlqaW5nMRAwDgYDVQQHDAdCZWlqaW5nMB4XDTI0MDEw | \ | | |MzA2NDQwOVoXDTM0MDEwMzE1NTk1OVowgYUxIjAgBgNVBAMMGU1hYVMgU0RLIFJv | \ | | |b3QgQ0EgRUNDIFAyNTYxGzAZBgNVBAoMElZvbGNhbm8gRW5naW5lIEFyazERMA8G | \ | | |A1UECwwIU2VjdXJpdHkxCzAJBgNVBAYTAkNOMRAwDgYDVQQIDAdCZWlqaW5nMRAw | \ | | |DgYDVQQHDAdCZWlqaW5nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEgT4ZCpVh | \ | | |Bas9kCTPnA22SoE4QGyK5VZiy6a5NQ/q99EZT2jxFyP8xqsKPUWAdike2l93uSAC | \ | | |G7Jd4yK5nn58BqOB+zCB+DASBgNVHRMBAf8ECDAGAQH/AgEBMA4GA1UdDwEB/wQE | \ | | |AwIBhjBYBgNVHR8EUTBPME2gS6BJhkdodHRwOi8vY3JsLnZvbGNjYS5jb20vdm9s | \ | | |YzE/c249MkY1NENFNTVCQzIyNjMxM0NENUVCODZGQ0E1NEU2RjlBRThCMDM0MDA4 | \ | | |BggrBgEFBQcBAQQsMCowKAYIKwYBBQUHMAGGHGh0dHA6Ly9vY3NwLnZvbGNjYS5j | \ | | |b20vdm9sYzEwHQYDVR0OBBYEFI6qrqe+Ph5rHIa1cDjdjSr2bafSMB8GA1UdIwQY | \ | | |MBaAFI6qrqe+Ph5rHIa1cDjdjSr2bafSMAoGCCqGSM49BAMCA0kAMEYCIQCzOoAV | \ | | |vy4XHibX6+8gi9KkGCG9WLzYPKMrI1BlFN7DNAIhAKEiFkaMn/tBuytndKduE2Bx | \ | | |G2KI5sUSpiB8EEYvuoNP | \ | | |-----END CERTIFICATE----- | \ | | |``` | |证书的创建时间 ||1704264758 | |证书的过期时间 ||1862117558 | |证书的生效时间 ||1704264758 | |证书的有效时长 ||5 年 | 叶子证书信息: [certificate.pem](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/d4ea207203ae48ef928935d6da33b6c5~tplv-goo7wpa0wc-image.image) 中间根证书和根证书信息: [certificate_chain.pem](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/f62e5a90d74848c3a150734fc6521f2d~tplv-goo7wpa0wc-image.image) ## 性能说明 在 Intel(R) Xeon(R) Platinum 8260 CPU @ 2.40GHz 单核情况下,按照消息长度 256 字节计算,一次对话请求的加解密额外耗时平均为 0.5786 ms。 --- # 精调安全防护能力介绍 Source: https://ark.volcengine.com/region:cn-beijing/docs/fine-tuning-security-protection-overview 本文针对模型精调场景,介绍火山方舟平台安全防护能力。 # **精调安全防护方案** 为解决精调数据可能被攻击窃取、精调模型被篡改等潜在安全问题,火山方舟平台通过安全沙箱全生命周期监控精调过程,确保模型安全与数据可控流转,并提供了灵活的密钥管理能力以及完善的精调审计日志,全面应对上述安全挑战。 # **精调安全防护设置** 在火山引擎控制台,您可通过 **模型精调-**[**创建精调任务**](https://ark.volcengine.com/region:cn-beijing/finetune/create?Id=),查看或设置以下安全能力: ## 数据集安全加密 在上传数据集时,火山方舟平台默认启用 TOS 服务端加密(SSE-TOS)对数据进行保护。加密密钥由 TOS 托管,平台会为每个文件分配唯一密钥,采用 AES-256 或 SM4 加密算法进行加密,并定期自动轮换主密钥。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/208bafc5b869402ebb72e2ae64763989~tplv-goo7wpa0wc-image.image)
    ## 精调产物加密 为确保精调任务中的数据安全,火山方舟平台依托火山引擎密钥管理服务(KMS),对以下数据进行加密保护: * 用户在精调任务创建时传入的数据 * 精调任务的模型产出 > **说明** > > 请确保您在创建精调任务前,已经开通了 KMS 服务,更多有关信息请参阅 [KMS 产品简介](https://docs.volcengine.com/docs/6476/71298?lang=zh)。 火山方舟支持以下两种加密方案,您可根据实际需求进行选择: |加密方案 |介绍 |计费说明 |示例 | |---|---|---|---| |默认方案- |火山方舟平台使用火山引擎KMS所提供的 ManagedKeyring 为用户创建并托管密钥,对用户传入的数据进行加密。用户可以查看平台托管的密钥,但无法进行轮换、删除等变更操作,平台将定期轮换托管密钥以保障用户安全。 |为提升您的使用体验,当前不收费 |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/b62d9807df004a79be20e404f0109098~tplv-goo7wpa0wc-image.image) | \ |平台默认密钥 | | | | |进阶方案- |用户在火山引擎KMS管理私有密钥,该密钥将用于加密用户的精调数据等敏感信息,并在任务全生命周期内确保数据加密存储,共支持两种密钥: |1.自定义密钥:使用您自行创建的CustomKeyring 密钥时,费用将由火山引擎KMS直接收取(可自由选择密钥类型),关于 KMS 服务的计费情况,请参阅 KMS 的详细 [计费说明](https://docs.volcengine.com/docs/6476/71331?lang=zh)。 |![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/2e47e132e78c4a8689684f49e2fe8ba9~tplv-goo7wpa0wc-image.image) | \ |私有KMS密钥 |1.自定义密钥:[创建精调任务](https://ark.volcengine.com/region:cn-beijing/finetune/create?Id=) 时,在火山KMS创建私有的自定义密钥。 |2.托管外部密钥:该功能在公测阶段,限时免费。 | | \ | |2.托管外部密钥:通过“托管外部密钥”(HYOK)功能接入外部密钥,更多有关信息请参阅 [HYOK最佳实践](/docs/hyok-best-practices)。 | | | # **精调安全防护**详情 在精调任务完成后,您可通过**模型精调-精调任务详情-安全审计**页面查看精调安全防护详情: ## 安全可视化 在安全审计页面,您可以可视化地监控安全沙箱的处理过程,全面了解精调全生命周期中所采取的安全保障措施。 在精调过程中,火山方舟平台会依次创建数据预处理可信安全沙箱和模型精调可信安全沙箱。预处理及精调任务完成后,对应的沙箱及其内部的精调数据、临时文件等将自动立即销毁。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/d94e3373396f4ff480ff507985c4fc06~tplv-goo7wpa0wc-image.image)
    ## 安全审计 在精调任务详情页面,点击左侧「风险监控」,即可查看精调过程中产生的安全审计日志。该模块支持通过 API 批量导出日志,便于风险回溯与分析。日志默认保存时间为180天,到期后将自动删除。更多有关信息请参阅[控制台-精调安全审计](/docs/console-fine-tuning-security-audit)。
    ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/cdd87aef42c64cfe9a2bcd6b1ac63370~tplv-goo7wpa0wc-image.image)
    --- # 通过堡垒机进入安全沙箱的运维流程 Source: https://ark.volcengine.com/region:cn-beijing/docs/operations-process-for-accessing-secure-sandbox-via-bastion-host # 一、场景 * 场景一:模型提供方在发布模型阶段可能需要通过堡垒机,进入安全沙箱进行调试 * 场景二:当出现安全事件或排查某些问题时,模型提供方、用户或平台方需要通过堡垒机访问安全沙箱;模型提供方和用户需要通过oncall联系值班人员获取堡垒机登录方式 # 二、适用范围 * 本文档适用于所有需要申请堡垒机接入调试的用户。本文档仅涉及申请方的操作流程 * **任何人员登录堡垒机后的所有行为将会被记录和审计** # 三、申请流程 ## 申请方(模型提供方、用户或平台方的技术支持同学) 1. 申请准备 1. 精调:提供需要进入的“任务id+实例名称”。给oncall同学提供的信息示例:t-20240111104141-nsgxh-worker-0 2. 推理 * 提供想要进入的服务实例 ID。给oncall同学提供的信息示例:s-20240111110507-lknts-6c55544744-n4jq8 * 提供ssh的账户名和密码 > **注意** > > * 需要保证推理镜像添加了sshd > * 为保障安全性,账号密码请点对点私发给oncall的同学,请勿直接发在oncall群 > * 一个审批人只能审批一个堡垒机主机,若需同时运维多个pod则需要多位同学审批 2. 审批成功后,通过oncall同学给的密码登录堡垒机 --- # 常见问题 Source: https://ark.volcengine.com/region:cn-beijing/docs/modelark-faq ## 计费问题 ### 代金券使用失败,报错AccountOverdueError,The request failed because your account has an overdue balance. Request ID: {id} 当前账号欠费,如需使用代金券,需保证账号余额大于等于0。请前往 [火山引擎费用中心](https://console.volcengine.com/finance/fund/recharge) 进行充值,详细操作参见 [充值操作指引](https://docs.volcengine.com/docs/6269/100434?lang=zh)。 ### 什么是 token?如何计算 token 数量? 在自然语言处理中,token 通常指的是将文本分割成的最小单位,比如词语、子词或字符。在调用模型推理服务时,会将输入内容进行分词(tokenize),转化为模型可以理解的 token ,经过模型处理后,同样输出 token,并转化为您需要的文本或者其他内容载体。而模型处理(包括输入、输出)的 token 数量会被作为模型推理服务用量的一个重要计量单位。 文本的 token 计算:由于不同模型采用的分词策略不同,同一段文本可能会被转化为不同数量的 token。您可以使用 [Token计算器](https://ark.volcengine.com/region:cn-beijing/openManagement?LLM=%7B%7D&OpenTokenDrawer=true¤t=1&pageSize=20) 或者 [分词 API](/docs/tokenization-api) 接口,来估算内容对应的 token 数量。 其他模态:查阅具体场景教程中的 token 用量说明。 ### 模型推理请求报错或者中断会计费么? 请求报错和中断分为下面几种情况: * 客户端中断 无论是客户端因为无需后续结果主动中断请求,或超时中断请求,服务端感知到请求被中断,并终止服务端模型生成过程。在客户端中断,到服务端中止生成,中间仍旧有可能有若干个 token 被生成出来。服务端已生成的 token 以及输入给模型处理的 token 会被计费,服务端中止生成后,就不会有进一步计费产生。 > 请注意,非流式输出场景下,因为需要等待模型完成输出后才会返回生成的token。当请求中止或超时,服务端生成部分 token 但未生成完整回复,故未返回生成信息给客户端。本次请求客户端收不到模型生成信息,但会产生输入 token 和生成但未输出的 token 费用。 * 服务端中断 * 在流式输出过程中,如果输出一部分内容后,因为命中审核或其它原因,服务端中止了生成过程,已经生成的 token 仍旧会被计费。 * RPM/TPM 等超限报错的请求不会开始模型生成过程,所以也不会产生任何计费。 ### 精调任务失败会计费吗? 任务训练失败,分两种情况: * 不导出产物:不计费,可重试任务; * 导出产物:需要停止任务,平台按照停止时已经训练的 token 数计费,此时不再支持重试任务。 ### 手动停止精调任务会计费吗? 手动停止任务,无论产物后续是否导出,都会按照已经训练的 token 数计费。 ### 账户欠费后如何充值? 请前往 [火山引擎费用中心](https://console.volcengine.com/finance/fund/recharge) 进行充值,详细操作参见 [充值操作指引](https://docs.volcengine.com/docs/6269/100434?lang=zh)。 ### 为什么我的账户欠费后仍在持续出账? 账户欠费后仍持续出账,原因主要有两点: * **推送账单时延**:欠费自账单出具起算,而账单出账通常存在 1 至 2 小时的延迟。在此期间,系统按照实际使用量正常出账。 * **欠费 2 小时后关停**:0<欠费时长<2小时,您可正常使用火山方舟模型服务。在此期间,系统按照实际使用量正常出账。 ### 如何按 Endpoint ID 或精调任务 ID 分账? 对于按token后付费方式,支持对各种模型,按 Endpoint id 或精调任务 id 分账。 1. 登录控制台,进入 [费用中心 > 账单管理](https://console.volcengine.com/finance/bill/detail/)。 2. 在左侧导航栏选择 **分账账单**。 3. 将统计周期切换为 **明细**。 4. 过滤产品:选择 **字节跳动大模型服务(豆包大模型)** 或者 **开源LLM模型**。 5. 选择 **分拆项 ID**,输入 Endpoint ID 或精调任务 ID,即可看到对应的用量数据。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/25dec0b744c143639308b8ef86fe532e~tplv-goo7wpa0wc-image.image) ### 如何查看历史调用的输入输出长度的区间分布? 如果您使用过方舟,可在推理接入点监控看板上看到历史调用输入输出长度的分布情况。具体入口:[**在线推理**](https://ark.volcengine.com/region:cn-beijing/endpoint) > 接入点详情 > **监控** 页签 > **区间内总Requests和总Tokens** 看板,如下图。 > **注意** > > 看板数据注重实时性,监控数据在数据量较小时可能有偏差。准确数据请参考火山引擎账单信息。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/4fb286cfb0e64836a6d918e9a37b2c73~tplv-goo7wpa0wc-image.image) ## 在线推理 ### 使用python sdk报错,错误码`httpx.InvalidURL: Invalid port: ':'`或`ValueError: Unknown scheme for proxy URL URL('socks5h://xxx')` python client端禁用代理 ```Python # Python SDK import httpx from arkruntime import Ark client = Ark( base_url="https://ark.cn-beijing.volces.com/api/v3", http_client=httpx.Client(trust_env=False), ) ``` 若上述方法无效,可以尝试 ```Bash export no_proxy= ``` ### ArkAPIConnectionError (域名连接超时),怎么处理? 检查本地环境是否可以访问方舟公网域名: ```Bash ping ark.cn-beijing.volces.com ``` 如果域名访问不通,可以考虑使用以下方式关闭 `HTTP_PROXY`: ```Python # Python SDK import httpx from arkruntime import Ark client = Ark( base_url="https://ark.cn-beijing.volces.com/api/v3", http_client=httpx.Client(trust_env=False), ) ``` 如果 ping 命令执行成功,但是调用时依旧有如下报错: ```text Failed to resolve 'ark.cn-beijing.volces.com' ([Errno -3] Temporary failure in name resolution) ``` 可以尝试对 `/etc/resolv.conf` 文件做如下修改后再次请求。 ```Bash # /etc/resolv.conf 文件 # ${ip}从 ping 的输出中拿到 ark.cn-beijing.volces.com ${ip} ``` 其中`${ip}`从 ping 的输出中拿到。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/f4a02223ecdd4d1fbc5dda7d84e0b0dd~tplv-goo7wpa0wc-image.image) 若上述方法无效,可以尝试设置环境变量 ```Bash export no_proxy= ``` ### Windows系统安装SDK失败,ERROR: Failed building wheel for volcengine-python-sdk 由于 Windows 系统有最长路径限制,可能会导致安装失败,请按照以下方式设置: 1. 按下 `Win+R` ,输入 regedit 打开注册表编辑器。 2. 设置 `\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem` 路径下的变量 `LongPathsEnabled` 为`1 `。 ### `ChatCompletions`接口中`messages` `role`字段中是否要求user 在奇数位,assistant在偶数位? 没有这个要求。 示例: 请求内容 ```Python ... messages = [ {"role": "system", "content": "你是 AI 人工智能助手。"}, # 重复2个 user message {"role": "user", "content": "常见的十字花科植物有哪些?"}, {"role": "user", "content": "以下是一些常见的十字花科植物:白菜、甘蓝"}, {"role": "assistant", "content": "萝卜、花椰菜、芥菜"}, {"role": "user", "content": "还有么?"}, ], ... ``` 大模型正常返回内容 ```text 还有油菜、荠菜、独行菜、诸葛菜(二月兰)等。 1. **油菜** - 油菜是重要的油料作物。它的茎直立,有分枝,叶片互生,花朵为黄色,呈十字形排列。油菜籽可以用来榨油,菜籽油在日常生活中广泛使用。 2. **荠菜** - 荠菜是常见的野菜。基生叶丛生呈莲座状,叶片羽状分裂,它的适应性强,常在田野、路边等地生长。荠菜可以食用,含有丰富的营养成分,如蛋白质、维生素等,可用于包饺子、煮汤等。 3. **独行菜** - 为一年生或二年生草本植物。茎直立或斜生,多分枝。叶片狭匙形或倒披针形。独行菜的种子可入药,具有止咳化痰等功效。 4. **诸葛菜(二月兰)** - 因农历二月前后开始开蓝紫色花得名。它对环境适应能力强,耐寒旱,多生长于平原、山地、路旁等地。花朵小巧且数量众多,盛花期时具有较高的观赏价值 ``` ### `ChatCompletions`接口中`messages` 字段是否支持只传`role`是`system`? 支持。 示例: 请求内容 ```Python ... messages = [ {"role": "system", "content": "你是 AI 人工智能助手。常见的十字花科植物有哪些?"}, ... ] ... ``` 大模型正常返回内容 ```text 以下是一些常见的十字花科植物: ### 一、蔬菜类 1. **白菜** - 包括大白菜、小白菜等。大白菜叶片宽大,是我国北方冬季常见的蔬菜,有青帮、白帮等不同品种,营养丰富,富含维生素C、纤维素等。小白菜植株相对较小,叶片嫩绿,生长周期较短,口感鲜嫩。 2. **甘蓝** - **结球甘蓝(卷心菜)**:叶片层层包裹成球状,有绿甘蓝、紫甘蓝之分。它适应性强,耐储存和运输,可用于制作沙拉、炒菜、泡菜等。 - **花椰菜(菜花)**:花球由肥嫩的花枝顶端聚合而成,颜色洁白或淡黄。西兰花是花椰菜的一个变种,其营养成分含量高,尤其是维生素C、胡萝卜素和叶酸等。 3. **萝卜** - 有白萝卜、红萝卜(胡萝卜不属于十字花科,红萝卜属于十字花科)、青萝卜等多种类型。萝卜肉质根可食用,既可生食,如做成凉拌萝卜丝,也可熟食,如萝卜炖排骨。萝卜含有淀粉酶、芥子油等物质,具有助消化、增食欲等功效。 4. **芥菜** - **叶用芥菜**:如雪里蕻,叶片深裂,边缘皱缩,有特殊的香辣味。它是制作腌菜的重要原料,腌制后的雪里蕻可用于炒肉末等菜肴。 - **茎用芥菜(榨菜)**:茎部膨大,形成瘤状凸起,肉质茎是主要食用部分,常用于制作榨菜,是一种常见的佐餐小菜。 ### 二、观赏植物类 1. **紫罗兰** - 紫罗兰花朵繁茂,花色丰富,有紫色、白色、粉色等。它香气淡雅,花期较长,常被用于布置花坛、花境,也可盆栽观赏。 2. **诸葛菜(二月兰)** - 二月兰是一种常见的野花,花朵为淡紫色或白色。它具有较强的适应能力,能自播繁殖,常生长于山坡、草地、路旁等地。在园林中可用于营造野趣景观,也可成片种植形成花海景观。 ``` ### 如何判断使用的V3接口? * 如直接使用HTTP接口调用,调用路径中出现 `/api/v3` * 如您使用火山提供的SDK调用,从 `import` 路径判断: * 出现 `ark` 字样的为 `v3` API。 * 出现 `maas` 字样的为 `v1`/`v2` API。 ### **使用视觉理解模型时,报错InvalidParameter?** * **下载图片超时**: 为防止不必要的带宽浪费,默认图片下载超时时间5s。可能是图片访问速度较慢如外国网站,或者图片较大。对以上情况均建议更换到TOS上或压缩图片至100kB以下。 * **链接禁止访问**:状态码` 403`,部分图片服务器可能存在特殊安全/acl策略,禁止了火山源访问,建议检查客户所用图片服务器(阿里云对象存储/腾讯云对象存储/...)的安全策略。 * **不支持的图片格式,或者图片格式与元数据不匹配**: * 以下图片格式根据图片内容前512个字节自动校验: |图片格式 |Content-Type | |---|---| |jpg/jpeg |image/jpeg | |png |image/png | |gif |image/gif | |webp |image/webp | |bmp |image/bmp | |dib |image/bmp | |ico |image/x-icon | * 以下图片格式根据图片url的元信息(Content-Type)校验,需要正确设置`Content-Type` * TOS(火山引擎对象存储) 设置文件元信息请参见:https://www.volcengine.com/docs/6349/145523 * OSS (阿里云对象存储)设置文件元信息请参见:https://help.aliyun.com/zh/oss/user-guide/configure-the-content-type-header |图片格式 |Content-Type | |---|---| |TIFF |`image/tiff` | |SGI |`image/sgi` | |ICNS |`image/icns` | |JPEG2000 |`image/jp2` | ### 视觉理解模型使用 token 过大报错怎么处理? 单次请求中,返回token报错过长,可以考虑的处理方式: 1. 如果单次请求中涉及到多张图片,可以考虑减少图片张数。 2. 对图片进行压缩,以减少图片 token 用量,转化关系请参见 [token 用量说明](/docs/image-understanding#57188ace)。 3. 如果涉及到大量的文本提示词,可以考虑简化提示词。 ### 支持 TS 格式的视频文件吗? 建议将 TS 格式的文件转换成 MP4 格式。TS 和 MP4 在音视频封装格式上不同,都用于承载已编码的音视频流,所以在格式转换时不需要重新编码,可以通过 [开源工具 FFmpeg ](https://ffmpeg.org/download.html) 直接复制原音视频流实现快速转换且保留原文件编码格式。转换命令示例如下: ```Bash ffmpeg -i input.ts -c copy output.mp4 ``` ### 并发 RPM 或者 TPM 额度明明有剩余为什么提示限流报错? 方舟对于模型限流的逻辑使用的是预扣机制,来保障您已提交的请求的完成率。即在收到请求时会根据输入和输出长度预扣除本时间窗口的 TPM 配额,避免因为激增的请求或者超长输出等极端情况,瞬时输入输出 token 剧增,导致您已提交的请求大量因为限流而长时间无法响应,最后影响到您业务的稳定性。 ### 使用模型进行在线推理时有限流吗? 当前对每个模型设置了 RPM(Requests Per Minute,每分钟请求数)及 TPM(Tokens Per Minute,每分钟 token 数量)的调用限制,每个账号(含主账号下的所有子账号,合并计算)的具体限制可在 [开通管理](https://ark.volcengine.com/region:cn-beijing/openManagement?OpenTokenDrawer=false) 页中查看。 如需提升,请联系客户经理或者提交 [工单](https://console.volcengine.com/workorder/create?step=2&SubProductID=P00001166)。 ### 为什么高并发请求方舟模型的时候受到了限制? 为了保障平台运行的安全,平台制定了一些针对在线推理的防控策略,对未在火山引擎上充值或历史充值较低的账号,高并发请求模型会被限制。我们默认的并发数可以支持任何用户对平台模型效果进行尝鲜测试和常规使用。如果您有高并发需求,建议预先对账号进行充值。 您也可以使用批量推理的接入点模式(Batch chat),并发限制由此时平台的闲置资源量决定,通常情况下夜间 0 点到次日早上 8 点资源较为充足。 ## 批量推理 ### 在任务状态为:运行中,终止中,已终止,失败的情况时,是否会有部分成功的结果输出? 会,已经运行成功的结果会写到output中,且运行成功的数据会正常计费。但是不保证任务运行顺序。 ### 基于什么的准则,去判断“失败”这种状态,是成功与错误比例,还是发现错误即判断失败? 以下情况判断任务失败: * 文件输入格式不符合要求,如某一条数据不是json,会在任务开始前检测该类型错误,有错误会判定失败。 * 预期外的错误,如job崩溃。 * 任务运行超时。 * 如果存在某条request运行失败,比如安全审核失败。这条request结果会写到error文件夹中,不会导致整体任务失败。 ### 在子任务数量巨大,无法预估处理所需的时间的前提下,设置的最大等待时间是否有大小上限? CompletionWindow的最大等待时间最大可设置为28天。如果不指定,默认为28天。 ### 若由于超时使得批量推理任务状态为“已终止”,在终止之前所做的任务处理结果是否还有保留? 会保留,结果写在output中。 ### 输出长度是4k还是6k,亦或是其他? 限制与在线推理相同,输出超过限制会截断。 ### 批量推理按 tokens 用量计费,是按照输入tokens,或是输出tokens,又或是两者之和? 与在线推理相同,计费按照模型处理的内容量,输入输出都需要计费。 ### 对于处理失败的结果,也就是errors.jsonl中的结果,如何计费? 处理失败的结果不计费。 ## 精调 ### 模型精调任务数有限制吗? 每个账号会有最多可同时创建运行中的精调任务数的限制,具体限制请见控制台报错提示,若到达上限的,请耐心等待精调任务完成并释放额度后重试,或在 [配额中心](https://console.volcengine.com/quota/productList/coParameterList?ProviderCode=MaaS) 中提交申请更多额度。 ## TPM保障包 ### 保障包是否可以与上下文缓存 Context Cache 一起使用? 不可一起使用。 ### 如何判断某个请求在保障包的保障范畴? 当请求输入时,我们会根据购买保障包的输入与输出比例预估请求的总Token数量,并按照预估长度扣减保障包的输入、输出保障额度。当预估输入和预估输出额度都在保障包额度范围内,此次请求会被保障。如不在保障范围内,将按照未使用TPM保障包计费,**按Token计费**。 ### 怎么保障分小时的保障包能购买成功? 长期通过产品功能支持,短期内如有明确峰值保障需求,请联系客户经理或者 [工单](https://console.volcengine.com/workorder/create?step=2&SubProductID=P00001166) 联系我们。 ### TPM 保障包是否可以与结构化输出功能一起使用? 暂不支持。购买TPM保障包后,不支持与[结构化输出(beta)](/docs/structured-output-beta)功能一起使用,后续会根据实际情况考虑是否支持该组合使用方式。 ### 18点后购买预付费TPM保障包且开启自动续费场景建议 **18:00后购买1天的包天实例,建议当天手动续费一次**。除新购当天外资金充足可正常续费。否则错过当日的自动续费任务(每日0、5、12、18点触发),在当天23:59:59到期,等待0点的自动续费任务触发,完成续费后(完成时间0-2小时间),才可变更配置。 ## 模型单元 ### 原有模型单元还可以继续购买和使用吗? 点击切换后可购买原有模型单元。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/4751442b97924380820d9492915fed45~tplv-goo7wpa0wc-image.image) 原有模型单元依然可以续费、扩容、缩容,但后续可能逐渐缩减库存。同时新上线的模型(doubao 1.6 及之后版本的模型)将只支持新版模型单元。 ### 模型单元下单后发货时间多久? 下单后系统调度资源,大概需要10分钟左右完成调度,调度完成之前不收取费用。 ### 后付费按小时的模型单元如何保障购买到? 无法完全保障。后付费资源有限,可能出现不同客户业务高峰期相同互相抢占的情况,先买到先得。购买不成功会全额退款。方舟后续会规划购买失败的告警能力。 ### 模型单元是否可以与结构化输出功能一起使用? 暂不支持。购买模型单元后,不支持与[结构化输出(beta)](/docs/structured-output-beta)功能一起使用,后续会根据实际情况考虑是否支持该组合使用方式。 ### 不同机型的模型单元有什么区别?如何选择机型? 不同机型的算力不同,这会导致不同机型的模型单元在处理速度、计算能力以及能够支持的最大负载等方面存在差异。 不同模型适用的机型不同,平台已针对不同模型预置了覆盖不同场景的最优部署方案组合。用户无需手动选择机型,只需根据实际需求选择对应的模板即可完成部署。 ## 其他问题 ### 页面提示“当前页面最低需要ArkReadOnlyAccess(只读权限)才能操作,请先完成权限开通。”要怎么配置权限? 使用主账号或者有IAM权限的账号,访问 [访问控制 > 用户](https://console.volcengine.com/iam/policymanage) 页面并搜索子账号id,进入子账号 用户详情 页面,确认子账号目前的权限。 * 若目前权限为空或只有ArkExperienceAccess(体验权限),则表明子账号权限策略设置错误。请您根据业务需要为子账号添加ArkReadOnlyAccess(只读权限)或者更高的权限,可以在 [产品预设策略](/docs/use-iam-to-manage-permissions#preset-policies) 中查看详细的权限说明。 * 在 [访问控制 > 用户](https://console.volcengine.com/iam/policymanage) 页面搜索子账号id,点击右侧操作中 添加权限 按钮,「授权策略」选择ArkReadOnlyAccess或更大权限,「限制到项目资源」选择「否」,完成后点击提交即可。 * 若目前子账号已经拥有ArkReadOnlyAccess(只读权限)或更高的权限,则可能因为权限策略做了项目隔离,子账号没有对应项目的权限。请按照 [典型场景-赋予账号项目级权限](/docs/use-iam-to-manage-permissions#68d11b0c) 配置正确的权限。 ### 如何获取项目名称(Project Name)? 火山引擎方舟用户可在 [方舟控制台](https://ark.volcengine.com/region:cn-beijing/overview?briefPage=0&briefType=introduce&type=new) 左下角的项目选择器中查看项目名称。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/6f829de9539244e78e3c8878860a8658~tplv-goo7wpa0wc-image.image) --- # 火山方舟大模型服务平台专用条款 Source: https://ark.volcengine.com/region:cn-beijing/docs/volcengine-ark-platform-terms 发布日期:2026年 8 月 5 日 生效日期:2026年 8 月 11 日 # **1. 专用条款的适用性** 1.1 本专用条款适用于您向火山引擎订购或(和)使用的火山方舟大模型服务平台展示和提供的服务。 1.2 一旦您订购或(和)使用了本服务,本专用条款将与(1)火山引擎官网公示的 [《服务条款》](https://docs.volcengine.com/docs/6256/64903?lang=zh) 与 [《隐私政策》](https://docs.volcengine.com/docs/6256/64902?lang=zh),(2)[《产品和服务协议》](https://docs.volcengine.com/docs/6256/68938?lang=zh),(3)订购协议/服务订单,(4)《服务等级协议》(如有),和(5)服务规则等所适用的其他协议共同构成您与火山引擎之间就订购或(和)使用本服务的完整协议。 1.3 本专用条款未明确约定事项,将遵照您与火山引擎订立的其他所适用协议或服务规则的约定。 # **2. 定义与解释** 2.1 除非本专用条款另有约定,如下术语具有本款所规定的含义: 2.1.1 “火山方舟大模型服务平台” 提供大模型的训练、推理、评测、精调等全方位功能与服务,并重点支撑大模型生态,火山方舟通过稳定可靠的安全互信方案,保障模型服务提供方的模型安全与模型使用者的信息安全。 2.2 其他在本专用条款中使用但未加定义的术语,具有其他所适用协议或服务规则中所规定的含义。 # **3. 服务使用规则** 3.1 火山引擎服务仅限于您和(或)您的产品(“客户产品”)自行使用。火山引擎特此授予您一项非排他的、不可转让或再许可的、有时间限制的、可撤销的、仅在中国大陆地区使用本服务的授权。您理解并同意,如您就本服务进行商业使用或以其他方式直接或间接获得收益,则您需要事先获得火山引擎的书面许可。您进一步理解,火山引擎授权您使用本服务以及所有其他连同服务一并提供的内容,但是该等授权并非将上述内容出售给您。您理解,火山引擎将保留所有未明确授予您的权利。若您超出火山引擎授权范围使用、转让、再许可、出租火山引擎向您提供的任何资源、技术支持和服务等(包括向您的关联方转让、再许可、出租),我们有权立即终止前述许可,因此给您造成损失的,您应自行承担全部责任。 3.2 您理解并同意,服务均由技术工具自动完成,除非另行约定或/和为履行本协议下的特别义务(例如在适用情形下进行故障排除、检测等事项),火山引擎对服务过程及结果不进行人工干预。**除另有约定外,火山引擎仅通过技术工具为您提供纯技术性的服务,对于服务生成数据的效果或者准确性与合法性不做任何形式的承诺或保证。特别提示您,您在使用服务生成数据前应做好相关内容的审核和校对,您根据服务生成数据所作出的任何判断或者据此作出的后续相关操作行为,所带来的后果和责任均由您自行承担。您应承担因使用该等数据而引起的所有风险,包括因对服务生成数据的正确性、准确性、完整性、适用性、合法性、不侵权、实用性或满足特定目的的依赖而产生的一切风险。您确认并同意不因服务生成数据的不准确、不适用而追究火山引擎的任何责任**。 3.3 您有权通过火山引擎平台对您产品的运行环境进行配置,控制部署您的产品,并自行对操作系统之上部分(包括系统安装软件及程序)负责。火山引擎仅负责初始操作系统的稳定性和底层硬件及火山引擎提供的软件和服务的运营维护。您自行升级系统、安装软件或应用,可能会造成宕机、数据丢失等潜在不利影响,您应自行负责事先确认风险并谨慎操作,火山引擎对此类您负责事项不予承担责任。 3.4 除非双方另行书面同意,您不应大量占用,亦不得导致程序或进程大量占用火山引擎的云计算资源中服务器内存、CPU或者网络带宽资源,给火山引擎平台或者火山引擎的其他客户的网络、服务器(包括但不限于本地及外地和国际的网络、服务器等)、产品或服务等带来严重负荷,影响火山引擎云计算资源及网络与国际互联网、与特定网络或服务器及与火山引擎平台内部网络的通畅联系,或者导致火山引擎平台服务或者火山引擎的其他客户所在的服务器宕机、死机或者客户基于火山引擎平台的产品或服务不可访问等。 3.5 您理解并同意,您通过本服务传播的内容/应用还需遵守《网络音视频信息服务管理规定》及相关适用法律法规的规定,不得利用本服务基于深度学习、虚拟现实等新技术新应用制作、发布、传播虚假新闻信息。您在通过本服务发布或传播利用基于深度学习、虚拟现实等的新技术新应用制作的非真实音视频信息时,应当以显著方式予以标识。因违反《网络音视频信息服务管理规定》及相关适用的法律法规而引起的任何/全部法律责任和/或索赔均由您自行承担。 3.6 **火山引擎有权自行决定对您基于本服务传播的数据和内容审查,包括但不限于内容审查、合规审查、版权审查等。如发现您的客户内容不符合国家法律法规、政策规定及本协议约定的,或您的数据和内容侵犯他人合法权益,或其他火山引擎认为不符合要求的情况,火山引擎有权不予接入和传输;已经接入和传输的,火山引擎有权立即停止接入和传输,保存有关记录,并向相关主管部门报告,且火山引擎有权在此种情况下,不经通知自行决定删除或移除任何您的数据和内容。但是,本项约定不视为火山引擎对您的数据和内容提供任何合法性担保,因您的数据和内容引起的任何/全部法律责任和/或索赔均由您自行承担**。 3.7 **火山方舟大模型服务平台特别条款** 3.7.1 大模型服务平台展示的服务包括由模型服务商基于大模型提供的服务(“专有模型服务”)以及基于公开可下载的开源大模型提供的服务(“开源模型服务”),合称为“模型服务”。大模型服务平台还为您提供应用实验室、官方插件((指由火山引擎开发和提供的插件服务,包括联网内容插件等))应用、评测、方舟 Agent 及相关服务(合称“方舟服务”)的试(使)用,以火山引擎官网和/或控制台为您提供的具体服务内容及其服务规则约定为准,您可以结合平台运行的模型服务使用。 3.7.2 如果您选择的是专有模型服务,请在使用服务前务必查看并遵守模型服务商的《模型服务协议》、计费和结算规则、服务规则和使用指南(合称“模型服务协议与规则”),如果您对专有模型服务的许可信息有疑问,请通过模型服务页面直接联系模型服务商。您确认并同意您在使用专有模型服务前已经充分阅读模型服务商与您的“模型服务协议与规则”,知悉并确认使用模型服务的各项风险、权利、义务与其他条款条件,在您开通服务时即表示“模型服务协议与规则”在您和模型服务商双方之间具有法律约束力。如果您不同意全部或部分协议条款或规则,则不能使用相关服务,如果已经开始使用的,应立刻停止使用。 3.7.3 如果您选择的是开源模型服务,您对该服务的使用可能还受到该开源大模型对应的许可证的约束。请务必查看您使用的任何开源大模型的许可证,您有责任在下载或使用模型服务之前查看并遵守任何适用的许可条款,并确保它们适合您的使用场景。**特别提示您,您需要对您选择和使用开源模型的行为和后果承担全部责任,包括但不限于对模型生成内容的安全和侵权风险承担责任,以及在您的使用场景下,您选择和使用的开源模型是否需要通过监管备案等,您需自行进行评估和确认。特别说明,火山引擎仅对您使用开源模型运行生成内容过程中消耗的算力资源以及您调用方舟平台其他功能和服务收取费用**。 3.7.4 **如果您选择将您部署在火山引擎机器学习平台内的模型(您的模型)配置接入到火山方舟推理接入点,请您对您自行配置和调用您的模型承担全部责任**。您有责任在使用您的模型之前查看并遵守任何适用的许可条款,并确保它们适合您的使用场景。**特别提示您,您需要对您选择和使用您的模型的行为和后果承担全部责任,包括但不限于对模型生成内容的安全和侵权风险承担责任,以及在您的使用场景下,您选择和使用的您的模型是否需要通过监管备案等,您需自行进行评估和确认。特别说明,火山引擎仅对您使用您的模型运行生成内容过程中消耗的算力资源以及您调用方舟平台其他功能和服务收取费用**。 3.7.5 特别提示您,方舟平台支持一键开通所有模型的功能。如您使用该功能,那么未来方舟平台新增模型(包括模型新增版本)服务会自动更新添加至您开通的商品项中,无需您再进行手动开通。您使用新增模型,**将视为您理解并同意对应模型服务协议与规则并同意按照对应模型的计费和结算规则收费,您不使用则不会产生费用**。您可以在模型开通管理页管理您的模型列表。 3.7.6 **特别提示,在使用大模型服务平台和模型服务时,您应遵守《互联网信息服务算法推荐管理规定》、《互联网信息服务深度合成管理规定》、《生成式人工智能服务管理暂行办法》,以及立法和行政主管部门不时出台的与生成式人工智能服务的相关法律法规、国家标准和行业标准。如根据法律、法规的要求或应相关政府部门的要求,您需履行上述一项或多项政府手续的,您应当依法获得,否则您可能将承担相应的法律责任。为免疑义,火山引擎仅向您提供大模型服务平台的相关技术支持,火山引擎不是《互联网信息服务深度合成管理规定》中的深度合成服务提供者、深度合成技术支持者**。 3.7.7 未经您的单独同意,火山引擎不会存储和使用您的数据来训练或优化模型。火山引擎仅在下述场景对您的数据进行相应处理: (1)为履行法律法规合规要求,火山引擎有权采取技术手段对您使用本服务的行为及信息进行审查,包括但不限于对您提交给服务或使用服务输出的内容进行自动化过滤审核,建立和改进风险过滤机制、违法违规侵权内容特征库等。 (2)您使用火山引擎平台提供的排障工具、产物查询验证工具或您通过其他方式主动将您的数据提供给火山引擎。您理解并同意,为了向您提供排障服务,火山引擎会在合理时间内存储您的数据,且仅在您申请排障或模型生成内容效果、产物查询等问题咨询时依据您的委托处理您的数据。 (3) 为了防范模型异常调用等行为,给模型提供方和方舟平台造成安全合规风险,火山引擎会对触发模型异常告警的数据进行存储和审查,解除告警后平台将不会继续存储和审查您的数据。 为了优化平台服务体验,火山引擎会对提供服务形成的聚合数据进行统计分析,这里不会存储和使用任何原始的您的数据。 您确认并同意,该等检测或服务可能由火山引擎委托的第三方提供数据源等服务支持。您应自行按法律法规规定留存您应用和服务相关的日志记录。 3.7.8 火山引擎在方舟基础安全之外,还为您提供高阶安全防护方案,您可以根据需要选择对应模型服务并享有相应的数据安全保护。高阶安全防护即火山引擎为您提供的安全沙箱安全互信方案,保护您的数据不会被提供给模型服务商。如您选择使用不具备高阶安全防护的模型服务,那么您的数据处理规则将遵循您接受的模型服务协议与规则的约定。 3.7.9 特别提示您,您试(使)用火山引擎为您提供的官方插件服务时,您的数据将被发送至插件内进行处理,处理完成后您的数据与处理结果共同返回至您订购的大模型服务,火山引擎将按不低于行业标准的技术安全手段保护您的数据传输安全,**您理解并同意,如因超出当前技术安全能力造成的您的数据安全风险,火山引擎免责**。 3.7.10 特别提示您,在适用法律允许的范围内,您通过方舟应用实验室服务和(或)Managed Agents 服务开发智能体或创建应用(统称“您的应用”)时,您向我们提供的文字、图片、声音、音频、视频、代码等数据的知识产权归属于您或者依法享有这些知识产权的权利人。您的应用的知识产权归属于您,**为避免疑问,如前述应用包含了火山引擎享有知识产权或其他合法权益的内容,则前述内容相应权利仍由火山引擎享有,不因包含在您开发的应用当中而改变其权属。无论本特别条款如何约定,为免疑义,火山引擎无义务向您交付/提供任何源代码、模型参数等。您确认并承诺,如您的应用使用任何第三方软件或服务,您需自行遵守三方软件或服务的协议或规则,火山引擎对您使用第三方软件或服务的行为及导致的任何后果不承担任何责任。您确认并承诺,您发布您的应用或将您的应用提供给您的终端用户使用时,您需要按相关法律法规规定,完成应用发布的法律合规评估,包括但不限于可能涉及申请相应资质牌照或履行备案义务后才可对外提供服,根据《网络安全法》、《个人信息保护法》、《未成年人保护法》、《生成式人工智能管理暂行办法》等法律规定落实相应合规义务,为您的用户提供用户协议及隐私政策等。由于您违反法律法规或本协议约定开发、创建、使用或发布您的应用,您应自行承担全部责任,由此给火山引擎造成任何损失,火山引擎将依法追究您的赔偿责任**。 3.7.11 **特别提示您,** 您试(使)用火山引擎为您提供的缓存存储功能、日志记录、AI应用监控与调试、可观测性平台、加标识、Managed Agents 托管服务等产品功能或服务时,您理解您的数据将会存储在火山方舟平台为您提供的存储空间中以实现您对数据缓存存储、监控观测、加标识、Agents 托管等目的。火山引擎将按不低于行业标准的技术安全手段保护您的数据传输安全,**您理解并同意,如因超出当前技术安全能力造成的您的数据安全风险,火山引擎免责。未经您授权,火山引擎不会访问或使用您的数据**。 3.7.12 **您试(使)用方舟 Agent 服务时,您理解您通过方舟 Agent 查询和执行任务时,包括但不限于您通过方舟 Agent 执行开通方舟平台模型和使用模型服务,您需要遵守相应模型服务协议和本服务协议的全部条款和条件。同时您需要自行判断是否执行相应操作并对该操作行为的结果承担全部责任,包括但不限于您需要支付您通过方舟 Agent 开通和使用模型产生的费用。您理解并同意,方舟 Agent 仅为您提供方舟服务的使用便利,模型生成内容仅供参考,不可作为您处置资产和数据的依据。如您对服务有任何疑问,可以转人工支持。** 3.7.13 特别提示您,根据《生成式人工智能服务管理暂行办法》、《人工智能生成合成内容标识办法》及配套国家标准的相关规定,您需要对模型生成合成内容履行添加显示标识和隐式标识的合规义务。火山方舟平台将为您提供显式标识和隐式标识添加技术,您需自行判断和使用。**您理解并同意,火山方舟平台仅提供技术工具,您需对您标识内容的完整性、准确性和合规性承担全部责任**。 3.7.14 您或您的产品直接调用模型服务API生成的内容(“生成内容”),您可以在遵守模型服务协议与规则并在合法合规的范围内使用您的输入内容和生成内容。您通过方舟体验中心模型体验生成的内容(“体验内容”),您不能主张体验内容的知识产权,同时您不可将体验内容用于模型效果体验之外的任何目的。为免疑义,您基于输入内容和生成内容的使用产生的任何知识产权纠纷由您自行处理并承担所有责任,由此给火山引擎造成损失的,您应当承担赔偿责任。如果您希望通过提供客户数据或算法参数等方式对基础模型进行一次或多次的优化、调试、训练及精调的,您不能主张享有衍生模型(“精调模型”)的知识产权,在您按照协议约定支付模型服务相关费用后,您可以独占使用该精调模型。无论该权属如何约定,您确认并同意精调模型应仅部署在火山引擎的大模型服务平台。 3.7.15 特别提示您,您已订购模型服务并将模型推理接入点(EndPoint/EP)接入到火山方舟体验中心,体验您已订购的模型效果。您理解并同意,该等体验和使用行为需要遵守 [《火山方舟平台免责声明和服务体验规则说明》](/docs/volcengine-ark-experience-center-terms-and-disclaimer) 内对体验服务的相关约定。 3.7.16 特别提示,模型服务不适用于可能导致严重人身伤害或死亡或造成环境或财产损失的任何危险环境,或操作任何关键系统,或任何临床决策或其他临床用途,您应自行对与任何此类的使用产生的责任负责。具体请查阅 [《火山方舟平台免责声明和服务体验规则说明》](/docs/volcengine-ark-experience-center-terms-and-disclaimer)。 3.7.17 您确认并同意,以下情况火山引擎有权提前终止提供服务而无需承担责任。如您尚有未消费完毕的直接预付给火山引擎的款项,您可以通过火山引擎提供的退款方式申请退款。 (1)火山引擎及模型服务商在可能发现存在异常情况时立即暂停服务,您应在接到通知后积极核实异常情况,并将核查的真实、完整情况及原因书面反馈给火山引擎和模型服务商,以便火山引擎和模型服务商判断是否恢复服务,如因您的异常使用及未能提供情况反馈导致服务不能恢复而提前终止的。 (2)模型服务商与火山引擎的合作到期/提前或因其他事由将模型下架的、开源模型发布者声明不再继续维护或模型版本迭代更新导致旧版本模型服务无法继续使用等,火山引擎提前15天通过 [《产品和服务协议》](https://docs.volcengine.com/docs/6256/68938?lang=zh) 约定的一种或多种方式通知您的。 (3)其他在 [《产品和服务协议》](https://docs.volcengine.com/docs/6256/68938?lang=zh) 中约定的提前解除协议的情形。 --- # 火山方舟体验中心服务规则和免责声明 Source: https://ark.volcengine.com/region:cn-beijing/docs/volcengine-ark-experience-center-terms-and-disclaimer 发布日期:2026年02月24日 生效日期:2026年03月01日 --- 欢迎您使用火山方舟大模型服务平台体验服务,方舟平台体验服务包括方舟体验中心服务、智能广场体验服务(包括模型广场体验和应用广场体验,如App Builder体验等)、Seed实验室(简称“体验服务”)测试和使用体验,在试(使)用前请您认真阅读以下内容。请您务必仔细阅读并理解透彻《火山方舟体验中心服务规则和免责声明》(以下简称“本声明”)。 请您知悉,如果您选择继续使用体验服务,意味着您充分知悉并接受以下使用条件: 1. 您知悉并理解,本试(使)用体验服务下的生成内容均由人工智能模型生成,不同的人工智能模型可能生成不同的内容,模型服务由您选择试(使)用的模型服务供应商提供,不代表我们的立场。我们会努力提升生成内容的质量,但受限于现有技术,我们无法保证生成内容真实、准确、全面。 2. 为便利您的创作和体验,体验服务为您提供若干模型生成的素材,包括创作模版、虚拟人像库等(合称“参考素材”),您可以选择使用。特别提示您,参考素材是由人工智能模型生成,提供给您创作参考体验目的使用。 3. **您理解并同意,火山引擎不对参考素材及体验服务下生成的内容(包括但不限于图片、视频、音频、文字等)做任何承诺和保证,您独立承担并解决因使用该等内容产生的任何法律责任、纠纷和损失,由此给火山引擎造成损失的,您应当承担赔偿责任**。 4. 根据法律规定,人工智能生成内容需添加显著标识,以避免造成混淆或误认。您不得擅自去除或篡改体验服务对您生成内容添加的标识,包括“AI 生成”、“火山引擎AI生成”、 “火山方舟AI 生成”、“豆包AI生成”等。您使用本平台和服务,应当在生成内容(包括但不限于在生成内容界面、标题等)中显著标识相关成果由“AI生成”。 5. **模型生成的内容仅供参考,若涉及对您自身权益可能会产生重大影响的情形,建议至权威机构寻求专业建议。例如,医疗场景中,模型不提供诊疗咨询服务,其生成内容不能视为真正的医疗建议,若有身体不适请及时就医,谨遵医嘱;财经场景中,模型不提供投资咨询业务,其生成内容不能作为决策投资的依据;保险场景中,模型不提供保险咨询服务,其生成内容不能作为购买保险的依据**。 6. 您对体验服务的试(使)用行为受到相关法律法规的规制,您试(使)用体验服务请确保自定义输入的内容(包括但不限于您向模型输入的文字、图片、视频、音频等内容)未侵害任何第三方的合法权益(包括但不限于知识产权、肖像权、声音权等),同时请勿输入涉嫌违法、不良的内容。 7. 请您与我们共同维护良好的网络环境,不要输入、传播或诱导产品生成违反法律法规、社会道德和影响公共秩序的内容。我们将努力避免本体验服务生成该等内容,但如产品不慎生成的,请您不要以任何方式传播,并通过评价或投诉举报机制告知我们,我们将及时改进。您的试(使)用行为违反相关法律法规的,我们有向您追究责任的权利和向有关部门上报的义务。 8. 我们尊重并保护所有使用本体验服务用户的个人信息、隐私等权利,但在此提醒用户注意:您确认试(使)用体验服务时输入的内容将不包含您的个人信息。**如果您试(使)用服务时涉及处理个人信息、隐私、保密或敏感信息的,您应遵循相关法律规定,例如,您处理个人信息时应获得必要同意**。 9. 您理解并且同意,对于您试(使)用体验服务而向我们提供的除个人信息外的文字、图片、图文、音频、视频、代码等非个人信息,均不会因上传、发布等行为发生知识产权、肖像权等权利的转移。**除非我们另行说明,在法律允许的范围内,就您提供的前述信息,您免费授予我们及我们的关联公司非排他的、无地域限制的、永久的、免费的许可使用(包括存储、使用、复制、修订、编辑、发布、展示、翻译、分发上述信息或制作派生作品,以已知或日后开发的形式、媒体或技术将上述信息纳入其他作品内等)及可再许可第三方使用的权利,以及可以自身名义对第三方侵权行为取证及提起诉讼的权利。特别提示您,如您使用体验中心音色复刻功能,您承诺并保证您上传给平台的是您本人声音录制的音频,您不可以使用任何第三人的声音或未成年人的声音录制音频,音色复刻完成后,仅支持您在本平台体验服务目的使用。服务结束后,您的音色将被删除,平台不会存储和使用您的音色**。 10. 您理解并同意,为保障网络内容安全和避免服务滥用,您在体验服务交互过程中所输入的信息,将通过我们的安全审核模型审核,同时您输入的信息将被用于审核模型的优化以持续满足内容安全监管要求。**除非我们另行说明,在体验服务交互过程中生成的内容(“生成内容”),您不可主张生成内容知识产权**。在体验服务交互过程中,您还可以对生成内容进行评价,包括点赞、踩(“评价信息”)等。我们将收集您输入的信息、生成内容以及您的评价信息,包括您主动提交的报错原因,用于数据统计和分析以及服务算法和模型优化,以便为您提供更好的服务使用体验。火山方舟平台将在严格加密下传输并通过安全方案匿名化处理后使用您输入的信息和模型生成内容。**您通过体验服务生成的内容及参考素材仅可用于您体验模型目的,不可以进行其他目的使用,包括不可以进行任何商业化目的使用,不可以提供给第三方或在任何第三方平台进行传播、分发和使用**。 11. **第三方软件或技术** 本平台和服务可能会使用第三方软件或技术(包括可能使用的开源代码和公共领域代码等,下同),这种使用已经获得合法授权。 本平台和服务如果使用了第三方的软件或技术,我们将按照相关法规或约定,对相关的协议或其他文件,可能通过本协议附件、在本软件安装包特定文件夹中打包、或通过开源软件页面等形式进行展示,它们可能会以 “ 软件使用许可协议 ” 、 “ 授权协议 ” 、 “ 开源代码许可证 ” 或其他形式来表达。前述通过各种形式展现的相关协议、其他文件及网页,均是本协议不可分割的组成部分,与本协议具有同等的法律效力,您应当遵守这些要求。如果您没有遵守这些要求,该第三方或者国家机关可能会对您提起诉讼、罚款或采取其他制裁措施,并要求我们给予协助,您应当自行承担法律责任。 **如因本平台和服务使用的第三方软件或技术引发的任何纠纷,应由该第三方负责解决,火山引擎不承担任何责任。火山引擎不对第三方软件或技术提供客服支持,若您需要获取支持,请与第三方联系**。 12. **您不应用以下方式不当试(使)用本平台和服务**: 1. **以侵犯任何第三方合法权利(包括但不限于知识产权、肖像权、声音权等)的方式和目的试(使)用本平台和服务;** 2. **对本平台和服务的任何算法、源代码、机制等进行反向工程;** 3. **利用本平台和服务开发、训练或改善其他与火山引擎及其关联方存在直接或间接竞争关系的算法、模型等;** 4. **以任何方式试图从本平台和服务中提取数据;** 5. **将本平台和服务使用于任何对主体资格有要求的服务中,包括但不限于医疗服务、法律服务等;** 6. **利用本平台和服务用于任何决策行为;** 7. **以任何方式删除、篡改、隐匿本平台和服务在输出内容中生成的深度合成服务标识;** 8. **其他可能损害火山引擎及其关联方利益的使用方式;** 9. **协助或允许第三方从事上述任何活动**。 **特此说明,体验服务仅支持您自行使用和体验模型和产品效果,您不可将本体验服务以任何方式提供给第三方。您保证妥善保管账号与密码,对账号下所有操作承担全部法律责任**。 13. **如因您违反本声明,由此给火山引擎造成损失的,您应该赔偿火山引擎所受损失**。 14. 您理解并同意,由于体验的资源有限,我们可能会为您提供免费体验的额度限制,请您遵守官网公示的体验规则,同时我们保留如下权利: (1)对恶意抢占活动资源、批量刷单及其他任何采用非常规手段影响活动公平性的行为,火山引擎有权取消从事违法违规行为的用户活动资格并回收资源,必要时追究违规用户的法律责任。 (2)火山引擎可以根据运营情况对活动进行变更或调整,包括不限于活动规则、商品数量等,请以页面最新内容为准。用户在活动规则变更或调整前已经获得的权益不受影响。 如果您有任何问题和意见,请随时通过火山引擎 “官网-联系我们-智能客服” 或选择拨打热线 400-034-7888联系我们。非常感谢您的理解和支持,期待我们携手建设良好网络生态,帮助人工智能大模型技术提升。 15. **本声明与**[**《火山方舟大模型服务平台专用条款》**](/docs/volcengine-ark-platform-terms)**及其他适用的条款约定不一致的,以本声明为准;本声明未约定事项,仍按原适用条款的约定执行**。 [火山方舟体验中心模型备案信息公示](/docs/volcengine-ark-model-filing-disclosure) **【历史版本】** * [火山方舟平台免责声明和体验服务规则说明(2025年09月28日版)](https://docs.volcengine.com/docs/ark/volcengine-ark-experience-center-terms-and-disclaimer?TimeBefore=1759049988) * [火山方舟平台免责声明和体验服务规则说明(2025年06月20日版)](https://docs.volcengine.com/docs/ark/volcengine-ark-experience-center-terms-and-disclaimer?TimeBefore=1750426403) * [火山方舟平台免责声明和体验服务规则说明(2023年09月20日版)](https://docs.volcengine.com/docs/ark/volcengine-ark-experience-center-terms-and-disclaimer?TimeBefore=1695203544) --- # 火山引擎数据授权使用协议 Source: https://ark.volcengine.com/region:cn-beijing/docs/volcengine-data-authorization-agreement 本《火山引擎数据授权使用协议》(“**本协议**”)是您与北京火山引擎科技有限公司(“**火山引擎**”),就您授权火山引擎使用AI Coding/Agent 数据(定义见下文)的相关事项,签订的协议。 **【特别提醒】您授权火山引擎使用AI Coding/Agent 数据(定义见下文)时,火山引擎会采取相应安全措施保证AI Coding/Agent数据传输安全。如需额外获得火山引擎的加密传输、隐私计算等附加技术服务的,您可以根据本协议第4条(通知)所载联系方式咨询火山引擎**。 **为了更好地保障您的权益,您在同意本协议之前,请您务必审慎阅读,并充分理解本协议的全部内容,特别是以加粗标注的条款。如果您对本协议的条款有任何疑问,可以根据本协议第4条(通知)所载联系方式向火山引擎询问,相关人员将向您解释条款内容。如果您不同意本协议的任意内容,或者无法准确理解相关人员对条款的解释,请不要在订购页面勾选同意。如果您在订购页面特别勾选了同意本协议,即表示您已接受本协议所述的所有条款和条件,届时您不应以未阅读本协议或者未获得相关人员对您问询的解答等理由,主张本协议无效,或要求撤销本协议**。 您确认,在您注册及使用本服务时,您应当是合法成立并有效存续的法人或非法人组织。如果您是中国大陆地区以外的用户,您订立或履行本协议还需要同时遵守您所属和/或所处国家或地区的法律。 # **1.定义与解释** 1.1 除非本协议另有约定,如下术语具有本款所规定的含义: (1) **个人信息**:以电子或者其他方式记录的与已识别或者可识别的自然人有关的各种信息,不包括匿名化处理后的信息。 (2) **匿名化**:是指个人信息经过处理无法识别特定自然人且不能复原的过程。 (3) **关联方**:是指拥有一方、被一方拥有或与该方被同一其他方拥有的任何法律实体,其中“拥有”是指拥有相关实体超过50%的所有权或拥有指导其管理的权利。 (4) **火山方舟大模型服务平台**:是指由北京火山引擎科技有限公司(“**火山引擎**”)开发的,在机器学习平台上提供的一项服务功能,提供大模型的训练、推理、评测、精调等全方位功能与服务,并重点支撑大模型生态,火山方舟通过稳定可靠的安全互信方案,保障模型服务提供方的模型安全与模型使用者的信息安全。 (5) **AI Coding/Agent数据**:您在 **【Coding Plan / Agent Plan 个人版 订阅包月套餐】** 额度内调用火山方舟指定模型服务期间因调用模型而输入和模型生成的内容,包括但不限于所有输入的文本、声音、图形、图片、图像、视频、软件或任何其他类似信息。 # **2.数据授权** 2.1 授权目的:本规则项下的授权将用于开发机器学习、人工智能相关技术和模型的优化、开发、使用、学术理论研究及发表等目的。 2.2 授权范围:您同意,您将授予火山引擎一项**非独家的、不可转让的、不可分许可的(但可分许可给火山引擎关联方以及为达成授权目的第三方外包服务商)、免费的**权利,允许火山引擎为达成授权目的而**传输、存储、使用、复制、下载、修改或以其他方式处理AI Coding/Agent数据**。 2.3 授权期限:本协议项下授权的起始日期为您**在订购页面勾选同意接受本协议之日**。授权期限为**永久**。如您在同意接受本协议后,(i)拟对该授权期限进行变更或调整,或(ii)如您希望停止对火山引擎授权新AI Coding/Agent数据的,您可以立即停止**使用【Coding Plan/ Agent Plan个人版 订阅包月套餐】** 终止您对我们的授权(**“终止操作”**)。**您进一步充分知悉、理解并同意,即便您完成了终止操作,但由于机器学习和人工智能技术的特殊性,一旦(i)您授权火山引擎使用相关AI Coding/Agent数据,且(ii)相关AI Coding/Agent数据已被使用的,则对该部分AI Coding/Agent数据的使用将在技术上无法撤回**。 2.4 **您特别承诺并保证,您已合法持有AI Coding/Agent数据,并已获得AI Coding/Agent数据的一切必要充分授权或原始权利,以确保(i)您依法有权向火山引擎及其分许可方提供该等数据,且(ii)火山引擎及其分许可方有权根据本规则处理您提供的AI Coding/Agent数据。若您发现您的AI Coding/Agent数据出现任何权利争议或潜在权利争议,应立刻以书面形式根据本协议第4条(通知)所载联系方式,通知火山引擎,并尽您最大努力协助火山引擎处理该等争议。如因您违反本条约定和/或任何第三方针对火山引擎及其分许可方在本协议约定范围内使用AI Coding/Agent数据提起任何主张,您应当赔偿火山引擎及其分许可方因此遭受的所有损失**。 2.5 个人信息:您应当避免向火山引擎提供您的个人信息。如果您提交给火山引擎的AI Coding/Agent数据中不可避免地含有个人信息的,**您应当保证(i)该等个人信息的来源符合所适用的法律法规的规定,尤其是中国大陆地区法律法规的相关规定,并且(ii)您已获得了相关个人信息主体和/或实体的同意(包括必要情形下的单独同意、书面同意)和/或授权,且该等个人信息主体和/或实体授权同意的范围足以确保您能够根据本协议向火山引擎提供该等个人信息,并确保火山引擎有权在本协议第2.2及2.3条所述授权范围及授权期限内处理该等个人信息。任何情况下,AI Coding/Agent数据将在火山方舟平台进行严格加密,并通过安全方案进行匿名化后进行处理**。 2.6 保密数据:在任何情况下,您不应违反任何法律法规的规定或您与任何主体的约定,向火山引擎提供任何保密信息或商业秘密。 2.7 其他特殊数据:如您拟向火山引擎提供任何其他特殊数据的(例如,国家机密、核心数据、重要数据、人类遗传资源信息、地图数据等),**除遵守本协议第2.4条以外,您在提供前应当已获得相关政府部门一切必要充分的审批、备案或许可,并以书面形式根据本协议第4条(通知)所载联系方式,向火山引擎提出申请**,申请书内应当载明(i)该等特殊数据的类型(无需说明任何数据内容),(ii)已获得的政府部门审批、备案或许可,(iii)提供该等特殊数据的目的及必要性,以及其他火山引擎可能需要了解的情况。 2.8 **特别说明,如您参与火山引擎AI Coding/Agent 个人版订阅计划,您需遵守该计划相关数据授权和使用规则**。 # **3.使用要求与限制** 3.1 被禁用途。火山引擎承诺,其不会将您的AI Coding/Agent数据用于以下用途:(i)诽谤、侮辱、骚扰、跟踪、或威胁任何个人,侵犯或损害任何第三方的合法权利;(ii)生成、传播任何有害的、不适当的、亵渎的、淫秽的、有损他人权利的、色情的、错误的、欺诈的、侵权的、不良的、违法的、或其他有悖公序良俗的材料或信息;(iii)参与或鼓励任何可能导致您或火山引擎承担刑事或民事责任的行为;(iv)擅自以您或火山引擎的名义作出进行宣传、推广、商业活动、或做出引人误解或混淆的上述行为;或(v)进行违法活动。 3.2 被禁行为。您承诺,您不得(且不得尝试):(i)对模型进行反向工程、解密、反向编译或反向汇编(本条款禁止但现行法律允许的除外);(ii)绕开模型中的技术限制或其相关文献中的限制措施;(iii)移除模型中出现的任何著作权、商标、专利、水印或其他标识;(iv)向第三方分发、再许可、出租、租赁或租借模型; (v)以开发竞争性产品或服务为目的使用模型;(vi)传输或上传任何包含病毒、木马病毒、蠕虫病毒、定时炸弹病毒、删除蝇、或任何其他类似程序的文件,其目的或用途在于破坏、摧毁、干扰或损害火山引擎或其他人的网络、计算机系统或其他设备;或(vii)进行违法活动。 # **4.通知** 4.1 本协议下,您可通过以下方式向**火山引擎**发出通知、要求及其他通信(包括争议解决过程中的法律文件和司法文书):**您可通过登录火山引擎“官网-联系我们-智能客服”或“官网-控制台-工单服务”或选择拨打热线400-034-7888与我们联系**。 4.2 如果火山引擎拟向您发出业务通知、服务提示、验证消息、营销信息等各种信息(包括但不限于更新后的服务规则、服务升级、机房裁撤、迁移、广告等)的,将通过火山引擎官网的网页公告、系统通知、站内信、电子邮件、手机短信、即时通讯工具、邮政函件或快递等方式中的一种或多种方式向您发送相关信息。您通过任何形式提供给火山引擎的联系地址、电话、电子邮件或(和)其他联系方式,均被视为有效送达的联系方式。**此类通知将对您的权利义务产生重大影响,请您务必及时关注**。前述信息在以下情况下视为已送达: (1) 以网页公告等形式公布的,一经公布即送达(另有说明除外); (2) 以电子形式(包括系统通知、站内信、电子邮件、手机短信、即时通讯工具等)发送的,在发送成功后视为已送达; (3) 以纸质载体发出的,以交邮后的第三(3)个自然日视为已送达。 # **5.其他** 5.1 本协议的成立、生效、履行、解释及争议的解决均应适用中华人民共和国大陆地区法律。 5.2 如您与火山引擎就本协议内容或其履行发生任何争议,双方应尽力友好协商解决;协商不成时,任何一方同意向被告所在地有管辖权的法院提起诉讼;如您因使用火山方舟大模型服务平台时,与火山引擎发生任何争议的,争议解决方式以您与火山引擎之间签署的用户协议为准。 5.3 **如您与火山引擎就数据授权事宜另行签署相关协议或另有约定的,无论该等协议或约定发生在本协议签署之前或是之后,均应优先适用本协议内容**。 --- # ArkClaw 服务规则 Source: https://ark.volcengine.com/region:cn-beijing/docs/arkclaw-service-rules 本规则适用于您在火山引擎方舟平台体验中心使用ArkClaw服务。请您务必认真阅读并充分理解本规则。 1. ArkClaw 免费体验版本(“本服务”)是火山引擎为Agent Plan/Coding Plan用户(“您”)提供的ArkClaw个人AI助手搭建平台,支持一键部署开源OpenClaw并配置您需要的Skills,实现个人AI助手功能(“个人AI助手”)。 2. 个人AI助手是大模型驱动的人工智能助手,受限于现有技术,模型提供方和平台均无法对您使用该技术的可靠性和稳定性提供任何承诺与保证。您需自行评估和判断您使用个人AI助手处理数据和内容的风险并自行承担因此造成的一切后果。您理解并同意OpenClaw是三方开源软件,您的部署和使用行为需遵守相应开源规则。同时,如您配置的Skills存在特定服务规则,请您仔细阅读该规则并承担相应的使用风险。您对通过本服务实现的任何数据操作行为依法自行承担责任。 3. 您仅可基于体验目的或内部使用目的使用本服务,未经火山引擎书面同意,您不得将个人AI助手用做任何商业化目的和场景。 4. 特别提示您,请您不要使用本服务处理个人信息、隐私、保密或敏感信息。请您遵守相关法律法规,不得利用本服务侵犯任何第三方合法权益。如因您违反法律法规或本服务规则及适用的协议,火山引擎将依据 [《火山引擎服务条款》](https://docs.volcengine.com/docs/6256/64903?lang=zh) 和 [《产品和服务协议》](https://docs.volcengine.com/docs/6256/68938?lang=zh) 的相关约定进行处置并追究您的违法违约责任。**特别提示您,因您在个人AI助手中的操作导致您数据丢失、覆盖或变更等,您应自行承担责任,火山引擎不对此承担恢复、导出等义务。对于因您自身原因(包括但不限于配置不当、密钥泄露、使用第三方Skills等)导致的数据安全事件,火山引擎不承担责任**。 5. **您理解并同意,您在火山引擎方舟平台体验中心使用个人AI助手时,体验中心服务和AgentPlan/CodingPlan服务均涉及对您数据的处理和使用。火山引擎仅在您授权范围内处理您的数据,请您务必且已经充分理解并同意**[**CodingPlan活动规则**](/docs/coding-plan-personal-new-user-promotion)**和**[**数据授权规则**](/docs/volcengine-data-authorization-agreement)**,及**[**方舟服务条款**](/docs/volcengine-ark-platform-terms)**和**[**方舟体验中心规则和免责声明**](/docs/volcengine-ark-experience-center-terms-and-disclaimer)**。如本规则与前述条款有冲突,均应以本规则优先适用**。 6. **第三方软件或技术** 您可能会通过本服务使用第三方软件或技术(包括可能使用的开源代码和公共领域代码等,下同)。 本服务如果使用了第三方的软件或技术,我们将按照相关法规或约定,对相关的协议或其他文件,可能通过本协议附件、在本软件安装包特定文件夹中打包、或通过开源软件页面等形式进行展示,它们可能会以 “ 软件使用许可协议 ” 、 “ 授权协议 ” 、 “ 开源代码许可证 ” 或其他形式来表达。前述通过各种形式展现的相关协议、其他文件及网页,均是本协议不可分割的组成部分,与本协议具有同等的法律效力,您应当遵守这些要求。如果您没有遵守这些要求,该第三方或者国家机关可能会对您提起诉讼、罚款或采取其他制裁措施,并要求我们给予协助,您应当自行承担法律责任。 **您确认并承诺,如您自行安装或使用任何第三方软件或服务(包括您下载安装开源社区或第三方Skills等),您需自行遵守三方软件或服务的协议或规则。特别提醒您,您需谨慎选择第三方Skills,充分评估后再接入到个人AI助手中,火山引擎对您使用第三方软件或服务的行为及导致的任何后果不承担任何责任**。 **如因本服务使用的第三方软件或技术引发的任何纠纷,应由该第三方负责解决,火山引擎不承担任何责任。火山引擎不对第三方软件或技术提供客服、技术支持,若您需要获取支持,请与第三方联系**。 7. 由于体验资源有限,我们可能会为您提供免费体验的额度限制,请您遵守官网公示的体验规则,同时我们保留如下权利: (1)对恶意抢占活动资源、批量刷单及其他任何采用非常规手段影响活动公平性和服务稳定性的行为,火山引擎有权取消从事违法违规行为的用户活动资格并回收资源,必要时追究违规用户的法律责任。 (2)火山引擎可以根据运营情况对活动进行变更或调整,包括不限于活动规则、商品数量等,请以页面最新内容为准。用户在活动规则变更或调整前已经获得的权益不受影响。 (3)免费体验期间,火山引擎不对部署资源的可用性提供承诺与保证。如您订阅的AgentPlan/CodingPlan到期未续费,您的体验资源和您的体验数据将被释放和删除,您需要自行完成您数据的备份,火山引擎不对此承担任何责任。 如果您有任何问题和意见,请随时通过火山引擎 “官网-联系我们-智能客服” 或选择拨打热线 400-034-7888联系我们。非常感谢您的理解和支持,期待我们携手建设良好网络生态,帮助人工智能大模型技术提升。 --- # Computer Use Agent 服务规则 Source: https://ark.volcengine.com/region:cn-beijing/docs/cua-service-rules # 1. 服务规则适用说明 本服务规则适用于您向火山引擎订购或(和)使用 Computer Use Agent 产品/服务(以下简称"本服务")。 一旦您订购或使用了本服务,本规则将与(1)火山引擎官网公示的 [《火山引擎服务条款》](https://docs.volcengine.com/docs/6256/64903?lang=zh) 与 [《火山引擎隐私政策》](https://docs.volcengine.com/docs/6256/64902?lang=zh),(2)[《产品和服务协议》](https://docs.volcengine.com/docs/6256/68938?lang=zh),(3)[《火山引擎AI服务规则及免责声明》](https://docs.volcengine.com/docs/6256/2551634?lang=zh),(4)订购协议/服务订单,(4)《服务等级协议》(如有),和(5)服务规则等所适用的其他协议共同构成您与火山引擎之间就订购或(和)使用本服务的完整协议。本规则未明确约定事项,将遵照您与火山引擎订立的其他所适用协议或服务规则的约定。 # 2. 功能说明 Computer Use Agent 是一种在授权范围内协助用户执行电脑端操作的智能辅助功能。它可根据用户指令识别界面内容,并完成点击、输入、切换页面、信息提取、内容整理等操作,用于辅助处理检索、录入、整理和流程性任务。 其主要能力包括: 1. 识别页面中的按钮、输入框、菜单、表格等界面元素; 2. 执行点击、输入、复制、粘贴、切换窗口、上传文件等基础操作; 3. 按步骤协助完成信息查询、表单填写、内容整理等任务; 4. 在一定规则和权限范围内完成部分重复性流程操作。 # 3. 微软服务 如果您在使用本服务同时使用微软相关产品或(和)服务,您需要遵守微软服务使用说明。火山引擎向您提供了微软的镜像操作系统(以下称微软产品),您应遵守如下规则: 1. 产品所有权。微软产品由微软公司(统称"微软")的关联公司授予许可。微软产品受版权法和其他知识产权法的保护。微软产品和其他产品元素(包括包含在产品中的任何图像、照片、动画、视频、音频、音乐、文本及"小程序"等)均归微软或其供应商所有。您不得删除、修改或掩藏产品中或产品上包含的任何版权、商标或其他专有权声明。微软产品受版权法、国际版权公约以及其他知识产权法及条约的保护。您对微软产品的占有、访问或使用并不意味着向您转让产品的任何所有权或任何知识产权; 2. 您应就火山引擎向您提供的软件服务而使用、安装火山引擎向您提供的微软产品; 3. 您不得制作微软产品副本; 4. 您不得对微软产品进行反向工程、反向编译或反汇编,虽然有此限制,但适用的法律明示允许此类活动的除外; 5. 您不得向任何第三方出租、租赁、出借、质押或直接或间接转让或分发微软产品,也不得允许任何第三方访问和/或使用产品的功能; 6. 在适用法律所允许的范围内,微软和火山引擎不提供任何保证,且对于因软件服务引起的任何直接、间接或后果性损害赔偿和补偿,微软或其供应商以及火山引擎不负责任; 7. 对软件服务的任何支持均由火山引擎或火山引擎委托的合作伙伴向您提供,而不是由微软、微软供应商、微软关联公司或子公司提供; 8. 微软产品不具备容错功能,并且不保证不会出现错误或操作时不会出现中断。您不得将微软产品用于由于产品故障而可能会导致死亡、严重人身伤害,或严重的物理或环境损害(以下简称"高风险使用")的应用或情况。 --- # Harness 能力说明和产品专用条款 Source: https://ark.volcengine.com/region:cn-beijing/docs/harness-rules # 1. 条款适用 1.1 本条款适用于用户订购、开通、配置和使用 Agent Plan 过程中启用的 Harness 功能。 1.2 本条款作为 Agent Plan 相关订购协议、产品服务协议、服务规则及 Harness 能力说明的补充条款。用户订购或使用 Agent Plan 中的 Harness 能力,即视为已阅读并同意本条款。 1.3 如某一 Harness 能力另有产品服务专用条款、产品说明、服务等级协议或使用规则的,该等产品规则与本条款共同适用。 # 2. Harness 能力介绍 2.1 Harness 能力是指 Agent Plan 面向 Agent 场景提供的工具层能力,用于辅助 Agent 完成联网检索、记忆增强、专业数据查询、工具调用、代码执行、应用构建等任务。 2.2 Agent Plan 将模型能力与 Harness 能力纳入统一套餐体系。用户订购 Agent Plan 后,可在套餐支持范围内使用已接入的 Harness 能力。具体可用能力、功能范围、计量方式、使用限制和服务规则,以 Agent Plan 页面展示及对应 Harness 能力说明为准。 当前版本已接入的 Harness 能力如下: | **Harness 能力** | **介绍** | |---|---| | 专业数据服务 | 支持 Agent 调用国内股票金融数据、国内企业工商数据、国内论文搜索等专业数据。 | | 豆包搜索 | 豆包同款联网搜索,专为Agent使用开发,扩充大模型知识库,提升回答可信度。 | | OpenViking Context | 基于开源 OpenViking 内核构建的全托管云服务。OpenViking 是一款面向 AI Agents 的上下文数据库,由火山引擎开源,以“虚拟文件系统 + 分层上下文 + 目录递归检索 + 可观测与自迭代”为核心思想,通过将 Memory、Resource、Skill 统一抽象为文件的理念,解决 AI Agent 在执行对话和长周期任务时的复杂上下文管理难题,为 AI Agent 开发者提供结构化、可追溯且低成本的上下文工程解决方案。 | | AI Native 应用开发底座 | AI 原生 BaaS 平台 Supabase 版,基于开源 Supabase 打造,100% 兼容 Supabase 开源用法,包括 PostgreSQL Database、Authentication、Storage、Edge Function、Realtime、AI 助手、API Docs 等,具备云原生服务特有的高弹性低价格等特点。 | | Computer Use Agent | 面向 AI Agent 场景的用户专属云端运行环境,为 Agent 提供可见、可操作的 Windows 云桌面,支持浏览器自动化、视觉自动化、长程任务和虚拟外设等能力,**本期仅 Agent Plan 个人版 Large 或 Max 套餐支持**。 | 后续如新增其他 Harness 能力,将在 Agent Plan 页面及对应能力说明中更新。 # 3. Harness 开通与使用 ## 步骤一:订购 Agent Plan 套餐 用户进入 Agent Plan 购买页,选择并订购对应套餐。套餐内容、套餐额度和费用信息以购买页展示为准。 ## 步骤二:查看 Harness 配置 订购完成后,用户可在 Agent Plan 页面查看当前套餐支持的 Harness 能力及配置范围。 当前版本支持专业数据集、豆包搜索、 Harness、OpenViking Context、AI Native 应用开发底座、Computer Use Agent。后续新增 Harness 能力后,将在页面中展示对应服务项。 ## 步骤三:开启或确认配置 对于页面中需要用户主动开启的 Harness 能力,用户需按页面提示完成「开启抵扣」等确认操作。开启后,对应 Harness 能力可使用 Agent Plan 套餐额度 / AFP 进行抵扣。 ## 步骤四:接入并使用服务 用户应按照对应 Harness 能力说明完成接入和使用。具体接入方式、调用方式、参数配置、权限要求和使用限制,以对应说明为准。 ## 步骤五:查看用量与开启超额后付费 用户可在 Agent Plan 页面查看 Harness 能力的用量消耗情况。 套餐额度用尽后,如需继续使用支持超额后付费的 Harness 能力,用户需按页面提示开启超额后付费。开启后,超额部分按照对应服务计费规则收费。 # 4. 套餐额度与计费规则 4.1 不同 Harness 能力的计费详细规则不同。具体配置范围、额度规则和计费方式以 Agent Plan 页面及对应服务说明为准。 4.2 不同 Harness 能力的计量方式可能不同,包括但不限于调用次数、Token、查询次数、计算资源、存储资源、实例资源等。具体计量方式以对应 Harness 服务说明及产品页面展示为准。 4.3 套餐内使用 Harness 能力时,优先消耗 Agent Plan 套餐额度 / AFP。套餐内用量通常不再就该 Harness 能力单独推送后付费账单。 4.4 当 Agent Plan 套餐额度耗尽后,如用户未开启超额后付费,相关 Harness 能力可能无法继续使用。 4.5 当 Agent Plan 套餐额度耗尽后,如用户已主动开启超额后付费,且对应 Harness 能力支持超额后付费,则可继续使用该能力,超额部分将按照对应服务的标准 API 价格、商品 code、刊例价或产品计费规则收取费用。 4.6 超额后付费默认关闭,用户需主动开启后方可生效。是否支持开启、关闭、状态查询和用量展示,以 Agent Plan 页面和对应服务说明为准。 --- # 5. Harness能力对应服务协议与说明 用户使用具体 Harness 能力前,应阅读并遵守对应服务的产品说明、产品专用条款、服务规则或服务等级协议。 | 服务名称 | 链接 | |---|---| | 专业数据集 | * [高质量数据集服务专用条款](https://docs.volcengine.com/docs/87646/2222216?lang=zh) | \ | | * [高质量数据集服务等级协议](https://docs.volcengine.com/docs/87646/2222216?lang=zh) | | 豆包搜索 | * [豆包搜索专用条款](https://docs.volcengine.com/docs/87772/2272947?lang=zh) | \ | | * [豆包搜索服务等级协议](https://docs.volcengine.com/docs/87772/2272948?lang=zh) | | OpenViking Context | * [OpenViking Context 服务等级协议](https://docs.volcengine.com/docs/84313/2485137?lang=zh) | | AI Native 应用开发底座 | * [产品和服务测试协议](https://docs.volcengine.com/docs/87275/2105928?lang=zh) | | Computer Use Agent | * [Computer Use Agent 服务规则](/docs/cua-service-rules) | 后续新增 Harness 能力时,将同步补充对应服务说明和产品专用条款链接。 # 6. 其他 6.1 本条款适用于 Agent Plan 中已接入及后续新增的 Harness 能力。 6.2 当前版本支持专业数据集、豆包搜索、 Harness、OpenViking Context、AI Native 应用开发底座、Computer Use Agent;其他 Harness 能力以后续页面展示为准。 6.3 Computer Use Agent 不支持超额后付费。当 Agent Plan 套餐额度耗尽时,Computer Use Agent 使用入口将默认关闭,机器为用户保留 7 天,超过 7 天关闭的机器会被销毁。 6.4 如本条款与第5条 Harness 能力对应的产品专用条款、服务规则或页面说明不一致,以对应产品规则为准。 6.5 Agent Plan 可根据产品规划、技术演进、商业策略或合规要求,对 Harness 能力范围、配置内容、计量方式、开通方式和服务文档进行调整,调整内容以页面展示及官方说明为准。 --- # 豆包模型服务协议 Source: https://ark.volcengine.com/region:cn-beijing/docs/doubao-model-service-agreement **豆包大模型服务协议** **发布日期:2026年9月17日** **生效日期:2026年9月23日** **欢迎使用豆包大模型(原名“云雀模型”)服务!** **当您通过火山方舟大模型服务平台(以下简称“火山方舟”)使用豆包模型服务之前,请您务必认真阅读并充分理解《豆包大模型服务协议》(以下简称“本协议”)。** **豆包大模型是北京火山引擎科技有限公司关联公司提供的(北京火山引擎科技有限公司及其关联公司统称“火山引擎”),由火山方舟售卖的模型服务。其中,免除或限制责任条款等重要内容会以加粗形式提示您注意,您应重点阅读。一旦您使用服务,则视为您已充分理解本协议并承诺遵守本协议,接受本协议的约束。** **双方均保证其经营活动已获得合法经营资质或有关部门批准,有权依法运营其产品和服务。双方进一步保证,在本协议有效期内持续具备相关资质或批准,并应符合国家及经营所在地不时颁布的法律法规与地方性法律文件的要求。** **第一条 产品及服务内容** 1.1 火山引擎向您提供豆包系列大模型,包括大语言模型、图片生成模型系列、视频生成模型以及其他火山方舟展示的模型和服务(合称“**模型服务**”或“**服务**”)。 1.2 服务授权范围。受限于本协议其他条款和条件,火山引擎授予您享有根据1.1条订购的服务的非排他的、不可转让、不可分许可、不可转许可、有期限限制,在中国大陆地区范围内的普通使用许可权。 1.3 服务授权期限。自您开通服务之日起开始计算。如您违反本协议任意一条约定的,火山引擎有权撤回或终止1.2条的服务授权,并要求您将大模型相关的版本、文档、代码、程序、软件、数据等所有由火山引擎提供的资料及其任何复制件、副本、缓存进行销毁或退回,您不得保留和使用与服务有关的任何内容,并向火山引擎提供可合理信服的销毁证明。当违约行为被纠正或由此给火山引擎造成的损失全部被您弥补后,火山引擎可恢复服务授权。 **第二条 服务使用限制** 2.1 除本协议另有明确约定外,您不得将服务的全部或部分进行复制、转让、出租、出借、出售或提供分许可、转许可,不得限制、破坏或绕过服务附带的加密软件或火山引擎提供的其他确保服务正确使用的限制性措施。 2.2 除根据第1.2条使用模型服务外,您未取得任何火山引擎保密信息、服务中包含的任何知识产权的权利、所有权或权益。 2.3 您不得对产品服务进行反向工程、反编译或反汇编;不得以任何方式试图从服务中提取数据、参数、代码或其他属于火山引擎的保密信息;不得删除任何版权声明、商标或其他专有的限制性或机密性图标,并应书面告知最终用户不得为之。 2.4 您除将服务与您具体的业务场景结合后使用外,不得将服务、提示词和通过服务生成的内容用于服务之外的新模型或其他模型的开发、训练、标注、微调、优化、迭代以及其他类似活动,不得利用火山引擎服务开发、训练或改善其他与火山引擎存在竞争关系的算法、模型。 2.5 您同意不会将模型服务或模型生成的内容用于任何可能对火山引擎及其关联公司的利益、商誉、模型、运营产生不利影响之目的,亦不会基于对模型服务的使用对火山引擎及其关联公司提起或支持任何形式的诉讼和赔偿。 2.6 您保证在使用本协议项下服务过程中,不得对火山引擎及其关联公司的服务有以下行为:利用技术或其他手段破坏、扰乱本协议项下产品服务的运营;以任何方式干扰或企图干扰任何产品服务或任何功能的正常运行,或者制作、发布、传播上述工具、方法。 2.7 为保障最终客户的良好体验与高质量的服务,您在向终端用户提供本协议项下服务时,应维持与该等高质量服务水平相匹配的合理商业条件;不得以牺牲服务质量、技术标准为代价,采取不合理的商业手段扰乱良性市场生态。承诺在市场拓展中严格遵循公平、诚信的原则;不得以排挤竞争对手或破坏市场正常交易秩序为目的,采取违背一般商业逻辑的倾销或其他不合理的商业条件进行恶意竞争。 2.8 您的用户或您员工违反以上限制的,您应督促您用户或员工整改,由此给火山引擎造成损失的,您应承担赔偿责任。您不得协助或允许任何第三方从事上述2.1、2.2、2.3、2.4、2.5、2.6、2.7条约定的任何活动。 **第三条 服务使用规则** 3.1 您保证在使用模型服务时须遵守相关法律法规,不违反《中华人民共和国刑法》、《中华人民共和国反不正当竞争法》、《中华人民共和国网络安全法》、《中华人民共和国数据安全法》、《中华人民共和国个人信息保护法》、《生成式人工智能服务管理暂行办法》等相关法律法规及政策,维护互联网秩序和网络安全,不得利用服务发布危害国家安全的、破坏民族团结的、扰乱社会秩序的、有歧视性的、不正当的言论,或侵害任何第三方的个人信息保护权、名誉权、人格权、知识产权、财产权等其他任何权益,或从事涉及黄赌毒、违反法律法规或公序良俗的行为。如果您(包括您的终端用户)有任何违反服务使用规范行为的,火山引擎有权采取警示、限制功能、暂停提供服务、删除违法违规信息、锁定账号等火山引擎认为合理的处理措施。 3.2 您接入我们服务向公众提供内容生成式人工智能产品或服务的,您应当就您对公众提供的产品和服务独立承担“生成式人工智能服务提供者”及依法适用的其他责任,包括但不限于需要开展安全评估和算法备案工作,且应同时满足法律法规政策相关的要求,对生成内容的安全性、合法性、合规性进行有效管理和控制,建立包括但不限于内容审核、用户管理、数据安全、监测预警和应急处置等机制。如因用户使用您产品或服务导致数据安全、舆情风险或发生任何产品或服务被滥用、传播、不当利用而产生的风险和责任,应由您自行承担。因此给火山引擎造成损失的,您应向火山引擎承担相应责任。 3.3 您对所有模型输出内容的使用以及评估模型输出在具体使用案例、场景中的准确性、合法性和适当性独立负有全部责任。您(包括您的终端用户)不应利用模型制作侵犯第三方合法权益(包括但不限于知识产权、肖像权、声音权、名誉权等)的内容。如果由于您未能履行该等义务给火山引擎造成损失,或者引发相应纠纷的,由您独立承担责任,并赔偿火山引擎因此所受损失。 3.4 您理解并确认,如需通过本服务操作终端执行或完成跨应用操作,您应谨慎评估风险,并需事先取得火山引擎的书面确认。 3.5 为便利您的创作和体验,平台为您提供若干人工智能生成的素材,包括虚拟人像库等(合称“**参考素材**”),您可以选择使用。未经火山引擎书面同意,您不得复制、下载、汇编、分发、销售参考素材,不得脱离火山引擎平台和服务使用参考素材,也不得将参考素材用于与火山引擎产品和服务存在竞争关系的用途(包括不得用于开发/形成同类素材库)。您知悉并确认,尽管我们在通过人工智能生成虚拟人像等素材时充分考虑了多元化,但由于地域和文化可能存在差异,如果您在参考使用时认为参考素材体现的地域,性别,年龄,职业,种族,肤色或其他方面缺少您的业务所需要素材的,可以向我们提供建议。 3.6 视频生成模型可接受图片、视频、音频作为服务输入的组成部分(“**视觉功能**”),您可以自行上传素材(“**自定义素材**”)用于视频内容的生成和优化。您承诺并确认您上传的自定义素材为您合法享有知识产权的内容或已经获得相关权利人的充分、合法授权,您将自定义素材用于模型服务以及您后续使用模型基于自定义素材生成的内容均不会侵犯任何第三方合法的权益(包括但不限于版权等知识产权、肖像权、声音权等),您进一步确认,自定义素材为您或相关权利人的原创素材,不含有任何侵犯第三方合法权益的内容。您不得使用视觉功能协助识别个人身份,不得以该功能索取或推断个人的隐私或敏感信息。未经相关人员明确同意且未取得所有必要权利,您不得使用视觉功能重现、生成任何人的肖像、声音。如您选择在任何渠道和任何形式公开分享模型生成的图片或视频(例如分享至社交媒体、内容平台,创建虚拟形象等),即表示您已取得生成内容所涉及的所有必要权利,且您同意授予火山引擎复制、分发、修改、展示及使用该等内容的权利,以用于服务的运营。如果您无法确认自定义素材的权利情况,请不要上传,也不要用于模型服务,如因此而产生侵权行为和后果,应由您自行承担全部责任;上传权属不明或有权属瑕疵的或含侵权内容的素材的行为同时构成了诱导和滥用模型的行为,火山引擎将保留要求您承担违约责任的权利,若因此导致火山引擎被第三方追责,火山引擎有权向您追偿因此所受全部损失。 3.7 如您的自定义素材中包括真人的人像素材,您需获得权利人本人的授权。请您联系火山引擎并提供相关证明文件,或通过火山引擎提供的认证工具进行认证后使用真人素材上传功能。您应确保您已获得被认证自然人的充分授权和同意,有义务采取安全措施存储和保护经由您管理的账号发出的认证工具所采集的个人信息(含个人敏感信息)。火山引擎有权依据您提供的证明文件,自行决定是否为您开通此功能。特别提示您,审核和认证技术是前置的且无法保证毫无缺陷,通过审核和认证并不构成火山引擎对您的素材及使用的合规性的实质性确认,不代表您使用他人的真人人像及声音素材不会侵犯权利人的相应权利,亦不豁免您的合规义务,您在上传、使用任何涉及他人肖像及声音素材前,仍须确保已获得权利人的合法、充分授权,且您仍需要对相应素材的使用行为独立承担全部责任,因相关素材使用给火山引擎造成损失或被第三方追责的,您仍需向火山引擎承担赔偿责任。如您上传的是与真人人像相似度较高的虚拟人像,也有可能无法成功上传至自定义素材。 3.8 根据《生成式人工智能服务管理暂行办法》、《人工智能生成合成内容标识办法》等法律法规及配套国家标准的相关规定,您需要对您利用本服务生成合成的内容履行添加显示标识和隐式标识的合规义务。添加显示标识的同时您应遵守本协议第6.3条对于品牌、商标使用的规范。 3.9 您应采取合理和适当的措施,以确保访问、使用服务的安全性。若您发现服务有任何漏洞的,应立即联系火山方舟,并提供该漏洞或漏洞的详细信息。在修复或处置过程中,您不应将该等漏洞信息对外披露,包括但不限于公开发布到任何第三方平台。 3.10 您理解并同意,您使用视频生成模型服务时,火山引擎向您提供的模型API接口文件、密钥信息、操作指引及模型安全策略等(”合称模型API“)信息均属于火山引擎的保密信息,您应采取严格的安全保障措施,并具有高度的注意义务来防止未经授权的披露和使用保密信息。如您将模型API的信息提供、泄露、透传给您及您的关联公司之外的人员、公司或机构,无论故意或过失均属于违约行为,火山引擎有权要求您承担违约责任。任何未经火山引擎书面授权而从您及您员工处获得的模型API的人员、公司或机构,您应积极配合火山引擎追究其法律责任,如给火山引擎造成损失的,您应承担连带责任。 **第四条 数据访问和使用** 4.1 除非您单独同意,本服务将不使用您提交给服务或使用服务输出的内容训练、重新训练或改进基础模型。您单独同意的情况包括: 4.1.1 同意火山引擎的《数据授权使用协议》;或 4.1.2 参与火山引擎协作奖励计划,包括奖励资源包或不定期为您提供的其他奖励或优惠活动等。 4.2 为履行法定合规要求,火山引擎有权采取技术手段对您使用本服务的行为及信息进行审查,包括但不限于对您提交给服务或使用服务输出的内容进行自动化过滤审核,建立和改进风险过滤机制、违法违规内容特征库等。 4.3 您确保火山引擎基于您同意对前述信息内容的存储和使用不会侵犯任何第三方的合法权益。 4.4 您应对您的数据,即您试(使)用服务而向我们提供的文字、图片、声音、音频、视频、代码等数据(下称“**您的数据**”)的来源及内容负责,火山引擎提示您谨慎判断数据来源及内容的合法性(包括但不限于遵守适用的个人信息保护及数据跨境传输法律法规、不侵犯第三方知识产权、人格权利等)。 **第五条 知识产权** 5.1 背景知识产权。任何一方和/或其关联方在本合同签署之前所拥有的背景知识产权依然归属该方所有。为免疑义,模型的所有权、知识产权归属火山引擎,包括不限于模型参数、算法、代码、框架结构等。 5.2 算法、参数、源代码。火山引擎不提供有关服务的算法、参数、源代码。除本合同明确约定外,您对火山引擎提供的服务不得进行任何算法、参数、代码等的修改。由于您对火山引擎提供的服务进行任何算法、参数、代码等的改动而导致服务不能正常运行或服务效果降低的,火山引擎对此不承担责任,由此给火山引擎或火山方舟造成损失的,您应当承担赔偿责任。 5.3 在适用法律允许的范围内,您的数据的知识产权归属于您或者依法享有这些知识产权的权利人。火山引擎不主张模型生成内容的所有权,您需在合法合规的范围内使用生成内容。为避免疑问,如前述数据和内容包含了火山引擎享有知识产权或其他合法权益的内容,则前述数据和内容相应权利仍由火山引擎享有,不因包含在模型生成内容当中而改变其权属。 5.4 您知悉理解并同意,由于人工智能技术的特性,其他第三方使用本服务获得的输出内容,可能与您使用本服务所获得的输出内容相同或相似。此情况下,您同意不会向火山引擎或其他用户主张该等输出内容的专有权利,您和本服务其他用户均可以使用该等输出内容。 5.5 您可以通过火山引擎允许的范围和方式对模型进行调优,就产生的调优内容(“**调优内容**”),您同意仅能部署在火山方舟,在按照火山引擎官网展示的计费与结算规则支付费用前提下,中国大陆地区范围内,您仅可将调优内容用于您内部使用或在您的产品中调用以供您的最终用户使用。您理解并同意,在协议有效期内及协议终止后,您不得把调优内容以任何形式下载、复制、搬离或转移至火山方舟之外的任何平台、载体或媒介,也均不可申请或要求火山引擎配合您将调优内容搬离火山方舟。您进一步确认,火山引擎不向您提供调优内容的任何算法、参数或源代码。如需在上述明确约定的使用范围外使用调优内容或获得调优内容的任何算法、参数或源代码,您需要获得火山引擎的事先明确书面同意。 **第六条 保密** 6.1 保密义务。任何一方应当对其他方披露的信息进行保密,未经披露方书面同意,接收方不得将保密信息向任何第三方披露。接收方应采取不低于该方对其自身的类似信息所采取的同等程度的安全保障措施,且不得低于合理的注意程度来防止未经授权的披露和使用保密信息。接收方应确保其管理人员、必要的雇员、顾问、律师遵循本协议关于保密的规定。 6.2 任何一方经对方允许后可向该方的关联方、受托方等第三方在必要范围内提供披露方的保密信息,但接收方应保障第三方遵守本协议规定的保密条款。 6.3 未经火山引擎书面/邮件同意,不得在任何时候、以任何方式(无论是直接还是间接,也无论是明示还是暗示;包括但不限于任何营销、广告、促销、市场推广、资本市场宣传或其他目的):(1)使用、引用、公布、复制、分销,展示(公开或非公开)、提及、注册或申请注册:(i)火山引擎或其关联方拥有或有权使用的任何商标(无论是否已注册)、商号、名称、标志或者标识(包括但不限于:“火山引擎”、“豆包大模型”“Seedance”及其相应版本系列等),或通过特定描述使第三方能够识别火山引擎或其任何关联方。同时,请您了解并遵守火山引擎官网发布的《豆包大模型商标使用规范》(ii) 火山引擎或其关联方任何董事、监事、管理人员、雇员或合伙人、科学家团队的姓名、肖像、形象、照片、图片、标识、发言或评论(或其一部分),或(iii)与前述各项相似的、以任何语言形式存在的任何名称、商标、标识、文字、词语、符号或其任何组合;及(2)直接或间接声明您或其任何关联方所提供的任何产品或服务已由火山引擎或其任何关联方认可或支持。特别地,除火山引擎以外的任何一方向火山引擎确认和承诺,未经火山引擎事先书面/邮件同意,其不得将火山引擎相关的宣传/广告/影响策略及内容向任何第三方进行宣传或披露、亦不得利用火山引擎或其相关方品牌直接或间接谋求及/或招揽任何投资及/或合作机会。 6.4 每一方的保密义务应为永久有效,不因本协议的终止而终止。 **第七条 违约赔偿和责任限制** 7.1 您因未能履行本协议项下义务或严重违反本协议规定致使火山引擎遭受损失的,您应当赔偿火山引擎因此遭受的全部经济损失。 7.2 如火山引擎认为您存在本条款第二、第三、第四、第五、第六条列明的行为时,将认定为严重违约。火山引擎有权采取限制和终止向您提供服务的措施,并有权就每一次/项违约行为要求您支付您的订单总额(或在协议有效期内承诺向火山引擎消费的合同金额)的10%作为违约金。在法律允许的范围内,如您多次/项的违约行为将累计计算违约金额,违约金不足以补偿火山引擎经济损失的,火山引擎有权要求您补足经济损失。 7.3 **鉴于大模型技术应用具有探索性,双方理解并同意,火山引擎不承担大模型生成内容本身产生的责任。** 除此之外,火山引擎向您承担的全部责任合计不超过您在火山引擎下单的由火山引擎提供模型服务的协议项下已收取合同金额的10%。 7.4 任何一方均不负担因本协议或因使用根据本协议所收到的产品和服务所引起或导致的偶然的、附带的、惩罚性的、特殊的、间接的损失或损害,包括但不限于利润或商誉的损失,无论上述损失或损害如何产生、系基于何种责任理论,且无论存在于违约、侵权、赔偿或任何其他诉讼理由而提起的诉讼中,即使被告知该等损失的可能性。 **7.5 出现以下情形,则火山引擎不承担任何赔偿责任:** **7.5.1 您或您的终端用户已知或应知输出内容存在侵权或可能侵权;** **7.5.2 您或您的终端用户禁用、忽略或未使用火山引擎提供的任何安全防护功能及限制;** **7.5.3 模型输出内容被修改、转换,或与非火山引擎或其关联公司提供的产品或服务结合使用;** **7.5.4 您或您的终端用户使用无授权的内容作为模型的输入内容或调优内容/调优模型生成涉嫌侵权的输出内容;** **7.5.5 索赔主张是基于您或您的终端用户或您的客户/合作方在商业活动中使用模型输出内容而违反商标或相关权利;** **7.5.6 涉嫌侵权的输出来自第三方产品的内容。** **第八条 免责声明** **8.1 火山引擎的产品和服务是按照现有技术和条件所能达到的现状提供的。火山引擎将尽最大努力确保产品和服务的可用性,除本合同或双方书面确认的其他规定外,火山引擎不作任何其他明示或暗示的陈述或保证。例如,火山引擎未声明或保产品和服务100%完整、准确、可靠、更新及时,也不保证产品/服不间断、系统稳定没有任何故障、服务及生成内容完全安全或不侵权,您应根据其实际情况独立判断。您(包括您的终端用户)基于产品和服务生成的内容产生的任何知识产权及人格权纠纷均由您自行处理并承担所有责任,由此给火山引擎或火山方舟造成损失的,您应当承担赔偿责任。您也同意,即使火山引擎提供的产品和服务存在瑕疵,其将不被视为火山引擎违约。火山引擎的责任应以您在使用产品和服务时严格遵守本合同或其他有关操作指南、使用规范的文件为前提,否则,当产品和服务使用不当时,火山引擎将不承担相应的责任。** **8.2 如您在服务使用过程中加入新的数据进行模型训练、微调和开发,由此产生的责任由您自行承担。您进行训练、微调和开发后,受到损害并主张火山引擎承担责任的,应证明损害与其训练、微调和开发无关,否则火山引擎对损害免责,由此给火山引擎或火山方舟造成损失的,您应当承担赔偿责任。** **8.3 如火山引擎有合理理由认为所有或任何部分服务可能成为争议的对象,则有权替换或修改服务而无需获得您的同意;如果替换或修改服务在商业上不可行,火山引擎可以在书面通知您以后终止本协议,并退还任何未使用服务的预付款项。您应及时遵循火山引擎提供的所有合理指示,包括任何关于更换、修改或停止使用该服务的指示。如果您未能及时遵循火山引擎的所有合理指示而导致争议扩大的,则自火山引擎向您发出合理指示之日之后产生的扩大损失将不能计入7.2条火山引擎依据本协议向您承担责任范围。** **第九条 终止** 9.1 未经双方书面同意,任何一方不得提前终止本协议。 9.2 在不损害任何一方可享有的任何其他权利或救济的前提下,如果一方出现以下情况之一,对方有权通过向其发出书面通知立即终止本协议(包括本协议项下的所有附件): 9.2.1 严重违反本协议项下不可补救的任何义务; 9.2.2 严重违反本协议项下可补救的任何义务,但没有在收到要求补救的书面通知后六十(60)日内完成补救; 9.2.3 发生足以使任何法院或者债权人指定接管人、管理人或者提交解散申请或者做出清算命令。 9.3 您确认并同意,火山引擎发现您的使用行为可能存在异常情况时将立即暂停服务,您应在接到通知后积极核实异常情况,并将核查的真实、完整情况及原因书面反馈给火山引擎,以便火山引擎判断是否恢复服务,如因您的异常使用及未能提供情况反馈导致服务不能恢复而提前终止的,火山引擎无需承担任何责任。 **第十条 其他规定** 10.1 任何一方均不对因不可抗力导致未能履行或延迟履行本协议承担责任,包括但不仅限于:天灾、民事或军事机关的行为、火灾、疫情、流行病、洪水、地震、暴动、战争、破坏活动、超出合理控制范围的突发事件和政府行为;但前提是迟延履行的一方:(1)及时在任何该等事件发生后的十四(14)日内以书面形式通知其他方有关相关事件并提供相关证明;并(2)尽合理努力纠正该等未能履行或迟延履行的行为。 10.2 如果一方未行使或延迟行使其在本协议项下的某项权利、权力或特权,不构成该方对此项权利、权力或特权的放弃,如果该方已经行使或者部分行使某项权利、权力或特权,并不妨碍其在将来再次行使此项权利、权力或特权。 10.3 本协议及其附件构成各方就本协议标的达成的全部协议,并且取代各方之间此前就该标的进行的所有磋商、谈判以及达成的协议。 10.4 本协议不得以口头方式修改,而须经各方签署书面文件后方可修改。 10.5 本协议适用中华人民共和国法律。因本协议产生之争议,双方应首先协商解决;双方未能协商解决的,任何一方均应将争议提交本协议签订地有管辖权的人民法院裁决。双方无争议的部分,应当继续履行。 **第十一条 协议期限及其他** 本合同自您点击模型使用页面并确认本协议之日起,或开通服务之日(如不一致以最早之日计算)起生效,有效期截止到双方履行完毕本协议。 **【历史版本】** * [豆包模型服务协议(2026年3月31日版)](https://docs.volcengine.com/docs/ark/doubao-model-service-agreement?TimeBefore=1774938205) * [豆包模型服务协议(2025年12月18日版)](https://docs.volcengine.com/docs/ark/doubao-model-service-agreement?TimeBefore=1766041906) * [豆包模型服务协议(2024年12月11日版)](https://docs.volcengine.com/docs/ark/doubao-model-service-agreement?TimeBefore=1733983279) * [豆包模型服务协议(2024年05月14日版)](https://docs.volcengine.com/docs/ark/doubao-model-service-agreement?TimeBefore=1715691620) * [云雀模型服务协议(2023年09月19日版)](https://docs.volcengine.com/docs/ark/doubao-model-service-agreement?TimeBefore=1695128763) --- # 火山引擎豆包大模型商标使用规范 Source: https://ark.volcengine.com/region:cn-beijing/docs/volcengine-doubao-trademark-usage-specification 发布日期:2025年12月11日 本《火山引擎豆包大模型商标使用规范》(“**本规范**”)由北京火山引擎科技有限公司(“**火山引擎**”)制定并发布。 **1. 商标定义与适用范围** 1.1 本规范所称“商标”,指“火山引擎豆包大模型”、“豆包大模型”及相关标识(包括文字、图形、组合标识及其他显著品牌特征)。 1.2 本规范适用于已获得火山引擎书面授权使用商标的合作伙伴(包括企业客户、代理商、联合营销伙伴等)(“**使用方**”),且不构成对任何公众主体的商标授权。 **2. 总体要求** 2.1 使用目的:商标的使用仅限于体现合作关系、技术集成来源、产品或服务能力支撑,不得造成混淆,不得误导他人认为使用方拥有商标或代表火山引擎。 2.2 核心原则:使用方需保持商标的原始形态,不得修改、拆分或组合;明确标注合作关系,不得暗示存在任何关联关系。 **3. 视觉规范** 使用方在应用界面、说明书、宣传物料、线下活动展示等所有已授权的物料中使用商标,需遵守以下要求: 3.1 商标示例 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/de8a3fac7c2d457db71d9e147832db74~tplv-goo7wpa0wc-image.image) 3.2 具体要求 |**项目** |**具体要求** | |---|---| |完整性 |不得变更字体、比例、颜色、透明度,不得拉伸、倾斜、加描边、加阴影、裁剪或添加任何视觉效果。 | |留白与位置 |商标四周需明显留白,不被遮挡、不贴近其他元素、不置于任何妨碍可读性或显示的背景上;展示突出程度不超过使用方自身品牌标识。 | **4. 文字表述规范** 4.1 正确称谓:仅可使用“火山引擎豆包大模型”或“豆包大模型”。未经授权不得使用“豆包模型”、“火山豆包”、“豆包”、“Doubao”等缩写、简称或变体。 4.2 权利声明:使用商标时需标注:“‘火山引擎豆包大模型’及相关标识为北京火山引擎科技有限公司的商标”。 4.3 合作说明:使用商标时需明确标注“技术支持:火山引擎豆包大模型”或“与火山引擎豆包大模型合作”,不得使用“官方”、“独家”、“认证”等误导性表述。 **5. 禁止行为** 使用方不得实施以下行为: 5.1 未经授权使用:包括但不限于在未获得授权的任何产品、系统、软件、活动、网站、域名、APP、小程序、公众号及其他社交媒体账号中使用;授权期限届满后继续使用。 5.2 改变商标形态:包括但不限于修改颜色、字体、比例、透明度;拆分图形或文字;与使用方自身或第三方品牌组合形成新标识。 5.3 误导性表达:包括但不限于明示或暗示火山引擎存在官方背书、独家合作、深度认证等关联关系。 5.4 超范围或不当使用:包括但不限于用于食品、服装等非相关商品或服务;用于色情、暴力、政治敏感等违法违规内容;注册相同或近似的商标、域名、账号等。 **6. 违规处理** 6.1 火山引擎发现违规后,将书面通知使用方限期整改。 6.2 情节严重或拒不整改的,火山引擎有权撤销商标使用授权,并追究法律责任。 6.3 必要时,火山引擎有权采取法律措施维护自身商标权益。 **7. 附则** 7.1 火山引擎保留与商标相关的任何及所有权利。 7.2 本规范自发布之日起生效。火山引擎有权根据品牌策略和法律要求随时更新,最新版本以官网发布为准。 7.3 使用方应主动查阅并遵守本规范的最新版本。 7.4 如有疑问,请咨询火山引擎品牌管理部门:marketing@volcengine.com / 400-034-7888。 --- # 月之暗面模型服务协议 Source: https://ark.volcengine.com/region:cn-beijing/docs/moonshot-model-service-agreement # **用户协议** 欢迎签署本《用户协议》(下称"本协议")并使用Moonshot(定义见下文)服务。 ## **相关定义说明** **Moonshot**:指北京月之暗面科技有限公司经营的问答对话生成平台产品。 **Moonshot服务提供者**:指Moonshot的互联网信息及软件技术服务提供者北京月之暗面科技有限公司。 用户或您:指使用Moonshot产品或服务的人。 ## **协议适用范围** 本协议由您和月之暗面签署,自您确认接受之时起或自您使用Moonshot的行为发生之时起生效。 除非另有明确规定,平台新增的任何新功能、新产品、新服务,均无条件地适用本协议。 ## **账号与使用说明** 在您使用Moonshot服务时,需要您先通过 [火山引擎官网平台](https://www.volcengine.com/) 进行: * 用户注册 * 实名认证 ### **用户资格说明** 请确认在您开始注册程序使用Moonshot服务前,您已具备中华人民共和国法律规定的与您行为相适应的民事行为能力。若您不具备前述与您行为相适应的民事行为能力而进行用户注册,则您及您的监护人应依照法律规定承担因此而导致的一切后果。 您知悉,无民事行为能力人、限制民事行为能力人不当注册为火山引擎和Moonshot用户的,其与火山引擎和Moonshot之间的服务协议自始无效,一经发现,火山引擎或Moonshot有权立即停止为该用户服务或注销该用户账号。 ### **账户注册说明** 账户注册是指用户登录火山引擎,按火山引擎官网的要求填写相关信息并确认同意 [火山引擎服务条款](https://docs.volcengine.com/docs/6256/64903?lang=zh) 和 [隐私政策](https://docs.volcengine.com/docs/6256/64902?lang=zh) 的过程。您应在注册前认真阅读并认可相应的条款条件,特别是其中的限制货免除责任(加粗展示)的条款。 ## **平台的权利和义务** 1. Moonshot有义务在现有技术上维护模型的正常运行,并努力提升和改进技术,保障您的产品和服务使用体验。 2. 对于您在注册使用Moonshot模型时遇到的与本产品或服务有关的问题及反映的情况,Moonshot将在法律规定期限内及时作出回复。 3. 对于您使用Moonshot模型的不当行为,或任何Moonshot认为应当终止服务的情况,Moonshot有权实施屏蔽相关信息、终止提供服务等处理措施,并将相关情况及时通知于您和告知有关部门;您对Moonshot的处理措施存在异议的,可以提供相关证据予以说明。若经核实,您的行为确有违反本火山引擎服务条款、产品和服务协议、本协议或违法违规情况的,Moonshot有权终止对您提供服务。 4. Moonshot将尽最大努力、采取必要合理措施,保障Moonshot网络安全和稳定运行。 5. 如Moonshot为您提供免费服务的,您理解并同意,该种免费使用可能根据研究进展进行调整。您承诺不会因该规则的调整、免费使用权益的失效而向Moonshot追究任何责任。 6. 您不得以任何方式删除、篡改、隐匿Moonshot在输出内容中生成的深度合成服务标识。 ## **您的权利和义务** 1. 您有权根据本协议的约定享受Moonshot提供的以下服务:问答对话生成服务。Moonshot有权依据业务需要增加或减少服务的内容。 2. 您应当保证在使用Moonshot时不采取不正当行为,不扰乱模型正常秩序。 3. 您不得向Moonshot输出或诱导Moonshot向您输出包含以下内容的言论,否则Moonshot可对您发布的信息依法或依本协议进行删除或屏蔽,并将您发布信息的情况和向有关机关报告: * 煽动、抗拒、破坏宪法和法律、行政法规实施的; * 煽动颠覆国家政权,推翻社会主义制度的; * 煽动、分裂国家,破坏国家统一的; * 煽动民族仇恨、民族歧视,破坏民族团结的; * 任何包含对种族、性别、宗教、地域内容等歧视的; * 捏造或者歪曲事实,散布谣言,扰乱社会秩序的; * 宣扬封建迷信、淫秽、色情、赌博、暴力、凶杀、恐怖、教唆犯罪的; * 公然侮辱他人或者捏造事实诽谤他人的,或者进行其他恶意攻击的; * 损害国家机关信誉的; * 其他违背社会公共利益或公共道德或依据相关协议、规则的规定不适合在火山引擎和Moonshot平台发布的; * 其他违反宪法、法律和行政法规的。 4. 您不应以以下方式不当使用Moonshot: * 以侵犯任何人权利的方式; * 对Moonshot的任何算法、源代码、机制等进行反向工程; * 利用Moonshot开发、训练或改善其他与北京月之暗面科技有限公司存在直接或间接竞争关系的算法、模型等; * 将Moonshot使用于任何对主体资格有要求的服务中,包括但不限于医疗服务、法律服务、心理咨询、基础设施建设等; * 其他可能损害北京月之暗面科技有限公司利益的使用方式。 5. 如您利用Moonshot向任何第三方提供服务,相应的权利义务和责任均由您承担,Moonshot不对由此造成的任何损失负责。 6. 在海外使用Moonshot应遵守美国、欧盟和/或其他政府机关等外国实体的全部法律、法规、政策的限制与监督。 ## **服务协议的终止** 1. 您有权通过以下任一方式终止本协议: * 您注销您的账户的; * 变更事项生效前您停止使用并明示不愿接受变更事项的; * 您明示不愿继续使用Moonshot服务,且符合终止条件的。当出现下列情况下时,Moonshot可以通过注销用户的方式终止服务: 1.1 在您违反本服务协议相关规定时,Moonshot依据违约条款终止本协议。Moonshot将在终止服务时通知您。但如您在Moonshot终止提供服务后,再一次直接或间接以他人名义注册为Moonshot用户的,Moonshot有权再次单方面终止向您提供服务; 1.2 如Moonshot通过您提供的信息与您联系时,发现您在注册时填写的电子邮箱或手机等已不存在或无法接收信息的,经Moonshot以您在注册时填写的其他联系方式通知您更改,而您在三个工作日内仍未能提供,或Moonshot无法根据您注册时预留的信息联系到您的; 1.3 经Moonshot发现您注册信息中主要内容是虚假的; 1.4 本服务协议终止或更新时,您明示不愿接受新的服务协议的; 1.5 您发布违法信息、侵犯他人合法权益或其他严重违法违约行为的; 1.6 除上述情形外,因您多次违反火山引擎平台、Moonshot规则相关规定且情节严重,Moonshot依据相应规则对您的账户予以查封的; 1.7 其它Moonshot认为需终止服务的情况。 2. 协议终止后的处理 本协议终止后,除法律有明确规定外,Moonshot无义务向您或您指定的第三方披露您账户中的任何信息。 本协议终止后,Moonshot仍享有下列权利: * 在匿名化处理您的用户信息的前提下,继续保存您留存于Moonshot平台的各类信息; * 对于您过往的违约行为,Moonshot仍可依据本协议向您追究违约责任。 ## **关于生成内容的知识产权** 1. 您充分理解并同意,您仅可以非商业的、个人研究学习的方式使用Moonshot。Moonshot及其程序、软件、信息、数据、开发文档及相关的元素、组件等内容均受中华人民共和国法律法规和相应的国际条约保护,由北京月之暗面科技有限公司及相关权利人享有知识产权。 2. 未经北京月之暗面科技有限公司及相关权利人书面同意: * 您无权以任何商业化方式使用Moonshot及Moonshot生成的内容; * 您不得利用Moonshot开发与Moonshot相竞争的产品或服务。 3. 您输入Moonshot的任何内容的版权均仅归原作者所有,若作者有版权声明或原作从其他网站转载而附带有原版权声明者,其版权归属以附带声明为准。 4. 您基于Moonshot生成的内容的版权由您自行维护并对其独立判断后使用,基于Moonshot生成内容产生的任何知识产权问题由您自行处理,北京月之暗面科技有限公司对由此造成的任何损失不负责任,您由此给北京月之暗面科技有限公司造成损失的北京月之暗面科技有限公司有权向您追偿。 ## **生成内容相关的责任限制说明** 1. Moonshot依照法律规定履行基础保障义务,但对于下述原因导致的合同履行障碍、履行瑕疵、履行延后或履行内容变更等情形,Moonshot并不承担相应的违约责任: * 因自然灾害、罢工、暴乱、战争、政府行为、司法行政命令等不可抗力因素; * 因常规或紧急的设备与系统维护、设备与系统故障、网络信息与数据安全等因素。 2. 由于Moonshot提供服务所依赖的技术瓶颈,Moonshot不对以下事项作出任何保证: * 不保证Moonshot将符合您的实际或特定需求或目的; * 不保证Moonshot准确可靠、功能可用、及时、安全、无错误、不受干扰、无中断、持续稳定、不存在任何故障; * Moonshot的生成内容虽已经过人工智能算法自动过滤,但仍不排除其中部分信息具有瑕疵、不合理或引发用户不适,且其生成的内容不代表团队的态度或观点; * 不保证Moonshot中的代码、程序及其指向的内容的准确性、稳定性和完整性。 ## **用户信息保护方法及如何授权** 对于您提供、发布及在使用Moonshot平台服务中形成的除个人信息外的非个人信息,均不会因上传、发布等行为发生知识产权、肖像权等权利的转移。 ## **违约责任及处理办法** 您存在下列行为的,视为违约,Moonshot有权做出相应处理: * Moonshot有权对您的注册数据及产品/服务使用行为进行查阅,发现或怀疑注册数据或产品/服务使用行为中存在问题,有权向您发出询问和/或要求改正的通知,若您未在合理期限内作出合理回应,Moonshot可以对您的注册数据或产品/服务使用做出屏蔽、删除等处理; * 经国家生效法律文书或行政处罚决定确认您存在违法行为,或者Moonshot有足够事实依据可以认定您存在违法或违反服务协议行为的,Moonshot有权在网站上以合法的形式公示您的违法行为; * 对于您在Moonshot发布的下列各类信息,Moonshot有权在不通知您的前提下进行删除或采取其他限制性措施。包括Moonshot有理由相信存在欺诈等恶意或虚假内容的信息;Moonshot有理由相信存在试图扰乱正常平台秩序因素的信息;Moonshot有理由相信违反公共利益或可能严重损害Moonshot和其他用户合法利益的信息。 ## **法律适用范围与争议解决** 1. 本协议之订立、生效、解释、修订、补充、终止、执行与争议解决均适用中华人民共和国大陆地区法律;如法律无相关规定的,参照商业惯例及/或行业惯例。 2. 本协议任一条款被视为废止、无效或不可执行,该条应视为可分的且并不影响本协议其余条款的有效性及可执行性。 ## **联系我们** 如您在使用产品时对协议有任何问题,可通过发送邮件至support@moonshot.cn或通过本产品意见反馈渠道或网站上标识的方式与我们联系 --- # 智谱AI模型服务协议 Source: https://ark.volcengine.com/region:cn-beijing/docs/zhipu-ai-model-service-agreement **模型服务协议** 本协议是北京智谱华章科技有限公司(“**智谱AI**”)与**您(“客户”)**,就您选择和使用智谱AI的模型服务在北京市海淀区签订的协议。 **为更好保障您的权益,请您在同意或签署本协议之前务必审慎阅读,充分理解本协议的全部内容,特别是免除或限制责任的条款,智谱AI将对这些条款加粗或其他醒目的方式提醒您**。 您可以通过如下两种方式签署本协议:1)通过火山方舟大模型服务平台展示的模型服务页面选购所需模型服务的,通过官网页面点击确认;2)部分产品和服务不支持在线订购,或者您希望与智谱AI签订纸质协议的,双方通过签字或盖章方式签订纸质协议。为免疑义,如双方签署完成线下纸质协议的,纸质协议有关条款约定与最新官网线上协议存在不一致的,以双方签字或盖章且在有效期内的纸质协议约定为准。如您未通过上述方式完成协议签署,但您已实际开通和试用模型服务,视同您与智谱AI已经签署本协议。 双方均保证其经营活动已获得合法经营资质或有关部门批准,有权依法运营其产品和服务。双方进一步保证,在本协议有效期内持续具备相关资质或批准,并应符合国家及经营所在地不时颁布的法律法规与地方性法律文件的要求。 # 第一条 产品及服务内容 1.1. 智谱AI的产品及服务包括授权火山方舟大模型服务平台(“MaaS平台”)展示的智谱大模型ChatGLM系列模型和您精调后的精调模型(如有),以及其他在火山方舟MaaS平台展示并标记为“智谱AI”提供的模型及服务(合称“智谱API服务”或“产品”)。具体服务项目及报价以线上展示的价目表为准。 1.2. 您根据1.1条订购的产品及服务,按《火山方舟MaaS平台计费与结算规则》向智谱AI支付价款。 1.3. 智谱AI因产品或服务进行调整、优化、升级、扩容等措施而导致产品服务中断,以及因第三方的网络、设备、不当使用等因素,造成服务延时、修改及暂停等情况的,智谱AI在获知前述情况的24小时内通知您并在最短时间内恢复产品服务。 1.4. 智谱AI收取的产品和服务价款不包含产品运行环境(包括但不限于:操作系统、计算平台、数据库、接口、流量服务等)所需的第三方相关费用,其收费模式以第三方的要求为准。 1.5. 您接入智谱AI产品或服务向公众提供内容生成式人工智能产品或服务的需要开展安全评估、算法备案和上线备案工作,且应同时满足法律法规政策相关的要求和其他备案审批,对生成内容的安全性、合法性、合规性进行有效管理和控制,建立包括但不限于内容审核、用户管理、数据安全、监测预警和应急处置等机制。如因用户使用您在智谱AI的产品上开发的产品或服务导致数据安全、舆情风险或发生任何产品或服务被滥用、传播、不当利用而产生的风险和责任,应由您自行承担。因此给智谱AI造成损失的,您应向智谱AI承担相应责任。 1.6. 您应采取合理和适当的措施,以确保访问、使用智谱AI的产品的安全性。若您发现产品有任何漏洞的,应立即联系智谱AI,并提供该漏洞或漏洞的详细信息。 1.7. 您应按照智谱AI及平台上的技术要求及标准使用产品或服务,并自行承担您在应用程序和/或产品服务里集成智谱AI的产品/服务的开发工作及成本;您理解并同意,如果没有正确地集成和/或使用智谱AI的产品/服务,会导致智谱AI的产品/服务不能按照预期提供,甚至由于不正确的使用造成不利影响,您应遵循智谱开放平台有关产品使用规则等智谱AI不时公布的规定以避免前述情形。 1.8. 除本合同约定外,您还应遵循火山引擎的网站服务条款、隐私政策及火山方舟大模型服务平台有关的协议、产品使用规则等约定的内容。 # 第二条 许可及限制 2.1. 许可范围 智谱AI授予您享有产品在中国范围内的非排他的、不可转让、不可分许可、不可转许可、有期限限制的(即火山方舟大模型服务平台持续运营期限内)普通使用许可权。 2.2. 许可期限自您开通服务之日起开始计算,如您违反本合同任意一条约定的,智谱AI有权撤回或终止2.1条的许可,并要求您将大模型相关的版本、文档、代码、程序、软件、数据等所有由智谱AI提供的资料及其任何复制件、副本、缓存进行销毁或退回,不得保留和使用与大模型有关的任何内容,并向智谱AI提供可合理信服的销毁证明。当违约行为被纠正或由此给智谱AI造成的损失全部被您弥补后,智谱AI可恢复许可。 2.3. 许可限制 (1) 您不得将产品的全部或部分进行复制、转让、出租、出借、出售或提供分许可、转许可,不得限制、破坏或绕过产品附带的加密软件或智谱AI提供的其他确保产品正确使用的限制性措施; (2) 除根据第2.1条获得的许可权利外,您未取得任何智谱AI保密信息、产品中包含的任何知识产权的权利、所有权或权益; (3) 您不得对产品进行反向工程、反编译或反汇编; (4) 您不得删除任何版权声明、商标或其他专有的限制性或机密性图标,并应书面告知其分销商和最终用户不得为之; (5) 您除将产品与其具体的业务场景结合后使用外,不得将产品、提示词和通过产品提示生成的内容用于产品之外的新模型或其他模型的开发、训练、标注、微调、优化、迭代以及其他类似活动,不得利用智谱AI产品开发、训练或改善其他与智谱AI存在竞争关系的算法、模型; (6) 您不得利用产品发布、诱导或允许其用户诱导产品生成违反法律法规和公序良俗或侵犯第三方合法权益的内容; (7) 您不得协助或允许第三方从事上述任何活动。 2.4. 您保证在使用本合同项下产品时须遵守相关法律法规,不违反《中华人民共和国刑法》《中华人民共和国反不正当竞争法》《中华人民共和国网络安全法》《中华人民共和国数据安全法》《中华人民共和国个人信息保护法》等相关法律法规及政策,维护互联网秩序和网络安全,不得利用产品发布危害国家安全的、破坏民族团结的、扰乱社会秩序的、有歧视性的、不正当的言论,不得利用产品侵害任何第三方的个人信息保护权、名誉权、肖像权、人格权、知识产权、财产权等其他任何权益或从事涉及不正当竞争的、违反法律法规、违反公序良俗的行为。 2.5. 您保证在使用本合同项下产品过程中,不得对智谱AI的产品有以下行为: (1) 利用技术或其他手段破坏、扰乱本合同项下产品的运营; (2) 以任何方式干扰或企图干扰任何产品或任何功能的正常运行,或者制作、发布、传播上述工具、方法等; (3) 以任何方式试图从产品中提取数据、参数、代码或其他属于智谱AI的保密信息。 2.6. 您的用户或您员工违反以上限制的,您应督促其用户或员工整改,由此给智谱AI造成直接损失的,您应承担连带赔偿责任。 # 第三条 知识产权 3.1. 背景知识产权。任何一方和/或其关联方在本合同签署之前所拥有的背景知识产权依然归属该方所有。 3.2. 源代码。除本合同明确许可的内容外,智谱AI不提供有关产品的源代码。未经智谱AI书面许可,您对智谱AI提供的产品不得进行任何参数、代码等的修改。由于您对智谱AI提供的产品进行任何参数、代码等的改动而导致产品不能正常运行或产品效果降低的,智谱AI对此不承担责任。 3.3. 您在智谱AI的产品上通过微调、修改等方式衍生开发的内容(指“精调模型”)以复制、分发、转让、许可、分许可、转许可、销售、出租、出借、展示等方式使用的,应取得智谱AI的许可并向智谱AI支付相应的许可费用,并且该等“精调模型”应仅于部署在火山方舟MaaS平台。 # 第四条 保密 4.1. 保密义务。任何一方应当对其他方披露的信息进行保密,未经披露方书面同意,接收方不得将保密信息向任何第三方披露。接收方应采取不低于该方对其自身的类似信息所采取的同等程度的安全保障措施,且不得低于合理的注意程度来防止未经授权的披露和使用保密信息。接收方应确保其管理人员、必要的雇员、顾问、律师遵循本合同关于保密的规定。 4.2. 任何一方经对方允许后可向该方的关联方、受托方等第三方在必要范围内提供披露方的保密信息,但接收方应保障第三方遵守本合同规定的保密条款。 4.3. 未经智谱AI书面/邮件同意,您不得在任何时候、以任何方式(无论是直接还是间接,也无论是明示还是暗示;包括但不限于任何营销、广告、促销、市场推广或其他目的):(1)使用、引用、公布、复制、分销,展示(公开或非公开)、提及、注册或申请注册:(i)智谱AI或其关联方拥有或有权使用的任何商标(无论是否已注册)、商号、名称、标志或者标识(包括但不限于:“智谱”、“智谱AI”、“Zhipu”、“Zhipu.AI”、“Aminer”、“ChatGLM”、“ChatGLM-130B”、“CodeGeeX”、“CogView”,或与清华大学有关的任何文字及标志,如“清华大学”、“清华大学计算机系”、“清华大学KEG实验室”,等),或通过特定描述使第三方能够识别智谱AI或其任何关联方。(ii) 智谱或其关联方任何董事、监事、管理人员、雇员或合伙人、科学家团队的姓名、肖像、形象、照片、图片、标识、发言或评论(或其一部分),或(iii)与前述各项相似的、以任何语言形式存在的任何名称、商标、标识、文字、词语、符号或其任何组合;及(2)直接或间接声明您或其任何关联方所提供的任何产品或服务已由智谱AI或其任何关联方认可或支持。特别地,您确认和承诺,未经智谱AI事先书面/邮件同意,您不得将智谱AI相关的宣传/广告/影响策略及内容向任何第三方进行宣传或披露、亦不得利用智谱AI或其相关方品牌直接或间接谋求及/或招揽任何投资及/或合作机会。 4.4. 每一方的保密义务应为永久有效,不因本合同的终止而终止。 # 第五条 违约赔偿和责任限制 5.1. 任何一方因未能履行本合同项下义务或严重违反本合同规定致使对方遭受损失的,违约方应当赔偿对方因此遭受的全部经济损失。 5.2. 任何一方均不负担因本合同或因使用根据本合同所收到的产品和服务所引起或导致的偶然的、附带的、惩罚性的、特殊的、间接的损失或损害,包括但不限于利润或商誉的损失,无论上述损失或损害如何产生、系基于何种责任理论,且无论存在于违约、侵权、赔偿或任何其他诉讼理由而提起的诉讼中,即使被告知该等损失的可能性。鉴于大模型技术应用具有探索性、尝试性和不确定性等风险,双方理解并同意,智谱AI在本协议项下所支付的违约金、赔偿、补偿及其他费用,合计不超过智谱AI在本协议项下已收取合同金额的10%。 5.3. 智谱AI的产品/服务是按照现有技术和条件所能达到的现状提供的。智谱AI将尽最大努力确保产品/服务的可用性,除本合同或双方书面确认的其他规定外,智谱AI不作任何其他明示或暗示的陈述或保证。例如,智谱AI未声明或保产品/服务100%完整、准确、可靠、更新及时,也不保证产品/服不间断、系统稳定没有任何故障、内容完全安全或不侵权,您应根据其实际情况独立判断。智谱AI不对由于您使用智谱AI产品/服务,或通过智谱AI产品/服务向您的客户/用户提供的产品、服务、信息、数据而引起的任何损害承担责任。您基于产品/服务生成的内容的版权由您自行维护并对其独立判断后使用,基于产品/服务生成内容产生的任何知识产权问题由您自行处理。您也同意,即使智谱AI提供的产品/服务存在瑕疵,但若上述瑕疵是当时行业技术水平所无法避免的,其将不被视为智谱AI违约,双方应友好协作共同解决问题。智谱AI的责任应以您在使用产品时严格遵守本合同或其他有关操作指南、使用规范的文件为前提;否则,当产品/服务使用不当时,智谱AI将不承担相应的责任。 5.4. 如您在产品使用过程中加入新的数据进行模型训练、微调和开发,由此产生的责任由您自行承担。您进行训练、微调和开发后,受有损害并主张智谱AI承担责任的,应证明损害与您的训练、微调和开发无关,否则智谱AI对损害不承担责任。 # 第六条 终止 6.1 未经双方书面同意,任何一方不得提前终止本合同。 6.2 在不损害任何一方可享有的任何其他权利或救济的前提下,如果一方出现以下情况之一,对方有权通过向其发出书面通知立即终止本合同(包括本合同项下的所有附件): (1)严重违反本合同项下不可补救的任何义务; (2)严重违反本合同项下可补救的任何义务,但没有在收到要求补救的书面通知后六十(60)日内完成补救; (3)发生足以使任何法院或者债权人指定接管人、管理人或者提交解散申请或者做出清算命令。 # 第七条 其他规定 7.1. 任何一方均不对因不可抗力导致未能履行或延迟履行本合同承担责任,包括但不仅限于:天灾、民事或军事机关的行为、火灾、疫情、流行病、洪水、地震、暴动、战争、破坏活动、超出合理控制范围的突发事件和政府行为;但前提是迟延履行的一方:(1)及时在任何该等事件发生后的十四(14)日内以书面形式通知其他方有关相关事件并提供相关证明;并(2)尽合理努力纠正该等未能履行或迟延履行的行为。 7.2. 如果一方未行使或延迟行使其在本合同项下的某项权利、权力或特权,不构成该方对此项权利、权力或特权的放弃,如果该方已经行使或者部分行使某项权利、权力或特权,并不妨碍其在将来再次行使此项权利、权力或特权。 7.3. 本合同及其附件构成各方就本合同标的达成的全部合同,并且取代各方之间此前就该标的进行的所有磋商、谈判以及达成的合同。 7.4. 本合同不得以口头方式修改,而须经各方签署书面文件后方可修改。 7.5. 本合同适用中华人民共和国法律。因本协议产生之争议,双方应首先协商解决;双方未能协商解决的,任何一方均应将争议提交甲方所在地有管辖权的人民法院诉讼解决。双方无争议的部分,应当继续履行。 # 第八条 协议期限及其他 8.1. 本合同自您点击模型使用页面并确认本合同之日起,或签订的纸质协议约定的生效之日起,或开通服务之日(如不一致以最早之日计算)起生效,有效期截止到双方履行完毕本合同。 --- # PromptPilot 服务专用条款和数据授权使用协议 Source: https://ark.volcengine.com/region:cn-beijing/docs/promptpilot-service-terms-and-data-authorization-agreement 本《PromptPilot服务专用条款和数据授权使用协议》(“**本协议**”)是您与火山引擎,就您使用火山引擎PromptPilot服务及授权火山引擎使用客户数据(定义见下文)的相关事项,签订的协议。 **为了更好地保障您的权益,您在同意本协议之前,请您务必审慎阅读,并充分理解本协议的全部内容,特别是以加粗标注的条款。如果您对本协议的条款有任何疑问,可以向火山引擎询问,相关人员将向您解释条款内容。如果您不同意本协议的任意内容,或者无法准确理解相关人员对条款的解释,请不要在订购页面勾选同意。如果您在订购页面特别勾选了同意本协议,即表示您已接收本协议所述的所有条款和条件,届时您不应以未阅读本协议或者未获得相关人员对您问询的解答等理由,主张本协议无效,或要求撤销本协议**。 您确认,在您注册及使用本服务时,您应当是合法成立并有效存续的法人或非法人组织。如果您是中国大陆地区以外的用户,您订立或履行本协议还需要同时遵守您所属和/或所处国家或地区的法律。 一旦您订购或(和)使用了本服务,本协议将与(1)火山引擎官网公示的 [《火山引擎服务条款》](https://docs.volcengine.com/docs/6256/64903?lang=zh) 与 [《火山引擎隐私政策》](https://docs.volcengine.com/docs/6256/64902?lang=zh),(2)[《产品和服务协议](https://docs.volcengine.com/docs/6256/68938?lang=zh)》,(3)订购协议/服务订单,(4)《服务等级协议》(如有),和(5)服务规则等所适用的其他协议共同构成您与火山引擎之间就订购或(和)使用本服务的完整协议。 本协议未明确约定事项,将遵照您与火山引擎订立的其他所适用协议或服务规则的约定。 1. **定义与解释** 1.1 除非本协议另有约定,如下术语具有本款所规定的含义: (1) **个人信息**:以电子或者其他方式记录的与已识别或者可识别的自然人有关的各种信息,不包括匿名化处理后的信息。 (2) **匿名化**:是指个人信息经过处理无法识别特定自然人且不能复原的过程。 (3) **关联方**:是指拥有一方、被一方拥有或与该方被同一其他方拥有的任何法律实体,其中“拥有”是指拥有相关实体超过50%的所有权或拥有指导其管理的权利。 (4) **火山引擎PromptPilot服务**:是指由北京火山引擎科技有限公司(“**火山引擎**”)通过火山引擎平台为您提供的模型Prompt优化技术及相关功能的产品和服务(“本服务”)。本服务将基于【豆包大模型和DeepSeek R1开源大模型等模型(“服务模型”)】为您提供模型优化及相关功能,您可以选择适用的服务模型来实现本服务之目的。服务模型的备案信息,您可在产品页查看。 (5) **您的模型**:指您在使用本服务时,提供给火山引擎的需要进行Prompt优化的基础模型及其接口和Prompt等信息。 (6) **客户数据**:指您在使用本服务时,向火山引擎平台提供的,包括您向PromptPilot输入和服务生成的任何数据,包括但不限于所有输入的文本、声音、图形、图片、图像、视频、代码、软件或任何其他类似信息。 2. 服务使用规则 2.1 服务期限:火山引擎为您在一定期限或(和)额度提供免费服务,具体以火山引擎公布的信息为准。在免费期间或(和)额度内,您不需支付费用,火山引擎不排除日后收取费用的可能,届时火山引擎将提前在网站内合适版面发布公告或发送站内通知等方式公布收费政策及规范;如果收费期开始后您仍使用相应服务的,您应按届时有效的收费政策为继续使用的产品/服务付费。 2.2 服务规则: (1)您仅可基于对**您的模型**的prompt优化目的使用本服务。您不可将您的模型生成内容和本服务生成内容通过本服务直接对公众提供。如您利用本服务直接或间接生成和(或)传播违法侵权内容,您需要承担全部责任。火山引擎将保留对您的违法侵权行为进行追究的权利。您保证,您具备合法合规使用您的模型的相关权利并履行相关义务。 (2)免费服务期间,您同意按本协议第3条约定授权火山引擎使用您的客户数据。如您撤回授权或终止授权,您将无法继续使用本服务。 (3)您使用本服务还应遵守《生成式人工智能服务管理暂行办法》以及立法和行政主管部门不时出台的与生成式人工智能服务的相关法律法规和国家标准。 (4)您理解并同意,火山引擎服务均由技术工具自动完成,除非另有书面约定和/或为履行服务协议下的特别义务(例如在适用情形下进行故障排除、检测等事项),火山引擎对服务过程及结果不进行人工干预。 (5)**火山引擎的产品和服务是按照现有技术和条件所能达到的现状提供的。火山引擎将尽最大努力确保产品和服务的可用性,除本合同或双方书面确认的其他规定外,火山引擎不作任何其他明示或暗示的陈述或保证。例如,火山引擎未声明或保产品和服务100%完整、准确、可靠、更新及时,也不保证产品/服不间断、系统稳定没有任何故障、内容完全安全或不侵权,您应根据其实际情况独立判断。您基于产品和服务生成的内容产生的任何知识产权纠纷由您自行处理并承担所有责任,由此给火山引擎造成损失的,您应当承担赔偿责任。您也同意,即使火山引擎提供的产品和服务存在瑕疵,但若上述瑕疵是当时行业技术水平所无法避免的,其将不被视为火山引擎违约,双方应友好协作共同解决问题。火山引擎的责任应以您在使用产品和服务时严格遵守本合同或其他有关操作指南、使用规范的文件为前提,否则,当产品和服务使用不当时,火山引擎将不承担相应的责任**。 2.3 第三方服务 (1)本服务可能包含指向第三方提供的产品、服务的链接及与第三方服务的集成功能(无论这些服务是位于本服务内,还是在与本服务相连接的独立第三方服务网站上,包括但不限于**您的模型**在内的第三方产品和服务),火山引擎不对第三方产品或服务进行承诺或保证,您应当自行评估该等产品、服务是否符合并满足您使用要求。您理解并同意,第三方产品或服务的开通和使用,可能需要您与第三方另行签订单独的协议及其单独的许可和使用规则(合称“第三方规则”),该等第三方规则可通过纸质或电子文档形式向您提供或展示,您应自行根据其自身情况审阅并决定是否接受。如您通过火山引擎服务实际使用第三方产品、服务,应视为接受适用的第三方规则并受其约束。火山引擎对通过此类第三方服务发布或传播的信息、数据、观点、建议或陈述的准确性或可靠性不承担责任。因使用第三方产品或服务产生的纠纷,应由您与第三方自行解决,火山引擎可为纠纷的解决提供必要协助,但不因此承担任何责任。 (2)您确认并同意,通过本服务账户使用第三方服务集成功能时,您的账户信息可能会与该第三方服务共享。根据您对本服务的配置和使用情况,客户数据将在您的本服务账户与您已链接的一个或多个第三方服务之间传输。为预防或解决与该第三方服务相关的服务、安全、支持或技术问题,我们可能还会将您的客户数据与您链接到本服务账户的特定第三方服务共享。 3. 数据授权 3.1 授权目的:本规则项下的授权将用于开发机器学习、人工智能相关技术和PromptPilot服务的优化、开发、使用等之目的。 3.2 授权范围:您同意,您将授予火山引擎一项**非独家的、不可转让的、不可分许可的(但可分许可给火山引擎关联方以及为达成授权目的第三方外包服务商)、免费的**权利,允许火山引擎为达成授权目的而**传输、存储、使用、复制、下载、修改或以其他方式处理**客户数据。 3.3 授权期限:本协议项下授权的起始日期为您**在订购页面勾选同意接受本协议之日**。授权期限为**永久**。如您在同意接受本协议后,(i)拟对该授权期限进行变更或调整,或(ii)如您希望停止对火山引擎授权新客户数据的,您可以通联系火山引擎客服人员申请终止您对火山引擎的授权(**“终止操作”**)。**您进一步充分知悉、理解并同意,即便您完成了终止操作,但由于机器学习和人工智能技术的特殊性,一旦(i)您授权火山引擎使用相关客户数据,且(ii)相关客户数据已被使用的,则对该部分客户数据的使用将在技术上无法撤回。火山引擎仅能根据您的要求停止使用您新输入的客户数据。终止授权,不代表终止使用服务**。 3.4 **您特别承诺并保证,您已合法持有客户数据,并已获得客户数据的一切必要充分授权或原始权利,以确保(i)您依法有权向火山引擎及其分许可方提供该等数据,且(ii)火山引擎及其分许可方有权根据本规则处理您提供的客户数据。若您发现您的客户数据出现任何权利争议或潜在权利争议,应立刻以书面形式通知火山引擎,并尽您最大努力协助火山引擎处理该等争议。如因您违反本条约定和/或任何第三方针对火山引擎及其分许可方在本协议约定范围内使用客户数据提起任何主张,您应当赔偿火山引擎及其分许可方因此遭受的所有损失**。 3.5 个人信息:您应当避免向火山引擎提供您的个人信息。如果您提交给火山引擎的客户数据中不可避免地含有个人信息的,**您应当保证(i)该等个人信息的来源符合所适用的法律法规的规定,尤其是中国大陆地区法律法规的相关规定,并且(ii)您已获得了相关个人信息主体和/或实体的同意(包括必要情形下的单独同意、书面同意)和/或授权,且该等个人信息主体和/或实体授权同意的范围足以确保您能够根据本协议向火山引擎提供该等个人信息,并确保火山引擎有权在本协议第3.2及3.3条所述授权范围及授权期限内处理该等个人信息**。任何情况下,客户数据将在火山引擎平台的严格加密下,通过安全方案匿名化处理后提供给火山引擎。 3.6 保密数据:在任何情况下,您不应违反任何法律法规的规定或您与任何主体的约定,向火山引擎提供任何保密信息或商业秘密。 3.7 其他特殊数据:如您拟向火山引擎提供任何其他特殊数据的(例如,国家机密、核心数据、重要数据、人类遗传资源信息、地图数据等),**除遵守本协议第3.4条以外,您在提供前应当已获得相关政府部门一切必要充分的审批、备案或许可,并以书面形式向火山引擎提出申请,** 申请书内应当载明(i)该等特殊数据的类型(无需说明任何数据内容),(ii)已获得的政府部门审批、备案或许可,(iii)提供该等特殊数据的目的及必要性,以及其他火山引擎可能需要了解的情况。**在确保不会访问您拟提供的特殊数据内容的前提下,火山引擎有权对于您是否可以在火山引擎平台上与火山引擎发生此等特殊数据的交互,作出特别决策**。 4. **使用限制** 4.1 被禁用途。火山引擎承诺,不会将您的客户数据用于以下用途:(i)诽谤、侮辱、骚扰、跟踪、或威胁任何个人,侵犯或损害任何第三方的合法权利;(ii)生成、传播任何有害的、不适当的、亵渎的、淫秽的、有损他人权利的、色情的、错误的、欺诈的、侵权的、不良的、违法的、或其他有悖公序良俗的材料或信息;(iii)参与或鼓励任何可能导致您或火山引擎承担刑事或民事责任的行为;(iv)擅自以您或火山引擎的名义作出进行宣传、推广、商业活动、或做出引人误解或混淆的上述行为;或(v)进行违法活动。 4.2 被禁行为。您承诺,您不得(且不得尝试):(i)对火山引擎产品和服务进行反向工程、解密、反向编译或反向汇编(本条款禁止但现行法律允许的除外);(ii)绕开火山引擎产品和服务中的技术限制或其相关文献中的限制措施;(iii)移除火山引擎产品和服务中出现的任何著作权、商标、专利或其他标识;(iv)向第三方分发、再许可、出租、租赁或租借火山引擎产品和服务; (v)以开发竞争性产品或服务为目的使用火山引擎产品和服务;(vi)传输或上传任何包含病毒、木马病毒、蠕虫病毒、定时炸弹病毒、删除蝇、或任何其他类似程序的文件,其目的或用途在于破坏、摧毁、干扰或损害专有火山引擎或火山引擎或其他人的网络、计算机系统或其他设备;或(vii)进行违法活动。 5. **其他** **如您与火山引擎就客户数据授权事宜另行签署相关协议或另有约定的,无论该等协议或约定发生在本协议签署之前或是之后,均应优先适用本协议内容**。 --- # 影眸模型服务协议 Source: https://ark.volcengine.com/region:cn-beijing/docs/yingmou-model-service-agreement # 服务条款 请仔细阅读本服务条款(包括我们的隐私政策)。请特别注意下文第10条中的责任限制条款。此外,如您为法人或非法人组织,您同意仅通过仲裁方式解决您与Deemos之间的任何争议,且仲裁应基于个人层面进行,不得采取集体诉讼或代表诉讼的形式,具体规定见下文第21条。如您不同意本条款的全部内容,不得以任何方式访问我们的服务。 本服务条款(以下简称“**本条款**”)及隐私政策(包括不时作出的修订、补充及其他修改),共同构成(以下统称“**协议**”)您与 hyper3d.ai 运营方——影眸科技(上海)有限公司(以下简称“**Deemos**”或“**公司**”)之间的协议。除非您与Deemos已另行签署书面协议,否则该等协议为您使用、访问 hyper3d.ai 及其相关网站、应用程序与社区(以下统称“**平台**”)或参与相关活动,以及使用平台提供的任何服务(包括ChatAvatar与Rodin,以下统称“**服务**”)的唯一依据,包括但不限于下载、上传及使用3D模型资源、PBR材质、图形、照片、文本、链接及其他内容(以下统称“**内容**”)。本协议构成您与Deemos之间具有法律约束力的合同。 在本协议中,“您”及“您的”指访问平台或使用服务的个人(亦称为“**用户**”);“我们”“我方”“我们的”指Deemos;“一方”或“双方”指您与我们双方。本协议的生效日期为您根据下述条款与条件接受本协议之日。 **您必须年满18周岁,或达到您所在国家/地区规定的同意使用本服务的最低年龄。若您未满18周岁或未达该最低年龄,必须在父母或法定监护人的许可下使用本服务。在中国境内,本服务仅面向成年人提供,如您未满18周岁,请在法定监护人的陪同下阅读本协议,并在征得父母或法定监护人同意后注册并使用本服务**。 # **1.总则** 通过访问平台及使用我们的服务,您保证已仔细阅读、充分理解并同意遵守本协议的全部条款,以及对本协议的任何更新与修改。若您拒绝接受本协议或对本协议任何条款有异议,不得使用本服务。在使用本服务前,如您对本协议存在任何疑问,您有责任联系Deemos以要求澄清。通过注册、订阅或以其他方式使用本服务,您即与我们订立具有法律约束力的合同,并同意接受本协议约束。您同时同意遵守所有适用法律。就本协议而言,“**适用法律**”指在任何时候生效并适用于或旨在规范任何人(包括该等协议所有各方)、财产、交易、活动、事件或其他事项的任何法律、规则、法规、规章、地方性法规、命令、条例、议定书、法典、指南、条约、政策、通知、指令,以及司法机关、仲裁机构、行政机关、政府部门作出的判决、裁决、裁定、指令或其他要求或指引。 # **2.服务使用规则** (1)适用人群 模型适用于企业和个人用户,适用于游戏、3D打印、电商等多种行业企业;适用于独立游戏制作者、三维模型师、3D打印爱好者、AR、VR使用者等专业及非专业个人用户。服务不适用于未成年人,未成年人用户将在注册过程中受到认证限制,无法使用本服务。 (2)适用场合 模型适用于需要三维资产、三维设计的各种场合,如游戏、3D打印、电商、工业设计等,可提供快速高精度的三维资产生成服务,满足不同行业及个人对三维资产的需求。 (3)服务范围 a.上传图像等素材生成 3D 内容,输出 glb、fbx 等格式的三维资产,根据订阅计划导出用于个人或商业用途; b.浏览平台展示的 3D 内容,根据订阅计划导出用于个人或商业用途,或购买内容以获得个人所有权; c.支持通过网页端直接操作或 API 接口集成至自有系统,实现三维资产快速生成。 # **3.账户规则** 您可能需要在相关平台上注册账户(以下简称“**账户**”)才能访问我们的服务。注册账户时,您必须提供准确的账户信息,且信息发生变更时应及时更新。您同意,维护账户安全性及对访问账户所用的用户名、密码或其他任何代码的控制权,是您的唯一责任。账户仅限您本人访问,您应承担账户被未授权访问的全部风险。未经我们事先书面同意,您不得出售、出租、出借或以其他方式向他人提供账户访问权限。若您发现或怀疑与服务、账户相关的任何安全漏洞,应立即通知我们;否则,您可能需对账户下发生的任何行为承担责任。您不得允许他人使用您的账户凭证,且应对与您账户相关的所有用户活动承担责任。我们保留回收用户名的权利,包括代表对该用户名享有合法权利(包括商标权)的企业或个人回收用户名。您理解并同意,若发生账户归属争议,我们可根据您向我们提供的信息及我们持有的与该账户相关的其他信息,尝试核实账户所有权,但我们不对该等核实的真实性或准确性作出任何陈述或保证。我们将采取合理措施处理您就已报告的安全漏洞提出的请求,但您确认并同意,我们、我们的关联方或第三方服务提供商不对因该等安全漏洞产生的任何索赔或损害承担责任。 您理解并承诺,您所设置的账号不得违反国家法律法规相关规定,不得恶意注册账号(包括但不限于频繁注册、批量注册账号等行为)。您在账号注册及使用过程中需遵守相关法律法规,不得实施任何侵害国家利益、损害其他公民合法权益、有害社会道德风尚的行为。我们有权对您提交的信息进行审核。 您的注册数据及与您相关的其他特定信息受我们的隐私政策约束。您也可通过联系我们注销账户。但请您理解,即使您的账号已注销,您仍需对您注销前的账号使用行为承担相应法律责任。若我们发现您在使用本服务过程中存在违法行为,我们将依法保存该等记录。 # **4.支付规则** ## **4.1 Credits** 我们使用“Credits(积分)”作为平台交易的虚拟工具。用户可通过以下方式获取Credits:(1)用户直接购买;(2)根据用户购买的不同订阅计划(定义见下文),获得一定数量的积分。用户购买或获赠Credits后,其当前持有的Credits数量及Credits购买记录将显示在账户中,且该等Credits可用于ChatAvatar与Rodin两项服务。 请注意,用户购买订阅计而获得的Credits将在相应订阅期结束时失效。与之相对,用户自行购买的Credits在使用完毕前持续有效。若用户最重视灵活性,建议直接购买Credits。在中国境内,该等Credits仅为平台内使用的虚拟工具,不得兑换为法定货币、实物或其他具有货币价值的物品,不得用于平台外交易,其使用不得违反《中华人民共和国中国人民银行法》《非银行支付机构网络支付业务管理办法》等相关适用法律规定。 ## **4.2 订阅服务** 我们在平台上提供多种类型的订阅计划(以下简称“**订阅计划**”),供用户选择,所有订阅计划均涵盖ChatAvatar与Rodin两项服务。每种订阅计划对应不同的价格(以下简称“订阅价格”)。您可使用Credits订阅该等计划,或通过平台上的支付方式直接支付。订阅生效后,我们将根据相关订阅计划的约定,向您提供特定的会员权益。 请注意,支付完成后,您所选的订阅计划在对应订阅期内不得取消或降级。您可在订阅期内随时将订阅计划升级至更高等级。升级后,计费周期将重置,并从升级当日开始计算。升级订阅计划应支付的费用按以下方式计算:(1)升级后完整计费周期的订阅计划总价格,减去(2)当前订阅计划的日均订阅价格乘以当前订阅计划剩余天数后的金额。若升级涉及Credits增加(即“升级”指Credits数量提升),则Credits数量将调整为升级后订阅计划包含的Credits数量,无论升级前Credits是否已使用,均需补增升级后计划与原计划的Credits差额。若升级后的计划价格低于原计划,差额将在下次计费周期中返还。请确保您有足够资金/Credits完成升级支付,否则您的会员资格可能被暂停。在中国境内,若您为消费者,根据《中华人民共和国消费者权益保护法》,您享有七天无理由退货的权利,但针对数字化服务(如本协议项下的订阅服务),若您已实际使用服务,可能不再适用七天无理由退货,具体以法律规定及双方约定为准。 ## **4.3 支付方式** 您通过火山引擎方舟大模型服务平台(“MaaS平台”)购买的我方服务,您知悉并接受由我们授权的北京火山引擎科技有限公司(“火山引擎”)代为向您收取服务费用,实际收款主体和服务提供主体为Deemos。我们将就您订购的服务费金额全额向您开具发票。您通过火山引擎申请发票后,我们将在7天内完成发票开具并通过邮件或其他方式传递给您。 ## **4.4退款规则** 除非本协议另有明确规定或双方另有约定,否则所有支付均为最终支付,不予退款,但适用法律另有要求的除外。请注意,人工智能服务(AI Services)不予退款。若您对提供的人工智能服务不满意,建议您联系公司,共同商讨可能的双方互利解决方案。公司将尽最大努力寻求双方均认可的解决方案,但不对此作出保证。 为避免疑义,Credits不可兑换、退款或交换为法定货币、实际金融工具、商品或其他具有货币价值的物品。Credits不具有法定货币的同等价值,不得替代法定货币使用。Credits的购买与使用仅由我们根据本协议的约定及自行判断进行管理。Credits不可转让,仅可用于相关服务。您确认并理解,购买Credits并不意味着您对Credits享有任何个人财产权,也不意味着您对Deemos及其关联方享有任何股权、其他所有权或利润分配权益。 如本协议其他条款所述,内容/服务可能因违反本协议或其他原因从平台移除。特此提醒,除法律要求外,所有销售均为最终销售,不予退款。您完成购买后,我们不允许对购买内容进行修改。我们不对您因此可能遭受的任何损失承担责任,也不对您为该内容支付的任何款项承担退款责任。 ## **4.5争议与逾期付款** 若您对发票有异议,必须在发票开具之日起7日内(以下简称“**发票异议期**”)通过hello@deemos.com联系我们。用户未在发票异议期内提出异议的发票,若发生逾期付款,每月需按未付金额的1.5%支付滞纳金,且我们在向您发出逾期付款书面通知后,可立即暂停服务。 # **5.输入内容与输出内容** 我们的服务允许您通过平台或服务提交、发布、上传、展示或以其他方式提供(以下简称“**提供**”)文本或图像(以下简称“**输入内容**”),以便基于您的输入内容生成内容(以下简称“**输出内容**”)。 ## **5.1 您对输入内容与输出内容的权利** (1) ChatAvatar 若您使用ChatAvatar生成输出内容,在遵守本协议约定及适用法律的前提下,公司将根据知识共享许可协议(您可点击该输出内容显示窗口上的“许可”按钮查看该协议链接),授予您一项非独占、个人、有限、可撤销、不可转让且不可再许可的权利与许可,允许您在您拥有或控制的兼容设备上,将该输出内容用于个人娱乐目的。若您违反本协议的任何限制条款,该许可将自动终止;公司亦有权随时终止该许可。许可终止后,您必须销毁您持有的该内容(无论以电子或纸质形式存在)。请注意,根据该许可,您不得将该内容用于商业目的(例如,为获取商业利益或金钱报酬而使用)。 若您使用ChatAvatar生成输出内容并购买该输出内容的“许可”,在遵守本协议约定及适用法律的前提下,您将获得一项非独占、可撤销、不可转让且不可再许可的权利,具体包括:(a)复制、再制作、分发、公开表演或公开展示输出内容的全部或部分;(b)修改输出内容;(c)基于该输出内容创作衍生作品;(d)将该输出内容及其衍生作品用于促销、广告、商业或商品销售目的。只要您的账户处于有效状态,该许可持续有效;除非您将该输出内容从平台移除并通过hello@deemos.com向我们发出正式通知,撤销对该输出内容的许可。若您希望获得更多权利,请通过hello@deemos.com直接联系我们。 您可将通过ChatAvatar生成的输出内容设置为“私有”,设置后,除您主动分享外,其他用户无权访问该输出内容;除在您的账户中展示该输出内容外,我们不会以其他方式使用该输出内容。 请注意,我们不对任何输出内容的可版权性,或该输出内容可能涉及的知识产权(定义见下文)是否可由任何人申请、注册或归属于任何人,作出任何形式的陈述、保证或承诺。对于因您使用该输出内容而导致的任何违反适用法律、第三方条款与条件的行为,或任何侵犯第三方权利的行为,我们不承担任何责任。 (2) Rodin 若您使用Rodin生成输出内容,在遵守本协议约定、适用法律及适用于该输出内容或服务的第三方条款与条件的前提下,我们不对您使用该输出内容设置限制。 您可将通过Rodin生成的输出内容设置为“私有”,设置后,除您主动分享外,其他用户无权访问该输出内容;除在您的账户中展示该输出内容外,我们不会以其他方式使用该内容。 请注意,我们不对任何输出内容的可版权性,或该输出内容可能涉及的知识产权(定义见下文)是否可由任何人申请、注册或归属于任何人,作出任何形式的陈述、保证或承诺。对于因您使用该输出内容而导致的任何违反适用法律、第三方条款与条件的行为,或任何侵犯第三方权利的行为,我们不承担任何责任。 ## **5.2 您对输入内容与输出内容的声明与保证** 您声明并保证,您拥有或已获得使用您所提供的任何输入内容所需的全部权利、许可、同意、授权及权限。若您并非输入内容的创作者,或未获得提供该输入内容的完整授权,则不得提供该输入内容。您同意,因提供该输入内容而产生的对任何个人或实体的欠款,均由您承担。您提供的输入内容,以及本协议所约定的对输入内容的使用(包括在平台上生成输出内容),不得且不会:(i)侵犯、违反或侵占任何第三方的合法权益;(ii)诽谤、诋毁或侵犯他人的隐私权、公开权或其他财产权;(iii)要求我们向任何第三方获取额外许可、支付特许权使用费、补偿金或其他款项,或向第三方进行署名;(iv)导致您与第三方之间的合同违约;(v)导致我们违反任何法律或法规。我们认为不适当的输入内容示例包括:包含种族歧视或恐同言论的输入内容;涉及欺凌的输入内容;具有冒犯性或损害我们或他人声誉的输入内容;包含色情内容、广告或他人创作成果或肖像的输入内容;冒充管理员或试图欺骗、利用他人的输入内容。在中国境内,您提供的输入内容不得违反《中华人民共和国网络安全法》《互联网信息服务管理办法》《网络信息内容生态治理规定》等规定,不得包含危害国家安全、公共利益、破坏民族团结、传播淫秽色情、暴力恐怖等中国法律下的违法信息、不良信息。 在中国境内,如您对外发布或传播输出内容,您应当确保(i)主动核查输出内容的真实性、准确性,避免传播虚假信息;(2)以显著方式标明该输出内容系由人工智能生成,以向公众提示内容合成的情况。 ## **5.3 我们对输入内容与输出内容的权利** 我们可按照本协议的约定使用输入内容、输出内容及相关信息,且在部分情况下,可通过自动化或人工审核方式,或通过第三方服务商进行该等使用,具体用途包括: * 提供、维护并改进我们的服务,开展并支持相关研究; * 审查您对我们服务的使用情况,以确保符合本协议及适用法律的要求,并根据法律规定或法院判决、政府机关要求,报告违法行为; * 移除违反本协议的不安全、歧视性或其他违法不良信息; * 暂停或移除在使用我们服务过程中违反本协议的账户。 # **6.知识产权** ## **6.1 知识产权** 服务及内容中的视觉界面、图形、设计、资源、汇编、信息、数据、计算机代码(包括源代码或目标代码)、产品、软件、应用程序、服务及所有其他元素(以下简称“知识产权资产”)均受适用法律保护。除本协议明确约定外,内容(为避免疑义,不包括输入内容与输出内容,该两类内容的约定见本条款第5条)或服务中包含的所有知识产权资产,均归我们或第三方许可方所有;未经知识产权资产所有权人另行许可,您不得使用该等知识产权资产。对于本协议未明确授予的知识产权资产相关权利,我们均予以保留。就本条款而言,“**知识产权**”指在世界范围内任何时间产生的(包括任何申请中的)所有知识产权权利,包括专利法、著作权法、商业秘密、专有技术、保密信息、商号及域名、计算机程序、商标法、服务商标、商号、实用新型、外观设计权、半导体布图设计权、数据库权、商誉或反不正当竞争权相关的权利,以及其他任何全球范围内的专有权利。 ## **6.2 内容审核** 我们可在任何时间、出于任何原因(包括提供及开发服务,或认为输出内容和/或输入内容违反本协议或任何适用法律),访问、审查、筛选、编辑、修改、屏蔽及删除通过我们服务产生的输出内容和/或输入内容。滥用我们的服务(如多次尝试生成禁止内容或存在其他违约行为)可能导致服务暂停、账户终止或服务使用限制。您可通过联系我们,举报有问题或非法的内容。 您对我们服务的使用,以及我们对与服务相关的个人信息(包括您作为输入内容或其他内容提供的个人信息)的处理,均受我们的隐私政策约束;我们可按照隐私政策的约定,处理个人信息(包括任何敏感个人信息)。若我们自行判断您违反了本协议,有权进行调查并采取适当措施,该等措施包括但不限于:从服务中移除输入内容和/或内容、暂停或终止您的账户,以及向执法机关报告您的行为。在中国境内,根据《中华人民共和国网络安全法》《互联网信息服务管理办法》《网络信息内容生态治理规定》等规定,我们作为平台运营方,负有网络信息内容安全管理义务,需对平台上的内容进行审核,及时处置违法有害信息,履行网络安全保护责任。 ## **6.3 使用限制** 未经我们事先书面许可,以本协议未明确授权的任何方式使用我们的服务,均属严格禁止行为,该行为将导致本协议授予的许可终止,并构成对我们知识产权的侵犯。您承诺遵守本协议约定,且不得(亦不得故意或非故意地授权、允许或协助他人)从事以下行为(本协议另有明确许可的除外): * 采取任何行动,试图未经授权访问平台、服务、内容或任何其他用户的账户; * 冒充他人或虚假陈述您与他人或实体的关联关系; * 出售、转售或以商业方式使用内容(我们或我们的许可方明确许可的除外); * 复制、再制作、分发、公开表演或公开展示内容的全部或部分(我们或我们的许可方明确许可的除外); * 修改内容、移除任何专有权利标识或标记,或基于内容创作任何衍生作品; * 使用服务训练、改进、增强或以其他方式开发与我们提供的服务相同、相似或构成竞争的人工智能模型及服务; * 使用未经我们授权的任何机器人、爬虫、索引程序、数据抓取工具、脚本、浏览器扩展程序、离线阅读器或其他自动化工具或界面,访问平台和/或服务、提取数据,或干扰、修改服务的呈现或功能; * 对我们服务的任何方面进行反向工程,或从事任何可能泄露源代码或绕过、规避用于限制访问服务任何部分的措施的行为; * 以侵犯我们、我们的关联方或任何第三方知识产权或其他权利的方式使用服务; * 在中国境内使用服务时,未经我们同意或未有合法正当依据,擅自去除、篡改服务涉及的人工智能生成标识或深度合成内容显著标识,标识的位置在图片右下方。 若您实际或可能违反本协议项下的任何限制条款,我们保留暂停、限制或终止您对平台和/或我们服务的访问权限的权利。根据本协议约定,若您被允许以任何形式出售、转售、转让或处置任何内容,您应将本协议约定的限制条款告知内容接收方,并尽最大努力促使接收方遵守该等限制条款(如同接收方是本协议项下的用户)。对于接收方违反本协议的任何行为,您应承担责任。 ## **6.4 通知与下架程序** 我们尊重他人的知识产权,也要求您同样尊重。若您是知识产权所有权人或其代理人,且认为服务上的任何内容侵犯了您的知识产权,可通过hello@deemos.com联系我们提交通知,并书面提供以下信息: * 有权代表知识产权所有权人行事的人员的电子签名或手写签名; * 您声称被侵犯的受保护作品的描述; * 您声称构成侵权的材料的描述及其在服务上的位置; * 您的地址、电话号码及电子邮箱地址; * 您作出的声明,表明您有合理理由相信该等材料的使用未经知识产权所有权人、其代理人或法律授权; * 您作出的声明,表明您通知中的信息真实准确,且在伪证处罚下,您是知识产权所有权人或有权代表知识产权所有权人行事。 对于已被移除或禁用的任何内容,若您认为您的内容未构成侵权,或您已获得知识产权所有权人、其代理人的授权,或根据法律规定有权发布和使用该材料,可向我们发送反通知,并提供授权证明或使用合法性声明。 公司收到反通知后,可将反通知副本发送给原投诉方,告知其公司可能恢复被移除的内容或停止对该内容的禁用。除非知识产权所有权人提起诉讼并获得针对内容提供方的法院禁令,否则公司可在收到反通知后,自行决定恢复被移除的内容。 您确认,若您未遵守本第6.4条的全部要求,您的通知或反通知可能无效。我们保留根据需要要求您提供更多材料的权利。 公司保留以下权利:(i)在收到知识产权所有权人或其代理人的通知后,如善意认为通过服务提供的材料侵犯第三方知识产权,可移除该材料或禁用对该材料的访问;(ii)在适当情况下,终止多次或严重侵犯他人知识产权的用户的账户,并阻止该用户访问服务。 ## 6.5 查阅、复制、更正、补充、删除个人信息请求的方式 (1)查阅、复制个人信息:用户在产品首页点击个人头像即可进行个人信息的查阅和复制。 (2)更正、补充个人信息:用户在产品首页点击个人头像,选择“修改”选项,即可对个人信息进行更正和补充。操作完成后,点击“保存”按钮即完成相关设置。 (3)删除个人信息:用户可以通过邮箱(hello@deemos.com)联系公司删除自己的个人信息。 ## 6.6保存期限 正常情况下保存期限为3年,若是服务终止或是您注销账号我司会按照法律要求留存周期后15个工作日删除您的全部个人信息。 # **7.负责任使用** 用户仅有权为合法、适当的目的,按照本协议及适用法律的规定访问或使用平台、服务或内容。公司明确禁止并谴责旨在损害他人的非法或滥用行为。该等行为可能导致账户暂停或终止,且不予退款。 具体而言,公司禁止以下使用行为(包括但不限于)。通过使用服务,用户无条件同意该等限制。若您不确定某一使用行为是否合法,必须在使用服务前获得公司的书面许可。若未获得该等书面许可,可能导致账户暂停或终止,且不予退款: * 以任何方式干扰、破坏、负面影响或阻碍其他用户充分使用服务,或损害、禁用、过度负担或影响服务功能的行为; * 我们认为不适当或违反任何适用法律(包括但不限于洗钱、资助恐怖主义及/或欺诈活动)、违背公序良俗或涉及欺诈、欺骗性或操纵性交易活动的行为; * 旨在利用、伤害未成年人或试图利用、伤害未成年人的行为; * 从事欺骗我们、其他用户或任何第三方的活动,或创建、传播虚假、不准确或误导性信息的行为; * 侵犯他人隐私的行为,包括: (a)未遵守适用法律规定,收集、处理、披露、推断或生成个人数据; (b)上传未经他人同意拍摄的他人照片、音视频记录或任何内容,用于处理个人生物识别标识、生物识别信息或用于其他目的; (c)协助开发间谍软件、通信监控工具或用于未经授权监控他人的工具; * 诽谤、诋毁他人或对他人进行骚扰的行为; * 旨在歧视、伤害个人或群体,或对个人或群体造成伤害的行为(基于线上或线下社交行为、已知或预测的个人特征或性格特征); * 利用特定群体(基于年龄、社会、身体或心理特征)的脆弱性,以导致或可能导致该群体成员或他人身心伤害的方式,实质性扭曲该群体成员行为的行为; * 实施或协助实施可能严重影响他人安全、福祉或权利的以下活动: (a)提供定制化的法律、医疗/健康或财务建议,但未经过合格专业人员审核,且未披露使用人工智能辅助及其潜在局限性的行为; (b)在影响个人安全、权利或福祉的领域(如执法、移民、关键基础设施管理、产品安全组件、基本服务、信贷、就业、住房、教育、社会评分或保险)作出高风险自动化决策的行为; (c)创建政治竞选材料或干预选举的行为(如生成针对特定人群定制或定向推送的竞选材料); (d)协助开展真人赌博、发薪日贷款、产权贷款或其他高利息短期贷款业务,以剥削弱势群体的行为; (e)生产、修改、设计、营销或分销武器、爆炸物、危险材料或其他旨在造成人身伤害或死亡的系统的行为; (f)伤害他人或破坏财产的行为; (g)参与未经授权违反任何服务或系统安全性的活动的行为; * 将从我们服务中收集的数据用于任何直接营销或招揽活动的行为; * 生成、传播用于司法行政、执法、移民或庇护程序的信息的行为(如预测个人将实施欺诈/犯罪行为,包括通过文本分析、推断文件中主张之间的因果关系、无差别或任意定向使用等方式); * 从事需经注册或许可的金融活动,包括但不限于使用服务进行证券交易、商品期货交易、杠杆式/保证金式/融资式商品交易、二元期权交易(包括预测市场交易)、房地产或房地产租赁、设备租赁、债务融资、股权融资或其他类似交易; * 参与为企业、协议或平台筹款的行为,包括但不限于创建、挂牌或购买符合以下情形的资产:(a) 属于证券或金融工具,或可兑换为证券或金融工具;(b) 赋予所有权人参与首次代币发行或任何证券发行的权利;(c) 赋予所有权人获得财务回报的权利(包括但不限于去中心化金融收益奖励、质押奖励、销毁折扣等)。 在中国境内,您的使用行为需遵守《中华人民共和国国家安全法》《中华人民共和国反恐怖主义法》《中华人民共和国反电信网络诈骗法》《互联网信息服务深度合成管理规定》《生成式人工智能服务管理暂行办法》等法律规定,不得利用服务制作、复制、发布、传播法律、行政法规禁止的信息,不得从事危害国家安全和利益、损害国家形象、侵害公共安全和社会公共利益、扰乱经济和社会秩序、侵犯他人合法权益等法律、行政法规禁止的活动。 # **8.第三方材料** 服务的某些部分可能包含、展示或提供来自第三方的内容、数据、信息、应用程序或材料(以下简称“**第三方材料**”)。您理解,使用服务时,可能会接触到第三方材料(如第三方广告、推广内容),该等材料可能被认为具有冒犯性、不雅性或不当性,且可能包含或不包含明确的不良语言提示,也可能包含指向不当材料的链接或引用。尽管如此,您同意自行承担使用服务的风险,对于被认为具有冒犯性、不雅性、不当性、不准确、不完整、过时、无效、违法、低质量或其他问题的内容,我们不对您承担任何责任。 此外,您的设备可访问、展示或链接到的第三方材料,并非在所有语言或所有国家/地区均可用。我们不对该等服务及材料在任何特定地区的适用性或可获得性作出任何陈述与保证。若您选择访问该等服务或材料,应自行决定并承担遵守适用法律的责任。 # **9.赔偿** 用户同意为Deemos及其子公司、关联方,以及Deemos及其子公司、关联方的每位高管、董事、代理人、合作伙伴、员工及许可方(以下统称“**Deemos方**”)提供辩护、赔偿,并使其免受损害,以应对因以下情形产生的所有实际或主张的第三方索赔、损害赔偿、裁决、判决、损失、责任、义务、罚款、利息、费用(包括但不限于律师费及相关支出)及成本(包括但不限于诉讼费、和解费、以及为寻求赔偿和保险而产生的费用)(无论性质如何,无论是已知或未知、已预见或未预见、已成熟或未成熟、已怀疑或未怀疑,无论是基于侵权(包括过失)、合同或其他法律依据,以下统称“**索赔**”),包括但不限于财产损害或人身伤害相关的索赔:(a)您访问、使用或被主张使用服务的行为;(b)您违反本协议的任何条款、本协议提及的任何陈述、保证或协议,或任何适用法律或法规的行为;(c)您侵犯任何第三方权利的行为(包括知识产权、专有权利、公开权、隐私权、财产权或保密义务);(d)您与任何第三方之间的争议或纠纷。您同意在收到任何第三方索赔通知后,立即通知Deemos方,并配合Deemos方应对该等索赔。您进一步同意,Deemos方有权控制对任何第三方索赔的辩护或和解。 # **10.责任限制** ## **10.1 与平台/服务/内容相关的免责声明** 您访问和使用平台、服务及/或内容的风险由您自行承担。除我们书面另行约定外,服务、平台或服务中的内容、平台或服务中列出的第三方材料,均按“现状”和“可用”原则提供,不附带任何形式的保证或条件(无论是明示还是默示),包括但不限于对适销性、特定用途适用性、所有权及不侵权的默示保证。我们不对以下事项作出任何陈述或保证:(a)服务、内容及平台将满足您的要求;(b)服务、内容及平台将不间断、及时、安全或无错误地提供;(c)服务、内容及平台是准确、可靠、完整、独特、合法、最新或安全的。您同意并确认,在进行任何购买前,您将仔细阅读相关信息及本协议,以确保其符合您的要求和目的。尽管我们努力确保您访问和使用平台、内容及/或服务的安全性,但我们无法且不对平台、服务或其上/其中的任何内容无病毒或其他有害组件作出陈述或保证。在适用法律允许范围内,我们无法保证您在线披露的任何数据的安全性。您接受通过互联网提供信息和进行在线交易所固有的安全风险,且不得就任何安全漏洞向我们主张责任。 在适用法律允许的最大范围内,我们不对您因使用平台、服务及内容而遭受的任何损失承担责任,也不对该等使用行为负责。在不限制前述规定的前提下,您理解并同意,若发生以下情形,我们不构成对本协议的违约,也不对由此产生的任何损失、损害或索赔承担责任:(i)用户自身过错(如忘记密码、交易设置错误、地址输入错误);(ii)与服务相关的服务器升级、服务器维护、服务器故障、服务器错误、服务器延迟或数据丢失;(iii)我们服务生成的输出内容与任何第三方的内容相同或相似;(iv)对平台或服务的未授权访问;(v)任何未授权的第三方活动(包括但不限于使用病毒、特洛伊木马、恶意程序攻击、钓鱼、暴力破解或其他攻击方式攻击平台、服务或任何内容);(vi)不可抗力(如自然灾害、洪水、干旱、地震等);(vii)流行病或大流行病;(viii)恐怖袭击、内战、动乱或骚乱、战争、战争威胁或备战、武装冲突、实施制裁、禁运或断交;(ix)我们为遵守任何适用法律或政府/公共机关的行为而变更业务计划或对服务采取的任何行动;(x)公用事业服务中断或故障、电力故障、系统不稳定、系统或设备故障、电信设备故障;(xi)第三方服务提供商的不履行行为或造成的缺陷;(xii)免责声明及本协议中提及的其他免责情形。 ## **10.2 责任限制** 在适用法律允许的最大范围内,Deemos方不对您或任何第三方因本协议、平台、服务、内容或任何第三方材料产生的任何间接损失、后果性损失、惩戒性损失、附带损失、特殊损失或惩罚性损失(包括但不限于利润损失、收入损失、业务损失或预期节省损失、使用损失、商誉损失或数据损失)承担责任,无论该等损失是基于侵权(包括过失)、合同违约或其他法律依据产生,即使该等损失是可预见的,且即使我们已被告知可能发生该等损失。 您访问和使用平台、服务、内容或任何第三方材料的行为,由您自行决定并承担风险;在适用法律允许的最大范围内,您应自行承担因该等访问和使用导致的计算机系统损坏或数据丢失的责任。尽管本协议有任何相反约定,在任何情况下,我们因本协议、访问及使用平台、服务或内容而产生的最大累计责任,不得超过以下两者中的较高者:100美元,或您为使用我们的服务已支付的费用金额。 在中国境内,若法律禁止限制或免除特定类型的责任(如人身损害赔偿责任、因故意或重大过失造成的财产损失赔偿责任),则本条款中的相应责任限制或免除条款不适用;若适用法律规定的赔偿限额高于本条款约定,则按适用法律规定执行。 # **11.协议修改** 我们保留自行决定更新或修改本协议的权利,可在任何时间修改本协议的部分条款,尤其在以下情形下:(a)法律或监管要求发生变化;(b)出现安全或运营问题;(c)适应新技术发展。该等修改一经在服务上发布,立即生效。我们将在服务上发布修改内容,并在本协议顶部注明最新修订日期。我们还将通过服务界面、电子邮件通知或其他合理方式通知您。若您在修订后的协议发布后继续使用任何服务,即表示您接受并同意该等修改。建议您定期查阅本协议,以了解最新修改内容。若您不接受更新后的协议,必须停止使用我们的服务。我们不对服务的任何变更、暂停或终止,或您对服务访问权限的变更、暂停或终止承担责任。在中国境内,根据《中华人民共和国民法典》关于格式条款的规定,若我们对本协议的修改涉及免除或限制我们的责任、加重您的责任或排除您的主要权利,我们将以显著方式(如弹窗、加粗字体、单独通知等)向您提示该等修改内容,并确保您有充分机会阅读和理解;若您不同意该等修改,有权终止使用服务,我们不得强制您接受修改后的协议。 # **12.协议终止** 您可在任何时间停止访问服务。我们保留调查针对本协议的投诉或已报告违约行为的权利。若我们认为您违反了本协议,或为遵守适用法律而必须采取行动,我们可在不通知您的情况下,随时暂停或终止您对服务的访问,并采取我们认为适当的任何行动,包括但不限于注销您的账户、向执法机关、监管机构或其他第三方报告任何涉嫌违法行为,以及根据我们的隐私政策的允许,向该等主体披露与您相关的必要信息(包括您的个人资料、电子邮件地址、使用记录、发布的材料、IP地址及流量信息)。 本协议或您对服务的访问权限终止后,我们可自行决定删除与您账户相关的任何内容或其他数据。本协议第0-21条在本协议到期或终止后仍然有效。在中国境内,根据《中华人民共和国个人信息保护法》,您账户注销或协议终止后,我们应及时删除您的个人信息,或对其进行匿名化处理,除非适用法律、行政法规另有规定(如为履行法定职责需保留相关信息)。 # **13.权利转让、让与与委托** 未经我们事先书面同意,您不得转让或让与您使用服务的任何权利,或您在本协议项下的任何权利或义务(包括与法律执行相关的权利或义务,或因控制权变更产生的权利或义务)。我们可自行决定将本协议项下的全部或部分权利或义务转让或让与给第三方,无需通知您或获得您的同意。在中国境内,根据《中华人民共和国民法典》,若我们将义务转让给第三方,需经您同意;若转让权利,需通知您,否则该转让对您不发生效力;若转让行为对您的权利产生重大不利影响,您有权拒绝接受该转让。 # **14.可分割性** 若本协议的任何条款被有管辖权的法院或行政机关认定为无效或不可执行,该条款在适用法律下的无效性或不可执行性,不影响本协议其他条款在该适用法律下的效力,也不影响该条款在其他法律下的无效性或不可执行性;所有未受该等无效性或不可执行性影响的条款,在相关法律下仍保持完全效力。我们将对该等无效或不可执行的条款进行修改和解释,以在适用法律允许的最大范围内实现该条款的目的。 # **15.完整协议** 本协议构成我们和您就其所议事项达成的完整协议,取代并终止我们和您此前就同一所议事项达成的所有其他陈述、安排、理解及协议(无论口头或书面、明示或默示)。您确认,在同意本协议时,您未依赖本协议明确约定以外的任何陈述、保证、理解或承诺。在中国境内,若本协议为格式条款,根据《中华人民共和国民法典》,我们已对本协议中免除或限制我们责任的条款、排除您主要权利的条款尽到提示和说明义务,您已充分阅读、理解并同意该等条款。 # **16.权利放弃** 除非享有相关权利、利益、权力或救济的一方以书面形式作出放弃,否则不得全部或部分放弃本协议项下的任何权利、利益、权力或救济。任何一方延迟执行或不执行本协议的任何条款,不得视为对该条款执行权的放弃;本协议赋予任何一方的任何权利、利益、权力或救济,均不排除该方享有的其他权利、利益、权力或救济,且该等权利、利益、权力或救济具有累积性。 # **17.通知、沟通与投诉** 通过使用服务,您同意我们可通过以下电子方式向您发送与您使用服务相关的通知或其他沟通信息(包括营销信息):(a)电子邮件(发送至您提供的邮箱地址)、短信(发送至您提供的电话号码)或电话(拨打您提供的电话号码);(b)在平台上发布通知。对于通过电子邮件发送的通知,发送日期视为收到日期。您始终有权选择取消订阅我们发送的任何营销信息。向我们发送的通知,应通过电子邮件发送至hello@deemos.com。您可自愿向我们发布、提交或以其他方式传达关于Deemos或我们服务的任何问题、评论、建议、想法、原创或创意材料或其他信息(以下统称“**反馈**”)。我们可将该等反馈用于任何目的(包括商业目的),无需向您确认或支付任何补偿,包括但不限于自行决定使用、开发、复制、发布或改进该反馈。您理解,我们可将反馈视为非保密信息。 ## 17.1接受公众或使用者投诉举报 (1)途径 您可以点击产品首页中的“Term”功能,填写详细的投诉举报内容点击提交完成此操作;或通过邮箱hello@deemos.com。填写个人账号信息及投诉举报内容进行投诉举报反馈。 (2)反馈方式 我们会在核实用户账号信息后,通过邮箱hello@deemos.com联系您进行举报反馈问题的核实,并在5个工作日内反馈处理结果。 # **18.第三方权利** 除我们的关联方外,非本协议当事方的任何个人或实体,无权主张执行本协议的任何条款。 # **19.条款存续** 您同意并理解,本协议的所有条款在以下情形终止或到期后仍然有效:(i)服务或平台终止或到期;(ii)您不再拥有任何内容的所有权。 # **20.管辖法律** 若您为中华人民共和国境内的自然人、法人或非法人组织,则本协议适用中华人民共和国法律(为避免疑义,不包括香港特别行政区、澳门特别行政区和台湾地区的法律)。 # **21.争议解决** 请仔细阅读本条,因其将影响您的权利。 若您为中华人民共和国境内的自然人,因本协议而产生的任何纠纷,各方应本着友好的态度协商解决,解决无果的情况下,双方同意将争议提交至上海市浦东新区人民法院解决。 若您为中华人民共和国境内的法人或非法人组织,您与Deemos同意遵守以下强制性仲裁及集体诉讼弃权条款: ## **21.1 强制性仲裁** 在符合第21.2至21.6条约定的前提下,任何因本协议产生、与本协议相关或涉及本协议的争议、纠纷、索赔或分歧(包括本协议的存在、效力、解释、履行、违约或终止,本仲裁条款的效力、范围及可执行性,以及与本协议相关的非合同义务争议)(以下统称“**争议**”),应在任何一方向另一方发出仲裁通知(以下简称“**仲裁通知**”)后,提交仲裁解决。 ## **21.2 非正式争议解决** 在采取正式法律行动前,我们希望了解并尽力解决您的疑虑。在任何一方针对另一方提起索赔前,双方同意首先尝试通过非正式方式解决争议。您应通过hello@deemos.com向我们发送通知,我们将通过您账户关联的电子邮件地址向您发送通知。若双方在60日内未能解决争议,任何一方均有权启动仲裁程序。双方还同意,若任何一方在此期间要求举行个人和解会议,双方均应参加。在此非正式争议解决期间,诉讼时效中止计算。 ## **21.3 仲裁程序** 争议应根据提交仲裁通知时有效的上海仲裁委员会适用的仲裁规则(以下简称“**规则**”),由上海仲裁委员会进行仲裁,该规则视为本第21条的组成部分。仲裁应尽可能通过视频会议进行;若仲裁员认为需进行现场听证,听证地点应由双方协商确定,或由仲裁员确定。仲裁庭由1名仲裁员组成,仲裁裁决具有终局性。 ## **21.4 继续履行** 在争议解决期间,除争议部分及仲裁涉及的部分外,双方应继续履行本协议的其他条款。 ## **22.算法备案信息** 备案号:网信算备310115861227801240017号 公示链接:https://www.cac.gov.cn/2025-03/12/c_1743480314931271.htm # **隐私政策** 我们是hyper3d.ai的运营方影眸科技(上海)有限公司(简称“**Deemos**”或“**公司”**),注册地址位于中国(上海)自由贸易试验区中科路1750号1幢十五层(产证楼层12层)1502室。我们运营我们的网站hyper3d.ai(以及我们任何关联的网站、应用程序和社区,统称为“**站点**”),并在这些站点上提供服务,例如ChatAvatar和Rodin(简称“**服务**”)。本隐私政策阐述了我们如何通过我们的服务收集、存储、使用和共享数据。我们非常重视并致力于保护您在使用服务时可能提供的个人数据(定义见下文)的保密性。我们仅按照本隐私政策所述处理您的个人数据。 如果您对本隐私政策有任何疑问,请根据下文第12条“联系我们”中列出的信息与我们联系。 # **1.个人数据收集** 我们为各种目的收集数据,以向您提供和改进服务。就本隐私政策而言,“**个人数据**”指任何与已识别或可识别的自然人相关的数据,包括昵称、电子邮件地址、密码和社交账户等信息,但不包括匿名化信息。当您通过服务与我们互动时,我们可能直接从您那里或从其他来源收集数据。如果我们对您个人信息的处理受某些数据隐私保护法律(下文统称为“**适用法律**”)的约束,我们还将根据适用法律要求,告知您我们处理您个人数据的法律依据以及您在此类法律下的权利。 针对中国境内用户,为便于阅读,我们以下方表格清单形式向您概括介绍我们所收集使用的您的个人信息情况。 **个人信息收集清单** |**收集个人信息的目的** |**涉及收集的个人信息字段** | |---|---| |注册登录账户 |昵称、电子邮件地址、用户凭证(包括用户名、**密码**、**密码提示和安全信息**) | |提供深度合成功能 |对话记录(包括输入数据、输出内容) | |提供客服咨询、评论反馈服务 |反馈数据 | |支付交易 |**信用卡信息**、**支付金额**、**支付方式**、**账单地址**、**订单号** | |安全管理 |硬件型号、操作系统版本号、设备标识符(对于Android,包括AndroidID、OAID、IMSI、SIM卡信息如ICCID和GAID;对于iOS,包括IDFV、IDFA;不同标识符在有效期、用户能否重置以及获取方式方面可能有所不同)、网络设备硬件地址(设备MAC地址)、客户端硬件特征、IP地址、WLAN接入点(如SSID、BSSID)、蓝牙、基站、软件版本号、网络接入方式、类型、状态、网络质量数据、网络源地址和目的地址、网络源端口、操作时间和类型、使用情况、服务日志、设备传感器数据(如加速度计)、运行进程信息、页面的总体操作和使用频率、页面崩溃情况、总体使用情况、性能数据以及错误报告、**点击、浏览、编辑活动记录**、用户访问的程序和功能、**用户购买的项目**,以及用户通过服务进行互动的时间、频率和持续时间 | |营销与广告推送 |电子邮件地址 | ## **1.1您直接提供给我们的个人数据** (1)**账户数据**。此类数据包括姓名、电子邮件地址、电话号码及其他联系数据,以及用于创建账户和验证服务用户身份的用户凭证,包括用户名、**密码**、**密码提示和安全信息**。如果您拒绝提供用于注册和登录的账户数据,我们可能无法向您提供服务。 (2)**对话记录**。这包括您发布、上传、显示或以其他方式提供到站点上用于生成任何内容(“**输出内容**”)的文本和/或图像(“**输入数据**”),以及相应的输出内容。输入数据可能用于影响、塑造或决定最终输出内容的特征、结构和外观。如果您拒绝提供上述信息,您将无法使用站点中提供的深度合成相关AI功能,但不会影响您正常使用站点中的其他功能。 (3)**反馈数据**。这包括客户服务咨询、产品评论以及关于服务的其他反馈。如果您拒绝提供反馈数据,不会影响您使用我们的服务。 (4)**支付数据**。如果您发起支付请求,我们需要收集您的**信用卡信息**、**支付金额**、**支付方式**、**账单地址**、**订单号**,以完成支付和交易流程。如您拒绝提供上述信息,您将无法通过我们的站点完成支付并使用付费功能,但不会影响您正常使用站点中的其他功能。 ## **1.2我们自动收集的个人数据** (1)**设备和网络数据**。这包括您的硬件型号、操作系统版本号、设备标识符(对于Android,包括AndroidID、OAID、IMSI、SIM卡信息如ICCID和GAID;对于iOS,包括IDFV、IDFA;不同标识符在有效期、用户能否重置以及获取方式方面可能有所不同)、网络设备硬件地址(设备MAC地址)、客户端硬件特征、IP地址、WLAN接入点(如SSID、BSSID)、蓝牙、基站、软件版本号、网络接入方式、类型、状态、网络质量数据、网络源地址和目的地址、网络源端口、操作时间和类型、使用情况、服务日志、设备传感器数据(如加速度计)、运行进程信息、页面的总体操作和使用频率、页面崩溃情况、总体使用情况、性能数据以及错误报告。如您拒绝提供上述信息,我们可能无法向您提供服务。 (2)**使用数据**。这包括您在使用服务过程中的行为信息,包括您的**点击、浏览、编辑活动记录**、您访问的程序和功能、**您购买的项目**,以及您通过服务进行互动的时间、频率和持续时间。如您拒绝提供上述信息,我们可能无法向您提供服务。 (3)保存期限。正常情况下保存期限为3年,若是服务终止或是您注销账号我司会按照法律要求留存周期后15个工作日删除您的全部个人信息。 ## **1.3第三方提供的个人数据** **第三方登录**。如果您通过第三方服务(例如,社交媒体平台)连接使用我们的服务,该第三方可能会与我们共享您第三方账户中的某些信息。通过第三方账户进行注册和登录,即表示您同意该第三方向我们提供相关的个人数据。我们可能会收集其他第三方数据,例如来自我们的关联公司、合作伙伴或供应商、数据经纪人或公开来源的数据。 **如果您向我们提供任何您本人以外的数据主体的任何个人数据,请将本隐私政策告知他们。您特此确认,在向我们提供此类个人数据之前,您已获得他们的同意或已完成其他合法依据所要求的替代同意的其他手续。通过向我们提交此类信息,您向我们声明您有权提供且我们有权为本隐私政策所述之目的处理相关个人数据**。 ## **1.4敏感个人信息** “**敏感个人信息**”通常指涉及个人隐私权,一旦泄露或者非法使用,容易导致自然人的人格尊严受到侵害或者人身、财产安全受到危害的个人信息。敏感个人信息的范围在不同司法管辖区可能有所不同,对于中国大陆区域的用户而言,我们所收集的敏感个人信息已在前文中以**粗体、下划线**方式标识,请您重点关注。 在您通过我们的服务生成输出的过程中,我们**不会主动收集**您的敏感个人信息。如果您不希望提供此类数据,可以避免上传可能涉及敏感个人信息(如健康、财务等方面)的文本和/或图像。此外,我们将根据适用法律实施安全措施以保护您提供的任何敏感个人信息。 # **2.数据使用** ## **2.1总则** 通常,我们仅会为本隐私政策所述之目的或在收集相关个人数据时向您说明的目的使用您的个人数据。但是,如果适用法律允许,我们也可能为与我们已向您披露的目的不相抵触的其他目的处理个人数据。我们收集和使用本隐私政策所述个人数据的法律依据取决于我们收集的个人数据以及我们收集数据的具体背景: (1)我们需要履行和您签署的合同; (2)您已提供相关同意; (3)在特定司法管辖区,处理您的个人信息是基于我们的合法利益,包括: (i)提供、维护和宣传服务; (ii)检测、防止和执行违反我们的服务条款(位于 [https://hyper3d.ai/legal/terms](https://hyper3d.ai/legal/terms),简称“**条款**”)的行为,包括滥用服务、欺诈、滥用以及其他信任与安全协议;以及 (iii)保护我们的合法权益及他人的权利。 (4)我们需要遵守适用法律规定的法律义务。 ## **2.2具体目的** 在遵守适用法律的前提下,我们处理个人数据的目的及进行此类处理的法律依据如下: (1) **服务运营**。这些目的包括需要: a) 完成您请求的交易; b) 提供基于位置的服务并遵守地域限制; c) 诊断和修复服务问题,并提供其他客户支持服务; d) 进行分析以更好地了解我们的用户及其使用服务的方式; e) 通过新的或改进的功能来推进和增强我们的服务; f) 构建预测模型,使我们能够根据所掌握的关于用户如何使用我们服务的数据来定制服务。 (2) **用户沟通**。这些目的包括需要: a) 回应您联系我们提出的任何疑问或请求; b) 提供关于您的账户、您对服务的使用或您请求的其他交易的信息;以及 c) 根据您的订阅、更新和其他偏好,发送新闻、提示和其他类型的沟通信息。 (3) **营销与广告**。我们代表我们自己以及我们的合作伙伴和其他方,将个人数据用于营销或广告目的。 (4) **安全、合规与执行**。这些目的包括需要: a) 保护我们用户和服务的安全性与保障; b) 检测和防止滥用、欺诈或其他非法或未经授权的活动; c) 解决争议;以及 d) 执行我们的协议,包括管辖您使用服务的条款。 (5) **其他**。我们也可能以收集时披露的方式或在已获得同意的情况下以其他方式使用个人数据。另请注意,本隐私政策并非旨在对我们如何处理聚合化、假名化或匿名化数据施加任何限制。 # **3.数据共享、转让、公开披露** ## **3.1共享** 我们仅为合法、正当、必要、具体和明确的目的披露个人数据,并且仅共享提供服务所必需的个人数据。我们将为本隐私政策阐明的目的,向以下类别的第三方披露个人数据: (1)**关联公司和企业合作伙伴**。根据适用法律,出于合法商业目的和服务运营的需要,我们在我们的关联公司和相关实体之间共享个人数据。 (2)**执法机构、公共机关或其他司法机构和组织**。我们会基于以下情况共享个人数据:(i)如法律要求,(ii)或者如我们善意相信此类使用为遵守法律义务、程序或请求,执行条款及其他条款、政策和标准,包括调查任何潜在的违规行为,检测、防止或以其他方式解决安全、欺诈或技术问题,或根据适用法律要求或允许保护我们、我们的用户、第三方或公众的权利、财产或安全(包括与其他公司和组织交换信息以进行欺诈防护),是合理且必要的。 ## **3.2转让** 我们不会将您的个人信息转让给任何公司、组织和个人,但以下适用法律允许的情况除外: (1)在获取明确同意的情况下转让:获得您的明确同意后,我们会向其他方转让您的个人信息; (2)**公司所有权变更**。如果我们进行合并、收购、破产、重组、合伙、资产出售或其他交易,我们可能作为该交易的一部分转让个人数据。根据中国境内法律要求,如涉及到个人信息转让,我们会向您告知个人信息接收方的名称和联系方式。我们会在要求新的持有您个人信息的公司、组织继续受此个人信息保护政策的约束,否则我们将要求该公司、组织重新向您征求授权同意。 ## **3.3公开披露** 在适用法律允许的范围内,我们可能在以下情况下,公开披露您的个人信息: (1)获得您的单独同意后; (2)在法律、法律程序、诉讼或政府主管部门强制性要求的情况下,我们可能会公开披露您的个人信息。 # **4.个人数据保留** 我们遵守针对所收集个人数据的保留政策,以确保其保留时间不超过实现既定目的所必需的时间。根据服务需求和监管要求,我们对收集的不同类型的个人数据适用不同的保留期限,例如: * **电子邮件**:当您使用电子邮件注册或登录时,我们需要持续保留您的电子邮件地址,以便为您提供服务、处理您可能提出的任何疑问或投诉,并保障您的账户和系统安全。 * 您输入的信息、提供的反馈、喜欢和不喜欢的记录,将在您撤回、删除或停用账户之前的期间内保留,并用于持续为您提供更好的服务。 * 通过Cookie收集的设备ID的保留期为21天。 如果您停用账户、删除个人数据或保留期限届满,我们将删除或匿名化您的个人数据,以下情况除外: * 遵守适用法律关于数据保留的法律要求。 * 出于财务、审计、争议解决或其他合法目的而延长保留期限。 在评估您的个人数据应保留多久时,我们会在适用法律允许的范围内考虑以下标准: Ÿ 个人数据的性质及相关活动; Ÿ 您使用服务的时间和使用时长;以及 Ÿ 我们的合法利益和我们的法律义务。 # **5.Cookie和类似技术** 我们使用Cookie和类似技术(统称为“**追踪技术**”)来提供服务和收集数据。此外,当您使用服务时,第三方也可能使用追踪技术;例如,如果我们聘请第三方运营服务,或者因为服务包含由第三方交付的内容或广告。这些追踪技术包括以下组成部分。 Cookie是用于唯一标识您的设备或浏览器,或在浏览器中存储数据或设置的小型文本文件,旨在帮助您高效地在页面间导航、记住您的偏好、启用功能、帮助我们了解用户活动和模式。它们可以是基于会话的(即,仅在浏览器打开期间有效,关闭浏览器时自动删除)或持久性的(即,持续有效直到您删除它们或它们过期)。 我们将追踪技术用于以下目的: (1) **登录/身份验证**。当您登录账户使用服务时,我们使用追踪技术存储您的登录信息。这使服务能够记住您的用户偏好,并根据这些偏好为您提供更量身定制的体验。它还允许您使用服务而无需在每个页面或每次返回时重新登录。 (2) **安全**。我们使用追踪技术帮助检测欺诈和服务滥用行为,包括未经授权访问服务的尝试。 (3) **分析**。我们使用追踪技术收集有关服务的使用和性能数据,包括计算特定服务的独立访客数量。 (4) **定制服务**。我们使用追踪技术收集关于您如何使用服务的信息,以便我们可以根据与您最相关的内容来定制您的体验。 (5) 在某些情况下,我们可能与第三方(例如,服务的第三方运营商)合作,将我们唯一的匿名标识符(例如与追踪技术关联的标识符)与第三方自己的标识符同步。这使我们能够更好地实现上述每个目的。 您可以根据需要禁用Cookie。但是,如果您选择禁用Cookie,服务的某些部分可能无法正常工作。有关Cookie及其管理方法的更多信息,请访问:[www.allaboutcookies.org](https://www.allaboutcookies.org/)。 # **6.数据安全** 我们已实施适当的技术和组织安全措施,旨在根据适用法律保护个人数据免遭意外或非法的破坏、丢失、篡改、未经授权的披露、未经授权的访问以及其他非法或未经授权的处理形式。 您的账户受密码保护,以确保您的隐私和安全。您必须通过适当选择和保护密码,并在访问账户后注销来限制对您的计算机或设备和浏览器的访问,以防止对您账户和个人数据的未授权访问。如果您担心您的账户或个人数据已面临风险(例如,可能有人发现了您的密码),请使用第12条“联系我们”中提供的联系方式与我们联系。 尽管我们使用合理的商业努力来保护数据,但没有任何技术、数据传输或系统可以保证100%安全。如果发生安全事件导致您的数据遭到意外或非法的破坏、丢失、篡改、未经授权的披露或访问,我们将根据适用法律通知您。 # **7. 隐私权与数据移除** 根据您所在地区,您可能对您的个人数据拥有某些法定权利。例如,您可能有权: 1. 问您的个人数据及与其处理方式相关的信息; 2. 从我们的记录中删除您的个人数据; 3. 更正或更新您的个人数据; 4. 将您的个人数据转移给第三方(数据可携权); 5. 限制我们处理您个人数据的方式; 6. 反对我们处理您个人数据的方式;以及 7. 向您当地的数据保护机构提出投诉。 您可以通过您的账户行使其中一些权利,也可以通过第12条“联系我们”中提供的联系方式和我们联系,以行使您的个人数据权利。 此外,您可以通过发送电子邮件至 [hello@deemos.com](https://mailto:hello@deemos.com/) 请求注销您的账户。收到账户注销的请求后,我们将从我们的活动数据库中停用或删除您的账户和信息。但是,请注意,某些信息可能会被保留以遵守法律要求,包括但不限于防止欺诈、阻止服务滥用、解决支付纠纷、协助国家、地方或国际调查以及执行条款的需要。在中国境内,如果法律、行政法规规定的保留期限尚未届满,或者删除个人信息从技术上难以实现,我们将停止除存储和采取必要的安全措施之外的处理。 我们将根据适用法律的要求尽量满足您的个人数据请求。对于中国境内用户提出的请求,复制、转移您的个人信息、撤回或改变授权同意、限制或拒绝针对您个人信息的数据处理活动、要求对您的个人信息处理规则进行说明等请求,我们通常会在15个工作日内响应。请您理解,在以下情形中,我们将无法响应您的请求: 1. 与我们履行法律法规规定的义务相关的; 2. 与国家安全或国防安全相关的; 3. 与公共安全、公共卫生、重大公共利益直接相关的; 4. 与刑事侦查、起诉、审判和判决执行直接相关的; 5. 我们有充分证据表明您存在主观恶意或滥用权利的; 6. 出于维护您或其他个人的生命、财产等重大合法权益但又很难得到本人同意的; 7. 响应您的请求将导致您或其他个人、组织的合法权益受到严重损害的; 8. 涉及商业秘密的。 # **8. 委托处理** 在适用法律允许的范围内,我们可能聘请第三方公司和个人(简称“**服务提供商**”)来协助我们的服务、代表我们提供服务、执行与服务相关的服务或协助我们分析服务的使用情况。在此过程中,我们可能委托服务提供商处理您的个人信息,以便向您提供相应的产品或服务。这些第三方仅可为代表我们执行这些任务而访问您的数据,并有义务不将其披露或用于其他目的。对我们委托处理个人信息的公司、组织和个人,我们会与其签署严格的保密协议或其他数据保护相关协议,要求他们按照我们的要求、法律法规规定以及其他能够保证个人信息的保密和安全的措施来处理个人信息。 # **9. 其他网站的链接** 我们的服务可能包含指向非由我们运营的其他网站的链接。如果您点击第三方链接,您将被导向该第三方的网站。我们强烈建议您查看您访问的每个网站的隐私政策。 我们对任何第三方网站或服务的内容、隐私政策或做法概不控制,也不承担任何责任。 # **10. 儿童隐私** 我们的服务不面向18岁以下的任何人士。如果没有父母或监护人的同意,不满18周岁的未成年人不得使用我们的产品或服务。对于经父母同意而收集未成年人个人信息的情况,我们只会在受到法律允许、父母或监护人明确同意或者保护未成年人所必要的情况下使用或公开披露此信息。 我们**不会故意**收集14岁以下儿童的个人数据。我们鼓励父母和监护人监控其子女的在线行为、安装家长控制工具,并教育儿童未经父母同意不要通过服务提供其个人数据。如果您有理由相信14岁以下儿童在未征得父母同意的情况下向我们提供了个人数据,请立即联系我们。我们将调查此事,并在适当的情况下努力从我们的系统中删除此类个人数据。 # **11. 隐私政策变更** 我们可能会不时更新本隐私政策。我们会在本页面发布新政策来通知您任何变更。我们建议您定期查看本页面以了解本隐私政策的变更。您在本隐私政策任何变更后继续使用服务,即表示您接受修订后的隐私政策。 对于中国境内用户,如我们对本隐私政策作出重大更改,我们还会提供更为显著的通知(包括但不限于弹窗、页面提示、网站通知等)。 # **12. 联系我们** 有关您的数据主体权利的更多信息,或关于我们如何处理您的个人信息、本隐私政策内容有任何问题、意见或建议,请使用以下信息与我们联系。 影眸科技(上海)有限公司 **联系邮箱**:[hello@deemos.com](https://mailto:hello@deemos.com/) 我们会在收到您的意见及建议后,在验证您用户身份后会尽快向您回复。对于中国境内用户,如您对我们的回复不满意,特别是您认为我们的个人信息处理行为损害了您的合法权益,您还可以通过向被告住所地有管辖权的法院提起诉讼来寻求解决方案。 --- # 数美模型服务协议 Source: https://ark.volcengine.com/region:cn-beijing/docs/shumei-model-service-agreement # 服务条款 感谢您选择使用Hitem3D(中国)服务。“Hitem3D(中国)”指由数美万物(北京)网络技术有限公司(以下简称“我们”或“Hitem3D”)合法所有并运营的、标注名称为“Hitem3D”的hitem3d.cn官方网站/网页端及应用程序编程接口(API)等以Hitem3D名义向用户提供服务的应用。 Hitem3D平台是面向设计师及开发者等用户的专业生成式人工智能(AI)内容生成工具服务,依托我们的专有AI 2D/3D生成技术,用户可直接或通过经我们授权的服务节点,将文本、图像等非结构化数据转换为AI驱动的2D/3D内容,包括图像、模型、纹理、动画和交互元素等。 本条款中,“**用户**”或“**您**”指使用Hitem3D服务的个人或法律实体,包括但不限于通过API接口访问我们服务的开发者、企业用户及其授权代表。 **【适用范围】** 《Hitem3D服务使用协议》(以下简称“**本条款**”)是我们与您订立的,就您访问、使用Hitem3D服务(包括通过API等方式接入)相关事宜约定双方权利义务的协议。本条款内容包括我们已经发布、后续可能发布的、不时修改/更新的与Hitem3D服务有关的其他全部相关协议(含补充条款)、公告、说明等(合称“**服务规则**”);所有前述服务规则构成本条款不可分割的组成部分,与本条款正文具有同等法律效力。如果本条款正文与补充条款内容存在不一致的,以补充条款为准。 关于我们如何收集、使用、保护您的个人信息,请查阅《Hitem3D服务隐私政策》(以下简称“**隐私政策**”)以了解相关内容。 **【审慎阅读】** 您在使用本服务(包括点击同意或实际接入、调用本服务API等方式)之前,请仔细阅读本条款。请务必审慎阅读、充分理解各条款的内容,特别是免除或者限制责任的条款、权利许可和信息使用的条款、法律适用和争议解决条款,以及其他以**粗体/粗体下划线**标识的条款。除非您已充分阅读、完全理解并同意接受和遵守本条款所有条款,否则请您不要使用本服务。 **【签约动作】** 当您按照页面提示点击确认、注册、登录或实际使用本服务,或以其他任何明示或默示方式表示接受本条款的,即表示您已充分阅读、理解并接受本条款的全部内容,本条款即在您与我们之间产生法律约束效力。如您代表法人或其他组织使用本服务,您声明并保证您有权代表该法人或组织接受本条款的约束。 **【条款更新】** 我们有权根据国家法律法规变化及维护网络环境、保护用户权益、优化服务内容的需要不时修改、更新本条款,如有任何变更,我们将以服务公示、推送通知或其他合理可行的方式通知您。您有权于变更事项生效日前联系我们反馈意见。如您对已生效的变更事项不同意,您有权停止使用Hitem3D平台服务;如您在变更事项生效后继续使用平台服务,则视为同意已生效的变更事项。 # 1. **服务内容** a. **我们提供的核心服务**。Hitem3D提供基于先进AI模型技术的2D/3D内容生成服务,主要通过API方式向您提供。依托我们的专有AI模型,您可以通过调用Hitem3D API,将文本提示词、图片等非结构化数据输入平台,生成高质量的2D/3D内容,包括图像、模型、材质、纹理、动效及交互元素等。我们作为服务提供方,通过接口接收您的输入数据并返回生成结果。上述服务基于深度神经网络算法,经过大规模自监督学习的预训练以及针对性优化训练等阶段开发而成,具备跨知识领域理解和生成能力,通过对用户输入的文本、图片等信息进行编码和计算推理,输出相应的2D/3D内容。 具体服务内容、接口文档、调用规范及相关限制请以hitem3d.cn官方网站或我们(以及我们授权的)发布的API文档为准。我们提供的服务可能包括免费服务和付费服务,您可以根据需要选择。 b. **通过第三方平台接入**。您可能通过我们合作/授权的第三方平台或渠道访问和使用Hitem3D服务。无论您采取何种方式接入我们的服务,您的调用行为均受本条款约束。当您通过第三方云平台接入时,您除须遵守本条款外,还须遵守该第三方平台的相关服务条款和规范。我们不对第三方平台的服务内容、安全性、稳定性或可用性作出任何保证,亦不对第三方平台的行为或不作为承担任何法律责任。 c. **服务保障与限制**。我们会尽最大努力向您提供优质服务,采取不低于行业实践的必要技术措施,保障底层系统及接口的网络安全和稳定运行,并努力提升和改进 AI 算法技术,以确保服务调用的连贯性和安全性。但鉴于 互联网服务及 AI 技术的特殊性,请您充分理解并同意以下内容: i. 由于技术、法律政策变化以及其他不可预见的因素,我们不能随时或始终预见和防范所有风险。这些风险包括但不限于不可抗力、基础电信网络故障、第三方云平台服务瑕疵、恶意网络攻击等原因,可能导致服务中断、接口响应超时、无法正常调用以及其他数据丢失或业务受阻的风险。我们将采取合理措施,尽力减少这些风险对您及您最终用户的影响,但无法完全避免上述情况的发生,您同意我们在此等范围内免于承担违约及赔偿责任。 ii. Hitem3D 有权视具体商业与技术情况,决定 API 服务及底层模型功能的设置、调用限流策略及其范围,对服务进行新增、升级、修改/变更、中断、中止或终止部分或全部功能,并可能针对新增的 API 接口或模型开展内部或外部测试。我们对接口/服务的调整与限制可能基于以下原因: * 为了整体服务运营及系统安全的需要; * 生成式AI技术、模型和产品的不断迭代发展; * 持续优化模型的生成质量、渲染算法与处理效率; * 根据行业发展更新生产技术和服务流程; * 进行网站、系统架构和服务器的定期检查或施工,更新软硬件; * 在紧急情况之下依照法律的规定,或为保护国家安全、公共利益、您及第三方的数据与人身安全; * 执行行政/司法机关的命令与裁决; * 根据法律法规(尤其是生成式人工智能相关监管政策)的变化进行的调整。 iii. 对于 Hitem3D 接口或底层模型的重大变更,我们将尽最大努力通过官方网站公告或第三方云服务商渠道提前通知您,并尽量确保这些变更不会对您的集成体验产生重大负面影响。但在我们对 API 接口、模型版本进行更新或废弃,可能需要您及时配合修改调用代码、或迁移至最新的 API 版本,否则我们不保证您的应用可以继续正常、稳定地调用 Hitem3D 服务。如您对我们的服务有任何疑问或反馈,欢迎通过本条款列明的客服或技术支持渠道与我们联系;我们将认真听取您的意见,并努力改进服务质量。 # 2. **账户管理** a. **账户注册**。通常情况下,您无需在 Hitem3D 官方直接注册,而是通过您在第三方平台已有的租户账号或新注册的账号来订阅和接入本服务。在此情形下,您账户的创建、登录认证及基础信息管理,均应遵循该第三方云平台的服务规则。我们可能会基于您的云平台租户信息为您自动生成一个 Hitem3D 系统内的唯一映射标识。如我们未来开放直接注册渠道,您可通过提供电子邮件地址并完成验证等方式完成注册。 b. **注册资格**。在您开始获取或使用 Hitem3D 平台 API 服务之前,您理解并确认,在您开始使用本服务之前,您应当具备中华人民共和国法律规定的与您行为相适应的民事行为能力。如您代表企业或其他法人组织使用本服务,则您声明并保证您拥有代表该主体接受本条款约束的完整授权。鉴于本服务面向专业用户提供,我们通常向成年人用户提供本服务;如您是不具备完全民事行为能力的未成年人,您应在法定监护人的陪同、指导并获得其明确同意后使用本服务。 c. **账户信息**。您了解并同意,您有义务保持您(或通过第三方平台同步至我们)的相关信息的真实性、完整性、准确性、有效性并及时更新,不得使用虚假主体身份创建账户或调用接口,且不得违反国家法律法规、公序良俗及我们的管理规范。依照适用法律法规,为使用本服务的部分或全部功能,我们有可能要求您完成实名认证或资质验证,请您配合提供。若您提供的信息不准确、不真实或不合法,我们有权拒绝或停止向您提供相关服务。 d. **账户及密钥安全**。我们向您签发的API密钥(API Key)或其他访问凭证,由您负责妥善保管,并应采取合理的安全措施防止未经授权的访问或泄漏。账户级API密钥仅限您本人或您明确授权的人员在授权范围内使用,不得转让、出售、出借或以任何方式提供给未经授权的第三方,亦不得以分销、转售等方式对外提供。 当您的API密钥遭到未经授权的使用或出现使用异常时,您应立即通知我们,我们将给予最大限度的配合和处理。在您未及时通知的情况下,通过您的API密钥发起的所有请求均将被视为您或您授权的行为,由此产生的全部后果由您自行承担。您理解,我们对您的请求采取行动均需要合理时间,除我们存在法定过错外,我们对在采取行动前已经产生的后果不承担责任。 e. **账户停用与注销**。如您希望停止使用本服务并注销账户,请通过联系我们的客户服务团队,或通过您接入本服务所使用的授权云平台渠道提出申请,并提供必要的身份验证信息。通过第三方云平台接入的用户,相关账户注销事宜亦可依照该平台的规则处理。 **注销完成后,您即解除与我们之间的合同关系,但您仍应对注销前使用本服务期间的行为承担相应责任。我们有权按照法律法规及监管要求,在账户注销后仍保留必要的数据记录。账户注销后,除履行上述法定保留义务外,我们通常不会为您恢复任何账户记录、数据或权限,请您谨慎操作**。 # 3. **用户内容、知识产权及所有权益** a. **用户内容责任主体**。您在此确认,所有通过Hitem3D服务上传、提交、传输或以其他方式提供的文本、图像、视频、音频、数据指令及其他内容(统称“**内容**”),其责任归属于提供该内容的主体。具体而言,您(而非Hitem3D)对您通过本服务提交的所有内容(“**您的内容**”)负全部责任。**通过本服务生成的输出内容不代表Hitem3D的观点、立场或政策;用户通过本服务提交内容的行为本身,并不产生Hitem3D为相关内容承担法律责任的后果**。 b. **输入内容与输出内容的定义及权属**。基于 Hitem3D 通过底层 AI 模型技术提供的内容生成引擎,您可以向本服务传输文本提示词(Prompts)、图片、音视频、传感器输入及其他参数作为输入内容(合称“**输入内容**”);Hitem3D 接收并响应您的输入内容,经过云端计算推理,生成和返回二维图像、三维模型、材质、纹理、动画及交互元素等输出内容(合称“**输出内容**”)。 i. 输入内容的权。Hitem3D 不主张对您的输入内容拥有任何所有权。在您严格遵守本条款的前提下,您(或您的合法授权方)保留在输入内容中已经合法享有的全部知识产权及其他财产权益。 ii. 输出内容的权属。在法律法规允许的最大范围内,且受限于您对本条款的遵守以及您所订阅的付费计划之约定,您通过本服务产生的输出内容的所有权及相关财产权益归属于您或原始权利人。但是,此项权属归于您存在以下先决条件与限制:若输入内容和/或输出内容本身包含了 Hitem3D 预先享有知识产权或其他合法权益的底层素材、专有标识或技术组件,则该等预先存在的权利仍由 Hitem3D 享有,不因被混合或包含在输出内容中而发生权属转移。您对输出内容的使用权限(包括用于内部测试、个人展示或规模化商业用途),须受限于您当前生效的订阅计划详情及调用配额限制。 iii. Hitem3D 对任何输出内容不作任何关于其是否构成《中华人民共和国著作权法》意义上的作品、是否具备可版权性、是否符合其他知识产权保护条件或其是否具有绝对独创性的陈述或保证。基于深度学习 AI 模型和算法的技术客观特性,本服务生成的内容存在固有的随机性,Hitem3D 无法保证输出内容的唯一性。您理解并明确同意,Hitem3D 可能会向您或其他使用相似或不同提示词的用户,输出相同或高度相似的生成结果。您有独立的责任自行审查、评估并判断您的输出内容对于其预期商业用途是否合适且合法,并确保您后续的复制、发行、展示或商业化使用不违反任何适用法律或侵犯任何第三方的合法权利。 c. **您的内容授权**。当您(或您的终端用户通过您的 API 密钥)向本服务提交或触发生成内容时,您声明并保证您对您的内容享有充分的、可转许可的、免费的、永久的、不可撤销的、全球性的非独占性权利(包括著作权、专利权、商标权等各类知识产权),以使 Hitem3D 及其关联方能够基于前述合法授权,对您的内容(全部或部分)采取为提供技术服务所必需的处理行为,包括但不限于接收、存储、复制、修改、格式转换、加密、传输、展示等,此等处理行为适用于已知或未来新出现的技术传输形式与媒介。 d. **推广与营销使用**。为使您通过本服务生成的相关内容得到更好的分享及推广,提高其传播价值及影响力,您授予Hitem3D及其关联方一项完全免费、免版税、永久、不可撤销、全球性、非排他性和完全可再许可的权利(包括任何精神权利),以使我们能够使用、许可、分发、复制、修改、改编、翻译、网络信息传播、公开展示(全部或部分)您的内容,用于向您和其他用户提供Hitem3D服务,使用范围包括Hitem3D官方网站、应用程序及其关联方相关渠道。**但是,未经您的事先书面同意,我们不会将您的输入内容或输出内容用于任何对外宣传、营销或推广活动。如我们希望将您的使用案例、生成内容或相关成果用于展示、推介等商业目的,我们将提前单独与您沟通并取得您的明确书面授权,该等授权的具体范围、方式和期限以双方另行书面确认为准**。 e. **平台服务的特定授权目的**。为保障底层 API 接口的稳定响应并持续迭代优化 Hitem3D 的技术底座,您在此明确授予 Hitem3D 一项全球性、非独家、免费的、可进行多层分许可的权利,限于以下两项特定目的使用您的输入及输出内容: i. 服务提供与安全保障目的。使用、复制、存储、分发、展示和处理您的输入内容和输出内容,以向您及您的应用提供 Hitem3D 接口响应服务,包括日常运营、服务器维护、技术支持、故障排查、带宽测试及内容安全合规审查(如拦截涉黄、涉暴等违禁词)等必要目的。本项许可在您的输入内容或输出内容从我们系统中被彻底删除,或您的 API 账户终止时随之终止;但为履行法定义务(如《中华人民共和国网络安全法》规定的日志留存)、响应监管机构要求或出于存档核验目的所必需保留的,不在此限。 ii. 算法模型演进与服务改进目的。使用输入内容和输出数据反馈,以训练、微调(Fine-tuning)和改进我们(及我们的关联方或底层技术提供方)的 AI 模型、算法及相关技术,包括用于数据清洗标注、内容分类、内容审核阈值调整和模型强化学习等目的。在商业合理可行且技术支持的情况下,我们将在实际使用前对相关数据进行脱敏、匿名化或聚合处理。**如您代表企业客户与我们另行签订了包含“数据隔离”或“禁止训练”条款的定制化保密或服务协议,则该等协议的效力优先于本款适用。我们郑重承诺,未经您的明确书面授权或同意,绝不会将您未公开的专有内容对外进行直接的商业化售卖或公开披露**。 f. **输出内容版权声明**。您获取并使用本服务及输出内容的权利,以您认可我们对底层AI技术所做贡献为前提条件。**因此,当您公开分享或以商业目的使用任何通过本服务生成的内容时,您同意在相关内容的适当位置以合理方式注明内容系由Hitem3D生成**。前述署名要求受限于您所适用的订阅计划条款,以及您与我们另行签署的商务协议;如订阅计划或另行协议对署名要求另有约定的,以该等约定为准。未能适当遵守本条适用的署名要求构成对本条款许可条件的违反,Hitem3D有权依据本条款采取相应处置措施,并保留要求更正的权利。 g. **AI生成内容标识**。我们在提供服务过程中,将遵守适用的人工智能生成合成内容标识相关法律法规,包括但不限于《人工智能生成合成内容标识办法》《互联网信息服务深度合成管理规定》《网络安全技术——人工智能生成合成内容标识方法》(GB 45438-2025)等,在通过本服务生成的输出内容的合理位置或区域,以相应技术方式对AI生成合成情况进行适当标识。**您在获取输出内容后,不得删除、篡改或隐匿我们依法添加的上述标识,包括肉眼可见的显著标识以及通过技术手段植入生成内容元文件的隐蔽标识。如因您的上述行为引发相关法律责任,由您自行承担**。 h. **用户声明与保证**。作为使用我们服务前提,您在此向 Hitem3D 声明并保证: i. 您对您的内容(包括所有通过 API 传入的非结构化数据)拥有完整的所有权,或已依法取得全部必要的权利、许可、同意和授权,以使 Hitem3D 能够合法、合规地依照本条款接收并处理您的内容,且上述处理行为绝对不会侵犯任何第三方的知识产权及其他合法权益(包括隐私权、肖像权、名誉权、商业秘密等人格与财产权益); ii. 您的内容不存在已转让给他人、已以排他或独占方式许可给他人的冲突情形;在向本服务接口发送您的内容指令之前,您已审慎核实相关内容与他人签订的转让、许可或保密协议中不存在禁止 AI 处理的权利限制; iii. 您(及您的终端用户)对生成输出内容的后续所有使用行为,完全符合所有适用的法律法规,特别是中国大陆地区关于知识产权保护、数据保护、内容合规以及《生成式人工智能服务管理暂行办法》等相关合规监管要求; iv. 您的内容及接口调用行为绝不包含任何计算机病毒、木马、广告软件、间谍软件、蠕虫、DDoS 攻击脚本或其他旨在破坏、干扰、拦截或侵占 Hitem3D 系统底层网络与数据的有害恶意代码; v. 如您的输入内容中不可避免地涉及第三方个人信息(如人脸图像、身份特征文本等),**您声明已依法取得相关个人信息主体的充分知情同意(涉及敏感个人信息的,已严格获得单独同意),或已在前端采取了符合适用数据保护法律要求的匿名化脱敏处理措施;除非已获得其法定监护人的明确授权同意,否则您不得在请求内容中违规传入任何不满十四周岁未成年人的个人信息或可能引发未成年人身心侵害的数据素材;** vi. 您的内容及对输出内容的商业化运作,不违反您与任何第三方之间的有效合同、竞业限制或保密协议。 如 Hitem3D 因您(或您的终端用户)违反上述任一声明和保证而面临第三方侵权指控、索赔、行政罚款或遭受其他声誉及经济损失,您有绝对义务配合 Hitem3D 采取积极行动主动应对,并应全额赔偿因您的违约行为给 Hitem3D 造成的所有实际损失(包括但不限于判决赔偿款、行政罚款、合理的律师费、公证费及调查取证费用)。 * 本条款中所称“**知识产权**”是指任何及所有以下内容: * 专利、专利权及其申请和重新发布、复审、延续、部分延续、分案及其专利期限延长、PCT 国际专利申请; * 发明(无论是否可申请专利)、发现、改进、概念、创新和工业模型; * 已登记和未登记的版权、版权登记申请,以及符合著作权法的作品(包括文字作品、美术作品、摄影作品、图形作品、模型作品、软件、计算机程序、源代码、目标代码和可执行代码、固件、开发工具、API 接口文档及相关资料); * URL、网站、网页及其任何部分; * 技术信息、专有技术、商业秘密、图纸、设计、设计协议、规范、专有数据、客户名单、数据库、专有流程、技术、公式和算法以及其他知识产权; * 商号、商业外观、商标、域名、服务标志、标识、企业名称及其注册和申请; * 上述所象征或代表的商誉。 i. **Hitem3D专有财产**。Hitem3D服务的全部知识产权及其他财产权益归我们所有,包括但不限于服务相关的网页、软件、技术、域名、程序代码、图片、音频、视频、专有AI模型及算法、训练数据集等(“**专有财产**”),均受法律保护。 **未经我们事先书面同意,您不得擅自使用“Hitem3D”“hitem3d.cn”“hitems3d”等与Hitem3D品牌相同或近似的任何商标、标志、标记、商号、域名等,不得以单独或结合其他元素的方式将上述标识用于注册商标、申请企业名称、注册域名,亦不得实施向他人明示或暗示有权展示、使用或其他有权处理上述标识的行为**。您亦不得以任何方式移除、更改或模糊Hitem3D服务中包含的任何版权声明、商标声明或其他所有权通知。因您违反本条约定给我们造成损失的,由您承担全部法律责任。 j. **用户反馈**。您同意,通过本服务的工单系统、开发者社群、客服、反馈邮件、合作/授权第三方云平台或类似渠道向 Hitem3D 提交的任何关于 API 改进的想法、建议、Bug 报告及/或提案(“**反馈内容**”),其风险由您自行承担,Hitem3D 对此类反馈内容不承担任何义务(包括但不限于保密义务),包括但不限于保密义务或对价支付义务。您声明并保证您拥有提交反馈内容所需的全部权利。您特此授予Hitem3D一项完全免费的、永久的、不可撤销的、全球性的、非排他性的、完全可转许可的权利,以任何商业或非商业方式复制、修改、改编、展示、分发、利用所有反馈内容,以服务于Hitem3D的运营、维护及业务发展。 k. **无预先审核义务**。您承认并同意,尽管我们依据相关法律法规及本条款保留对您通过本服务提交的输入内容及生成的输出内容进行预先审核、拒绝处理或删除的权利,但此类预先审核不构成我们的法定义务或承诺,我们不能保证随时发现违法违规内容或及时进行相应处理。您应自行对您提交的全部内容的合法性负责,确保其不侵犯任何第三方合法权益。对于违反法律法规、本条款或可能对我们的服务、系统或声誉造成不良影响的内容,我们有权根据本条款第十章的规定,采取包括但不限于拒绝处理、删除、屏蔽或限制相关调用权限等措施,且对此类处理不承担额外责任。如果我们因您提交的内容而面临第三方主张或监管风险,您有义务积极配合我们采取应对措施并承担因此产生的全部责任。 l. **内容存储与限制**。除非我们以书面形式另行明确约定,我们没有义务永久存储您通过本服务提交的任何输入内容或生成的输出内容。您理解并同意,我们不对以下情形承担责任:输入内容或输出内容的删除、准确性、完整性或可靠性问题;因技术原因导致的内容未能存储、传输或接收;以及与API调用过程相关的通信安全、数据隐私或存储方面的问题,但我们依据隐私政策对您个人信息承担的保护义务除外。**您同意,我们有权自行决定对服务的使用和内容存储设定合理限制,包括但不限于单次请求的数据体量上限、存储空间、处理能力、API调用频次及并发数等限制,我们有权根据运营需要不时调整上述参数并以合理方式通知您。如双方对此另有书面协议约定的,以该等协议为准**。 # 4. **使用行为规范** a. **用户行为准则**。我们致力于提供安全、可信、合规的专业AI内容生成服务。您在使用Hitem3D服务时,应遵守国家法律法规的要求和本条款的约定,遵守自愿、平等、公平及诚实信用原则,尊重他人合法权益,保护数据安全,不得利用本服务从事任何侵犯他人合法权益、谋取不正当利益或扰乱正常市场秩序的行为。如您将本服务集成至您自己的产品或应用程序,您亦应确保您的终端用户遵守本章规定。 b. **传播与 AI 标识规范**。鉴于本服务采用生成式AI技术,如您或您的终端用户对外发布或传播通过Hitem3D生成的输出内容,或其他基于深度学习、生成式人工智能等新技术制作的信息内容时,您负有相应的合规披露义务。您应当主动核查输出内容的真实性、准确性,避免传播虚假信息;**同时,当您将本服务集成至您自身产品或服务并向公众提供时,您应自行确保在内容生成环节及传播环节均满足《人工智能生成合成内容标识办法》《互联网信息服务深度合成管理规定》《网络安全技术——人工智能生成合成内容标识方法》(GB 45438-2025)等法律法规及国家标准的要求**。 c. **禁止非正常使用**。您不得以任何超出正常使用范围的方式获取和使用本服务您应按照规定的配额和限流策略合理使用服务。您不得以任何超出正常范围的频率获取和使用本服务,或通过以下非正常技术手段滥用接口: i. 伪造 API 请求、制造虚假点击或采用恶意脚本试图突破调用频控限制; ii. 通过注册大量虚假账号、借用他人身份信息、使用非正常手段批量获取 API 密钥等方式套取免费额度,或采取任何以规避计费为目的的异常调用行为; iii. 与其他用户串通,共享密钥以规避并发限制。 一经发现上述情形,我们有权立即对您的接口进行熔断、限流、封禁密钥,并保留追讨相关技术资源损失的权利。 d. **禁止输入违法及不良内容**。您在使用本服务时必须以善意且谨慎的态度行事,遵守《互联网信息服务管理办法》《网络信息内容生态治理规定》《生成式人工智能服务管理暂行办法》等法律法规要求,不得利用本服务从事危害国家安全和社会公共利益、扰乱经济秩序和社会秩序、侵犯他人合法权益等法律、行政法规禁止的活动。特别是,您不得向本服务输入、上传,或利用本服务输出(或诱导本服务输出)、复制、发布、传播以下违法违规及不良内容: i. 反对宪法确定的基本原则的; ii. 危害国家安全,泄露国家秘密,颠覆国家政权,破坏国家统一的; iii. 损害国家荣誉和利益的; iv. 歪曲、丑化、亵渎、否定英雄烈士事迹和精神,以侮辱、诽谤或者其他方式侵害英雄烈士的姓名、肖像、名誉、荣誉的; v. 宣扬恐怖主义、极端主义或者煽动实施恐怖活动、极端主义活动的; vi. 宣扬民族仇恨、民族歧视,破坏民族团结的; vii. 破坏国家宗教政策,宣扬邪教和封建迷信的; viii. 编造、散布谣言、虚假信息,扰乱经济秩序和社会秩序、破坏社会稳定的; ix. 散布、传播淫秽、色情、赌博、暴力、凶杀、恐怖或者教唆犯罪的; x. 侮辱或者诽谤他人,侵害他人名誉权、隐私权、肖像权、知识产权或其他合法权益的; xi. 违反互联网广告相关法律法规的商业广告; xii. 侵犯其他用户或第三方合法权益的; xiii. 带有性暗示、性挑逗等易使人产生性联想的; xiv. 展现血腥、惊悚、残忍等致人身心不适的; xv. 煽动人群歧视、地域歧视等的; xvi. 宣扬低俗、庸俗、媚俗内容的; xvii. 可能引发未成年人模仿不安全行为和违反社会公德行为、诱导未成年人不良嗜好等的; xviii. 散布污言秽语,损害社会公序良俗的; xix. 生成或传播具有欺骗性、误导性或操控性的内容,包括出于恶意目的制造“深度伪造”内容,或未明确披露AI生成性质而意图欺骗受众的; xx. 将本服务用于任何高风险活动,包括但不限于核设施运营、空中交通管制、自动驾驶控制、生命支持系统,或武器系统的开发、设计或部署,除非事先获得我们的书面明确授权且您已部署并维护了适当的安全保障措施; xxi. 在未经相关领域有资质的专业人士审查和批准,且未明确披露内容系AI生成的前提下,提供或声称提供法律、金融、医疗或其他受监管的专业意见; xxii. 含有违反法律法规、公共政策、公序良俗,或可能干扰我们正常运营的其他内容。 您通过API接入我们的服务时,应采取合理有效过滤措施,确保您的终端用户不利用本服务接口输入、诱导生成、复制、发布或传播上述违法违规及不良内容。 e. **禁止干扰性及不当技术措施**。为保障我们及公众的合法利益,严禁任何用户或第三方使用或试图使用任何技术手段或其他方式,对Hitem3D服务及支持本服务正常运行的系统、网络、模型及其他组件进行干扰、破坏或攻击。具体禁止从事以下行为: i. 对Hitem3D服务进行反向工程、反向汇编、反向编译,或以其他方式尝试获取我们服务的源代码、AI模型权重、算法逻辑或底层组件; ii. 通过任何自动化工具、脚本、爬虫、机器人或其他非人工手动方式,对我们的API接口进行超出授权范围的批量调用、数据抓取或系统扫描; iii. 利用或针对Hitem3D服务进行任何危害我们或任何第三方计算机网络安全的行为,包括但不限于:非法侵入网络、干扰网络正常功能、窃取网络数据、发起DDoS攻击、暴力破解API密钥、实施注入攻击;伪造TCP/IP数据包;故意传播恶意程序或病毒;以导致我们系统或设施承受不合理负载的方式干扰服务运营等; iv. 通过非我们开发、授权或许可的第三方软件、插件、外挂,访问或使用Hitem3D服务,或对我们服务的正常运行进行干扰、破坏或修改; v. 删除、修改、遮掩或以其他任何方式替换本服务中包含的任何商业名称、商标、服务标记、域名或其他所有权标识,删除本服务中包含的任何版权声明或所有权通知; vi. 在未获得明确书面许可的情况下,使用任何包含我们名称或商标的元标记或其他“隐藏文本”; vii. 以任何方式干扰、篡改或伪造与本服务相关的调用数据、计费数据或系统日志。 f. **禁止其他不当目的使用**。未经我们另行书面许可,您(及您的终端用户)绝对不得将 Hitem3D 的 API 接口及生成结果用于以下不当商业目的或高风险场景: i. 使用本服务生成的输出内容,或通过对我们API接口的系统性调用,直接或间接开发、训练、基准测试或改进与Hitem3D存在竞争关系的AI模型、算法或软件,或以实质性复制我们服务能力为目的的任何技术开发活动; ii. 将本服务用于任何高风险的物理或环境活动,即若 AI 生成出现故障或不准确可能导致死亡、人身伤害、严重财产或环境损害的场景(包括但不限于核设施运营、航空/空中交通管制、自动驾驶系统控制、医疗生命维持系统或武器系统的设计与部署); iii. 将我们服务及专有财产的全部或部分进行复制、转让、出租、出借、出售,或为第三方提供分许可、转许可,包括但不限于未经授权的API密钥转售或共享; iv. 利用本服务或从本服务获取的内容,用于宣传自身产品、为自身产品增加用户、混淆自身产品与Hitem3D的关系等不正当竞争目的; v. 生成用于政治竞选、游说、选举活动的内容,或出于恶意目的创建和传播具有高度欺骗性、误导性的“深度伪造(Deepfakes)”及虚假信息; vi. 将本服务用于促进或开展非法赌博、发薪日贷款、高利贷、多层次传销计划或其他掠夺性金融活动; vii. 在未取得相关主体知情同意的情况下,利用本服务收集、处理、披露或生成第三方个人信息、生物特征信息,或用于对个人进行未经授权的监控或追踪; viii. 将本服务用于任何不合法的方式或目的,或其他违反商业道德或与我们制定的服务规范不一致的方式。 g. **反洗钱合规**。任何用户不得利用 Hitem3D 平台及 API 计费系统进行任何形式的洗钱或恐怖融资活动。在可行的情况下,我们将依法监控异常交易行为,并有权对存在异常资金流转的账户进行调查,并依法配合主管机关提交用户的身份资料与交易流水记录。 h. **反商业贿赂**。您不得向 Hitem3D 的员工、管理层、顾问或合作云厂商提供实物、现金、礼品卡、劳务、旅游等价值明显超出正常商务往来范畴的不正当利益,以换取 API 额度提升、违规解封或商务折扣。此类行为均被视为商业贿赂,Hitem3D 有权立即单方终止与您的所有合作、封禁账号,并追究相关法律与经济责任。 # 5. **终端用户管理** a. 如果您将 Hitem3D 服务集成、内嵌至您自己的产品、网站、应用程序或业务系统供您的终端用户(“**终端用户**”)使用,则您的终端用户通过您的产品或应用程序产生的输入内容及输出内容(统称“**终端用户内容**”),均由您负全部连带责任。为此,以下终端用户管理条款对您具有绝对约束力: i. 您有义务通过具有法律效力的服务条款或最终用户协议,要求您的终端用户对其输入内容的合法性与准确性负责,并确保终端用户合法、合规地使用本服务。若因终端用户内容违反适用法律或侵犯第三方权益而导致Hitem3D遭受任何索赔、调查或损失,您须承担全部赔偿及法律责任。 ii. 您声明并保证,您已在您的产品前端对终端用户进行了充分且必要的合规披露,并依法取得全部必要的权利、明确同意和数据处理许可,以允许 Hitem3D 能够合法地根据本条款接收、处理并响应终端用户的输入内容。您须确保上述数据流转与处理行为绝对不会违反任何适用法律(尤其是个人信息保护及数据安全相关法规)或侵犯第三方权利。 iii. 您须确保在您与终端用户的服务协议中,或以向其作出的显著提示的方式,明确告知以下事项:本服务输出内容由AI生成,受限于当前 AI 技术的客观局限性,生成结果可能存在不准确、不完整、产生偏差或其他瑕疵;终端用户在依赖、使用或对外发布该等内容前,应独立评估输出内容的准确性和适用性,并在适当及必要的情况下,通过人工审核机制加以验证;Hitem3D不控制终端用户内容,对终端用户使用服务的行为不承担监控义务,对输出内容的准确性、合法性不作保证。 iv. 您须采取合理措施确保您的终端用户不利用本服务从事本条款第三章、第四章所列明的任何违法违规、侵权、高风险场景或其他不当目的之禁止行为。 b. 如您与我们另行签订了包含特殊数据处理规则或终端用户责任分担的单独商务协议,该协议条款应在其约定范围内优先于本条款适用。 c. 您与终端用户之间因您的产品或服务产生的任何纠纷、投诉、索赔或法律争议,均由您自行处理并承担全部责任,与我们无关。如因此导致我们遭受任何损失、被提出索赔或被要求承担责任,您须向我们全额赔偿。 # 6. **费用与支付** a. **一般支付条款**。您同意按照您使用本服务时有效的费用标准及计费条款,支付使用Hitem3D服务产生的全部费用。**如您通过第三方云平台渠道订阅和使用本服务,相关费用的支付、结算及开票事宜将依照您与该第三方平台之间的协议处理,我们不直接向您收取费用;但您的使用行为仍受本条款约束,适用费率及用量规则以相关渠道公示内容为准**。如您直接通过与Hitem3D官方渠道订阅或合作以获取相关服务,支付服务由双方另行协议约定。 b. **火山引擎客户条款**。您通过火山引擎方舟大模型服务平台(“MaaS平台”)购买的我方服务,您知悉并接受由我们授权的北京火山引擎科技有限公司(“火山引擎”)代为向您收取服务费用,实际收款主体和服务提供主体为数美万物。我们将就您订购的服务费金额全额向您开具发票。您通过火山引擎申请发票后,我们将在7天内完成发票开具并通过邮件或其他方式发送给您。 c. **服务层级与用量**。Hitem3D可能提供不同的服务层级,包括免费/试用访问、按量计费和订阅计划,具体服务层级及定价以平台网站或购买时展示的信息为准。不同服务层级可能在API调用频率、并发任务数、优先队列访问等方面存在差异。 c. **订阅计划**。我们可能提供本服务相关的订阅计划,具体细节、权益和价格将在平台网站或订阅时向您提供。 i. 计费周期:订阅计划费用将在订阅期开始时收取,对于自动续订的订阅,将在每次续订日期收取。 ii. 自动续订: 您的订阅将持续自动续订,除非您在当前订阅期结束前取消。每次续订期限与初始订阅期限相同,费用按Hitem3D届时的现行非促销价格收取。如需取消自动续订,通常可通过账户设置页面或联系客服完成,并须在当前期限届满前完成取消操作。 iii. 升降级:如您可以升级或降级订阅计划,相关变更的计费及调整条款将在变更时提供。 iv. 续订失败: 如续订时我们无法通过您的支付方式收款,您须在收到通知后立即支付所有应付款项;否则,我们可能暂停或终止您的订阅,并持续尝试扣款直至成功。成功收款后,您的账户将恢复正常。 d. **价格与计费方式变更**。我们有权随时对价格、费用及计费方式进行调整,相关变更将以合理方式提前通知您。对于现有订阅,价格变更通常在下次续订时生效。如您不同意价格变更,须在变更生效前取消订阅。 e. **退款政策**。除适用法律另有强制规定或本条款另有明确说明外,所有已支付的费用一般不予退款,包括订阅计划费用及已消耗的服务用量。鉴于AI服务涉及的算力成本,服务一经使用或用量一经消耗,通常不提供退款。如您对服务有任何不满,欢迎与我们联系,我们将尽商业合理努力与您共同探讨可接受的解决方案,但上述过程不构成自动退款的权利。 f. **超量使用**。我们有权监控服务的实际使用情况。如我们判断您的调用行为属于异常、滥用或相较于正常使用模式存在过度使用的情形(包括但不限于通过技术手段绕过限流控制、批量异常调用等),我们可能采取相应措施,包括但不限于调整计费标准、施加调用限制,或在情节严重时暂停或终止您的访问权限。在可行的情况下,我们将提前以合理方式通知您。 g. **税费**。双方应按照国家法律法规的规定各自履行相应的税务义务。如我们依法对向您支付或结算的款项负有代扣代缴义务,我们将依法执行,相关税款将从应付金额中扣除或另行结算。您同意向我们支付的全部服务费用不得以任何应付税款为由进行抵扣或减免。 h. **定制化服务**。如您需要标准服务范围之外的定制化服务,包括但不限于API接口类型或响应格式的定制开发、专属服务等级协议(SLA)、补充数据保护协议等,您可向我们提交需求。如我们同意提供该等定制化服务,相关内容及额外费用将通过另行签订的工作说明书或商务协议加以确定。相关咨询请联系:market@mathmagical.com。 # 7. **第三方服务** a. 本服务可能通过第三方云计算平台或技术分发渠道向您提供,您可能是在第三方平台的环境中订阅、部署和使用本服务。在此情形下,您与该第三方平台之间的关系(包括账户注册、费用结算、技术支持、数据处理等事项)受您与该平台之间另行签订的服务协议及交易规则约束关。**我们与该第三方平台为独立的缔约主体,不对第三方平台的服务内容、计费准确性、系统可用性、网络安全性或其任何行为/不作为承担任何担保或连带责任。因第三方平台单方原因引发的任何争议,均与 Hitem3D 无关**。 b. 您在使用本服务过程中可能需要同时遵守第三方平台自身的服务条款、使用规范及隐私政策。请您在使用前仔细阅读相关文件,充分了解其服务内容及可能存在的风险。我们对第三方平台提供的服务不作任何形式的保证或担保。 c. Hitem3D 网站及服务本身亦可能包含、接入或链接由其他第三方提供的网站、软件、插件或服务内容。此类接入仅为方便开发者参考或调用之目的,我们无法对该等第三方服务的内容、隐私实践及安全性进行控制。您在访问或使用此类第三方链接及服务时,需自行承担风险并受该等第三方独立服务条款的约束,Hitem3D 对此不提供任何明示或暗示的背书,亦不承担任何直接或间接的赔偿责任。 d. 如您因使用第三方服务而遭受任何损失,或因未遵守第三方相关要求而引发任何纠纷、处罚或法律责任,应由您自行与该第三方依据相关协议处理解决,我们不承担任何责任。如该等情形导致第三方或国家机关要求我们协助提供相关信息,我们将在法律允许的范围内依法处理,由此产生的一切法律责任及后果由您自行 # 8. **关于侵权的投诉与举报** a. **侵权投诉路径与原则**。开发者或其最终用户通过 Hitem3D API 接口生成、流转或公开展示的内容,仅代表其自身行为与立场,绝不代表 Hitem3D 平台的任何立场或观点。由于我们仅作为底层技术提供方,无法直接且主动地监控所有终端用户在第三方应用中的行为,如果个人或企业发现通过我们底层服务生成或流转的内容侵犯了自身合法权益(包括商标权、著作权等知识产权及其他人身财产权益),我们强烈建议您首先尝试直接与该应用的开发者或运营方取得联系,通过沟通协商解决源头问题。 如您无法联系到涉事开发者或协商无果,您可通过发送电子邮件至 我们的投诉邮箱【contact@hitem3d.ai】向我们提出请求。为了保证问题能够及时有效地进入法定处理程序,请务必提交真实有效、完整清晰的证明材料,否则投诉将无法受理。 b. **投诉材料的法定要求**。根据《信息网络传播权保护条例》等相关法律法规及客服要求提示,您向我们提供的书面投诉通知必须包含以下完备材料: i. 权利人对涉嫌侵权内容拥有商标权、著作权和/或其他依法可以行使权利的情况说明和(初步的)权属证明信息; ii. 投诉人的实体或有效电子签名、身份证明、联系地址及有效电话/邮箱;如果投诉人非权利人本人,请提供代表权利人进行投诉的合法书面授权证明; iii. 涉嫌侵权内容在信息网络上的精确定位(如涉嫌侵权的第三方应用名称、涉及场景、具体的 URL 链接或生成物标识),以便我们能够在底层系统准确锁定该材料或涉事账号; iv. 构成侵权的初步证据材料; v. 法律声明与承诺:为确保投诉材料的真实性,您必须在侵权举报中作出如下声明:“本人/本公司为所投诉内容的合法权利人,该等内容的使用未经本人/本公司或法律授权”;并承诺:“如果侵权投诉内容不完全属实,本人/本公司将承担由此产生的一切法律责任,并全额赔偿 Hitem3D 因依据本投诉对相关主体采取限制、封禁等处理措施而造成的任何损失(包括但不限于向被投诉方承担的赔偿及平台名誉、商誉损害)”。 c. **受理与处理时效**。出于网络服务提供商的法定核查义务,并非所有投诉申请都能立即触发拦截或封禁。我们收到合规举报后,有权根据投诉材料独立评估并决定处理方式(包括但不限于限制涉事开发者的调用权限、阻断相关生成内容的传输等),并将结果通知被投诉的主体。处理期间,我们不提供任何电话、邮件及其他方式的进度实时查询服务。如因特殊原因(包括但不限于网络因素、设备原因、系统核查复杂性或投诉量短期激增等)造成处理能力过载,我们的处理与反馈时效可能会有所延迟,敬请谅解。 d. **第三方缓存免责**。如 Hitem3D 已在底层系统阻断或处理了相关涉案内容/账号,但是其他互联网第三方搜索引擎(如百度、必应、搜狗、谷歌等)或第三方云平台服务的缓存中依然可以搜索到该内容,此系该等第三方平台的缓存机制所致。对此类超出我们技术控制范围的问题,我们无权也无法处理,相关诉求不予受理,您需要自行联系该搜索引擎或云服务商进行处理。 e. **严肃性与人工审核**。权利人及其代理人知悉并了解,侵权投诉是一项严肃的法律行为。平台将根据法律法规、投诉内容和证据进行严谨的评估审核,尽力保障每一位权利人的合法权益。但侵权投诉的评估审核结果与投诉的次数无直接关联,多次、多人重复或批量化发送投诉并不能改变法定事实,亦无法提升侵权投诉的通过率。 f. **禁止自动化与干扰性投诉**。为了更好地维护权利人的合法权益及正常侵权投诉秩序,保障底层系统安全运作,权利人及其代理人绝对不得采取可能会严重影响其他开发者合法权益、阻碍系统正常运作的方式进行恶意投诉。这包括但不限于:使用外挂、插件、第三方软件、自动化脚本程序等批量发送投诉邮件。一经发现,上述投诉将被直接视为无效投诉,同时我们不排除采取记入非正常投诉黑名单、直接拒绝受理、甚至依法追究干扰系统正常运行之法律责任的特殊处理措施。 g. **滥用投诉机制的防范与处置**。为确保各权利人的合法权益得以公平保障,使得正常投诉能被有效处理,如我们有合理理由相信投诉行为存在以下任一滥用情形,我们将有权根据实际情况调整处理方式(包括但不限于限制投诉频次、记入非正常投诉名单、降级投诉单处理顺序,由此可能导致审核时效延长或直接不予通过): i. 明知、应知不构成侵权,或明显缺乏权利基础和事实依据而进行恶意投诉; ii. 我们已明确告知欠缺处理依据,仍不断重复投诉且无任何实质性证据补充; iii. 多次或大量提交侵权投诉,但整体事实认定通过率极低,涉嫌滥用“通知-删除”机制打击商业竞争对手; iv. 非合理且正当理由,对平台正常处理其他权利人侵权投诉造成严重资源挤占与不利影响的情形; v. 其他平台有合理理由认定为不合理、滥用投诉的情形。 h. **反通知(申诉)机制**。如果您作为开发者,认为您的 API 接口内容或账号是因被错误投诉或举报而遭到平台限制或封禁的,您可以按照我们通知中提供的方式和法定要求提交反通知(申诉”。我们有权根据您的申诉材料及具体情形独立决定是否支持您的申诉并恢复访问权限,并将结果通知您。 i. **争议独立解决原则**。开发者、终端用户与任何第三方之间引发的版权争议、法律纠纷,应由各方自行协商或通过法定诉讼途径解决。Hitem3D 仅依法履行作为底层网络服务提供者的“通知-删除”技术配合义务,不实质性介入或仲裁任何第三方之间的法律纠纷。 # 9. **责任限制与免责声明** a. **“现状”与“现有技术”提供声明**。您明确理解并同意,在适用法律允许的最大范围内,您(及您的终端用户)使用Hitem3D服务完全自担风险。本服务按照现有技术和条件所能达到的“现状”及“当前功能”提供。尽管我们已尽最大商业努力,但由于本服务所依赖的底层算力及人工智能技术本身存在的客观瓶颈,我们明确放弃任何形式的明示或暗示保证,包括但不限于适销性、特定用途适用性及不侵权的默示保证。我们不能对以下事项向您作出任何明示或暗示的保证: i. 不保证API接口及底层模型能够完全满足您的所有业务需求,以及服务的绝对可适用性、无疏漏、持续性、准确性或可靠性; ii. 不保证服务在操作和接口调用上绝对不会中断、没有延迟、没有错误、不受干扰,或不存在任何网络及并发故障; iii. 不保证在现有技术水平下有能力纠正系统或底层算法的所有缺陷与错误; iv. 不保证您将本服务集成至您的应用后,在实际运营过程中不面临任何商业或法律风险; v. 不保证服务生成过程中涉及或引用的任何第三方内容的有效性、真实性、合法性与安全性。 b. **生成式AI技术特别免责与合规提示**。生成式及深度合成式AI技术可以为行业带来巨大的创新价值,但由于现阶段科学技术的局限性及伦理复杂性,我们也高度关注模型被不当使用的可能以及不可避免的幻觉问题。您充分理解并同意以下内容。 i. 您(及您的终端用户)应科学理性地认识和依法使用生成式及深度合成式AI技术,严格遵守《中华人民共和国数据安全法》《中华人民共和国个人信息保护法》《中华人民共和国网络安全法》《生成式人工智能服务管理暂行办法》《互联网信息服务深度合成管理规定》等国家法律法规的要求。您须独立承担因您自身或您的终端用户违法违规调用接口而导致的全部法律责任。 ii. 由于现阶段科学技术的局限性,本服务无法完全避免生成不准确、不可靠、不适宜或可能引发争议的内容。我们不保证服务生成内容的合法性、真实性、完整性、准确性、及时性及实用性;不排除因提示词的特殊结构或对抗性诱导,可能输出与Hitem3D运营主体立场不一致的内容;亦不保证输入和输出内容经过自动化过滤审查后绝对不存在违规瑕疵或虚假信息。 iii. 非专业建议声明。本服务API输出的任何内容仅供参考,不构成任何专业意见。**您须明确告知您的终端用户,应结合自身需求对输出内容进行客观、审慎的独立评估,不得将AI生成内容作为医疗诊断、法律意见、财务决策、工程安全或其他高风险决策领域的唯一依据,上述场景下应由相关领域有资质的专业人士对输出内容进行充分审查和验证后方可使用。若因依赖或使用本服务内容造成任何直接或间接损失,须由您及您的终端用户自行承担全部责任。 c. **网络环境与第三方介入风险**。互联网及公有云环境具有开放性与特殊性,您通过API传输的请求数据及生成结果,在底层网络路由流转过程中,存在被他人非法监听、截取、复制、篡改或用于其他非法用途的潜在技术风险。您在此已充分意识到此类技术风险的客观存在,并确认此等风险应完全由您自行防范与承担。对于非因我们平台自身网络安全漏洞所导致的损失,我们不承担任何责任。 d. **不可抗力与技术故障免责**。我们依照法律规定履行基础的网络安全保障义务,但对于下述任一原因导致的API响应超时、服务履行障碍、履行瑕疵、履行延后,或服务暂停、中止、终止、数据泄露及由此给您造成的任何损失,我们在法律法规允许范围内免于承担责任: i. 因疫情、台风、地震、海啸、洪水、火灾、风暴、爆炸、战争、恐怖袭击、暴乱、政府行为、国内外司法行政命令等不能预见、不能避免并不能克服的不可抗力因素; ii. 因电力供应故障、基础电信网络故障、第三方公有云宕机等公共服务因素,或突发性软硬件设备及电子通信设备故障、黑客攻击、恶意程序或勒索病毒攻击、互联网覆盖范围限制、网络运营商技术调整等第三方因素; iii. 在我们已尽善意管理的情况下,因常规或紧急的服务器、设备与系统维护、检修、算法升级或保养,我们将尽最大努力事先通知您; iv. 因您或您的终端用户自身代码编写错误、API密钥泄露、操作不当,或未严格遵守API调用频控规范等导致的直接后果。 e. **间接损害排除**。在适用法律允许的最大范围内,**任何情况下,Hitem3D及其关联公司、董事、高级职员、雇员、代理或服务提供商,均不对任何间接性、后果性、惩罚性、偶然性、特殊性或刑罚性的损害承担任何赔偿责任**。该等被排除的损害包括但不限于:您因使用或无法使用本服务而遭受的利润损失、预期收益损失、商誉损失、业务中断损失、替代服务采购成本或数据丢失。无论此类主张是基于违反合同、保证、侵权(包括过失)、严格责任还是其他法律理论,也无论我们是否已被提前告知发生此类损害的可能性,上述排除均适用。 f. **赔偿责任上限**。除适用法律另有强制性规定外,无论因何原因或何种行为方式,我们对您承担的全部累计赔偿责任,始终不超过在引发索赔的具体行为或事件发生前十二(12)个月内,您因使用本条款项下服务而实际支付给我们的服务费用总额。 g. **责任限制的法定例外**。本章任何内容均不排除或限制以下情形下的责任:(1)因我们的严重过失或故意不当行为导致的人身伤亡;(2)依据适用法律规定绝对不能通过合同排除或限制的任何其他法定责任。我们将在能力范围内尽最大努力按照相关法律法规对相关事项作出判断和处理,但不保证我们的判断完全与司法机关、行政机关的最终裁定一致;如因此产生的后果,您已理解并同意自行承担。 h. **跨司法辖区合规免责**。除非我们另行明确书面承诺,我们不保证本服务在中国大陆(仅为本条款之目的,不包括香港特别行政区、澳门特别行政区及中国台湾地区)以外的司法辖区内均合法、适当或可用。如果您在上述范围以外访问或调用本服务(包括将其集成至面向境外用户的应用中),您确认该等行为系您的主动意愿;您须自行确保您的数据出境及AI生成行为符合当地所有适用法律的强制性要求,并自行承担因跨境合规产生的全部风险与责任。 # 10. **违规处置、赔偿与法律责任** a. **用户行为限制及处置**。您应遵守本条款的所有规定,合法、合规地使用Hitem3D服务。如我们发现您存在下述情况(合称“违规行为”),我们有权依据自己的独立、合理判断,不经事先通知,采取警示、限制API调用权限、拒绝处理相关请求、删除或屏蔽相关内容、暂停或终止服务访问、封禁账号、禁止重新注册等处置措施,且我们将保存有关记录,在合理范围内公告您的违规行为及处理结果,并将您的相关情况向有关主管部门报告: i. 违反本条款或服务规则的约定; ii. 利用本服务从事违反法律法规乃至犯罪的行为(经国家生效法律文书或行政处罚决定确认,或者我们有足够事实依据可以认定您存在该等行为的),包括但不限于输入或诱导生成违法、虚假或其他不当内容; iii. 未经授权使用服务资源或功能,或实施可能危害服务安全、扰乱正常运营秩序的行为,包括但不限于绕过API调用频控限制、非法转售账号或API密钥等; iv. 侵犯我们、其他用户或任何第三方的合法权益,包括但不限于知识产权、个人信息、隐私权、名誉权等; v. 其他可能对我们、用户或公众利益造成损害,或使我们面临法律责任的情形。 若您对上述处理措施有异议,可通过本条款列明的联系方式提交复核申请。我们将在合理期限内对您的申诉进行审查,并根据审查结果决定是否调整处理措施。 b. **信息披露**。Hitem3D有权向任何声称其权利(包括知识产权、个人信息、隐私权、名誉权等)受到侵犯的第三方,披露相关用户的身份信息及相关资料。此外,我们可向以下主体披露用户相关信息或资料,以履行法律义务或保护合法权益: i. 符合法律、法律程序或政府部门监管要求的主体; ii. 维护本条款执行的相关主体; iii. 响应第三方关于用户内容侵犯其权利的主张; iv. 处理用户提交的客户服务请求; v. 保障我们的服务、用户、公众及政府部门的权利、财产或人身安全。 c. **赔偿**。因您的违规行为导致我们(为本条之目的,包括我们的关联公司及其各自的董事、高级职员、雇员、代理、服务提供商和许可方,下同)遭受任何形式的损失,包括但不限于直接经济损失、商誉损失、合理的赔偿金、罚金、诉讼仲裁费用、律师费、调查取证费等,您应足额赔偿我们因此遭受的全部损失。 更广泛地,**您同意对我们因以下原因遭受的任何损失、费用和开支(包括合理的律师费)进行赔偿并使我们免受损害:(1)您的内容(包括输入内容及终端用户内容);(2)您使用或无法使用本服务;(3)您违反本条款;(4)您违反任何第三方的知识产权或其他合法权益;(5)您违反任何适用的法律、规则或法规**。 **如因您的违规行为导致第三方向我们提出索赔、投诉、调查、诉讼或其他争议,您同意为我们进行辩护,并在法律允许范围内自行处理并承担全部法律责任;如我们因此向第三方赔偿或遭受处罚,您应向我们全额赔偿所有损失及相关费用**。我们将及时通知您任何此类第三方争议,并向您提供合理协助,相关费用由您承担;但未提供此类通知不免除您在本条款项下的任何赔偿义务。 d. **法律行动与合作**。对于任何非法或未经授权使用本服务的行为,我们将采取适当的法律行动,包括但不限于将相关情况移交执法部门处理。若我们获悉您可能存在违反本条款的行为,我们保留对相关违规行为进行调查的权利。一旦调查结果显示存在犯罪活动,我们保有将此类情况提交给任何及所有适用法律机构并与之合作的权利。您理解并同意,我们在上述过程中有权依法向相关机构提供必要的用户信息。 e. **责任延续**。您理解并同意,即使您的账户被暂停或终止,或您与我们之间的条款关系终止,您仍需对您在使用本服务期间的行为承担相应的法律责任。本章关于赔偿责任的约定不因本条款终止而失效。 f. **不弃权**。我们对于您的过失或违约行为如果暂未行使本条款项下享有的权利,不得视为我们对您的其他或以后同类过失或违约行为的弃权。任何弃权须以书面形式明确作出方为有效。 # 11. **协议终止与服务退出机制** a. **用户终止**。您有权在满足特定业务与财务结清条件的前提下,通过以下任一方式随时终止本条款及您的 API 访问权限: v. 如您系通过我们授权的第三方平台订阅本服务,您可通过根据第三方平台规则注销平台账户、退订以停止使用本服务; vi. 如您系与 Hitem3D 直接进行合作,您可联系官方客服或双方另行约定的方式,在结清所有应付账单后正式注销您的账户或终止合作; vii. 您明示不愿继续使用本服务,并符合服务规则规定的终止条件; viii. 在本条款的重大变更事项生效前,您明示不愿接受该等变更并全面停止使用本服务。 b. **平台终止**。如出现以下任一严重情形,我们(或我们授权的第三方云平台)有权在不作提前通知的情况下,立即单方终止本条款、注销您的账号(如适用)并永久停止向您提供服务: i. 您(或您的终端用户)严重违反本条款的任一约定,特别是从事了第三章、第四章所列的违法侵权、绕过限流机制、逆向工程或开发竞品等严禁行为,且经合理通知后逾期未纠正; ii. 您的账户余额不足、处于欠费停机状态,或您绑定的付款方式因任何原因导致持续扣款失败且拒不补缴的; iii. 根据法律法规、主管行政机关或司法机关的要求、命令或协查通报,我们必须依法终止对您的网络服务接入的; iv. 您在提供了虚假、伪造或冒用的注册信息的; v. 因不可抗力、底层核心技术供应商断供或 Hitem3D 整体业务战略发生重大调整,导致平台客观上无法继续维持该 API 节点运营的(此情形下我们将提前三十日以合理方式发出通知); vi. 其他Hitem3D认为需要终止服务的合理情形。 c. **终止的效力**。协议终止后,您使用平台服务的权限将立即终止,您不得再以任何形式使用平台服务。本条款中根据其性质应具有持续效力的条款(包括但不限于与知识产权、授权、责任限制、赔偿责任等相关的条款)在协议终止后仍然有效。 d. **数据留存**。协议终止后,除适用法律法规(如《网络安全法》对网络运行日志不少于六个月的留存要求)或配合司法行政调查有明确规定外,我们无义务向您或您指定的第三方导出或披露您账户中的任何历史输入及输出数据;我们有权在合理期限内从生产数据库中永久销毁您的相关业务数据。 e. **恶意规避与重新注册限制**。如果您是因违反本条款、滥用接口或从事违法违规行为而被 Hitem3D强制终止访问与封禁的,您明确同意并承诺,绝对不得通过更换企业主体名称、使用他人的法定代表人身份信息、切换/伪装不同的账号、或通过代理人等任何隐蔽方式,尝试重新注册或绕过封禁访问 Hitem3D 平台。一经发现此类恶意规避行为,我们有权立即直接封锁相关新账号、没收所有预充值余额,并保留向您追究刑事及民事责任的权利。 # 12. **适用法律与争议解决** a. 适用法律。本条款的成立、生效、履行、解释及争议解决均适用中华人民共和国法律(不包括其冲突法规则;仅为本条款之目的,不包括香港特别行政区、澳门特别行政区法律法规及中国台湾地区有关规定)。倘若本条款之任何约定因与相关法律法规抵触而无效,则该等条款应在不违反法律的前提下按照尽可能接近本条款原条文目的之原则进行重新解释和适用,且本条款其他规定仍应具有完整的效力及效果。 b. 争议解决。本条款的签署地点为中华人民共和国北京市海淀区,若您与我们发生任何争议,双方应尽量友好协商解决,协商不成,您同意将争议提交至【北京市海淀区】有管辖权的人民法院诉讼解决。 # 13. **其他条款** a. **标题说明**。本条款所有章节标题仅为阅读和理解方便而设,本身并无实际法律含义,不能作为解释本条款内容的依据。 b. **独立主体**。您和我们均是独立的主体。在任何情况下,本条款不构成我们对您的任何形式的明示或暗示担保或条件,双方之间亦不构成代理、合伙、合营或雇佣关系。 c. **可分割性**。本条款的任何条款无论因何种原因部分无效或不可执行,其余条款仍然有效,并对双方具有完整的约束力。如果某条款规定我们在特定情况下享有特定权利,这并不意味着该权利是我们在该等情况下可以行使的唯一权利,也不意味着该条款取消或使涉及相同情况或主旨事项的任何其他条款无效或失效。 d. **书面协议优先**。如您与我们就本服务另行签署了独立的书面商务协议(包括但不限于服务协议、框架合作协议或数据处理协议),该等协议在其明确约定的范围内优先于本条款适用;本条款未被该等协议覆盖的部分,继续有效并对双方具有约束力。 e. **联系我们**。如您对本条款或Hitem3D服务有任何意见、建议、疑问或需要帮助,欢迎随时与我们联系,我们将认真听取并给予必要的回复和协助。 * 联系地址:北京市海淀区丹棱街1号院1号楼12层1203 * 联系邮箱:[legal@mathmagical.com](mailto:legal@mathmagical.com) # **隐私政策** 欢迎使用Hitem3D(中国)服务! Hitem3D (中国)平台产品及底层接口服务(包括 hitem3d.cn 官方网站/网页端及应用程序编程接口 API)由数美万物(北京)网络技术有限公司及其关联方(以下简称“**我们**”或“**Hitem3D**”)共同合法所有并负责运营 。我们深知数据与个人信息对您的重要性,将严格按照法律法规的要求并参照行业安全实践,采取合理的安全措施,尽力保护您(及您的终端用户)的个人信息与隐私安全。 鉴于本服务为面向设计师、开发者及企业用户的专业生成式人工智能(AI)内容生成工具 ,本隐私政策(以下简称“**本隐私政策**”)旨在向您说明,当您(作为 API 调用者或企业开发者)直接访问本网站,或通过经我们授权的第三方云计算平台调用我们的服务时 ,我们如何收集、使用、存储及处理相关个人信息以及对应的处理规则等相关事宜,以便更好地保障您的权益。 在接入或调用 Hitem3D 平台 API 前,请您务必仔细阅读并透彻理解本隐私政策,特别是以**粗体/粗体下划线**标识的条款。如您代表您的企业或终端用户接入本服务,您须确保已充分了解本隐私政策,并已获得所有必要的合法授权。如果您不同意本隐私政策的内容,将导致我们无法正常为您提供底层接口响应服务,您应立即停止接入或调用我们的 API 服务。本隐私政策中涉及的专业词汇,我们尽量以简明通俗的表述向您解释,以便于您理解。**如对本隐私政策内容有任何疑问、意见或建议,您可通过本隐私政策文末的联系方式与我们联系**。 我们可能会不时对本隐私政策进行修订。**当本隐私政策发生变更时,我们会在版本更新后以网站公示、推送通知形式向您展示变更后的内容**。 # 1. **我们如何收集和使用您的个人信息** 在您使用Hitem3D时,我们将根据合法、正当、必要、透明的原则,基于本隐私政策所述的目的,收集和使用您的个人信息。**您同意本隐私政策表示您已了解应用提供的功能,以及功能运行所需的必要个人信息**。如果我们将您的个人信息用于本隐私政策未载明的其他用途,或基于其他特定目的而收集您的个人信息,我们将以合理的方式告知您,并在收集、使用前再次征得您的同意。 ## 1.1 **服务接入与账户信息** Hitem3D目前主要通过授权的第三方云平台渠道向您提供服务,您通常无需直接向我们注册账户,而是通过您在第三方云平台已有的账户订阅并接入本服务。 * 当您在第三方云平台订阅和接入本服务时,您的主体资质、账户创建及实名认证均由该第三方平台负责。为了计费校验及权限下发,我们可能会接收该云平台为您生成的**唯一标识或用户ID**,用于在我们系统内识别您的调用来源、管理您的服务配额及生成账单,但我们通常不会直接收集您的姓名、手机号码、电子邮件地址等个人身份信息。 * 如您与我们另行签署了独立的商务合同,为履行合同及提供定制化服务的需要,我们可能收集您提供的**名称/姓名、授权联系人姓名、职务、联系电话及电子邮件地址、企业营业执照等资质证明材料**,用于合同履行、账户开通、资质核验及发票开具等目的。 如我们未来开放直接注册渠道,届时将单独就注册环节的个人信息收集情况向您告知并取得您的同意。 ## 1.2 **API 服务的调用与内容生成** 我们基于深度神经网络算法向您提供 2D/3D 内容生成核心服务。当您的应用通过 API 接口向我们发起请求时,为了计算推理并向您返回生成结果,我们会实时处理您/您的终端用户提供的以下信息: * **输入内容**:您通过API接口传输的**文本提示词(Prompts)、图片、音视频素材及其他非结构化数据指令**,我们将其用于驱动底层AI模型进行内容生成推理,这是提供服务的核心必要处理。 * **输出内容**:我们的AI模型响应您的输入内容后生**成并返回的二维图像、三维模型、材质、纹理、动画及交互元素等内容**,我们会将其临时缓存以完成接口响应及必要的合规内容审核。 * **调用元数据**:为了校验您的接口权限及统计服务状态,我们会自动收集每次调用的元数据,包括**API密钥标识、调用时间戳、接口版本、调用参数、处理状态、响应时长及错误日志等技术数据**,用于服务计量、账单核算、性能优化及故障排查。 **当您通过API接口调用本服务时,就您的终端用户数据而言,我们通常作为受您委托的数据处理者,依据您的指令对相关数据进行处理;您作为数据控制者,对您的终端用户数据的合法收集、处理及相关合规义务承担独立的主体责任。如您是通过API将本服务集成至您的产品或应用程序供终端用户使用,您的终端用户通过您的应用提交的输入内容及由此产生的输出内容,由您负责管理,包括依法取得终端用户的必要同意、向终端用户履行告知义务,以及响应终端用户的个人信息权利请求;我们在处理该等终端用户数据时,不会将其用于超出本服务提供范围的其他目的**。 **上述输入内容及调用元数据是我们向您提供 AI内容生成服务所必需的基础信息。如果您(或您的终端用户)拒绝提供,或在传输过程中拦截、剥离上述必要信息,我们将无法向您正常提供上述 API 内容生成服务或响应您的调用请求**。 **作为底层服务/技术提供方,我们不主动征集或有意收集输入内容中的敏感个人信息(如人脸特征、种族、宗教信仰、生理健康数据、未满十四周岁未成年人信息等)。您作为开发者,有绝对义务在前端采取技术措施,避免您/您的终端用户在传入的提示词或图片中包含上述敏感信息及未成年人信息。如您不可避免地传入了此类信息,您声明已依法取得全部必要的授权及单独同意**。我们将在本隐私政策及合法授权范围内作为数据处理者依法进行加密处理 。 ## 1.3 **运维安全与技术日志** 为了保障我们的底层基础设施稳定运行、预防恶意网络攻击及排查接口故障,当您访问和使用Hitem3D官方网站或调用 API 时,我们会自动收集以下技术信息,用于保障服务安全稳定运行及产品优化: * **设备及网络信息**:您用于访问的设备类型、操作系统版本、浏览器类型及版本、网络服务提供商、IP地址、发起请求的服务器/设备网络信息等; * **日志数据**:访问日期和时间、访问的页面和功能、停留时长、错误日志等; * **使用数据**:接口响应时间、功能访问频率、偏好设置等使用情况信息。 **这些日志数据通常无法直接识别特定的自然人身份,主要用于宏观的系统可用性监控及防范 DDoS 攻击等恶意接口滥用行为 **。如我们将这类信息与其他可识别信息结合使用,则在结合使用期间,我们将依法按个人信息处理。 ## 1.4 **财务结算与客户服务** • **费用结算相关信息**:如您通过第三方云平台渠道订阅本服务,相关支付及开票事宜由该云平台直接处理,我们通常仅接收该平台提供的**用量结算数据(如调用次数、计费金额等),** 不直接接触您的支付账户信息或银行卡信息。如您与我们直接签约并需要开具增值税发票,我们会收集并使用您提供的**开票所需信息(如纳税人识别号、开票地址、开户银行及账号等)**,仅用于合规开票目的。 **客户支持与意见反馈**:如您通过工单系统、开发者支持渠道、电子邮件或其他方式联系我们,提出技术咨询、意见反馈或投诉,我们会收集您提供的**联系方式(如电子邮件地址)、沟通内容及相关证明材料**,用于了解您的需求并处理您的反馈。我们还会记录必要的沟通记录,以跟踪问题处理进度。如您不提供上述信息,我们可能无法及时回应您的咨询,但不影响您正常调用服务。 **消息通知**。您知悉并同意,我们在运营中可能会通过您提供的**联系方式(如电子邮件地址),向您发送与服务相关的通知**,包括但不限于:服务状态变更、API版本更新或废弃提醒、账单及用量、安全事件通知、条款变更公告等。如您通过第三方云平台接入本服务,上述通知也可能由该云平台代为触达,具体通知渠道以该平台的消息推送机制为准。**对于服务运营类通知(如安全警报、重大服务变更),此类通知属于服务的必要组成部分,我们无法为您提供退订选项;对于非必要的商业推广类通知(如有),您可以通过我们提供的退订方式或直接联系我们进行退订**。 ## 1.5 **算法模型演进与服务合规改进** **为持续改善我们向您提供的各项服务、优化 Hitem3D 的大模型生成质量、增强内容安全拦截机制,相关法律法规允许范围内,在经过安全加密技术处理、严格去标识化且无法重新识别特定个人的前提下,我们可能会将收集的输入内容、输出内容及相关调用数据用于训练、增强和改进AI模型、算法及相关技术(包括用于数据清洗标注、内容分类、内容审核阈值优化和模型迭代训练等目的)**。 如您与我们另行签订了包含“数据隔离”或“禁止训练”条款的定制化协议,则该等协议的约定优先于本款适用。如您拒绝我们按照上述方式处理您的个人信息,可以通过本隐私政策第十章的方式向我们反馈。 ## 1.6 **关于设备权限** Hitem3D通过API接口及网页控制台向您提供服务,我们不会主动向您的终端设备申请系统级权限(如摄像头、麦克风、通讯录、存储等)。您在访问我们的官方网站或控制台时,浏览器可能依照标准网络机制请求您授权通知推送等权限,该等请求由您的浏览器发起,受浏览器自身的权限管理机制约束。 **如您通过第三方云平台渠道接入本服务,该平台在您使用其产品过程中可能向您申请相关设备权限,具体权限申请情况及目的请参阅该第三方平台的隐私政策及权限说明**。如您是将本服务集成至您自身产品供终端用户使用,您的应用程序可能需要向您的终端用户申请相应的设备权限,该等权限申请行为由您自行负责,应在您自身产品的隐私政策中向终端用户作出必要的说明和披露。 ## 1.7 **无需征得授权同意的例外** 根据相关法律法规及监管要求,以下情形中,我们可能会收集、使用个人信息无需另行征求您的授权同意: * 与国家安全、国防安全直接相关的。 * 与公共安全、公共卫生、重大公共利益直接相关的。 * 按照法律规定或有权机关规定,向金融监管机关、司法机关披露个人信息的。 * 与案件立案、侦查、起诉、审判、执行等刑事司法事项相关的。 * 出于维护您或其他主体的生命、财产等重大合法权益但又很难得到您本人同意的。 * 所收集的个人信息是您自行向社会公众公开的。 * 从合法公开披露的信息中收集个人信息的,如合法的新闻报道、政府信息公开等渠道。 * 根据您的要求签订和履行合同所必需的。 * 用于维护所提供的产品或服务的安全稳定运行所必需的,例如发现、处置产品或服务的故障,控制业务风险。 * 为持续提升我们服务体验,改进服务质量,我们通过技术手段对您的个人信息数据进行匿名化、去标识化处理,匿名化的信息将无法识别信息主体,去标识化信息在不能识别信息主体的情况下,对此类数据的保存及处理我们将无需另行向您通知并征得您的同意。 * 法律法规及监管机关要求规定的其他情形。 # 2. **我们如何使用Cookie和同类技术** Cookie和设备信息标识等同类技术是互联网中普遍使用的、基于浏览器的文本技术。当您通过浏览器访问Hitem3D官方网站或控制台时,我们可能会使用相关技术向您的设备发送一个或多个Cookie或匿名标识符,以收集、标识您访问和使用我们服务时的信息。Cookie不会跟踪您的个人身份信息。我们承诺,不会将Cookie用于本隐私政策所述目的之外的任何其他用途。我们使用Cookie和同类技术主要为了实现以下目的: * 保障产品与服务的安全、高效运转:我们可能会设置认证与保障安全性的Cookie 或匿名标识符,使我们确认您是否安全登录服务,或者是否遇到盗用、欺诈及其他不法行为。这些技术还会帮助我们改进服务效率,提升登录和响应速度; * 帮助您获得更轻松的访问体验:Cookie或同类技术有助于我们辨认您作为我们的注册用户的身份,或保存您向我们提供有关您的喜好或其他信息,从而可以帮助您省去重复填写个人信息的步骤和流程; * 分析您使用我们服务的情况:我们可利用Cookie或同类技术来了解您使用Hitem3D进行什么活动、或哪些服务或服务最受欢迎; * 我们可能会使用Cookie对浏览活动进行记录,用于排查崩溃、延迟的相关异常情况以及探索更好的服务方式。 Hitem3D上可能会有其他合作方放置的COOKIES或同类技术。这些Cookie和或同类技术可能会收集与您相关的非个人身份信息,以用于分析用户如何使用该等服务、向您发送您可能感兴趣的内容等。这些第三方Cookie或同类技术收集和使用该等信息不受本隐私政策约束,而是受到其自身的信息保护声明约束,我们不对第三方的Cookie或同类技术承担责任。 您可以接受或拒绝Cookie。如您使用Hitem3D网页版,大多数浏览器会自动接受Cookie但同时为用户提供了清除浏览器缓存数据的功能,您可以根据自己的需要在浏览器设置中进行操作清除Cookie数据。但请您知悉,倘若您拒绝使用或清除已有的Cookie,则可能需要在每一次访问时亲自更改用户设置,且可能无法使用由我们提供的、依赖于Cookie的功能或服务。 # 3. **我们可能委托处理、共享、转让或披露的个人信息** **我们深知企业与开发者商业数据及个人信息安全的重要性。我们郑重承诺,绝不会向任何第三方出售您的数据**。除国家有权机关依法查询或为提供本服务所必需外,我们不会主动向任何第三方共享、转让或公开披露您的信息,除非符合以下特定情形: ## 3.1 **委托处理** 为向您提供更完善、稳定、优质的服务与响应,某些功能可能由我们的服务合作方的某些公司、组织和个人(如我们的第三方服务供应商、承包商、代理等)提供,我们会委托该等服务合作方(“**受托方**”)代表我们处理您的某些个人信息。Hitem3D委托的个人信息处理受托方类型主要包括: * 底层大模型与算力服务商:为实现核心的内容生成功能,我们可能需要将您的输入指令进行加密与去标识化处理后,路由至提供 GPU 算力支持或基础大模型服务的云服务商进行计算推理; * 云基础设施服务商:提供云计算、云存储、CDN 内容分发及网络带宽等基础技术服务的机构,用于保障 API 接口的高可用性; * 数据分析与安全服务商:提供系统稳定性监测、API 异常流量分析、网络安全防护及防范 DDoS 攻击等服务的机构; * 客户支持与计费服务商:提供工单系统、支付处理及账单核算等服务的机构。 对接受我们委托处理您个人信息的受托方,我们会与其签署严格的保密协定或数据处理协议,明确委托事项、委托处理目的、期限、处理方式、处理个人信息的种类、保护措施以及双方的权利义务等,**要求他们仅按照我们的要求、本隐私政策以及相关的保密和安全措施来处理个人信息,处理的目的受到如下限制:(1)协助我们向您提供产品或服务;(2)履行与我们根据已签订的协议、本隐私政策的责任和实现我们的权利及/或协助理解和改善我们提供的服务**。 ## 3.2 **共享** 尊重用户个人隐私是我们的一项基本原则。除国家有权机关依法查询或使用您的信息外,我们不会主动向任何第三方共享您的个人信息,除非符合以下情形: * 向您告知个人信息使用目的、涉及的个人信息范围、应用场景、接收方的名称或者姓名、联系方式、处理目的、处理方式和个人信息的种类并征得您的单独同意或书面授权,**并事先获得您的明确同意**。 * 在法律要求或允许的范围内,为了保护社会公众的利益、财产或安全免遭损害而有必要提供您的个人信息给第三方的情形。 * **与授权合作伙伴共享**。如您是通过我们授权合作的第三方云计算平台订阅并接入本服务,为了鉴权、服务开通以及用量计量及账单结算的精确核算,您的**用户标识、API 密钥状态、接口调用频次、并发资源占用情况、消耗量及相关账单结算**等必要信息将在我们与该云平台之间进行传递。**此类共享是履行您与该第三方云平台之间服务合同所必需的**。此外,如该云平台在其控制台界面向您**展示历史调用记录(包括输入内容及输出内容)**,则相关内容数据亦将经由该云平台的技术基础设施进行传输和呈现;该云平台对其自身平台上的数据处理活动承担独立的法律责任,相关事项请参阅该平台的隐私政策。 我们严格约束共享行为。我们会与合作方签署严格的书面数据处理协议(DPA)或保密条款,要求合作方严格按照我们的指令、本隐私政策以及其他任何相关的保密和安全措施来处理您的信息。我们将要求合作方不得将从我们获取的您的信息用于任何超出该等特定目的的其他用途。**如果您拒绝我们与合作方共享提供底层 API 服务所必需的信息,将导致您客观上无法使用该合作方环境下的 Hitem3D 服务**。 * **与我们的关联方进行的必要共享**。为便于我们基于统一的技术底层架构向您提供一致化的服务,以及便于进行统一的开发者身份鉴权、底层系统排障、研发优化及保障系统和账号安全,您的部分必要信息可能会在我们和我们的关联方之间进行共享。例如,为了使您在调用我们及我们关联方提供的各类 API 产品与/或服务时有一致的跨端体验与安全风控防护,您知悉并同意,您的账号基础信息、设备/服务器日志信息、API 调用异常数据等可能会与我们的关联方共享。我们承诺,关联方对您信息的处理同样受本隐私政策的严格约束,且不会用于直接的商业营销广告目的。 * **依法定情形的共享与提供**。请您理解,在法律法规、法定程序、诉讼争议解决或政府主管部门(如网信、公安部门)强制性要求的情况下,我们将依法向有权机关提供或披露您的相关信息(包括涉嫌违规的调用日志及生成内容),以履行网络服务提供者的法定配合义务。 ## 3.3 **转让** 我们不会将您的个人信息转让给任何公司、组织和个人,但以下情况除外: * **在获取明确同意的情况下转让**:获得您的明确同意后,我们会向其他方转让您的个人信息; * **在涉及合并、分立、收购或破产清算时**:随着我们业务的持续发展,我们有可能进行合并、收购、资产转让或类似的交易,而您的信息有可能作为此类交易的一部分而被转移。如涉及个人信息转让,我们会要求新的持有您个人信息的公司、组织继续受本隐私政策的约束,否则我们将要求该公司、组织重新向您征求授权同意。 **请您知悉**:如具备上述事由确需转让,我们将在转让前向您告知转让信息的目的、类型、信息受让方(如涉及敏感个人信息,我们还将告知涉及的敏感个人信息的内容),并在征得您同意后再转让,但法律法规另有规定的除外。 ## 3.4 **公开披露** 我们不会主动公开披露您的个人信息,如需披露,会获得您的单独同意,并同步告知披露个人信息的目的、类型。当披露个人信息涉及敏感个人信息时,还会增加告知涉及敏感个人信息的内容、处理敏感个人信息的必要性,以及可能对您个人权益的影响,并事先征得您的明示同意。**请您理解,在法律法规、法律程序、诉讼或政府主管部门强制性要求的情况下,我们可能会公开披露您的个人信息**。 如果我们确定您(或您的终端用户)出现违反法律法规或严重违反Hitem3D相关协议规则的情况,或为保护 Hitem3D 系统安全、关联方用户或社会公众的人身财产安全免遭侵害,我们可能依据法律法规披露关于您的违规主体信息及相关行为日志,以及 Hitem3D 已对您的 API 账号采取的封禁或熔断措施。 # 3.5 **无需征得授权同意的例外** 根据法律法规,在以下情形中,我们共享、转让、公开披露个人信息不必事先征得您的授权同意: * 与国家安全、国防安全直接相关的。 * 与公共安全、公共卫生、重大公共利益直接相关的。 * 按照法律规定或有权机关规定,向金融监管机关、司法机关披露个人信息的。 * 与案件立案、侦查、起诉、审判、执行等刑事司法事项相关的。 * 出于维护您或其他主体的生命、财产等重大合法权益但又很难得到您本人同意的。 * 所收集的个人信息是您自行向社会公众公开的。 * 从合法公开披露的信息中收集个人信息的,如合法的新闻报道、政府信息公开等渠道。 * 根据您的要求签订和履行合同所必需的。 * 用于维护所提供的产品或服务的安全稳定运行所必需的,例如发现、处置产品或服务的故障,控制业务风险。 * 为持续提升我们服务体验,改进服务质量,我们通过技术手段对您的个人信息数据进行匿名化、去标识化处理,匿名化的信息将无法识别信息主体,去标识化信息在不能识别信息主体的情况下,对此类数据的共享、转让、公开披露我们将无需另行向您通知并征得您的同意。 * 法律法规及监管机关要求规定的其他情形。 # 4. **我们如何保护您的个人信息** 您的个人信息安全对于我们至关重要。我们将严格遵守相关法律法规,采取符合业界标准的、合理可行的安全防护措施,保护您的个人信息。防止信息遭到未经授权的访问、泄露、使用、修改,避免信息损坏或丢失。 ## 4.1 **数据安全技术与管理措施** 我们努力采取各种符合业界标准的物理、电子和管理方面的安全措施来保护您的个人信息安全,以防止您的个人信息在收集、存储、传输等过程中遭到泄露、破坏。具体而言: * 我们已建立配套的个人信息保护管理制度、内控机制和流程,从管理层面及技术层面,双向落实客户个人信息保护要求,以保障您的信息安全。例如,我们设定严格数据访问权限和多重身份认证技术,落实数据请求的最小必要原则,尽商业努力防止您的个人信息遭到未经授权的访问、泄露、使用、修改、损坏或丢失;使用专线加密传输数据;对相关系统的源代码进行统一管控;我们的服务采取了多种加密技术,例如在某些功能中,我们将利用加密技术(例如SSL)对您的个人信息进行加密保存,并通过隔离技术进行隔离,以保护您的个人信息。 * 我们成立了专门团队负责信息安全与隐私保护,同时加强员工个人信息保护领域的宣导与教育,提升员工的安全意识以及对于个人信息保护政策和相关规程的认识。 * 我们仅允许有必要知晓这些信息的员工、合作伙伴访问您的个人信息,并为此设置了严格的访问权限控制和监控机制。我们同时要求可能接触到您的个人信息的所有人员履行相应的保密义务。如果未能履行这些义务,可能会被追究法律责任或被终止与Hitem3D的合作关系。 ## 4.2 **网络安全风险防范** 我们将尽力确保您发送给我们的任何信息的安全性,**但请您理解,由于技术水平的限制以及可能存在的恶意攻击,以及其他由于各种因素可能出现我们无法合理预见、防范、避免、控制的意外情形,不可能始终保证信息百分之百的安全**。如果我们的物理、技术、或管理防护设施遭到破坏,导致个人信息被非授权访问、公开披露、篡改、或毁坏,导致您的合法权益受损,我们将承担相应的法律责任。 **互联网并非绝对安全的环境,请您务必提高安全意识、设置复杂密码,协助我们保证您的账号安全**。您接入Hitem3D所用的系统和通信网络,有可能因我们可控范围外的情况而发生问题。此外,为防止他人未经授权使用您的密码或使用您的计算机、移动设备,如您发现自己的个人信息尤其是您的账户或密码发生泄漏,请您立即联络Hitem3D客服,以便我们核实后根据您的申请采取相应措施。 ## 4.3 **安全事件处置** 为防止安全事故的发生,我们制定了妥善的预警机制和应急预案。若不幸发生或者可能发生个人信息泄露、篡改、丢失(以下简称“**个人信息安全事件**”),我们将按照法律法规的要求,及时向您告知:个人信息安全事件涉及的信息种类、发生或可能发生的原因和可能造成的危害;我们采取的补救措施和您可以采取的减轻危害的措施等。我们将及时将事件相关情况以电话、邮件、推送通知等方式告知您,难以逐一告知客户时,我们会采取合理、有效的方式发布公告。同时,我们还将按照法律法规和监管部门要求,上报个人信息安全事件的处置情况,紧密配合政府机关的工作。 # 5. **我们如何存储您的个人信息** ## 5.1 **存储地域** 我们会按照法律法规及监管要求,将在中华人民共和国境内(不含中华人民共和国香港特别行政区、澳门特别行政区和中国台湾地区)收集和产生的您的个人信息存储于中国境内。 **但为处理跨境业务时,我们会根据适用法律的要求,向您告知境外接收方的名称或者姓名、联系方式、处理目的、处理方式、个人信息的种类以及个人向境外接收方行使法律规定权利的方式和程序等事项,并征得您的单独同意后,将上述信息提供至境外第三方**。此种情况下,我们会按照法律法规和监管规定执行,并采取有效措施保护您的信息安全,确保境外数据接收方有充足的数据保护能力来保护您的个人信息。 ## 5.2 **存储期限** **我们承诺您个人信息的存储时间为在法律法规要求的期限内,或为实现本隐私政策所述目的所必需的最短期限内**。例如:(1)**账户及合同信息**:如您与我们直接签约,我们需要在合同存续期间及合同终止后的法定保存期限内保留相关联系人信息及合同文件,以便于履约、客户服务及争议解决;(2)**API调用日志**:根据《网络安全法》等相关规定,网络日志保存期限不少于6个月;(3)**账单及交易记录**:根据《电子商务法》等规定,交易信息保存时间自交易完成之日起不少于3年,以及其他出于财务、审计、争议解决等目的需要合理延长期限的情况。 **对于超过上述存储期限的个人信息,我们会进行删除或做匿名化处理。如删除或匿名化处理在技术上难以实现的,我们将停止存储和采取必要的安全保护措施之外的处理活动**。 在您终止使用Hitem3D后,我们会停止对您的信息的收集和使用,法律法规或监管部门另有规定的除外。如我们因自身原因或其他外部原因出现停止运营的情况,我们将根据国家法律法规的规定及时停止收集您个人信息的活动,将停止运营的通知以逐一送达或公告的形式传达至各个客户,并对所持有的您的个人信息进行删除或匿名化处理。 # 6. **如何管理您的个人信息** **我们非常重视您对个人信息的管理。我们会尽一切可能保证您可以顺利行使对自己个人信息的查阅、复制、删除、注销账户、更改授权同意范围、响应请求及撤回同意等权利,以使您拥有充分的能力和渠道保护您的个人信息安全**。按照《个人信息保护法》及通行做法,为了使您拥有充分的能力保障您的隐私和安全,您拥有如下权利(由于应用版本的升级和功能的变动,我们在Hitem3D不同的版本或操作系统中提供的管理方式路径和步骤可能有差异,请以实际为准): ## 6.1 **知情权与决定权** 您有权知晓我们处理您个人信息的规则,以及对相关处理活动进行限制或拒绝。本隐私政策及我们在收集时提供的特定通知,旨在充分告知您有关情况。 ## 6.2 **查阅权、更正权与复制权** 您有权查阅我们持有的关于您的个人信息,并申请获取副本。如您认为相关信息不准确或不完整,您有权要求我们更正或补充。**如您通过第三方云平台接入本服务,账户层面的个人信息查阅与更正事宜通常依照该平台的规则处理;如您与我们另行签署了书面协议,相关事项以协议约定为准**。如需直接向我们提出上述请求,请通过本隐私政策第十章列明的方式联系我们,我们将在核实您的身份后提供必要协助。 您可通过 API 接口或第三方平台查阅您的近期历史 API 请求及模型生成的输出内容。**但请您知悉,受限于底层系统的存储资源与数据流转策略,我们不承诺对您的历史调用数据及生成内容提供永久存储**。超过系统设定的临时缓存或存储期限后,相关内容将被自动清理。 ## 6.3 **删除您的个人信息** 除法律法规规定外,您有权通过本隐私政策第十章所述的联系方式删除您的信息。在以下情形中,您可以向我们提出删除个人信息的请求: * 如果我们违反法律法规或与您的约定收集、使用、与他人共享或转让您的个人信息。 * 如果我们违反法律法规规定或与您的约定,公开披露您的个人信息,您有权要求我们立即停止公开披露的行为,并发布通知要求相关接收方删除相应的信息。 * 我们没有征求您的明确同意,收集了您的个人信息。 * 已实现个人信息处理目的、无法实现或者实现处理目的不再必要。 * 您注销了账户。 * 我们停止对您提供服务。 **以上删除请求一旦被响应,在符合法定条件的情况下,我们将及时删除您的个人信息,我们还将同时通知受我们委托或与我们共同处理个人信息的公司、组织或个人,要求其同步删除,除非法律法规另有要求,或其获得了您的单独同意**。当您从我们的服务中删除信息后,我们可能不会立即从备份系统中删除相应的信息,但会在备份更新时删除这些信息。 **若法律、行政法规规定的保存期限尚未届满或删除您的个人信息在技术上难以实现的,我们将会停止除存储和采取必要的安全保护措施之外的其他处理**。 ## 6.4 **注销您的账户** 如您希望注销账户,请通过联系我们的客户服务团队,或通过您接入本服务所使用的授权云平台渠道提出申请。 注销申请经审核(如账户无未完成的交易、未结清的款项或未履行的义务)同意后方可完成。**注销完成后,您与我们之间的合同关系解除,但您仍应对注销前的行为承担相应责任;我们将按照法律法规要求保留必要的数据记录,保留期限以相关法律规定为准;除上述法定留存义务外,我们通常将及时删除您的账户信息或作匿名化处理。账户注销后原账户内的数据及权益将被清空,该操作不可逆,请您谨慎操作**。 ## 6.5 **改变您授权同意的范围/撤回您的授权** 您总是可以选择是否向我们披露个人信息。有些个人信息是使用Hitem3D所必需的,但大多数其他信息的提供是由您决定的。**对于基于您同意而进行的个人信息处理活动,您有权随时撤回同意。撤回同意不影响撤回前基于您同意所进行的处理活动的合法性**。 **请您理解,特定业务功能需要您的信息才能完成,撤回授权后,我们将无法继续为您提供该部分对应的服务,但不影响您使用其他功能。如需撤回同意,请通过本隐私政策第十章列明的方式联系我们**。 ## 6.6 **自动化决策相关权利** 本服务底层基于先进的AI深度学习模型运行,模型生成内容的过程本质上属于通过算法等自动化处理机制作出结果。**我们承诺算法模型的设计与运行符合国家伦理规范。如您认为相关 AI 自动化生成结果对您的重大合法权益造成了实质性影响,您有权通过客服渠道要求我们作出必要说明,并有权依法拒绝我们仅通过自动化决策方式对您进行约束性处理**。 ## 6.7 **逝者个人信息的保护** 我们会持续确保我们的用户信息安全无虞,并将根据《个人信息保护法》的相关规定,加强对逝者个人信息的保护。如果Hitem3D用户(仅限自然人)不幸去世后,其近亲属为了自身的合法、正当利益,可以通过本隐私政策第十章公布的联系方式与我们联系,在不违反逝者生前安排且不侵害他人和公众正当利益的前提下,对逝者在Hitem3D的相关个人信息行使查阅、复制、更正、删除等权利。 为了充分保护逝者的个人信息权益,申请行使该等权利的逝者近亲属需要完成身份核验手续,并承诺和保证逝者近亲属行使该等权利不违背逝者生前的安排、行使权利目的具有合法正当性。 ## 6.8 **响应您的上述请求** 为保障安全,我们一般会先要求您验证自己的身份,然后再处理您的请求。您可能需要提供书面请求,或以其他方式证明您的身份。**一般情况下,我们将在15个工作日内完成核查和处理**。请您理解,对于某些无端重复、需要过多技术手段(例如,需要开发新系统或从根本上改变现行惯例)、给他人合法权益带来风险或者非常不切实际的请求(例如,涉及备份磁带上存放的信息),我们可能会予以拒绝。 尽管有上述约定,但按照法律法规要求,如涉及以下情形我们将可能无法响应您的请求: * 与国家安全、国防安全相关的; * 与公共安全、公共卫生、重大公共利益相关的; * 与刑事侦查、起诉、审判和判决执行等相关的; * 有充分证据表明您存在主观恶意或滥用权利的; * 响应您的请求将导致您或其他个人、组织的合法权益受到严重损害的; * 出于维护您或其他个人的生命、财产等重大合法权益但又很难得到本人授权同意的; * 涉及商业秘密的; * 您的请求超出了一般技术手段和商业成本可覆盖的范围; * 与我们履行法律法规及行业主管部门有关规定的义务相关的。 ## 6.9 **终端用户权利请求的响应** **如您是将本服务与相关API集成至您自身产品供终端用户使用的开发者,您对您的终端用户的个人信息权利请求(包括查阅、更正、删除、撤回同意等)负有独立的响应义务,应自行依照适用法律法规规定的时限和要求予以处理**。 如相关请求涉及需要我们配合的事项(如删除我们系统中存储的特定数据),请及时通过本隐私政策第十章列明的方式告知我们,我们将提供必要的技术协助。此外,如您的终端用户就本服务所采用的AI模型的基本运行原理、算法逻辑或生成机制提出合理的解释说明请求,您可向我们转达,我们将在合理范围内提供必要的技术说明,以协助您履行对终端用户的透明度义务。 # 7. **第三方服务** Hitem3D 服务可能通过我们授权的第三方云计算平台或渠道进行分发与部署。您明确知悉,您在第三方平台环境中进行账户注册、订阅、费用结算及网络调用的过程中,相关信息的数据控制者为该第三方云平台。您在此类第三方平台上的操作及底层数据流转,将受该第三方平台自身隐私政策的直接约束。您在使用本服务过程中亦可能接触到第三方提供的工具、插件或链接内容。 **该等第三方平台或外部链接服务由相关的第三方负责独立运营。您使用该等第三方服务(包括您向该等第三方提供的任何注册信息、支付信息或业务数据),须严格受第三方自己的服务条款及信息保护声明约束,本隐私政策并不适用**。我们对第三方收集和处理您信息的行为无法进行控制,亦不为其隐私保护实践提供任何明示或暗示的担保。我们强烈建议您在离开我们的控制台或向第三方提交任何敏感业务数据前,仔细阅读其隐私声明,以保护您的合法权益。 # 8. **未成年用户个人信息的收集与使用** 本服务面向具备完全民事行为能力的成年用户、开发者及企业主体提供AI内容生成工具服务。**在您开始使用本服务之前,您应当确认您已具备中华人民共和国法律规定的与您行为相适应的民事行为能力**。 与此同时,我们建议任何未成年人参加网上活动应事先取得父母或其他监护人(以下简称“**监护人**”)的同意与指导。Hitem3D将根据《个人信息保护法》《未成年人网络保护条例》等国家相关法律法规的规定,着重保护未成年人个人信息的保密性及安全性。 * **如您是不具备完全民事行为能力的未成年人,您应在法定监护人的陪同、指导并获得其明确同意后,方可阅读本隐私政策并接入或调用我们的服务。如您的监护人不同意您按照本隐私政策使用我们的服务或向我们提供信息,请您立即终止使用我们的接口服务并及时通知我们**。 * 对于经法定监护人同意而收集未成年人个人信息的情况,我们仅在法律法规允许、监护人明确同意或者保护未成年人所必要的情况下依法收集、使用、存储、共享、转让此类个人信息。 * 如您是未成年人的监护人,当您不同意被监护人按照本隐私政策使用我们的Hitem3D服务或向我们提供信息时,您应当及时要求被监护人终止使用Hitem3D,或请通过本隐私政策中的联系方式联系我们。 * **我们通常不向未满14周岁以下的儿童提供Hitem3D服务,如您为儿童请停止使用本服务**。 * **如果我们发现在未事先获得可证实的法定监护人同意的情况下,意外收集了未成年人的个人信息,我们将依法设法尽快从系统中删除相关数据记录。如您作为监护人对我们处理未成年人的个人信息有相关疑问,可通过本隐私政策第十章公布的联系方式与我们联系**。 # 9. **本隐私政策如何更新** 为了给您提供更好的服务,Hitem3D可能会根据产品或服务的更新情况或业务发展需要,以及因适用的法律法规、监管政策要求,保留不时更新或修改本隐私政策的权利。**但是未经您明确同意,我们不会削减您按照本隐私政策所应享有的权利。该等变更构成本隐私政策的一部分。每次更新后,我们会通过Hitem3D 官方网站公告、发送电子邮件或经由第三方授权云平台等合理、适当通知方式告知您,以便您能及时了解本隐私政策所做的任何变更。我们鼓励您在每次将我们的 API 接入新业务或定期进行合规审查时,查阅我们最新的隐私政策**。 **在本隐私政策更新生效后,若您(或您的应用系统)继续调用我们的接口或使用我们的服务,即表示您已充分阅读、理解并同意受经修订的本隐私政策的约束。如果您不同意本隐私政策的修改或更新内容,您应当立即在您的前端应用中切断对本服务接口的调用,并依照规则退订服务或注销账号。但请您知悉,您在账号注销或停止调用本服务之前的历史数据处理行为,仍受当时有效的隐私政策约束**。 **在此情况下,若您勾选同意修改后的隐私政策并选择继续使用我们的服务,即表示同意受经修订的本隐私政策的约束**。 我们还会将本隐私政策的旧版本存档供您查阅。您可以通过本隐私政策第十章中所述方式联系我们获取旧版的隐私政策。 对于重大变更,视具体情况我们**还会提供更为显著的通知,如明显位置提示等方式**。本隐私政策所指的重大变更包括但不限于: * 我们的服务模式发生重大变化。如处理个人信息的目的、处理的个人信息类型、个人信息的使用方式等; * 我们在所有权结构、组织架构等方面发生重大变化。如业务调整、破产并购等引起的所有者变更等; * 个人信息共享、转让或公开披露的主要对象发生重大变化; * 您参与个人信息处理方面的权利及其行使方式发生重大变化; * 我们负责处理个人信息安全的责任部门、联络方式及投诉渠道发生变化时; * 其他重要的或可能严重影响您的个人权益的情况发生。 **请您仔细阅读变更后的本隐私政策内容。如果您不同意本隐私政策,或对本隐私政策修改、更新的内容有异议,您可以选择停止使用Hitem3D或注销账号。但请您知悉,您账号注销之前、停止使用本服务之前的行为和活动仍受本隐私政策的约束**。 # 10. **如何联系我们** 我们设立了专职部门以确保您的个人信息与隐私安全。如您在使用Hitem3D时遇到任何与隐私保护相关的任何问题(包括问题咨询、投诉、举报等),或您对本隐私政策有任何问题、意见或建议,您可以通过以下渠道与我们联系: * 通过您调用的平台或向我们的在线客服提供反馈、咨询和投诉; * 发送电子邮件至legal@mathmagical.com。 一般情况下,我们将在正式收到您的意见、建议、问题,并验证您的用户身份之后的15个工作日内完成核查和处理。如需要更长的时间响应您的请求或者无法响应您的请求,我们会在法律规定的最大时限要求内,向您发送通知并解释原因。 请您注意,如您的部分基础账户信息、计费数据及实名认证资料系由您接入本服务的第三方平台独立收集和控制,对于该部分数据的查阅、更正或注销请求,您可能需要直接联系该第三方云平台的客户服务渠道进行处理;我们将在技术可行的范围内提供必要的配合。 如果您对我们的回复不满意,或您认为我们的个人信息处理行为损害了您的合法权益,您可以向相关监管机构进行投诉和举报。与本隐私政策相关的任何纠纷,双方应该友好协商解决;若不能协商解决,您同意将争议提交至我们所在地(即北京市海淀区)有管辖权的人民法院(双方另有约定的除外)。 --- # 开源模型许可证 Source: https://ark.volcengine.com/region:cn-beijing/docs/open-source-model-licenses 使用以下开源模型时,请确保遵守对应模型的相关协议及许可证: |模型 |许可证 | |---|---| |DeepSeek-V4.1-Flash |* [MIT](https://huggingface.co/deepseek-ai/DeepSeek-V4.1-Flash/blob/main/LICENSE) | \ | | | |DeepSeek-V4-Pro正式版 |* [MIT](https://huggingface.co/deepseek-ai/DeepSeek-V4-Pro-0813/blob/main/LICENSE) | \ | | | |DeepSeek-V4-Flash正式版 |* [MIT](https://huggingface.co/deepseek-ai/DeepSeek-V4-Flash-0731/blob/main/LICENSE) | \ | | | |DeepSeek-V4-pro |* [MIT](https://huggingface.co/deepseek-ai/DeepSeek-V4-Pro/blob/main/LICENSE) | \ | | | |DeepSeek-V4-flash |* [MIT](https://huggingface.co/deepseek-ai/DeepSeek-V4-Flash/blob/main/LICENSE) | \ | | | |GLM-5.3-Flash |* [MIT](https://huggingface.co/zai-org/GLM-5.3-Flash/blob/main/LICENSE) | \ | | | |GLM-5.2 |* [MIT](https://huggingface.co/zai-org/GLM-5.2/blob/main/LICENSE) | \ | | | |DeepSeek R1 |* [MIT](https://github.com/deepseek-ai/DeepSeek-R1/blob/main/LICENSE) | \ | | | |DeepSeek-R1-Distill-Qwen-7B |* [MIT](https://github.com/deepseek-ai/DeepSeek-R1/blob/main/LICENSE)| \ | |* [Apache 2.0](https://huggingface.co/Qwen/Qwen2.5-1.5B/blob/main/LICENSE) | |DeepSeek-R1-Distill-Qwen-32B |* [MIT](https://github.com/deepseek-ai/DeepSeek-R1/blob/main/LICENSE)| \ | |* [Apache 2.0](https://huggingface.co/Qwen/Qwen2.5-1.5B/blob/main/LICENSE) | |DeepSeek V3 |* [LICENSE-MODEL](https://huggingface.co/deepseek-ai/DeepSeek-V3/blob/main/LICENSE-MODEL)| \ | |* [LICENSE-CODE](https://huggingface.co/deepseek-ai/DeepSeek-V3/blob/main/LICENSE-CODE) | |Kimi K2 |* [Modified MIT License](https://huggingface.co/moonshotai/Kimi-K2-Instruct/blob/main/LICENSE) | \ | | | --- # 客户应用上架指南-算法备案资质申请流程 Source: https://ark.volcengine.com/region:cn-beijing/docs/customer-app-listing-guide-algorithm-filing-application-process 各大应用商店和小程序平台对于使用了「应用含深度合成或生成式人工智能服务」的应用有着严格的资质要求,其中最核心的两点要求如下: * 应用/小程序主体与技术主体的合作协议(协议需含「算法名称」或「应用产品」或「备案编号」相关内容) * 技术主体的《互联网信息服务算法备案》(算法类型为“生成合成类(深度合成)”)或《互联网信息服务算法备案》(算法类型为“生成合成类”)在审批中的系统截图 火山引擎大模型客户可以按照以下方式自助获取和使用有关资质材料: ## 1. 申请条件 在申请相关资料前,请注意您的账号同时满足以下条件: * 已注册火山引擎官网账号并完成实名认证; * 已开通对应算法/模型商品服务,且该服务处于“运行中”非异常状态中。 * 您的账号下存在对应“预付费”/“部分预付”服务 * 您的账号下存在对应的“运行中”的“后付费”服务,且近 6 个月的对应服务总调用量大于 0。 > 注意:若您处于免费额度内,仍需开通对应算法/模型服务。 ## 2. 申请步骤 1. 从火山方舟控制台进入「费用-合同管理」页面。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/d82345a2dc964424baf8644549536a72~tplv-goo7wpa0wc-image.image) 2. **生成订单合同:在**「订单合同」页面选择对应算法/模型产品订购订单,**生成订单合同,** 具体步骤如下: a. 进入「订单合同」页面,点击「申请合同」。 ![](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_5c5c7603854edda8c30703dc4ad7e29b.png) b. 选择待生成订单合同的订单或账单,点击「下一步」。 ![](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_344305f12197891c93c865af9026bd82.png) c. 输入并确认合同信息,点击「保存合同草稿」或「创建正式合同」,保存合同草稿后可在「费用中心-合同管理-订单合同」页面「转为正式合同」。 注意: i. 每个订单/账单只支持创建一次带电子章的正式合同,可针对多个订单或账单申请一份合同。 ii. 预付费订单生成后立即可以申请合同,当月后付费账单在次月第4个自然日后可以申请合同。 iii. 草稿合同未签署盖章,对双方均无法律约束力,转为正式合同后自动加盖电子印章。 iv. 当您处于财务托管时,您产生的订单/账单的支付账号为主账号,故该段时间内产生的订单/账单只能由主账号进行合同申请。 ![](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_ebed3f2f694ce50280e4ba1ca0015551.png) ![](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_0783c5129cfe56904c7509ec9cb3e9b6.png) 3. **下载备案说明**: 在「证明文件」页面,选择对应算法/模型,**下载备案说明**。 ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/f144a521bec54147a29bd6d9c567e74a~tplv-goo7wpa0wc-image.image) 注意:备案说明证明文件的下载受限于已开通的商品情况,请您下载前,确认账号满足申请条件。备案说明证明文件和所需开通模型的对应关系如下: | | | |备案说明 |开通模型(开通任一豆包模型即可) | |---|---| | | | |豆包企业版大模型算法备案说明 |[文本生成能力](/docs/model-list#32e9e053) | | | | |^^| | \ | |[视觉理解能力](/docs/model-list#76df97c8) | | | | |^^| | \ | |[大语言模型](/docs/model-list#32e9e053) | | | | |^^| | \ | |[向量模型](/docs/model-list#0ee80bb9) | | | | |豆包音乐大模型算法备案说明 |[豆包音乐大模型](https://ark.volcengine.com/region:cn-beijing/model/detail?Id=doubao-music) | |豆包企业版视频生成模型算法备案说明 |[视频生成模型](/docs/model-pricing#02affcb8) | |豆包企业版图像生成模型算法备案说明 |[图片生成模型](/docs/model-list#9df4d9fd) | ## 3. 使用办法 客户可以自行向应用商店或小程序平台同时提交**订单合同以及备案说明**,上述材料的获取或使用存在任何疑问可联系您的商务经理进行咨询反馈。 --- # 大模型备案说明(含算法备案及人工智能备案) Source: https://ark.volcengine.com/region:cn-beijing/docs/model-filing-guide-algorithm-filing-and-ai-filing # **什么是大模型备案** 2021年以来,我国陆续发布 [《互联网信息服务算法推荐管理规定》](https://www.cac.gov.cn/2022-01/04/c_1642894606364259.htm)、[《互联网信息服务深度合成管理规定》](https://www.gov.cn/zhengce/zhengceku/2022-12/12/content_5731431.htm)、[《生成式人工智能服务管理暂行办法》](https://www.cac.gov.cn/2023-07/13/c_1690898327029107.htm) 等算法与人工智能方面的法律法规,形成一套对于生成式人工智能服务的备案管理要求,即行业中常说的“大模型备案”,包括:算法备案及生成式人工智能服务备案。 # **什么情况需要申请算法备案** 提供具有 **舆论属性或者社会动员能力** 的算法推荐/深度合成/生成式人工智能服务时,需要履行算法备案手续。 相关法律法规依据: * [《互联网信息服务算法推荐管理规定》](https://www.cac.gov.cn/2022-01/04/c_1642894606364259.htm):第二十四条 具有 **舆论属性或者社会动员能力** 的算法推荐服务提供者应当在提供服务之日起十个工作日内通过互联网信息服务算法备案系统填报服务提供者的名称、服务形式、应用领域、算法类型、算法自评估报告、拟公示内容等信息, **履行备案手续** 。 * [《互联网信息服务深度合成管理规定》](https://www.gov.cn/zhengce/zhengceku/2022-12/12/content_5731431.htm):第十九条 具有 **舆论属性或者社会动员能力** 的深度合成服务提供者,应当按照《互联网信息服务算法推荐管理规定》履行 **备案和变更、注销备案手续** 。 * [《生成式人工智能服务管理暂行办法》](https://www.cac.gov.cn/2023-07/13/c_1690898327029107.htm):第十七条 提供具有 **舆论属性或者社会动员能力** 的生成式人工智能服务的,应当按照国家有关规定开展安全评估,并按照《互联网信息服务算法推荐管理规定》履行 **算法备案和变更、注销备案手续** 。 # 什么情况需要申请生成式人工智能服务备案 提供具有 **舆论属性或者社会动员能力** 的生成式人工智能服务,需要完成生成式人工智能服务备案。 相关法律法规依据: * [《生成式人工智能服务管理暂行办法》](https://www.cac.gov.cn/2023-07/13/c_1690898327029107.htm):第十七条 提供具有 **舆论属性或者社会动员能力** 的生成式人工智能服务的,应当按照国家有关规定 **开展安全评估** ,并按照《互联网信息服务算法推荐管理规定》履行算法备案和变更、注销备案手续。 * 《[网信办关于发布生成式人工智能服务已备案信息的公告](https://www.cac.gov.cn/2024-04/02/c_1713729983803145.htm)》:已上线的生成式人工智能应用或功能,应在显著位置或产品详情页面公示所使用已备案生成式人工智能服务情况,注明模型名称及备案号。 # 什么是舆论属性或社会动员能力 根据《[具有舆论属性或社会动员能力的互联网信息服务安全评估规定](https://www.cac.gov.cn/2018-11/15/c_1123716072.htm?from=singlemessage&appinstall=0)》,具有舆论属性或社会动员能力的互联网信息服务,包括: (一)开办论坛、博客、微博客、聊天室、通讯群组、公众账号、短视频、网络直播、信息分享、小程序等信息服务或者附设相应功能; (二)开办提供公众舆论表达渠道或者具有发动社会公众从事特定活动能力的其他互联网信息服务。 # 如何申请算法备案 * **填报入口** [互联网信息服务算法备案系统](https://beian.cac.gov.cn/) * **填报指南** [《互联网信息服务深度合成管理规定》备案填报指南](https://beian.cac.gov.cn/api/file/fileDownLoad?noticeId=notice_4b62813c-b5cd-4bf0-b1ff-5c140decda7f) * **算法备案申请涉及两类角色**,分别为:服务提供者、服务技术支持者。其中, * 服务提供者:指提供深度合成服务的组织、个人 * 服务技术支持者:指为深度合成服务提供技术支持的组织、个人 * **服务提供者如何申请算法备案** ![](https://arkdocs.tos-cn-beijing.volces.com/flowcharts/resources/model-filing-guide-algorithm-filing-and-ai-filing-01.svg) * 主体信息填报:按照备案主体的实际情况如实填写主体基本信息、证件信息、法定代表人信息、算法安全责任人信息、《算法备案承诺书》、《落实算法安全主体责任基本情况》 * 算法信息填报: * 填写算法基础属性信息,包括:算法类型、角色、上线时间、应用领域、《算法安全自评估报告》、《拟公示内容》等 * 填写算法详细属性信息,包括:算法数据、算法模型、算法策略和算法风险与防范机制等 * 产品及服务信息填报:根据实际情况勾选应用当前备案算法的产品及功能 * **服务技术支持者如何申请算法备案** ![](https://arkdocs.tos-cn-beijing.volces.com/flowcharts/resources/model-filing-guide-algorithm-filing-and-ai-filing-02.svg) * **主体信息填报**:按照备案主体的实际情况如实填写**主体基本信息**、**证件信息**、**法定代表人信息**、**算法安全责任人信息**、**《算法备案承诺书》**、**《落实算法安全主体责任基本情况》** * **算法信息填报**: * 填写算法基础属性信息,包括:算法类型、角色、上线时间、应用领域、《算法安全自评估报告》、《拟公示内容》等 * 填写算法详细属性信息,包括:算法数据、算法模型、算法策略和算法风险与防范机制等 * **技术服务方式填报**:根据实际情况填写技术服务名称、技术访问方式、技术服务对象、技术服务频度等 # 如何申请生成式人工智能服务备案 * 与算法备案不同,安全备案暂无官方公开的申请平台入口及流程介绍。若需要申请相关安全备案,需要与属地网信办直接沟通相关的备案要求及流程。 * 根据一般经验,相关流程分为以下几个环节(**注:具体需要与属地网信沟通为准**) ![](https://arkdocs.tos-cn-beijing.volces.com/flowcharts/resources/model-filing-guide-algorithm-filing-and-ai-filing-03.svg) # 在哪里能够查询到算法备案结果 在“[互联网信息服务算法备案系统](https://beian.cac.gov.cn/#/index)”可以根据“主体名称”、“备案编号”查询到对应的备案结果。 # 在哪里能够查询到生成式人工智能服务备案结果 在网信办官方平台可以查看 [相关公告](https://www.cac.gov.cn/2024-04/02/c_1713729983803145.htm)。 # APP/小程序上架应用商店/开发者平台被卡怎么办? 各大应用商店和小程序平台对于使用了「应用含深度合成或生成式人工智能服务」的应用有着严格的资质要求,其中最核心的两点要求如下: * 应用/小程序主体与技术主体的合作协议(协议需含「算法名称」或「应用产品」或「备案编号」相关内容) * 技术主体的《互联网信息服务算法备案》(算法类型为“生成合成类(深度合成)”)或《互联网信息服务算法备案》(算法类型为“生成合成类”)在审批中的系统截图 对于使用了豆包大模型的客户,可以参考 [文档](/docs/customer-app-listing-guide-algorithm-filing-application-process) 进行申请。若仍有疑问,可以联系商务经理。 # 使用DeepSeek等其他三方模型,上架应用商店时,被要求提供合作协议怎么办? 应用商店需要客户提供算法所有方算法备案结果,以及客户主体和算法所有方的合作协议,并加盖算法所有方主体公章。因为三方模型,火山引擎非其算法主体,无法提供合作协议并加盖对应公章。可以 * 自行申请算法备案,参考[如何申请算法备案](/docs/model-filing-guide-algorithm-filing-and-ai-filing#00d1614f)。 * 提供火山方舟对应模型调用量的控制台界面截图,证明正常使用三方模型(应用商店是否认可,由审核员裁定) ![](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/f4eecd47ddff4309aa78a621d7ad2a84~tplv-goo7wpa0wc-image.image) * 申请豆包相关合作协议及备案证明,来提供商店所需材料,参考 [客户应用上架指南-算法备案资质申请流程](/docs/customer-app-listing-guide-algorithm-filing-application-process)。 # DeepSeek算法备案和生成式人工智能服务备案号是什么? 如下所示 |备案类型 |备案名称 |备案号 |公示链接 | |---|---|---|---| |生成式人工智能服务备案 |Deepseek Chat |Beijing-DeepseekChat-202404280016 |[https://www.cac.gov.cn/2024-04/02/c_1713729983803145.htm](https://www.cac.gov.cn/2024-04/02/c_1713729983803145.htm) | |深度合成服务算法备案(服务技术支持者) |DeepSeek 大语言模型算法 |网信算备 110108970550101240011 号 |[https://www.cac.gov.cn/2024-04/11/c_1714509267496697.htm](https://www.cac.gov.cn/2024-04/11/c_1714509267496697.htm) | |深度合成服务算法备案(服务提供者) |DeepSeekChat 求索对话生成算法 |网信算备 330105747635301240017 号 |[https://www.cac.gov.cn/2024-06/12/c_1719783421546747.htm](https://www.cac.gov.cn/2024-06/12/c_1719783421546747.htm) | --- # 火山方舟模型备案信息公示 Source: https://ark.volcengine.com/region:cn-beijing/docs/volcengine-ark-model-filing-disclosure 模型算法备案号公示 |算法备案 |备案编号 | |---|---| |豆包企业版大模型算法 |网信算备110108823483901230065号 | \ |*(原:云雀大模型算法-企业版)* | | |豆包企业版图片生成模型算法 |网信算备110108823483901240131号 | |豆包企业版视频生成模型算法 |网信算备110108823483901240157号 | |豆包音乐大模型算法 |网信算备110108823483901240149号 | |豆包企业版语音识别模型算法 |网信算备110108823483901240123号 | |豆包企业版实时语音模型算法 |网信算备110108823483901250177号 | |火山引擎文本转语音算法 |网信算备110108823483901230057号 | |豆包企业版3D模型算法 |网信算备110108823483901250169号 | |DeepSeek大语言模型算法 |网信算备110108970550101240011号 | |智谱交互式内容生成算法 |网信算备110108105858001230027号 | |应事文本信息合成算法-2 |网信算备310104297296101230065号 | |月之暗面Moonshot语言模型算法-2 |网信算备110108896786101240023号 | 模型备案编号公示 |模型名称 |备案号 | |---|---| |云雀 |Beijing-YunQue-20230821 | |福禄瓜 |Beijing-FuLuGua-20231205 | |豆包视频生成 |Beijing-DouBaoShiPinShengCheng-202503180061 | |豆包音乐 |Beijing-DouBaoYinYue-202503180063 | |豆包语音 |Beijing-DouBaoYuYin-202603050190 | |Deepseek Chat |Beijing-DeepseekChat-202404280016 | |智谱清言(ChatGLM) |Beijing-ChatGLM-20230821 | |abab |Shanghai-Abab-20230821 | |Moonshot |Beijing-MoonShot-20231016 | --- # MCP 云产品一键授权开通相关协议 Source: https://ark.volcengine.com/region:cn-beijing/docs/mcp-cloud-product-one-click-authorization-agreement 在使用MCP功能时,您可以根据控制台的提示一键授权开通相关服务,以下为您所需要关注且同意的相关协议: |云产品 |相关协议 | |---|---| |TOS |[《存储产品和服务条款》](https://docs.volcengine.com/docs/6349/78314?lang=zh) | \ | |[《计费概述》](https://docs.volcengine.com/docs/6349/78455?lang=zh) | |LAS |[《计费说明》](https://docs.volcengine.com/docs/6492/1263500?lang=zh) | |云助手 |[《计费概述》](https://docs.volcengine.com/docs/6396/69812?lang=zh) | |安全智能体 |[《安全智能体计费说明》](https://docs.volcengine.com/docs/85883/1606334?lang=zh) | |ECS |[《计费概述》](https://docs.volcengine.com/docs/6396/69812?lang=zh) | |TLS |[《计费概述》](https://docs.volcengine.com/docs/6470/1215813?lang=zh) | |veFaaS |[《计费概述》](https://docs.volcengine.com/docs/6662/107454?lang=zh) | |EBS |[《计费概述》](https://docs.volcengine.com/docs/26444/434932?lang=zh) | |RDS for MySQL |[《计费概述》](https://docs.volcengine.com/docs/6313/77796?lang=zh) | |VMP |[《计费概述》](https://docs.volcengine.com/docs/6731/107823?lang=zh) | |APMPlus |[《计费说明》](https://docs.volcengine.com/docs/6431/69089?lang=zh) | --- # 知识库产品服务和专用条款 Source: https://ark.volcengine.com/region:cn-beijing/docs/knowledge-base-product-terms 请参见 https://www.volcengine.com/docs/84313/1820160。 --- # 豆包助手专区服务专用条款和数据授权使用协议 Source: https://ark.volcengine.com/region:cn-beijing/docs/doubao-assistant-terms-and-data-authorization-agreement 发布日期:2025年11月27日 生效日期:2025年11月27日 本《豆包助手专区服务专用条款和数据授权使用协议》(“**本协议**”)是您与火山引擎,就您使用火山引擎豆包助手专区服务及授权火山引擎使用客户数据(定义见下文)的相关事项,签订的协议。 **为了更好地保障您的权益,您在同意本协议之前,请您务必审慎阅读,并充分理解本协议的全部内容,特别是以加粗标注的条款。如果您对本协议的条款有任何疑问,可以向火山引擎询问,相关人员将向您解释条款内容。如果您不同意本协议的任意内容,或者无法准确理解相关人员对条款的解释,请不要在订购页面勾选同意。如果您在订购页面特别勾选了同意本协议,即表示您已接收本协议所述的所有条款和条件,届时您不应以未阅读本协议或者未获得相关人员对您问询的解答等理由,主张本协议无效,或要求撤销本协议**。 您确认,在您注册及使用本服务时,您应当是合法成立并有效存续的法人或非法人组织。如果您是中国大陆地区以外的用户,您订立或履行本协议还需要同时遵守您所属和/或所处国家或地区的法律。 一旦您订购或(和)使用了本服务,本协议将与(1)火山引擎官网公示的 [《火山引擎服务条款》](https://docs.volcengine.com/docs/6256/64903?lang=zh) 与 [《火山引擎隐私政策》](https://docs.volcengine.com/docs/6256/64902?lang=zh),(2)[《产品和服务协议](https://docs.volcengine.com/docs/6256/68938?lang=zh)》,(3)订购协议/服务订单,(4)《服务等级协议》(如有),和(5)服务规则等所适用的其他协议共同构成您与火山引擎之间就订购或(和)使用本服务的完整协议。 本协议未明确约定事项,将遵照您与火山引擎订立的其他所适用协议或服务规则的约定。 1. **定义与解释** 1.1 除非本协议另有约定,如下术语具有本款所规定的含义: (1) **个人信息**:以电子或者其他方式记录的与已识别或者可识别的自然人有关的各种信息,不包括匿名化处理后的信息。 (2) **匿名化**:是指个人信息经过处理无法识别特定自然人且不能复原的过程。 (3) **关联方**:是指拥有一方、被一方拥有或与该方被同一其他方拥有的任何法律实体,其中“拥有”是指拥有相关实体超过50%的所有权或拥有指导其管理的权利。 (4) **客户数据**:指您在使用本服务时,向火山引擎平台提供的,包括您向豆包助手专区输入和服务生成的任何数据,包括但不限于所有输入的文本、声音、图形、图片、图像、视频、代码、软件或任何其他类似信息。 2. 服务使用规则 2.1 服务说明:**火山引擎豆包助手专区服务,** 是由火山引擎及其关联方(以下统称“火山引擎”)基于豆包系列模型,以API方式,为您提供的有关文本处理与智能对话等模型产品和服务(“本服务”)。本服务是以【**豆包大模型(“服务模型”)**】为基础为您提供相关服务功能。服务模型的备案信息、能力说明及更新情况以产品页公示内容为准,您可随时在产品页查看。 2.2 服务规则: (1)火山引擎服务仅限于您和(或)您的产品(“客户产品”)自行使用。火山引擎特此授予您一项非排他的、不可转让或再许可的、有时间限制的、可撤销的、仅在中国大陆地区使用本服务的授权。您理解并同意,如您就本服务进行商业使用或以其他方式直接或间接获得收益,则您需要事先获得火山引擎的书面许可。您进一步理解,火山引擎授权您使用本服务以及所有其他连同服务一并提供的内容,但是该等授权并非将上述内容出售给您。您理解,火山引擎将保留所有未明确授予您的权利。若您超出火山引擎授权范围使用、转让、再许可、出租火山引擎向您提供的任何资源、技术支持和服务等(包括向您的关联方转让、再许可、出租),我们有权立即终止前述许可,因此给您造成损失的,您应自行承担全部责任。 **(2)为了不断优化服务,您使用本服务期间,您同意按本协议第3条约定授权火山引擎使用您的客户数据。如您撤回授权或终止授权,您将无法继续使用本服务**。 (3)您使用本服务还应遵守《生成式人工智能服务管理暂行办法》以及立法和行政主管部门不时出台的与生成式人工智能服务的相关法律法规和国家标准。 (4)您理解并同意,火山引擎服务均由技术工具自动完成,除非另有书面约定和/或为履行服务协议下的特别义务(例如在适用情形下进行故障排除、检测等事项),火山引擎对服务过程及结果不进行人工干预。**除另有约定外,火山引擎仅通过技术工具为您提供纯技术性的服务,对于服务生成数据的效果或者准确性与合法性不做任何形式的承诺或保证。特别提示您,您在使用服务生成数据前应做好相关内容的审核和校对,您根据服务生成数据所作出的任何判断或者据此作出的后续相关操作行为,所带来的后果和责任均由您自行承担。您应承担因使用该等数据而引起的所有风险,包括因对服务生成数据的正确性、准确性、完整性、适用性、合法性、不侵权、实用性或满足特定目的的依赖而产生的一切风险。您确认并同意不因服务生成数据的不准确、不适用而追究火山引擎的任何责任**。 (5)**火山引擎的产品和服务是按照现有技术和条件所能达到的现状提供的。火山引擎将尽最大努力确保产品和服务的可用性,除本合同或双方书面确认的其他规定外,火山引擎不作任何其他明示或暗示的陈述或保证。例如,火山引擎未声明或保证产品和服务100%完整、准确、可靠、更新及时,也不保证产品/服不间断、系统稳定没有任何故障、内容完全安全或不侵权,您应根据其实际情况独立判断。您基于产品和服务生成的内容产生的任何知识产权纠纷由您自行处理并承担所有责任,由此给火山引擎造成损失的,您应当承担赔偿责任。您也同意,即使火山引擎提供的产品和服务存在瑕疵,但若上述瑕疵是当时行业技术水平所无法避免的,其将不被视为火山引擎违约,双方应友好协作共同解决问题。火山引擎的责任应以您在使用产品和服务时严格遵守本合同或其他有关操作指南、使用规范的文件为前提,否则,当产品和服务使用不当时,火山引擎将不承担相应的责任**。 (6)**火山引擎有权自行决定对您基于本服务传播的数据和内容审查,包括但不限于内容审查、合规审查、版权审查等。如发现您的客户内容不符合国家法律法规、政策规定及本协议约定的,或您的数据和内容侵犯他人合法权益,或其他火山引擎认为不符合要求的情况,火山引擎有权不予接入和传输;已经接入和传输的,火山引擎有权立即停止接入和传输,保存有关记录,并向相关主管部门报告,且火山引擎有权在此种情况下,不经通知自行决定删除或移除任何您的数据和内容。但是,本项约定不视为火山引擎对您的数据和内容提供任何合法性担保,因您的数据和内容引起的任何/全部法律责任和/或索赔均由您自行承担**。 2.3 第三方服务 (1)本服务可能包含指向第三方提供的产品、服务的链接及与第三方服务的集成功能(无论这些服务是位于本服务内,还是在与本服务相连接的独立第三方服务网站上的第三方产品和服务),火山引擎不对第三方产品或服务进行承诺或保证,您应当自行评估该等产品、服务是否符合并满足您使用要求。您理解并同意,第三方产品或服务的开通和使用,可能需要您与第三方另行签订单独的协议及其单独的许可和使用规则(合称“第三方规则”),该等第三方规则可通过纸质或电子文档形式向您提供或展示,您应自行根据其自身情况审阅并决定是否接受。如您通过火山引擎服务实际使用第三方产品、服务,应视为接受适用的第三方规则并受其约束。火山引擎对通过此类第三方服务发布或传播的信息、数据、观点、建议或陈述的准确性或可靠性不承担责任。因使用第三方产品或服务产生的纠纷,应由您与第三方自行解决,火山引擎可为纠纷的解决提供必要协助,但不因此承担任何责任。 (2)您确认并同意,通过本服务账户使用第三方服务集成功能时,您的账户信息可能会与该第三方服务共享。根据您对本服务的配置和使用情况,客户数据将在您的本服务账户与您已链接的一个或多个第三方服务之间传输。为预防或解决与该第三方服务相关的服务、安全、支持或技术问题,我们可能还会将您的客户数据与您链接到本服务账户的特定第三方服务共享。 3. 数据授权 3.1 授权目的:本规则项下的授权将用于开发机器学习、人工智能相关技术和豆包助手专区服务的优化、开发、使用等之目的。 3.2 授权范围:您同意,您将授予火山引擎一项**非独家的、不可转让的、不可分许可的(但可分许可给火山引擎关联方以及为达成授权目的第三方外包服务商)、免费的**权利,允许火山引擎为达成授权目的而**传输、存储、使用、复制、下载、修改或以其他方式处理**客户数据。 3.3 授权期限:本协议项下授权的起始日期为您**在订购页面勾选同意接受本协议之日**。授权期限为**永久**。如您在同意接受本协议后,(i)拟对该授权期限进行变更或调整,或(ii)如您希望停止对火山引擎授权新客户数据的,您可以通联系火山引擎客服人员申请终止您对火山引擎的授权(**“终止操作”**)。**您进一步充分知悉、理解并同意,即便您完成了终止操作,但由于机器学习和人工智能技术的特殊性,一旦(i)您授权火山引擎使用相关客户数据,且(ii)相关客户数据已被使用的,则对该部分客户数据的使用将在技术上无法撤回。特别提示您,如您终止授权,您将无法继续使用本服务**。 3.4 **您特别承诺并保证,您已合法持有客户数据,并已获得客户数据的一切必要充分授权或原始权利,以确保(i)您依法有权向火山引擎及其分许可方提供该等数据,且(ii)火山引擎及其分许可方有权根据本规则处理您提供的客户数据。若您发现您的客户数据出现任何权利争议或潜在权利争议,应立刻以书面形式通知火山引擎,并尽您最大努力协助火山引擎处理该等争议。如因您违反本条约定和/或任何第三方针对火山引擎及其分许可方在本协议约定范围内使用客户数据提起任何主张,您应当赔偿火山引擎及其分许可方因此遭受的所有损失**。 3.5 个人信息:您应当避免向火山引擎提供您的个人信息。如果您提交给火山引擎的客户数据中不可避免地含有个人信息的,**您应当保证(i)该等个人信息的来源符合所适用的法律法规的规定,尤其是中国大陆地区法律法规的相关规定,并且(ii)您已获得了相关个人信息主体和/或实体的同意(包括必要情形下的单独同意、书面同意)和/或授权,且该等个人信息主体和/或实体授权同意的范围足以确保您能够根据本协议向火山引擎提供该等个人信息,并确保火山引擎有权在本协议第3.2及3.3条所述授权范围及授权期限内处理该等个人信息**。任何情况下,客户数据将在火山引擎平台的严格加密下,通过安全方案匿名化处理后提供给火山引擎。 3.6 保密数据:在任何情况下,您不应违反任何法律法规的规定或您与任何主体的约定,向火山引擎提供任何保密信息或商业秘密。 3.7 其他特殊数据:如您拟向火山引擎提供任何其他特殊数据的(例如,国家机密、核心数据、重要数据、人类遗传资源信息、地图数据等),**除遵守本协议第3.4条以外,您在提供前应当已获得相关政府部门一切必要充分的审批、备案或许可,并以书面形式向火山引擎提出申请,** 申请书内应当载明(i)该等特殊数据的类型(无需说明任何数据内容),(ii)已获得的政府部门审批、备案或许可,(iii)提供该等特殊数据的目的及必要性,以及其他火山引擎可能需要了解的情况。**在确保不会访问您拟提供的特殊数据内容的前提下,火山引擎有权对于您是否可以在火山引擎平台上与火山引擎发生此等特殊数据的交互,作出特别决策**。 3.8 **使用限制** 3.8.1 被禁用途。火山引擎承诺,不会将您的客户数据用于以下用途:(i)诽谤、侮辱、骚扰、跟踪、或威胁任何个人,侵犯或损害任何第三方的合法权利;(ii)生成、传播任何有害的、不适当的、亵渎的、淫秽的、有损他人权利的、色情的、错误的、欺诈的、侵权的、不良的、违法的、或其他有悖公序良俗的材料或信息;(iii)参与或鼓励任何可能导致您或火山引擎承担刑事或民事责任的行为;(iv)擅自以您或火山引擎的名义作出进行宣传、推广、商业活动、或做出引人误解或混淆的上述行为;或(v)进行违法活动。 3.8.2 被禁行为。您承诺,您不得(且不得尝试):(i)对火山引擎产品和服务进行反向工程、解密、反向编译或反向汇编(本条款禁止但现行法律允许的除外);(ii)绕开火山引擎产品和服务中的技术限制或其相关文献中的限制措施;(iii)移除火山引擎产品和服务中出现的任何著作权、商标、专利或其他标识;(iv)向第三方分发、再许可、出租、租赁或租借火山引擎产品和服务; (v)以开发竞争性产品或服务为目的使用火山引擎产品和服务;(vi)传输或上传任何包含病毒、木马病毒、蠕虫病毒、定时炸弹病毒、删除蝇、或任何其他类似程序的文件,其目的或用途在于破坏、摧毁、干扰或损害专有火山引擎或火山引擎或其他人的网络、计算机系统或其他设备;或(vii)进行违法活动。 **3.9 其他** **如您与火山引擎就客户数据授权事宜另行签署相关协议或另有约定的,无论该等协议或约定发生在本协议签署之前或是之后,均应优先适用本协议内容**。 --- # 平台客户行为准则及违约处理规则 Source: https://ark.volcengine.com/region:cn-beijing/docs/breach-of-contract-rules 本平台客户行为准则及违约处理规则(“**规则**”),连同火山引擎官网的服务条款和隐私政策,以及适用于访问和使用火山方舟大模型服务平台的服务条款及其他政策、条款、问卷和承诺书(统称“服务协议”),构成完整且全面的协议。要使用此类火山引擎的大模型服务,您还需同意火山方舟及模型服务协议的条款和条件。 # **1. 适用范围** 1.1 本规则适用于与北京火山引擎科技有限公司(以下简称 “火山引擎”)签署《AI 视频创作服务协议》或/和《豆包大模型服务协议》、《保底协议》(若有)(以下合称 “服务协议”)的平台客户(服务协议中亦称 “甲方” 或 “您”)及其终端用户。 1.2 平台客户:指将 Seedance 系列模型 API 接入自身运营平台,并向外部企业或创作者开放注册与使用权限的客户。 1.3 如果您接入Seedance系列模型的产品和服务不属于提供创作工具的平台,则本规则不适用于火山引擎与您之间的权利义务约定。 # **2. 平台客户对终端用户管理能力承诺** 2.1 平台客户应对其终端用户行为给火山引擎造成的全部负面影响及损失承担赔偿责任。平台客户对其终端用户设定的合规要求及履约责任标准,不得低于其对火山引擎所应承担的责任与义务标准。 2.2 实名认证管理:平台客户应对终端用户账号进行个人及企业实名认证。 2.3 定期合规审计:平台客户须配合火山引擎安全合规要求,定期接受安全合规审计,并按要求提供审核日志、违规处理记录等相关材料。 2.4 安全事件应急响应:平台客户须建立完善的安全违规事件快速响应机制,对严重安全问题应在5 分钟内完成处置,并按要求提交处置报告及证明材料。 2.5 终端用户违规处理机制:平台客户须建立分级分类的终端用户违规处理规则(包括生成内容溯源至终端用户ID、警告、内容下架、账号冻结 / 封禁等),并完整留存处理日志备查。火山引擎有权要求平台客户采用匿名方式与火山引擎建立终端用户ID的映射关系,用于违规行为的核查。 2.6 可信资产库管理规则:平台客户应具备基于终端用户维度的自建可信素材库/真人形象资产库/版权库,有能力审核并留存授权 / 版权材料,支持可信素材溯源并且有前置审核/提醒功能,并授权火山引擎定期进行合规审计。 2.7 若发生违反本条规定的任何情形,除火山引擎有权立即对相关账户采取封禁、功能限制等措施外,平台客户还应向火山引擎支付相当于保底协议约定的保底金额(若有)或累计已产生的费用总额的 10% 作为违约金。若上述违约金不足以弥补字节跳动的实际损失(包括但不限于行政处罚、第三方索赔、声誉损失和法律执行费用),平台客户应另行全额赔偿不足部分。 # **3. 客户重大违规行为及相应处理规则** 经核查确认,客户存在违规转售 API 行为的,火山引擎有权立即封禁相关账号,并要求客户支付相当于保底协议约定的保底金额(若有) 或累计已产生的费用总额的 20% 的违约金。 # **4. 其他** 4.1 本规则所称 “封禁账号”,包括但不限于对相关账号 / 服务实施永久封禁、阶段性封禁、功能限制、暂停服务、终止服务等处理措施,火山引擎有权根据违规性质、情节严重程度及损害后果独立判断并选择适用。 4.2 本规则未明确约定的其他违约行为,不影响火山引擎依照法律法规及双方服务协议约定,向客户追究相应法律责任。 4.3 本规则的生效日期与服务协议的生效日期相同,如客户的确认时间晚于服务开通时间的,效力追溯至服务开通时间。服务协议的终止、中止不影响火山引擎根据本规则追究客户的违约责任。 --- # 方舟售后支持范围 Source: https://ark.volcengine.com/region:cn-beijing/docs/ark-after-sales-support-scope ## 一、火山引擎支持的服务范围包括 * 方舟控制台的使用咨询、资源创建及相关功能操作指导。 * 模型能力介绍、模型选型建议及基础使用问题答疑。 * 账号权限、资源用量、计费账单等平台相关问题咨询。 * API / SDK 参数说明、调用方式指导及常见调用异常排查。 ## 二、火山引擎支持的服务范围不包含 * 面向具体业务场景的 Prompt 设计、效果调优,以及通过多轮测试迭代达成特定业务效果的相关工作。 * 生成内容或生成画面的质量、风格、构图等定制化调整与效果优化。 * 第三方工具、开源工具在接入模型过程中产生的工具自身问题、调用链路问题、业务逻辑问题或流程编排问题。 * 面向具体业务场景的业务落地项目方案设计、开发实现、联调测试、调试优化及最终效果保障服务。 --- # ArkCLI 快速入门 Source: https://ark.volcengine.com/region:cn-beijing/docs/ark-cli Ark CLI 是火山方舟平台官方命令行工具,支持在本地终端快速完成认证与资源管理,并可将能力安装到常用 AI Agent 中,通过自然语言触发模型调用、推理接入点管理、内容生成与用量账单查询等操作。 # 快速开始 **环境要求:** Node.js >= 16 ## 1. 安装并登录 Ark CLI **选项:手动安装并登录** ### 安装 Ark CLI 在终端执行以下命令: ```Bash # 1. 通过 NPM 安装 npm install -g @volcengine/ark-cli # 2. 验证安装 arkcli --version ``` ### 登录 Ark CLI ```Bash # 登录方式 1:火山 SSO 浏览器登录 (推荐) arkcli auth login volc-sso # 登录方式 2:火山 SSO 无浏览器登录 / 远程终端登录 arkcli auth login --no-browser # 查看登录状态 arkcli auth status # 装 skill 到你常用的 AI Agent (Claude Code / Cursor / TRAE / Gemini CLI 等) arkcli +connect ``` **选项:通过 AI Agent 安装并登录** 将下方提示词复制给 AI Agent(Claude Code、Codex、Cursor、TRAE 等),它会自动完成安装。 ````Plaintext 根据下面命令帮我安装 Ark CLI:https://lf3-static.bytednsdoc.com/obj/eden-cn/psjryh/ljhwZthlaukjlkulzlp/intro/volc.md ```` > **注意** > > 如果需要卸载 Skill, 在终端执行命令:`arkcli +connect uninstall` ## 2. 使用 Ark CLI 配置完成后,重启 AI Agent 即可开始使用。可以直接在 AI Agent 用自然语言说出你的需求,可参考以下示例。 | 你想做什么 | 在 AI Agent 发送 | |-|-| | 查询模型 | 帮我看下 doubao / seedream 相关模型 | | 查询用量 | 看下这个账号今天 / 这周用了多少 token | | 查询账单 | 帮我查一下最近账单和费用明细 | | 查询套餐 | 看下当前 Agent Plan / Coding Plan 套餐和 seat 情况 | | 换 API key | 帮我给测试 profile 换一个可用 key | | 文本对话 | 用 doubao 模型回答一句:北京今天适合带伞吗 | | 图片理解 | 帮我描述这张图片里有什么 | | 文档理解 | 帮我抽取这个 PDF 的重点信息 | | 生成图片 | 生成一张柴犬在樱花树下奔跑的图片 | | 生成视频 | 生成一段 5 秒猫跳跃的视频 | | 验证图片或视频来源 | 帮我验证这张图片是否是 Seedream 生成的: https://arkdocs.tos-cn-beijing.volces.com/images/CodingPlan/ark-gen.jpeg | | 部署 Endpoint | 帮我部署一个测试 Endpoint,并告诉我怎么调用 | | 生成代码 | 给我一段 Python 调 seed 2.0 的代码 | | 清理资源 | 把刚才创建的测试 Endpoint / gen task / chat response 清理掉 | 在 Claude Code 中使用 Ark CLI 的示例如下: [视频](https://arkdocs.tos-cn-beijing.volces.com/videos/CodingPlan/arkcli.mov) # 核心能力 | 领域 | 能力说明 | 命令入口 | |-|-|-| | 认证与身份 | 支持登录方舟平台、查看认证状态、查看当前身份、生成与切换 API Key、多 Profile 切换与管理等。 | `arkcli auth`、`arkcli profile` | | 对话与推理 | 多模态对话、多轮对话、流式输出、思考相关参数调节等。 | `arkcli +chat` | | 图片/视频生成 | 文生图、图生图、文生视频、图生视频、参考素材生成等。 | `arkcli +gen` | | 多模态理解 | 支持对图片、文档、视频、音频等输入进行理解。 | `arkcli +understand` | | 模型发现 | 支持基础模型查询、模型搜索、模型详情、可用参数、可用资源查看等。 | `arkcli models` | | 推理资源与部署 | 支持创建推理接入点、查询、更新、启动、停止等能力,提供基于指定模型快速部署推理接入点。 | `arkcli infer`、`arkcli +deploy` | | 模型精调 | 支持创建与管理精调任务,覆盖 SFT、LoRA、DPO 及 RL 训练流程;提供数据校验、超参与费用预览,支持产物导出部署等。 | `arkcli train` | | Managed Agents | 管理 ARK Managed Agents,包括 Agent / Skill / Env / Session / File / Memory Store / Vault / MCP OAuth。 | `arkcli agent`| | 文档检索 | 支持检索方舟文档、按 URL 获取方舟文档内容、分页列出文档页面等。 | `arkcli docs` | | 用量统计 | 支持查询推理用量、免费额度或资源包余额、订阅套餐用量、分模型用量明细和团队席位用量。 | `arkcli usage` | | 账单与定价 | 支持查询Ark分账账单明细,并按账期、接入点、API Key 或产品维度拆账;支持查询模型价格与套餐价格。 | `arkcli billing`、`arkcli pricing` | | 套餐与席位 | 支持查询、购买和续费 Agent Plan / Coding Plan,查看套餐支持的模型,并管理个人或团队套餐。 | `arkcli plans` | | Agent 集成与接入 | 支持自动检测本机 AI Agent,并安装、查看或卸载 Ark CLI skills;提供多语言代码示例等。 | `arkcli +connect`、`arkcli +code-example` | | 诊断 | 统一诊断入口,覆盖业务侧诊断(账号、模型、接入点),验证图片与视频产物的来源特征。 | `arkcli doctor` | # 命令语法参考 Ark CLI 遵循以下命令结构: ```Bash # 快捷命令 arkcli + [flags] # 领域命令 arkcli [flags] # 领域快捷命令 arkcli + [flags] # 原始 API 调用 arkcli api --params '{...}' ``` 使用 `--help` 查看任意命令的详细用法: ```Bash arkcli --help arkcli +chat --help arkcli models search --help arkcli train finetune create --help ``` ## 全局标志 | Flag | 说明 | |-|-| | `--api-key ` | 覆盖默认的 API Key | | `--base-url ` | 自定义数据面 API Base URL | | `--debug` | 输出请求/响应调试信息 | | `--dry-run` | 预览模式,仅展示请求元信息,不实际执行 | | `--page-all` | 自动拉取所有分页数据 | | `--page-delay` | 翻页时的延迟,默认 200 毫秒。 | | `--page-limit ` | 配合 `--page-all` 使用,限制最大拉取页数(默认 10) | | `--profile ` | 指定使用的 Profile | | `--project-name ` | 覆盖当前 Project | | `--format json` | 输出格式指定为 JSON(默认) | | `--region ` | 覆盖当前 Region | | `--transform ` | 使用 GJSON 表达式对输出做数据处理 | --- # 身份与配置 Source: https://ark.volcengine.com/region:cn-beijing/docs/auth-and-configuration 身份与配置:登录认证、本地配置、无交互引导,以及贯穿所有命令的 Profile 身份切面。 - `auth` 管 SSO 登录/登出与 ARK API Key;`config` 管本地 profile 配置与 `update.mode` 策略; - `profile` 是 `type × region × project × owner_trn × api_keys` 五元组身份切面,是所有命令的配置中心来源; - `resources` 只读,把 Endpoint 解析为权威模型与模态,是 Skills 与 API Explorer 的校准基线。 ## auth 认证与凭证管理:SSO 登录、查看登录状态、退出登录、生成/重选 ARK API Key。 - `auth login` 是交互式入口;无浏览器环境用 `--no-browser` 两段式(先取 URL,再回贴 base64 code); - `auth login volc-sso` 是火山引擎 SSO 通道(0.1.16 起 SSO 登录自动绑定 profile 切面); - 凭证存储位置是实现细节,业务代码一律通过 profile 的 `cfg.APIKey` 读取,不要直接访问存储。 ### auth apikey 获取并配置 ARK API Key ```Bash arkcli auth apikey ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--key-id` | int64 | 指定要选择的 API Key ID(非交互模式用) | ### auth apikey create 创建并保存一把普通 ARK API Key ```Bash arkcli auth apikey create ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--yes` | bool | 跳过确认提示(非交互模式) | ### auth login 登录火山方舟平台(火山引擎) ```Bash arkcli auth login ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--code` | string | 无浏览器 Phase 2:把浏览器显示的 base64 授权码喂回以完成登录(agent/沙箱用) | | `--credential-store` | string | Broker verifier 存储后端:encrypted-file(默认,不访问 keyring)或 keyring(不可用时直接失败) | | `--login-mode` | string | 登录模式:auto(新链路失败时按错误类型降级)、legacy(仅旧链路)、broker(仅新链路) | | `--no-browser` | bool | 无浏览器模式:在任意设备完成 SSO 登录后手动粘贴授权码 | ### auth login volc-sso 通过火山引擎 SSO 登录 ```Bash arkcli auth login volc-sso ``` ### auth logout 清除已保存的登录凭证 ```Bash arkcli auth logout ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--reset-service-account` | bool | (保留) | ### auth status 查看当前登录状态 ```Bash arkcli auth status ``` ### auth whoami 查看当前已认证的身份 ```Bash arkcli auth whoami ``` ## config 本地配置管理入口。profile 创建、查看、切换与删除已迁移到 `profile` 域。 - 保留能力:`config reset`(清整个本地状态,破坏性)、`config set update.mode automatic|disabled`(更新策略)、`config lang`; - profile 归因、历史 yaml 排障等场景见 `profile` 域。 ### config lang get 打印当前生效的持久化 UI 语言 ```Bash arkcli config lang get ``` ### config lang set 持久化全局 UI 语言 ```Bash arkcli config lang set ``` ### config lang unset 清除持久化的 UI 语言,改用构建默认值 ```Bash arkcli config lang unset ``` ### config reset 删除所有本地配置文件 ```Bash arkcli config reset ``` ### config set 设置允许修改的全局配置项 ```Bash arkcli config set ``` ## profile Profile 是 arkcli 在控制面与数据面之间的**统一身份切面**:`type × region × project × owner_trn × api_keys` 五元组绑成一组,作为所有命令执行的配置中心来源。 - 常用操作:列出/查看/新建/切换/删除/重命名,管理 profile 内 API Key 列表与各类默认资源; - `profile project` 登录后重选 active project:project 相关 profile 重新派生,个人版 plan profile 原样保留,全程不换身份、不重登; - 首登 project 选择器含「账号全部资源」合成项(默认),表示不设定 ProjectName、按账号全量。 ### profile apikey get 打印某个 profile 的默认 API Key 明文(机器可读) ```Bash arkcli profile apikey get ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--profile` | string | Profile 名称(默认:当前激活 profile) | | `--plain` | bool | 只打印 key 本身,不带 JSON 外层结构 | ### profile create 新建 profile(交互式或行内参数) ```Bash arkcli profile create ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--name` | string | Profile 名称(默认:{type}_{region}_{project}) | | `--type` | string | Profile 类型:platform \| agent-plan \| coding-plan \| agent-plan-team \| coding-plan-team | | `--region` | string | 地域(默认:cn-beijing) | | `--project` | string | 项目名称(默认:default) | | `--default-api-key` | string | 要绑定的默认 API Key(可选) | | `--owner-trn` | string | Owner TRN(可选;自愈场景通常留空) | | `--plan-tier` | string | [仅套餐类型] 强制指定 PlanTier(agent-plan:small\|medium\|large\|max;coding-plan:lite\|pro);跳过 ListSubscribeTrade 的自动探测 | | `--set-default` | bool | 创建后把该 profile 设为默认 | | `--no-interactive` | bool | 跳过交互提示;缺少必填字段时立即失败 | ### profile delete 删除 profile(非交互场景需用 --yes 确认) ```Bash arkcli profile delete ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--yes` | bool | 跳过交互确认(适合内联执行) | ### profile apikey list 列出当前或指定 profile 中的 API Key(脱敏) ```Bash arkcli profile apikey list ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--profile` | string | Profile 名称(默认:当前激活 profile) | ### profile apikey refresh 从控制面重新拉取 API Key 列表并更新 profile ```Bash arkcli profile apikey refresh ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--profile` | string | Profile 名称(默认:当前激活 profile) | ### profile apikey use 按 1 起始的序号(来自 `apikey list`)或完整 Key 设置默认 API Key ```Bash arkcli profile apikey use ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--profile` | string | Profile 名称(默认:当前激活 profile) | ### profile list 列出全部 profile(标记出当前生效的) ```Bash arkcli profile list ``` ### profile models list 查看各模态的 PlanTier 与默认 Resources ```Bash arkcli profile models list ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--profile` | string | Profile 名称(默认:当前激活 profile) | ### profile models refresh 重新拉取文本模型列表,并更新 Resources.Text.Default(取第一个) ```Bash arkcli profile models refresh ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--profile` | string | Profile 名称(默认:当前激活 profile) | ### profile project 重新选择生效 project;会删除旧的 platform profile,并为新 project 新建一个 ```Bash arkcli profile project [] ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--yes` | bool | 跳过交互确认(适合内联执行) | ### profile rename 设置 profile 的显示名(可含中文与空格) ```Bash arkcli profile rename --to ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--to` | string(必填) | 展示名称(可含中文/空格;空字符串表示清除标签) | ### profile set-default 为当前生效 profile 的某个模态设置默认资源 ID ```Bash arkcli profile set-default ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--profile` | string | Profile 名称(默认:当前激活 profile) | | `--modality` | string | 模态:text \| image \| video | | `--skip-verify` | bool | 跳过内联校验(绕过控制面可用性检查) | ### profile show 查看 profile 详情(密钥脱敏,含推导出的 base_url) ```Bash arkcli profile show [profile] ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--profile` | string | Profile 名称(位置参数的替代写法) | ### profile use 切换后续所有命令使用的生效 profile ```Bash arkcli profile use [profile] ``` ## resources 实时控制面资源查询:列出当前/指定 profile 可见资源及其调用兼容性,并把 Endpoint 解析为权威模型、模态与候选工作流。 - 只读,不写 profile.yaml;拿到临时 `ep-...` 不确定该走 chat/understand/gen 时,先在本域 resolve; - 是 Skills 与 API Explorer 的校准基线:返回的模型绑定与模态信息即真实可调用的契约。 ### resources list 列出当前生效 profile 可用的资源(实时查询,不走缓存) ```Bash arkcli resources list ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--profile` | string | Profile 名称(默认:当前激活 profile) | | `--modality` | string | 模态:text \| image \| video | ### resources resolve 把 Endpoint 解析为它绑定的模型、模态、API 与候选工作流 ```Bash arkcli resources resolve ``` --- # 模型与套餐 Source: https://ark.volcengine.com/region:cn-beijing/docs/models-and-plans 模型与套餐:公共基础模型查询与激活、套餐购买与席位管理、单价查询,以及 IAM 辅助与平台文档检索。 - `models` 只负责公共基础模型(doubao 等);账号下的自定义模型(`cm-*`)走 `models custommodel`; - `plans` 管 Agent Plan / Coding Plan(个人版 + 企业版,含席位分配与 API Key 轮换);`pricing` 出折后单价与套餐订阅价; - `iam` 查询身份标识与项目列表,主要供诊断与首登 project 选择使用; - `docs` 在终端内检索方舟文档、API 契约与平台公告。 ## docs 火山方舟平台文档检索与阅读:搜索(`search`)、列表(`list`)、按 URL 获取正文(`get`)、API 文档枚举与 OpenAPI spec 拉取(`apis list/spec`)。 - 适合在终端内直接查模型接入文档、API 契约与平台公告,不用切到浏览器。 ### docs apis list 列出已发布的方舟 API ```Bash arkcli docs apis list ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--api-mcp-url` | string | 仅用于 apis list/spec 的 MCP 地址;也可配置 ARK_DOCS_API_MCP_URL,不改变 search/list/get 后端 | ### docs apis spec 按单一选择器读取一条已发布的方舟 OpenAPI 契约 ```Bash arkcli docs apis spec ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--api-mcp-url` | string | 仅用于 apis list/spec 的 MCP 地址;也可配置 ARK_DOCS_API_MCP_URL,不改变 search/list/get 后端 | | `--id` | string | 按目录中的唯一 id 过滤,例如 chat-ChatCompletions_create;与 --service / --api-path 互斥;公开目录推荐优先用它 | | `--service` | string | 按目录中的文件名分组过滤,例如 chat 或 endpoints;不是粗粒度服务标签。多数分组不唯一,命中多条时请改用 --id 或 --api-path。与 --id / --api-path 互斥 | | `--api-path` | string | 按目录中的真实路径过滤,例如 /api/v3/chat/completions 或 /?Action=ListEndpoints&Version=2024-01-01;与 --id / --service 互斥 | ### docs get 读取方舟文档正文 ```Bash arkcli docs get ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--outline` | bool | 只返回该文档已发布的标题大纲(id/level/title),不返回正文;用返回的 id 再配合 --section 精确取章节 | | `--section` | string | 仅读取指定章节(含子章节):精确标题或 #锚点ID;仅支持公共文档后端 | | `--compact` | bool | 正文只输出一份,保留引用和续读信息;不输出 chunks 和 raw_text | | `--snapshot` | string | 复用 get/list 返回的 snapshot,固定分页与续读版本 | | `--chunk-start` | int | 从第几个正文块开始读取(默认 0) | | `--chunk-count` | int | 返回正文块数量(默认 5);取值范围 1-50 | ### docs list 浏览方舟文档目录 ```Bash arkcli docs list ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--query` | string | 在已发布目录里按标题、描述、面包屑或路径本地过滤;搜索不可用时用它代替换词重试 | | `--snapshot` | string | 复用 get/list 返回的 snapshot,固定分页与续读版本 | | `--limit` | int | 每页文档数量(默认 10);取值范围 1-100 | | `--offset` | int | 目录起始位置(默认 0);公共文档翻页需携带 snapshot | ### docs search 搜索方舟文档 ```Bash arkcli docs search ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--top-k` | int | 返回结果数量(默认 5);取值范围 1-50 | | `--snapshot` | string | 复用 search 返回的 snapshot,固定候选集与排序后再翻页(有效期约 5 分钟) | | `--offset` | int | 搜索结果起始位置(默认 0);大于 0 时必须携带 --snapshot | ## iam 身份与访问管理辅助命令:查询当前身份标识(`userid`)、项目列表等 IAM 信息。 - 主要供诊断与首登 project 选择使用;日常业务命令的 project 归属由 profile 切面自动处理,不需要手工指定。 ### iam userid 按用户名前缀解析 IAM UserID(省略 --username 时返回当前身份的 UserID) ```Bash arkcli iam userid ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--username` | string | 逗号分隔的待查用户名前缀(例如 ivan,bob);省略则返回当前身份的 UserID | ## models 火山公共基础模型(如 doubao 系列)查询与激活:列表、搜索、详情,以及显式要求的开通/激活计费项(`activate`)。 - 只负责**公共基础模型**;账号下的自定义模型(cm-*)走 `models custommodel` 子域; - 激活 ≠ 部署:`activate` 只是开通计费项,创建可调用的 Endpoint 请走 `+deploy` 或 `infer` 域; - 性能敏感选型可参考 TTFT/TPOT 排名与输入长度对比。 ### models activate 开通基础模型计费项——封装 OpenModelChargeItem ```Bash arkcli models activate ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--sub-services` | string_slice | 要开通的子服务: base \| context-cache \| fast-infer(逗号分隔;默认仅开通 base) | | `--yes` | bool | 跳过 [Y/N] 确认提示(非交互) | ### models custommodel available-quantizations 列出某个自定义模型可用的量化模式 ```Bash arkcli models custommodel available-quantizations ``` ### models custommodel delete 从模型仓库中删除自定义模型(不可逆;需确认,或用 --yes 跳过) ```Bash arkcli models custommodel delete ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--yes` | bool | 确认删除 | ### models custommodel get 查看自定义模型详情(底座模型、量化、状态、生效中的接入点) ```Bash arkcli models custommodel get ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--transform` | string_slice | 要包含的字段:id,name,active_endpoints,artifact_types | ### models custommodel list 列出账号模型仓库中的自定义模型,支持按底座模型、训练类型、状态与来源过滤 ```Bash arkcli models custommodel list ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--search` | string | 按名称、id 或基础模型展示名模糊搜索自定义模型 | | `--page` | string | 分页参数,格式 ,例如 1,10 | | `--base-models` | string_slice | 按基础模型名称过滤,逗号分隔或重复传入 | | `--base-model-ids` | string_slice | 按基础模型 ID 过滤,逗号分隔或重复传入 | | `--customization-types` | string_slice | 按训练类型过滤:lora,sft,dpolora,dpo,grpolora,grpo,ppo,opdlora,opd,pretrain | | `--supported-customization-types` | string_slice | 按支持这些训练类型的基础模型过滤 | | `--source-jobs` | string_slice | 按模型定制任务 id 过滤 | | `--statuses` | string_slice | 按状态过滤:preparation,processing,ready,failed,exporting,exportfailed | | `--sources` | string_slice | 按来源过滤:import,customization | | `--mine` | bool | 只包含当前 SSO 子用户创建的自定义模型 | | `--sort-by` | string | 排序字段,默认 CreateTime | | `--sort-order` | string | 排序方向:asc \| desc(默认:desc) | ### models custommodel quantize 按指定量化模式为自定义模型创建量化变体 ```Bash arkcli models custommodel quantize ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--quantization` | string(必填) | 量化模式 | | `--description` | string | 量化后自定义模型的描述,最长 300 字符 | ### models custommodel update 重命名自定义模型或更新其描述 ```Bash arkcli models custommodel update ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--name` | string | 新的自定义模型名称 | | `--description` | string | 新描述,最长 300 字符 | ### models custommodel upload 从 veTOS 产物导入自定义模型到模型仓库(需要底座模型、量化模式与名称) ```Bash arkcli models custommodel upload ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--tos` | string(必填) | veTOS URI:tos:/// | | `--base-model` | string(必填) | 底座模型 ID,例如 doubao-xxx-260515 | | `--name` | string(必填) | 自定义模型名称 | | `--quantization` | string(必填) | 量化模式 | | `--description` | string | 描述,最长 300 字符 | ### models finetune-config 获取某个模型版本权威的精调超参数 schema。按训练类型返回 Parameters[],每项含 Name/DefaultValue/Min/Max/Description。请在 `train finetune create` 之前用它确认正确的字段名(GRPO 用 lr+num_steps,SFT 用 learning_rate+epoch 等)。 ```Bash arkcli models finetune-config [version] ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--model` | string | 基础模型名称,如 doubao-seed-1-6(也可作为第一个位置参数传入) | | `--version` | string | 模型版本,如 250615(也可作为第二个位置参数传入)。留空 = 取 API 返回的第一个版本 | | `--type` | string | 只查一种定制类型:sft \| lora \| dpo \| dpo-lora \| grpo \| grpo-lora \| ppo \| opd \| opd-lora \| pt。留空 = 所有有数据的类型 | ### models get 获取可见模型详情、价格与限流信息 ```Bash arkcli models get [version] ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--id` | string | 模型标识,例如 doubao-seed-2-0-pro-260215(也可用位置参数传入) | | `--version` | string | 可选的模型版本覆盖,如 260215(也可用位置参数传入) | | `--no-cache` | bool | 绕过本地 CardView 与 ArkModels 元数据缓存 | ### models list 列出基础模型(支持过滤与分页) ```Bash arkcli models list ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--modality` | string | 按模态过滤:text \| image \| video \| audio \| embed | | `--name` | string | 按模型名称过滤(不区分大小写的子串匹配;更丰富的过滤请用 `models search`) | | `--page-number` | int | 页码(>=1) | | `--page-size` | int | 每页条数 | | `--sort-by` | string | 排序字段:CreateTime \| UpdateTime \| Name(也接受 create_time / update_time / name) | | `--sort-order` | string | 排序方向:Asc \| Desc(也接受 asc / desc) | | `--no-cache` | bool | 绕过本地 CardView 缓存,实时拉取可见模型 | ### models performance input-length 比较指定模型在不同输入长度下的 TTFT 或 TPOT ```Bash arkcli models performance input-length ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--metric` | string | 性能指标:ttft、tpot 或 all | | `--thinking` | bool | 包含思考与思考摘要生成耗时(默认 false) | | `--time-window` | string | 统计窗口:1h、6h、24h、3d、7d 或 30d | | `--model` | string_slice | 必填精确模型选择器 name@version:deployment;可重复 | | `--input-lengths` | string_slice | 输入长度桶:1k、10k、50k、100k;可重复或逗号分隔 | ### models performance rank 按 TTFT 或 TPOT 对基础模型进行性能排名 ```Bash arkcli models performance rank ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--metric` | string | 性能指标:ttft、tpot 或 all | | `--thinking` | bool | 包含思考与思考摘要生成耗时(默认 false) | | `--time-window` | string | 统计窗口:1h、6h、24h、3d、7d 或 30d | | `--input-length` | string | 输入长度桶:1k、10k、50k 或 100k | | `--keyword` | string | 按模型名或展示名筛选 | | `--deployment` | string_slice | 部署方式:default 或 fast;可重复或逗号分隔 | | `--top` | int | 每个指标返回的模型数量(1-50)(默认 10) | | `--order` | string | 排序方向:asc 或 desc | | `--compare` | string | 对比方式:default-deployment 或 none | ### models performance trend 查看指定模型的 TTFT 或 TPOT 延迟趋势 ```Bash arkcli models performance trend ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--metric` | string | 性能指标:ttft、tpot 或 all | | `--thinking` | bool | 包含思考与思考摘要生成耗时(默认 false) | | `--time-window` | string | 统计窗口:1h、6h、24h、3d、7d 或 30d | | `--input-length` | string | 输入长度桶:1k、10k、50k 或 100k | | `--model` | string_slice | 必填精确模型选择器 name@version:deployment;可重复 | | `--max-points` | int | 向服务端请求的最大数据点数(默认 12) | ### models search 按关键词 + 结构化条件检索模型(模态、上下文长度、能力) ```Bash arkcli models search [keyword] ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--keyword` | string | 检索关键词(也可用位置参数传入) | | `--size` | int | 最多返回的结果数;0 = 不截断(默认) | | `--modality` | string | 粗粒度模态过滤:text\|image\|video\|audio(output-modality 的别名) | | `--input-modality` | string | 按输入模态过滤(逗号分隔,例如 text,image,video) | | `--output-modality` | string | 按输出模态过滤(逗号分隔) | | `--multimodal` | bool | 仅返回支持多种输入模态的模型 | | `--min-context-window` | int | context_window 下限(Token,例如 200000) | | `--max-context-window` | int | context_window 上限(Token) | | `--min-input-tokens` | int | max_input_tokens 下限 | | `--min-output-tokens` | int | max_completion_tokens 下限 | | `--capability` | string_slice | 要求具备的能力(重复传入为 AND 关系):thinking\|mcp\|functioncall\|web_browsing\|knowledge_base\|response_format\|reasoning_effort;caching 已废弃,请改用 --cache-type explicit_cache | | `--cache-type` | string_slice | 要求命中的缓存类别(重复传入为 AND 关系):explicit_cache\|implicit_cache\|session_cache\|prefix_cache | | `--strict-filter` | bool | 丢弃缺少补充数据的模型,而不是保留(默认:保留) | | `--include-deprecated` | bool | Include shutdown/已下线 (lifecycle_status=Shutdown 或 display_name 含'废弃/下线') 模型,默认过滤 | | `--refresh-cache` | bool | 搜索前强制同步刷新 ArkModels 元数据缓存 | ### models versions 列出基础模型对用户可见的版本及各版本 ActiveConfigurationId(作为 `models finetune-config` 的输入) ```Bash arkcli models versions ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--model` | string | 基础模型名称,如 doubao-seed-1-6(也可用位置参数传入) | ## plans ARK 套餐(Agent Plan / Coding Plan,个人版 + 企业版)管理:查询持有、购买、续费、模型清单、API Key 轮换;企业版含完整席位管理(seat-list / seat-assign / rotate-apikey)。 - 购买参数会逐步澄清,避免误购;`payment_failed` 提供 Order ID 后回到已有订单补单/取消,不会重新下单; - 注意与 platform profile 区分:Token 额度包/资源包仍走 platform profile + `/api/v3`,不因“套餐”字样误入本域。 ### plans buy 购买 Agent Plan / Coding Plan 套餐(个人版 + 企业版),默认开启自动续费 ```Bash arkcli plans buy ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--plan` | string(必填) | 套餐名称:agent-plan \| coding-plan \| agent-plan-team \| coding-plan-team | | `--type` | string(必填) | 档位:small / medium / large / max(agent-plan*)\| lite / pro(coding-plan*) | | `--duration` | int | 订阅时长(月,1-12,默认 1) | | `--quantity` | int | 席位数量(*-team 套餐必填) | | `--estimate` | bool | 只做在线价格试算,不下单 | | `--yes` | bool | 确认协议并真正下单;不带该参数时只返回协议 URL 供用户查看 | ### plans get 查看当前账号持有的 Agent Plan / Coding Plan 套餐(个人版 + 企业版)——名称与档位状态 ```Bash arkcli plans get ``` ### plans harness-status 查看本机各 AI Agent(claude-code / codex / opencode / openclaw / trae)上内置 Agent Plan MCP 的安装状态 ```Bash arkcli plans harness-status [agent] ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--scope` | string | (仅 Trae)读取范围:global(默认)\| project(当前目录 ./.trae/mcp.json) | | `--codex-config-scope` | string | (仅 Codex)读取范围:profile(默认,~/.codex/arkcli.config.toml)\|global(~/.codex/config.toml) | | `--codex-profile` | string | (仅 Codex profile 模式)Codex profile 名,默认 arkcli | ### plans model-apply 设置套餐 ark-code-latest 的路由目标(auto 或指定某个影子模型) ```Bash arkcli plans model-apply ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--plan` | string | 套餐名称:agent-plan \| coding-plan \| agent-plan-team \| coding-plan-team(默认:agent-plan-team) | | `--model` | string | 路由目标:模型 id、输出名或 "auto";非交互模式必填 | ### plans model-list 列出某套餐支持的模型,以及当前 ark-latest-model(默认 agent-plan-team) ```Bash arkcli plans model-list ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--plan` | string | 套餐名称:agent-plan \| coding-plan \| agent-plan-team \| coding-plan-team(默认:agent-plan-team) | ### plans personal rotate-apikey 轮换(重新生成)Agent Plan 个人版 API Key——旧 Key 立即失效 ```Bash arkcli plans personal rotate-apikey ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--yes` | bool | 跳过 [Y/N] 确认提示(非交互) | ### plans renew 续费已有的 Agent Plan / Coding Plan 套餐(个人版 + 企业版),默认开启自动续费 ```Bash arkcli plans renew ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--plan` | string(必填) | 套餐名称:agent-plan \| coding-plan \| agent-plan-team \| coding-plan-team | | `--duration` | int | 续费时长(月,1-12,默认 1) | | `--seat-ids` | string | 逗号分隔的待续费席位 ID(*-team 套餐必填,例如 seat-001,seat-002) | | `--estimate` | bool | 只做在线续费价格试算,不下单 | | `--yes` | bool | 确认协议并真正续费下单;不带该参数时只返回协议 URL 供用户查看 | ### plans team rotate-apikey 轮换(重新生成)Agent Plan / Coding Plan 企业版席位 API Key——旧 Key 立即失效 ```Bash arkcli plans team rotate-apikey ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--seat-ids` | string | 管理员批量轮换用逗号分隔的席位 ID;省略则轮换自己的 agent-plan-team 席位 | | `--yes` | bool | 跳过 [Y/N] 确认提示(非交互) | ### plans team seat-assign 把企业版套餐席位分配(绑定)给子用户;重复传 --bind 可批量分配 ```Bash arkcli plans team seat-assign ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--plan` | string(必填) | 套餐名称:agent-plan-team \| coding-plan-team | | `--bind` | string_slice(必填) | 席位与用户的绑定关系(可重复)。格式:--bind seat-001=user-123,或 --bind seat-001=user-123:user-name(跳过 IAM 查询) | | `--project-name` | string | 项目名称(默认:default) | ### plans team seat-list 按条件列出企业版套餐席位(Agent Plan Team / Coding Plan Team) ```Bash arkcli plans team seat-list ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--plan` | string(必填) | 套餐名称:agent-plan-team \| coding-plan-team | | `--type` | string | 档位过滤:small/medium/large/max(agent-plan-team)\| lite/pro(coding-plan-team) | | `--seat-ids` | string | 逗号分隔的席位 ID(最多 1000 个),例如 seat-001,seat-002 | | `--user-name` | string | 按绑定的子用户名称过滤 | | `--seat-status` | int | 席位绑定状态:1=Idle,2=Active | | `--billing-status` | int | 计费状态:1=待生效,2=生效中,3=已过期,4=已回收 | | `--project-name` | string | 项目名称(默认:default) | | `--page-number` | int | 页码(>=1) | | `--page-size` | int | 每页条数 | ## pricing 查询基础模型结算单价(含当前账号折扣)与 AgentPlan/CodingPlan 套餐订阅价格。 - `Price` 是后端按账号合同/活动/套餐折后的最终单价,`OriginalPrice` 是公示原价; - 适用场景:模型选型前的成本估算、套餐价值评估、不同模态价格对比。 ### pricing models 列出基础模型计费价目(Price 为当前账号折后的实际单价) ```Bash arkcli pricing models ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--model` | string | 只查单个基础模型名称(如 doubao-seed-1-6)或自定义模型 id(cm-*);cm-* 会自动解析到其基础模型,响应中带 resolved_custom_model 字段 | | `--modality` | string | 按 FoundationModelDomain 过滤(后端枚举):LLM \| ComputerVision \| Audio \| Embedding \| Router | | `--region` | string | 价格地域(如 cn-beijing);默认取当前 profile 的地域 | | `--page-number` | int | 页码(从 1 开始,默认 1) | | `--page-size` | int | 每页条数(默认 50) | ### pricing plans 列出 AgentPlan 与 CodingPlan 的订阅价格(个人版与企业版) ```Bash arkcli pricing plans ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--plan` | string | 只查单个套餐 id,例如 agent-plan-personal-small | | `--product` | string | 按产品过滤:agent-plan \| coding-plan | | `--edition` | string | 按版本过滤:personal \| enterprise | --- # 对话与生成 Source: https://ark.volcengine.com/region:cn-beijing/docs/chat-and-generation 数据面工作流与它们的记录管理:对话、生成、多模态理解三条 `+` 工作流,以及对应会话/任务记录的事后查询。 - 开放式对话走 `+chat`,明确产出形态的理解任务走 `+understand`,生成任务走 `+gen`; - `chat` / `gen` 是数据面产物的事后管理域(`get` / `list` / `delete`),本身不发起新的调用; - 三条工作流都支持临时 API Key / Base URL / Endpoint 免配置执行,脚本与 CI 场景可复现。 ## +chat 通过 Responses API 实现多模态对话、多轮对话、流式输出,支持临时 API Key、Base Url、Endpoint 免配置执行。 ```Bash arkcli +chat ``` 示例: ```Bash arkcli +chat "用三句话介绍你自己" ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--model` | string | 模型名称或 Endpoint ID。不传时,默认使用当前 Profile 中的文本模型默认资源。 | | `--input` | string_slice | 输入素材引用,例如 `@photo.jpg`。传入多个文件时,可重复使用该参数。 | | `--stream` | bool | 开启流式输出。 | | `--previous-response-id` | string | 基于上一轮响应 ID 继续对话。 | | `--instructions` | string | 在提示词前追加系统级指令。 | | `--temperature` | string | 设置采样温度,例如 `0.7`。 | | `--top-p` | string | 设置核采样参数 `top_p`,例如 `0.9`。 | | `--max-output-tokens` | int | 设置模型回复的最大输出 token 数。 | | `--store` | bool | 保存本次响应,以便后续通过 `--previous-response-id` 继续对话。 | | `--reasoning-effort` | string | 推理深度:minimal \| low \| medium \| high | | `--tools` | string_slice | 按类型快速指定工具,例如 --tools web_search;多个可重复。function 工具请用 --tools-file。 | | `--tools-file` | string | 存放 tools 数组的 JSON 文件路径(完整 SDK 结构)。在 --tools 条目之后合并。 | | `--tool-choice` | string | 工具调用策略:auto \| required \| none | | `--max-tool-calls` | int | 每轮最多允许的工具调用次数 | | `--caching` | string | 服务端提示词缓存:enabled \| disabled | | `--cache-prefix` | bool | 开启 prefix-cache 模式(仅在 --caching 开启时有意义) | | `--thinking` | string | 内部推理:auto \| enabled \| disabled | | `--expire-at` | int | 已保存响应的回收时间戳(epoch 秒;仅在 --store 时有意义) | | `--include-events` | bool | 仅流式模式:把每个 SDK 事件以一行 NDJSON 输出到 stdout,替代人类可读文本 | | `--text-format` | string | 输出格式:text \| json_object \| json_schema | | `--text-schema` | string | JSON Schema 文件路径(--text-format=json_schema 时必填) | | `--text-schema-name` | string | 附加到 JSON schema 的名称(默认:arkcli_response) | | `--text-strict` | bool | 强制严格遵循 schema(仅在 --text-format=json_schema 时有效) | | `--no-progress` | bool | 关闭非流式调用期间周期性打印到 stderr 的心跳 | ## +gen 根据提示词生成素材(图片直接内联返回;视频立即返回任务 ID,加 --wait 可阻塞到视频生成完成) ```Bash arkcli +gen ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--model` | string | 生成模型名称或 Endpoint ID(省略时取当前 profile 的 Resources..Default) | | `--modality` | string | 显式指定生成模态:image \| video(--model 传 Endpoint ID 时必填;--model 也省略时默认 image) | | `--input` | string_slice | 引用素材;多个可重复传入。可用 @ 前缀的本地路径,或 http(s)/file/tos URL。可选角色前缀 first:/last:/ref:/none: | | `--name` | string | 可选的任务名覆盖 | | `--version` | string | 模型版本覆盖 | | `--size` | string | 图片输出尺寸 | | `--image-count` | int | 生成图片数量(图片任务;大于 1 会启用顺序自动生成) | | `--n` | int | --image-count 的别名(图片任务);两者同时设置时以本参数为准 | | `--resolution` | string | 素材分辨率 | | `--duration` | int | 视频时长(秒) | | `--frames` | int | 视频帧数(在支持的模型上会覆盖 duration) | | `--seed` | int | 确定性生成的随机种子 | | `--watermark` | bool | 是否添加水印 | | `--generate-audio` | bool | 是否生成同步音频 | | `--guidance-scale` | string | 无分类器引导系数(图片任务;浮点数,例如 7.5) | | `--optimize-prompt` | bool | 是否启用服务端提示词优化(图片任务) | | `--output-format` | string | 图片输出格式:jpeg \| png | | `--response-format` | string | 图片响应格式:url \| b64_json(图片任务;服务端默认 url) | | `--prompt-thinking` | string | 提示词优化思考模式:auto \| enabled \| disabled(图片任务;仅在设置 --optimize-prompt 时生效) | | `--prompt-mode` | string | 提示词优化模式:standard \| fast(图片任务) | | `--sequential` | string | 顺序生成图片:auto \| disabled。留空则保持 arkcli 的自动 auto 模式(--image-count > 1 时);传 disabled 可强制单图生成,即使 --image-count > 1 | | `--ratio` | string | 覆盖输出宽高比,如 16:9 / 9:16 / 1:1(视频任务) | | `--camera-fixed` | bool | 锁定虚拟相机(视频任务) | | `--return-last-frame` | bool | 在返回最终视频的同时返回最后一帧 URL(视频任务) | | `--draft` | bool | 草稿模式:更快更便宜,质量更低(视频任务) | | `--service-tier` | string | 服务等级覆盖(视频任务) | | `--safety-id` | string | 调用方提供的安全标识(视频任务) | | `--execution-expires-after` | int | 服务端任务存活时间(秒,视频任务) | | `--priority` | int | 调度优先级 0-9,越大越早(视频任务;受各模型 supported_params 限制) | | `--callback-url` | string | 接收任务生命周期事件 POST 的 URL(视频任务;created/running/succeeded/failed) | | `--wait` | bool | 阻塞直到视频任务结束再返回(视频任务;默认 false——立即提交并返回 task id,之后用 'arkcli gen get ' 异步轮询) | | `--extra-body` | string | 前向兼容的 JSON 对象,其键会合并进顶层请求体,例如 --extra-body '{"new_field":"value"}'(视频任务) | | `--tools` | string_slice | 启用工具;目前支持 web_search。可重复。 | | `--stream` | bool | 以 NDJSON 流式输出图片生成帧(仅图片任务);每行是一个 image_generation.* 事件 JSON | | `--save-to` | string | 本地保存生成素材的目录(默认:当前目录;传 --save-to="" 关闭)(默认 .) | | `--force` | bool | 跳过逐模型的 supported_params 校验,按原样提交(模型目录过期时的逃生口) | | `--open` | bool | 下载完成后用系统默认应用打开生成的素材。默认 auto:仅当 stdout 是交互终端(人手动执行)时打开,agent/管道/CI 下保持安静。传 --open 强制开启,--no-open 强制关闭。 | | `--no-open` | bool | 即使在交互终端下也不自动打开生成的素材(覆盖 auto/--open 默认行为)。 | ## +understand 多模态理解(图片 / 文档 / 视频):由 Responses API 上的子技能实现;省略子技能时按 --input 的模态自动路由 ```Bash arkcli +understand [prompt] ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--input` | string_slice | 输入素材,例如 @photo.jpg;可重复传入。本地图片 / 视频 / 文档会自动上传。 | | `--model` | string | 覆盖子技能默认模型(名称或 Endpoint ID) | | `--stream` | bool | 增量流式输出响应 | | `--system-prompt-override` | string | 完全替换子技能内置的 system 提示词 | | `--system-prompt-append` | string | 在子技能内置 system 提示词之后追加额外指令 | | `--temperature` | string | 采样温度(浮点数,如 0.7) | | `--top-p` | string | 核采样 top_p(浮点数,如 0.9) | | `--max-output-tokens` | int | 回复的最大输出 Token 数 | | `--reasoning-effort` | string | 推理深度:minimal \| low \| medium \| high | | `--thinking` | string | 内部推理:auto \| enabled \| disabled | | `--store` | bool | 持久化该响应,便于之后取回 | | `--no-progress` | bool | 关闭非流式调用期间周期性打印到 stderr 的心跳 | | `--timeout` | string | 本地文件准备与推理的最长耗时(例如 2m 或 10m) | ## chat 对话会话记录管理:`chat get` 查看历史会话、`chat delete` 删除、`chat list-input-items` 列出会话输入项。 - 数据面产物:记录由 `+chat` 等 Responses API 调用产生,本域负责事后查询与清理; - 只读为主,删除操作有确认闸门。 ### chat delete 按 ID 删除已保存的响应 ```Bash arkcli chat delete ``` ### chat get 按 ID 获取已保存的响应 ```Bash arkcli chat get ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--include` | string_slice | include 提示(image_url\|audio_url\|encrypted_content);多个可重复传入。注意:SDK 与后端版本可能不一致——当前线上在某些账号下不接受任何文档中的取值;若遇到 `Invalid value for 'include'`,直接去掉该参数即可 | ### chat list-input-items 分页列出某个已保存响应的输入项 ```Bash arkcli chat list-input-items ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--after` | string | 游标:列出该条目 ID 之后的数据 | | `--before` | string | 游标:列出该条目 ID 之前的数据 | | `--limit` | int | 分页大小(1-100,服务端默认 20) | | `--order` | string | 排序方向:asc \| desc(服务端默认 desc) | | `--include` | string_slice | include 提示(image_url\|audio_url\|encrypted_content);多个可重复传入。注意:SDK 与后端版本可能不一致——当前线上在某些账号下不接受任何文档中的取值;若遇到 `Invalid value for 'include'`,直接去掉该参数即可 | ## gen 生成任务记录管理:`gen get` 查询任务详情与结果、`gen list` 列出历史任务、`gen delete` 删除记录。 - 任务由 `+gen` 工作流产生,本域负责事后查询、取回与清理; - 视频任务异步执行,轮询状态直到出图/出片完成。 ### gen delete 按 ID 删除异步内容生成任务(非交互场景必须用 --yes 确认) ```Bash arkcli gen delete ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--yes` | bool | 跳过交互确认(适合内联执行) | ### gen get 按 ID 获取异步内容生成任务(任务成功后自动下载素材) ```Bash arkcli gen get ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--save-to` | string | 任务成功后本地保存素材的目录(默认:当前目录;传 --save-to="" 关闭)(默认 .) | | `--open` | bool | 用系统默认应用打开下载的素材。默认 auto:仅在交互终端下打开,agent/管道/CI 下保持安静。传 --open 强制开启,--no-open 强制关闭。 | | `--no-open` | bool | 即使在交互终端下也不自动打开下载的素材(覆盖 auto/--open 默认行为)。 | ### gen list 分页列出异步内容生成任务(视频 / 3D / 后续模态) ```Bash arkcli gen list ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--page-num` | int | 页码,从 1 开始;省略时使用服务端默认值 | | `--page-size` | int | 每页条数;省略时使用服务端默认值 | | `--status` | string | 按任务状态过滤:succeeded \| failed \| running \| queued \| cancelled | | `--model` | string | 按模型名称或 Endpoint ID 过滤 | | `--service-tier` | string | 按服务等级覆盖项过滤 | | `--task-id` | string_slice | 按任务 ID 过滤;多个可重复传 | --- # 用量与诊断 Source: https://ark.volcengine.com/region:cn-beijing/docs/usage-and-diagnostics 用量、账单与诊断:推理量、结算金额,以及健康检查与错误码归因。 - `usage` 出推理量(近实时,5-30 分钟延迟),`billing` 出结算金额(T+1 财务口径),两者不可混用; - 遇到报错先用 `doctor error` 做错误码归因,再按建议分流到对应域; - `doctor` 还覆盖接入点 / 模型 / 指标专项诊断与 Ark 媒体来源特征验证。 ## billing 查询火山引擎 ARK **拆分账单明细**(结算金额、Token 用量计费),按账期月、月范围、Endpoint、API Key、产品编码等维度过滤。 - 账单是财务口径:T+1 出账、按结算金额聚合,和 `usage` 域的近实时推理量是两个数据源; - 适用场景:对账、按 EP / API Key 拆账、按产品拆账、月度成本复核。 ### billing list 列出 ARK 拆分账单明细(结算金额 × Token 用量),支持按账期月或月范围查询。默认按账号维度统计 ARK 账单(Product 自动锁定为 ARK 系列,排除 ark_subscription);传 --endpoint/--apikey/--apikey-sid 可下钻,传 --split-dim 可按维度拆分账号级汇总,传 --product 可覆盖或扩展产品集合。 ```Bash arkcli billing list ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--start` | string(必填) | 单个账期月,格式 YYYY-MM(最早 24 个月前)。单独使用即单月;与 --end 搭配表示区间。必填。 | | `--end` | string | 区间结束月份,格式 YYYY-MM(含当月)。省略则只查单月。区间最长 24 个月。 | | `--day` | string | 在 --start 内定位到某个 YYYY-MM-DD(上游的性能提示)。需要 --interval=day 或 --interval=detail;与 --end 区间不兼容 | | `--interval` | string | 聚合粒度:month(默认)\| day \| detail | | `--endpoint` | string | 只统计指定 Endpoint ID(ep-...)。与 --apikey/--apikey-sid 互斥。 | | `--apikey` | string | 按 API Key 值过滤(ark-...);shortcut 会通过 arkbff 自动解析为 apikey SID。与 --endpoint/--apikey-sid 互斥。 | | `--apikey-sid` | string | 按 API Key SID 过滤(apikey-{ts}-{xxx},来自 `arkcli api apikey.list`)。跳过 arkbff 解析。与 --endpoint/--apikey 互斥。 | | `--split-dim` | string | 按维度拆分账号级账单:apikey \| endpoint。留空 = 账号级汇总(默认)。设置 --endpoint/--apikey/--apikey-sid 时必须与隐含维度一致。 | | `--product` | string_slice | 按火山引擎产品编码过滤(可重复)。省略则查看全部产品;返回行的 Product 字段会告诉你该账号实际可用的编码。 | | `--project` | string_slice | 按项目 ID 过滤(可重复)。未设置时默认使用 profile 选定的项目(仅当 profile 无项目 / 为 'account-wide' 时跳过);传 --project= 清空,或 --project 覆盖。 | | `--instance-no` | string | 只统计指定计费实例 ID | | `--bill-category` | string_slice | 按账单类型过滤(可重复):consume-use、consume-new、consume-renew、consume-formalize、consume-modify、consume-trial、refund-terminate、refund-modify、transfer-manual、transfer-system | | `--billing-mode` | string_slice | 按计费模式过滤(可重复):1(订阅)\| 2(按量)\| 3(合同)\| 4(履约) | | `--ignore-zero` | bool | 跳过折后单价为 0 的计费项 | | `--mine` | bool | 只统计归属于当前 SSO 子用户所有资源的账单。配合 --mine-by 选择归集维度。订阅 / 账号级账单因没有 IAM 归属会被排除。与 --endpoint/--apikey/--apikey-sid/--split-dim 互斥。 | | `--mine-by` | string | --mine 的口径:endpoint(默认,即“基础设施归属”——我部署的 Endpoint 上的全部花费,不论调用方是谁)\| apikey(费用因果——由我的 API Key 产生的账单)。两种口径互不重叠、不能相加:endpoint 按使用了哪套基础设施归集,apikey 按谁付费归集。默认与 usage stats 的 --mine-by 对齐。 | | `--limit` | int | 分页模式:每次请求最多返回 N 行(1-300)。在多路扇出(--end / --mine)时按每路生效;总返回量 ≤ limit × 扇出路数。求和前请务必检查 is_truncated 与 partial_failures 摘要。 | | `--offset` | int | 分页模式:每次请求跳过 N 行。循环 offset += limit 直到 offset >= total_records(单路扇出),多路扇出请用 shell 循环。 | | `--output` | string | 将完整 Output(items + summary + partial_failures)以 JSON 写入 FILE;stdout 只显示元信息(不含 items)。会自动把内部分页上限提到 1000(30 万行),便于大账号一次性导出完整明细;用户传的 --page-limit=N 仍然优先。 | ## doctor 运行 CLI 健康检查(安装 / 连通性 / 配置) ```Bash arkcli doctor ``` ### doctor +verify-origin 验证 1-20 个图片或视频是否包含 Ark 生成来源特征 ```Bash arkcli doctor +verify-origin [media-url...] ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--query-id` | string_slice | 恢复已有验证 QueryID,不创建新任务;可重复传入,最多 20 个 | | `--timeout` | string | 整批执行最长等待时间,例如 2m 或 10m(默认 2m0s) | | `--yes` | bool | 在已阅读价格后,对本批全部媒体仅确认一次并创建所有验证任务 | ### doctor account 诊断当前账号(身份 / 实名 / 余额 / IAM / VMP / TOS) ```Bash arkcli doctor account ``` ### doctor error 诊断 Ark 错误码并跳转到对应的修复指引 ```Bash arkcli doctor error ``` ### doctor infer-endpoint 诊断推理接入点(状态、模型、用量、配额压力) ```Bash arkcli doctor infer-endpoint ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--auto-bind` | bool | VMP 订阅 + SLR 都已开通但 telemetry 未绑定 VMP workspace 时, 自动建 ark_default + 绑 ark telemetry (订阅 / SLR 缺失时仍只给云产品开通页跳转链接, 不会替用户开通) | | `--window` | string | 回溯窗口,Go duration 语法(如 1h、24h;time.ParseDuration 不支持 '7d') | ### doctor metrics 查询 VMP 中具名的 PromQL 指标(由 catalog 驱动) ```Bash arkcli doctor metrics ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--auto-bind` | bool | VMP 未绑定 workspace 时自动建 ark_default + 绑 ark telemetry (订阅 / 跨服务授权缺失时仍给 LinkOpenMgmtCloudProduct 链接, 不会替用户开通) | | `--filter` | stringArray | 注入额外的标签匹配器(可重复,label=value);模板必须声明 ${@filters} 指令(默认 []) | | `--format` | string | 输出形态(仅限裸写法 'metrics '——list/describe 始终输出 json):json \| scalar \| table | | `--param` | stringArray | 绑定目录参数(可重复,key=value)(默认 []) | | `--step` | string | 采样步长(Go duration;默认 = window/60,限制在 [10s,60s]) | | `--window` | string | 回溯窗口(Go duration;不支持 '7d')(默认 1h) | | `--workspace-id` | string | VMP workspace UUID(默认:通过 ark telemetry 配置自动解析) | ### doctor metrics describe 查看某个 catalog 条目的完整元数据(仅支持 json 输出) ```Bash arkcli doctor metrics describe ``` ### doctor metrics list 列出 catalog 中全部具名 PromQL 查询(仅支持 json 输出) ```Bash arkcli doctor metrics list ``` ### doctor metrics raw 执行任意 PromQL 查询(必须引用 ark_* 指标) ```Bash arkcli doctor metrics raw ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--auto-bind` | bool | VMP 未绑定 workspace 时自动建 ark_default + 绑 ark telemetry | | `--format` | string | 输出形态:json \| scalar \| table | | `--promql` | string | PromQL 表达式(必填) | | `--step` | string | 采样步长(Go duration;默认自动) | | `--window` | string | 回溯窗口(Go duration;不支持 '7d')(默认 1h) | | `--workspace-id` | string | VMP workspace UUID(默认:自动解析) | ### doctor model 诊断基础模型(是否存在、接入点、用量、错误率、配额) ```Bash arkcli doctor model ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--auto-bind` | bool | VMP 订阅 + SLR 都已开通但 telemetry 未绑定 VMP workspace 时, 自动建 ark_default + 绑 ark telemetry (订阅 / SLR 缺失时仍只给云产品开通页跳转链接, 不会替用户开通) | | `--window` | string | 回溯窗口(Go duration 语法,如 1h、24h) | ### doctor report 向 Ark case-platform 上报 Seedance 2.x 效果问题 ```Bash arkcli doctor report ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--account-id` | string | task 所属账号 id; 未传时按 APIKey 反查 | | `--badcase-type` | string | 问题类别 (可选枚举, 见 --help Long 段) | | `--contact-info` | string | 联系方式 (邮箱/电话), ≤255 字符 | | `--dry-run` | bool | 预览客户端执行计划,不发网络请求、无副作用 | | `--feedback` | string | 问题描述, 1-2000 字符, 拒绝纯空白 | | `--source` | string | 来源枚举: huosu \| huoshan \| qianzhi \| case_import (默认) | | `--task-id` | stringArray | seedance 2.x 的 task_id(可重复或用逗号/空白分隔;1-50 个)(默认 []) | | `--yes` | bool | TTY 下跳过 Y/N 确认; headless 环境本 flag 无效, 需 ARKCLI_ALLOW_HEADLESS_REPORT=1 | ## usage ARK 用量查询:`usage stats`(Token/请求数,5-30 分钟延迟)、`usage plan`(套餐额度快照)、`usage plan-details`(Agent Plan 按模型时间序列,套餐内外拆分)、`usage balance`(余额:免费额度/媒资库/套餐)、`usage seats --with-usage`(团队席位用量)。 - stats 出推理量(近实时),billing 出结算金额(T+1 财务口径),两者不可混用; - Coding Plan 只有 quota 快照,没有按模型的套餐明细,不能用 stats 冒充。 ### usage balance Query account balance from one of three angles: free-quota (per-model 免费推理额度 / 资源包余额), media-asset (素材库 / 媒资库容量), plan (订阅套餐余额) ```Bash arkcli usage balance ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--type` | string(必填) | 余额类型(必填):free-quota \| media-asset \| plan | | `--model` | string | [free-quota] 只查单个基础模型(如 doubao-seed-1-6) | | `--modality` | string | [free-quota] FoundationModelDomain 枚举:LLM \| ComputerVision \| Audio \| Embedding \| Router(不支持别名) | | `--page-number` | int | [free-quota] 页码(从 1 开始) | | `--page-size` | int | [free-quota] 每页条数(默认 20;从 50 下调以保证 ListModelChargeItems 落在 10s 超时预算内) | | `--project` | string | [media-asset] 项目范围;默认取当前 profile 的项目 | | `--product` | string | [plan] 套餐 id:agent-plan \| coding-plan \| agent-plan-team \| coding-plan-team | | `--all` | bool | [plan] 查询全部支持的个人版套餐,即使未订阅也查 | | `--seat` | string | [plan] 只查指定 SeatID(仅企业版) | ### usage plan 查询套餐用量(Agent Plan / Coding Plan 的额度与周期用量)。默认自动发现全部 4 个 SKU(个人 × 2 + 企业 × 2);可用 --product 或 --all 覆盖。 ```Bash arkcli usage plan ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--product` | string | 套餐产品 id:agent-plan \| coding-plan \| agent-plan-team \| coding-plan-team。默认自动发现全部订阅。 | | `--all` | bool | 查询全部 4 个产品(个人 × 2 + 企业 × 2),即使未订阅也查。与 --product 互斥。 | | `--seat` | string | [team] 指定 SeatID;默认通过 GetSeatInfo 取调用方绑定的席位 | ### usage plan-details 查询 Agent Plan 的用量明细(按模型的时间序列),支持个人版或企业版。必须传 --start;--end 默认今天;--interval 默认 Day。 ```Bash arkcli usage plan-details ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--start` | string(必填) | 开始日期(YYYY-MM-DD)。必填。后端限制区间 ≤ 31 天,历史 ≤ 6 个月。 | | `--end` | string | 结束日期(YYYY-MM-DD,含当天)。默认今天。 | | `--interval` | string | 查询粒度:Day \| Hour | | `--model` | string_slice | 按对外展示的 model/harness ObjectName 过滤(可重复)。省略则不按模型分组。 | | `--product` | string | agent-plan(默认,个人版)\| agent-plan-team | | `--seat` | string_slice | [team] SeatID(可重复,单次调用 ≤ 1000);默认通过 GetSeatInfo 取调用方绑定的席位 | | `--all-seats` | bool | [team, admin] 先调用 ListSeatInfos 取出团队内全部席位 ID 再批量查询(与 --seat 同时给出时以 --seat 为准) | | `--seat-user-id` | string_slice | [team] 服务端按子用户 ID 过滤(可重复,管理员范围) | | `--seat-user-name` | string_slice | [team] 服务端按子用户名称过滤(可重复,管理员范围) | ### usage seats 列出企业版套餐订阅下的全部席位(管理员视图)。需要管理员权限;子用户调用会返回 AccessDenied。project 解析顺序:--project 参数 > 字面量 `default`(企业席位始终创建在 `default`,刻意绕过 profile 的 project,以与 internal/service/agentplan/buy.go::buyTeam 的创建路径保持 1:1)。 ```Bash arkcli usage seats ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--product` | string(必填) | 团队套餐 id(必填):agent-plan-team \| coding-plan-team | | `--biz-info` | string | 按档位过滤:small/medium/large/max(AgentPlan)\| lite/pro(CodingPlan) | | `--billing-status` | string_slice | 按计费状态过滤(可重复):Running / Expired / Reclaimed / Inactive | | `--seat-status` | string | 按席位状态过滤:Active / Inactive | | `--user-id` | string_slice | 按子用户 ID 过滤(可重复;超过 1 个会按用户做客户端扇出,结果按 SeatID 合并去重) | | `--user-name` | string_slice | 按子用户名称过滤(可重复;超过 1 个会做客户端扇出) | | `--seat-id` | string_slice | 只查指定 SeatID(可重复;会绕过项目过滤) | | `--project` | string | 项目范围。解析顺序:本参数 > 字面量 `default`。`plans buy --plan *-team` 一律在 `default` 下创建席位,因此这里刻意忽略当前 profile 的项目——若回退到 profile 项目,当 profile 项目 != `default` 时会静默返回空列表。 | | `--page-size` | int | 每页条数(默认 100) | | `--page-number` | int | 页码,从 1 开始;传入后关闭自动翻页,只取一页 | | `--sort-by` | string | 排序字段 | | `--sort-order` | string | 排序方向:ASC \| DESC | | `--with-usage` | bool | [仅团队产品] 关联按席位用量:AgentPlan→ListSeatAFPUsage(已用/总量/百分比),CodingPlan→ListSeatInfoUsages(仅百分比)。每行会附加 afp_usage / coding_usage。 | ### usage stats 按日期范围查询推理用量(Token / 请求数),可按模型、Endpoint 或 API Key 过滤 ```Bash arkcli usage stats ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--start` | string(必填) | 开始日期,格式 YYYY-MM-DD(必填) | | `--end` | string | 结束日期,格式 YYYY-MM-DD,默认今天 | | `--interval` | string | 查询粒度:Day \| Hour | | `--endpoint` | string | 按 Endpoint ID 过滤 | | `--model` | string | 按模型名称过滤 | | `--apikey` | string | 按 API Key 过滤(Values 精确匹配,旧写法) | | `--apikey-suffix` | string | 按 API Key 后缀过滤(ValueLike 匹配,例如 Key 末 12 位) | | `--mine` | bool | 只统计当前 SSO 子用户拥有的资源;配合 --mine-by 使用 | | `--mine-by` | string | --mine 的口径:endpoint(默认)\| apikey | | `--by` | string | 分组维度:model、endpoint、apikey | | `--show-window-detail` | bool | 在响应中拆解每次调用的计费窗口 | --- # 推理与训练 Source: https://ark.volcengine.com/region:cn-beijing/docs/inference-and-training 推理部署与模型训练:接入点(Endpoint)生命周期、精调训练任务,以及训练数据管理。 - 普通交互式创建接入点走 `+deploy`(含模型澄清与复用检查);脚本化 / CI / 无护栏场景走 `infer` 的 raw CRUD; - `train` 管精调任务(`mcj-*`),训练数据来自 `dataset`(`ds-*` / `dsv-*`),导出产物是 `cm-*` 自定义模型; - 导出后衔接 `models custommodel` 与 `infer`:先入模型仓库,再按接入点工作流上线。 ## +deploy 引导式创建推理接入点:模型澄清、复用检查、Profile 默认资源同步(`infer endpoint create` 的带护栏版本) ```Bash arkcli +deploy ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--name` | string(必填) | Endpoint 名称 | | `--description` | string | 接入点描述 | | `--model` | string(必填) | 模型 ID(基础模型或自定义模型) | | `--model-unit-id` | string | 模型单元 ID | | `--rate-limit` | string | 限流配置(JSON 字符串) | | `--batch-only` | bool | 仅批量模式 | | `--moderation` | string | 内容审核配置(JSON 字符串) | | `--data-delivery` | bool | 数据投递模式 | | `--dedicated-to-ptu` | bool | 专用于 PTU | | `--dedicated-to-dynamic-ptu` | bool | 专用于动态 PTU | | `--content-generation` | string | 内容生成配置(JSON 字符串) | | `--inference-foundry` | string | 推理底座(Inference foundry)配置(JSON 字符串) | | `--tags` | string | Tags(JSON 字符串) | | `--yes` | bool | In an interactive terminal, skip the [y/N] model-activation (开通) prompt. NOTE: in non-interactive (agent/CI/pipe) this flag does NOT authorize 开通 — activation is hard-refused there; set ARKCLI_ALLOW_HEADLESS_ACTIVATION=1 only for genuine unattended automation. | | `--allow-data-collected` | bool | 允许采集数据 | | `--service-info` | string | 服务信息(JSON 字符串) | | `--need-watermark` | bool | 是否需要水印 | | `--watermark-info` | string | 水印信息(JSON 字符串) | | `--intelligent-router` | string | 智能路由配置(JSON 字符串) | | `--is-intelligent` | bool | 是否为智能版 | | `--fallback` | string | 降级配置(JSON 字符串) | | `--limit-coefficient` | string | 限流系数配置(JSON 字符串) | | `--deployment-type` | string | 部署类型 | | `--is-agentic` | bool | 是否为 agentic | | `--agentic-strategy` | string | Agentic 策略配置(JSON 字符串) | | `--is-aicc` | bool | 是否为 AICC | | `--specify-region` | string | 指定地域 | | `--set-default` | string | 把创建成功的 Endpoint 提升为当前 profile 在该模态下的默认(text\|image\|video)。 | | `--domain` | string | 域 | ## dataset Dataset(数据集)全生命周期管理:创建、查询、更新、删除、版本化(`ds-*` / `dsv-*`)、下载与格式校验。 - 面向精调场景设计:训练集/验证集的复用、版本冻结、格式校验都在本域完成; - 精调任务通过 `--dataset` 引用本域产物,衔接 `train` 域的精调工作流。 ### dataset create 创建数据集并提交首个 V1 版本 ```Bash arkcli dataset create ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--name` | string(必填) | 数据集名称 | | `--description` | string | 描述 | | `--dataset-format` | string(必填) | 后端 SchemaType:LLMSft、LLMPretrain、LLMDPO、LLMRL、EmbeddingSft、ImageGenSft 或 VideoGenSft | | `--local` | string_slice | 本地 .jsonl 文件路径,可重复 | | `--tos-uri` | string_slice | 可列举且包含 .jsonl 的 TOS URI(tos://bucket/path),可重复且必须属于同一 bucket;不支持 ds-ds/* 上传暂存路径 | ### dataset delete 删除数据集 ```Bash arkcli dataset delete ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--yes` | bool | 跳过交互式确认 | ### dataset download 下载数据集版本中的 TOS 对象 ```Bash arkcli dataset download ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--version` | string(必填) | 版本 SID(dsv-...)或友好版本号(V1、V2 等) | | `--output-dir` | string | 下载目录;默认 ./-/ | ### dataset get 获取数据集详情 ```Bash arkcli dataset get ``` ### dataset list 列出数据集 ```Bash arkcli dataset list ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--page-number` | int | 页码(默认 1) | | `--page-size` | int | 每页条数(1-100,默认 100) | | `--sort-by` | string | 排序字段 | | `--sort-order` | string | 排序方向:Asc 或 Desc | | `--id` | string_slice | 按数据集 ID 过滤,可重复 | | `--name` | string | 按数据集名称过滤 | | `--schema-type` | string_slice | 按 SchemaType 过滤,可重复 | | `--resource-origin` | string_slice | 按 ResourceOrigin 过滤,可重复 | ### dataset update 更新数据集名称或描述 ```Bash arkcli dataset update ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--name` | string | 数据集名称 | | `--description` | string | 描述 | ### dataset validate 按照模型微调配置校验本地文件或 TOS 数据 ```Bash arkcli dataset validate ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--local` | string_slice | 本地 .jsonl 文件路径,可重复 | | `--tos-uri` | string_slice | 可列举且包含 .jsonl 的 TOS URI(tos://bucket/path),可重复且必须属于同一 bucket;不支持 ds-ds/* 上传暂存路径 | | `--model` | string(必填) | 基础模型名称 | | `--model-version` | string(必填) | 基础模型版本 | | `--type` | string(必填) | 微调类型,例如 sft、lora、dpo、grpo、pt | ### dataset version create 为现有数据集创建下一个 Vn 版本 ```Bash arkcli dataset version create ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--description` | string | 描述 | | `--local` | string_slice | 本地 .jsonl 文件路径,可重复 | | `--tos-uri` | string_slice | 可列举且包含 .jsonl 的 TOS URI(tos://bucket/path),可重复且必须属于同一 bucket;不支持 ds-ds/* 上传暂存路径 | ### dataset version download 下载指定数据集版本中的 TOS 对象 ```Bash arkcli dataset version download ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--output-dir` | string | 下载目录;默认 ./-/ | ### dataset version get 获取数据集版本详情 ```Bash arkcli dataset version get | ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--preview` | bool | 读取并展示版本中每个对象的前 100 KiB(102400 字节) | ### dataset version list 列出数据集版本 ```Bash arkcli dataset version list ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--page-number` | int | 页码(默认 1) | | `--page-size` | int | 每页条数(1-100,默认 100) | | `--sort-by` | string | 排序字段 | | `--sort-order` | string | 排序方向:Asc 或 Desc | | `--id` | string_slice | 按版本 SID 过滤,可重复 | | `--version` | string_slice | 按友好版本号 Vn 过滤,可重复 | | `--status` | string_slice | 按版本状态过滤,可重复 | ## infer 推理接入点(Endpoint,ep-*)全生命周期管理:获取、列表、创建、启动、停止、删除、更新,以及模型部署形态能力查询(capability)。 - `infer endpoint create` 是**显式 raw CRUD 通道**:面向脚本化 / CI / 无护栏场景;普通交互式创建请优先使用 `+deploy` 工作流(含模型复用检查与 profile 同步); - 创建前可用 `capability` 确认模型支持的部署形态;启停与删除均有确认闸门。 ### infer endpoint capability get 查看某个模型支持的推理部署形态(在线接入点 / 共享服务 / 批量 / PTU / 规格档位 / 降级)。为 maas-fe 的 `EndpointSupportedMethods` 接口提供支撑。请在 `infer endpoint create` 之前调用,以确认模型是否可部署、以及哪些 `--type` 类参数对它有效。精调自定义模型传 --custom-model-id;基础模型传 --model + --version。 ```Bash arkcli infer endpoint capability get ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--model` | string | 基础模型名称(如 doubao-seed-1-6-flash);与 --custom-model-id 互斥 | | `--version` | string | 模型版本(配合 --model 使用) | | `--custom-model-id` | string | 自定义模型 ID(cm-xxx);与 --model 互斥 | ### infer endpoint create 创建推理接入点(原始 CRUD,无流程护栏;需要带模型复用检查与 Profile 同步的引导式部署请用 +deploy) ```Bash arkcli infer endpoint create ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--model` | string(必填) | 模型 ID(基础模型或自定义模型) | | `--name` | string(必填) | Endpoint 名称 | | `--billing-method` | string | 计费方式:token | | `--rpm` | int | 限流 RPM | | `--tpm` | int | 限流 TPM | | `--yes` | bool | In an interactive terminal, skip the [y/N] model-activation (开通) prompt. NOTE: in non-interactive (agent/CI/pipe) this flag does NOT authorize 开通 — activation is hard-refused there; set ARKCLI_ALLOW_HEADLESS_ACTIVATION=1 only for genuine unattended automation. | ### infer endpoint delete 删除推理接入点(不可逆)。需要确认:交互式 TTY 会提示 Y/N;非交互场景(Agent / CI / 管道)需要设置 ARKCLI_ALLOW_HEADLESS_DELETE=1,此时 --yes 不生效。 ```Bash arkcli infer endpoint delete ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--yes` | bool | 跳过交互式 Y/N 提示(仅 TTY)。注意:非交互模式下本参数不构成删除授权——请改用 ARKCLI_ALLOW_HEADLESS_DELETE=1。 | ### infer endpoint get 获取推理接入点详情(同时支持普通接入点与预置推理接入点) ```Bash arkcli infer endpoint get ``` ### infer endpoint list 按条件分页列出推理接入点 ```Bash arkcli infer endpoint list ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--format` | string | 输出格式:table \| json | | `--model` | string | 按模型 ID 过滤(自定义模型) | | `--status` | string | 按 Endpoint 状态过滤 | | `--mine` | bool | 只列出当前 SSO 子用户创建的 Endpoint | | `--page-number` | int | 页码(>=1) | | `--page-size` | int | 每页条数 | ### infer endpoint start 启动推理接入点。启动请求被接受后返回的是接入点当前状态(通常是 Scheduling)——到 Running 的转换是异步的;请轮询 `infer endpoint get ` 直到 Status='Running' 确认。 ```Bash arkcli infer endpoint start ``` ### infer endpoint stop 停止推理接入点。停止请求被接受后返回的是接入点当前状态——到 Stopped 的转换是异步的;请轮询 `infer endpoint get ` 直到 Status='Stopped' 确认。 ```Bash arkcli infer endpoint stop ``` ### infer endpoint update 更新推理接入点(名称 / 描述 / 限流) ```Bash arkcli infer endpoint update ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--name` | string | 新的 Endpoint 名称 | | `--description` | string | 新的接入点描述(传空字符串可清空) | | `--rpm` | int | 限流:每分钟请求数(必须与 --tpm 配对) | | `--tpm` | int | 限流:每分钟 token 数(必须与 --rpm 配对) | | `--cg-concurrent-requests` | int | ContentGeneration:最大并发请求数(图片生成接入点) | | `--cg-create-task-rpm` | int | ContentGeneration:CreateTask 的 RPM(图片生成接入点) | ## train 模型精调(Fine-tune)训练任务全生命周期:创建、查询、日志/trajectory、指标分析、最佳 step 选择、导出为 custom model(mcj-*)。 - 训练数据来自 `dataset` 域的 Dataset/版本;本域负责超参、资源组匹配、价格查询与训练方法选择; - 导出部署衔接 `models custommodel` 与 `infer`:导出产物是 cm-* 自定义模型,再按推理接入点工作流上线。 ### train finetune artifacts export 把一个或多个 mcj 产物(例如 global_step_2)导出为可部署的 cm-* 实体。输出 `{job_id, items[]}`,每项含 custom_model_name / custom_model_id / export_status。命名规则:设置 --custom-model-name-prefix 时为 `_`,否则保留后端默认名。建议先用 `arkcli train finetune artifacts list ` 查出 artifact_name。 ```Bash arkcli train finetune artifacts export ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--artifact-name` | string_slice | 要导出的产物(output)名,例如 global_step_2。可重复。 | | `--custom-model-name-prefix` | string | 导出后 cm-* 名称的前缀。最终名称为 `_`。留空表示沿用后端默认名。 | ### train finetune artifacts list 列出精调任务的训练产物(Outputs[] 投影:artifact_name / export_status / custom_model_name / custom_model_id / create_time)。用 `--format table` 便于人工挑选。默认会并发调用 GetCustomModel 回填 custom_model_name;传 --lite 可跳过该查询。 ```Bash arkcli train finetune artifacts list ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--format` | string | 输出格式:json(默认)\| table | | `--lite` | bool | 跳过逐个 cm 的 GetCustomModel 名称查询。更快,但 custom_model_name 会为空。 | ### train finetune capability get 查看某个基础模型(或自定义模型的来源模型)支持哪些精调训练方法。基础模型传 --model + 可选 --version;自定义模型传 --model-id(cm-xxx)——后者会在底层解析到其来源 FoundationModel,与 maas-fe 的 CustomBoard 一致(自定义模型本身不携带能力列表,续训支持由底座的 FinetuneTypes 推导)。返回 supported_types(arkcli 参数写法:sft / lora / dpo / dpo-lora / grpo / grpo-lora / ppo / opd / opd-lora / pt,与 `train finetune create --type` 一致)与 supported_types_wire(后端 CustomizationType 字面量)。--version 语义:与 --model 同用时,--version 为空只返回主版本;--version 与 --model-id 互斥(cm 绑定的来源版本会自动解析——二者传其一,不要同时传)。配合 `models finetune-config` 可获取所选 --type 的超参数 schema。 ```Bash arkcli train finetune capability get ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--model` | string | 基础模型名称,如 doubao-seed-1-6-flash。与 --model-id 互斥 | | `--version` | string | 模型版本,如 250828;留空 = 仅主版本。与 --model-id 互斥(cm 自带绑定的来源版本) | | `--model-id` | string | 自定义模型 ID(cm-xxx)。与 --model/--version 互斥。会解析到其来源基础模型,并报告该基础模型的能力 | ### train finetune create 创建精调任务。除兼容旧参数(--dataset、--epochs、--lr、--lora-rank、--beta)外,还支持对齐 PRD 的新增项:本地文件、RL 流程、数据容错、超参数 JSON、模型保存上限、轨迹记录。 ```Bash arkcli train finetune create ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--name` | string(必填) | 任务名称 | | `--type` | string(必填) | 定制类型:sft \| lora \| dpo \| dpo-lora \| grpo \| grpo-lora \| ppo \| opd \| opd-lora \| pt | | `--description` | string | 任务描述 | | `--model` | string | 基础模型名称(如 doubao-seed-1-6-flash),与 --model-id 互斥 | | `--model-version` | string | 基础模型版本(如 250615),配合 --model 使用 | | `--model-id` | string | 自定义模型 ID,与 --model/--model-version 互斥 | | `--dataset` | string | 训练数据集:tos://bucket/path 或数据集 ID(ds-xxx)。旧版合并参数——建议改用 --train-tos-uri / --train-dataset | | `--dataset-version` | string | 数据集版本 ID(dsv-xxx),当 --dataset 传数据集 ID 时必填。旧写法——建议改用 --train-dataset-version | | `--train-tos-uri` | string | 训练数据 TOS URI(tos://bucket/prefix)。输入为 TOS 路径时,与 PRD 对齐的 --dataset 别名 | | `--train-dataset` | string | 训练数据集及版本,格式 :;旧的 --train-dataset-version 分开写法仍支持 | | `--train-dataset-version` | string | 训练数据集版本 id(dsv-yyy)。与 PRD 对齐的 --dataset-version 别名 | | `--train-file` | string_slice | 本地训练文件路径(可重复;映射到 data.training_set.local_files[]) | | `--train-path` | string_slice | 托管数据集路径 JSON(可重复):{"dataset_id":"ds-...","dataset_version_id":"dsv-...","multiplier":1},或把 multiplier 换成 sample_count | | `--preset-dataset` | string_slice | 预设数据集 JSON(可重复):{"dataset_version_id":"dsv-...","inject_multiplier":1};inject_multiplier 与 inject_sample_count 二选一 | | `--validation-dataset` | string | 验证数据集及版本,格式 :;旧的 tos:// 与分开写版本的形式仍支持 | | `--validation-dataset-version` | string | 验证数据集版本 id(dsv-xxx) | | `--validation-tos-uri` | string | 验证数据 TOS URI(tos://bucket/prefix)。与 PRD 对齐的别名 | | `--validation-dataset-id` | string | 验证数据集 id(ds-xxx)。与 PRD 对齐的别名 | | `--validation-file` | string_slice | 本地验证文件路径(可重复;映射到 data.validation_set.local_files[]) | | `--validation-percentage` | int | 用作验证集的训练集比例(例如 10);与 --validation-dataset/--validation-file 互斥 | | `--max-invalid-records-ratio` | string | 允许的坏样本比例,取值 [0,1)(例如 0.01) | | `--max-invalid-records-number` | int | 允许的坏样本绝对条数(正整数) | | `--shuffle-random-seed` | string | -1 = 每次运行随机,0 = 不洗牌,正数 = 固定种子以便复现(字符串类型,使 0 与未设置区分开) | | `--hyperparameters` | string | JSON 字典或 @file(例如 '{"epoch":"3","batch_size":"8"}' 或 @hyperparameters.json)。会与标量参数 --epochs/--lr/--lora-rank/--beta 合并(冲突时以标量参数为准) | | `--epochs` | int | 训练轮数(--hyperparameters epoch 的旧写法) | | `--lr` | string | 学习率(--hyperparameters learning_rate 的旧写法) | | `--lora-rank` | int | LoRA 秩(--hyperparameters lora_rank 的旧写法) | | `--beta` | string | DPO 的 beta 参数(--hyperparameters beta 的旧写法) | | `--save-model-limit` | int | 保留的训练产物数量上限(1-10;后端默认 1) | | `--enable-trajectory` | bool | 开启 RL rollout 轨迹记录(调试 GRPO/PPO 时推荐) | | `--pipeline` | string | @file 形式的 JSON RL pipeline 配置路径(custom_rl_pipeline;自定义 rollout/grader 的 GRPO/PPO 必填) | | `--resource-group` | string | 资源组 ID;请按查询结果原样传入,提交前会检查当前账号/项目权限、任务资源模板和资源组可用性 | | `--yes` | bool | Skip the interactive confirmation prompts: the upload-to-TOS gate (--train-file) and the final submit prompt. NOTE: model activation (开通) is hard-refused in non-interactive (agent/CI/pipe) regardless of --yes — set ARKCLI_ALLOW_HEADLESS_ACTIVATION=1 for unattended activation, otherwise the base model must already be activated. | | `--estimate` | bool | 只做在线 Token 与价格试算,不创建精调任务 | ### train finetune delete 删除精调任务记录(不可逆)。用 --yes 跳过确认提示,脚本场景推荐。仅处于终态(Completed / Failed / Terminated)的任务可删除;非终态任务会在 shortcut 层被拒绝,并提示先执行 `train finetune stop`(省去一次注定失败调用上的确认往返——否则后端会以 `OperationDenied.UnsupportedPhase` 拒绝)。对 Agent 的要求:先用 `train finetune get` 查看目标,复述任务 ID 与影响,取得明确确认后再删除。 ```Bash arkcli train finetune delete ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--yes` | bool | 跳过交互确认提示 | ### train finetune get 获取精调任务的完整详情(状态 / 配置 / 产物)。数据与当前的 `train finetune status` 相同,这是 PRD 规定的读取入口。要看训练步进度用 `train finetune metrics`;要实时轮询用 `train finetune watch`。不含费用——接口 schema 没有按任务的计费字段;提交前在线估算请用 `train finetune create --estimate`。 ```Bash arkcli train finetune get ``` ### train finetune list 列出模型精调任务 ```Bash arkcli train finetune list ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--page-number` | int | 页码(必须大于等于 1,默认 1) | | `--page-size` | int | 每页条数(1-100,默认 100) | | `--sort-by` | string | 排序字段 | | `--sort-order` | string | 排序方向:Asc \| Desc | | `--phase` | string_slice | 按阶段过滤(可重复):Preprocessing \| Queued \| Deploying \| Running \| Pausing \| Paused \| Terminating \| Terminated \| Completing \| Completed \| Failed | | `--name` | string | 按任务名称过滤(模糊匹配) | | `--customization-type` | string_slice | 按定制类型过滤(可重复):FinetuneSft \| FinetuneLoRA \| DPO \| DPOLoRA \| GRPO \| GRPOLoRA \| PPO \| OPD \| OPDLoRA \| Pretrain | | `--create-time-after` | string | 过滤该时间之后创建的任务(RFC3339,例如 2026-01-01T00:00:00Z) | | `--create-time-before` | string | 过滤该时间之前创建的任务(RFC3339) | ### train finetune logs 跟踪精调任务的训练日志。默认数据源是公网 ARK Action `GetTaskLogs`(与 maas 控制台「训练日志」页一致)——即 system / 训练框架的 stdout,任意鉴权 profile 均可访问。支持 --follow / --tail / --search / --since;任务进入终态且没有新行后 --follow 会自动退出;--tail >1000 时自动分批。加 --custom 后数据源切换为该任务专属的 CustomTLSConfig topic——RL 插件(rollout / grader)函数的 stdout,与 maas 控制台「自定义日志(TLS)」子页一致。--custom 需要火山 SSO STS(直连 TLS,与轨迹相同),且只对开启了 --enable-trajectory 并启用了 project 级 TLS 的 RL 任务有效(见 `arkcli train finetune tls config get`);--custom 不支持 --follow。--all 会导出超过 --tail 上限的全部日志(一直翻页到后端 ListOver),并且必须配合 --output FILE,避免 10MB+ 日志撑爆 Agent 上下文。 ```Bash arkcli train finetune logs ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--tail` | int | Tail 大小:每次请求拉取的行数。默认 200;maas-fe 控制台默认 2000。设置 --all 时忽略。 | | `--follow` | bool | 任务运行期间持续轮询新日志行;进入终态且无新行后自动停止。用 --interval 调整轮询节奏。不支持与 --custom 或 --all 同用。 | | `--interval` | string | --follow 的轮询间隔,支持时长写法(5s、30s)或纯整数秒。默认 5s。 | | `--search` | string | 服务端筛选;GetTaskLogs 来源使用 FilterExpression;TLS 自定义日志使用 content 过滤。 | | `--since` | string | 起始时间,相对于当前时间的时长(如 30m、2h);TLS 自定义日志默认 30 天,GetTaskLogs 来源默认不限制起始时间。 | | `--json` | bool | 输出结构化 JSON,替代纯文本行。 | | `--custom` | bool | 读取 RL 插件函数的 stdout(CustomTLSConfig TLS topic),而不是 system / 训练框架日志。需要火山 SSO + RL 任务 + --enable-trajectory。 | | `--function-name` | string | 仅 TLS --custom:按插件函数名筛选(如 SingleRollout-xxx),对应 function_name 查询。 | | `--all` | bool | 分页读取全部日志,忽略 --tail;必须提供 --output FILE。GetTaskLogs 使用 Ctx 游标,TLS 使用 Context 游标。 | | `--output` | string | 写入日志文件:GetTaskLogs 为纯文本,TLS 自定义日志为 JSON;stdout 仅返回元数据。--all 时必填。 | ### train finetune metrics 获取精调任务的训练指标。底层分两步:先用 GetModelCustomizationJobMetrics 返回可用指标名(如 train/loss、eval/loss、train/lr、train/grad_norm;DPO/GRPO 任务前缀不同),再用 GetModelCustomizationJobMetricData 拉取逐步时间序列。用 --metric(可重复)过滤;默认返回全部可用指标。用 --output 把 JSON 落盘(便于 Agent 渲染图表)。 ```Bash arkcli train finetune metrics ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--metric` | string_slice | 只取一个或多个指标名(可重复)。留空表示全部可用指标 | | `--min-sample-step` | int | 最小采样 step(服务端降采样) | | `--max-metric-point` | int | 每个指标最多返回的采样点数(服务端会均匀降采样) | | `--from-step` | int | 范围过滤:只返回 step >= 该值的样本 | | `--to-step` | int | 范围过滤:只返回 step <= 该值的样本 | | `--output` | string | 将响应 JSON 写入该文件路径;便于 Agent 渲染图表 | ### train finetune pause 暂停运行中的精调任务(可通过 `train finetune resume` 恢复)。与不可逆终止的 `stop` 不同。 ```Bash arkcli train finetune pause ``` ### train finetune pricing 查询基础模型的精调价格。--billing-method=token 时,按 --type 过滤基础模型计费项:lora / lora-sft / dpo-lora / grpo-lora / opd-lora → LoRA 精调;sft / dpo / grpo / ppo / opd / pt → 全参精调。--type 为空则返回全部精调相关计费项。--billing-method=instance 时,解析出精确的模型版本/类型超参数 schema,列出可用的训练资源模板,并关联其 FlavorSum 小时价。指定 --type 时,arkcli 会与 `train finetune capability get` 交叉校验,模型不支持该训练方法时直接拒绝(对不支持的方法返回通用计费项价格会误导调用方)。 ```Bash arkcli train finetune pricing ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--model` | string(必填) | 基础模型名称,如 doubao-seed-1-6-flash | | `--type` | string | 定制类型:sft \| lora \| lora-sft \| dpo \| dpo-lora \| grpo \| grpo-lora \| ppo \| opd \| opd-lora \| pt;留空 = 全部 | | `--billing-method` | string | 计费方式:token \| instance | | `--model-version` | string | 基础模型版本;--billing-method=instance 时必填 | | `--hyperparameters` | string | 仅实例计费时:JSON 字典或 @file;会与模型默认值以及 --epochs/--lr/--lora-rank/--beta 等标量覆盖项合并 | | `--epochs` | int | 仅实例计费时:覆盖 epoch | | `--lr` | string | 仅实例计费时:覆盖 learning_rate | | `--lora-rank` | int | 仅实例计费时:覆盖 lora_rank | | `--beta` | string | 仅实例计费时:覆盖 beta | | `--region` | string | 仅 Token 计价:价格地域,默认取当前 profile 的地域 | ### train finetune resource-group list 检查资源组权限,并按当前精调模型、训练类型和超参数列出任务资源需求与可用资源组 ```Bash arkcli train finetune resource-group list ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--model` | string | 基础模型名称;与 --model-id 互斥 | | `--model-version` | string | 基础模型版本;使用 --model 时必填 | | `--model-id` | string | 已有自定义模型 ID;会解析其基础模型,与 --model/--model-version 互斥 | | `--type` | string(必填) | 训练类型:sft \| lora \| dpo \| dpo-lora \| grpo \| grpo-lora \| ppo \| opd \| opd-lora \| pt | | `--hyperparameters` | string | 超参数 JSON 或 @file;与创建任务保持一致 | | `--epochs` | int | epoch 快捷覆盖值 | | `--lr` | string | learning_rate 快捷覆盖值 | | `--lora-rank` | int | lora_rank 快捷覆盖值 | | `--beta` | string | beta 快捷覆盖值 | | `--only-matched` | bool | 只返回当前任务可以使用的资源组 | ### train finetune resume 恢复已暂停(Paused)的精调任务;后端允许时也可重试 Failed / Terminated 任务 ```Bash arkcli train finetune resume ``` ### train finetune sdk login 用 arkcli 的 STS 写入 ark_sdk 的 `~/.ark/authorization.json`——替代 `ark login`。仅当用户自己跑 `python3 submit_job.py` 时才需要:ark_sdk 0.6.0 Python 库的提交热路径只读该文件(不读环境变量),属上游 SDK 限制。用 YAML 规格提交请改用 `train finetune sdk submit `——它不会写 authorization.json(使用 0600 的临时凭证文件,作用域限定在 ark 进程内)。STS 过期会自动刷新。若已存在属于其他账号的文件,除非传 --force,否则拒绝覆盖。 ```Bash arkcli train finetune sdk login ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--refresh` | bool | 写入前强制刷新产品原生 SSO STS。 | | `--force` | bool | 即使已存在的 authorization.json 的 account_id 与 arkcli 当前 profile 不同,也强制覆盖。 | | `--path` | string | 覆盖输出路径。默认:~/.ark/authorization.json(与 ARK_SDK_AUTHORIZATION_FILE 环境变量一致)。 | ### train finetune status 获取精调任务详情(`get` 的别名;若后端拆分 API,预留给未来的精简阶段 / 进度投影) ```Bash arkcli train finetune status ``` ### train finetune stop 停止运行中的精调任务(不可逆——会终止任务;若想之后恢复请改用 `train finetune pause`)。默认 [y/N] 确认;`--yes` 跳过提示。 ```Bash arkcli train finetune stop ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--yes` | bool | 跳过 [y/N] 确认提示。非交互执行(CI / 管道 / agent)时必填。 | ### train finetune tls config delete 永久删除该 project 的精调 TLS 资源——会销毁已存储的轨迹 / 自定义日志 / trace / 可解释性数据。不可逆。传 --yes 跳过 [y/N] 确认。删除后可随时通过 `arkcli train finetune tls config enable` 重新开启(会创建全新的空 topic)。 ```Bash arkcli train finetune tls config delete ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--project-name` | string | 覆盖项目名称(默认:当前 profile 的项目) | | `--yes` | bool | 跳过 [y/N] 确认提示 | ### train finetune tls config disable 关闭 project 级精调 TLS(停止新数据写入;已有数据按 TLS 保留策略保留)。传 --yes 跳过 [y/N] 确认。若要永久删除 TLS 资源(数据一并销毁),请改用 `arkcli train finetune tls config delete`。 ```Bash arkcli train finetune tls config disable ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--project-name` | string | 覆盖项目名称(默认:当前 profile 的项目) | | `--yes` | bool | 跳过 [y/N] 确认提示 | ### train finetune tls config enable 开启 project 级精调 TLS 资源(会创建四个后付费火山 TLS topic——产生费用)。本项目内任何任务要记录轨迹 / 自定义插件 stdout / trace / token 级数据,都必须先开启。默认 [y/N] 确认,因为会开通计费资源;传 --yes 跳过(非交互调用方 / Agent 必须传)。该在线开通流程不支持 --dry-run,请先确认当前 project 再显式确认。注意:子账号 IAM 用户可能没有权限,需请主账号管理员在 maas 控制台开启。 ```Bash arkcli train finetune tls config enable ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--project-name` | string | 覆盖项目名称(默认:当前 profile 的项目) | | `--yes` | bool | 跳过 [y/N] 确认提示(非交互执行时必填) | ### train finetune tls config get 查看 project 级精调 TLS 状态:是否已开启,以及支撑 `--enable-trajectory` / RL 插件日志 / trace / 可解释性数据的四个 topic id(trajectory / custom / trace / explainability)。project 默认取当前生效 profile 的 project,可用 --project-name 覆盖。 ```Bash arkcli train finetune tls config get ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--project-name` | string | 覆盖项目名称(默认:当前 profile 的项目) | ### train finetune trajectory get 获取单条 rollout 轨迹记录(始终返回完整内容;单条约 3KB)。用 --sample-id(精确匹配)或 --step + --index(该 step 下第 i 条 rollout)指定。SSO 要求与 `trajectory list` 相同。 ```Bash arkcli train finetune trajectory get ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--sample-id` | string | Sample id(smpl-...)。与 --step/--index 互斥。 | | `--step` | int | Step 序号(配合 --index 选取指定 rollout) | | `--index` | int | 该 step 内从 0 开始的 rollout 序号(默认 0) | | `--since` | string | 相对当前时间的时间窗口。默认 30d。 | | `--output` | string | 将 JSON 写入该文件路径 | ### train finetune trajectory list 列出某精调任务的 RL rollout 轨迹。直接从该任务对应的火山 TLS topic(TrajectoryTLSConfig.TopicID)读取——绕过 ARK 控制面。默认输出为摘要(step / sample_id / phase / reward / advantage / tokens / duration),对 Agent 友好,约 150 字节/条。传 --full 得到完整形态(展开 sample / trajectory / metrics / reward_details / plugin_details,约 3KB/条)。传 --output FILE 可把完整 JSON 落盘,stdout 只留一小段元信息。需要 SSO 认证的 profile(与 logs 的限制相同)。 ```Bash arkcli train finetune trajectory list ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--step` | int | 按 step 序号过滤(例如 --step 20) | | `--phase` | string | 按阶段过滤:train \| eval | | `--sample-id` | string | 按 sample id 过滤(smpl-...) | | `--query` | string | 原始 TLS 查询表达式;覆盖 --step/--phase/--sample-id | | `--limit` | int | 最多返回的条目数(默认 200;因 TLS API 单次上限 100,超过 100 会自动分页)。--all 时忽略。 | | `--since` | string | 相对当前时间的时间窗口(30m / 2h / 24h)。默认 30d(覆盖 TLS 完整保留期)。 | | `--full` | bool | 返回完整内容:sample / trajectory / metrics / reward_details / plugin_details(约 3KB/条,较重) | | `--all` | bool | 一直分页直到后端把该 topic 读完。必须配合 --output FILE——拒绝把无界数据直接打到 stdout。 | | `--output` | string | 将完整 JSON 写入该文件路径;stdout 只显示元信息(推荐 Agent 场景使用)。设置 --all 时必填。 | ### train finetune update 更新精调任务的可变字段(name / description)。--name 与 --description 至少要传一个;空字段不会被提交。 ```Bash arkcli train finetune update ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--name` | string | 新的任务名称 | | `--description` | string | 新的任务描述 | ### train finetune watch 轮询精调任务直到进入终态(Completed / Failed / Terminated)。默认模式:按阶段逐行把进度输出到 stderr;--rich 模式额外给出步进度条 / ETA / 各指标迷你走势(最近 30 步)。免去 Agent/CI 自己写轮询循环。 ```Bash arkcli train finetune watch ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--interval` | string | 轮询间隔,支持时长写法(如 15s、1m、1h30m)或纯整数秒。默认 30s;--rich 模式默认 5s,与 maas-fe 的进度图一致 | | `--timeout` | string | 总等待上限,可用时长(如 30m、2h)或纯整数秒;0 = 不超时(默认 0) | | `--quiet` | bool | 关闭每次 tick 打印到 stderr 的进度 | | `--rich` | bool | 渲染 PRD 风格 TUI:step / 进度条 / ETA / 迷你趋势图指标。stderr 不是 TTY 时自动关闭。 | | `--metric` | string_slice | (--rich)要渲染成迷你走势的指标(以 / 分隔的键,例如 train/loss、train/lr、train/grad_norm)。默认:train/loss、train/lr、train/grad_norm、train/global_step。可重复。 | --- # 工具与平台 Source: https://ark.volcengine.com/region:cn-beijing/docs/tools-and-platform 接入与工具:把方舟能力配置进第三方 Agent、安装内嵌 Skills、生成调用示例、原始 API 兜底,以及 CLI 自升级与体验入口。 - `helper` 配置 model/provider 与 Harness 工具能力;`+connect` 安装二进制内嵌 Skills;`+code-example` 生成多语言调用示例; - `api` 是已注册 Action 的兜底通道,先用产品命令、覆盖不到再用; - `update` 只响应显式调用,无静默升级;`exp` 是 Volc 专属的交互式 TUI 体验入口。 ## +code-example 为指定基础模型生成多语言(Python / Go / Java / Node / curl)调用示例代码并写入本地文件。 ```Bash arkcli +code-example ``` 示例: ```Bash arkcli +code-example \ --model doubao-seedream-5-0 \ --language python \ --format json ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--model` | string(必填) | 基础模型名称或捆绑 id(如 doubao-seedream-5-0 或 doubao-seedream-5-0-260128) | | `--version` | string | 基础模型版本(如 260128);若 --model 已带版本则省略 | | `--language` | string | 按语言过滤:python、go、java、node、curl(默认全部) | | `--lang` | string | --language 的已废弃别名;在本命令上选择 UI 语言请用根命令的 --ui-lang | | `--output-dir` | string | 示例文件输出目录(默认:./ark-examples/) | ## +connect 把 arkcli 内置 AI skills 安装到本机检测到的所有 AI Agent ```Bash arkcli +connect ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--path` | string | 把 arkcli skills 安装到指定的本地 skills 目录,而不是自动探测的全局 agent 目录;相对路径基于当前工作目录解析 | | `--refresh` | bool | 对外版:先从 CDN(首选)/ GitHub(兜底)重新下载最新 skill 再安装(内场版 skill 已内嵌,此标志为空操作) | | `--keep-conflicting` | bool | 保留会劫持 +gen 路由的第三方生成技能(byted-ark-seedance/seedream);默认 +connect 会把它们从各 Agent 目录中移除 | ### +connect list 列出支持的 AI Agent 及检测状态 ```Bash arkcli +connect list ``` ### +connect uninstall 从检测到的 AI Agent 中卸载 arkcli AI skills ```Bash arkcli +connect uninstall ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--path` | string | 只从指定的本地 skills 目录卸载 arkcli skills,而不是自动探测的全局 agent 目录;相对路径基于当前工作目录解析 | | `--purge-prefix` | bool | 破坏性删除所有以 ark-/arkcli- 为前缀的目录或软链接,包括非 ArkCLI 管理的条目 | ## api 已注册 Action 的原始 API 浏览器 ```Bash arkcli api [registered-action] ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--dry-run` | bool | 预览客户端执行计划,不发网络请求、无副作用 | | `--list` | bool | 列出全部已注册的 API Action | | `--params` | string | JSON 请求体 | ## exp 启动方舟体验 TUI ```Bash arkcli exp ``` ### exp uninstall 卸载方舟体验 TUI ```Bash arkcli exp uninstall ``` ## helper 交互向导:把本机 AI Agent 配置到 Platform Endpoint 或受支持的 Plan ```Bash arkcli helper ``` ### helper configure 非交互配置单个 harness 到 Platform Endpoint 或受支持的 Plan ```Bash arkcli helper configure ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--profile` | string | 目标 Platform / Plan profile(默认当前 active) | | `--model` | string | Plan model ID(默认取该 plan 选中/首个模型;Platform 不可用) | | `--endpoint` | string | 已验证的 Platform 文本 Endpoint ID(仅 Platform profile 必填) | | `--codex-config-scope` | string | (仅 Codex)配置范围:profile(默认,写 ~/.codex/arkcli.config.toml)\|global(写 ~/.codex/config.toml) | | `--codex-profile` | string | (仅 Codex profile 模式)Codex profile 名,默认 arkcli | | `--dsh-config-scope` | string | (仅 DSH)配置范围:home(默认,写 $DSH_HOME/cordis.patch.yml)\|profile(写 $DSH_HOME/profiles//cordis.patch.yml,需 --dsh-profile) | | `--dsh-profile` | string | (仅 DSH)profile scope 的 DSH profile 名 | | `--with-mcp` | bool | 同时注入 Agent Plan 内置 MCP(豆包搜索 + dataPro + OpenViking;仅 Agent Plan 含团队版、且支持 MCP 的 harness 生效) | | `--keep-native-websearch` | bool | 保持原生 WebSearch 开启 | | `--with-cua` | bool | 同时安装云电脑(CUA)skill(仅 Agent Plan 个人版 Medium/Large/Max;一次性装给所有已安装的 AI Agent;失败只 warn) | | `--with-routing` | bool | 启用 Agent Plan 强制搜索路由(同时配置所选业务 MCP) | | `--with-supabase` | bool | 同时装 byted-supabase CLI+Skill 并注入火山登录态(仅 Agent Plan 家族;个人版全档 + 团队版全档;与 harness 无关、失败只 warn) | ### helper list 列出支持的 AI Agent 及其安装状态、配置路径 ```Bash arkcli helper list ``` ### helper mcp 为目标 agent 配置 Agent Plan Harness 工具;默认配置整组 MCP(豆包搜索 + DataPro + OpenViking),可用 --capability 只配单项。不传 target 自动检测;不改模型 ```Bash arkcli helper mcp [target] ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--capability` | string | 只配置一项 Harness 能力:datapro \| web-search \| agent-memory(不传则保持整组 MCP 旧行为) | | `--profile` | string | 指定 Agent Plan profile(默认自动定位账号下的 agent-plan / agent-plan-team profile,与当前 active profile 无关) | | `--ov-resource` | string | 指定 OpenViking 库(按库名;账号有多个库时必填,不填会报错列出可选库名) | | `--scope` | string | MCP 写入范围:global(默认,用户级 ~/.trae/mcp.json 等)\| project(仅 Trae,写当前目录 ./.trae/mcp.json) | | `--codex-config-scope` | string | (仅 Codex)配置范围:profile(默认,写 ~/.codex/arkcli.config.toml)\|global(写 ~/.codex/config.toml) | | `--codex-profile` | string | (仅 Codex profile 模式)Codex profile 名,默认 arkcli | | `--dsh-config-scope` | string | (仅 DSH)配置范围:home(默认,写 $DSH_HOME/cordis.patch.yml)\|profile(写 $DSH_HOME/profiles//cordis.patch.yml,需 --dsh-profile) | | `--dsh-profile` | string | (仅 DSH)profile scope 的 DSH profile 名 | | `--keep-native-websearch` | bool | 保持原生 WebSearch 开启 | ### helper reset 移除 arkcli 为某 harness 注入的配置(含 MCP),保留用户其它设置 ```Bash arkcli helper reset ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--scope` | string | (仅 Trae)移除范围:global(默认,~/.trae/mcp.json)\| project(./.trae/mcp.json) | | `--codex-config-scope` | string | (仅 Codex)移除范围:profile(默认,~/.codex/arkcli.config.toml)\|global(~/.codex/config.toml) | | `--codex-profile` | string | (仅 Codex profile 模式)Codex profile 名,默认 arkcli | | `--dsh-config-scope` | string | (仅 DSH)配置范围:home(默认,写 $DSH_HOME/cordis.patch.yml)\|profile(写 $DSH_HOME/profiles//cordis.patch.yml,需 --dsh-profile) | | `--dsh-profile` | string | (仅 DSH)profile scope 的 DSH profile 名 | ### helper supabase 装 byted-supabase-cli + skill 并注入火山 Agent Plan 登录态(打通 byted-supabase 数据库能力);仅 Agent Plan(个人版全档 + 团队版全档) ```Bash arkcli helper supabase ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--profile` | string | 指定 Agent Plan profile(默认自动定位账号下的 agent-plan / agent-plan-team profile,与当前 active 无关) | ## update 升级 arkcli 到最新稳定版本 ```Bash arkcli update ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--check` | bool | 只检查是否有新版本, 不执行升级 | | `--refresh` | bool | 配合 --check: 强制联网查询最新版本 (默认只读本地缓存) | | `--yes` | bool | 跳过交互确认, 直接升级 | --- # Managed Agents Source: https://ark.volcengine.com/region:cn-beijing/docs/managed-agents ARK Managed Agents:Agent / Skill / Env / Session / File / Memory Store / Vault 的完整生命周期,以及围绕会话的高频快捷工作流。 - `agent` 域管八大资源类型:控制面(Agent/Skill/Env 定义)走 ForTop/OpenTOP,数据面(Session 运行时、文件)直联; - 快捷工作流按生命周期分工:`+new-agent` / `+iterate` 建与改,`+new` 起会话,`+tail` / `+debug` / `+export` 观察与导出; - 典型链路:`agent create` → `env create` → `session create` → `session events send/stream`。 ## +debug 诊断某个托管智能体会话(事件、错误与执行状态,按 session-id) ```Bash arkcli +debug ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--limit` | int | 最多检查的最近事件数 | | `--session-thread-id` | string | 按会话 thread id 过滤事件 | ## +export 把托管智能体会话诊断信息导出为本地归档 ```Bash arkcli +export ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--output` | string | 输出 .tar.gz 路径 | | `--limit` | int | 最多导出的事件数 | | `--session-thread-id` | string | 按会话 thread id 过滤事件 | ## +iterate 更新托管智能体、新建一个会话,然后可选进入对话 ```Bash arkcli +iterate ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--env-id` | string | 新会话使用的环境 ID;默认取最新环境(--environment-id 的别名) | | `--environment-id` | string | 新会话使用的环境 ID;默认取最新环境 | | `--title` | string | 新会话标题 | | `--resource` | string | 新会话的 Resources 数组 | | `--tos-path` | string | 要挂载的 TOS 目录,例如 tos://bucket/prefix/ | | `--vault-id` | string_slice | 新会话的 Vault id;逗号分隔或重复传入 | | `--vault-ids` | string_slice | 新会话的 Vault id;逗号分隔或重复传入 | | `--tags` | string | 会话 tags 映射或 tag 数组 | | `--agent-overrides` | string | AgentWithOverrides 对象;行内 JSON/YAML 或 @file | | `--environment-overrides` | string | EnvironmentWithOverrides 对象;行内 JSON/YAML 或 @file | | `--message` | string | 创建会话后发送一条消息,空闲后退出 | | `--session-thread-id` | string | 首条消息 / REPL 的目标会话 thread id | | `--no-event-deltas` | bool | 不请求 PRD 的 event_start/event_delta 帧,只使用完整事件 | | `--raw` | bool | 对话时打印原始 NDJSON 流事件 | | `--no-chat` | bool | 只更新 Agent 并创建 Session,不进入 chat/REPL | | `--diff` | bool | 预览 update/session/chat 的请求内容,不改变远端状态 | | `--file` | string | JSON/YAML 格式 UpdateAgentRequest 载荷的路径。传 - 或省略 --file 表示从 stdin 读取 | | `--version` | int | 可选的 Agent 当前版本;省略或为 0 时从 GetAgent 自动读取,正数用于显式并发版本检查 | | `--name` | string | Agent 名称 | | `--display-name` | string | Agent 展示名 | | `--model` | string | 模型 ID 或包含 id/provider/speed/thinking/reasoning_effort/service_tier 的对象 | | `--speed` | string | 兼容保留的模型 speed 参数 | | `--thinking` | string | 模型思考模式 | | `--reasoning-effort` | string | 模型推理强度 | | `--service-tier` | string | 模型服务等级 | | `--description` | string | 智能体描述 | | `--system` | string | System 提示词,或用 @file 从磁盘读取 | | `--tool` | string_slice | 替换工具列表;可重复或直接传数组,用 [] 清空 | | `--mcp-server` | string_slice | 替换 MCP server 列表;可重复传入或直接传数组,传 [] 表示清空 | | `--skill` | string_slice | 替换技能列表;可重复或直接传数组,用 [] 清空 | | `--multiagent` | string | 多 Agent 配置对象 | | `--metadata` | string | 元数据补丁 map 对象;值为 null 表示删除该键 | ## +new ARK Managed Agent 运行时命令:新建 Agent 会话(`+new session`)、创建新 Agent 定义(`+new-agent`)、迭代已有 Agent(`+iterate`)。 - 面向“让 Agent 跑起来”的任务入口:定义、会话、迭代一条链路; - 底层资源仍归 `agent` 域管理,本域提供的是面向任务的快捷工作流。 ### +new session 新建一个托管智能体会话,然后进入对话 ```Bash arkcli +new session [agent-id] ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--agent-id` | string | 用于新建对话会话的智能体 ID | | `--agent-version` | int | 新建对话会话使用的智能体版本 | | `--env-id` | string | 新建对话会话使用的环境 ID(--environment-id 的别名) | | `--environment-id` | string | 新建对话会话使用的环境 ID | | `--title` | string | 新会话标题 | | `--resource` | string | 新会话的 Resources 数组 | | `--tos-path` | string | 要挂载的 TOS 目录,例如 tos://bucket/prefix/ | | `--vault-id` | string_slice | 新会话的 Vault id;逗号分隔或重复传入 | | `--vault-ids` | string_slice | 新会话的 Vault id;逗号分隔或重复传入 | | `--tags` | string | 新会话的 tags 映射或 tag 数组 | | `--agent-overrides` | string | AgentWithOverrides 对象;行内 JSON/YAML 或 @file | | `--environment-overrides` | string | EnvironmentWithOverrides 对象;行内 JSON/YAML 或 @file | | `--message` | string | 发送一条消息,会话回到空闲后退出 | | `--session-thread-id` | string | 目标会话 thread id | | `--no-event-deltas` | bool | 不请求 PRD 的 event_start/event_delta 帧,只使用完整事件 | | `--max-event-chars` | int | 美化后事件文本最多显示的字符数;默认 2000,0 表示不限制 | | `--raw` | bool | 打印原始 NDJSON 流事件 | ## +new-agent 用结构化字段创建托管智能体,可选择 fork 已有的智能体 ```Bash arkcli +new-agent ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--fork` | string | 在应用覆盖项之前要复制的已有智能体 ID | | `--from` | string | --fork 的别名 | | `--no-echo` | bool | 跳过最后的 GetAgent 回显,只打印 CreateAgent 响应 | | `--file` | string | JSON/YAML 格式 CreateAgentRequest 载荷的路径。传 - 或省略 --file 表示从 stdin 读取 | | `--name` | string | Agent 名称 | | `--display-name` | string | Agent 展示名 | | `--base-agent` | string | 基础智能体 ID | | `--model` | string | 模型 ID 或包含 id/provider/speed/thinking/reasoning_effort/service_tier 的对象 | | `--speed` | string | 兼容保留的模型 speed 参数 | | `--thinking` | string | 模型思考模式 | | `--reasoning-effort` | string | 模型推理强度 | | `--service-tier` | string | 模型服务等级 | | `--description` | string | 智能体描述 | | `--system` | string | System 提示词,或用 @file 从磁盘读取 | | `--tool` | string_slice | 完整替换 Tools 数组。省略时 arkcli 发送默认的 agent_toolset_20260701;传 [] 可关闭默认值 | | `--mcp-server` | string_slice | MCP server 对象;可重复传入或直接传数组 | | `--skill` | string_slice | Skill 对象;可重复传入或传数组。裸 skill-xxx ID 作为 custom TOP skill 且省略 Version 表示使用最新版;s-xxx SkillHub ID 必须传显式对象 | | `--skill-zip` | string_slice | 通过 CreateSkill 上传并作为自定义技能挂载的本地技能 zip 包;可重复 | | `--multiagent` | string | 多 Agent 配置对象 | | `--metadata` | string | 元数据 map 对象 | | `--tags` | string | Tags 映射或 tag 数组 | | `--show-system` | bool | 在表格输出中展示完整 System 提示词 | | `--yes` | bool | 在交互终端下跳过 [y/N] 模型开通确认。非交互模式除非设置 ARKCLI_ALLOW_HEADLESS_ACTIVATION=1,否则拒绝开通。 | ## +tail 持续跟踪托管智能体会话事件 ```Bash arkcli +tail ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--after` | string | 游标:取该事件 ID 之后的数据 | | `--before` | string | 游标:取该事件 ID 之前的数据 | | `--since` | string | 游标/时间下界 | | `--created-after` | string | 事件 created_at 下界(RFC3339) | | `--created-before` | string | 事件 created_at 上界(RFC3339) | | `--type` | string_slice | 事件类型过滤;可重复或用逗号分隔 | | `--session-thread-id` | string | 按会话 thread id 过滤 | | `--no-event-deltas` | bool | 不请求 PRD 的 event_start/event_delta 帧,只使用完整事件 | | `--max-event-chars` | int | 美化后事件文本最多显示的字符数;默认 2000,0 表示不限制 | | `--order` | string | 排序方向:asc \| desc | | `--raw` | bool | 打印原始 NDJSON 事件,而不是人类可读的 tail 视图 | ## agent ARK Managed Agents 全生命周期管理:Agent、Skill、环境(Env)、会话(Session)、文件(File)、记忆库(Memory Store)、凭证保险库(Vault / MCP OAuth)八大资源类型。 - **控制面**(Agent/Skill/Env 定义)优先走 ForTop/OpenTOP,**数据面**(Session 运行时、文件上传下载)直联对应服务,CLI 自动分流; - 典型链路:`agent create` 建定义 → `env create` 准备运行环境 → `session create` 起会话 → `session events send/stream` 驱动执行; - `session compact/upgrade`、`env work stats` 等命令负责长会话压缩、热升级与算力用量审计; - `vault credentials` 与 `vault oauth-flow` 管理敏感凭证,避免明文出现在命令行历史里。 ### agent +mcp-login 创建 Vault MCP OAuth 流程:打开授权链接并等待回调 ```Bash arkcli agent +mcp-login ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--vault-id` | string(必填) | Vault id | | `--display-name` | string | 凭证显示名 | | `--name` | string | --display-name 的别名 | | `--mcp-server-url` | string(必填) | MCP server URL | | `--callback-host` | string | 本地回调监听地址(默认 127.0.0.1) | | `--callback-port` | int | 本地回调监听端口;0 表示自动选择 | | `--callback-path` | string | 本地回调 HTTP 路径(默认 /callback) | | `--timeout` | string | 等待回调的最长时间,例如 5m 或 300s(默认 5m0s) | | `--source` | string | 流程来源标记(默认 arkcli-mcp-login) | | `--client-id` | string | 自定义 MCP/provider 覆盖模式下的 OAuth client id | | `--client-secret` | string | OAuth client secret,或用 @file 从磁盘读取 | | `--no-open` | bool | 不自动打开浏览器,改为打印授权 URL | ### agent activate 开通 Managed Agent 服务(账号级计费能力操作,仅火山版;已开通时直接返回状态,不重复开通) ```Bash arkcli agent activate ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--yes` | bool | 在交互终端下跳过 [y/N] 开通确认。非交互模式除非设置 ARKCLI_ALLOW_HEADLESS_ACTIVATION=1,否则拒绝开通 | ### agent agent create 创建托管智能体定义(名称、模型、系统提示词、技能、工具) ```Bash arkcli agent agent create ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--file` | string | JSON/YAML 格式 CreateAgentRequest 载荷的路径。传 - 或省略 --file 表示从 stdin 读取 | | `--name` | string | Agent 名称 | | `--display-name` | string | Agent 展示名 | | `--base-agent` | string | 基础智能体 ID | | `--model` | string | 模型 ID 或包含 id/provider/speed/thinking/reasoning_effort/service_tier 的对象 | | `--speed` | string | 兼容保留的模型 speed 参数 | | `--thinking` | string | 模型思考模式 | | `--reasoning-effort` | string | 模型推理强度 | | `--service-tier` | string | 模型服务等级 | | `--description` | string | 智能体描述 | | `--system` | string | System 提示词,或用 @file 从磁盘读取 | | `--tool` | string_slice | 完整替换 Tools 数组。省略时 arkcli 发送默认的 agent_toolset_20260701;传 [] 可关闭默认值 | | `--mcp-server` | string_slice | MCP server 对象;可重复传入或直接传数组 | | `--skill` | string_slice | Skill 对象;可重复传入或传数组。裸 skill-xxx ID 作为 custom TOP skill 且省略 Version 表示使用最新版;s-xxx SkillHub ID 必须传显式对象 | | `--skill-zip` | string_slice | 通过 CreateSkill 上传并作为自定义技能挂载的本地技能 zip 包;可重复 | | `--multiagent` | string | 多 Agent 配置对象 | | `--metadata` | string | 元数据 map 对象 | | `--tags` | string | Tags 映射或 tag 数组 | | `--show-system` | bool | 在表格输出中展示完整 System 提示词 | | `--yes` | bool | 在交互终端下跳过 [y/N] 模型开通确认。非交互模式除非设置 ARKCLI_ALLOW_HEADLESS_ACTIVATION=1,否则拒绝开通。 | ### agent agent delete 删除托管智能体并级联删除其会话(需确认,或用 --yes 跳过) ```Bash arkcli agent agent delete ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--yes` | bool | 硬删除及级联删除会话时跳过交互确认 | ### agent agent get 查看托管智能体定义(配置、版本、已绑定技能;--show-system 展示完整系统提示词) ```Bash arkcli agent agent get ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--version` | int | Agent 版本 | | `--show-system` | bool | 在表格输出中展示完整 System 提示词 | ### agent agent list 按条件(名称、ID、时间范围)分页列出托管智能体 ```Bash arkcli agent agent list ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--created-at-gte` | string | 按创建时间下界过滤(RFC3339) | | `--created-at-lte` | string | 按创建时间上界过滤(RFC3339) | | `--limit` | int | 分页大小 | | `--page` | string | 分页游标 / 页码 | | `--id` | string | 按智能体 ID 过滤 | | `--ids` | string_slice | 按智能体 ID 过滤,逗号分隔或重复传入 | | `--name` | string | 按 Agent 名称过滤 | | `--display-name` | string | 按 Agent 展示名过滤 | | `--sort-by` | string | 排序字段 | | `--sort-order` | string | 排序方向:Asc \| Desc | | `--show-system` | bool | 在表格输出中展示完整 System 提示词 | ### agent agent update 更新托管智能体定义(名称、模型、技能;--file 接受 JSON/YAML 载荷) ```Bash arkcli agent agent update ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--file` | string | JSON/YAML 格式 UpdateAgentRequest 载荷的路径。传 - 或省略 --file 表示从 stdin 读取 | | `--version` | int | 可选的 Agent 当前版本;省略或为 0 时从 GetAgent 自动读取,正数用于显式并发版本检查 | | `--name` | string | Agent 名称 | | `--display-name` | string | Agent 展示名 | | `--model` | string | 模型 ID 或包含 id/provider/speed/thinking/reasoning_effort/service_tier 的对象 | | `--speed` | string | 兼容保留的模型 speed 参数 | | `--thinking` | string | 模型思考模式 | | `--reasoning-effort` | string | 模型推理强度 | | `--service-tier` | string | 模型服务等级 | | `--description` | string | 智能体描述 | | `--system` | string | System 提示词,或用 @file 从磁盘读取 | | `--tool` | string_slice | 替换工具列表;可重复或直接传数组,用 [] 清空 | | `--mcp-server` | string_slice | 替换 MCP server 列表;可重复传入或直接传数组,传 [] 表示清空 | | `--skill` | string_slice | 替换技能列表;可重复或直接传数组,用 [] 清空 | | `--multiagent` | string | 多 Agent 配置对象 | | `--metadata` | string | 元数据补丁 map 对象;值为 null 表示删除该键 | ### agent agent versions 列出托管智能体的版本历史 ```Bash arkcli agent agent versions ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--limit` | int | 分页大小 | | `--page` | string | 分页游标 / 页码 | ### agent env create 创建托管智能体环境 ```Bash arkcli agent env create ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--file` | string | JSON/YAML 载荷的路径。传 - 或省略 --file 表示从 stdin 读取 | | `--name` | string | 环境名称 | | `--description` | string | 环境描述 | | `--config` | string | 环境配置对象 | | `--setup-script` | string | 环境初始化脚本,或 @file;写入 Config.SetupScript | | `--metadata` | string | 元数据 map 对象 | | `--scope` | string | 环境范围 | | `--runtime-type` | string | 环境运行方式:cloud \| self_hosted(Config.Type) | ### agent env delete 删除托管智能体环境 ```Bash arkcli agent env delete ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--file` | string | JSON/YAML 载荷的路径。传 - 或省略 --file 表示从 stdin 读取 | | `--yes` | bool | 跳过删除的交互确认 | ### agent env get 获取托管智能体环境 ```Bash arkcli agent env get ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--file` | string | JSON/YAML 载荷的路径。传 - 或省略 --file 表示从 stdin 读取 | ### agent env list 列出托管智能体环境 ```Bash arkcli agent env list ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--file` | string | JSON/YAML 载荷的路径。传 - 或省略 --file 表示从 stdin 读取 | | `--limit` | int | 分页大小 | | `--page` | string | 分页游标 / 页码 | | `--id` | string | 按环境 ID 过滤 | | `--name` | string | 按环境名称过滤 | | `--sort-by` | string | 排序字段 | | `--sort-order` | string | 排序方向:Asc \| Desc | ### agent env update 更新托管智能体环境 ```Bash arkcli agent env update ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--file` | string | JSON/YAML 载荷的路径。传 - 或省略 --file 表示从 stdin 读取 | | `--name` | string | 环境名称 | | `--description` | string | 环境描述 | | `--config` | string | 环境配置对象 | | `--setup-script` | string | 环境初始化脚本,或 @file;写入 Config.SetupScript | | `--metadata` | string | 元数据 map 对象 | | `--scope` | string | 环境范围 | ### agent env work get 查询自托管 Work Item ```Bash arkcli agent env work get ``` ### agent env work list 列出自托管环境的 Work Items ```Bash arkcli agent env work list ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--limit` | int | 分页大小 | | `--page` | string | 分页游标 / 页码 | ### agent env work stats 查询自托管环境的队列统计 ```Bash arkcli agent env work stats ``` ### agent env work stop 请求停止 Work Item ```Bash arkcli agent env work stop ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--force` | bool | 立即将 Work 标记为 stopped;不代表远端 Sandbox 已退出 | | `--yes` | bool | 确认停止此 Work Item | ### agent file delete 从 ARK Files 存储中删除文件 ```Bash arkcli agent file delete ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--yes` | bool | 确认删除 | ### agent file get 获取 ARK Files 存储中文件的元数据 ```Bash arkcli agent file get ``` ### agent file list 列出已上传到 ARK Files 存储的文件 ```Bash arkcli agent file list ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--limit` | int | 分页大小 | | `--after` | string | 游标:取该文件 ID 之后的数据 | | `--order` | string | 排序方向:asc \| desc | | `--purpose` | string | 文件用途(默认 user_data) | | `--session-id` | string | 按 managed-agent 会话范围过滤文件 | ### agent file upload 把本地文件或 URL 上传到 ARK Files 存储并返回 file_id ```Bash arkcli agent file upload ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--path` | string | 以 multipart 字段 file 上传的本地文件路径 | | `--url` | string | 要注册的 HTTP/HTTPS URL 或 tos:// URI;与 --path 互斥 | | `--purpose` | string | 文件用途(默认 user_data) | | `--session-id` | string | 附加 Ark-Agent-Session-Id 头,用于 managed-agent 会话范围的文件 | | `--tos` | string | TOS 存储对象,例如 '{bucket: b, prefix: arkfiles/}' | | `--preprocess-configs` | string | 预处理配置对象 | | `--expire-at` | int | UTC Unix 时间戳(秒) | | `--wait-active` | bool | 返回前轮询 file get 直到状态变为 active | | `--wait-timeout` | int | 配合 --wait-active 的最长等待秒数;默认 120 | | `--wait-interval` | int | 配合 --wait-active 的轮询间隔秒数;默认 2 | ### agent file wait 等待文件进入 active 状态 ```Bash arkcli agent file wait ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--wait-timeout` | int | 最长等待秒数;默认 120 | | `--wait-interval` | int | 轮询间隔秒数;默认 2 | ### agent memory-store create 创建记忆库 ```Bash arkcli agent memory-store create ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--file` | string | JSON/YAML 载荷的路径。传 - 或省略 --file 表示从 stdin 读取 | | `--name` | string | Memory Store 名称 | | `--description` | string | 记忆库描述 | ### agent memory-store creators 列出记忆库创建者 ```Bash arkcli agent memory-store creators ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--file` | string | JSON/YAML 载荷的路径。传 - 或省略 --file 表示从 stdin 读取 | ### agent memory-store delete 删除记忆库 ```Bash arkcli agent memory-store delete ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--file` | string | JSON/YAML 载荷的路径。传 - 或省略 --file 表示从 stdin 读取 | | `--yes` | bool | 跳过删除的交互确认 | ### agent memory-store get 获取记忆库 ```Bash arkcli agent memory-store get ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--file` | string | JSON/YAML 载荷的路径。传 - 或省略 --file 表示从 stdin 读取 | ### agent memory-store list 列出记忆库 ```Bash arkcli agent memory-store list ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--file` | string | JSON/YAML 载荷的路径。传 - 或省略 --file 表示从 stdin 读取 | | `--limit` | int | 分页大小 | | `--page` | string | 分页游标 / 页码 | | `--name` | string | 按 Memory Store 名称过滤 | | `--created-by` | string_slice | 创建者用户 ID,逗号分隔或重复传入 | ### agent memory-store memories batch-create 批量创建记忆 ```Bash arkcli agent memory-store memories batch-create ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--file` | string | JSON/YAML 载荷的路径。传 - 或省略 --file 表示从 stdin 读取 | | `--items` | string | 记忆条目数组 | ### agent memory-store memories create 创建记忆 ```Bash arkcli agent memory-store memories create ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--file` | string | JSON/YAML 载荷的路径。传 - 或省略 --file 表示从 stdin 读取 | | `--path` | string | Memory 路径 | | `--content` | string | 记忆内容,或用 @file 从磁盘读取 | ### agent memory-store memories delete 删除记忆 ```Bash arkcli agent memory-store memories delete [memory-id] ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--file` | string | JSON/YAML 载荷的路径。传 - 或省略 --file 表示从 stdin 读取 | | `--yes` | bool | 跳过删除的交互确认 | | `--memory-id` | string | 记忆 ID | ### agent memory-store memories get 获取记忆 ```Bash arkcli agent memory-store memories get [memory-id] ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--file` | string | JSON/YAML 载荷的路径。传 - 或省略 --file 表示从 stdin 读取 | | `--memory-id` | string | 记忆 ID | | `--view` | string | Memory 视图:basic \| full | ### agent memory-store memories list 列出记忆库中的记忆 ```Bash arkcli agent memory-store memories list ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--file` | string | JSON/YAML 载荷的路径。传 - 或省略 --file 表示从 stdin 读取 | | `--limit` | int | 分页大小 | | `--page` | string | 分页游标 / 页码 | | `--path-prefix` | string | Memory 路径前缀(默认 /) | | `--updated-after` | string | 过滤在该时间之后更新的 Memory(RFC3339) | | `--depth` | int | 列表深度 | ### agent memory-store memories update 更新记忆 ```Bash arkcli agent memory-store memories update [memory-id] ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--file` | string | JSON/YAML 载荷的路径。传 - 或省略 --file 表示从 stdin 读取 | | `--memory-id` | string | 记忆 ID | | `--path` | string | Memory 路径 | | `--content` | string | 记忆内容,或用 @file 从磁盘读取 | | `--content-sha256` | string | 用于乐观锁的当前内容 sha256 期望值 | ### agent memory-store update 更新记忆库 ```Bash arkcli agent memory-store update ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--file` | string | JSON/YAML 载荷的路径。传 - 或省略 --file 表示从 stdin 读取 | | `--name` | string | Memory Store 名称 | | `--description` | string | 记忆库描述 | ### agent model config 查询基础模型运行参数的支持值与默认值 ```Bash arkcli agent model config ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--provider` | string | 查询模型 metadata 使用的 provider(不切换账号或产品)(默认 ark) | | `--key` | string_slice | Metadata key,可重复或逗号分隔;省略时查询全部配置 | ### agent model list 列出可作为托管智能体底座的基础模型 ```Bash arkcli agent model list ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--usage` | string | 模型用途:agent(主模型,默认)或 tool(工具模型) | | `--query` | string | 用于补充/排序 ArkModels managed-agent 白名单的用户意图或关键词 | | `--name` | string | 按模型名称子串过滤 | | `--refresh-cache` | bool | 同步刷新全版本 ArkModels 缓存;失败冷却期内不重试;query 模式同时刷新搜索缓存 | | `--include-all` | bool | 不按所选用途过滤支持性,返回所有模型并标注能力 | | `--primary-only` | bool | 从完整模型列表中只保留主版本 | ### agent session compact 压缩空闲 Managed Agent Session 的当前上下文 ```Bash arkcli agent session compact ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--instructions` | string | 可选压缩指令,或 @file | | `--session-thread-id` | string | 目标 Session Thread ID | | `--timeout` | int | 完成超时秒数;默认 120 | | `--poll` | bool | 轮询事件列表,不建立 SSE 流 | | `--raw` | bool | 输出原始 NDJSON 事件 | ### agent session create 创建托管智能体会话 ```Bash arkcli agent session create ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--file` | string | JSON/YAML 载荷的路径。传 - 或省略 --file 表示从 stdin 读取 | | `--agent-id` | string | 智能体 ID | | `--agent-version` | int | 智能体版本 | | `--agent` | string | 已解析的智能体对象;设置后覆盖 --agent-id/--agent-version | | `--env-id` | string | 环境 ID(--environment-id 的别名) | | `--environment-id` | string | 环境 ID | | `--title` | string | 会话标题 | | `--resource` | string | Resources 数组 | | `--tos-path` | string | 要挂载的 TOS 目录,例如 tos://bucket/prefix/;会追加一个 type=tos 资源 | | `--vault-id` | string_slice | Vault id;逗号分隔或重复传入 | | `--vault-ids` | string_slice | Vault id,逗号分隔或重复传入 | | `--tags` | string | Tags 映射或 tag 数组 | | `--agent-overrides` | string | AgentWithOverrides 对象;行内 JSON/YAML 或 @file | | `--environment-overrides` | string | EnvironmentWithOverrides 对象;行内 JSON/YAML 或 @file | ### agent session delete 删除托管智能体会话 ```Bash arkcli agent session delete ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--file` | string | JSON/YAML 载荷的路径。传 - 或省略 --file 表示从 stdin 读取 | | `--yes` | bool | 跳过删除的交互确认 | ### agent session events list 列出托管智能体会话事件 ```Bash arkcli agent session events list ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--file` | string | JSON/YAML 请求体的路径。传 - 或省略 --file 表示从 stdin 读取 | | `--limit` | int | 分页大小 | | `--page` | string | 分页游标 / 页码 | | `--after` | string | 游标:取该事件 ID 之后的数据 | | `--before` | string | 游标:取该事件 ID 之前的数据 | | `--since` | string | 游标/时间下界 | | `--created-after` | string | 事件 created_at 下界(RFC3339) | | `--created-before` | string | 事件 created_at 上界(RFC3339) | | `--type` | string_slice | 事件类型过滤;可重复或用逗号分隔 | | `--session-thread-id` | string | 按会话 thread id 过滤 | | `--order` | string | 排序方向:asc \| desc | ### agent session events send 发送托管智能体会话事件 ```Bash arkcli agent session events send ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--file` | string | JSON/YAML 请求体的路径。传 - 或省略 --file 表示从 stdin 读取 | | `--events` | string | 事件数组;多个事件按顺序串行发送(非原子) | | `--event` | string | 单个事件对象 | | `--type` | string | 单个事件类型,例如 user.message | | `--text` | string | user.message 的文本 | | `--content` | string | 内容字符串,或用 @file 从磁盘读取 | | `--image` | string_slice | 图片文件 ID 或 @本地路径;可重复或逗号分隔 | | `--document` | string_slice | 文档 / PDF 文件 ID 或 @本地路径;可重复或逗号分隔 | | `--purpose` | string | 本地 --image/--document 上传的文件用途(默认 user_data) | | `--wait-timeout` | int | 本地上传、--stream/--wait 初始阶段或 --poll 的秒数;默认 120 | | `--wait-interval` | int | 本地多模态上传的轮询间隔秒数;默认 2 | | `--session-thread-id` | string | 目标会话 thread id | | `--no-event-deltas` | bool | 不请求 PRD 的 event_start/event_delta 帧,只使用完整事件 | | `--max-event-chars` | int | 美化后事件文本最多显示的字符数;默认 2000,0 表示不限制 | | `--stream` | bool | 发送后打开 SSE 事件流并等待到终态;超时则回退到事件列表轮询 | | `--wait` | bool | --stream 的兼容别名;除非显式指定 --stream,大请求体可能立即返回 | | `--wait-fallback-timeout` | int | 流超时后继续轮询的秒数;默认 120 | | `--poll` | bool | 发送后改为轮询事件列表直到终态,而不是开流;适合大请求或长耗时请求 | | `--poll-interval` | int | 配合 --poll 的轮询间隔秒数;默认 2 | | `--raw` | bool | 配合 --stream、--wait 或 --poll 时,打印原始 NDJSON 事件而不是人类可读行 | | `--tool-use-id` | string | user.tool_confirmation 的 tool use id | | `--custom-tool-use-id` | string | user.custom_tool_result 的自定义工具调用 ID | | `--result` | string | 结果值,例如 allow \| deny | ### agent session events stream 流式订阅托管智能体会话事件 ```Bash arkcli agent session events stream ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--after` | string | 游标:取该事件 ID 之后的数据 | | `--before` | string | 游标:取该事件 ID 之前的数据 | | `--since` | string | 游标/时间下界 | | `--created-after` | string | 事件 created_at 下界(RFC3339) | | `--created-before` | string | 事件 created_at 上界(RFC3339) | | `--type` | string_slice | 事件类型过滤;可重复或用逗号分隔 | | `--session-thread-id` | string | 按会话 thread id 过滤 | | `--no-event-deltas` | bool | 不请求 PRD 的 event_start/event_delta 帧,只使用完整事件 | | `--max-event-chars` | int | 美化后事件文本最多显示的字符数;默认 2000,0 表示不限制 | | `--order` | string | 排序方向:asc \| desc | ### agent session get 获取托管智能体会话 ```Bash arkcli agent session get ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--file` | string | JSON/YAML 载荷的路径。传 - 或省略 --file 表示从 stdin 读取 | ### agent session list 列出托管智能体会话 ```Bash arkcli agent session list ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--file` | string | JSON/YAML 载荷的路径。传 - 或省略 --file 表示从 stdin 读取 | | `--limit` | int | 分页大小 | | `--page` | int | 页码 | | `--agent-id` | string | 按智能体 ID 过滤 | | `--agent-version` | int | 按智能体版本过滤 | | `--environment-id` | string | 按环境 ID 过滤 | | `--memory-store-id` | string | 按记忆库 ID 过滤 | | `--start` | string | 按会话开始时间下界过滤(RFC3339) | | `--end` | string | 按会话开始 / 更新时间上界过滤(RFC3339) | | `--order` | string | 排序方向:asc \| desc | | `--status` | string_slice | 按会话状态过滤;可重复或用逗号分隔 | | `--tags` | string | Tags 映射或 tag 数组过滤条件 | ### agent session resources add 为托管智能体会话添加资源 ```Bash arkcli agent session resources add ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--file` | string | JSON/YAML 请求体的路径。传 - 或省略 --file 表示从 stdin 读取 | | `--path` | string | 本地文件路径:上传后等待其变为 active,再挂载为文件资源 | | `--file-id` | string | Files API 文件 ID。可用 `arkcli agent file upload` 或 `arkcli agent file list` 获取。 | | `--type` | string | 资源类型:file | | `--mount-path` | string | 追加到后端托管的 /mnt/session/uploads/ 前缀之后的路径 | | `--purpose` | string | 使用 --path 时的文件上传用途(默认 user_data) | | `--tos` | string | 使用 --path 上传文件时的 TOS 存储对象 | | `--preprocess-configs` | string | 使用 --path 上传文件时的预处理配置对象 | | `--expire-at` | int | 使用 --path 上传文件时的 UTC Unix 时间戳(秒) | | `--wait-timeout` | int | 本地文件激活的最长秒数;配合 --wait 时也限制 Agent 响应等待(默认 120) | | `--wait-interval` | int | 轮询间隔秒数;默认 2 | ### agent session resources delete 删除托管智能体会话资源 ```Bash arkcli agent session resources delete ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--yes` | bool | 跳过删除的交互确认 | | `--resource-id` | string | Session 资源 id | ### agent session resources get 查看挂载到托管智能体会话的单个资源 ```Bash arkcli agent session resources get [resource-id] ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--resource-id` | string | Session 资源 id | | `--file-id` | string | 按 file_id 匹配文件资源 | | `--mount-path` | string | 按 mount_path 匹配文件资源 | ### agent session resources list 列出挂载到托管智能体会话的资源 ```Bash arkcli agent session resources list ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--file` | string | JSON/YAML 请求体的路径。传 - 或省略 --file 表示从 stdin 读取 | ### agent session resources update 更新托管智能体会话资源 ```Bash arkcli agent session resources update ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--resource-id` | string | Session 资源 id | | `--authorization-token` | string | github_repository 资源的新授权 token | ### agent session threads get 获取托管智能体会话线程 ```Bash arkcli agent session threads get ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--file` | string | JSON/YAML 请求体的路径。传 - 或省略 --file 表示从 stdin 读取 | | `--session-thread-id` | string | 会话 thread id | ### agent session threads list 列出托管智能体会话线程 ```Bash arkcli agent session threads list ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--file` | string | JSON/YAML 请求体的路径。传 - 或省略 --file 表示从 stdin 读取 | | `--limit` | int | 分页大小 | | `--page` | string | 分页游标 / 页码 | ### agent session update 更新托管智能体会话 ```Bash arkcli agent session update ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--file` | string | JSON/YAML 载荷的路径。传 - 或省略 --file 表示从 stdin 读取 | | `--title` | string | 会话标题 | | `--tag` | string | Tags 补丁映射对象(服务端按合并语义处理) | | `--tags` | string | Tags 映射或 tag 数组 | | `--agent` | string | 智能体补丁对象;仅用于 tools/mcp_servers | ### agent session upgrade 升级已有 Session 的运行配置(返回受理结果,不代表升级完成) ```Bash arkcli agent session upgrade ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--file` | string | 升级请求 JSON/YAML 文件(snake_case);显式 flags 覆盖对应字段 | | `--agent` | string | Agent 升级对象(snake_case);inline JSON/YAML 或 @file | | `--environment` | string | Environment 升级对象(snake_case);inline JSON/YAML 或 @file | | `--agent-version` | int | 加载指定 Agent 版本;不传或 0 表示保留当前快照 | | `--model` | string | 模型 ID 或模型升级对象(snake_case JSON/YAML 或 @file) | | `--speed` | string | 兼容保留的模型 speed 参数 | | `--thinking` | string | 模型思考模式 | | `--reasoning-effort` | string | 模型推理强度 | | `--service-tier` | string | 模型服务等级 | | `--vault-ids` | string | 已绑定 Vault ID 的 JSON/YAML 数组或 @file;仅刷新,不改变绑定集合 | | `--initial-events` | string | 初始事件数组(JSON/YAML 或 @file);可选,[] 表示不追加事件 | | `--compact` | bool | 附带升级用 /compact 事件;false 显式设置 initial_events 为 [] | ### agent skill create 上传本地技能 zip 包并创建自定义托管智能体技能 ```Bash arkcli agent skill create ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--zip` | string(必填) | 本地技能 zip 包路径 | | `--display-title` | string | 所上传技能的显示标题 | | `--protection-enabled` | bool | 为新建 Skill 启用内容保护 | ### agent skill delete 删除自定义托管智能体技能(需先删除该技能的全部版本) ```Bash arkcli agent skill delete ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--yes` | bool | 确认永久删除 | | `--version` | string | 只删除该技能版本;省略则删除整个技能(要求无剩余版本) | ### agent skill download 下载自定义托管智能体技能的某个版本归档 ```Bash arkcli agent skill download ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--version` | string | 技能语义版本;默认取最新版本 | | `--output` | string | 本地输出 zip 路径;默认 -v.zip | ### agent skill get 通过 TOP GetSkill 获取自定义或 Ark 托管智能体技能 ```Bash arkcli agent skill get ``` ### agent skill github import 扫描并导入 GitHub 公共仓库中的 Skills ```Bash arkcli agent skill github import ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--path` | string_slice | 仓库内 Skill 相对路径;可重复传入 | | `--all` | bool | 导入全部有效候选 | | `--selected` | string | 通过 @file 传入 Path 和可选 ProtectionEnabled 选择数组 | | `--protection-enabled` | bool | 为新建 Skill 启用内容保护 | ### agent skill github scan 扫描 GitHub 公共仓库中的 Skills ```Bash arkcli agent skill github scan ``` ### agent skill list 列出 SkillHub market 或 TOP custom/ark Managed Agent skills ```Bash arkcli agent skill list ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--source` | string | Skill 来源:market \| custom \| ark \| all;all 返回 custom 与 ark 联合视图 | | `--limit` | int | 分页大小(--page-size 的别名) | | `--page` | string | 页码(--page-number 的别名) | | `--page-number` | int | 页码 | | `--page-size` | int | 每页条数 | | `--query` | string | 搜索关键词 | | `--id` | string | 按技能 ID 过滤 | | `--ids` | string_slice | 按 ID 过滤自定义技能;可重复或逗号分隔 | | `--name` | string | 按技能名称过滤 | | `--display-title` | string | 按 Skill 展示标题过滤 | | `--skill-space-id` | string | 按技能空间 id 过滤 | | `--keywords` | string | 按关键词过滤 | | `--source-type` | string | 按来源类型过滤 | | `--status` | string_slice | 按状态过滤;可重复或用逗号分隔 | | `--sharing` | bool | 按可见性过滤市场技能;true=社区,false=自定义 | | `--sort-by` | string | TOP ListSkills 的自定义技能排序字段 | | `--sort-order` | string | TOP ListSkills 的自定义技能排序方向 | | `--create-time-gte` | string | TOP ListSkills 的自定义技能创建时间下界 | | `--create-time-lte` | string | TOP ListSkills 的自定义技能创建时间上界 | ### agent skill search 按用户查询搜索 skills,并输出 Agent skill refs ```Bash arkcli agent skill search ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--limit` | int | 分页大小 | | `--page` | string | 分页游标 / 页码 | | `--source` | string | Skill 来源:market \| custom \| ark \| all;all 返回 custom 与 ark 联合视图 | | `--private` | bool | 只搜索私有技能 | | `--type` | string | 输出 refs 使用的 Agent skill 类型:custom \| skill_hub | ### agent skill set-protection 开启或关闭自定义 Managed Agent Skill 的内容保护 ```Bash arkcli agent skill set-protection ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--enabled` | bool(必填) | 内容保护状态 | ### agent skill update 为已有的自定义托管智能体技能上传新版本 ```Bash arkcli agent skill update ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--zip` | string(必填) | 新的本地技能 zip 包路径 | | `--display-title` | string | 技能新版本的显示标题 | ### agent skill versions 列出自定义或 Ark 托管智能体技能的版本 ```Bash arkcli agent skill versions ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--limit` | int | 分页大小 | | `--page` | string | 分页游标 | ### agent vault create 创建凭证库(Vault) ```Bash arkcli agent vault create ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--file` | string | JSON/YAML 载荷的路径。传 - 或省略 --file 表示从 stdin 读取 | | `--display-name` | string | 凭证库显示名 | | `--metadata` | string | 元数据 map 对象 | ### agent vault credentials create 在凭证库中创建凭证 ```Bash arkcli agent vault credentials create ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--file` | string | JSON/YAML 载荷的路径。传 - 或省略 --file 表示从 stdin 读取 | | `--display-name` | string | 凭证显示名 | | `--auth` | string | 凭证认证对象 | | `--auth-type` | string | 认证类型:environment_variable \| static_bearer \| mcp_oauth | | `--mcp-server-url` | string | bearer/OAuth 凭证使用的 MCP server URL | | `--token` | string | Bearer token 或环境变量值;可用 @file 读取本地文件 | | `--access-token` | string | 当前 OAuth access token;用 @file 从本地文件读取 | | `--secret-name` | string | environment_variable 认证用的环境变量名 | | `--secret-value` | string | 环境变量值;可用 @file 读取本地文件 | | `--networking-type` | string | 环境网络类型:limited \| unrestricted | | `--allowed-host` | string_slice | 受限环境下允许访问的主机;可重复或逗号分隔 | | `--client-id` | string | OAuth 刷新的 client id | | `--client-secret` | string | OAuth 刷新的 client secret;建议用 @file | | `--refresh-token` | string | OAuth refresh token;可用 @file | | `--token-endpoint` | string | OAuth token endpoint | | `--resource` | string | OAuth resource | | `--scope` | string | OAuth scope | | `--metadata` | string | 元数据 map 对象 | ### agent vault credentials delete 删除凭证 ```Bash arkcli agent vault credentials delete ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--file` | string | JSON/YAML 载荷的路径。传 - 或省略 --file 表示从 stdin 读取 | | `--yes` | bool | 跳过删除的交互确认 | ### agent vault credentials get 获取凭证 ```Bash arkcli agent vault credentials get ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--file` | string | JSON/YAML 载荷的路径。传 - 或省略 --file 表示从 stdin 读取 | ### agent vault credentials list 列出凭证库中的凭证 ```Bash arkcli agent vault credentials list ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--file` | string | JSON/YAML 载荷的路径。传 - 或省略 --file 表示从 stdin 读取 | | `--limit` | int | 分页大小 | | `--page` | string | 分页游标 / 页码 | | `--id` | string | 按凭证 ID 过滤 | | `--name` | string | 按凭证名称过滤 | ### agent vault credentials update 更新凭证 ```Bash arkcli agent vault credentials update ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--file` | string | JSON/YAML 载荷的路径。传 - 或省略 --file 表示从 stdin 读取 | | `--display-name` | string | 凭证显示名 | | `--auth` | string | 凭证认证对象 | | `--auth-type` | string | 认证类型:environment_variable \| static_bearer \| mcp_oauth | | `--mcp-server-url` | string | bearer/OAuth 凭证使用的 MCP server URL | | `--token` | string | Bearer token 或环境变量值;可用 @file 读取本地文件 | | `--access-token` | string | 当前 OAuth access token;用 @file 从本地文件读取 | | `--secret-name` | string | environment_variable 认证用的环境变量名 | | `--secret-value` | string | 环境变量值;可用 @file 读取本地文件 | | `--networking-type` | string | 环境网络类型:limited \| unrestricted | | `--allowed-host` | string_slice | 受限环境下允许访问的主机;可重复或逗号分隔 | | `--client-id` | string | OAuth 刷新的 client id | | `--client-secret` | string | OAuth 刷新的 client secret;建议用 @file | | `--refresh-token` | string | OAuth refresh token;可用 @file | | `--token-endpoint` | string | OAuth token endpoint | | `--resource` | string | OAuth resource | | `--scope` | string | OAuth scope | | `--metadata` | string | 元数据 map 对象 | ### agent vault delete 删除凭证库(Vault) ```Bash arkcli agent vault delete ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--file` | string | JSON/YAML 载荷的路径。传 - 或省略 --file 表示从 stdin 读取 | | `--yes` | bool | 跳过删除的交互确认 | ### agent vault get 获取凭证库(Vault) ```Bash arkcli agent vault get ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--file` | string | JSON/YAML 载荷的路径。传 - 或省略 --file 表示从 stdin 读取 | ### agent vault list 列出凭证库(Vault) ```Bash arkcli agent vault list ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--file` | string | JSON/YAML 载荷的路径。传 - 或省略 --file 表示从 stdin 读取 | | `--limit` | int | 分页大小 | | `--page` | string | 分页游标 / 页码 | | `--id` | string | 按凭证库 ID 过滤 | | `--name` | string | 按 Vault 名称过滤 | ### agent vault oauth-flow create 创建 Vault MCP OAuth 流程并返回授权链接 ```Bash arkcli agent vault oauth-flow create ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--file` | string | JSON/YAML 载荷的路径。传 - 或省略 --file 表示从 stdin 读取 | | `--vault-id` | string | Vault id | | `--display-name` | string | 凭证显示名 | | `--mcp-server-url` | string | MCP server URL | | `--redirect-url` | string | OAuth 回调的业务成功跳转 URL | | `--source` | string | 流程来源标记,例如 arkcli-mcp-login | | `--client-id` | string | 自定义 MCP/provider 覆盖模式下的 OAuth client id | | `--client-secret` | string | OAuth client secret,或用 @file 从磁盘读取 | ### agent vault oauth-provider list 列出可用于 Agent MCP server 与凭证库的已注册 MCP provider ```Bash arkcli agent vault oauth-provider list ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--file` | string | JSON/YAML 载荷的路径。传 - 或省略 --file 表示从 stdin 读取 | | `--limit` | int | 分页大小 | | `--page-token` | string | 下一页 token | ### agent vault update 更新凭证库(Vault) ```Bash arkcli agent vault update ``` | Flag | 类型 | 说明 | | --- | --- | --- | | `--file` | string | JSON/YAML 载荷的路径。传 - 或省略 --file 表示从 stdin 读取 | | `--display-name` | string | 凭证库显示名 | | `--metadata` | string | 元数据 map 对象 | --- # ArkExp 快速入门 Source: https://ark.volcengine.com/region:cn-beijing/docs/agent-plan-personal-arkexp-quickstart ArkExp 将**火山方舟模型能力**带到用户的本地终端,让你在当前工作目录中用自然语言完成知识问答、内容处理、命令执行和任务管理。ArkExp 适合希望保留终端工作流,同时获得方舟模型与 Agent 完整体验的用户使用。 ## 什么是 ArkExp ArkExp 不是一个单纯的聊天窗口,而是面向本地工作环境的 AI-native CLI。你提出目标后,它会结合当前目录和会话上下文规划任务,通过受控工具读取和修改文件、执行命令、调用扩展能力,并将过程与结果持续展示在 TUI 中。 ## 为什么使用 ArkExp ArkExp 的价值不只是把模型放进终端,而是把方舟能力、本地交互和持续任务体验整合成一个完整的 CLI。 - **深度集成方舟体系,而不只是接入一个模型。** 与 Claude Code、Codex、OpenCode 等通用 CLI 相比,ArkExp 面向方舟体系原生设计:从火山引擎账号登录、套餐与用量管理、模型和 Endpoint 选择,到豆包 Web Search、OpenViking 知识与资源能力以及 ArkCLI 能力,都可以在同一条体验链路中使用,无需自行拼装多个 Provider、插件和配置。 - **从一次问答升级为可持续的本地任务体验。** 交互式 TUI 集中呈现流式响应、工具执行和任务状态;会话恢复、历史记录、Goal、Memory、Context 与上下文压缩共同承载长期任务。运行期间还可以补充指令、排队后续问题或取消操作,让任务始终可见、可控、可继续。 - **开箱即用,同时保持开放、安全和可恢复。** Skills、MCP、Workflow、Cron 与自定义斜杠命令让能力可以按需扩展;权限闸门、高风险操作确认、自动检查点、结果验证和失败记忆则为本地执行提供安全边界与恢复能力。 ## 快速开始 ### 一、安装 ArkExp **前提条件**: - 请确保本机可以使用 `npm`,并能访问 npm 官方 Registry。 - ArkExp 运行时需要 Bun 1.3 或更高版本。全局安装脚本会在缺少 Bun 时自动调用官方安装器完成安装。如需自行管理 Bun,可设置 `ARKTUI_AUTO_INSTALL_BUN=0` 关闭自动安装,但启动 ArkExp 前仍需保证 Bun 可用。 **安装 ArkExp**:在命令行界面,执行以下命令安装 ArkExp。 ```Bash curl -fsSL https://lf3-static.bytednsdoc.com/obj/eden-cn/welryh/ljhwZthlaukjlkulzlp/prod/install.sh | sh arkexp --version ``` **更新版本**:可以先检查可用更新,再执行受校验的事务式升级;已经启动的进程继续使用原版本,下次启动切换到新版本。 ```bash arkexp update --check --refresh arkexp update ``` ### 二、启动并配置 ArkExp 在任务对应的工作目录中启动 ArkExp。工作目录决定本次会话加载的项目配置、指令与 Skills。 ```bash cd /path/to/project arkexp ``` **首次使用步骤如下**: 1. 运行 `arkexp` 进入 TUI。 2. 如果首页已经显示可用的模型连接,可直接进入下一步;否则输入 `/login`,按界面提示完成方舟登录。 3. 输入 `/plans`,选择账号已有的 Agent Plan、Coding Plan 或 Platform 按量后付费来源。 4. 输入 `/models`(也可使用 `/model`),从当前来源选择实际可用的模型或 Endpoint。 5. 回到输入框,用自然语言描述任务。首页显示连接可用后即可开始。 **非首次使用步骤如下**: 再次在项目目录运行 `arkexp` 即可,可以关注以下信息: - ArkExp 会复用已经保存且仍有效的连接。 - 需要切换账号、套餐或模型时,再使用 `/login`、`/plans` 或 `/models`。 - 通过 `/usage` 可以查看受支持 Plan 的额度,通过 `/sessions` 恢复历史会话。 ### 三、使用 ArkExp 直接告诉 ArkExp 你希望达到的结果,并补充范围、约束与验收方式。对于会修改文件或执行命令的任务,建议同时说明允许的范围和期望的结果。 | 经典场景 | 示例 Prompt | |---|---| | 知识问答 | 结合当前目录中的资料,解释这个项目的目标、主要模块和使用方式。 | | 内容处理 | 汇总 `@docs/` 下的产品说明,生成一份面向新用户的快速入门。 | | 日志与数据分析 | 分析 `@logs/app.log`,按错误类型归类并给出排查顺序。 | | 命令执行 | 运行当前项目的检查命令,解释失败原因;需要修改文件时先说明影响范围。 | | 多步骤任务 | 把这个任务拆成可执行计划,持续推进,并在关键节点汇报结果。 | | 代码开发 | 检查当前分支相对基线的改动,重点关注兼容性、权限边界和缺失测试。 | **常用交互**: - `Ctrl+K`:打开命令面板。 - `Ctrl+O`:切换模型。 - `Shift+Tab`:切换 Normal、Plan 与 Full Access 权限姿态。 - `Enter`:任务运行时追加当前轮指令。 - `Alt+Enter`:将内容排队为当前任务后的独立追问。 - `Ctrl+C`:运行中中断;空闲时退出。 **非交互模式使用**:在脚本或一次性任务中,可以直接使用以下命令。 ```bash arkexp run "解释这个仓库的核心模块,并列出建议的阅读顺序" ``` 完整命令、快捷键和当前版本支持的能力以 TUI 内的 `/help` 为准。 ## 相关文档 * [Ark CLI:Agent Plan 个人版使用指南](/docs/agent-plan-personal-ark-cli) * [ArkExp 命令参考](/docs/agent-plan-personal-arkexp-command-reference) --- # ArkExp 命令参考 Source: https://ark.volcengine.com/region:cn-beijing/docs/agent-plan-personal-arkexp-command-reference ArkExp 是一款面向通用模型体验、任务处理与本地工作流的 CLI。在终端中连接方舟模型与 ArkCLI 能力,通过清晰、可交互、可扩展的 TUI 完成日常任务。 > **说明** > > ArkExp 的安装、启动、配置及使用参见 [ArkExp 快速入门](/docs/agent-plan-personal-arkexp-quickstart)。 ## 核心特性 **本地终端体验** 在熟悉的终端里使用方舟模型,流式查看响应、工具执行和任务状态。 **账号与模型开箱可用** 内置登录、套餐、用量、模型与 API 传输方式管理,减少环境切换。 **持续任务承载** 会话、目标、记忆、上下文与历史记录共同承载持续任务。 **可扩展** 通过 Skills、MCP、工作流、自定义斜杠命令和定时任务扩展能力。 **权限可控** 工具执行经过权限闸门;高风险操作需要明确确认。 **可恢复** 检查点、验证与失败记忆帮助任务在本地端更稳定地推进。 ## 斜杠命令 > **注意** > > 斜杠命令、别名和参数是兼容性标识,必须按下表原样输入。 ### 账号、模型与 API | 命令 | 作用 | 用法 | |-|-|-| | `/login` | 登录火山引擎并建立方舟连接。 | `/login` | | `/logout` | 退出登录并移除本地凭证。 | `/logout` | | `/plans` | 发现、查看并选择可用套餐或连接。 | `/plans` | | `/usage` | 查看当前方舟套餐的额度使用情况。 | `/usage` | | `/models` | 打开模型选择器。 | `/models` | | `/api` | 查看或切换 API 传输方式。 | `/api [status\\|auto\\|responses\\|chat] [--save]` | | `/apm` | 查看遥测门禁,或启用 / 停用遥测。 | `/apm [status\\|on\\|off]` | | `/language` | 查看或固定响应语言。 | `/language [status\\|auto\\|Chinese\\|English\\|Japanese]` | ### 会话与历史 | 命令 | 作用 | 用法 | |-|-|-| | `/new` | 开始新会话。 | `/new` | | `/sessions` | 浏览并恢复历史会话。 | `/sessions` | | `/resume` | 按 ID 或标题恢复会话;无参数时打开选择。 | `/resume [session-id-or-title]` | | `/clear` | 清空当前聊天视图。 | `/clear` | | `/timeline` | 打开时间线并跳转到指定消息。 | `/timeline` | | `/fork` | 从时间线中的位置派生新会话。 | `/fork` | | `/copy` | 复制完整会话记录。 | `/copy` | | `/copy-last` | 复制最近一条用户消息。 | `/copy-last` | | `/export` | 将会话导出为 Markdown。 | `/export` | | `/compact` | 把较早历史压缩为摘要,释放上下文空间。 | `/compact` | | `/summarize` | `/compact` 的兼容别名。 | `/summarize` | | `/undo` | 撤销上一次会话回退。 | `/undo` | | `/redo` | 重做被撤销的会话变更。 | `/redo` | | `/stash` | 打开已暂存的输入草稿。 | `/stash` | | `/stash-save` | 暂存当前输入,或直接暂存给定文本。 | `/stash-save [draft]` | | `/stash-pop` | 恢复最近暂存的草稿。 | `/stash-pop` | ### 任务模式与目标 | 命令 | 作用 | 用法 | |-|-|-| | `/agents` | 切换可用任务 Agent / 模式。 | `/agents` | | `/plan` | 进入规划模式。 | `/plan` | | `/implement` | 退出规划模式并回到执行模式。 | `/implement` | | `/goal` | 设置、查看、暂停、恢复、完成或清除持久目标。 | `/goal [--criteria "a;b"]`
    `/goal [status\\|pause\\|resume\\|complete\\|clear]` | | `/btw` | 基于当前上下文提一个旁路问题,不写入持久会话历史。 | `/btw ` | ### 工作流与扩展 | 命令 | 作用 | 用法 | |-|-|-| | `/workflow` | 打开工作流面板,运行或停止已保存工作流。 | `/workflow [list\\|run [json]\\|stop ]` | | `/workflows` | `/workflow` 的兼容别名。 | `/workflows [list\\|run [json]\\|stop ]` | | `/cron` | 创建和管理持久化的一次性或周期任务。 | `/cron` | | `/mcp` | 查看、连接、认证、启停和刷新 MCP 服务。 | `/mcp` | | `/tools` | 检查工具可见性、可用性、Schema 成本和权限风险。 | `/tools` | | `/skills` | 查看、启停、安装或移除 Skills。 | `/skills`
    `/skills install\\|remove ` | ### 工作区与内容 | 命令 | 作用 | 用法 | |-|-|-| | `/memory` | 浏览和配置用户、项目、会话与系统摘要记忆。 | `/memory`
    `/memory show user\\|project\\|session\\|system-summary` | | `/context` | 查看上下文 token、预算与使用率。 | `/context` | | `/init` | 为当前项目生成 `AGENTS.md` 指令。 | `/init` | ### 界面与诊断 | 命令 | 作用 | 用法 | |-|-|-| | `/help` | 打开快捷键与内置命令帮助。 | `/help` | | `/theme` | 选择并预览界面主题。 | `/theme` | | `/timestamps` | 显示或隐藏消息时间戳。 | `/timestamps` | | `/thinking` | 显示或隐藏推理摘要。 | `/thinking` | | `/status` | 查看 MCP、Skills 与 Commands 状态。 | `/status` | | `/feedback` | 提交产品反馈。 | `/feedback ` | | `/exit` | 退出 CLI。 | `/exit` | | `/quit` | `/exit` 的兼容别名。 | `/quit` | ### 随包 Skill 命令 以下命令来自随包 Skills;是否可执行取决于当前连接、权限与 Skill 启用状态。 | 命令 | 作用 | 用法 | |-|-|-| | `/add-resources` | 把本地路径或远程 URL 导入 OpenViking Resources。 | `/add-resources [--to ]` | | `/arkexp-docs` | 查询产品用法、配置与排障信息。 | `/arkexp-docs ` | \ | | > `/arkexp-docs` 是随包 Skill 提供的技术命令名。| | | `/byted-web-search` | 在当前连接为 Agent Plan 时使用随包豆包搜索能力。 | `/byted-web-search ` | ### 别名速查 | 推荐命令 | 可用别名 | 说明 | |-|-|-| | `/models` | `/model` | 模型选择器。 | | `/theme` | `/themes` | 主题选择器。 | | `/sessions` | `/session` | 历史会话。 | | `/skills` | `/skill` | Skill 管理。 | | `/agents` | `/agent` | 任务模式选择。 | | `/timestamps` | `/toggle-timestamps` | 时间戳显示开关。 | | `/thinking` | `/toggle-thinking` | 推理摘要显示开关。 | | `/stash-pop` | `/unstash` | 恢复最近草稿。 | | `/compact` | `/summarize` | 会话压缩。 | | `/workflow` | `/workflows` | 工作流管理。 | | `/exit` | `/quit` | 退出。 | ## /api 详解 `/api` 用于查看或切换当前模型连接的 API 传输方式。它不会更换模型、Endpoint 或套餐。 | 命令 | 行为 | |-|-| | `/api` | 显示当前传输方式;等价于 `/api status`。 | | `/api status` | 显示当前传输方式与生效状态。 | | `/api auto` | 优先使用 Responses API,并在兼容条件下安全回退到 Chat Completions。 | | `/api responses` | 仅使用 Responses API。 | | `/api chat` | 仅使用 Chat Completions API。 | | `--save` | 追加到切换命令后,将选择持久化到后续会话。 | ```Bash /api status /api auto /api responses --save /api chat --save ``` > **说明** > > 不确定时使用 `/api auto`。只有在排障、兼容性验证或明确依赖某一协议时,才固定为 `responses` 或 `chat`。 ## 快捷键 | 快捷键 | 操作 | |-|-| | `Ctrl+C` | 运行中中断;空闲时退出。 | | `Ctrl+H` | 打开帮助。 | | `Ctrl+K` | 打开命令面板。 | | `Ctrl+O` | 切换模型。 | | `Ctrl+T` | 切换主题。 | | `Ctrl+B` | 显示或隐藏侧边栏。 | | `Ctrl+G` | 展开或折叠工具执行详情。 | | `Enter` | 发送;运行中在安全边界调整当前任务。 | | `Alt+Enter` | 将内容排队为当前任务后的独立追问。 | | `Shift+Enter` / `Ctrl+Enter` | 输入换行。 | | `Shift+Tab` | 循环切换权限姿态。 | | `Esc` | 关闭对话框;运行中立即中断。 | | `Fn+↑ / Fn+↓` | macOS 内置键盘:跳到上一 / 下一条用户 Prompt。 | | `Page Up / Page Down` | Windows、Linux 或全尺寸键盘:跳到上一 / 下一条用户 Prompt。 | | `Home / End` | 跳到记录开头 / 返回实时底部。 | | `↑`(空输入框) | 打开当前目录的 Prompt 历史。 | ## 扩展斜杠命令 ### 项目命令 把可复用 Prompt 保存为 Markdown 文件,文件名就是命令名。例如 `.arkexp/commands/brief.md` 会生成 `/brief`。 - 项目范围会扫描 `.arkexp/command(s)`、`.agents/command(s)`、`.claude/command(s)`、`.codex/command(s)`、`.cursor/command(s)` 与根目录 `command(s)`。 - 个人范围使用 `~/.arkexp/command(s)`。 ```markdown --- description: 生成任务简报 argument-hint: "[topic]" --- 围绕 $ARGUMENTS 生成一份简洁、可执行的任务简报。 ``` ### Skills ```text /skills /skills install /skills remove ``` ### MCP 使用 `/mcp` 管理 MCP 服务;使用 `/tools` 检查工具可见性、可用性、Schema 成本与权限风险。 > **说明** > > 命令优先级:内置命令 > 已启用 Skills > 项目 / 个人自定义命令。不要用自定义文件覆盖内置命令名。 ## CLI 模式与更新 ### 交互式 TUI ```bash arkexp ``` ### 单次 CLI 调用 ```bash arkexp run "总结当前目录中的资料,并给出下一步建议" ``` ### 更新 ```bash arkexp update --check --refresh arkexp update ``` 全局安装建议始终使用 npm 的 `@latest` 标签;升级前可先执行检查命令。 ## 相关资源 * [ArkExp 快速入门](/docs/agent-plan-personal-arkexp-quickstart) * [Ark CLI:Agent Plan 个人版使用指南](/docs/agent-plan-personal-ark-cli) * [npm 安装包](https://www.npmjs.com/package/@volcengine/ark-tui) --- # 选择读取方式 Source: https://ark.volcengine.com/region:cn-beijing/docs/read-docs-with-ai-agents AI Agent 读取文档时,应优先使用能够结构化检索并按需返回内容的入口。目标页面已知时,直接读取 Markdown 镜像;其他方式不可用时,再读取 HTML 页面。 ## 选择读取方式 | 优先级 | 方式 | 适用场景 | 说明 | | --- | --- | --- | --- | | 1 | [文档 MCP](/docs/tutorials-mcp) | Agent 支持 MCP,需要检索文档、API、代码示例或模型信息 | 文档 MCP 提供结构化工具和按需读取能力,减少 Agent 自行维护 URL 和解析页面的成本。 | | 2 | [llms.txt 系列文件](/docs/read-ark-docs-with-llms-txt) | Agent 可以访问公网,但未接入 MCP;需要发现页面或获取批量语料 | `llms.txt` 用于发现文档;`llms-full.txt` 和章节全文文件用于构建知识库或离线检索。 | | 3 | [Markdown 镜像](/docs/read-docs-from-urls#read-markdown) | 已知目标页面地址,只需要页面正文 | 在文档页面 URL 后追加 `.md`,获取 `text/markdown` 内容,避免 HTML 页面中的导航和样式代码。 | | 4 | [HTML 页面](/docs/read-docs-from-urls#read-html) | Agent 只能使用网页读取工具,或目标页面没有可用的 Markdown 镜像 | 网页解析工具通常能够提取正文,但原始 HTML 同时包含导航、脚本、样式和页面元数据,会增加无关上下文。 | ## 配置 Agent 读取规则 将以下规则加入 Agent 的系统提示词。规则包含文档 MCP、`llms.txt` 和页面 URL 的完整入口: ```text 回答产品相关问题前,按以下顺序读取最新官方文档: 1. 如果客户端支持 MCP,连接 https://mcp.ark-doc-resources.cn/mcp/, 使用文档 MCP 检索并读取目标内容。 2. MCP 不可用时,读取 https://ark.volcengine.com/llms.txt, 根据标题和简介定位相关页面,再读取命中文档的 Markdown 链接。 3. 构建知识库或执行离线检索时,读取 https://ark.volcengine.com/llms-full.txt, 或读取 llms.txt 中对应章节的“章节全文”链接。不要把全站全文直接注入单次对话。 4. 已知文档页面 URL 时,读取 .md,优先使用 Markdown 镜像。 5. .md 不可用时,读取 ,并且只保留文章标题、正文、 代码块、表格和链接;忽略导航、脚本、样式、页脚和交互控件。 6. 回答时引用读取到的最新官方文档,不要只依赖已有知识。 ``` ## 使用推荐流程 1. Agent 已接入文档 MCP 时,使用 MCP 检索并读取目标内容。 2. MCP 不可用时,读取 [llms.txt](https://ark.volcengine.com/llms.txt),根据标题和简介定位相关页面。 3. 构建知识库或执行离线检索时,读取 [llms-full.txt](https://ark.volcengine.com/llms-full.txt) 或章节全文文件。 4. 已知目标页面时,读取 `.md`。 5. `.md` 不可用时,读取 HTML 页面,并且只保留正文内容。 ## 相关文档 - 配置结构化检索工具,详情请参见[文档 MCP](/docs/tutorials-mcp)。 - 使用索引、章节全文或全站全文读取文档,详情请参见[llms.txt](/docs/read-ark-docs-with-llms-txt)。 - 直接读取 Markdown 镜像或 HTML 页面,详情请参见[通过 URL](/docs/read-docs-from-urls)。 - 安装文档配套能力,详情请参见[文档 Skill](/docs/ark-document-skills)。 --- # 文档 MCP Source: https://ark.volcengine.com/region:cn-beijing/docs/tutorials-mcp Ark Docs MCP 是方舟官方提供的远程 [Model Context Protocol](https://modelcontextprotocol.io/) Server。在支持 MCP 的 AI 编程助手(TRAE、Cursor、Claude Code、VS Code、Windsurf、OpenClaw 等)中完成配置后,AI 助手即可在编码上下文中直接检索方舟平台的**文档、API 参考、代码示例、模型信息**,降低幻觉、避免使用过时参数与已下线接口。 > **注意** > > **域名迁移通知**:Ark Docs MCP 已使用 [当前服务地址](https://mcp.ark-doc-resources.cn/mcp/)。原公测域名已于 2026 年 8 月 17 日下线,请将存量配置更新为当前地址。 ## 接入方式 ### 一键安装(推荐) 主流客户端支持通过 URL 协议直接唤起安装: [安装到 TRAE CN(中国版)](trae-cn://trae.ai-ide/mcp-import?type=http&name=ark-docs-mcp&config=eyJ1cmwiOiJodHRwczovL21jcC5hcmstZG9jLXJlc291cmNlcy5jbi9tY3AvIn0=) [安装到 TRAE(国际版)](trae://trae.ai-ide/mcp-import?type=http&name=ark-docs-mcp&config=eyJ1cmwiOiJodHRwczovL21jcC5hcmstZG9jLXJlc291cmNlcy5jbi9tY3AvIn0=) [安装到 VS Code](vscode:mcp/install?%7B%22name%22%3A%22Ark%20Docs%20MCP%22%2C%22url%22%3A%22https%3A%2F%2Fmcp.ark-doc-resources.cn%2Fmcp%2F%22%7D) [安装到 Cursor](cursor:mcp/install?%7B%22name%22%3A%22Ark%20Docs%20MCP%22%2C%22url%22%3A%22https%3A%2F%2Fmcp.ark-doc-resources.cn%2Fmcp%2F%22%7D) [安装到 Windsurf](windsurf:mcp/install?%7B%22name%22%3A%22Ark%20Docs%20MCP%22%2C%22url%22%3A%22https%3A%2F%2Fmcp.ark-doc-resources.cn%2Fmcp%2F%22%7D) OpenClaw 等 AI Agent 安装 将以下内容发送给 AI Agent,由其完成安装。 ```Plain Text 帮我安装方舟文档MCP { "mcpServers": { "ark-docs-mcp": { "url": "https://mcp.ark-doc-resources.cn/mcp/" } } } ``` ### 手动配置 在客户端的 MCP 配置文件中新增一条 server 条目: ```JSON { "mcpServers": { "ark-docs-mcp": { "url": "https://mcp.ark-doc-resources.cn/mcp/" } } } ``` - Cursor / Windsurf:写入 `~/.cursor/mcp.json` / `~/.codeium/windsurf/mcp_config.json` - Claude Code:写入 `~/.claude.json` 或项目 `.mcp.json` - VS Code(GitHub Copilot MCP):写入 workspace `.vscode/mcp.json` - TRAE:设置面板 > MCP > 新增 保存后重启客户端,AI 助手的工具列表中即会出现 `ark-docs-mcp` 提供的 `ark_*` 工具。 ## 工具列表 Ark Docs MCP 目前提供以下只读工具,按用途分为**文档 / API / 代码 / 模型** 四类。用户无需关心具体工具的调用参数,AI 助手会自主拉取工具列表并按需调用。 |分类 |工具 |描述 | |---|---|---| |文档 |`ark_search_docs` |检索方舟平台文档 | |文档 |`ark_list_docs` |列出全部方舟平台文档 | |文档 |`ark_fetch_doc` |拉取指定文档的完整正文 | |API |`ark_list_apis` |列出方舟平台全部 API 端点 | |API |`ark_get_spec` |获取指定 API 的参数定义与结构 | |代码 |`ark_search_examples` |检索方舟官方多语言代码示例 | |模型 |`ark_list_models` |按能力、状态、价格、限速等维度筛选模型 | |模型 |`ark_get_model` |获取指定模型的完整元数据 | ## 典型示例 完成接入后,可在 AI 助手中直接使用自然语言触发以下能力。以下场景均由 AI 助手自主编排 `ark_*` 工具,无需手工指定具体工具调用序列。 ### 报错排障 用户提问示例:"调用 `chat/completions` 接口返回 401,请查询方舟文档定位可能原因。" AI 助手行为:检索方舟文档中相关的错误码说明 > 深读命中文档 > 给出可能原因与修复步骤。 ### 生成 API 调用代码 用户提问示例:"使用 Python 编写调用 Ark `chat/completions` 的代码,要求启用流式返回,并参考官方最新示例。" AI 助手行为:获取 API 参考 > 检索官方 Python 示例 > 依据规范与示例结构组装代码,避免虚构参数。 ### 模型选型 用户提问示例:"请检索支持 vision、低延迟、成本敏感的方舟模型,并输出对比表。" AI 助手行为:按能力 / 状态 / 价格维度筛选候选模型 > 逐个拉取完整元数据 > 输出对比表,标注成本、限速、能力差异。 ### 模型升级 / 迁移 用户提问示例:"项目内使用的 `<待下线模型 ID>` 已在下线名单,请先给出迁移清单,不要直接修改代码。" AI 助手行为:定位下线模型对应的推荐替换 > 确认新模型能力兼容 > 拉取新模型的调用示例 > 输出迁移清单。 ## 使用限制 - **只读**:不提供任何写入或状态修改能力,读取失败不会产生副作用 - **无鉴权**:当前所有工具公开可用,无需 API Key - **上下文预算**:`ark_get_spec` 强制按 `service` 或 `api_path` 过滤、`ark_fetch_doc` 支持分块拉取,避免单次调用返回超大 payload 占用 LLM 上下文 - **数据时效**:文档与模型元数据随方舟平台发布同步;若客户端缓存陈旧,重启 MCP session 即可刷新 ## 附录:System Prompt 与服务元数据 面向 Agent Skill / System Prompt 开发者 ### 服务元数据 - **接入点**:[Ark Docs MCP](https://mcp.ark-doc-resources.cn/mcp/) - **协议**:MCP 2024-11-05;传输方式 Streamable HTTP - **鉴权**:无需 API Key - **数据时效**:实时,与方舟平台发布同步 ### System Prompt 模板 以下段落可直接嵌入 AI 助手的 System Prompt 或 Skill 定义的 `instructions` 字段,用于约束工具调用时机与调用规范,减少凭训练知识作答与虚构参数: ```text 你已接入 ark-docs-mcp 工具集。请遵循以下调用约束: 1. 当用户提问涉及方舟平台的概念、API、报错排障、模型选型、 模型迁移时,必须先调用 ark-docs-mcp 检索方舟官方文档, 不得仅凭训练知识作答。 2. 生成方舟 API 调用代码前,必须先调用 ark_get_spec 获取 对应 API 参考;若未获取到 spec,拒绝生成代码。 3. 检索代码示例时,将目标语言(Python / Go / Java / cURL 等) 写入 query,避免返回非期望语言的示例。 4. 使用 ark_fetch_doc 拉取长文档时,若返回 has_more=true, 持续按 chunk_start += chunk_count 拉取直至完整。 ``` 参照上述模板落地时,可依据业务的规范化程度自行删改条款。 --- # llms.txt Source: https://ark.volcengine.com/region:cn-beijing/docs/read-ark-docs-with-llms-txt `llms.txt` 系列文件适合未接入文档 MCP、但能够访问公网 URL 的 AI Agent。Agent 先通过索引发现目标文档,再按需读取命中的 Markdown 内容,可以减少无关上下文。 ## 获取文件地址 文档站提供以下文件: | 文件 | 地址 | 说明 | | --- | --- | --- | | 文档索引 | [llms.txt](https://ark.volcengine.com/llms.txt) | 按目录列出公开文档的标题、简介和 Markdown 链接。 | | 文档全文 | [llms-full.txt](https://ark.volcengine.com/llms-full.txt) | 汇总当前发布版本的全部公开文档正文。 | | 章节全文 | 以 [llms.txt](https://ark.volcengine.com/llms.txt) 中的“章节全文”链接为准 | 汇总一个目录章节下的公开文档正文,例如 [AI 套件章节全文](https://ark.volcengine.com/llms-full/ai-suite.txt)。 | 这些文件无需注册或 API Key,由文档系统随发布自动更新。 ## 了解文件内容 `llms.txt` 是 Markdown 格式的文档索引: - 每个二级标题对应一个目录章节。 - 每个章节的“章节全文”链接指向该章节的 Markdown 合集。 - 每篇文档按 `- [文档标题](文档地址): 简介` 的格式列出,链接直接指向该页面的 Markdown 镜像。 索引内容示例: ```Markdown ## AI 套件 - [章节全文](https://ark.volcengine.com/llms-full/ai-suite.txt) - [ArkCLI 快速入门](https://ark.volcengine.com/region:cn-beijing/docs/ark-cli.md): ArkCLI 快速入门说明…… ``` `llms-full.txt` 和章节全文文件是纯 Markdown 文本。全站文件内容较多,适合持久化后建立检索索引;单次问答优先读取 `llms.txt` 和命中的单篇文档。 ## 选择使用方式 ### 按需读取单篇文档 该方式适合问答、排障和生成代码等任务: 1. 读取 [llms.txt](https://ark.volcengine.com/llms.txt)。 2. 根据标题和简介定位相关文档。 3. 读取命中文档的 Markdown 链接。 4. 基于文档内容回答,并在需要时继续读取关联页面。 ### 读取一个章节 该方式适合需要同一主题下多篇文档的任务。读取 [llms.txt](https://ark.volcengine.com/llms.txt) 中对应章节的“章节全文”链接,避免加载无关章节。 ### 建立文档知识库 该方式适合离线检索或知识库构建。定期获取 [llms-full.txt](https://ark.volcengine.com/llms-full.txt) 或章节全文文件,保存版本并建立检索索引。不要把全站全文直接注入单次对话。 ## 配置 Agent 读取规则 将以下规则加入 Agent 的系统提示词,或在对话中直接发送: ```text 当问题涉及当前产品时,先读取 https://ark.volcengine.com/llms.txt, 根据标题和简介定位相关文档,再读取命中文档的 Markdown 链接。 回答时以最新官方文档为准,不要只依赖已有知识。 ``` ## 相关文档 - 比较全部读取方式,详情请参见[选择读取方式](/docs/read-docs-with-ai-agents)。 - 直接读取 Markdown 镜像或 HTML 页面,详情请参见[通过 URL](/docs/read-docs-from-urls)。 - 配置结构化检索工具,详情请参见[文档 MCP](/docs/tutorials-mcp)。 --- # 通过 URL Source: https://ark.volcengine.com/region:cn-beijing/docs/read-docs-from-urls AI Agent 可以通过文档页面 URL 读取 HTML 数据,也可以读取 `.md` 获取 Markdown 镜像。Markdown 镜像主要包含页面正文,应优先读取;HTML 数据包含导航、脚本和样式,仅作为兜底方式。 ## 比较两种 URL | URL 类型 | 响应内容 | 优点 | 局限 | | --- | --- | --- | --- | | Markdown 镜像 | `text/markdown` | 主要包含标题和正文,适合直接加入 Agent 上下文。 | 需要已知目标文档页面,并读取 `.md`。 | | HTML 页面 | `text/html` | 支持网页读取的 Agent 可以直接访问,无需改写地址。 | 原始 HTML 同时包含导航、脚本、样式和页面元数据,会占用额外上下文并影响正文提取。 | ## 读取 Markdown 镜像 在文档页面 URL 后追加 `.md`。例如: - 页面 URL:[快速入门](https://ark.volcengine.com/region:cn-beijing/docs/quick-start) - Markdown 地址:[快速入门 Markdown](https://ark.volcengine.com/region:cn-beijing/docs/quick-start.md) Markdown 镜像适合以下场景: - Agent 已从 `llms.txt`、搜索结果或用户输入中获得目标页面地址。 - 任务只需要页面正文,不需要导航和交互组件。 - 需要把文档内容加入对话上下文或保存为文本语料。 ## 读取 HTML 页面 支持网页访问和正文提取的 Agent 可以直接读取页面 URL。文档页面的 HTML 响应包含完整正文,也包含站点导航、交互脚本、样式和页面元数据。 读取 HTML 页面时,Agent 应执行以下处理: 1. 提取文章标题和正文区域。 2. 忽略页面导航、页脚、登录入口和交互控件。 3. 忽略脚本、样式及其配置数据。 4. 保留正文中的代码块、表格和链接语义。 不同网页读取工具的正文提取能力不同。工具直接返回原始 HTML 时,不要把完整响应注入模型上下文。 ## 配置直接读取规则 将以下规则加入 Agent 的系统提示词: ```text 已知文档页面地址时,先读取 .md 获取 Markdown 镜像。 如果 .md 不可用,再读取 获取 HTML 页面。 读取 HTML 页面时,只保留文章标题和正文,忽略导航、脚本、样式、页脚和交互控件。 ``` ## 相关文档 - 比较全部读取方式,详情请参见[选择读取方式](/docs/read-docs-with-ai-agents)。 - 通过索引定位文档,详情请参见[llms.txt](/docs/read-ark-docs-with-llms-txt)。 --- # 文档 Skill Source: https://ark.volcengine.com/region:cn-beijing/docs/ark-document-skills 本文列出当前方舟文档提供的 Skill。 ## Skill 列表 | Skill | 功能 | | --- | --- | | `ark-model-benchmark` | 评测方舟模型的 TTFT、TPOT、E2E 和缓存命中率,并生成评测报告 | | `ark-docs-assistant` | 分析模型升级或迁移方案,扫描项目中的模型引用并评估替换风险 | | `sd25-pe` | 优化 Seedance 2.5 视频生成提示词 | | `sd2-pe` | 优化 Seedance 2.0 视频生成提示词 | ## 安装 Skill 安装前需准备 Node.js 22.20.0 或更高版本,以及 npm。安装完成后,重新打开 AI Agent 会话再使用 Skill。 ### ark-model-benchmark `ark-model-benchmark` 支持连通性检查、Prefix 前缀复用、多轮长上下文和完整测试,并在 `reports/` 目录中生成 Markdown 报告和 PNG 图表。 使用前需安装 Ark CLI 并完成 SSO 登录: ```bash npm install -g @volcengine/ark-cli@latest arkcli auth login volc-sso ``` 执行以下命令安装 Skill: ```bash npx --yes skills@latest add "https://arkdocs.tos-cn-beijing.volces.com/skills/" \ --skill ark-model-benchmark \ --yes ``` 安装完成后,使用自然语言触发。例如: ```text 帮我压测一下方舟上豆包 Seed 2.0 Mini 模型的性能。 ``` 有关评测模式、参数和报告说明,详情请参见[模型接入指南(LLM) - 性能评测](/docs/go-live-benchmark-guide)。 ### ark-docs-assistant `ark-docs-assistant` 用于分析模型升级或迁移方案,也可以扫描代码项目中的模型引用,生成模型替换清单并评估迁移风险。 该 Skill 优先使用文档 MCP 获取信息;MCP 不可用时,会尝试使用 Ark CLI。文档 MCP 的配置方法,详情请参见[文档 MCP](/docs/tutorials-mcp)。 执行以下命令安装 Skill: ```bash npx --yes skills@latest add "https://arkdocs.tos-cn-beijing.volces.com/skills/" \ --skill ark-docs-assistant \ --yes ``` 安装完成后,使用自然语言触发。例如: ```text 扫描当前项目,将目标模型升级为最新模型,先给出迁移清单,不要直接修改。 ``` 有关模型迁移场景,详情请参见[Seed-Evolving](/docs/latest-model)。 ### sd25-pe `sd25-pe` 可以处理文本、故事片段和多模态参考素材,并根据视频生成、关键帧、分镜、视频编辑、声音编辑或视频延长等任务组织提示词。 执行以下命令安装 Skill: ```bash npx --yes skills@latest add "https://arkdocs.tos-cn-beijing.volces.com/skills/" \ --skill sd25-pe \ --yes ``` 安装完成后,在 AI Agent 对话框中输入: ```text /sd25-pe + 你的提示词内容 ``` 该 Skill 只负责生成或优化提示词,不会自行提交视频生成任务。有关 Seedance 2.5 提示词写法,详情请参见[Doubao Seedance 2.5 提示词指南](/docs/seedance-2-5-prompt-guide)。 ### sd2-pe `sd2-pe` 可以根据任务类型整理 Seedance 2.0 视频生成提示词中的主体、动作、场景、镜头、风格和素材引用关系。 执行以下命令安装 Skill: ```bash npx --yes skills@latest add "https://arkdocs.tos-cn-beijing.volces.com/skills/" \ --skill sd2-pe \ --yes ``` 安装完成后,在 AI Agent 对话框中输入: ```text /sd2-pe + 你的提示词内容 ``` 有关 Seedance 2.0 的模型能力和提示词规则,详情请参见[Doubao Seedance 2.0 系列教程](/docs/seedance-2-0)。