※利用規約にご同意の上ご利用ください。
※候補者の選挙公報を学習した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;