Here is what I did in python to manually supply the jacobian and hessian functions to nlpsol when using IPOPT.
w = nlp['x']
J = nlp['f']
g = nlp['g']
lam_f = casadi.SX.sym("lam_f")
lam_g = casadi.SX.sym("lam_g", g.sparsity())
param = casadi.SX.sym('param')
grad_f = casadi.Function("grad_f",[w, param],[J, casadi.gradient(J,w)])
jac_g = casadi.Function("jac_g",[w, param],[g, casadi.jacobian(g,w)])
L = lam_f*J + casadi.dot(lam_g, g)
H, j = casadi.hessian(L,w)
Htriu = casadi.triu(H)
hess_lag = casadi.Function("hess_lag", [w, param, lam_f, lam_g], [Htriu])
opts_dict = {
'grad_f': grad_f, 'jac_g':jac_g, 'hess_lag':hess_lag
}
solver = casadi.nlpsol('solver', 'ipopt', nlp, opts_dict)