跳至主要内容

提問卡片

Agent 需要的是決定而不是猜測時,會送出 QUESTION 模板:一張帶 1–4 題選擇題的卡片,每題 2–4 個選項。使用者勾完按送出,SDK 把答案摺成一段文字,當作下一則普通的使用者訊息送出去。

用內建 <Chatbot> 不必接線,卡片會自動渲染。

回答不是一次協定交握

產生這張卡片的那一輪 run 已經結束了。所以回答走的就是一般送訊息的路徑:

  • 使用者可以完全無視這張卡片,直接打字問別的——那是同一條路,不是錯誤路徑。
  • 沒有「等待回答」的暫停狀態,卡片也不會鎖住輸入框。

模板還帶一個 text 欄位,裡面是同一批問題的純文字版本,好讓不認得這個模板的客戶端有東西可退, 而不是顯示一顆空泡泡。

型別

interface QuestionOption {
label: string;
description?: string; // 選這個代表什麼;可能沒有
}

interface Question {
question: string; // 完整題目文字,也是摺答案時的 key
header: string; // 短標籤(約 12 字)
multiSelect: boolean;
options: QuestionOption[];
}

interface QuestionMessageTemplate {
type: "QUESTION";
text?: string; // 純文字退路
questions: Question[];
}
header 不是識別鍵

header 是給 chip 用的短標籤,可能在不同題目間重複。要對應題目一律用 question 全文。 後端目前送 1–4 題、每題 2–4 個選項,但渲染端不要依賴這個範圍

答案怎麼摺成文字

composeQuestionAnswers(questions, answers) 負責把勾選結果組成要送出的訊息:

import { composeQuestionAnswers } from "@asgard-js/react";

const text = composeQuestionAnswers(questions, { 0: ["PostgreSQL"], 1: ["驗證", "可觀測性"] });

產生的字串長這樣:

1. 這個應該用哪種儲存?

PostgreSQL

---

2. v1 要包含什麼?

驗證, 可觀測性
這是與 Agent 的契約,不是排版邏輯

這段文字有兩個讀者:模型要把每個答案對回它問的題目,人則會在對話串裡看到一模一樣的字。 所以規則都是為了同時滿足兩者:

  • 題目文字逐字複製——那是模型自己寫的字串,對得上才不會有歧義。header 從不出現在這裡。
  • 編號是對實際送出的題目連續編的,不是原始索引。一則從「2.」開頭的訊息讀起來像掉了東西。
  • 跳過的題目整題省略,不留「未回答」佔位。
  • 空白與純空白的填答不算數,所以打開自由填答列卻沒打字,等同沒回答。
  • 每題都跳過時回傳空字串——呼叫端據此把送出鈕停用。

也看看