In one of the updates to the bot lists of available for learning skills were added: LearnList (if you can learn skills everywhere) и LearnList2 (if you can learn skills from NPC)
The elements of these lists are objects of the TLearnItem class.

In this regard, all the bikes and crutches, written earlier for the study of skills can now be transformed around the following procedure:

procedure LearnSkills();
var i: integer;
begin
  for i:= 0 to LearnList.Count-1 do begin                    // running through the list of available skills
    if (User.Level >= LearnList(i).NeedLevel)                // if our level is suitable
    and (User.SP >= LearnList(i).SpCost) then begin          // and we have enough SP (+ other conditions can be checked)
      if Engine.LearnSkill(LearnList(i).ID) then             // learn skill
        Print('Learned: ' + LearnList(i).Name)
      else 
        Print('Could not learn: ' + LearnList(i).Name);
    end;  
  end;
end;

If we do not need to run up to the NPC, then such a function can be run for example in the stream, adding an infinite loop to it:

procedure LearnSkillsThread();
var i: integer;
begin
  while delay(999) do begin
    for i:= 0 to LearnList.Count-1 do begin                  // running through the list of available skills
      if (User.Level >= LearnList(i).NeedLevel)              // if our level is suitable
      and (User.SP >= LearnList(i).SpCost) then begin        // and we have enough SP (+ other conditions can be checked)
        if Engine.LearnSkill(LearnList(i).ID) then           // learn skill
          Print('Learned: ' + LearnList(i).Name)
        else 
          Print('Could not learn: ' + LearnList(i).Name);
      end;
    end;
  end;  
end;

begin
  Script.NewThread(@LearnSkillsThread);
  // code
end.

If you need to approach the NPC to learn skills, then add a runner to the mentor in the script, open a dialogue with it and run the same function, replacing LearnList everywhere with LearnList2.