From 426de6b0bad609d93b9440f714e02552579cc21a Mon Sep 17 00:00:00 2001 From: yuiseki Date: Sat, 9 Nov 2024 22:41:24 +0900 Subject: [PATCH] =?UTF-8?q?Ability=E3=81=AE=E6=A6=82=E5=BF=B5=E3=82=92?= =?UTF-8?q?=E5=AE=9F=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/page.tsx | 39 +++++++----- src/utils/langchain/chains/surface/prompt.ts | 63 +++++++++++++++++--- src/utils/trident/parseSurfaceResJson.ts | 25 ++++++++ 3 files changed, 105 insertions(+), 22 deletions(-) create mode 100644 src/utils/trident/parseSurfaceResJson.ts diff --git a/src/app/page.tsx b/src/app/page.tsx index 75c9252a..588897e1 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -26,6 +26,7 @@ import { greetings } from "@/constants/Greetings"; import { untitledMaps } from "@/constants/UntitledMap"; import { tridentPlaceholders } from "@/constants/TridentPlaceholder"; import { useScrollToBottom } from "@/hooks/scrollToBottom"; +import { parseSurfaceResJson } from "@/utils/trident/parseSurfaceResJson"; export default function Home() { // all state @@ -64,6 +65,8 @@ export default function Home() { const [dialogueList, setDialogueList] = useState([]); const scrollToBottom = useScrollToBottom(dialogueEndRef); + const [ability, setAbility] = useState(undefined); + // communication state const [responding, setResponding] = useState(false); const [mapping, setMapping] = useState(false); @@ -121,15 +124,22 @@ export default function Home() { surface: string; history: Array; } = await surfaceRes.json(); - console.log(surfaceResJson); setPastMessages(surfaceResJson.history); + console.log(surfaceResJson); + const { ability, reply } = parseSurfaceResJson(surfaceResJson); insertNewDialogue( { who: "assistant", - text: surfaceResJson.surface, + text: reply, }, false ); + setAbility(ability); + if (["apology", "ask-more"].includes(ability)) { + setResponding(false); + setMapping(false); + return; + } setMapping(true); setResponding(true); @@ -402,18 +412,19 @@ export default function Home() { }} /> )} - {!responding && !mapping && dialogueList.length > 1 && ( - { - scrollToBottom(); - }} - onSelect={(value: string) => { - setInputText(value); - onSubmit(value); - }} - /> - )} + {(!responding && !mapping && dialogueList.length > 1) || + (ability && ["apology", "ask-more"].includes(ability) && ( + { + scrollToBottom(); + }} + onSelect={(value: string) => { + setInputText(value); + onSubmit(value); + }} + /> + ))}
diff --git a/src/utils/langchain/chains/surface/prompt.ts b/src/utils/langchain/chains/surface/prompt.ts index 56f32ff9..bdabefc2 100644 --- a/src/utils/langchain/chains/surface/prompt.ts +++ b/src/utils/langchain/chains/surface/prompt.ts @@ -8,22 +8,69 @@ export const tridentSurfaceExampleList: Array<{ }> = [ { input: "Show map of New York City.", - output: - "I copy. I'm generating maps that shows the city of New York based on OpenStreetMap data. Please wait a while...", + output: `Ability: overpass-api +Reply: I copy. I'm generating maps that shows the city of New York based on OpenStreetMap data. Please wait a while...`, }, { input: "ニューヨークの地図を表示して", - output: - "了解しました。OpenStreetMapのデータに基づいてニューヨーク市を表示する地図を作成しています。しばらくお待ちください……", + output: `Ability: overpass-api +Reply: 了解しました。OpenStreetMapのデータに基づいてニューヨーク市を表示する地図を作成しています。しばらくお待ちください……`, + }, + { + input: "显示纽约地图", + output: `Ability: overpass-api +Reply: 知道了。我正在生成基于OpenStreetMap数据的纽约市地图。请稍等……`, }, { input: "台東区を表示して", - output: - "了解しました。OpenStreetMapのデータに基づいて台東区を表示する地図を作成しています。しばらくお待ちください……", + output: `Ability: overpass-api +Reply: 了解しました。OpenStreetMapのデータに基づいて台東区を表示する地図を作成しています。しばらくお待ちください……`, }, { - input: "显示纽约地图", - output: "知道了。我正在生成基于OpenStreetMap数据的纽约市地图。请稍等……", + input: `台東区を表示して +ラーメン屋を表示して`, + output: `Ability: overpass-api +Reply: 了解しました。OpenStreetMapのデータに基づいて台東区のラーメン屋を表示する地図を作成しています。しばらくお待ちください……`, + }, + { + input: `台東区を表示して +ラーメン屋を表示して +蕎麦屋を表示して`, + output: `Ability: overpass-api +Reply: 了解しました。OpenStreetMapのデータに基づいて台東区のラーメン屋と蕎麦屋を表示する地図を作成しています。しばらくお待ちください……`, + }, + { + input: "ラーメン屋を表示して", + output: `Ability: ask-more +Reply: 了解しました。どの地域のラーメン屋を表示しますか?`, + }, + { + input: `台東区の人気のラーメン屋を教えて`, + output: `Ability: apology +Reply: 申し訳ありません。私はOpenStreetMapのデータ以外の情報に基づいて地図を生成することはできません。`, + }, + { + input: `台東区で有名の観光スポットを教えて`, + output: `Ability: apology +Reply: 申し訳ありません。私はOpenStreetMapのデータ以外の情報に基づいて地図を生成することはできません。`, + }, + { + input: `台東区の人口を教えて`, + output: `Ability: apology +Reply: 申し訳ありません。私はOpenStreetMapのデータ以外の情報に基づいて地図を生成することはできません。`, + }, + { + input: `台東区の人口を教えて +ラーメン屋を表示して`, + output: `Ability: overpass-api +Reply: 了解しました。OpenStreetMapのデータに基づいて台東区のラーメン屋を表示する地図を作成しています。しばらくお待ちください……`, + }, + { + input: `台東区を表示して +ラーメン屋を表示して +墨田区まで広げて`, + output: `Ability: overpass-api +Reply: 了解しました。OpenStreetMapのデータに基づいて台東区と文京区のラーメン屋を表示する地図を作成しています。しばらくお待ちください……`, }, ]; diff --git a/src/utils/trident/parseSurfaceResJson.ts b/src/utils/trident/parseSurfaceResJson.ts new file mode 100644 index 00000000..e2788d6c --- /dev/null +++ b/src/utils/trident/parseSurfaceResJson.ts @@ -0,0 +1,25 @@ +export const parseSurfaceResJson = (surfaceResJson: { + surface: string; +}): { + ability: string; + reply: string; +} => { + const lines = surfaceResJson.surface.split("\n"); + let ability = ""; + let reply = ""; + lines.map(async (line: string, idx: number) => { + console.log(`surface line ${idx}:`, line); + + if (line.includes("Ability")) { + ability = line.split(": ")[1]; + } + if (line.includes("Reply")) { + reply = line.split(": ")[1]; + } + }); + + return { + ability, + reply, + }; +};