Why not lift it into the type domain right away, and do away with named tuples?
abstract type GenVar
gen(tup::NTuple{N, GenVar}, m, s, a) where N = ntuple(i->gen(tup[i], m, s, a), N)
#Implementors must do stuff like
struct MyGenvar <: GenVar end
gen(::MyGenvar, x::SomeModel, s, a) = ...
Then users will need to call things like x, y, z = gen((X(), Y(), Z()), m, s, a)
.
That also avoids name-clashes if two downstream packages define genvars with the same name.