Instead of directly generating Kicad, I chose to let it write "generators" in Python that output Kicad (S-Exps!) pcb and project - with mixed results - but I can generate a version with/without per-key Neopixels and customize certain parts of the board, including debug-stuff. I also _think_ this makes it easier to resume working on this in new sessions but not sure. Otoh, I never actually looked at the Python (vibed...) so it's still a lot of hard-coding.
I also landed on and used KicadRoutingTools after trying FreeRouting, combined with some minimal "auto-placing" code for larger ICs and such that are placed with certain constraints. My routing runs are way slower though - on the order of minutes.
I always wanted to try atopile - that might be a good match for AI/PCB work. The only thing that really held me back was the lack of routing.