利用規約にご同意の上ご利用ください。
※候補者の選挙公報を学習したAIがあなた質問にお答えします。
※AIは事実と異なる事を言うこともあります。必ず自身で情報を確かめて下さい。
※ボートマッチの仕組みと使い方はコチラ
※システムのソースコードはコチラ
※選挙公報は東京都選挙管理委員会HPから引用

学習済み候補者一覧

※選挙公報掲載順(敬称略)

No. 候補者名 党派
1 小林弘 無所属
2 二宮大造 NHKから国民を守る党
3 田母神としお 無所属
4 ひまそらあかね 無所属
5 みなみ俊輔 NHKから国民を守る党
6 桑原まりこ 無所属
7 かがたたくじ 覇王党
8 尾関あゆみ ポーカー党
9 内野愛里 カワイイ私の政見放送を見てね
10 桑島康文 核融合党
11 横山緑 NHKから国民を守る党
12 小池ゆりこ 無所属
13 河合ゆうすけ ジョーカー議員と投票率を上げる会
14 津村大作 NHKから国民を守る党
15 大和行男 無所属
16 中江ともや NHKから国民を守る党
17 加藤英明 NHKから国民を守る党
18 蓮舫 無所属
19 しんどう伸夫 お金をみんなへシン独立党
20 石丸幸人 石丸幸人党
21 AIメイヤー AI党
22 うつみさとる 市民がつくる政治の会
23 アキノリ将軍未満 ネオアキノリ幕府党
24 ホカリジン 無所属
25 犬伏宏明 NHKから国民を守る党
26 小野寺こうき 忠臣蔵義士新党
27 野間口翔 無所属
28 小松けん ゴルフ党
29 松尾芳治 NHKから国民を守る党
30 草尾あつし NHKから国民を守る党
31 加藤健一郎 無所属
32 うしくぼのぶお 無所属
33 ドクター・中松 無所属
34 向後真徳 無所属
35 黒川あつひこ つばさの党
36 武内隆 NHKから国民を守る党
37 安野たかひろ 無所属
38 福永かつや NHKから国民を守る党
39 木宮みつき 未来党
40 ゴトウテルキ ラブ&ピース党
41 ふくはらしるび NHKから国民を守る党
42 ふなはしゆめと NHKから国民を守る党
43 清水国明 清水国明と東京都の安全な未来をつくる会
44 ないとうひさお 無所属
45 山田信一 NHKから国民を守る党
46 前田太一 NHKから国民を守る党
47 石丸伸二 無所属
48 澤繁実 無所属
49 古田真 (略称)土頭を働かし最高裁判官5人を弾劾する党
50 福本繁幸 無所属
51 木村よしたか NHKから国民を守る党
52 三輪陽一 NHKから国民を守る党
53 桜井誠 日本第一党
54 遠藤信一 NHKから国民を守る党
55 竹本秀之 無所属
56 上楽むねゆき NHKから国民を守る党

ソースコード

“use client”;
import React from “react”;

function MainComponent() {
const [userInput, setUserInput] = React.useState(“”);
const [chatHistory, setChatHistory] = React.useState([]);
const [isLoading, setIsLoading] = React.useState(false);
const [conversationContext, setConversationContext] = React.useState(“”);

const handleInputChange = (e) => {
setUserInput(e.target.value);
};

const handleSubmit = async (e) => {
e.preventDefault();
if (!userInput.trim()) return;

setIsLoading(true);
const newUserMessage = { role: “user”, content: userInput };
setChatHistory((prev) => […prev, newUserMessage]);

try {
const candidatesResponse = await fetch(“/api/db/2024-15”, {
method: “POST”,
headers: { “Content-Type”: “application/json” },
body: JSON.stringify({
query: “SELECT * FROM `shizuoka_governor_candidates`”,
}),
});
const candidatesData = await candidatesResponse.json();

const systemMessage = {
role: “system”,
content: `都知事選挙2024の候補者情報について回答してください。候補者の名前の後には「候補」とつけてください。回答は読みやすいように改行を入れてください。以下は候補者の情報です:\n${JSON.stringify(
candidatesData
)}\n\n前回の質問:${conversationContext}`,
};

const response = await fetch(
“/integrations/anthropic-claude-sonnet-3-5/”,
{
method: “POST”,
headers: { “Content-Type”: “application/json” },
body: JSON.stringify({
messages: [systemMessage, newUserMessage],
}),
}
);

const data = await response.json();
const assistantResponse = data.choices[0].message.content;

setChatHistory((prev) => [
…prev,
{ role: “assistant”, content: assistantResponse },
]);

const now = new Date().toISOString();
await fetch(“/api/db/2024-42”, {
method: “POST”,
headers: { “Content-Type”: “application/json” },
body: JSON.stringify({
query:
“INSERT INTO `conversation_data` (`date_time`, `user_question`, `assistant_response`) VALUES (?, ?, ?)”,
values: [now, userInput, assistantResponse],
}),
});

await fetch(“/api/db/138”, {
method: “POST”,
headers: { “Content-Type”: “application/json” },
body: JSON.stringify({
query:
“INSERT INTO `conversation_history` (`question`, `answer`) VALUES (?, ?)”,
values: [userInput, assistantResponse],
}),
});

setConversationContext(userInput);
setUserInput(“”);
} catch (error) {
console.error(“Error:”, error);
} finally {
setIsLoading(false);
}
};

return (
<div className=”flex flex-col h-screen bg-gradient-to-r from-blue-100 to-purple-100″>
<div className=”flex items-center justify-between p-4 bg-gradient-to-r from-blue-100 to-purple-100 shadow-md”>
<h1 className=”text-2xl font-bold text-indigo-800 font-noto-sans text-[25px]”>
AIボートマッチ丨都知事選挙2024
</h1>
<a
href=”https://demotech.jp/”
target=”_blank”
rel=”noopener noreferrer”
className=”text-[11px] text-indigo-600 hover:text-indigo-800 transition duration-300 ease-in-out font-noto-sans”
>
一般社団法人デモテク
</a>
</div>
<div className=”flex-grow overflow-y-auto p-4″>
{chatHistory.map((message, index) => (
<div
key={index}
className={`mb-4 ${
message.role === “user” ? “text-right” : “text-left”
}`}
>
<div
className={`inline-block p-3 rounded-lg ${
message.role === “user”
? “bg-indigo-500 text-white”
: “bg-gray-100”
}`}
>
{message.content.split(“\n”).map((line, i) => (
<p key={i} className=”mb-1 last:mb-0 text-lg”>
{line}
</p>
))}
</div>
</div>
))}
</div>
<form
onSubmit={handleSubmit}
className=”p-4 bg-gradient-to-r from-blue-100 to-purple-100″
>
<div className=”flex flex-col”>
<div className=”flex”>
<input
type=”text”
name=”userInput”
value={userInput}
onChange={handleInputChange}
className=”flex-grow p-3 border-2 border-indigo-300 rounded-l-lg focus:outline-none focus:border-indigo-500 text-lg font-noto-sans”
placeholder=”質問を入力してください…”
disabled={isLoading}
/>
<button
type=”submit”
className=”bg-indigo-500 text-white p-3 rounded-r-lg hover:bg-indigo-600 transition duration-300 ease-in-out”
disabled={isLoading}
>
{isLoading ? (
<i className=”fas fa-spinner fa-spin text-xl”></i>
) : (
<i className=”fas fa-paper-plane text-xl”></i>
)}
</button>
</div>
<p className=”text-[10px] text-gray-500 mt-1″>
回答は必ずしも正しいとは限りません。重要な情報は確認するようにしてください。
</p>
</div>
</form>
</div>
);
}

export default MainComponent;