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

ប្រសិនបើការបកប្រែ និងឯកសារយោងជាភាសាអង់គ្លេសខុសគ្នា ឯកសារយោងជាភាសាអង់គ្លេសគឺជាឯកសារដែលត្រឹមត្រូវ។