
Byted Seedream Image Generate
- 268 installs
- 411 repo stars
- Updated August 4, 2026
- bytedance/agentkit-samples
byted-seedream-image-generate is a Claude Code skill that calls ByteDance Seedream image generation through AgentKit for developers who need automated marketing visuals, thumbnails, and creative assets in content workflo
About
byted-seedream-image-generate is an AgentKit sample skill from bytedance/agentkit-samples that connects coding agents to ByteDance Seedream image generation. Developers invoke it to produce marketing visuals, thumbnails, and creative assets inside automated content workflows without leaving the agent session. The skill wraps the Seedream API call pattern so AgentKit pipelines can generate images on demand during copywriting, social posting, or landing-page builds. Reach for byted-seedream-image-generate when a workflow needs programmatic image creation tied to AgentKit orchestration rather than manual design exports or a separate image editor step.
- Seedream image generation sample
- Prompt and parameter conventions
- AgentKit creative tool integration
- Automated asset output handling
Byted Seedream Image Generate by the numbers
- 268 all-time installs (skills.sh)
- Ranked #539 of 1,335 Generative Media skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/bytedance/agentkit-samples --skill byted-seedream-image-generateAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 268 |
|---|---|
| repo stars | ★ 411 |
| Last updated | August 4, 2026 |
| Repository | bytedance/agentkit-samples ↗ |
How do you generate images with Seedream in AgentKit?
Call ByteDance Seedream image generation from AgentKit to produce marketing visuals, thumbnails, and creative assets inside automated content workflows.
Who is it for?
Developers building AgentKit content automation who need Seedream-generated visuals inside agent-driven pipelines.
Skip if: Teams not using AgentKit or developers who need fine-grained manual design control outside automated image generation.
When should I use this skill?
User needs marketing visuals, thumbnails, or creative assets generated via ByteDance Seedream inside an AgentKit workflow
What you get
Generated marketing images, thumbnails, and creative asset files from Seedream API calls
- generated image assets
- thumbnail files
- campaign creative outputs
Files
byted-seedream-image-generate
Description
Generate high-quality images from text prompts using Volcano Engine Seedream models. This skill provides access to three powerful Seedream model versions (4.0, 4.5, and 5.0-lite), each offering unique capabilities for different use cases.
When to Use This Skill
Use this skill when:
- Users want to create images from text descriptions
- Users need to generate artwork in various artistic styles
- Users want to create visual content for creative projects
- Users need AI-powered image generation capabilities
- Users want to convert reference images to different styles
- Users need to generate multiple images in batch
- Users require high-quality, professional-looking images
Model Versions
| Version | Model Name | Release Date | Recommendation | Best For |
|---|---|---|---|---|
| 4.0 | doubao-seedream-4-0-250828 | August 2025 | ⭐⭐⭐ | Daily use, quick generation |
| 4.5 | doubao-seedream-4-5-251128 | November 2025 | ⭐⭐⭐⭐ | Detail-oriented work, complex scenes |
| 5.0 | doubao-seedream-5-0-260128 | 2026 | ⭐⭐⭐⭐⭐ | Highest quality, best creativity, tools support |
Features
- Text-to-Image: Generate images from detailed text descriptions
- Image-to-Image: Transform reference images into different styles
- Batch Generation: Create multiple images in a single request
- Multiple Versions: Choose from 4.0, 4.5, or 5.0-lite models
- Watermark Control: Option to disable watermarks
- Custom Sizes: Support for various image dimensions
- Output Formats: PNG and JPEG formats (5.0-lite only)
- Web Search Tools: Internet search integration (5.0-lite only)
Installation & Setup
Prerequisites
# Required: API Key configuration
export MODEL_IMAGE_API_KEY="your-api-key-here"
# or
export MODEL_AGENT_API_KEY="your-api-key-here"
# or
export ARK_API_KEY="your-api-key-here"
# Optional: API Base URL (default already configured)
export MODEL_IMAGE_API_BASE="https://ark.cn-beijing.volces.com/api/v3"
# or
export ARK_BASE_URL="https://ark.cn-beijing.volces.com/api/v3"The script will prioritize: 1. Environment variables (ARK_API_KEY, MODEL_IMAGE_API_KEY, MODEL_AGENT_API_KEY) 2. Environment variables (ARK_BASE_URL, MODEL_IMAGE_API_BASE) 3. Default values
Usage
Basic Usage (5.0-lite version recommended)
cd scripts
python seedream_image_generate.py -p "A cute kitten playing in a garden"Specify Version
# Use 4.0 version
python seedream_image_generate.py -p "A cute kitten" --version 4.0
# Use 4.5 version
python seedream_image_generate.py -p "A cute kitten" --version 4.5
# Use 5.0-lite version (recommended)
python seedream_image_generate.py -p "A cute kitten" --version 5.0Advanced Options
# Custom size without watermark
python seedream_image_generate.py -p "Beautiful sunset" -s 2048x2048 --no-watermark --version 5.0
# Batch generation
python seedream_image_generate.py -p "Generate 3 cute dog pictures" -g --max-images 3 --version 4.5
# Image-to-image
python seedream_image_generate.py -p "Convert this image to anime style" -i "https://example.com/image.jpg" --version 5.0
# Web search tool (5.0-lite only)
python seedream_image_generate.py -p "Latest 2026 smartphone" --web-search --version 5.0
# Custom output format (5.0-lite only)
python seedream_image_generate.py -p "A beautiful landscape" --output-format png --version 5.0
# List all supported versions
python seedream_image_generate.py --list-versionsCommand Line Options
| Option | Shortcut | Description | Default |
|---|---|---|---|
--prompt | -p | Image description text (required) | - |
--version | -v | Version selection: 4.0, 4.5, 5.0 | 5.0 |
--size | -s | Image dimensions | 2048x2048 |
--image | -i | Single reference image URL | - |
--images | - | Multiple reference image URLs (space separated) | - |
--group | -g | Enable batch image generation | false |
--max-images | - | Maximum images for batch generation | 15 |
--output-format | - | Output format: png or jpeg (5.0 only) | jpeg |
--response-format | - | Response format: url or b64_json | url |
--stream | - | Enable streaming output | false |
--web-search | - | Enable web search tool (5.0 only) | false |
--optimize-prompt-mode | - | Prompt optimization mode: standard or fast | - |
--timeout | -t | Timeout in seconds | 1200 |
--no-watermark | - | Disable watermark | false |
--list-versions | - | List all supported versions | - |
Python API Usage
import asyncio
import sys
sys.path.append("scripts")
from seedream_image_generate import seedream_generate
async def main():
# Use 5.0-lite version (default)
result = await seedream_generate([
{
"prompt": "A cute kitten",
"size": "2048x2048",
"watermark": False,
"output_format": "png" # 5.0-lite only
}
], version="5.0")
print(result)
asyncio.run(main())Version Selection Guide
Choose 4.0 if:
- You need quick daily generation
- Quality requirements are not extremely high
- You need faster generation speed
- Simple scenes and styles
Choose 4.5 if:
- You want richer details
- You're working with complex scenes
- You need better style reproduction
- You have moderate quality requirements
Choose 5.0-lite (Recommended) if:
- You want the highest quality
- You need breakthrough creative expression
- You have extreme detail requirements
- You need tools parameter (like web search) ⭐
- You need custom output format (png/jpeg) ⭐
- Important projects and work
When in doubt, use 5.0-lite! ⭐
Prompt Engineering Tips
Basic Prompt Structure
[Subject Description] + [Style/Art Movement] + [Lighting/Atmosphere] + [Quality/Resolution]Advanced Prompts (Optimized for 5.0-lite)
[Subject Description], [Creative Style/Art Movement], [Unique Perspective/Composition], [Special Lighting/Atmosphere], [Emphasizing 5.0-lite creative expression]Parameter Support by Version
| Parameter | Seedream 4.0 | Seedream 4.5 | Seedream 5.0-lite | Description |
|---|---|---|---|---|
| model | ✅ | ✅ | ✅ | Model name |
| prompt | ✅ | ✅ | ✅ | Prompt (required) |
| image | ✅ | ✅ | ✅ | Reference image(s) |
| size | ✅ | ✅ | ✅ | Image dimensions |
| sequential_image_generation | ✅ | ✅ | ✅ | Batch generation control |
| sequential_image_generation_options | ✅ | ✅ | ✅ | Batch generation config |
| response_format | ✅ | ✅ | ✅ | Response format (url/b64_json) |
| watermark | ✅ | ✅ | ✅ | Watermark (true/false) |
| stream | ✅ | ✅ | ✅ | Streaming output |
| optimize_prompt_options | ✅ | ✅ | ✅ | Prompt optimization config |
| tools | ❌ | ❌ | ✅ | Tool configuration (5.0-lite only) |
| output_format | ❌ | ❌ | ✅ | Output format (png/jpeg, 5.0-lite only) |
Final Return Info
For OpenClaw
1. First, save/download the generated image to an allowed directory:
- Recommended:
~/.openclaw/workspace/
2. Use the `message tool` to send the image with these parameters:
{
"action": "send",
"message": "Optional text description",
"media": "/root/.openclaw/workspace/generated-image.jpg"
}- The tool will automatically: read the local file, upload to the channel server as a web URL, and send as an image message
3. Verify success: Check that the tool returns {"ok": true} to confirm the image was sent successfully
4. Normal Text not message tool: After generation, show list of images with Markdown format, for example:

Very important: The image URL must be an original online resource link starting with https://, not a local image address you have downloaded.
For Normal
You should return three types of information: 1. File format, return the image file (if you have some other methods to send the image file) and the local path of the image, for example: local_path: /root/.openclaw/workspace/skills/image-generate/xxx.png 2. After generation, show list of images with Markdown format, for example:

FAQ
Q: What's the difference between the versions?
A: 4.0 is for quick daily use, 4.5 offers better details for complex scenes, and 5.0-lite provides the highest quality with unique tools support.
Q: How long are generated URLs valid?
A: URLs are valid for 24 hours. Please download and save your images promptly.
Q: What image formats are supported for references?
A: Common formats like JPG and PNG are supported, provided via URL or Base64.
Q: Can I use multiple versions in one call?
A: Currently, only one version per call. For comparisons, make separate calls for different versions.
License
This skill is licensed under the Apache License 2.0. See the LICENSE file for details.
Notice
Please comply with Volcano Engine's terms of service and relevant laws and regulations when using this skill.
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts), or to the extent of a material breach of the
obligations in this License, shall any Contributor be liable to You
for damages, including any direct, indirect, special, incidental,
or consequential damages of any character arising as a result of this
License or out of the use or inability to use the Work (including
but not limited to damages for loss of goodwill, work stoppage,
computer failure or malfunction, or any and all other commercial
damages or losses), even if such Contributor has been advised of the
possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
#!/usr/bin/env python3
# Copyright (c) 2026 Beijing Volcano Engine Technology Co., Ltd. and/or its affiliates.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""
byted-seedream-image-generate - Generate high-quality images from text prompts
using Volcano Engine Seedream models. Supports 4.0, 4.5, and 5.0-lite versions.
"""
import argparse
import asyncio
import json
import os
import sys
import re
from typing import Dict, List, Tuple
import httpx
# Configuration constants
API_KEY = (
os.getenv("ARK_API_KEY")
or os.getenv("MODEL_IMAGE_API_KEY")
or os.getenv("MODEL_AGENT_API_KEY")
)
API_BASE = (
os.getenv("ARK_BASE_URL")
or os.getenv("MODEL_IMAGE_API_BASE")
or "https://ark.cn-beijing.volces.com/api/v3"
).rstrip("/")
API_BASE = re.sub(r"/api/coding/(?:lite/|pro/)?v3$", "/api/v3", API_BASE)
# Model names for each version
MODELS = {
"4.0": "doubao-seedream-4-0-250828",
"4.5": "doubao-seedream-4-5-251128",
"5.0": "doubao-seedream-5-0-260128",
}
# Supported fields per version (based on official documentation)
SUPPORTED_FIELDS = {
"4.0": [
"size",
"response_format",
"watermark",
"image",
"sequential_image_generation",
"sequential_image_generation_options",
"stream",
"optimize_prompt_options",
],
"4.5": [
"size",
"response_format",
"watermark",
"image",
"sequential_image_generation",
"sequential_image_generation_options",
"stream",
"optimize_prompt_options",
],
"5.0": [
"size",
"response_format",
"watermark",
"image",
"sequential_image_generation",
"sequential_image_generation_options",
"tools",
"output_format",
"stream",
"optimize_prompt_options",
],
}
# Version descriptions
VERSION_DESCRIPTIONS = {
"4.0": "Seedream 4.0 - Stable and reliable for daily use, fast response (does not support tools and output_format)",
"4.5": "Seedream 4.5 - Better detail performance, improved complex scene handling (does not support tools and output_format)",
"5.0": "Seedream 5.0 - The strongest version currently available! Breakthrough creative expression and ultra-high quality details! The only version that supports tools and output_format!",
}
def _get_headers() -> dict:
"""
Build API request headers
"""
if not API_KEY:
raise ValueError(
"Please set ARK_API_KEY or MODEL_IMAGE_API_KEY or MODEL_AGENT_API_KEY environment variable"
)
return {
"Content-Type": "application/json",
"Authorization": f"Bearer {API_KEY}",
}
def _build_request_body(item: dict, model_name: str, version: str) -> dict:
"""
Build API request body
Only add parameters supported by the selected version
"""
print("\n" + "="*80)
print("📋 构建请求体 - 输入参数:")
print("="*80)
print(f"item: {json.dumps(item, indent=2, ensure_ascii=False, default=str)}")
print(f"model_name: {model_name}")
print(f"version: {version}")
print("="*80 + "\n")
body = {
"model": model_name,
"prompt": item.get("prompt", ""),
}
# Only add optional parameters supported by the current version
supported_fields = SUPPORTED_FIELDS.get(version, [])
for field in supported_fields:
if field in item and item[field] is not None:
body[field] = item[field]
# Handle sequential_image_generation options for batch generation
if item.get("sequential_image_generation") == "auto":
options = dict(item.get("sequential_image_generation_options") or {})
if "max_images" in item:
options["max_images"] = item["max_images"]
if options:
body["sequential_image_generation_options"] = options
print("\n" + "="*80)
print("✅ 构建请求体 - 最终输出:")
print("="*80)
print(f"body: {json.dumps(body, indent=2, ensure_ascii=False, default=str)}")
print("="*80 + "\n")
return body
async def _call_image_api(item: dict, model_name: str, version: str, timeout: int) -> dict:
"""
Call image generation API"""
url = f"{API_BASE}/images/generations"
body = _build_request_body(item, model_name, version)
# 打印完整请求入参
print("\n" + "="*80)
print("📤 完整 API 请求入参:")
print("="*80)
print(f"URL: {url}")
print(f"Headers: {json.dumps(_get_headers(), indent=2, ensure_ascii=False)}")
print(f"Request Body: {json.dumps(body, indent=2, ensure_ascii=False)}")
print("="*80 + "\n")
async with httpx.AsyncClient(timeout=float(timeout)) as client:
response = await client.post(url, headers=_get_headers(), json=body)
response.raise_for_status()
return response.json()
async def handle_single_task(
idx: int,
item: dict,
model_name: str,
version: str,
timeout: int,
) -> Tuple[List[dict], List[str], List[dict]]:
"""
Handle a single image generation task"""
success_list = []
error_list = []
error_detail_list = []
try:
response = await _call_image_api(item, model_name, version, timeout)
if "error" not in response:
data_list = response.get("data", [])
for i, image_data in enumerate(data_list):
image_name = f"task_{idx}_image_{i}"
# Check if image has error
if "error" in image_data:
error_list.append(image_name)
error_detail_list.append(
{
"task_idx": idx,
"image_name": image_name,
"error": image_data.get("error"),
}
)
continue
# Get image URL or Base64 data
image_url = image_data.get("url")
if image_url:
success_list.append({image_name: image_url})
else:
b64 = image_data.get("b64_json")
if b64:
output_format = item.get("output_format")
mime_type = "image/jpeg" if output_format == "jpeg" else "image/png"
success_list.append(
{image_name: f"data:{mime_type};base64,{b64}"}
)
else:
error_list.append(image_name)
error_detail_list.append(
{
"task_idx": idx,
"image_name": image_name,
"error": "missing data (no url/b64)",
}
)
else:
# API returned error
error_info = response.get("error", {})
error_list.append(f"task_{idx}")
error_detail_list.append({"task_idx": idx, "error": error_info})
except Exception as e:
# Handle exception
error_list.append(f"task_{idx}")
error_detail_list.append({"task_idx": idx, "error": str(e)})
return success_list, error_list, error_detail_list
async def seedream_generate(
tasks: List[dict],
version: str = "5.0",
timeout: int = 1200,
) -> Dict:
"""
Main function for byted-seedream-image-generate
One skill supporting three versions! Choose the appropriate version based on your needs!
Automatically filters unsupported parameters based on version!
Based on official API documentation:
- Seedream 4.0/4.5: Do not support tools and output_format parameters
- Seedream 5.0-lite: Supports all parameters including tools and output_format
Args:
tasks: List of tasks, each task is a dictionary
version: Version selection: "4.0", "4.5", or "5.0" (default 5.0)
timeout: Timeout in seconds, default 1200 seconds
Returns:
Dictionary containing generation results
"""
# Validate version
if version not in MODELS:
return {
"status": "error",
"success_list": [],
"error_list": [f"Unsupported version: {version}, please choose 4.0, 4.5, or 5.0"],
"error_detail_list": [{"error": "Invalid version"}],
}
if not API_KEY:
return {
"status": "error",
"success_list": [],
"error_list": ["Missing API key, please set ARK_API_KEY or MODEL_IMAGE_API_KEY or MODEL_AGENT_API_KEY"],
"error_detail_list": [{"error": "Missing API key"}],
}
model_name = MODELS[version]
success_list = []
error_list = []
error_detail_list = []
# Process all tasks concurrently
coroutines = [
handle_single_task(idx, item, model_name, version, timeout)
for idx, item in enumerate(tasks)
]
results = await asyncio.gather(*coroutines, return_exceptions=True)
# Compile results
for res in results:
if isinstance(res, Exception):
error_list.append("unknown_task_exception")
error_detail_list.append({"error": str(res)})
continue
s, e, ed = res
success_list.extend(s)
error_list.extend(e)
error_detail_list.extend(ed)
# Add version note
version_note = VERSION_DESCRIPTIONS[version]
if version != "5.0":
version_note += " 【Note: This version does not support tools and output_format parameters】"
return {
"status": "success" if success_list else "error",
"success_list": success_list,
"error_list": error_list,
"error_detail_list": error_detail_list,
"model": model_name,
"version": version,
"version_note": version_note,
"supported_fields": SUPPORTED_FIELDS[version],
}
def list_versions():
"""List all supported versions"""
print("byted-seedream-image-generate supported versions:")
print("")
for version, desc in VERSION_DESCRIPTIONS.items():
model = MODELS[version]
print(f" Version {version}:")
print(f" Model name: {model}")
print(f" Description: {desc}")
print(f" Supported parameters: {', '.join(SUPPORTED_FIELDS[version])}")
if version != "5.0":
print(f" ⚠️ Not supported: tools, output_format")
else:
print(f" ⭐ Only supported: tools, output_format")
print("")
print("Recommendation: When in doubt, use 5.0!")
def main():
"""
Command line entry point"""
parser = argparse.ArgumentParser(
description="byted-seedream-image-generate - Generate high-quality images from text prompts using Volcano Engine Seedream models"
)
parser.add_argument(
"--prompt", "-p", required=False, help="Image description text"
)
parser.add_argument(
"--version", "-v", choices=["4.0", "4.5", "5.0"], default="5.0",
help="Version selection: 4.0, 4.5, or 5.0 (default 5.0)"
)
parser.add_argument(
"--size", "-s", default="2048x2048",
help="Image dimensions (e.g., 2048x2048, 2K, 4K, 3K)"
)
parser.add_argument(
"--image", "-i", default=None,
help="Reference image URL (for image-to-image)"
)
parser.add_argument(
"--images", nargs="+", default=None,
help="Multiple reference image URLs (space separated, for multi-image-to-image, max 14)"
)
parser.add_argument(
"--group", "-g", action="store_true",
help="Enable batch image generation (sequential_image_generation=auto)"
)
parser.add_argument(
"--max-images", type=int, default=15,
help="Maximum images for batch generation (default 15, range [1,15])"
)
parser.add_argument(
"--output-format", choices=["png", "jpeg"], default="jpeg",
help="Output format: png or jpeg (5.0 only)"
)
parser.add_argument(
"--response-format", choices=["url", "b64_json"], default="url",
help="Response format: url or b64_json (default url)"
)
parser.add_argument(
"--stream", action="store_true",
help="Enable streaming output mode (default false)"
)
parser.add_argument(
"--optimize-prompt-mode", choices=["standard", "fast"], default=None,
help="Prompt optimization mode: standard or fast (fast only supported by some models)"
)
parser.add_argument(
"--web-search", action="store_true",
help="Enable web search tool (5.0 only)"
)
parser.add_argument(
"--timeout", "-t", type=int, default=1200,
help="Timeout in seconds (default 1200)"
)
parser.add_argument(
"--no-watermark", action="store_true",
help="Disable image watermark (default enabled)"
)
parser.add_argument(
"--list-versions", action="store_true",
help="List all supported versions and parameter support"
)
args = parser.parse_args()
# If listing versions
if args.list_versions:
list_versions()
sys.exit(0)
# Check if prompt is provided
if not args.prompt:
print(" Error: Please provide --prompt parameter (image description)")
print(" Or use --list-versions to see all supported versions")
sys.exit(1)
# Check API key
if not API_KEY:
print(
" Error: Please set ARK_API_KEY or MODEL_IMAGE_API_KEY or MODEL_AGENT_API_KEY environment variable!"
)
print(" Tip: export ARK_API_KEY='your-api-key'")
sys.exit(1)
if args.stream:
print(
" Error: --stream is not supported yet (the script does not parse streaming responses)."
)
sys.exit(1)
# Build task
task = {
"prompt": args.prompt,
"size": args.size,
"response_format": args.response_format,
"watermark": not args.no_watermark,
}
# Only add output_format and tools for 5.0 version
if args.version == "5.0":
task["output_format"] = args.output_format
if args.web_search:
task["tools"] = [{"type": "web_search"}]
else:
# Warn user that these parameters will be ignored in non-5.0 versions
if args.output_format != "jpeg":
print(f"⚠️ Warning: {args.version} version does not support output_format parameter, will be ignored")
if args.web_search:
print(f"⚠️ Warning: {args.version} version does not support tools/web_search parameter, will be ignored")
# Handle prompt optimization
if args.optimize_prompt_mode:
# 4.5 and 5.0 versions don't support fast mode
if args.version in ["4.5", "5.0"] and args.optimize_prompt_mode == "fast":
print(f"⚠️ Warning: {args.version} version does not support fast optimization mode, will use standard mode")
task["optimize_prompt_options"] = {"mode": "standard"}
else:
task["optimize_prompt_options"] = {"mode": args.optimize_prompt_mode}
# Handle reference images
if args.images:
task["image"] = args.images
elif args.image:
task["image"] = args.image
# Handle batch generation
if args.group:
if not (1 <= args.max_images <= 15):
print(" Error: --max-images must be in range [1, 15]")
sys.exit(1)
task["sequential_image_generation"] = "auto"
task["max_images"] = args.max_images
print(f" Generating image using Seedream {args.version}...")
print(f" {VERSION_DESCRIPTIONS[args.version]}")
print(f" Prompt: {args.prompt}")
print(f" Size: {args.size}")
print(f" Response format: {args.response_format}")
if args.version == "5.0":
print(f"🖼️ Output format: {args.output_format}")
print(f" Watermark: {'Disabled' if args.no_watermark else 'Enabled'}")
print(f" Stream output: {'Enabled' if args.stream else 'Disabled'}")
if args.version == "5.0" and args.web_search:
print(f"🔍 Web search: Enabled")
if args.optimize_prompt_mode:
print(f" Prompt optimization: {args.optimize_prompt_mode}")
print("")
# Execute generation
result = asyncio.run(
seedream_generate([task], version=args.version, timeout=args.timeout)
)
# Output results
print(json.dumps(result, indent=2, ensure_ascii=False))
if result["status"] == "success":
print(f"\n {args.version} version generation successful!")
print(f" Generated {len(result['success_list'])} images")
if args.version == "5.0":
print(f" Great choice! 5.0 is the strongest version currently, and it even supports tools and output_format!")
else:
print(f"\n😢 Generation failed")
print(f" Don't worry, let me help you check the error information: {result['error_list']}")
if __name__ == "__main__":
main()
Related skills
FAQ
What does byted-seedream-image-generate produce?
byted-seedream-image-generate calls ByteDance Seedream through AgentKit to produce marketing visuals, thumbnails, and creative assets. Output lands in automated content workflows without a separate design tool step.
Which framework does byted-seedream-image-generate target?
byted-seedream-image-generate targets ByteDance AgentKit from the agentkit-samples repository. Developers use it when agent orchestration should trigger Seedream image generation during content or campaign builds.