File size: 1,864 Bytes
35d05d3
a86df80
6c2bcb4
2f65818
a86df80
35d05d3
 
 
 
 
 
 
 
2d85080
35d05d3
 
a86df80
6c2bcb4
65567a2
6c2bcb4
a86df80
65567a2
 
65cfba9
2d85080
35d05d3
65cfba9
 
2f65818
 
65cfba9
 
a86df80
 
 
6c2bcb4
90d9359
6c2bcb4
90d9359
 
 
a86df80
90d9359
2aa79c0
 
 
 
 
2f65818
2aa79c0
 
 
a86df80
 
2d85080
 
 
 
 
 
 
 
 
a86df80
 
 
 
90d9359
 
 
6c2bcb4
90d9359
 
 
 
 
a86df80
 
 
 
 
 
 
 
 
 
 
 
 
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
85
86
87
88
89
90
import { ChatCompletionRequestMessage, OpenAIApi } from "openai";
import { nanoid } from "nanoid";
import { extractCode, miniPrompt } from "@/utils/prompt";
import { systemMessage } from "@/constants";

interface ToOpenAIProps {
	command: string;
	prompt: string;
	temperature: string;
	template: string;
	model: string;
	maxTokens: string;
	client: OpenAIApi | null;
	signal?: AbortSignal;
}

export async function toOpenAI({
	command = "CREATE_GAME",
	prompt = "extend the code",
	temperature = "0.2",
	template = "",
	model = "gpt-3.5-turbo",
	maxTokens = "2048",
	client = null,
	signal,
}: ToOpenAIProps) {
	if (client === null) {
		throw new Error("OpenAI client is not defined");
	}

	const prompt_ = prompt.trim();

	const nextMessage: ChatCompletionRequestMessage = {
		role: "user",
		content: miniPrompt`
			"${command}": ${prompt_}. Return the full source code of the game.
			TEMPLATE:
			\`\`\`javascript
			${template.trim().replace(/^\s+/gm, "").replace(/^\n+/g, "").replace(/\s+/, " ")}
			\`\`\`
			`,
	};

	const task = `${prompt_}`;

	const messages: ChatCompletionRequestMessage[] = [
		{
			role: "system",
			content: miniPrompt`${systemMessage}`,
		},
		nextMessage,
	];

	try {
		const response = await client.createChatCompletion(
			{
				model,
				messages,
				max_tokens: Number.parseInt(maxTokens),
				temperature: Number.parseFloat(temperature),
			},
			{ signal }
		);

		const { message } = response.data.choices[0];

		if (message) {
			return {
				...message,
				content: extractCode(message.content).replace(
					/(COMMANDS|CREATE_GAME|ADD_FEATURE|REMOVE_FEATURE|UPDATE_FEATURE|FIX_BUG|TEMPLATE|OUTPUT FORMAT).*\n/,
					""
				),
				task,
				id: nanoid(),
			};
		}

		// Something broke
		// ToDo: fix it :)
		return {
			content: "/* BROKEN */",
			task,
			id: nanoid(),
		};
	} catch (error) {
		throw error;
	}
}