Lingara Lingara Ohjeet Oppaat API Kirjastot Sovellukset Rakenna Verkkosovellus
Kieli: Suomi

Luo tuntisuunnitelma

API-versio 2026-10-affable-towhee

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

Aloittaa tuntisuunnitelman luomisen ja suoratoistaa sen edistymisen. started nimeää suunnitelman heti, kun se on olemassa, joten katkennut yhteys voi yhdistää uudelleen osoitteella GET /v1/lesson-plans/{id}/stream. Virta päättyy result- tai error-tapahtumaan. Kirjastosta tarjoiltu suunnitelma saapuu yksittäisenä result-tapahtumana.

Oikeuslaajuudet lesson_plans:write

Parametrit

Lingara-Versionheaderstringvalinnainen
API-versio, jolla tähän pyyntöön vastataan. Ilman sitä käyttötunnus saa version, johon sen asiakas on kiinnitetty, ja pyyntö ilman tunnusta saa nykyisen version. Vielä kehitteillä olevaan versioon pääsee vain nimeämällä sen tässä. Tuntemattomaan versioon vastataan 400 koodilla api_version_unknown. GET /v1/versions luettelee versiot.

Pyynnön runko application/json

contextstringpakollinen
source_langstringpakollinen
target_langstringpakollinen
levelintegerpakollinen

Vastaukset

200 Suunnitelman edistyminen, sitten suunnitelma

Virran tapahtumat text/event-stream

Lähettää keepalive-kommentin 15 sekunnin välein.

started PlanStarted
plan_idstringpakollinen
phase PlanPhase
phasestringpakollinen
attemptintegerpakollinen
result PlanResult Päättää virran
planLessonPlanpakollinen
idstringpakollinen
statusPlanStatuspakollinen
titlestring | nullvalinnainen
source_langstringpakollinen
target_langstringpakollinen
levelintegerpakollinen
created_atstringpakollinen
completed_atstring | nullvalinnainen
ai_generatedbooleanpakollinen
contentLessonPlanContent | nullvalinnainen
introductionstring | nullvalinnainen
learning_objectivesarray of stringpakollinen
vocabularyarray of PlanWordpakollinen
wordstringpakollinen
pronunciationstring | nullvalinnainen
translationstringpakollinen
setsarray of PlanSetpakollinen
numberintegerpakollinen
contextstring | nullvalinnainen
questionsarray of PlanQuestionpakollinen
typestringpakollinen
promptstringpakollinen
optionsarray of string | nullvalinnainen
answerstringpakollinen
explanationstringpakollinen
hintstring | nullvalinnainen
error StreamError Päättää virran

Saapuu 200-vastauksen sisällä. Tilarivi on jo lähetetty, joten virran avaamisen jälkeinen virhe ilmoitetaan tänä tapahtumana.

codestringpakollinen
messagestringpakollinen
plan_idstring | nullvalinnainen

Virheet

402application/json
Käytön mukaan laskutettavan asiakkaan kutsu hylättiin ennen kuin se kulutti mitään. spend_cap_reached: asiakas tai sen tili on saavuttanut kuukausittaisen kulutusrajansa; nosta rajaa Integraatiot-sivulla. metered_billing_inactive: käytön mukainen laskutus ei ole tällä tilillä käytössä; ota se käyttöön tai päivitä maksutapa Integraatiot-sivulla.
410application/json
API-versio, jolla tähän pyyntöön vastataan, on lopetettu. Lähetä tuettu versio Lingara-Version-otsakkeessa tai kiinnitä asiakas toiseen versioon.
4XXapplication/json
Pyyntö hylättiin. code kertoo syyn, ja error kertoo sen sanoin.
503application/json · text/plain
Palvelu ei ole tilapäisesti käytettävissä; yritä uudelleen Retry-After-otsakkeen ilmoittaman sekuntimäärän jälkeen. Huoltokatkon aikana runko on pelkkää tekstiä virhekehyksen sijaan.
5XXapplication/json
Pyyntö hylättiin. code kertoo syyn, ja error kertoo sen sanoin.
codestringpakollinen

Miksi pyyntö hylättiin, pysyvänä koodina, jonka mukaan voit haarautua: esimerkiksi insufficient_scope (403), rate_limited (429) ja käytön mukaan laskutettavalle asiakkaalle spend_cap_reached (402) ja metered_billing_inactive (402).

errorstringpakollinen

Esimerkki

Koodiesimerkin kieli

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";
    }
}

Käytätkö mieluummin kirjastoa? Katso Kirjastot-osio.

Esimerkkivirta

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."}]}]}}}

Jos käännös ja englanninkielinen viite poikkeavat toisistaan, englanninkielinen viite on oikea.