Lingara Lingara المستندات أدلة التعلّم API المكتبات التطبيقات البناء تطبيق الويب
اللغة: العربية

إعادة الاتصال بخطة درس

إصدار API 2026-10-affable-towhee

get https://api.getlingara.com/v1/lesson-plans/{id}/stream

يعيد الانضمام إلى بث تقدّم خطة لا يزال إنشاؤها جاريًا. الخطة المكتملة تجيب بـ result واحد. والخطة التي لا يزال إنشاؤها جاريًا دون بث حيّ للانضمام إليه تجيب بـ pending واحد؛ استعلم دوريًا عن GET /v1/lesson-plans/{id} حتى تكتمل.

النطاقات lesson_plans:read

المعاملات

Lingara-Versionheaderstringاختياري
إصدار API الذي يُجاب عن هذا الطلب به. بدونه، يحصل رمز الوصول على الإصدار الذي رُبط به عميله، ويحصل الطلب الذي لا رمز مميز فيه على الإصدار الحالي. لا يمكن الوصول إلى الإصدار الذي لا يزال قيد التطوير إلا بذكره هنا. الإصدار غير المعروف يُجاب عنه بـ 400 مع الرمز api_version_unknown. يسرد GET /v1/versions الإصدارات.
idpathstringمطلوب

الاستجابات

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اختياري
pending PlanPending ينهي البث
plan_idstringمطلوب
statusPlanStatusمطلوب
error StreamError ينهي البث

يصل داخل استجابة 200. سطر الحالة أُرسل بالفعل، لذا يُبلَّغ عن أي فشل بعد فتح البث على أنه هذا الحدث.

codestringمطلوب
messagestringمطلوب
plan_idstring | nullاختياري

الأخطاء

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 "https://api.getlingara.com/v1/lesson-plans/$ID/stream" \
  -H "Authorization: Bearer $LINGARA_TOKEN"

TypeScript

for await (const ev of client.streamLessonPlan({ id: planId })) {
  if (ev.event === "result") console.log("ready:", ev.data.plan.title);
  if (ev.event === "pending") console.log("still", ev.data.status, "- try again later");
}

Rust

use lingara::models::StreamLessonPlanEvent;

let mut stream = client.stream_lesson_plan(&plan_id).await?;
while let Some(event) = stream.next().await {
    match event? {
        StreamLessonPlanEvent::Result(result) => println!("ready: {}", result.plan.title.unwrap_or_default()),
        StreamLessonPlanEvent::Pending(pending) => println!("still {:?} - try again later", pending.status),
        _ => {}
    }
}

Go

// Rejoin a plan still generating, with the plan_id from its started event.
s, err := client.StreamLessonPlan(ctx, "3f1c2a9e-5b7d-4e21-9a0c-6d8e4f2b1a37")
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.StreamLessonPlanEventResult:
		fmt.Println("ready:", e.Data.Plan.ID)
	case lingara.StreamLessonPlanEventPending:
		fmt.Println("still", e.Data.Status, "- rejoin later")
	}
}

Java

import com.getlingara.client.model.StreamLessonPlanEvent;

try (EventStream<StreamLessonPlanEvent> stream = client.streamLessonPlan(planId)) {
  for (StreamLessonPlanEvent event : stream) {
    if (event instanceof StreamLessonPlanEvent.Result result) {
      System.out.println(result.data().getPlan().getTitle());
    } else if (event instanceof StreamLessonPlanEvent.Pending pending) {
      // Still generating elsewhere: ask again later.
      System.out.println("pending: " + pending.data().getStatus());
    }
  }
}

Kotlin

import com.getlingara.kotlin.LingaraClient
import com.getlingara.kotlin.model.StreamLessonPlanEvent

client.streamLessonPlan(planId).use { stream ->
    stream.collect { event ->
        when (event) {
            is StreamLessonPlanEvent.Result -> println(event.data.plan.title)
            // Still generating elsewhere: ask again later.
            is StreamLessonPlanEvent.Pending -> println("pending: ${event.data.status}")
            else -> Unit
        }
    }
}

Ruby

client.stream_lesson_plan(plan_id) do |event|
  case event
  in Lingara::StreamLessonPlanEventResult => result then puts "ready: #{result.data.plan.title}"
  in Lingara::StreamLessonPlanEventPending => pending then puts "still #{pending.data.status}, try again later"
  else nil
  end
end

PHP

use Lingara\Stream\StreamLessonPlanEvent;

foreach ($client->streamLessonPlan($planId) as $event) {
    if ($event instanceof StreamLessonPlanEvent\Result) {
        echo 'ready: ', $event->data->getPlan()->getTitle(), "\n";
    } elseif ($event instanceof StreamLessonPlanEvent\Pending) {
        echo 'still ', $event->data->getStatus()->value, ", try again later\n";
    }
}

تفضّل مكتبة؟ راجع قسم المكتبات.

مثال على البث

event: pending
data: {"plan_id":"3f1c2a9e-5b7d-4e21-9a0c-6d8e4f2b1a37","status":"generating"}

إذا اختلفت ترجمةٌ عن المرجع الإنجليزي، فالمرجع الإنجليزي هو الصحيح.