feat(image): support arbitrary size and aspect ratio shortcuts for doubao generate
- --size now accepts free-form values (2K, 3K, 4K, 2304x1728, etc.) instead of a fixed [1K, 2K] choice. - Add --ratio shortcut (1:1, 4:3, 3:4, 16:9, 9:16) mapping to pixel sizes. - When both --size and --ratio are given, --size takes priority. - Default remains 2K when neither is specified.
This commit is contained in:
+18
-3
@@ -187,15 +187,25 @@ def compress_images(files, target_mb, max_width, quality, suffix, dry_run):
|
|||||||
click.echo(f"Compressed: {img_file} -> {output} ({size_mb:.2f} MB)")
|
click.echo(f"Compressed: {img_file} -> {output} ({size_mb:.2f} MB)")
|
||||||
|
|
||||||
|
|
||||||
|
_RATIO_MAP = {
|
||||||
|
"1:1": "1024x1024",
|
||||||
|
"4:3": "1024x768",
|
||||||
|
"3:4": "768x1024",
|
||||||
|
"16:9": "1280x720",
|
||||||
|
"9:16": "720x1280",
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@image.command("generate")
|
@image.command("generate")
|
||||||
@click.argument("prompt", required=False)
|
@click.argument("prompt", required=False)
|
||||||
@click.option("-f", "--file", type=click.Path(exists=True), help="从文件读取 prompt")
|
@click.option("-f", "--file", type=click.Path(exists=True), help="从文件读取 prompt")
|
||||||
@click.option("-s", "--size", default="2K", type=click.Choice(["1K", "2K"]), help="图片尺寸")
|
@click.option("-s", "--size", help='图片尺寸 (如 2K, 3K, 4K 或 2304x1728)')
|
||||||
|
@click.option("-r", "--ratio", type=click.Choice(list(_RATIO_MAP.keys())), help="快捷比例 (1:1, 4:3, 3:4, 16:9, 9:16)")
|
||||||
@click.option("-o", "--output", help="保存路径(默认只输出 URL)")
|
@click.option("-o", "--output", help="保存路径(默认只输出 URL)")
|
||||||
@click.option("--no-watermark", is_flag=True, help="不添加豆包水印")
|
@click.option("--no-watermark", is_flag=True, help="不添加豆包水印")
|
||||||
@click.option("--b64", is_flag=True, help="使用 b64_json 格式获取图片数据")
|
@click.option("--b64", is_flag=True, help="使用 b64_json 格式获取图片数据")
|
||||||
@handle_errors
|
@handle_errors
|
||||||
def generate_image_cmd(prompt, file, size, output, no_watermark, b64):
|
def generate_image_cmd(prompt, file, size, ratio, output, no_watermark, b64):
|
||||||
"""使用豆包/Seedream 模型生成图片。"""
|
"""使用豆包/Seedream 模型生成图片。"""
|
||||||
from openai import OpenAI
|
from openai import OpenAI
|
||||||
|
|
||||||
@@ -209,6 +219,11 @@ def generate_image_cmd(prompt, file, size, output, no_watermark, b64):
|
|||||||
click.echo("Error: apikey_ark not set. Run: mytoolkit env set apikey_ark <value>", err=True)
|
click.echo("Error: apikey_ark not set. Run: mytoolkit env set apikey_ark <value>", err=True)
|
||||||
raise click.Abort()
|
raise click.Abort()
|
||||||
|
|
||||||
|
if size and ratio:
|
||||||
|
click.echo("Warning: --size 和 --ratio 同时指定,--size 优先", err=True)
|
||||||
|
|
||||||
|
resolved_size = size or (ratio and _RATIO_MAP[ratio]) or "2K"
|
||||||
|
|
||||||
client = OpenAI(
|
client = OpenAI(
|
||||||
base_url="https://ark.cn-beijing.volces.com/api/v3",
|
base_url="https://ark.cn-beijing.volces.com/api/v3",
|
||||||
api_key=api_key,
|
api_key=api_key,
|
||||||
@@ -217,7 +232,7 @@ def generate_image_cmd(prompt, file, size, output, no_watermark, b64):
|
|||||||
resp = client.images.generate(
|
resp = client.images.generate(
|
||||||
model="doubao-seedream-5-0-260128",
|
model="doubao-seedream-5-0-260128",
|
||||||
prompt=prompt,
|
prompt=prompt,
|
||||||
size=size,
|
size=resolved_size,
|
||||||
response_format="b64_json" if b64 else "url",
|
response_format="b64_json" if b64 else "url",
|
||||||
extra_body={"watermark": not no_watermark},
|
extra_body={"watermark": not no_watermark},
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user