Lingara Lingara ドキュメント 学習ガイド API ライブラリ アプリ 作成 ウェブ版
言語: 日本語

ストリーム

このページは英語から翻訳されています。内容に相違がある場合は、英語のページが正しい内容です。 英語のページを読む

4 つの操作が、結果をサーバー送信イベントとしてストリーミングします。語彙の生成、チューターへのメッセージ送信、レッスンプランの作成、そしてその追跡です。どのライブラリもイベントストリームをその言語固有のイテレーターに変換し、各イベントを型付きの値にデコードした状態で渡します。

ストリームの終わり方

  • 処理が完了したとき。 イテレーションはストリームの最後のイベントで自動的に止まります。レッスンプランの場合は最後のイベントに結果が含まれるため、ループが終わる前にそれを受け取れます。
  • API がエラーを報告したとき。 ストリームの途中で届いたエラーは、ストリームの開始前に届くエラーと同じ型の API エラーとして送出されます。
  • 接続が失敗したとき。 最後のイベントより前に終わったストリーム、または 120 秒間何も送ってこないストリームは、トランスポートエラーとして送出されます。
  • 自分で止めたとき。 お使いの言語の通常の方法で呼び出しをキャンセルするか、読み取りをやめると、接続はすぐに閉じられます。

キープアライブのコメントや、ライブラリがまだ知らないイベントタイプはスキップされるため、新しい API によって古いライブラリが壊れることはありません。

再送はしない

イベントを 1 つでも配信したストリームを、ライブラリが再試行することはありません。繰り返すと利用枠を 2 回消費するおそれがあるためです。レッスンプランのストリームが開始後に途切れた場合は、streamLessonPlan に最初のイベントで届いた plan_id を渡して、同じプランを追跡してください。

コード例の言語

TypeScript

const stream = client.generateVocabulary({ level: 2, source_lang: "en", target_lang: "zh", count: 8 });
for await (const ev of stream) {
  if (ev.event === "item") console.log(ev.data.word, ev.data.translation);
}

Rust

use lingara::models::{GenerateVocabularyEvent, VocabRequest};
use std::num::NonZeroU8;

let request = VocabRequest { level: 2, source_lang: "en".into(), target_lang: "zh".into(), count: NonZeroU8::new(8) };
let mut stream = client.generate_vocabulary(&request).await?;
while let Some(event) = stream.next().await {
    if let GenerateVocabularyEvent::Item(item) = event? {
        println!("{} {}", item.word, item.translation);
    }
}

Go

count := uint8(8)
s, err := client.GenerateVocabulary(ctx, lingara.VocabRequest{Level: 2, SourceLang: "en", TargetLang: "zh", Count: &count})
if err != nil {
	return err
}
defer s.Close()
for ev, err := range s.Events() {
	if err != nil {
		return err
	}
	if item, ok := ev.(lingara.GenerateVocabularyEventItem); ok {
		fmt.Println(item.Data.Word, item.Data.Translation)
	}
}

Java

import com.getlingara.client.model.GenerateVocabularyEvent;
import com.getlingara.client.model.VocabRequest;

VocabRequest request = new VocabRequest().level(2).sourceLang("en").targetLang("zh").count(8);
try (EventStream<GenerateVocabularyEvent> stream = client.generateVocabulary(request)) {
  for (GenerateVocabularyEvent event : stream) {
    if (event instanceof GenerateVocabularyEvent.Item item) {
      System.out.println(item.data().getWord() + " " + item.data().getTranslation());
    }
  }
}

Kotlin

import com.getlingara.kotlin.LingaraClient
import com.getlingara.kotlin.model.GenerateVocabularyEvent
import com.getlingara.kotlin.model.VocabRequest

val request = VocabRequest(level = 2, sourceLang = "en", targetLang = "zh", count = 8)
// The request is sent here; collect the stream once, inside use {}.
client.generateVocabulary(request).use { stream ->
    stream.collect { event ->
        when (event) {
            is GenerateVocabularyEvent.Item -> println("${event.data.word} ${event.data.translation}")
            is GenerateVocabularyEvent.Started -> Unit
        }
    }
}

Ruby

client.generate_vocabulary(level: 2, source_lang: "en", target_lang: "zh", count: 8) do |event|
  case event
  in Lingara::GenerateVocabularyEventItem => item then puts "#{item.data.word}: #{item.data.translation}"
  else nil
  end
end

PHP

use Lingara\Model\VocabRequest;
use Lingara\Stream\GenerateVocabularyEvent;

$request = new VocabRequest(['level' => 2, 'source_lang' => 'en', 'target_lang' => 'zh', 'count' => 8]);
foreach ($client->generateVocabulary($request) as $event) {
    if ($event instanceof GenerateVocabularyEvent\Item) {
        echo $event->data->getWord(), ': ', $event->data->getTranslation(), "\n";
    }
}

このページがラップするもの