Allow Player controlled by NavMeshAgent to walk

I have a Player that I control using the thumbstick (or z/w/s/d), and I would allow this player to have walk and run.

Now, My current code is the following for the movement :

        public Vector3 direction =;         public float decelerationTime = 0.2f;         private float decelerationTimer = 0;         private Vector3 decelerationFrom =;              private void Move()         {             if (direction.magnitude > 0.1f)             {                 agent.isStopped = false;                 decelerationTimer = 0;                 decelerationFrom = agent.velocity;                  float targetAngle = Mathf.Atan2(direction.x, direction.z) * Mathf.Rad2Deg + cam.eulerAngles.y;                 float angle = Mathf.SmoothDampAngle(transform.eulerAngles.y, targetAngle, ref turnSmoothVelocity, 0.1f);                 transform.rotation = Quaternion.Euler(0f, angle, 0f);                 Vector3 moveDir = Quaternion.Euler(0f, targetAngle, 0f) * Vector3.forward;                    agent.SetDestination(transform.position + moveDir.normalized * agent.speed * Time.deltaTime);                              } else {                 decelerationTimer += Time.deltaTime;                 agent.velocity = Vector3.Lerp(decelerationFrom,, decelerationTimer / decelerationTime);                 if (agent.velocity.magnitude == 0)                 {                     agent.isStopped = true;                     agent.velocity =;                 }             }             animator.SetFloat("forwardSpeed", agent.velocity.magnitude);         }     } 

This allow me to move in any direction according to the NavMesh, set the animation speed, and have a small deceleration in order to not cut the animation when stop moving.

The problem I face is I do not know how to make my player be able to walk (and not run at max speed all the time)

direction is a not normalized vector related to the thumbstick so 0<x<1 and 0<y<1.

How do I move slower based on those axis ? do I have to manually set the velocity ?

I tried adding agent.velocity = moveDir.normalized * agent.speed * direction.magnitude; but the result is pretty bad (the velocity seems to jump back and forward and it glitch the animation)