-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathapi.ts
More file actions
78 lines (67 loc) · 2.07 KB
/
Copy pathapi.ts
File metadata and controls
78 lines (67 loc) · 2.07 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import type { SearchBackend } from "./backends";
import { classifySearchConfidence } from "./search";
type SearchRequestBody = {
embedding?: unknown;
topK?: unknown;
modelId?: unknown;
};
type SearchBackends = Record<string, SearchBackend>;
function json(data: unknown, init?: ResponseInit): Response {
return new Response(JSON.stringify(data, null, 2), {
...init,
headers: {
"content-type": "application/json; charset=utf-8",
...init?.headers,
},
});
}
function parseEmbedding(value: unknown): number[] | null {
if (!Array.isArray(value)) {
return null;
}
const embedding = value.map(Number);
if (embedding.some((item) => !Number.isFinite(item))) {
return null;
}
return embedding;
}
export async function handleSearchRequest(
request: Request,
backends: SearchBackends,
): Promise<Response> {
if (request.method !== "POST") {
return json({ error: "POST 요청만 지원합니다." }, { status: 405 });
}
let body: SearchRequestBody;
try {
body = (await request.json()) as SearchRequestBody;
} catch {
return json({ error: "JSON 본문을 읽을 수 없습니다." }, { status: 400 });
}
const embedding = parseEmbedding(body.embedding);
if (!embedding) {
return json({ error: "embedding 배열이 필요합니다." }, { status: 400 });
}
const requestedTopK = typeof body.topK === "number" ? body.topK : 5;
const topK = Math.min(Math.max(Math.trunc(requestedTopK), 1), 20);
const modelId = typeof body.modelId === "string" ? body.modelId : "tiny-sample-v1";
const backend = backends[modelId];
if (!backend) {
return json({ error: `지원하지 않는 modelId입니다: ${modelId}` }, { status: 400 });
}
try {
const results = await backend.search(embedding, topK);
return json({
topK,
modelId,
backend: backend.name,
confidence: classifySearchConfidence(results),
results,
});
} catch (error) {
return json(
{ error: error instanceof Error ? error.message : "검색 중 오류가 발생했습니다." },
{ status: 400 },
);
}
}