Lingara Lingara بەڵگەنامەکان ڕێنماییەکان API کتێبخانەکان ئەپەکان دروستکردن جێگیرکردن ئەپی وێب
زمان: سۆرانی

گفتوگۆی NPC

ئەم پەڕەیە لە ئینگلیزییەوە وەرگێڕدراوە. ئەگەر هەردووکیان جیاواز بوون، پەڕە ئینگلیزییەکە ڕاستە. پەڕە ئینگلیزییەکە بخوێنەوە

کارەکتەرێک لە یارییەکەتدا دەتوانێت لەگەڵ یاریزانەکە بەو زمانەی کە فێری دەبێت گفتوگۆ بکات، بە گوێرەی ئاستەکەی. هەر دێڕێک کە یاریزانەکە دەیڵێت نۆرەیەکە: کیتی یاریزان دەینێرێت، و وەڵامی کارەکتەرەکە پارچەپارچە دەگەڕێتەوە.

نۆرەیەک چی هەڵدەگرێت

هەموو نۆرەیەک هەموو ئەوەی کارەکتەرەکە پێویستی پێیەتی دەنێرێت، چونکە Lingara لە نێوان نۆرەکاندا هیچ گفتوگۆیەک هەڵناگرێت:

  • npc: کێ قسە دەکات. name ـەکەی لە 1 تا 32 پیتە، و persona ـی ئارەزوومەندانەی یەک دێڕی وەسفە، لە 1 تا 120 پیت، وەک “فرۆشیارێکی دامپلینگ”.
  • scene: ئارەزوومەندانە، شوێنی ڕوودانی گفتوگۆکە، لە 1 تا 160 پیت.
  • source_lang و target_lang: زمانی خودی یاریزانەکە و ئەو زمانەی فێری دەبێت. دەبێت جیاواز بن، و کارەکتەرەکە تەنها بە target_lang قسە دەکات.
  • level: ئاستی یاریزانەکە، لە 1 تا 9. ڕێبەری Lingara “ئاست چ واتایەک دەگەیەنێت” پێوەرەکە ڕوون دەکاتەوە.
  • line: ئەوەی یاریزانەکە ئێستا گوتی، لە 1 تا 500 پیت.
  • history: گفتوگۆکە تا ئێستا، کۆنترینیان یەکەم، بەلایەنی زۆرەوە 12 دێڕ. هەر دێڕێک speaker ێکی هەیە، یان player یان npc، و text ـەکەی، لە 1 تا 500 پیت.

هەر دەقێک تەنها یەک دێڕە. یارییەکەت گفتوگۆکە هەڵدەگرێت: کیتی یاریزان پەنجەرەکە بۆ هەر گفتوگۆیەک کە دەیکەیتەوە هەڵدەگرێت، هەر نۆرەیەکی تەواوبوو بۆی زیاد دەکات، هەر وەڵامێک بۆ یەکەم 500 پیتی کورت دەکاتەوە، و کۆنترین دێڕەکانی دوای 12 لادەبات.

Lingara کەسایەتی و دیمەنەکە وەک دەقی نامتمانەپێکراو لە یارییەکەتەوە مامەڵە دەکات. ئەوان شێوەی قسەکردنی کارەکتەرەکە دیاری دەکەن، هەرگیز ئەوە نا کە ڕێگەی پێدراوە چی بکات.

وەڵامێک چۆن دەگات

وەڵامەکە وەک پارچەی دەق پارچەپارچە دێت، کە یارییەکەت لە کاتی گەیشتنیاندا بەدوای یەکدا زیادیان دەکات. لە نێوانیاندا لەوانەیە ئاگادارییەک بێت، وەک یەکێک کە دەڵێت وەڵامەکە کورت بڕاوە. نۆرەکە بە done کۆتایی دێت کاتێک وەڵامەکە تەواو بێت، یان بە error کاتێک شکستی هێنابێت. نۆرەیەک ناتوانرێت درێژە پێبدرێتەوە: ئەگەر پەیوەندییەکە بپچڕێت، یاریزانەکە دێڕەکە دووبارە دەڵێتەوە.

لە یەک کاتدا یەک دێڕ بە هەر کارەکتەرێک بڵێ. دێڕێک کە لە کاتێکدا گوترابێت کارەکتەرەکە هێشتا وەڵام دەداتەوە ڕەت دەکرێتەوە نەک بخرێتە ڕیزەوە، چونکە پارە بۆ هەر نۆرەیەک وەردەگیرێت.

کێ پارە دەدات

تەنها یاریزانانی کلاینتێکی سەر پلانی پێوانەکراو دەتوانن گفتوگۆ بکەن، و پارەی هەر نۆرەیەک لەسەر ئەو کلاینتە دەنووسرێت. تۆکنی یاریزانێک پێویستی بە embed:play ە.

زمانی نموونەی کۆد

Bevy

fn spawn_seller(mut commands: Commands) {
    let mei = NpcDialogue::new("Mei", "zh", 2)
        .and_then(|npc| npc.with_persona("a dumpling seller"))
        .and_then(|npc| npc.with_scene("the night market"))
        .expect("within Lingara's bounds");
    commands.spawn(mei);
    commands.spawn(Player);
}

/// One turn at a time: a line said while the NPC is replying is a `Busy` error.
fn talk(keys: Res<ButtonInput<KeyCode>>, npcs: Query<Entity, With<NpcDialogue>>, mut say: MessageWriter<NpcSay>) {
    if keys.just_pressed(KeyCode::Digit1) {
        for entity in &npcs {
            say.write(NpcSay { entity, line: "饺子多少钱?".into() });
        }
    }
}

/// `streaming` grows as the reply arrives; `turns` holds the finished ones.
fn show_reply(transcripts: Query<&NpcTranscript, Changed<NpcTranscript>>) {
    for transcript in &transcripts {
        if let Some(partial) = &transcript.streaming {
            info!("…{partial}");
        }
    }
}

Unity

public DialogueId OpenDialogue(string npc, string sourceLang, string targetLang, byte level) =>
    Client.DialogueOpen(new DialogueConfig { Npc = new Npc { Name = npc }, SourceLang = sourceLang, TargetLang = targetLang, Level = level });

// The reply streams back as NpcTurn events: append each Fragment's text to your label.
public RequestId Say(DialogueId dialogue, string line) => Client.DialogueSay(dialogue, line);

Godot C#

public long OpenDialogue(string npc, string sourceLang, string targetLang, byte level) =>
    Client.DialogueOpen(new DialogueConfig { Npc = new Npc { Name = npc }, SourceLang = sourceLang, TargetLang = targetLang, Level = level }).Value;

// The reply streams back as NpcTurnFragment signals, then one NpcTurnFinished.
public long Say(long dialogue, string line) => Client.DialogueSay(new DialogueId(dialogue), line).Value;

GDScript

# A LingaraNpc child per character: npc_name, target_lang and level in the
# inspector. say() returns false while a turn is in flight (turns are never
# queued, because each one is billed).
func talk_to_mei(line: String) -> void:
	if mei.say(line):
		bubble.text = "…"


func _on_mei_replied(text: String) -> void:
	bubble.text = text

Unreal C++

void ALingaraEmbedSnippetActor::Say(const FString& Line)
{
	ELingaraCallResult Result;
	FLingaraEmbedError Error;
	if (Dialogue == 0)
	{
		FLingaraDialogueConfig Config;
		Config.Npc.Name = TEXT("Mei");
		Config.Npc.Persona = TEXT("a tea seller at the night market");
		Config.SourceLang = TEXT("en");
		Config.TargetLang = TEXT("zh");
		Config.Level = 2;
		Dialogue = Lingara()->DialogueOpen(Config, Result, Error);
	}
	Reply.Reset();
	Lingara()->DialogueSay(Dialogue, Line, Result, Error);
}

// The reply streams back as npc_turn events: append each fragment.
void ALingaraEmbedSnippetActor::HandleNpcTurn(const FLingaraNpcTurn& Turn)
{
	if (Turn.Dialogue == Dialogue && Turn.Update.Type == ELingaraNpcTurnUpdateType::Fragment)
	{
		Reply += Turn.Update.Text;
	}
}

Kotlin

fun talkToMei(line: String) {
    val dialogue = npc ?: lingara.dialogueOpen(DialogueConfig(Npc("Mei", "a tea seller"), "the tea house", "en", "zh", 2, emptyList()))
    npc = dialogue
    lingara.dialogueSay(dialogue, line)
}

private fun onNpcTurn(update: NpcTurnUpdate) {
    when (update) {
        is NpcTurnUpdate.Opened -> bubble = ""
        is NpcTurnUpdate.Fragment -> bubble += update.text
        is NpcTurnUpdate.Finished -> bubble = update.text
        else -> Unit
    }
}

Java

void talkToMei(String line) {
  if (npc < 0) {
    Npc mei = new Npc("Mei", "a tea seller");
    npc =
        lingara.dialogueOpen(new DialogueConfig(mei, "the tea house", "en", "zh", 2, List.of()));
  }
  lingara.dialogueSay(npc, line);
}

void onNpcTurn(EmbedEvent.NpcTurn turn) {
  if (turn.getUpdate() instanceof NpcTurnUpdate.Fragment fragment) {
    bubble.append(fragment.getText());
  } else if (turn.getUpdate() instanceof NpcTurnUpdate.Finished finished) {
    bubble.setLength(0);
    bubble.append(finished.getText());
  }
}

هەروەها ببینە