Lingara Lingara Tài liệu Cẩm nang API Thư viện Ứng dụng Tạo Ứng dụng web
Ngôn ngữ: Tiếng Việt

Kết nối lại với giáo án

Phiên bản API 2026-10-affable-towhee

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

Tham gia lại luồng tiến trình của giáo án vẫn đang được tạo. Giáo án đã hoàn tất trả về một result. Giáo án vẫn đang được tạo nhưng không có luồng trực tiếp để tham gia sẽ trả về một pending; hãy thăm dò GET /v1/lesson-plans/{id} cho đến khi hoàn tất.

Phạm vi lesson_plans:read

Tham số

Lingara-Versionheaderstringtùy chọn
Phiên bản API dùng để trả lời yêu cầu này. Nếu không có, token truy cập nhận phiên bản mà ứng dụng khách của nó được gắn, còn yêu cầu không có token nhận phiên bản hiện tại. Phiên bản đang phát triển chỉ có thể dùng bằng cách nêu tên nó ở đây. Phiên bản không xác định được trả lời bằng 400 với mã api_version_unknown. GET /v1/versions liệt kê các phiên bản.
idpathstringbắt buộc

Phản hồi

200 Phần tiến trình còn lại của giáo án, sau đó là giáo án

Sự kiện luồng text/event-stream

Gửi một chú thích keepalive mỗi 15 giây.

started PlanStarted
plan_idstringbắt buộc
phase PlanPhase
phasestringbắt buộc
attemptintegerbắt buộc
result PlanResult Kết thúc luồng
planLessonPlanbắt buộc
idstringbắt buộc
statusPlanStatusbắt buộc
titlestring | nulltùy chọn
source_langstringbắt buộc
target_langstringbắt buộc
levelintegerbắt buộc
created_atstringbắt buộc
completed_atstring | nulltùy chọn
ai_generatedbooleanbắt buộc
contentLessonPlanContent | nulltùy chọn
introductionstring | nulltùy chọn
learning_objectivesarray of stringbắt buộc
vocabularyarray of PlanWordbắt buộc
wordstringbắt buộc
pronunciationstring | nulltùy chọn
translationstringbắt buộc
setsarray of PlanSetbắt buộc
numberintegerbắt buộc
contextstring | nulltùy chọn
questionsarray of PlanQuestionbắt buộc
typestringbắt buộc
promptstringbắt buộc
optionsarray of string | nulltùy chọn
answerstringbắt buộc
explanationstringbắt buộc
hintstring | nulltùy chọn
pending PlanPending Kết thúc luồng
plan_idstringbắt buộc
statusPlanStatusbắt buộc
error StreamError Kết thúc luồng

Đến bên trong phản hồi 200. Dòng trạng thái đã được gửi, nên lỗi xảy ra sau khi luồng mở được báo bằng sự kiện này.

codestringbắt buộc
messagestringbắt buộc
plan_idstring | nulltùy chọn

Lỗi

410application/json
Phiên bản API dùng để trả lời yêu cầu này đã bị ngừng. Hãy gửi một phiên bản được hỗ trợ trong Lingara-Version, hoặc gắn ứng dụng khách với một phiên bản khác.
4XXapplication/json
Yêu cầu đã bị từ chối. code cho biết lý do, và error diễn đạt lý do đó bằng lời.
503application/json · text/plain
Dịch vụ tạm thời không khả dụng; hãy thử lại sau số giây ghi trong Retry-After. Trong thời gian bảo trì, phần thân là văn bản thuần thay vì phong bì lỗi.
5XXapplication/json
Yêu cầu đã bị từ chối. code cho biết lý do, và error diễn đạt lý do đó bằng lời.
codestringbắt buộc

Lý do yêu cầu bị từ chối, dưới dạng một mã ổn định để rẽ nhánh: ví dụ insufficient_scope (403), rate_limited (429) và, với ứng dụng khách tính phí theo mức dùng, spend_cap_reached (402) và metered_billing_inactive (402).

errorstringbắt buộc

Ví dụ

Ngôn ngữ của mã mẫu

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

Muốn dùng thư viện? Xem mục Thư viện.

Luồng ví dụ

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

Nếu bản dịch và tài liệu tham chiếu tiếng Anh khác nhau, tài liệu tham chiếu tiếng Anh là bản đúng.