# -*- coding: utf-8 -*- """Sentence-4: Puyang siege, five shots (黄昏战场 9055, 六将围攻).""" import json, ssl, pathlib, urllib.request, urllib.error BASE = "https://192.168.31.88:8042" CFG = pathlib.Path(r"C:\Users\admin\.zcode\cli\config.json") pat = json.loads(CFG.read_text(encoding="utf-8-sig"))["mcp"]["servers"]["sorb"]["env"]["SORB_PAT"] ctx = ssl._create_unverified_context() CHAR = {"source_type": "media_asset", "id": 9089, "asset_type": "image", "role": "reference_image"} HORSE = {"source_type": "media_asset", "id": 9047, "asset_type": "image", "role": "reference_image"} HALBERD = {"source_type": "media_asset", "id": 9057, "asset_type": "image", "role": "reference_image"} SCENE = {"source_type": "media_asset", "id": 9055, "asset_type": "image", "role": "reference_image"} STYLE = "3D超写实三国历史正剧CG,UE5.2全局光线追踪,3D动画CG质感非真人实拍,黄昏侧逆光,冷青阴影+暖金高光,画面通透无死黑,浅景深、胶片颗粒、边缘暗角,16:9,无文字无水印无旗帜。" # S4-1 大远景:濮阳城轮廓压地平线,吕布一骑冲阵 AERIAL = """【锁死吕布与赤兔】吕布按参考图1:黑高束发、金色凤翅冠、双红翎、兽面吞金甲、红披风,方天画戟按参考图2;赤兔按参考图3:红鬃、深枣红马身、金色鞍饰与完整鞍布。参考图只锁造型,构图全新。 【镜头】高机位大远景:黄昏濮阳战场,夯土城墙轮廓压在地平线上,暮色烟尘;吕布单骑自画面左下向右前方军阵冲锋,骑手为小比例但红披风与红鬃配色清晰可辨,画戟前指,马后拖出长长烟尘尾迹;地面散落断车与插地兵器剪影。""" + STYLE # S4-2 中景:六将剪影自两翼围拢 SIX_SIL = """【画面】黄昏战场中景,无具体人物面部。六员武将的玄色剪影从画面左右两翼同时向中央围拢:只见骑影轮廓、兵刃(长刀/长矛/大戟)的冷光轮廓与玄色无字旗,剪影边缘被黄昏逆光勾出暗金轮廓;中央留出被围的空位,尘土低垂。材质与氛围按参考图1黄昏战场。""" + STYLE # S4-3 近景:戟挑开一将兵器,借势转身 PARRY = """【锁死吕布】吕布按参考图1:黑高束发、金色凤翅冠、双红翎、兽面吞金甲、红披风;方天画戟按参考图2,月牙双刃+中央枪尖+戟尾配重、红色戟缨。参考图只锁造型,构图全新。 【镜头】近景侧跟:吕布马上侧身,画戟自下而上一记挑击,将画面右侧袭来的一柄长矛挑开(只给矛杆被荡开的动势与火星),吕布借势拧腰转身,红披风横甩成弧;背景虚化的黄昏战场与剪影兵刃。""" + STYLE # S4-4 近景:戟尾格挡回击(反打) BUTT = """【锁死吕布】吕布按参考图1:黑高束发、金色凤翅冠、双红翎、兽面吞金甲、红披风;方天画戟按参考图2。参考图只锁造型,构图全新。 【镜头】近景反打:从吕布右后方反打,画面左侧一杆长矛自斜上袭来,吕布不转身,反手以戟尾向后一格,矛杆被震开震颤,甲片与矛杆碰撞火星迸溅;吕布目光仍锁定画面右侧前方,面部半明半暗。""" + STYLE # S4-5 中景:破围而出,赤兔加速出画 BREAKOUT = """【锁死吕布与赤兔】吕布按参考图1:黑高束发、金色凤翅冠、双红翎、兽面吞金甲、红披风,方天画戟按参考图2;赤兔按参考图3:红鬃、深枣红马身、金色鞍饰与完整鞍布,完整马身、四腿数量正确、关节自然,禁止畸变。 【镜头】中景跟拍:吕布破开围拢的兵器丛林,赤兔猛然加速向画面右侧冲刺即将出画,身后六将剪影兵器散开、尘土炸裂成环;红披风与红鬃在暮光中拉出残影,前景飞溅土块与草屑。""" + STYLE def submit(key, prompt, refs): payload = { "client_namespace": "lubu_pv_board", "idempotency_key": key, "project_id": 30, "model_config_id": 62, "task_type": "image", "references": refs, "parameters": {"prompt": prompt, "aspect_ratio": "16:9", "image_size": "2K", "output_format": "png", "watermark": False}, } data = json.dumps(payload, ensure_ascii=False).encode("utf-8") req = urllib.request.Request(BASE + "/api/external/v1/tasks", data=data, method="POST", headers={"Authorization": "Bearer " + pat, "Content-Type": "application/json"}) try: with urllib.request.urlopen(req, context=ctx, timeout=120) as r: o = json.loads(r.read().decode("utf-8")) print(key, "task_id=", o.get("task", {}).get("id"), "status=", o.get("task", {}).get("status")) except urllib.error.HTTPError as e: print(key, "HTTP", e.code, e.read().decode("utf-8")[:500]) submit("lubu_s4_aerial_20261028_v1", AERIAL, [CHAR, HALBERD, HORSE, SCENE]) submit("lubu_s4_sixsil_20261028_v1", SIX_SIL, [SCENE]) submit("lubu_s4_parry_20261028_v1", PARRY, [CHAR, HALBERD, SCENE]) submit("lubu_s4_butt_20261028_v1", BUTT, [CHAR, HALBERD, SCENE]) submit("lubu_s4_breakout_20261028_v1", BREAKOUT, [CHAR, HALBERD, HORSE, SCENE])