JuMP v1.15 released a rewrite of the nonlinear interface that intended to fix the many issues related to the @NL interface: ANN: JuMP v1.15 is released
See the new docs:
If your functions support tracing, you may be able to do:
@constraint(model, [k in 1:num_cnsts], gn[k](x...) <= 0)
otherwise, do:
for k in 1:num_cnsts
op_g = add_nonlinear_operator(model, num_vars, gn[k]; name = Symbol("g$k"))
@constraint(model, op_g(x...) <= 0)
end