# -*- coding: utf-8 -*- """t1338 series (吕布三视图角色系列, 基准 task 13146 / asset 9124) 专属场景板——用户要求不与 PV 的 S01-S09 共用. v3 定标:Seedream 62 + 质感红线 + 戏剧瞬间。四张:雪原古道/关前校场/烽火战场/暮色河岸.""" 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() # 参考锁元素(吕布三视图 V6 9089 + 赤兔 9047),但场景是空景:参考图只给材质色调与场景元素 LUBU = {"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"} QUALITY = """【质感红线(最高优先级)】干净的材质渲染:雪面/天空/雾气/水面/泥地/夯土均为大面积平滑渐变,禁止网格状假裂纹,禁止泥点颗粒噪,禁止脏斑与碎屑堆砌;细节只允许出现在结构上(车辙、石缝、砖缝、木构榫卯、枯草),不允许出现在大面材质上;整体画面通透、干净、无死黑。 【镜头】电影级战争史诗质感,宽银幕构图,体积光,大气透视,胶片颗粒轻微,边缘暗角,16:9,2K。""" EMPTY = "空场景,没有任何人物、士兵、马匹、动物、旗帜、幡、旌旗、军旗、文字、牌匾文字、徽记、现代物品。参考图仅提供场景元素与材质色调,构图完全重新设计,不复制参考图构图。" # T1 雪原古道(呼应 13146 迎雪而行) T1 = EMPTY + """ 【画面】风雪雪原古道:一条被薄雪覆盖的古道笔直伸向画面深处的地平线,道旁枯木稀疏、山石半埋;风雪从画面左上方横扫而过,雪幕层层叠叠如白纱,远山与冷青晨雾若隐若现;一缕金色天光从云缝漏下照亮古道中段;冷青阴影+暖金高光,苍茫、孤高、千里独行,空无一人。""" + QUALITY # T2 关前校场(呼应关前亮相) T2 = EMPTY + """ 【画面】汉代关隘前校场:巨大夯土关墙占据画面右侧,墙体巍峨砖缝清晰;关前是开阔平整的校场空地,薄雪覆着车辙纹路;清晨金光从画面左上方斜切,把关墙巨影拉过整个校场,体积光中雪尘缓浮;冷青阴影+暖金高光,宏大、肃杀、蓄势,空无一人。""" + QUALITY # T3 烽火战场(呼应冲杀鏖战) T3 = EMPTY + """ 【画面】黄昏烽火战场:开阔泥雪战场,断矛与残盾成排斜插成兵器林,两三处余烬残烟贴地滚动;残阳如血把天际烧成金红,远处夯土残墙与孤烽烟台只剩剪影;冷青阴影+血红暮光,宏大、鏖战方歇、悲怆,空无一人、无尸无血。""" + QUALITY # T4 暮色河岸(呼应乱世苍生/收束) T4 = EMPTY + """ 【画面】暮色大河河岸:一条大江自画面左侧向右前方流去,江面如镜倒映血色晚霞;近岸泥滩上一条被踏平的土路伸向远方,芦苇枯草在晚风中伏倒成浪;对岸远山如黛、暮霭沉沉,一轮孤日沉向地平线;暖金暮光+冷青暮霭,苍茫、东流不返、收束感,空无一人。""" + QUALITY def submit(key, prompt, refs): payload = { "client_namespace": "lubu_pv_scene", "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_t1338_scene_snowroad_20261028_v2", T1, [LUBU, HORSE]) submit("lubu_t1338_scene_schoolyard_20261028_v2", T2, [LUBU, HORSE]) submit("lubu_t1338_scene_battlefield_20261028_v2", T3, [LUBU, HORSE]) submit("lubu_t1338_scene_riverside_20261028_v2", T4, [LUBU, HORSE])