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 버전입니다. 지정하지 않으면 액세스 토큰은 해당 클라이언트에 고정된 버전을, 토큰이 없는 요청은 현재 버전을 받습니다. 개발 중인 버전은 여기에서 지정해야만 사용할 수 있습니다. 알 수 없는 버전에는 코드 api_version_unknown과 함께 400으로 응답합니다. 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"}

번역본과 영어 참조 문서의 내용이 다른 경우, 영어 참조 문서가 올바른 것으로 봅니다.