Lingara Lingara Τεκμηρίωση Οδηγοί API Βιβλιοθήκες Εφαρμογές Δημιουργία Διαδικτυακή εφαρμογή
Γλώσσα: Ελληνικά

Δημιουργία σχεδίου μαθήματος

Έκδοση API 2026-10-affable-towhee

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

Ξεκινά τη δημιουργία ενός σχεδίου μαθήματος και μεταδίδει την πρόοδό του ως ροή. Το started κατονομάζει το σχέδιο μόλις υπάρξει, ώστε μια σύνδεση που διακόπηκε να μπορεί να επανασυνδεθεί με GET /v1/lesson-plans/{id}/stream. Η ροή τελειώνει με result ή error. Ένα σχέδιο που εξυπηρετείται από τη βιβλιοθήκη φτάνει ως ένα μεμονωμένο result.

Εύρη δικαιωμάτων lesson_plans:write

Παράμετροι

Lingara-Versionheaderstringπροαιρετικό
Η έκδοση API με την οποία απαντάται αυτό το αίτημα. Χωρίς αυτήν, ένα token πρόσβασης παίρνει την έκδοση στην οποία είναι δεσμευμένος ο πελάτης του και ένα αίτημα χωρίς token παίρνει την τρέχουσα έκδοση. Η έκδοση που βρίσκεται ακόμη υπό ανάπτυξη είναι προσβάσιμη μόνο αν την ονομάσετε εδώ. Μια άγνωστη έκδοση απαντάται με 400 και κωδικό api_version_unknown. Το GET /v1/versions παραθέτει τις εκδόσεις.

Σώμα αιτήματος application/json

contextstringυποχρεωτικό
source_langstringυποχρεωτικό
target_langstringυποχρεωτικό
levelintegerυποχρεωτικό

Αποκρίσεις

200 Η πρόοδος του σχεδίου, έπειτα το σχέδιο

Συμβάντα ροής text/event-stream

Στέλνει ένα σχόλιο keepalive κάθε 15 δευτερόλεπτα.

started PlanStarted
plan_idstringυποχρεωτικό
phase PlanPhase
phasestringυποχρεωτικό
attemptintegerυποχρεωτικό
result PlanResult Τερματίζει τη ροή
planLessonPlanυποχρεωτικό
idstringυποχρεωτικό
statusPlanStatusυποχρεωτικό
titlestring | nullπροαιρετικό
source_langstringυποχρεωτικό
target_langstringυποχρεωτικό
levelintegerυποχρεωτικό
created_atstringυποχρεωτικό
completed_atstring | nullπροαιρετικό
ai_generatedbooleanυποχρεωτικό
contentLessonPlanContent | nullπροαιρετικό
introductionstring | nullπροαιρετικό
learning_objectivesarray of stringυποχρεωτικό
vocabularyarray of PlanWordυποχρεωτικό
wordstringυποχρεωτικό
pronunciationstring | nullπροαιρετικό
translationstringυποχρεωτικό
setsarray of PlanSetυποχρεωτικό
numberintegerυποχρεωτικό
contextstring | nullπροαιρετικό
questionsarray of PlanQuestionυποχρεωτικό
typestringυποχρεωτικό
promptstringυποχρεωτικό
optionsarray of string | nullπροαιρετικό
answerstringυποχρεωτικό
explanationstringυποχρεωτικό
hintstring | nullπροαιρετικό
error StreamError Τερματίζει τη ροή

Φτάνει μέσα στην απόκριση 200. Η γραμμή κατάστασης έχει ήδη σταλεί, οπότε μια αποτυχία μετά το άνοιγμα της ροής αναφέρεται ως αυτό το συμβάν.

codestringυποχρεωτικό
messagestringυποχρεωτικό
plan_idstring | nullπροαιρετικό

Σφάλματα

402application/json
Η κλήση ενός πελάτη με χρέωση βάσει χρήσης απορρίφθηκε πριν καταναλώσει οτιδήποτε. spend_cap_reached: ο πελάτης ή ο λογαριασμός του έφτασε το μηνιαίο όριο δαπανών του· αυξήστε το όριο στη σελίδα Ενσωματώσεις. metered_billing_inactive: η χρέωση βάσει χρήσης δεν είναι ενεργή για αυτόν τον λογαριασμό· ρυθμίστε την ή ενημερώστε τον τρόπο πληρωμής στη σελίδα Ενσωματώσεις.
410application/json
Η έκδοση API με την οποία απαντάται αυτό το αίτημα έχει καταργηθεί. Στείλτε μια υποστηριζόμενη έκδοση στο Lingara-Version ή συνδέστε τον πελάτη με άλλη έκδοση.
4XXapplication/json
Το αίτημα απορρίφθηκε. Το code λέει γιατί και το error το εξηγεί με λόγια.
503application/json · text/plain
Η υπηρεσία δεν είναι προσωρινά διαθέσιμη· δοκιμάστε ξανά μετά τον αριθμό δευτερολέπτων στο Retry-After. Κατά τη συντήρηση, το σώμα είναι απλό κείμενο αντί για τον φάκελο σφάλματος.
5XXapplication/json
Το αίτημα απορρίφθηκε. Το code λέει γιατί και το error το εξηγεί με λόγια.
codestringυποχρεωτικό

Γιατί απορρίφθηκε το αίτημα, ως σταθερός κωδικός για διακλάδωση: για παράδειγμα insufficient_scope (403), rate_limited (429) και, για πελάτη με χρέωση βάσει χρήσης, spend_cap_reached (402) και metered_billing_inactive (402).

errorstringυποχρεωτικό

Παράδειγμα

Γλώσσα παραδείγματος κώδικα

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

Προτιμάτε μια βιβλιοθήκη; Δείτε την ενότητα Βιβλιοθήκες.

Παράδειγμα ροής

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

Αν μια μετάφραση διαφέρει από την αγγλική τεκμηρίωση, ισχύει η αγγλική τεκμηρίωση.