File size: 2,080 Bytes
abaaa3e
3e9f86e
 
9be5ab5
1eb0e2e
 
06ffd82
3e9f86e
 
 
c38ef3b
3e9f86e
 
 
 
 
 
 
 
 
 
 
 
 
 
ffa4f55
3e9f86e
 
 
 
06ffd82
 
 
 
 
 
 
3c650ed
abaaa3e
06ffd82
 
3e9f86e
9be5ab5
1eb0e2e
06ffd82
9be5ab5
06ffd82
 
 
9be5ab5
 
 
 
 
 
 
06ffd82
3e9f86e
1eb0e2e
 
06ffd82
3e9f86e
 
 
 
 
 
06ffd82
3e9f86e
 
 
 
 
 
06ffd82
3e9f86e
06ffd82
3e9f86e
 
 
 
 
 
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
79
80
81
82
83
84
import { PUBLIC_MAX_INPUT_TOKENS, PUBLIC_SEP_TOKEN } from "$env/static/public";
import { buildPrompt } from "$lib/buildPrompt";
import { collections } from "$lib/server/database.js";
import { modelEndpoint } from "$lib/server/modelEndpoint.js";
import { trimPrefix } from "$lib/utils/trimPrefix.js";
import { trimSuffix } from "$lib/utils/trimSuffix.js";
import { textGeneration } from "@huggingface/inference";
import { error } from "@sveltejs/kit";
import { ObjectId } from "mongodb";

export async function POST({ params, locals, fetch }) {
	const convId = new ObjectId(params.id);

	const conversation = await collections.conversations.findOne({
		_id: convId,
		sessionId: locals.sessionId,
	});

	if (!conversation) {
		throw error(404, "Conversation not found");
	}

	const firstMessage = conversation.messages.find((m) => m.from === "user");

	const userPrompt =
		`Please summarize the following message as a single sentence of less than 5 words:\n` +
		firstMessage?.content;

	const prompt = buildPrompt([{ from: "user", content: userPrompt }]);

	const parameters = {
		temperature: 0.9,
		top_p: 0.95,
		repetition_penalty: 1.2,
		top_k: 50,
		watermark: false,
		max_new_tokens: 1024,
		truncate: parseInt(PUBLIC_MAX_INPUT_TOKENS),
		stop: [PUBLIC_SEP_TOKEN],
		return_full_text: false,
	};

	const endpoint = modelEndpoint();
	let { generated_text } = await textGeneration(
		{
			model: endpoint.endpoint,
			inputs: prompt,
			parameters,
		},
		{
			fetch: (url, options) =>
				fetch(url, {
					...options,
					headers: { ...options?.headers, Authorization: endpoint.authorization },
				}),
		}
	);

	generated_text = trimSuffix(trimPrefix(generated_text, "<|startoftext|>"), PUBLIC_SEP_TOKEN);

	if (generated_text) {
		await collections.conversations.updateOne(
			{
				_id: convId,
				sessionId: locals.sessionId,
			},
			{
				$set: { title: generated_text },
			}
		);
	}

	return new Response(
		JSON.stringify(
			generated_text
				? {
						title: generated_text,
				  }
				: {}
		),
		{ headers: { "Content-Type": "application/json" } }
	);
}