demo / app /templates /search.html
tekville's picture
Initial commit
ff72db3
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>๋ฌธ์„œ ๊ฒ€์ƒ‰</title>
<style>
.container {
width: 50%;
margin: 0 auto;
padding: 20px;
text-align: center;
border: 1px solid #ccc;
border-radius: 8px;
background-color: #f9f9f9;
}
.search-bar {
display: flex;
justify-content: center;
align-items: center;
gap: 10px;
}
input[type="text"], select {
padding: 10px;
border: 1px solid #ccc;
border-radius: 4px;
font-size: 14px;
}
input[type="text"] {
flex: 1;
}
select {
flex: 0.5;
}
button {
padding: 10px 20px;
background-color: #007bff;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
font-size: 14px;
}
button:hover {
background-color: #0056b3;
}
.results, .evaluation, .stream-output {
margin-top: 5px;
}
.stream-output {
text-align: left;
white-space: pre-wrap;
border: 1px solid #ccc;
padding: 10px;
height: 500px;
overflow-y: scroll;
}
nav {
background-color: #333;
padding: 10px;
text-align: center;
}
nav ul {
list-style-type: none;
padding: 0;
margin: 0;
}
nav ul li {
display: inline;
margin: 0 15px;
}
nav ul li a {
color: white;
text-decoration: none;
font-weight: bold;
}
nav ul li a:hover {
text-decoration: underline;
}
</style>
</head>
<body>
<header>
<nav>
<ul>
<li><a href="/search">๋ฌธ์„œ ๊ฒ€์ƒ‰</a></li>
<li><a href="/">ํŒŒ์ผ ์—…๋กœ๋“œ</a></li>
</ul>
</nav>
</header>
<div class="container">
<h2>๋ฌธ์„œ ๊ฒ€์ƒ‰</h2>
<form id="search-form" class="search-bar">
<input type="text" id="query" name="query" placeholder="๊ฒ€์ƒ‰์–ด๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”..." required>
<select id="model" name="model">
<option value="Qwen/Qwen2.5-72B-Instruct">Qwen/Qwen2.5-72B-Instruct</option>
<option value="meta-llama/Llama-3.3-70B-Instruct">meta-llama/Llama-3.3-70B-Instruct</option>
<option value="CohereForAI/c4ai-command-r-plus-08-2024">CohereForAI/c4ai-command-r-plus-08-2024</option>
<option value="Qwen/QwQ-32B-Preview">Qwen/QwQ-32B-Preview</option>
<option value="nvidia/Llama-3.1-Nemotron-70B-Instruct-HF">nvidia/Llama-3.1-Nemotron-70B-Instruct-HF</option>
<option value="Qwen/Qwen2.5-Coder-32B-Instruct">Qwen/Qwen2.5-Coder-32B-Instruct</option>
<option value="meta-llama/Llama-3.2-11B-Vision-Instruct">meta-llama/Llama-3.2-11B-Vision-Instruct</option>
<option value="NousResearch/Hermes-3-Llama-3.1-8B">NousResearch/Hermes-3-Llama-3.1-8B</option>
<option value="mistralai/Mistral-Nemo-Instruct-2407">mistralai/Mistral-Nemo-Instruct-2407</option>
<option value="microsoft/Phi-3.5-mini-instruct">microsoft/Phi-3.5-mini-instruct</option>
</select>
<button type="submit">๊ฒ€์ƒ‰</button>
</form>
<h3>์‹ค์‹œ๊ฐ„ ๊ฒฐ๊ณผ</h3>
<div id="stream-output" class="stream-output">
<div id="stream-content">
<!-- ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ๊ฐ€ ์—ฌ๊ธฐ์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค -->
</div>
</div>
</div>
<script>
let currentController = null; // ํ˜„์žฌ ์š”์ฒญ์„ ์ œ์–ดํ•  AbortController
document.getElementById("search-form").addEventListener("submit", async (event) => {
event.preventDefault(); // ๊ธฐ๋ณธ ํผ ์ œ์ถœ ๋ฐฉ์ง€
const query = document.getElementById("query").value;
const model = document.getElementById("model").value;
const outputContainer = document.getElementById("stream-content");
// ์ด์ „ ์š”์ฒญ ์ค‘๋‹จ
if (currentController) {
currentController.abort();
}
currentController = new AbortController();
const signal = currentController.signal;
// ์ถœ๋ ฅ ์ดˆ๊ธฐํ™”
outputContainer.textContent = "๊ฒ€์ƒ‰ ์ค‘...\n";
try {
const response = await fetch("/search/stream", {
method: "POST",
headers: {
"Content-Type": "application/x-www-form-urlencoded"
},
body: new URLSearchParams({ query, model }),
signal, // AbortController์˜ signal ์ „๋‹ฌ
});
const reader = response.body.getReader();
const decoder = new TextDecoder("utf-8");
while (true) {
const { value, done } = await reader.read();
if (done) break;
outputContainer.textContent += decoder.decode(value);
outputContainer.scrollTop = outputContainer.scrollHeight; // ์Šคํฌ๋กค ์ž๋™ ์ด๋™
}
} catch (error) {
if (error.name === "AbortError") {
outputContainer.textContent += "\n์š”์ฒญ์ด ์ทจ์†Œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.\n";
} else {
outputContainer.textContent = `์˜ค๋ฅ˜ ๋ฐœ์ƒ: ${error.message}`;
}
} finally {
currentController = null; // ํ˜„์žฌ ์š”์ฒญ ์™„๋ฃŒ ํ›„ ์ดˆ๊ธฐํ™”
}
});
</script>
</body>
</html>