Skip Navigation
67 comments
  • This is a really great use of LLM! Seriously great job! Once it's fully self-hostable (including the LLM model), I will absolutely find it space on the home server. Maybe using Rupeshs fastdcpu as the model and generation backend could work. I don't remember what his license is, though.

    Edit: added link.

  • @Cr4yfish nice project 🙂
    I'm a bit worried about the AI part, though, as you'd want an app whose main purpose is "learning" to guarantee, if not the reliability of the material (since anyone can contribute), at least the reliability of the course generation process that it proposes.
    As far as I know, this is not possible with current generative AI tools, so what's your plan to make sure hallucinations do not creep in?

    • Thanks. My general strategy regarding GenAI and reducing the amount of hallucinations is by not giving it the task to make stuff up, but to just work on existing text - that's why I'm not allowing users to create content without source material.

      However, LLMs will be LLMs and I've been testing it out a lot and found already multiple hallucinations. I built in a reporting system, although only reporting stuff works right now, not viewing reported questions.

      That's my short term plan to get a good content quality, at least. I also want to move away from Vercel AI & Gemini to a Langchain Agent system or Graph maybe, which will increase the output Quality.

      Maybe in some parallel Universe this really takes off and many people work on high quality Courses together...

  • Can it be used offline?

    • The UI mostly works offline once loaded in due to aggressive caching. Downloading Course Content was on the initial Roadmap but I removed it since I wasn't sure if anyone would like the feature.

      Syncing stuff is a real pain in the ass but I'll implement it if at least a couple people want it.

      • An offline mode would definitely be something I would want, tho it isn't high priority.

      • I don't know how much of a subset I am, but I still use dictionary softwares from Windows 95~2000 era and Android softwares on a completely offline and vanilla VM, partly due to internet randomly going bad, and partly because I am neurotic about digital contents vanishing once support ends.

  • How does the level creation from a pdf work and does it support languages other than English?

    • I use Gemini, which supports PDF File uploads, combined with structured outputs to generate Course Sections, Levels & Question JSON.

      When you upload a PDF, it first gets uploaded to a S3 Database directly from the Browser, which then sends the Filename and other data to the Server. The Server then downloads that Document from the S3 and sends it to Gemini, which then streams JSON back to the Browser. After that, the PDF is permanently deleted from the S3.

      Data Privacy wise, I wouldn't upload anything sensitive since idk what Google does with PDFs uploaded to Gemini.

      The Prompts are in English, so the output language is English as well. However, I actually only tested it with German Lecture PDFs myself.

      So, yes, it probably works with any language that Gemini supports.

      Here is the Source Code for the core function for this feature:

       js
          
      export async function createLevelFromDocument(
          { docName, apiKey, numLevels, courseSectionTitle, courseSectionDescription }: 
          { docName: string, apiKey: string, numLevels: number, courseSectionTitle: string, courseSectionDescription: string }) 
          {
          
          const hasCourseSection = courseSectionTitle.length > 0 && courseSectionDescription.length > 0;
      
          // Step 1: Download the PDF and get a buffer from it
          const blob = await downloadObject({ filename: docName, path: "/", bucketName: "documents" });
          const arrayBuffer = await blob.arrayBuffer();
          
          // Step 2: call the model and pass the PDF
          //const openai = createOpenAI({ apiKey: apiKey });
          const gooogle = createGoogleGenerativeAI({ apiKey: apiKey });
      
          const courseSectionsPrompt = createLevelPrompt({ hasCourseSection, title: courseSectionTitle, description: courseSectionDescription });
          
          const isPDF = docName.endsWith(".pdf");
      
          const content: UserContent = [];
      
          if(isPDF) {
              content.push(pdfUserMessage(numLevels, courseSectionsPrompt) as any);
              content.push(pdfAttatchment(arrayBuffer) as any);
          } else {
              const html = await blob.text();
              content.push(htmlUserMessage(numLevels, courseSectionsPrompt, html) as any);
          }
      
          const result = await streamObject({ 
              model: gooogle("gemini-1.5-flash"),
              schema: multipleLevelSchema,
              messages: [
                  {
                      role: "user",
                      content: content
                  }
              ]
          })
          
      
          return result;
      }
      
        
  • Cool concept! Good luck with it

    Hope you can get around to let switch models, and maybe let people use open-source/open data models?

    I've also heard about Vercel AI SDK that let's you use different models with a common SDK so that it doesn't rely on implementation

67 comments