# -*- coding: utf-8 -*- """Sentence-1 direction-corrected charge sequence: close-up -> gallop -> aerial.""" 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": 9048, "asset_type": "image", "role": "reference_image"} CLOSE = """【锁死人物与马】吕布必须100%按参考图1:黑色高束发髻、金色凤翅束发冠、双根鲜红超长翎羽、剑眉浓黑、眼窝深、眼神锐利、兽面吞头连环铠、红色长披风,不得换成其他角色;方天画戟按参考图3。赤兔必须100%按参考图2:红鬃、深枣红马身、黑色皮质马鞍+金色鞍饰+红色缨穗+完整鞍布,毛色与马具形制不得改动。参考图只锁造型,机位与构图重新设计。 【方向轴锁死】吕布从城门里向野外全速冲杀:城门只出现在画面右后方,野外在画面左前方;吕布与赤兔从右后向左前疾驰,马头和吕布面部朝向画面左前方,红披风、双翎、红鬃全部向画面右后方飞扬。绝不朝城门跑、绝不向右跑、绝不冲镜头。 【镜头】贴地低机位左侧前跟拍特写:吕布伏低上身、目光锐利盯住左前方,画戟向前平指;赤兔颈部与前腿入画,前腿数量正确、关节自然,马颈与躯干比例正常,无多余肢体、无扭曲、无透视畸变;前蹄踏碎薄雪,雪块与尘土向右后方飞溅。城门在右后方虚化,左前方是开阔冷青野外。清晨低角度侧逆光从画面左上方射来,马鬃与人物轮廓勾出金边,阴影冷青,浅景深、运动模糊只在背景和蹄雪,人物面部清晰。电影级调色、胶片颗粒、边缘暗角,16:9,无文字无水印无旗帜。""" GALLOP = """【锁死人物与马】吕布必须100%按参考图1:黑色高束发髻、金色凤翅束发冠、双根鲜红超长翎羽、剑眉浓黑、眼窝深、眼神锐利、兽面吞头连环铠、红色长披风,不得换成其他角色;方天画戟按参考图3。赤兔必须100%按参考图2:红鬃、深枣红马身、黑色皮质马鞍+金色鞍饰+红色缨穗+完整鞍布,毛色与马具形制不得改动。参考图只锁造型,机位与构图重新设计。 【方向轴锁死】吕布从城门里向野外全速冲杀:城门位于画面右上方/右后方,开阔野外位于画面左前方;吕布与赤兔从右向左全速奔出,马头和吕布面朝左,披风、双翎、红鬃、马尾全部向右后方拖曳。绝不朝城门跑、绝不向右跑、绝不冲镜头。 【解剖锁死】完整马身入画,四条腿清晰、四个蹄子,前腿屈收、后腿蹬伸,马颈与躯干比例自然,绝不增加肢体、绝不扭曲躯干、绝不大头、绝不透视畸变。 【镜头】贴地低机位侧向跟拍中景:吕布伏低身体全速冲杀,画戟向前平指;赤兔四蹄腾空或交替疾驰,雪块与尘土向右后方喷出长长尾迹。右后方城门远离,左前方野外开阔。清晨低角度侧逆光,马鬃与人物轮廓金边,冷青阴影+暖金高光,胶片颗粒,边缘暗角,浅景深,16:9,无文字无水印无旗帜。""" AERIAL = """【锁死人物与马】吕布与赤兔的造型必须按参考图1、参考图2、参考图3:吕布黑色高束发髻、双红翎、兽面吞金甲、红披风、方天画戟;赤兔红鬃、深枣红马身、金色鞍饰与完整鞍布。人物与马为远景小比例剪影,但轮廓与配色一致,不得换成其他骑手或马。参考图只提供造型与场景元素,机位与构图完全重新设计。 【方向轴锁死】吕布从城门里向野外冲杀:航拍俯视中,虎牢关城门位于画面右上方/右后方,辽阔野外位于画面左下方/左前方,古道从右上向左下延伸;吕布与赤兔从右上向左下疾驰,正在远离城门进入野外,长雪尘尾迹拖向右上方。绝不向城门靠近。 【镜头】高机位无人机俯冲视角:城门与城墙在右上方压边,城外辽阔雪原、山脊、车辙在左下方展开,吕布一骑占画面约十分之一,红披风与红鬃是灰金画面中唯一暖色;晨光从左上低角度照入,尘雾被照成金色,远山冷青蓝,层次分明无死黑。电影级调色、胶片颗粒、边缘暗角,16:9,无文字无水印无旗帜。""" 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")[:700]) submit("lubu_s1_charge_close_20261027_v1", CLOSE, [CHAR, HORSE, HALBERD, SCENE]) submit("lubu_s1_charge_gallop_20261027_v1", GALLOP, [CHAR, HORSE, HALBERD, SCENE]) submit("lubu_s1_charge_aerial_20261027_v1", AERIAL, [CHAR, HORSE, HALBERD, SCENE])