DEV Community

Cover image for Personalized E-Learning Recommendation Agent.ai Based on Skills, Certification, Education, Experience Gaps πŸ§‘β€πŸ’»πŸ“š
Gerald
Gerald

Posted on β€’ Edited on

12 6 3 3 3

Personalized E-Learning Recommendation Agent.ai Based on Skills, Certification, Education, Experience Gaps πŸ§‘β€πŸ’»πŸ“š

This is a submission for the Agent.ai Challenge: Full-Stack Agent (See Details)

What I Built

I built an intelligent agent that recommends tailored learning paths based on a user's career interests matched with gaps in skills, education, certifications, technical proficiencies by integrating real-time course data from multiple online learning platforms (e.g., Coursera, Udemy).

The Problem.

I am a web developer with an explorer spirit. I like to explore new technologies, and use them to bring ideas into digital reality. πŸ§‘β€πŸ’»πŸš€

I spent countless hours trying to look for gaps in my skills and the best learning paths. Sometimes going from tutorial to another (tutorial hell) hence which wastes valuable time.

A beginner web developer came to me the other day asking me to recommend the best way to learn and share useful courses. I spend an hour preparing a good study guide together with online courses. Thanks to my agent, this process takes less than a minute.

The solution

An intelligent agent that recommends personalized learning paths and specific courses by aligning a user's career interests with their gaps in skills, education, certifications, and technical proficiencies. By integrating real-time course data from multiple online learning platforms like Coursera and Udemy, it crafts tailored learning journeys that bridge those gaps and accelerate the user's professional growth.

Demo

Try out my agent on this link or this link.

Steps

1>> Provide your key career interest. e.g. Full-stack developer, Data scientist

Provide your key career interest. e.g. Full-stack developer, Data scientist

2>> Upload your resume

Upload your resume

3>> Select the type of gaps to identify

Select the type of gaps to identify<br>

4>> Get your recommendations.

 Get your recommendations

Code

I used agent.at agent to collect the user info. i.e. career interests, resume, gaps to identify. Using an LLM model (best is Claude & GPT 4) I use the provided data to identify gaps in the format:-

{
  skill_gaps: ['javascript'],
  experience_gaps: ['python'],
};
Enter fullscreen mode Exit fullscreen mode

Using the data above, I call my lambda function (which refused to deploy on agent.ai πŸ˜”).

const UDEMY_API_URL = "https://www.udemy.com/api-2.0/courses";
const COURSERA_API_URL =
  "https://api.coursera.org/api/courses.v1?q=search&query=";
const EDX_API_URL = "https://www.edx.org/api/v1/catalog/search?q=";
const UDEMY_API_KEY = "YOUR_UDEMY_API_KEY"; // Store securely (e.g., AWS Secrets Manager)

exports.handler = async (event) => {
  try {
    const skillGaps = event.skill_gaps || [];
    const experienceGaps = event.experience_gaps || [];

    let skillCourses = await fetchCourses(skillGaps);
    let experienceCourses = await fetchCourses(experienceGaps);

    return {
      statusCode: 200,
      body: JSON.stringify({
        skill_gap_courses: skillCourses,
        experience_gap_courses: experienceCourses,
      }),
    };
  } catch (error) {
    console.error("Error fetching courses:", error);
    return {
      statusCode: 500,
      body: JSON.stringify({ error: "Failed to fetch courses" }),
    };
  }
};

const fetchUdemyCourses = async (keyword) => {
  try {
    const response = await fetch(`${UDEMY_API_URL}?search=${keyword}`, {
      headers: { Authorization: `Bearer ${UDEMY_API_KEY}` },
    });
    const data = await response.json();

    return data.results.map((course) => ({
      name: course.title,
      price: course.price,
      duration: course.hours || "Varies",
      link: `https://www.udemy.com${course.url}`,
    }));
  } catch (error) {
    console.error("Udemy fetch error:", error);
    return [];
  }
};

const fetchCourseraCourses = async (keyword) => {
  try {
    const response = await fetch(`${COURSERA_API_URL}${keyword}`);
    const data = await response.json();

    return data?.elements?.map((course) => ({
      name: course.name,
      price: "Free or Paid",
      duration: "Varies",
      link: `https://www.coursera.org/learn/${course.slug}`,
    }));
  } catch (error) {
    console.error("Coursera fetch error:", error);
    return [];
  }
};

const fetchEdxCourses = async (keyword) => {
  try {
    const response = await fetch(`${EDX_API_URL}${keyword}`);
    const data = await response.json();

    return data?.objects?.map((course) => ({
      name: course.title,
      price: course.price || "Free or Paid",
      duration: course.length || "Varies",
      link: course.marketing_url,
    }));
  } catch (error) {
    console.error("edX fetch error:", error);
    return [];
  }
};

const fetchCourses = async (keywords) => {
  let courseResults = [];

  for (const keyword of keywords) {
    const [udemyCourses, courseraCourses, edxCourses] = await Promise.all([
      fetchUdemyCourses(keyword),
      fetchCourseraCourses(keyword),
      fetchEdxCourses(keyword),
    ]);

    courseResults.push(...udemyCourses, ...courseraCourses, ...edxCourses);
  }

  return courseResults;
};
Enter fullscreen mode Exit fullscreen mode

The lambda function returns courses in the format:

{
        skill_gap_courses: [
          { name: 'Course 1', price: '10', duration: 5, link: 'https://www.udemy.com/course1' },
          { name: 'Course A', price: 'Free or Paid', duration: 'Varies', link: 'https://www.coursera.org/learn/course-a' },
          { name: 'Course X', price: 'Free', duration: '8 weeks', link: 'https://www.edx.org/course-x' },
        ],
        experience_gap_courses: [
          { name: 'Course 1', price: '10', duration: 5, link: 'https://www.udemy.com/course1' },
          { name: 'Course A', price: 'Free or Paid', duration: 'Varies', link: 'https://www.coursera.org/learn/course-a' },
          { name: 'Course X', price: 'Free', duration: '8 weeks', link: 'https://www.edx.org/course-x' },
        ]
}
Enter fullscreen mode Exit fullscreen mode

Using agent.ai output, I display the end results to the user.
Note: I'm able to generate learning recommendations using a LLM, together with the courses response.

The agent.ai configuration

Image description

Drawbacks πŸ˜”

  • I couldn't get the lambda function to deploy on agent.ai. I was getting an error
  • Haven't found udemy open api client.

Agent.ai Experience

I was amazed at how easy it is to get a personalized agent up and running with Agent.ai. One of my takers was the ability to choose from multiple LLM engines. This was very useful since an LLM could be good for something in comparison with the others.

Based on the selected career path, this agent identifies gaps in one's resume then suggests courses and study paths to achieve the missing skills. I was to leverage an AWS cloud function to query Udemy and Coursera courses APIs. Unfortunately, I couldn't find open sourced courses API and also my could function failed to deploy. Which is a challenge I faced on the Agent.ai platform.

I had a little challenge reading from uploaded files until I came across a YouTube video that suggests using "Get Data from Builder's Knowledge Base" to read files.

It worked like magic. πŸš€

Looking forward to building more complex agents.
Thanks for the read. πŸ™

Retry later

Top comments (3)

Collapse
 
guillaume_54c60fb profile image
Guillaume Blachon β€’

Amazing, any chance to see the code ? @geraldmuvengei06

Collapse
 
geraldmuvengei06 profile image
Gerald β€’

Yes sure. I can update this article to include the code

Collapse
 
geraldmuvengei06 profile image
Gerald β€’

Hi @cyrillegg I've updated this article to include the code.

Retry later
πŸ‘‹ Kindness is contagious

Please leave a ❀️ or a friendly comment on this post if you found it helpful!

Okay