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 संस्करण जिसके अंतर्गत इस अनुरोध का उत्तर दिया जाए। इसके बिना, एक्सेस टोकन को वह संस्करण मिलता है जिससे उसका क्लाइंट जुड़ा है, और बिना टोकन वाले अनुरोध को वर्तमान संस्करण मिलता है। विकासाधीन संस्करण तक केवल उसे यहाँ नाम देकर पहुँचा जा सकता है। अज्ञात संस्करण का उत्तर 400 और कोड api_version_unknown होता है। GET /v1/versions संस्करणों की सूची देता है।

अनुरोध बॉडी application/json

contextstringआवश्यक
source_langstringआवश्यक
target_langstringआवश्यक
levelintegerआवश्यक

प्रतिक्रियाएँ

200 योजना की प्रगति, फिर योजना

स्ट्रीम इवेंट text/event-stream

हर 15 सेकंड में एक keepalive टिप्पणी भेजता है।

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

यदि किसी अनुवाद और अंग्रेज़ी संदर्भ में अंतर हो, तो अंग्रेज़ी संदर्भ ही मान्य है।