Lingara Lingara Documentação Guias API Bibliotecas Aplicações Criar Aplicação web
Idioma: Português

Streams

Esta página é uma tradução do inglês. Se as duas diferirem, a página em inglês é a correta. Ler a página em inglês

Quatro operações transmitem os seus resultados como eventos enviados pelo servidor: gerar vocabulário, enviar uma mensagem ao tutor, criar um plano de lição e acompanhar um. Cada biblioteca transforma o stream de eventos no iterador próprio da linguagem e entrega-lhe cada evento já descodificado num valor tipado.

Como termina um stream

  • Quando o trabalho está concluído. A iteração para sozinha no evento final do stream. Num plano de lição, esse evento final contém o resultado, pelo que o recebe antes de o ciclo terminar.
  • Quando a API comunica um erro. Um erro que chega dentro do stream é lançado como erro da API, do mesmo tipo de um que chegue antes dele.
  • Quando a ligação falha. Um stream que termina antes do seu evento final, ou que não envia absolutamente nada durante 120 segundos, é lançado como erro de transporte.
  • Quando para. Cancele a chamada da forma habitual na sua linguagem, ou deixe de ler, e a ligação fecha-se prontamente.

Os comentários de keepalive e os tipos de evento que uma biblioteca ainda não conhece são ignorados, pelo que uma API mais recente nunca estraga uma biblioteca mais antiga.

Nunca repetido

Um stream que tenha entregado nem que seja um evento nunca é repetido pela biblioteca, porque repeti-lo poderia gastar a sua quota duas vezes. Se o stream de um plano de lição se interromper depois de ter começado, acompanhe o mesmo plano com streamLessonPlan e o plan_id do seu primeiro evento.

Linguagem do exemplo de código

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

O que esta página encapsula