Lingara Lingara Documentatie Gidsen API Bibliotheken Apps Bouwen Webapp
Taal: Nederlands

Een lesplan maken

API-versie 2026-10-affable-towhee

post https://api.getlingara.com/v1/lesson-plans

Begint met het genereren van een lesplan en streamt de voortgang. started noemt het plan zodra het bestaat, zodat een verbroken verbinding opnieuw kan verbinden met GET /v1/lesson-plans/{id}/stream. De stream eindigt met result of error. Een plan uit de bibliotheek komt binnen als één enkel result.

Bevoegdheden lesson_plans:write

Parameters

Lingara-Versionheaderstringoptioneel
De API-versie waaronder dit verzoek wordt beantwoord. Zonder deze krijgt een toegangstoken de versie waaraan zijn client is gekoppeld, en een verzoek zonder token de huidige versie. De versie die nog in ontwikkeling is, bereik je alleen door die hier te noemen. Een onbekende versie geeft 400 met code api_version_unknown. GET /v1/versions toont de versies.

Request-body application/json

contextstringverplicht
source_langstringverplicht
target_langstringverplicht
levelintegerverplicht

Antwoorden

200 De voortgang van het plan, daarna het plan

Stream-events text/event-stream

Stuurt elke 15 seconden een keepalive-commentaar.

started PlanStarted
plan_idstringverplicht
phase PlanPhase
phasestringverplicht
attemptintegerverplicht
result PlanResult Beëindigt de stream
planLessonPlanverplicht
idstringverplicht
statusPlanStatusverplicht
titlestring | nulloptioneel
source_langstringverplicht
target_langstringverplicht
levelintegerverplicht
created_atstringverplicht
completed_atstring | nulloptioneel
ai_generatedbooleanverplicht
contentLessonPlanContent | nulloptioneel
introductionstring | nulloptioneel
learning_objectivesarray of stringverplicht
vocabularyarray of PlanWordverplicht
wordstringverplicht
pronunciationstring | nulloptioneel
translationstringverplicht
setsarray of PlanSetverplicht
numberintegerverplicht
contextstring | nulloptioneel
questionsarray of PlanQuestionverplicht
typestringverplicht
promptstringverplicht
optionsarray of string | nulloptioneel
answerstringverplicht
explanationstringverplicht
hintstring | nulloptioneel
error StreamError Beëindigt de stream

Komt binnen het 200-antwoord aan. De statusregel is al verzonden, dus een fout nadat de stream is geopend wordt als deze gebeurtenis gemeld.

codestringverplicht
messagestringverplicht
plan_idstring | nulloptioneel

Fouten

402application/json
De aanroep van een client met verbruiksafrekening is geweigerd voordat die iets heeft uitgegeven. spend_cap_reached: de client of zijn account heeft zijn maandelijkse uitgavenlimiet bereikt; verhoog de limiet op de pagina Integraties. metered_billing_inactive: verbruiksafrekening is niet actief voor dit account; stel die in of werk de betaalmethode bij op de pagina Integraties.
410application/json
De API-versie waaronder dit verzoek wordt beantwoord, is stopgezet. Stuur een ondersteunde versie mee in Lingara-Version, of koppel de client aan een andere versie.
4XXapplication/json
Het verzoek is geweigerd. code geeft de reden aan en error beschrijft die in woorden.
503application/json · text/plain
De dienst is tijdelijk niet beschikbaar; probeer het opnieuw na het aantal seconden in Retry-After. Tijdens onderhoud is de body platte tekst in plaats van de foutenvelop.
5XXapplication/json
Het verzoek is geweigerd. code geeft de reden aan en error beschrijft die in woorden.
codestringverplicht

Waarom het verzoek is geweigerd, als stabiele code om op te vertakken: bijvoorbeeld insufficient_scope (403), rate_limited (429) en, voor een client met verbruiksafrekening, spend_cap_reached (402) en metered_billing_inactive (402).

errorstringverplicht

Voorbeeld

Taal van het codevoorbeeld

curl

curl -N -X POST "https://api.getlingara.com/v1/lesson-plans" \
  -H "Authorization: Bearer $LINGARA_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"context":"Ordering food at a night market","source_lang":"en","target_lang":"zh","level":2}'

TypeScript

const stream = client.createLessonPlan({
  context: "ordering at a night market",
  source_lang: "en",
  target_lang: "zh",
  level: 2,
});
for await (const ev of stream) {
  if (ev.event === "started") console.log("plan", ev.data.plan_id);
  if (ev.event === "phase") console.log("working:", ev.data.phase);
  if (ev.event === "result") console.log(ev.data.plan.title);
}

Rust

use lingara::models::{CreateLessonPlanEvent, LessonPlanCreateRequest};

let request = LessonPlanCreateRequest {
    context: "ordering at a night market".into(),
    source_lang: "en".into(),
    target_lang: "zh".into(),
    level: 2,
};
let mut stream = client.create_lesson_plan(&request).await?;
while let Some(event) = stream.next().await {
    match event? {
        CreateLessonPlanEvent::Started(started) => println!("plan {}", started.plan_id),
        CreateLessonPlanEvent::Phase(phase) => println!("working: {}", phase.phase),
        CreateLessonPlanEvent::Result(result) => println!("{}", result.plan.title.unwrap_or_default()),
        _ => {}
    }
}

Go

s, err := client.CreateLessonPlan(ctx, lingara.LessonPlanCreateRequest{
	Context:    "ordering at a night market",
	SourceLang: "en",
	TargetLang: "zh",
	Level:      2,
})
if err != nil {
	return err
}
defer s.Close()
for ev, err := range s.Events() {
	if err != nil {
		return err
	}
	switch e := ev.(type) {
	case lingara.CreateLessonPlanEventStarted:
		fmt.Println("plan", e.Data.PlanID)
	case lingara.CreateLessonPlanEventPhase:
		fmt.Println("working:", e.Data.Phase)
	case lingara.CreateLessonPlanEventResult:
		if e.Data.Plan.Title != nil {
			fmt.Println(*e.Data.Plan.Title)
		}
	}
}

Java

import com.getlingara.client.model.CreateLessonPlanEvent;
import com.getlingara.client.model.LessonPlanCreateRequest;

LessonPlanCreateRequest request =
    new LessonPlanCreateRequest()
        .context("Ordering at a night market")
        .level(2)
        .sourceLang("en")
        .targetLang("zh");
try (EventStream<CreateLessonPlanEvent> stream = client.createLessonPlan(request)) {
  for (CreateLessonPlanEvent event : stream) {
    if (event instanceof CreateLessonPlanEvent.Started started) {
      // Keep the id: streamLessonPlan rejoins a generation that was cut off.
      System.out.println("plan " + started.data().getPlanId());
    } else if (event instanceof CreateLessonPlanEvent.Phase phase) {
      System.out.println("phase " + phase.data().getPhase());
    } else if (event instanceof CreateLessonPlanEvent.Result result) {
      System.out.println(result.data().getPlan().getTitle());
    }
  }
}

Kotlin

import com.getlingara.kotlin.LingaraClient
import com.getlingara.kotlin.model.CreateLessonPlanEvent
import com.getlingara.kotlin.model.LessonPlanCreateRequest

val request =
    LessonPlanCreateRequest(context = "Ordering at a night market", sourceLang = "en", targetLang = "zh", level = 2)
client.createLessonPlan(request).use { stream ->
    stream.collect { event ->
        when (event) {
            // Keep the id: streamLessonPlan rejoins a generation that was cut off.
            is CreateLessonPlanEvent.Started -> println("plan ${event.data.planId}")
            is CreateLessonPlanEvent.Phase -> println("phase ${event.data.phase}")
            is CreateLessonPlanEvent.Result -> println(event.data.plan.title)
        }
    }
}

Ruby

client.create_lesson_plan(context: "ordering at a night market", source_lang: "en", target_lang: "zh", level: 2) do |event|
  case event
  in Lingara::CreateLessonPlanEventStarted => started then puts "plan #{started.data.plan_id}"
  in Lingara::CreateLessonPlanEventPhase => phase then puts "working: #{phase.data.phase}"
  in Lingara::CreateLessonPlanEventResult => result then puts "ready: #{result.data.plan.title}"
  else nil
  end
end

PHP

use Lingara\Model\LessonPlanCreateRequest;
use Lingara\Stream\CreateLessonPlanEvent;

$request = new LessonPlanCreateRequest([
    'context' => 'ordering at a night market',
    'source_lang' => 'en',
    'target_lang' => 'zh',
    'level' => 2,
]);
foreach ($client->createLessonPlan($request) as $event) {
    if ($event instanceof CreateLessonPlanEvent\Started) {
        echo 'plan ', $event->data->getPlanId(), "\n";
    } elseif ($event instanceof CreateLessonPlanEvent\Phase) {
        echo 'phase: ', $event->data->getPhase(), "\n";
    } elseif ($event instanceof CreateLessonPlanEvent\Result) {
        echo 'ready: ', $event->data->getPlan()->getTitle(), "\n";
    }
}

Liever een bibliotheek? Zie de sectie Bibliotheken.

Voorbeeldstream

event: started
data: {"plan_id":"3f1c2a9e-5b7d-4e21-9a0c-6d8e4f2b1a37"}

event: phase
data: {"phase":"selecting_vocabulary","attempt":1}

event: result
data: {"plan":{"id":"3f1c2a9e-5b7d-4e21-9a0c-6d8e4f2b1a37","status":"complete","title":"At the night market","source_lang":"en","target_lang":"zh","level":2,"created_at":"2026-09-23T10:00:00Z","completed_at":"2026-09-23T10:00:41Z","ai_generated":true,"content":{"introduction":"Order food and ask prices at a night market.","learning_objectives":["Ask how much something costs"],"vocabulary":[{"word":"多少钱","pronunciation":"duōshao qián","translation":"how much"}],"sets":[{"number":1,"questions":[{"type":"multiple_choice_word","prompt":"Which word asks for a price?","options":["多少钱","谢谢"],"answer":"多少钱","explanation":"多少钱 means how much money."}]}]}}}

Als een vertaling afwijkt van de Engelse referentie, is de Engelse referentie juist.