Spaces:
Running
Running
add new model and lighten prompt system
Browse files- app/api/ask/route.ts +12 -15
- lib/best-provider.ts +3 -8
- lib/prompts.ts +146 -126
app/api/ask/route.ts
CHANGED
|
@@ -7,11 +7,12 @@ import { InferenceClient } from "@huggingface/inference";
|
|
| 7 |
import { MODELS } from "@/lib/providers";
|
| 8 |
import {
|
| 9 |
FOLLOW_UP_SYSTEM_PROMPT,
|
|
|
|
| 10 |
INITIAL_SYSTEM_PROMPT,
|
|
|
|
| 11 |
MAX_REQUESTS_PER_IP,
|
| 12 |
PROMPT_FOR_PROJECT_NAME,
|
| 13 |
} from "@/lib/prompts";
|
| 14 |
-
import { calculateMaxTokens, estimateInputTokens, getProviderSpecificConfig } from "@/lib/max-tokens";
|
| 15 |
import MY_TOKEN_KEY from "@/lib/get-cookie-name";
|
| 16 |
import { Page } from "@/types";
|
| 17 |
import { isAuthenticated } from "@/lib/auth";
|
|
@@ -100,21 +101,20 @@ export async function POST(request: NextRequest) {
|
|
| 100 |
});
|
| 101 |
|
| 102 |
(async () => {
|
| 103 |
-
// let completeResponse = "";
|
| 104 |
try {
|
| 105 |
const client = new InferenceClient(token);
|
| 106 |
|
| 107 |
-
|
|
|
|
|
|
|
|
|
|
| 108 |
|
| 109 |
const userPrompt = rewrittenPrompt;
|
| 110 |
-
const estimatedInputTokens = estimateInputTokens(systemPrompt, userPrompt);
|
| 111 |
-
const dynamicMaxTokens = calculateMaxTokens(selectedProvider, estimatedInputTokens, true);
|
| 112 |
-
const providerConfig = getProviderSpecificConfig(selectedProvider, dynamicMaxTokens);
|
| 113 |
|
| 114 |
const chatCompletion = client.chatCompletionStream(
|
| 115 |
{
|
| 116 |
model: selectedModel.value,
|
| 117 |
-
provider: selectedProvider
|
| 118 |
messages: [
|
| 119 |
{
|
| 120 |
role: "system",
|
|
@@ -127,7 +127,6 @@ export async function POST(request: NextRequest) {
|
|
| 127 |
3. I want to use the following theme: ${enhancedSettings.theme} mode.` : "")
|
| 128 |
},
|
| 129 |
],
|
| 130 |
-
...providerConfig,
|
| 131 |
},
|
| 132 |
billTo ? { billTo } : {}
|
| 133 |
);
|
|
@@ -283,7 +282,10 @@ export async function PUT(request: NextRequest) {
|
|
| 283 |
try {
|
| 284 |
const client = new InferenceClient(token);
|
| 285 |
|
| 286 |
-
const
|
|
|
|
|
|
|
|
|
|
| 287 |
const userContext = "You are modifying the HTML file based on the user's request.";
|
| 288 |
|
| 289 |
const allPages = pages || [];
|
|
@@ -296,14 +298,10 @@ export async function PUT(request: NextRequest) {
|
|
| 296 |
: ""
|
| 297 |
}. Current pages (${allPages.length} total): ${pagesContext}. ${files?.length > 0 ? `Available images: ${files?.map((f: string) => f).join(', ')}.` : ""}`;
|
| 298 |
|
| 299 |
-
const estimatedInputTokens = estimateInputTokens(systemPrompt, prompt, userContext + assistantContext);
|
| 300 |
-
const dynamicMaxTokens = calculateMaxTokens(selectedProvider, estimatedInputTokens, false);
|
| 301 |
-
const providerConfig = getProviderSpecificConfig(selectedProvider, dynamicMaxTokens);
|
| 302 |
-
|
| 303 |
const chatCompletion = client.chatCompletionStream(
|
| 304 |
{
|
| 305 |
model: selectedModel.value,
|
| 306 |
-
provider: selectedProvider
|
| 307 |
messages: [
|
| 308 |
{
|
| 309 |
role: "system",
|
|
@@ -322,7 +320,6 @@ export async function PUT(request: NextRequest) {
|
|
| 322 |
content: prompt,
|
| 323 |
},
|
| 324 |
],
|
| 325 |
-
...providerConfig,
|
| 326 |
},
|
| 327 |
billTo ? { billTo } : {}
|
| 328 |
);
|
|
|
|
| 7 |
import { MODELS } from "@/lib/providers";
|
| 8 |
import {
|
| 9 |
FOLLOW_UP_SYSTEM_PROMPT,
|
| 10 |
+
FOLLOW_UP_SYSTEM_PROMPT_LIGHT,
|
| 11 |
INITIAL_SYSTEM_PROMPT,
|
| 12 |
+
INITIAL_SYSTEM_PROMPT_LIGHT,
|
| 13 |
MAX_REQUESTS_PER_IP,
|
| 14 |
PROMPT_FOR_PROJECT_NAME,
|
| 15 |
} from "@/lib/prompts";
|
|
|
|
| 16 |
import MY_TOKEN_KEY from "@/lib/get-cookie-name";
|
| 17 |
import { Page } from "@/types";
|
| 18 |
import { isAuthenticated } from "@/lib/auth";
|
|
|
|
| 101 |
});
|
| 102 |
|
| 103 |
(async () => {
|
|
|
|
| 104 |
try {
|
| 105 |
const client = new InferenceClient(token);
|
| 106 |
|
| 107 |
+
// Use light prompt for MiniMax model
|
| 108 |
+
const systemPrompt = selectedModel.value.includes('MiniMax')
|
| 109 |
+
? INITIAL_SYSTEM_PROMPT_LIGHT
|
| 110 |
+
: INITIAL_SYSTEM_PROMPT;
|
| 111 |
|
| 112 |
const userPrompt = rewrittenPrompt;
|
|
|
|
|
|
|
|
|
|
| 113 |
|
| 114 |
const chatCompletion = client.chatCompletionStream(
|
| 115 |
{
|
| 116 |
model: selectedModel.value,
|
| 117 |
+
provider: selectedProvider,
|
| 118 |
messages: [
|
| 119 |
{
|
| 120 |
role: "system",
|
|
|
|
| 127 |
3. I want to use the following theme: ${enhancedSettings.theme} mode.` : "")
|
| 128 |
},
|
| 129 |
],
|
|
|
|
| 130 |
},
|
| 131 |
billTo ? { billTo } : {}
|
| 132 |
);
|
|
|
|
| 282 |
try {
|
| 283 |
const client = new InferenceClient(token);
|
| 284 |
|
| 285 |
+
const basePrompt = selectedModel.value.includes('MiniMax')
|
| 286 |
+
? FOLLOW_UP_SYSTEM_PROMPT_LIGHT
|
| 287 |
+
: FOLLOW_UP_SYSTEM_PROMPT;
|
| 288 |
+
const systemPrompt = basePrompt + (isNew ? PROMPT_FOR_PROJECT_NAME : "");
|
| 289 |
const userContext = "You are modifying the HTML file based on the user's request.";
|
| 290 |
|
| 291 |
const allPages = pages || [];
|
|
|
|
| 298 |
: ""
|
| 299 |
}. Current pages (${allPages.length} total): ${pagesContext}. ${files?.length > 0 ? `Available images: ${files?.map((f: string) => f).join(', ')}.` : ""}`;
|
| 300 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 301 |
const chatCompletion = client.chatCompletionStream(
|
| 302 |
{
|
| 303 |
model: selectedModel.value,
|
| 304 |
+
provider: selectedProvider,
|
| 305 |
messages: [
|
| 306 |
{
|
| 307 |
role: "system",
|
|
|
|
| 320 |
content: prompt,
|
| 321 |
},
|
| 322 |
],
|
|
|
|
| 323 |
},
|
| 324 |
billTo ? { billTo } : {}
|
| 325 |
);
|
lib/best-provider.ts
CHANGED
|
@@ -3,18 +3,13 @@ export const getBestProvider = async (model: string, provider?: string) => {
|
|
| 3 |
const { data } = await response.json()
|
| 4 |
let bestProvider = null;
|
| 5 |
if (provider === "auto") {
|
| 6 |
-
|
| 7 |
-
if (a.status === "live" && b.status !== "live") return -1
|
| 8 |
-
if (a.status !== "live" && b.status === "live") return 1
|
| 9 |
-
return a?.pricing?.output - b?.pricing?.output + a?.pricing?.input - b?.pricing?.input
|
| 10 |
-
})
|
| 11 |
-
bestProvider = sortedProviders[0]
|
| 12 |
} else {
|
| 13 |
const providerData = data.providers.find((p: any) => p.provider === provider)
|
| 14 |
if (providerData?.status === "live") {
|
| 15 |
-
bestProvider = providerData
|
| 16 |
} else {
|
| 17 |
-
bestProvider =
|
| 18 |
}
|
| 19 |
}
|
| 20 |
|
|
|
|
| 3 |
const { data } = await response.json()
|
| 4 |
let bestProvider = null;
|
| 5 |
if (provider === "auto") {
|
| 6 |
+
return "auto";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 7 |
} else {
|
| 8 |
const providerData = data.providers.find((p: any) => p.provider === provider)
|
| 9 |
if (providerData?.status === "live") {
|
| 10 |
+
bestProvider = providerData.provider;
|
| 11 |
} else {
|
| 12 |
+
bestProvider = "auto"
|
| 13 |
}
|
| 14 |
}
|
| 15 |
|
lib/prompts.ts
CHANGED
|
@@ -15,79 +15,168 @@ export const PROMPT_FOR_IMAGE_GENERATION = `If you want to use image placeholder
|
|
| 15 |
Examples: http://static.photos/red/320x240/133 (red-themed with seed 133), http://static.photos/640x360 (random category and image), http://static.photos/nature/1200x630/42 (nature-themed with seed 42).`
|
| 16 |
export const PROMPT_FOR_PROJECT_NAME = `REQUIRED: Generate a name for the project, based on the user's request. Try to be creative and unique. Add a emoji at the end of the name. It should be short, like 6 words. Be fancy, creative and funny. DON'T FORGET IT, IT'S IMPORTANT!`
|
| 17 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 18 |
export const INITIAL_SYSTEM_PROMPT = `You are an expert UI/UX and Front-End Developer.
|
| 19 |
You create website in a way a designer would, using ONLY HTML, CSS and Javascript.
|
| 20 |
Try to create the best UI possible. Important: Make the website responsive by using TailwindCSS. Use it as much as you can, if you can't use it, use custom css (make sure to import tailwind with <script src="https://cdn.tailwindcss.com"></script> in the head).
|
| 21 |
Also try to elaborate as much as you can, to create something unique, with a great design.
|
| 22 |
If you want to use ICONS import Feather Icons (Make sure to add <script src="https://unpkg.com/feather-icons"></script> and <script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script> in the head., and <script>feather.replace();</script> in the body. Ex : <i data-feather="user"></i>).
|
| 23 |
-
For interactive animations you can use: Vanta.js (Make sure to add <script src="https://cdn.jsdelivr.net/npm/vanta@latest/dist/vanta.globe.min.js"></script> and <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script> and <script>VANTA.GLOBE({...</script> in the body.).
|
| 24 |
Don't hesitate to use real public API for the datas, you can find good ones here https://github.com/public-apis/public-apis depending on what the user asks for.
|
| 25 |
You can create multiple pages website at once (following the format rules below) or a Single Page Application. But make sure to create multiple pages if the user asks for different pages.
|
| 26 |
IMPORTANT: To avoid duplicate code across pages, you MUST create separate style.css and script.js files for shared CSS and JavaScript code. Each HTML file should link to these files using <link rel="stylesheet" href="style.css"> and <script src="script.js"></script>.
|
| 27 |
WEB COMPONENTS: For reusable UI elements like navbars, footers, sidebars, headers, etc., create Native Web Components as separate files in components/ folder:
|
| 28 |
-
- Create each component as a separate .js file in components/ folder (e.g., components/
|
| 29 |
- Each component file defines a class extending HTMLElement and registers it with customElements.define()
|
| 30 |
- Use Shadow DOM for style encapsulation
|
| 31 |
- Components render using template literals with inline styles
|
| 32 |
-
- Include component files in HTML before using them: <script src="components/
|
| 33 |
-
- Use them in HTML pages with custom element tags (e.g., <custom-
|
| 34 |
- If you want to use ICON you can use Feather Icons, as it's already included in the main pages.
|
| 35 |
IMPORTANT: NEVER USE ONCLICK FUNCTION TO MAKE A REDIRECT TO NEW PAGE. MAKE SURE TO ALWAYS USE <a href=""/>, OTHERWISE IT WONT WORK WITH SHADOW ROOT AND WEB COMPONENTS.
|
| 36 |
-
Example components/
|
| 37 |
-
class
|
| 38 |
-
connectedCallback() {
|
| 39 |
-
this.attachShadow({ mode: 'open' });
|
| 40 |
-
this.shadowRoot.innerHTML = \`
|
| 41 |
-
<style>
|
| 42 |
-
nav {
|
| 43 |
-
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
| 44 |
-
padding: 1rem;
|
| 45 |
-
display: flex;
|
| 46 |
-
justify-content: space-between;
|
| 47 |
-
align-items: center;
|
| 48 |
-
}
|
| 49 |
-
.logo { color: white; font-weight: bold; }
|
| 50 |
-
ul { display: flex; gap: 1rem; list-style: none; margin: 0; padding: 0; }
|
| 51 |
-
a { color: white; text-decoration: none; }
|
| 52 |
-
</style>
|
| 53 |
-
<nav>
|
| 54 |
-
<div class="logo">My Website</div>
|
| 55 |
-
<ul>
|
| 56 |
-
<li><a href="/">Home</a></li>
|
| 57 |
-
<li><a href="/about.html">About</a></li>
|
| 58 |
-
</ul>
|
| 59 |
-
</nav>
|
| 60 |
-
\`;
|
| 61 |
-
}
|
| 62 |
-
}
|
| 63 |
-
customElements.define('custom-navbar', CustomNavbar);
|
| 64 |
-
|
| 65 |
-
Example components/footer.js:
|
| 66 |
-
class CustomFooter extends HTMLElement {
|
| 67 |
connectedCallback() {
|
| 68 |
this.attachShadow({ mode: 'open' });
|
| 69 |
this.shadowRoot.innerHTML = \`
|
| 70 |
<style>
|
| 71 |
-
|
| 72 |
-
background: #1a202c;
|
| 73 |
-
color: white;
|
| 74 |
-
padding: 2rem;
|
| 75 |
-
text-align: center;
|
| 76 |
-
}
|
| 77 |
</style>
|
| 78 |
-
<
|
| 79 |
-
<
|
| 80 |
-
</
|
| 81 |
\`;
|
| 82 |
}
|
| 83 |
}
|
| 84 |
-
customElements.define('custom-
|
| 85 |
-
|
| 86 |
Then in HTML, include the component scripts and use the tags:
|
| 87 |
-
<script src="components/
|
| 88 |
-
<
|
| 89 |
-
<custom-navbar></custom-navbar>
|
| 90 |
-
<custom-footer></custom-footer>
|
| 91 |
${PROMPT_FOR_IMAGE_GENERATION}
|
| 92 |
${PROMPT_FOR_PROJECT_NAME}
|
| 93 |
No need to explain what you did. Just return the expected result. AVOID Chinese characters in the code if not asked by the user.
|
|
@@ -96,15 +185,14 @@ Return the results following this format:
|
|
| 96 |
2. Add the name of the project, right after the start tag.
|
| 97 |
3. Close the start tag with the ${PROJECT_NAME_END}.
|
| 98 |
4. The name of the project should be short and concise.
|
| 99 |
-
5. Generate files in this ORDER: index.html FIRST, then style.css, then script.js, then web components
|
| 100 |
6. For each file, start with ${NEW_FILE_START}.
|
| 101 |
-
7. Add the file name
|
| 102 |
8. Close the start tag with the ${NEW_FILE_END}.
|
| 103 |
-
9. Start the file content with the triple backticks and appropriate language marker
|
| 104 |
10. Insert the file content there.
|
| 105 |
11. Close with the triple backticks, like \`\`\`.
|
| 106 |
12. Repeat for each file.
|
| 107 |
-
13. Web components should be in separate .js files in components/ folder and included via <script> tags before use.
|
| 108 |
Example Code:
|
| 109 |
${PROJECT_NAME_START} Project Name ${PROJECT_NAME_END}
|
| 110 |
${NEW_FILE_START}index.html${NEW_FILE_END}
|
|
@@ -122,83 +210,15 @@ ${NEW_FILE_START}index.html${NEW_FILE_END}
|
|
| 122 |
<script src="https://unpkg.com/feather-icons"></script>
|
| 123 |
</head>
|
| 124 |
<body>
|
| 125 |
-
|
| 126 |
-
|
| 127 |
-
<
|
| 128 |
-
<script src="components/navbar.js"></script>
|
| 129 |
-
<script src="components/footer.js"></script>
|
| 130 |
<script src="script.js"></script>
|
| 131 |
<script>feather.replace();</script>
|
| 132 |
</body>
|
| 133 |
</html>
|
| 134 |
\`\`\`
|
| 135 |
-
|
| 136 |
-
\`\`\`css
|
| 137 |
-
/* Shared styles across all pages */
|
| 138 |
-
body {
|
| 139 |
-
font-family: 'Inter', sans-serif;
|
| 140 |
-
}
|
| 141 |
-
\`\`\`
|
| 142 |
-
${NEW_FILE_START}script.js${NEW_FILE_END}
|
| 143 |
-
\`\`\`javascript
|
| 144 |
-
// Shared JavaScript across all pages
|
| 145 |
-
console.log('App loaded');
|
| 146 |
-
\`\`\`
|
| 147 |
-
${NEW_FILE_START}components/navbar.js${NEW_FILE_END}
|
| 148 |
-
\`\`\`javascript
|
| 149 |
-
class CustomNavbar extends HTMLElement {
|
| 150 |
-
connectedCallback() {
|
| 151 |
-
this.attachShadow({ mode: 'open' });
|
| 152 |
-
this.shadowRoot.innerHTML = \`
|
| 153 |
-
<style>
|
| 154 |
-
nav {
|
| 155 |
-
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
| 156 |
-
padding: 1rem;
|
| 157 |
-
display: flex;
|
| 158 |
-
justify-content: space-between;
|
| 159 |
-
align-items: center;
|
| 160 |
-
}
|
| 161 |
-
.logo { color: white; font-weight: bold; font-size: 1.25rem; }
|
| 162 |
-
ul { display: flex; gap: 1rem; list-style: none; margin: 0; padding: 0; }
|
| 163 |
-
a { color: white; text-decoration: none; transition: opacity 0.2s; }
|
| 164 |
-
a:hover { opacity: 0.8; }
|
| 165 |
-
</style>
|
| 166 |
-
<nav>
|
| 167 |
-
<div class="logo">My Website</div>
|
| 168 |
-
<ul>
|
| 169 |
-
<li><a href="/">Home</a></li>
|
| 170 |
-
<li><a href="/about.html">About</a></li>
|
| 171 |
-
</ul>
|
| 172 |
-
</nav>
|
| 173 |
-
\`;
|
| 174 |
-
}
|
| 175 |
-
}
|
| 176 |
-
customElements.define('custom-navbar', CustomNavbar);
|
| 177 |
-
\`\`\`
|
| 178 |
-
${NEW_FILE_START}components/footer.js${NEW_FILE_END}
|
| 179 |
-
\`\`\`javascript
|
| 180 |
-
class CustomFooter extends HTMLElement {
|
| 181 |
-
connectedCallback() {
|
| 182 |
-
this.attachShadow({ mode: 'open' });
|
| 183 |
-
this.shadowRoot.innerHTML = \`
|
| 184 |
-
<style>
|
| 185 |
-
footer {
|
| 186 |
-
background: #1a202c;
|
| 187 |
-
color: white;
|
| 188 |
-
padding: 2rem;
|
| 189 |
-
text-align: center;
|
| 190 |
-
margin-top: auto;
|
| 191 |
-
}
|
| 192 |
-
</style>
|
| 193 |
-
<footer>
|
| 194 |
-
<p>© 2024 My Website. All rights reserved.</p>
|
| 195 |
-
</footer>
|
| 196 |
-
\`;
|
| 197 |
-
}
|
| 198 |
-
}
|
| 199 |
-
customElements.define('custom-footer', CustomFooter);
|
| 200 |
-
\`\`\`
|
| 201 |
-
CRITICAL: The first file MUST always be index.html. Then generate style.css and script.js. If you create web components, place them in components/ folder as separate .js files. All HTML files MUST include <link rel="stylesheet" href="style.css"> and component scripts before using them (e.g., <script src="components/navbar.js"></script>), then <script src="script.js"></script>.`
|
| 202 |
|
| 203 |
export const FOLLOW_UP_SYSTEM_PROMPT = `You are an expert UI/UX and Front-End Developer modifying existing files (HTML, CSS, JavaScript).
|
| 204 |
The user wants to apply changes and probably add new features/pages/styles/scripts to the website, based on their request.
|
|
|
|
| 15 |
Examples: http://static.photos/red/320x240/133 (red-themed with seed 133), http://static.photos/640x360 (random category and image), http://static.photos/nature/1200x630/42 (nature-themed with seed 42).`
|
| 16 |
export const PROMPT_FOR_PROJECT_NAME = `REQUIRED: Generate a name for the project, based on the user's request. Try to be creative and unique. Add a emoji at the end of the name. It should be short, like 6 words. Be fancy, creative and funny. DON'T FORGET IT, IT'S IMPORTANT!`
|
| 17 |
|
| 18 |
+
export const INITIAL_SYSTEM_PROMPT_LIGHT = `You are an expert UI/UX and Front-End Developer.
|
| 19 |
+
No need to explain what you did. Just return the expected result.
|
| 20 |
+
Return the results following this format:
|
| 21 |
+
1. Start with ${PROJECT_NAME_START}.
|
| 22 |
+
2. Add the name of the project, right after the start tag.
|
| 23 |
+
3. Close the start tag with the ${PROJECT_NAME_END}.
|
| 24 |
+
4. The name of the project should be short and concise.
|
| 25 |
+
5. Generate files in this ORDER: index.html FIRST, then style.css, then script.js, then web components if needed.
|
| 26 |
+
6. For each file, start with ${NEW_FILE_START}.
|
| 27 |
+
7. Add the file name right after the start tag.
|
| 28 |
+
8. Close the start tag with the ${NEW_FILE_END}.
|
| 29 |
+
9. Start the file content with the triple backticks and appropriate language marker
|
| 30 |
+
10. Insert the file content there.
|
| 31 |
+
11. Close with the triple backticks, like \`\`\`.
|
| 32 |
+
12. Repeat for each file.
|
| 33 |
+
Example Code:
|
| 34 |
+
${PROJECT_NAME_START} Project Name ${PROJECT_NAME_END}
|
| 35 |
+
${NEW_FILE_START}index.html${NEW_FILE_END}
|
| 36 |
+
\`\`\`html
|
| 37 |
+
<!DOCTYPE html>
|
| 38 |
+
<html lang="en">
|
| 39 |
+
<head>
|
| 40 |
+
<meta charset="UTF-8">
|
| 41 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 42 |
+
<title>Index</title>
|
| 43 |
+
<link rel="icon" type="image/x-icon" href="/static/favicon.ico">
|
| 44 |
+
<link rel="stylesheet" href="style.css">
|
| 45 |
+
<script src="https://cdn.tailwindcss.com"></script>
|
| 46 |
+
<script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
|
| 47 |
+
<script src="https://unpkg.com/feather-icons"></script>
|
| 48 |
+
</head>
|
| 49 |
+
<body>
|
| 50 |
+
<h1>Hello World</h1>
|
| 51 |
+
<custom-example></custom-example>
|
| 52 |
+
<script src="components/example.js"></script>
|
| 53 |
+
<script src="script.js"></script>
|
| 54 |
+
<script>feather.replace();</script>
|
| 55 |
+
</body>
|
| 56 |
+
</html>
|
| 57 |
+
\`\`\`
|
| 58 |
+
CRITICAL: The first file MUST always be index.html.`
|
| 59 |
+
|
| 60 |
+
export const FOLLOW_UP_SYSTEM_PROMPT_LIGHT = `You are an expert UI/UX and Front-End Developer modifying existing files (HTML, CSS, JavaScript).
|
| 61 |
+
You MUST output ONLY the changes required using the following UPDATE_FILE_START and SEARCH/REPLACE format. Do NOT output the entire file.
|
| 62 |
+
Do NOT explain the changes or what you did, just return the expected results.
|
| 63 |
+
Update Format Rules:
|
| 64 |
+
1. Start with ${PROJECT_NAME_START}.
|
| 65 |
+
2. Add the name of the project, right after the start tag.
|
| 66 |
+
3. Close the start tag with the ${PROJECT_NAME_END}.
|
| 67 |
+
4. Start with ${UPDATE_FILE_START}
|
| 68 |
+
5. Provide the name of the file you are modifying (index.html, style.css, script.js, etc.).
|
| 69 |
+
6. Close the start tag with the ${UPDATE_FILE_END}.
|
| 70 |
+
7. Start with ${SEARCH_START}
|
| 71 |
+
8. Provide the exact lines from the current code that need to be replaced.
|
| 72 |
+
9. Use ${DIVIDER} to separate the search block from the replacement.
|
| 73 |
+
10. Provide the new lines that should replace the original lines.
|
| 74 |
+
11. End with ${REPLACE_END}
|
| 75 |
+
12. You can use multiple SEARCH/REPLACE blocks if changes are needed in different parts of the file.
|
| 76 |
+
13. To insert code, use an empty SEARCH block (only ${SEARCH_START} and ${DIVIDER} on their lines) if inserting at the very beginning, otherwise provide the line *before* the insertion point in the SEARCH block and include that line plus the new lines in the REPLACE block.
|
| 77 |
+
14. To delete code, provide the lines to delete in the SEARCH block and leave the REPLACE block empty (only ${DIVIDER} and ${REPLACE_END} on their lines).
|
| 78 |
+
15. IMPORTANT: The SEARCH block must *exactly* match the current code, including indentation and whitespace.
|
| 79 |
+
Example Modifying Code:
|
| 80 |
+
\`\`\`
|
| 81 |
+
${PROJECT_NAME_START} Project Name ${PROJECT_NAME_END}
|
| 82 |
+
${UPDATE_FILE_START}index.html${UPDATE_FILE_END}
|
| 83 |
+
${SEARCH_START}
|
| 84 |
+
<h1>Old Title</h1>
|
| 85 |
+
${DIVIDER}
|
| 86 |
+
<h1>New Title</h1>
|
| 87 |
+
${REPLACE_END}
|
| 88 |
+
${SEARCH_START}
|
| 89 |
+
</body>
|
| 90 |
+
${DIVIDER}
|
| 91 |
+
<script src="script.js"></script>
|
| 92 |
+
</body>
|
| 93 |
+
${REPLACE_END}
|
| 94 |
+
\`\`\`
|
| 95 |
+
Example Updating CSS:
|
| 96 |
+
\`\`\`
|
| 97 |
+
${UPDATE_FILE_START}style.css${UPDATE_FILE_END}
|
| 98 |
+
${SEARCH_START}
|
| 99 |
+
body {
|
| 100 |
+
background: white;
|
| 101 |
+
}
|
| 102 |
+
${DIVIDER}
|
| 103 |
+
body {
|
| 104 |
+
background: linear-gradient(to right, #667eea, #764ba2);
|
| 105 |
+
}
|
| 106 |
+
${REPLACE_END}
|
| 107 |
+
\`\`\`
|
| 108 |
+
Example Deleting Code:
|
| 109 |
+
\`\`\`
|
| 110 |
+
${UPDATE_FILE_START}index.html${UPDATE_FILE_END}
|
| 111 |
+
${SEARCH_START}
|
| 112 |
+
<p>This paragraph will be deleted.</p>
|
| 113 |
+
${DIVIDER}
|
| 114 |
+
${REPLACE_END}
|
| 115 |
+
\`\`\`
|
| 116 |
+
For creating new files, use the following format:
|
| 117 |
+
1. Start with ${NEW_FILE_START}.
|
| 118 |
+
2. Add the name of the file (e.g., about.html, style.css, script.js, components/navbar.js), right after the start tag.
|
| 119 |
+
3. Close the start tag with the ${NEW_FILE_END}.
|
| 120 |
+
4. Start the file content with the triple backticks and appropriate language marker (\`\`\`html, \`\`\`css, or \`\`\`javascript).
|
| 121 |
+
5. Insert the file content there.
|
| 122 |
+
6. Close with the triple backticks, like \`\`\`.
|
| 123 |
+
7. Repeat for additional files.
|
| 124 |
+
Example Creating New HTML Page:
|
| 125 |
+
${NEW_FILE_START}about.html${NEW_FILE_END}
|
| 126 |
+
\`\`\`html
|
| 127 |
+
<!DOCTYPE html>
|
| 128 |
+
<html lang="en">
|
| 129 |
+
<head>
|
| 130 |
+
<meta charset="UTF-8">
|
| 131 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 132 |
+
<title>About</title>
|
| 133 |
+
<link rel="icon" type="image/x-icon" href="/static/favicon.ico">
|
| 134 |
+
<link rel="stylesheet" href="style.css">
|
| 135 |
+
<script src="https://cdn.tailwindcss.com"></script>
|
| 136 |
+
</head>
|
| 137 |
+
<body>
|
| 138 |
+
<h1>About Page</h1>
|
| 139 |
+
<script src="script.js"></script>
|
| 140 |
+
</body>
|
| 141 |
+
</html>
|
| 142 |
+
\`\`\`
|
| 143 |
+
No need to explain what you did. Just return the expected result.`
|
| 144 |
+
|
| 145 |
export const INITIAL_SYSTEM_PROMPT = `You are an expert UI/UX and Front-End Developer.
|
| 146 |
You create website in a way a designer would, using ONLY HTML, CSS and Javascript.
|
| 147 |
Try to create the best UI possible. Important: Make the website responsive by using TailwindCSS. Use it as much as you can, if you can't use it, use custom css (make sure to import tailwind with <script src="https://cdn.tailwindcss.com"></script> in the head).
|
| 148 |
Also try to elaborate as much as you can, to create something unique, with a great design.
|
| 149 |
If you want to use ICONS import Feather Icons (Make sure to add <script src="https://unpkg.com/feather-icons"></script> and <script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script> in the head., and <script>feather.replace();</script> in the body. Ex : <i data-feather="user"></i>).
|
|
|
|
| 150 |
Don't hesitate to use real public API for the datas, you can find good ones here https://github.com/public-apis/public-apis depending on what the user asks for.
|
| 151 |
You can create multiple pages website at once (following the format rules below) or a Single Page Application. But make sure to create multiple pages if the user asks for different pages.
|
| 152 |
IMPORTANT: To avoid duplicate code across pages, you MUST create separate style.css and script.js files for shared CSS and JavaScript code. Each HTML file should link to these files using <link rel="stylesheet" href="style.css"> and <script src="script.js"></script>.
|
| 153 |
WEB COMPONENTS: For reusable UI elements like navbars, footers, sidebars, headers, etc., create Native Web Components as separate files in components/ folder:
|
| 154 |
+
- Create each component as a separate .js file in components/ folder (e.g., components/example.js)
|
| 155 |
- Each component file defines a class extending HTMLElement and registers it with customElements.define()
|
| 156 |
- Use Shadow DOM for style encapsulation
|
| 157 |
- Components render using template literals with inline styles
|
| 158 |
+
- Include component files in HTML before using them: <script src="components/example.js"></script>
|
| 159 |
+
- Use them in HTML pages with custom element tags (e.g., <custom-example></custom-example>)
|
| 160 |
- If you want to use ICON you can use Feather Icons, as it's already included in the main pages.
|
| 161 |
IMPORTANT: NEVER USE ONCLICK FUNCTION TO MAKE A REDIRECT TO NEW PAGE. MAKE SURE TO ALWAYS USE <a href=""/>, OTHERWISE IT WONT WORK WITH SHADOW ROOT AND WEB COMPONENTS.
|
| 162 |
+
Example components/example.js:
|
| 163 |
+
class CustomExample extends HTMLElement {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 164 |
connectedCallback() {
|
| 165 |
this.attachShadow({ mode: 'open' });
|
| 166 |
this.shadowRoot.innerHTML = \`
|
| 167 |
<style>
|
| 168 |
+
/* Add your styles here */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 169 |
</style>
|
| 170 |
+
<div>
|
| 171 |
+
<h1>Example Component</h1>
|
| 172 |
+
</div>
|
| 173 |
\`;
|
| 174 |
}
|
| 175 |
}
|
| 176 |
+
customElements.define('custom-example', CustomExample);
|
|
|
|
| 177 |
Then in HTML, include the component scripts and use the tags:
|
| 178 |
+
<script src="components/example.js"></script>
|
| 179 |
+
<custom-example></custom-example>
|
|
|
|
|
|
|
| 180 |
${PROMPT_FOR_IMAGE_GENERATION}
|
| 181 |
${PROMPT_FOR_PROJECT_NAME}
|
| 182 |
No need to explain what you did. Just return the expected result. AVOID Chinese characters in the code if not asked by the user.
|
|
|
|
| 185 |
2. Add the name of the project, right after the start tag.
|
| 186 |
3. Close the start tag with the ${PROJECT_NAME_END}.
|
| 187 |
4. The name of the project should be short and concise.
|
| 188 |
+
5. Generate files in this ORDER: index.html FIRST, then style.css, then script.js, then web components if needed.
|
| 189 |
6. For each file, start with ${NEW_FILE_START}.
|
| 190 |
+
7. Add the file name right after the start tag.
|
| 191 |
8. Close the start tag with the ${NEW_FILE_END}.
|
| 192 |
+
9. Start the file content with the triple backticks and appropriate language marker
|
| 193 |
10. Insert the file content there.
|
| 194 |
11. Close with the triple backticks, like \`\`\`.
|
| 195 |
12. Repeat for each file.
|
|
|
|
| 196 |
Example Code:
|
| 197 |
${PROJECT_NAME_START} Project Name ${PROJECT_NAME_END}
|
| 198 |
${NEW_FILE_START}index.html${NEW_FILE_END}
|
|
|
|
| 210 |
<script src="https://unpkg.com/feather-icons"></script>
|
| 211 |
</head>
|
| 212 |
<body>
|
| 213 |
+
<h1>Hello World</h1>
|
| 214 |
+
<custom-example></custom-example>
|
| 215 |
+
<script src="components/example.js"></script>
|
|
|
|
|
|
|
| 216 |
<script src="script.js"></script>
|
| 217 |
<script>feather.replace();</script>
|
| 218 |
</body>
|
| 219 |
</html>
|
| 220 |
\`\`\`
|
| 221 |
+
CRITICAL: The first file MUST always be index.html.`
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 222 |
|
| 223 |
export const FOLLOW_UP_SYSTEM_PROMPT = `You are an expert UI/UX and Front-End Developer modifying existing files (HTML, CSS, JavaScript).
|
| 224 |
The user wants to apply changes and probably add new features/pages/styles/scripts to the website, based on their request.
|