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

傳送一輪導師對話

API 版本 2026-10-affable-towhee

post https://api.getlingara.com/v1/tutor/message

向導師傳送一條訊息,並用 delta 事件串流傳送回覆,最後以 done 結束。伺服器唔會儲存任何嘢:請喺 history 入面傳送最近嘅對話,最多 20 項。character 同 situation 用嚟設定場景。需要付費計劃。

權限範圍 tutor:converse

參數

Lingara-Versionheaderstring選填
回應呢個請求所用嘅 API 版本。冇呢個嘅話,存取權杖會用佢嘅用戶端綁定嘅版本,冇權杖嘅請求會用而家嘅版本。仲喺開發中嘅版本,只可以喺度指明先用到。唔認得嘅版本會回 400,代碼係 api_version_unknown。GET /v1/versions 會列出所有版本。

請求內容 application/json

messagestring必填
historyarray of TurnEntry選填
roleTurnRole必填
contentstring必填
source_langstring必填
target_langstring必填
levelinteger | null選填
characterstring | null選填
situationstring | null選填

回應

200 導師嘅回覆,一段一段噉傳送

串流事件 text/event-stream

唔會送出 keepalive 註解。

delta TurnDelta
textstring必填
notice Notice
codestring必填
messagestring必填
done Done 結束串流
error StreamError 結束串流

喺 200 回應入面到達。狀態行已經送出,所以串流開咗之後嘅失敗會以呢個事件報告。

codestring必填
messagestring必填
plan_idstring | null選填

錯誤

402application/json
一個按用量收費嘅用戶端嘅呼叫,喺佢用任何嘢之前已經被拒絕。spend_cap_reached:用戶端或者佢嘅帳戶已經到咗每月嘅支出上限;請喺整合頁面調高上限。metered_billing_inactive:呢個帳戶嘅按用量收費未啟用;請喺整合頁面設定,或者更新付款方式。
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 -X POST "https://api.getlingara.com/v1/tutor/message" \
  -H "Authorization: Bearer $LINGARA_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"message":"我要两斤荔枝。","history":[{"role":"assistant","content":"欢迎!今天的荔枝很新鲜。"}],"source_lang":"en","target_lang":"zh","level":2,"character":"a fruit seller in a night market","situation":"buying lychees, haggling"}'

TypeScript

const reply = client.sendTutorMessage({
  message: "你好!我想点一杯茶。",
  history: [],
  source_lang: "en",
  target_lang: "zh",
});
for await (const ev of reply) {
  if (ev.event === "delta") process.stdout.write(ev.data.text);
}

Rust

use lingara::models::{SendTutorMessageEvent, TutorTurnRequest};

let request = TutorTurnRequest {
    message: "你好!我想点一杯茶。".into(),
    history: Vec::new(),
    source_lang: "en".into(),
    target_lang: "zh".into(),
    level: None,
    character: None,
    situation: None,
};
let mut reply = client.send_tutor_message(&request).await?;
while let Some(event) = reply.next().await {
    if let SendTutorMessageEvent::Delta(delta) = event? {
        print!("{}", delta.text);
    }
}

Go

s, err := client.SendTutorMessage(ctx, lingara.TutorTurnRequest{
	Message:    "你好!我想点一杯茶。",
	SourceLang: "en",
	TargetLang: "zh",
})
if err != nil {
	return err
}
defer s.Close()
for ev, err := range s.Events() {
	if err != nil {
		return err
	}
	if delta, ok := ev.(lingara.SendTutorMessageEventDelta); ok {
		fmt.Print(delta.Data.Text)
	}
}

Java

import com.getlingara.client.model.SendTutorMessageEvent;
import com.getlingara.client.model.TutorTurnRequest;

TutorTurnRequest turn =
    new TutorTurnRequest().message("荔枝多少钱?").sourceLang("en").targetLang("zh").level(2);
try (EventStream<SendTutorMessageEvent> stream = client.sendTutorMessage(turn)) {
  for (SendTutorMessageEvent event : stream) {
    if (event instanceof SendTutorMessageEvent.Delta delta) {
      System.out.print(delta.data().getText());
    } else if (event instanceof SendTutorMessageEvent.Notice notice) {
      System.out.println("\n(" + notice.data().getMessage() + ")");
    }
  }
}

Kotlin

import com.getlingara.kotlin.LingaraClient
import com.getlingara.kotlin.model.SendTutorMessageEvent
import com.getlingara.kotlin.model.TutorTurnRequest

val turn = TutorTurnRequest(message = "荔枝多少钱?", sourceLang = "en", targetLang = "zh", level = 2)
client.sendTutorMessage(turn).use { stream ->
    stream.collect { event ->
        when (event) {
            is SendTutorMessageEvent.Delta -> print(event.data.text)
            is SendTutorMessageEvent.Notice -> println("\n(${event.data.message})")
        }
    }
}

Ruby

history = [{role: "user", content: "你好"}, {role: "assistant", content: "你好!你想练习什么?"}]
client.send_tutor_message(message: "我想点菜", history: history, source_lang: "en", target_lang: "zh") do |event|
  case event
  in Lingara::SendTutorMessageEventDelta => delta then print delta.data.text
  in Lingara::SendTutorMessageEventNotice => notice then warn notice.data.message
  else nil
  end
end
puts

PHP

use Lingara\Model\TutorTurnRequest;
use Lingara\Stream\SendTutorMessageEvent;

$turn = new TutorTurnRequest(['message' => '荔枝多少钱?', 'source_lang' => 'en', 'target_lang' => 'zh', 'level' => 2]);
foreach ($client->sendTutorMessage($turn) as $event) {
    if ($event instanceof SendTutorMessageEvent\Delta) {
        echo $event->data->getText();
    } elseif ($event instanceof SendTutorMessageEvent\Notice) {
        echo "\n(", $event->data->getMessage(), ')';
    }
}
echo "\n";

想用程式庫?睇吓程式庫部分。

串流例子

event: delta
data: {"text":"两斤荔枝,"}

event: delta
data: {"text":"一共三十块。"}

event: done
data: {}

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