Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.hawkings.education/llms.txt

Use this file to discover all available pages before exploring further.

This is the canonical Hawkings workflow. You hand us a brief; we hand you back a course with units, lessons, learning objectives, reading material, and activities. End-to-end it takes ~3 minutes of compute. The code below shows what to call and how to pace it.

What you’ll build

By the end of this guide you’ll have:
  • A Course with a generated syllabus.
  • A Cohort with all lessons materialised.
  • AI-generated reading content for each lesson.
  • A mix of activities (quizzes, flashcards, explainers) for each lesson.
  • An assignment with an AI rubric on the final lesson.

1. Create the course

import Hawkings from "@hawkings/sdk";

const hk = new Hawkings();

const course = await hk.courses.create({
  name: "Intro to Special Relativity",
  language: "en",
  hours: 12,                          // target total student hours
  description: "An undergraduate intro course covering frames, " +
               "the postulates, time dilation, length contraction, " +
               "and mass-energy equivalence.",
});

console.log(course.id);   // crs_01HX9...
courses.create() returns immediately. The course is status: "draft" until you generate or attach a syllabus.

2. Generate the syllabus

await hk.courses.generateSyllabus(course.id, {
  brief: course.description!,
  audience: "third-year physics undergrads",
  hours: 12,
  // Optional: pin a research artefact to ground the generation
  // research_id: "res_..."
});
Wait for it to finish:
const ready = await hk.poll(
  () => hk.courses.retrieve(course.id, { expand: ["cohorts.lessons"] }),
  { until: c => c.status === "ready", interval_ms: 2000 },
);

console.log(ready.cohorts[0].lessons.map(l => l.name));
// [
//   "Reference frames and Galilean relativity",
//   "The postulates of special relativity",
//   "Time dilation",
//   "Length contraction",
//   ...
// ]
A default Cohort was created automatically. Lessons live on the cohort, not on the course — see Courses vs. Cohorts.

3. Generate reading content

For each lesson, ask the AI to write a long-form HTML reading:
const cohort = ready.cohorts[0];

await Promise.all(
  cohort.lessons.map(lesson =>
    hk.lessonContents.generate({ lesson_id: lesson.id }),
  ),
);

await hk.poll(
  () => hk.cohorts.lessonStatuses(cohort.id),
  { until: rows => rows.every(r => r.content_status === "ready") },
);
If you’d rather generate everything at once instead of per-lesson:
await hk.lessonContents.generate({ cohort_id: cohort.id });
That’s a single call, fans out internally, and is what we recommend in production.

4. Generate activities

await hk.activities.generate({
  cohort_id: cohort.id,
  count: 5,
  types: ["explain", "quiz", "flashcard"],
});

await hk.poll(
  () => hk.cohorts.lessonStatuses(cohort.id),
  { until: rows => rows.every(r => r.activities_status === "ready") },
);
Now every lesson has 5 activities.

5. Add an assignment to the final lesson

const lessons = (await hk.lessons.list({ cohort_id: cohort.id })).data;
const finalLesson = lessons.at(-1)!;

await hk.assignments.create({
  lesson_id: finalLesson.id,
  type: "essay",
  title: "Explain mass-energy equivalence in your own words",
  rubric: {
    criteria: [
      { name: "clarity", weight: 0.4 },
      { name: "physics accuracy", weight: 0.4 },
      { name: "use of sources", weight: 0.2 },
    ],
    scale: { min: 0, max: 10 },
  },
});

6. Verify

const final = await hk.courses.retrieve(course.id, {
  expand: [
    "cohorts.lessons.activities",
    "cohorts.lessons.content",
    "cohorts.lessons.assignment",
  ],
});

for (const lesson of final.cohorts[0].lessons) {
  console.log(lesson.name);
  console.log(`  content: ${lesson.content?.id ?? "—"}`);
  console.log(`  activities: ${lesson.activities.length}`);
  console.log(`  assignment: ${lesson.assignment?.title ?? "—"}`);
}
You’re done. Enrol students with cohorts.create({ student_emails }), or export to SCORM for an external LMS.

Same thing, in one go

For prototypes and demos:
const course = await hk.courses.create({
  name: "Intro to Special Relativity",
  language: "en",
  hours: 12,
});

await hk.courses.generateSyllabus(course.id, { brief: "...", hours: 12 });

const cohort = (await hk.courses.retrieve(course.id, { expand: ["cohorts"] }))
  .cohorts[0];

await hk.lessonContents.generate({ cohort_id: cohort.id });
await hk.activities.generate({ cohort_id: cohort.id, count: 5 });

await hk.poll(
  () => hk.cohorts.lessonStatuses(cohort.id),
  { until: rows => rows.every(r => r.content_status === "ready" && r.activities_status === "ready") },
);

Cost & runtime

Roughly: a 12-hour course → ~10 lessons → ~$2.50 in AI costs and ~3 minutes wall-clock on shared infrastructure. See your dashboard for exact unit prices.

What’s next

Build an AI tutor

Add a per-lesson tutor chat.

Export to SCORM

Hand the course to any LMS.

Sync students from your LMS

Bring your existing roster.

Grade an open-ended answer

Wire AI grading + human review.