Thanks to Javier Toledo for the initial script. I have added the side_mult_error multiplier and few other things.
Polyframe the @tangentu, correct @up and gen @side
//create perpendicular SIDE
v@up = {0,1,0};
v@side = cross(v@up, v@tangentu);
//correct the UP
v@up = cross(v@tangentu, v@side);
v@N = v@tangentu;
Add Curvature and then Smooth
int prevId = clamp(@ptnum-1,0,@numpt);
int nextId = clamp(@ptnum+1,0,@numpt);
vector prevPos = point(0,"P",prevId);
vector nextPos = point(0,"P",nextId);
vector prevSide = point(0,"side",prevId);
vector nextSide = point(0,"side",nextId);
float side_mult_error = chf("side_mult_error") * 0.001;
vector prevDisp = prevPos + prevSide * side_mult_error;
vector nextDisp = nextPos + nextSide * side_mult_error;
float dist = length(prevPos - nextPos);
float dispDist = length(prevDisp - nextDisp);
//ratio by distances
f@ratio = (dispDist/dist) - 1;
f@ratio *= chf("curvature_mult") * 10;
f@ratio /= side_mult_error;
f@ratio = clamp(f@ratio, -chf("curvature_clamp"), chf("curvature_clamp"));
//rotate matrix
matrix3 rot = ident();
rotate(rot, f@ratio, v@tangentu);
//apply
v@side *= rot;
v@up *= rot;