JuMP's stock copy_model(::GenericModel) does its work by asking MOI to clone the backend (MOI.copy_to). That works because a regular Model is a thin wrapper over an MOI backend.
InfiniteModel is structured differently: variables, parameters, constraints, derivatives, and measures are stored in InfiniteOpt-owned CleverDict registries directly on the model struct. The MOI backend (TranscriptionBackend) is empty until you call optimize!, at which point it gets populated by transcribing the infinite-dimensional structures down to a finite MOI model. So MOI.copy_to has nothing to copy for an unsolved InfiniteModel.
JuMP's stock copy_model(::GenericModel) does its work by asking MOI to clone the backend (MOI.copy_to). That works because a regular Model is a thin wrapper over an MOI backend.
InfiniteModel is structured differently: variables, parameters, constraints, derivatives, and measures are stored in InfiniteOpt-owned CleverDict registries directly on the model struct. The MOI backend (TranscriptionBackend) is empty until you call optimize!, at which point it gets populated by transcribing the infinite-dimensional structures down to a finite MOI model. So MOI.copy_to has nothing to copy for an unsolved InfiniteModel.