SageMath can do Gram-Schmidt with some limitations.
For reasons I do not quite understand, SAGEMath can't output ortho-normal sets of vectors. So you can either manually do it, type out the code to have each vector divided by it's norm.
To do this, you need to create a matrix with the vectors \( \vec{v}_i\) put into the rows.