Lingara Lingara 說明文件 學習指南 API 程式庫 App 建立 網頁版
語言: 粵語

重新連接去課程計劃

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

每 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選填
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"}

如果譯本同英文參考文件有出入,以英文參考文件為準。