🆕 程式碼
// 簡易記憶體:用 Map 存會話
const sessions = new Map();
/** 初始化 session 狀態 */
function getSession(sessionId = "default") {
if (!sessions.has(sessionId)) {
sessions.set(sessionId, { history: [], state: {} });
}
return sessions.get(sessionId);
}
/**
// 簡單決策樹:根據 state 與輸入決定下一步
let systemPrompt = 你是一個互動式助理,負責蒐集資訊並引導使用者。 目前任務:協助使用者建立「報修單」。 必要資訊:姓名(name)、電話(phone)、地址(address)、問題描述(symptom)。 請逐步提問,一次只問缺少的欄位。 若全部齊全,請確認資訊並輸出 JSON。
;
const messages = [
{ role: "system", content: systemPrompt },
...session.history,
{ role: "user", content: userInput },
];
const res = await openai.chat.completions.create({
model: "gpt-4o-mini",
messages,
temperature: 0.4,
});
const reply = res.choices?.[0]?.message?.content?.trim() || "(無回覆)";
session.history.push({ role: "user", content: userInput });
session.history.push({ role: "assistant", content: reply });
return { reply, state: session.state };
}
/** 重置 session */
export function resetDialogue(sessionId = "default") {
sessions.delete(sessionId);
}
// ...既有 args 解析略
async function main() {
const task = args.task || "chat";
if (task === "dialogue") {
const sessionId = args.session || "default";
if (args.reset) {
resetDialogue(sessionId);
console.log(已重置對話 session=${sessionId}
);
return;
}
const input = args.text || "嗨";
const { reply } = await dialogue(input, { sessionId });
console.log(\n[${sessionId}] AI:${reply}\n
);
} else {
// ...你既有的其他分支
}
}
▶️ CLI 使用
npm run day14:dialogue:start --silent
npm run day14:dialogue:next --silent
npm run day14:dialogue:reset --silent
AI 會依缺少的欄位一步步問你,直到蒐集完整資訊,最後輸出 JSON 報修單。