Lingara Lingara Belgeler Rehberler API Kütüphaneler Uygulamalar Oluştur Web uygulaması
Dil: Türkçe

Ders planı oluştur

API sürümü 2026-10-affable-towhee

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

Bir ders planı oluşturmaya başlar ve ilerlemesini akış olarak gönderir. started, plan oluşur oluşmaz planı adlandırır; böylece kopan bir bağlantı GET /v1/lesson-plans/{id}/stream ile yeniden bağlanabilir. Akış result veya error ile sona erer. Kütüphaneden sunulan bir plan tek bir result olarak gelir.

Kapsamlar lesson_plans:write

Parametreler

Lingara-Versionheaderstringisteğe bağlı
Bu isteğin yanıtlanacağı API sürümü. Belirtilmezse bir erişim token'ı istemcisinin bağlı olduğu sürümü, token içermeyen bir istek ise güncel sürümü alır. Hâlâ geliştirilmekte olan sürüme yalnızca burada adı verilerek ulaşılır. Bilinmeyen bir sürüm 400 ve api_version_unknown koduyla yanıtlanır. GET /v1/versions sürümleri listeler.

İstek gövdesi application/json

contextstringzorunlu
source_langstringzorunlu
target_langstringzorunlu
levelintegerzorunlu

Yanıtlar

200 Planın ilerlemesi, ardından plan

Akış olayları text/event-stream

Her 15 saniyede bir keepalive yorumu gönderir.

started PlanStarted
plan_idstringzorunlu
phase PlanPhase
phasestringzorunlu
attemptintegerzorunlu
result PlanResult Akışı sonlandırır
planLessonPlanzorunlu
idstringzorunlu
statusPlanStatuszorunlu
titlestring | nullisteğe bağlı
source_langstringzorunlu
target_langstringzorunlu
levelintegerzorunlu
created_atstringzorunlu
completed_atstring | nullisteğe bağlı
ai_generatedbooleanzorunlu
contentLessonPlanContent | nullisteğe bağlı
introductionstring | nullisteğe bağlı
learning_objectivesarray of stringzorunlu
vocabularyarray of PlanWordzorunlu
wordstringzorunlu
pronunciationstring | nullisteğe bağlı
translationstringzorunlu
setsarray of PlanSetzorunlu
numberintegerzorunlu
contextstring | nullisteğe bağlı
questionsarray of PlanQuestionzorunlu
typestringzorunlu
promptstringzorunlu
optionsarray of string | nullisteğe bağlı
answerstringzorunlu
explanationstringzorunlu
hintstring | nullisteğe bağlı
error StreamError Akışı sonlandırır

200 yanıtının içinde gelir. Durum satırı zaten gönderilmiş olduğundan, akış açıldıktan sonraki bir hata bu olay olarak bildirilir.

codestringzorunlu
messagestringzorunlu
plan_idstring | nullisteğe bağlı

Hatalar

402application/json
Kullanım başına ücretlendirilen bir istemcinin çağrısı, hiçbir şey harcamadan reddedildi. spend_cap_reached: istemci veya hesabı aylık harcama sınırına ulaştı; sınırı Entegrasyonlar sayfasında yükseltin. metered_billing_inactive: bu hesap için kullanım başına ücretlendirme etkin değil; Entegrasyonlar sayfasında kurun veya ödeme yöntemini güncelleyin.
410application/json
Bu isteğin yanıtlandığı API sürümü sonlandırıldı. Lingara-Version içinde desteklenen bir sürüm gönderin veya istemciyi başka bir sürüme bağlayın.
4XXapplication/json
İstek reddedildi. code nedenini belirtir, error ise bunu sözcüklerle açıklar.
503application/json · text/plain
Hizmet geçici olarak kullanılamıyor; Retry-After içindeki saniye sayısı kadar bekledikten sonra yeniden deneyin. Bakım sırasında gövde, hata zarfı yerine düz metindir.
5XXapplication/json
İstek reddedildi. code nedenini belirtir, error ise bunu sözcüklerle açıklar.
codestringzorunlu

İsteğin neden reddedildiği, dallanmak için kullanılabilecek sabit bir kod olarak: örneğin insufficient_scope (403), rate_limited (429) ve kullanım başına ücretlendirilen bir istemci için spend_cap_reached (402) ile metered_billing_inactive (402).

errorstringzorunlu

Örnek

Kod örneğinin dili

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ütüphane mi tercih edersiniz? Kütüphaneler bölümüne bakın.

Örnek akış

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

Bir çeviri ile İngilizce referans arasında fark varsa, İngilizce referans geçerlidir.