← All text IRs

AGIR

Round-trip Animation Blueprint graphs

An Animation Blueprint is a binary node graph — state machines, cached poses, blend spaces, layered blends, linked anims, transition rules — that you can normally only read by opening the Anim Graph editor and clicking through it node by node. AGIR is that same graph written out as plain text: every node, pose link, state, and transition as a compact document you can read in a diff, review in a pull request, and compile straight back into the asset. It round-trips through anim.decompile_agir and anim.compile_agir.

Why it matters

Diffable in version control

A .uasset shows up as an opaque blob in every review. Decompile the AnimBP to AGIR and a one-node change becomes a one-line diff — you see exactly which transition rule, crossfade duration, or blend mode moved. The same text lands in the asset-dump cache as agir.txt, so git log -p and grep both work on it.

Reviewable like code

State machines, cached-pose wiring, and blend graphs read top-to-bottom as text. A reviewer can reason about the graph’s structure without launching the editor or trusting a screenshot.

A format an AI can author

Field names are the engine’s own reflection CamelCase keys, not invented aliases, so an assistant generates or rewrites a graph from the same vocabulary the engine uses — then compiles it back into the asset. Full round-trip: this IR is not read-only.

Faithful and deterministic

Node GUIDs and canvas positions ride along in guid= and @(x, y) suffixes, so decompile → edit → compile preserves identity and layout. State machines, blend spaces, cached poses, layered blends, linked anims, and state aliases all survive the trip. Round-trip is logical: node colors and comments are dropped, structure and layout are kept.

A taste

A locomotion state machine decompiled straight out of the Anim Graph. Node types are their full script path; %sequence_player_0 and %state_machine_0 are block-local ids; an output line is the pose that flows out of a block.

entry anim_graph AnimGraph {
    state_machine Locomotion { @(-512, -64)
    state Idle { @(128, 0)
        %sequence_player_0 = call `/Script/AnimGraph.AnimGraphNode_SequencePlayer`(Sequence: "/App/Anim/MM_Idle.MM_Idle") @(-256, -16)
        output %sequence_player_0
    }
    state `Walk / Run` { @(384, 0)
        %blend_space_player_0 = call `/Script/AnimGraph.AnimGraphNode_BlendSpacePlayer`(BlendSpace: "/App/Anim/BS_WalkRun.BS_WalkRun") @(-256, -16)
        output %blend_space_player_0
    }
    transition Idle -> `Walk / Run` priority=1 rule=Idle_to_WalkRun crossfade_duration=0.2 blend_mode=2 logic_type=0
}
    output %state_machine_0
}

How your assistant uses it

Your assistant reads a graph out as AGIR with anim.decompile_agir, edits the one line you asked about, and compiles the edited text back into the same asset with anim.compile_agir — no manual canvas clicking.

You: Slow the Idle → Walk crossfade in ABP_Manny to 0.35s.

  call("anim.decompile_agir", {assetPath:"/App/Anim/ABP_Manny"})
    → {text:"entry anim_graph AnimGraph { ... crossfade_duration=0.2 ... }"}
  call("anim.compile_agir", {context:"/App/Anim/ABP_Manny", mode:"Replace", save:true,
        text:"entry anim_graph AnimGraph { ... crossfade_duration=0.35 ... }"})
    → {mode:"replace", assetPath:"/App/Anim/ABP_Manny", warnings:[]}

Done. The Idle → Walk crossfade is now 0.35s.
AGIR is Early Access. Compile/decompile target UAnimBlueprint graphs on UE 5.6. Round-trip coverage spans state machines, blend spaces, cached poses, layered/linked anims, custom transitions, and state aliases. Field names follow the engine’s reflection CamelCase, so decompile an example of your own asset and mirror its exact keys before authoring a graph by hand.

← Back to all text IRs