import json
import os

raw_data = """
适用方向
Controlnet 类型
模型名称
基础算法类型
模型版本UUID
线稿类

Canny（硬边缘）
control_v11p_sd15_canny
基础算法 1.5
7d917ec7e55c5805db737d3b493c91ce

t2iadapter_canny_sd14v1
基础算法 1.5
a2c41c4e97944f3aa71f913bdc45b1ca

t2iadapter_canny_sd15v2
基础算法 1.5
c04144bcf017232483181cd8607097c2

diffusers_xl_canny_full
基础算法 XL
56de5edadb6f2891aff05ff078dc0470

diffusers_xl_canny_mid
基础算法 XL
efb97e9d8c237573298c3a5a7869b89c

diffusers_xl_canny_small
基础算法 XL
dccde738064e9748f93b48ec5868968e

kohya_controllllite_xl_canny
基础算法 XL
5242e3d18cc18689bd8af11dd2d675c1

kohya_controllllite_xl_canny_anime
基础算法 XL
4f3e1cfe79f87496ec69a37826c3afeb

sai_xl_canny_128lora
基础算法 XL
63c7f2c6c354336513831aa522d7e0f4

sai_xl_canny_256lora
基础算法 XL
5bf551f53651764cad56363e17900d87

t2i-adapter_diffusers_xl_canny
基础算法 XL
618390ab2957a422612cb2ba92a2788f

t2i-adapter_xl_canny
基础算法 XL
7cd56501c336c1edba78430355c9d081

xinsir_controlnet-canny-sdxl_V2
基础算法 XL
b6806516962f4e1599a93ac4483c3d23

XLabs-flux-canny-controlnet_v3
基础算法 F.1
017997cd6ba44c4dbe8f60e0a26cd0df

InstantX-FLUX.1-dev-Controlnet-Union-Pro
基础算法 F.1
13c1e1b96ba64f9cbb2b54f89b5fe873

InstantX-Qwen-Image-Controlnet-Union
Qwen Image
5b5f21d2b80445598db19e924bd3a409

SoftEdge（软边缘）

control_v11p_sd15_softedge
基础算法 1.5
0929722d9047ec6498a50ff5d1081629

sargezt_xl_softedge
基础算法 XL
dda1a0c480bfab9833d9d9a1e4a71fff

controlnet-sd-xl-1.0-softedge-dexined
基础算法 XL
37bddde3d45c11ee9b5e00163e365853

mistoLine_softedge_sdxl_fp16
基础算法 XL
4f6726be104a432f8039b018c92ed4bf

mistoLine_rank256
基础算法 XL
83286d0e66a845c58f7d23442f9dedf9

XLabs-flux-hed-controlnet_v3
基础算法 F.1
6c4d620df3644514903b8189735c6ae9

F.1_mistoline_dev_v1
基础算法 F.1
3e6860a3b9444f25ae07d9c1b5d1ba9e

InstantX-FLUX.1-dev-Controlnet-Union-Pro
基础算法 F.1
13c1e1b96ba64f9cbb2b54f89b5fe873

InstantX-Qwen-Image-Controlnet-Union
Qwen Image
5b5f21d2b80445598db19e924bd3a409

MLSD（直线）
control_v11p_sd15_mlsd
基础算法 1.5
7168cece6a0d491375aa1753ff3bdc21

Scribble/Sketch（涂鸦/草图）
control_v11p_sd15_scribble
基础算法 1.5
fe57911f7ba1b84eb27f1e1ecead3367

kohya_controllllite_xl_scribble_anime
基础算法 XL
4a399a87f1ffbc26d065a38765d30d24

xinsir_controlnet-scribble-sdxl-1.0
基础算法 XL
888cf8985bd6442cba1f2d975b6eb022

xinsir_anime_painter
基础算法 XL
f936bf22cb8e4dcfa6b0f3b96cdd8eb7

InstantX-Qwen-Image-Controlnet-Union
Qwen Image
5b5f21d2b80445598db19e924bd3a409

Lineart（线稿）

control_v11p_sd15_lineart
基础算法 1.5
b06dfbd1a61c35e933d9f8caa8a0e031

control_v11p_sd15s2_lineart_anime
基础算法 1.5
c263e039c57b8a958ee0a936039af654

t2i-adapter_diffusers_xl_lineart
基础算法 XL
a0f01da42bf48b0ba02c86b6c26b5699

InstantX-Qwen-Image-Controlnet-Union
Qwen Image
5b5f21d2b80445598db19e924bd3a409
空间关系类

Depth（深度图）

control_v11f1p_sd15_depth
基础算法 1.5
cf63d214734760dcdc108b1bd094921b

t2iadapter_depth_sd15v2
基础算法 1.5
f08a4a889b56d4099e8a947503cabc14

t2iadapter_depth_sd14v1
基础算法 1.5
8b74bf9ea84f592c069b523d9bef9dab

t2iadapter_zoedepth_sd15v1
基础算法 1.5
fc8b79f97eeceda388b43df12509c311

control_sd15_inpaint_depth_hand_fp16
基础算法 1.5
3497061cd45c11ee9b5e00163e365853

t2i-adapter_diffusers_xl_depth_zoe
基础算法 XL
a35993a2d1cde4a6c800364a68731c67

sai_xl_depth_128lora
基础算法 XL
3156f3428afc7122c66b2b950f09d4cd

t2i-adapter_diffusers_xl_depth_midas
基础算法 XL
c22ec6a7a24eed6b91889ae1a1e94b2e

diffusers_xl_depth_mid
基础算法 XL
740d6d428e70d4b40888efa4d9eb642a

xinsir_controlnet_depth_sdxl_1.0
基础算法 XL
6349e9dae8814084bd9c1585d335c24c

sai_xl_depth_256lora
基础算法 XL
08d0fbb72d7fab601218df26978a46e0

sargezt_xl_depth
基础算法 XL
feb9ee5779bf2eb3fdd669f2e3e6b1aa

sargezt_xl_depth_zeed
基础算法 XL
4216d4b49a6b559d76d181908f866eb8

kohya_controllllite_xl_depth_anime
基础算法 XL
dea707d52e3a8f243da5579579cb3a3d

kohya_controllllite_xl_depth
基础算法 XL
693d7182db5293c0087524580111fd96

sargezt_xl_depth_faid_vidit
基础算法 XL
1c6d32d0fb004cf1becc2b526fd83690

diffusers_xl_depth_small
基础算法 XL
6a786af31a13776100e9c6a90f99aebf

diffusers_xl_depth_full
基础算法 XL
04dcab4b18c7b821e96660d6c19de50b

XLabs-flux-depth-controlnet_v3
基础算法 F.1
0cc4e6b8206b44cdab51e30fb8b9c328

InstantX-FLUX.1-dev-Controlnet-Union-Pro
基础算法 F.1
13c1e1b96ba64f9cbb2b54f89b5fe873

Flux.1-dev-Controlnet-Depth
基础算法 F.1
64dd7a6c714f4512a4500f6a01b016b7

InstantX-Qwen-Image-Controlnet-Union
Qwen Image
5b5f21d2b80445598db19e924bd3a409

Segment（语义分割）
control_v11p_sd15_seg
基础算法 1.5
94571f4bb5136464afc1540a92ae3ee8

Normal（正态）
control_v11p_sd15_normalbae
基础算法 1.5
9a85fdca18a8b58b2fb2ff13ab339be4

Flux.1-dev-Controlnet-Surface-Normal
基础算法 F.1
e51fdccdf3b8417aab246bde40b5f360
姿态类

OpenPose（姿态）

control_v11p_sd15_openpose
基础算法 1.5
b46dd34ef9c2fe189446599d62516cbf

t2iadapter_openpose_sd14v1
基础算法 1.5
5a8b19a8809e00be4e17517e8ab174ad

control_v11p_sd15_densepose_fp16
基础算法 1.5
3b4e0830d45c11ee9b5e00163e365853

control_sd15_animal_openpose_fp16
基础算法 1.5
329f0073d45c11ee9b5e00163e365853

control_v2p_sd15_mediapipe_face
基础算法 1.5
73de0752a7a8431ba21637cda6723c95

kohya_controllllite_xl_openpose_anime_v2
基础算法 XL
4cbbd2483088ef5f0d41bfef0d7141fb

kohya_controllllite_xl_openpose_anime
基础算法 XL
abb5d55cf94c504f6f8c64abc0b1483f

thibaud_xl_openpose_256lora
基础算法 XL
4dd1f4df2a9d3a9db8aeaa9480196d02

t2i-adapter_xl_openpose
基础算法 XL
9deac5a5c60abfd03261bd174ddba47d

t2i-adapter_diffusers_xl_openpose
基础算法 XL
9cd43e1856040c2436f00802d5b54ee5

thibaud_xl_openpose
基础算法 XL
2fe4f992a81c5ccbdf8e9851c8c96ff2

controlnet-densepose-sdxl
基础算法 XL
3ae77dfdd45c11ee9b5e00163e365853

xinsir_controlnet-openpose-sdxl-1.0
基础算法 XL
23ef8ab803d64288afdb7106b8967a55

F.1-ControlNet-Pose-V1
基础算法 F.1
7c6d889cb9c04b78858d8fece80f9f85

InstantX-Qwen-Image-Controlnet-Union
Qwen Image
5b5f21d2b80445598db19e924bd3a409
画面参考
Tile/Blur（分块/模糊）
control_v11f1e_sd15_tile
基础算法 1.5
37e42c6bdb6fab4c24a662100f20f722

kohya_controllllite_xl_blur_anime
基础算法 XL
46a34a643f6855e9b3861515712df5d9

xinsir_controlnet_tile_sdxl_1.0
基础算法 XL
0f47ef6d4f4b40afab8b290c98baac0e

kohya_controllllite_xl_blur_anime_beta
基础算法 XL
44199bb6dcf4f65e09a4e5e57ebdf9b4

kohya_controllllite_xl_blur
基础算法 XL
aac5fe593565f0673673731d54ecfab8

TTPLanet_SDXL_Controlnet_Tile_Realistic_v1
基础算法 XL
13bfaf39f9214c658507a92cd15fd02d

TTPLanet_SDXL_Controlnet_Tile_Realistic_v2
基础算法 XL
163d505651a64d6bac9a907b213dc8b0

Flux.1-dev-Controlnet-Upscaler
基础算法 F.1
a696b5bdadc740119fd76505b33d6898

Reference（参考）
None
基础算法 1.5
/
风格迁移
IP-Adapter

ip-adapter_sd15
基础算法 1.5
18801062fe4289dd0a984e69de9f9e7c

ip-adapter_sd15_plus
基础算法 1.5
ad4bd9b4b05c4ac8faf7f81d9fdcadc8

ip-adapter_sd15_light
基础算法 1.5
3a1ddfd0d45c11ee9b5e00163e365853

ip-adapter_sd15_vit-G
基础算法 1.5
36f3d2a0d45c11ee9b5e00163e365853

ip-adapter_xl
基础算法 XL
8ea2538fdd7dcdea52b2da6b5151f875

ip-adapter-plus_sdxl_vit-h
基础算法 XL
38ee73f1d45c11ee9b5e00163e365853

ip-adapter_sdxl_vit-h
基础算法 XL
375866e3d45c11ee9b5e00163e365853

InstantX-F.1-dev-IP-Adapter
基础算法 F.1
c6ed70879cf011ef96d600163e37ec70

F.1-redux-dev
基础算法 F.1
8ddf6f3ba8a111efbb1700163e031cf1

T2I-Adapter
t2iadapter_canny_sd15v2
基础算法 1.5
c04144bcf017232483181cd8607097c2

t2iadapter_depth_sd15v2
基础算法 1.5
f08a4a889b56d4099e8a947503cabc14

t2iadapter_canny_sd14v1
基础算法 1.5
a2c41c4e97944f3aa71f913bdc45b1ca

t2iadapter_color_sd14v1
基础算法 1.5
8e581a4e7c986950d71f1102accad5d0

t2iadapter_depth_sd14v1
基础算法 1.5
8b74bf9ea84f592c069b523d9bef9dab

t2iadapter_keypose_sd14v1
基础算法 1.5
181d8d213381458cb6e326760637d4b4

t2iadapter_openpose_sd14v1
基础算法 1.5
5a8b19a8809e00be4e17517e8ab174ad

t2iadapter_seg_sd14v1
基础算法 1.5
3c680cc8edfbc4479423549e01f21897

t2iadapter_sketch_sd14v1
基础算法 1.5
0d19dd02091ec2d01f3cdd99a4f4b442

t2iadapter_sketch_sd15v2
基础算法 1.5
bd6c5dbb73c2c2e538850c23ab2dcbf5

t2iadapter_style_sd14v1
基础算法 1.5
e33777a1f374eccd9464623c56a82c91

t2iadapter_zoedepth_sd15v1
基础算法 1.5
fc8b79f97eeceda388b43df12509c311

Shuffle (随机洗牌)
control_v11e_sd15_shuffle
基础算法 1.5
9efba1cc2d469bf4be8fc135689bc8a0
上色
Recolor（重上色）
ioclab_sd15_recolor
基础算法 1.5
e0db5b9e227eac932c71498cf7e03a78

sai_xl_recolor_128lora
基础算法 XL
af92235f1de682ceac136c06450c9a51

sai_xl_recolor_256lora
基础算法 XL
03051a3606b4974ec02fc55b079757e7
局部重绘

Inpaint（局部重绘）

control_v11p_sd15_inpaint
基础算法 1.5
ebeada0aa92959b4e905ab6980d5d203

segmentation_mask_brushnet_ckpt
基础算法 1.5
14aa553bf6534a419a9a465eba900f3a

random_mask_brushnet_cpkt
基础算法 1.5
de44488f84a74e02a1fac604d790698c

segmentation_mask_brushnet_ckpt_sdxl_v1
基础算法 XL
a311363995dd4f2fa42ee3fc9582d920

random_mask_brushnet_ckpt_sdxl
基础算法 XL
3161fc68c59847b0ad826a9fb18c857f

F.1-dev-Controlnet-Inpainting-Alpha
基础算法 F.1
012d2f780c0b44dba829bb223207e608

F.1-dev-Controlnet-Inpainting-Beta
基础算法 F.1
31df01fc271d484ca4d496179d69a665

InstantX-Qwen-Image-ControlNet-Inpainting
Qwen Image
2228ab9234a34aa5abf77caa907c0de1
换脸
IP-Adapter

ip-adapter_face_id
基础算法 1.5
368e6a37d45c11ee9b5e00163e365853

ip-adapter-faceid-portrait_sd15
基础算法 1.5
330504bcd45c11ee9b5e00163e365853

ip-adapter-faceid-plusv2_sd15
基础算法 1.5
34fb8ef6d45c11ee9b5e00163e365853

ip-adapter-faceid-plus_sd15
基础算法 1.5
362a215ad45c11ee9b5e00163e365853

ip-adapter-faceid-portrait-v11_sd15
基础算法 1.5
35c50016d45c11ee9b5e00163e365853

ip-adapter-faceid_sdxl
基础算法 XL
38879e1ad45c11ee9b5e00163e365853

ip-adapter-faceid-plusv2_sdxl
基础算法 XL
3953f672d45c11ee9b5e00163e365853

ip-adapter-plus-face_sdxl_vit-h
基础算法 XL
336955e4d45c11ee9b5e00163e365853

Instant ID
ip-adapter_instant_id_sdxl
基础算法 XL
3a8267c7d45c11ee9b5e00163e365853

control_instant_id_sdxl
基础算法 XL
3560664ad45c11ee9b5e00163e365853

puLID
pulid_flux_v0.9.1
基础算法 F.1
405836d1ae2646b4ba2716ed6bd5453a
其他
光影
control_v1u_sd15_illumination
基础算法 1.5
3109072a5cf6403faba6162003b8f483

control_v1p_sd15_brightness
基础算法 1.5
39b8eac0d45c11ee9b5e00163e365853

二维码
control_v1p_sd15_qrcode_monster
基础算法 1.5
1fa6070c35626e760b1473926852cbbc
"""

lines = [l.strip() for l in raw_data.split('\n') if l.strip()]

models_by_category = {}
current_category = "General"
current_type = "Misc"

i = 0
while i < len(lines):
    line = lines[i]
    if line in ["适用方向", "Controlnet 类型", "模型名称", "基础算法类型", "模型版本UUID"]:
        i += 1
        continue
    
    # Check if this is a top level category (usually ends with 类 or specific words)
    if line.endswith("类") or line in ["风格迁移", "上色", "局部重绘", "换脸", "其他", "光影", "二维码", "画面参考"]:
        current_category = line
        if current_category not in models_by_category:
            models_by_category[current_category] = {}
        i += 1
        continue
        
    # Check if this is a sub-type (usually Chinese translation in parens or standard names like IP-Adapter)
    if "（" in line or line in ["IP-Adapter", "Instant ID", "puLID", "T2I-Adapter", "Shuffle (随机洗牌)"]:
        current_type = line
        if current_category not in models_by_category:
             models_by_category[current_category] = {}
        if current_type not in models_by_category[current_category]:
            models_by_category[current_category][current_type] = []
        i += 1
        continue
        
    # Model block: 3 lines
    if i + 2 < len(lines):
        model_name = lines[i]
        algo = lines[i+1]
        uuid = lines[i+2]
        
        # Verify it's actually an algo block
        if algo.startswith("基础算法") or algo == "Qwen Image" or uuid == "/":
            if current_category not in models_by_category:
                models_by_category[current_category] = {}
            if current_type not in models_by_category[current_category]:
                models_by_category[current_category][current_type] = []
                
            models_by_category[current_category][current_type].append({
                "model_name": model_name,
                "base_algorithm": algo,
                "uuid": uuid
            })
            i += 3
            continue
            
    # Default case
    i += 1
    
# Generate Markdown
md_lines = ["# LiblibAI ControlNet Models Mapping\\n"]

for category, types in models_by_category.items():
    md_lines.append(f"## {category}\\n")
    for t, models in types.items():
        md_lines.append(f"### {t}")
        md_lines.append("| Model Name | Base Algorithm | UUID |")
        md_lines.append("| --- | --- | --- |")
        for m in models:
            md_lines.append(f"| {m['model_name']} | {m['base_algorithm']} | `{m['uuid']}` |")
        md_lines.append("\\n")

md_content = "\\n".join(md_lines)

# Write outputs
os.makedirs("/root/Tool_Agent/data", exist_ok=True)

with open("/root/Tool_Agent/data/liblibai_controlnet_models.md", "w", encoding="utf-8") as f:
    f.write(md_content)
    
with open("/root/Tool_Agent/data/liblibai_controlnet_models.json", "w", encoding="utf-8") as f:
    json.dump(models_by_category, f, indent=4, ensure_ascii=False)
