Spaces:
Running
Running
remove comment
Browse files- app/api/ask/route.ts +3 -12
- middleware.ts +1 -13
app/api/ask/route.ts
CHANGED
|
@@ -292,17 +292,15 @@ export async function PUT(request: NextRequest) {
|
|
| 292 |
|
| 293 |
const client = new InferenceClient(token);
|
| 294 |
|
| 295 |
-
// Helper function to escape regex special characters
|
| 296 |
const escapeRegExp = (string: string) => {
|
| 297 |
return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
| 298 |
};
|
| 299 |
|
| 300 |
-
// Helper function to create flexible HTML regex that handles varying spaces
|
| 301 |
const createFlexibleHtmlRegex = (searchBlock: string) => {
|
| 302 |
let searchRegex = escapeRegExp(searchBlock)
|
| 303 |
-
.replace(/\s+/g, '\\s*')
|
| 304 |
-
.replace(/>\s*</g, '>\\s*<')
|
| 305 |
-
.replace(/\s*>/g, '\\s*>');
|
| 306 |
|
| 307 |
return new RegExp(searchRegex, 'g');
|
| 308 |
};
|
|
@@ -310,19 +308,15 @@ export async function PUT(request: NextRequest) {
|
|
| 310 |
const selectedProvider = await getBestProvider(selectedModel.value, provider)
|
| 311 |
|
| 312 |
try {
|
| 313 |
-
// Calculate dynamic max_tokens for PUT request
|
| 314 |
const systemPrompt = FOLLOW_UP_SYSTEM_PROMPT + (isNew ? PROMPT_FOR_PROJECT_NAME : "");
|
| 315 |
const userContext = "You are modifying the HTML file based on the user's request.";
|
| 316 |
|
| 317 |
-
// Helper function to get only the most relevant pages based on prompt
|
| 318 |
const getRelevantPages = (pages: Page[], prompt: string, maxPages: number = 2): Page[] => {
|
| 319 |
if (pages.length <= maxPages) return pages;
|
| 320 |
|
| 321 |
-
// Always include index/main page
|
| 322 |
const indexPage = pages.find(p => p.path === '/' || p.path === '/index' || p.path === 'index');
|
| 323 |
const otherPages = pages.filter(p => p !== indexPage);
|
| 324 |
|
| 325 |
-
// If we have a selected element, only include pages that might contain it
|
| 326 |
if (selectedElementHtml) {
|
| 327 |
const elementKeywords = selectedElementHtml.toLowerCase().match(/class=["']([^"']*)["']|id=["']([^"']*)["']/g) || [];
|
| 328 |
const relevantPages = otherPages.filter(page => {
|
|
@@ -333,7 +327,6 @@ export async function PUT(request: NextRequest) {
|
|
| 333 |
return indexPage ? [indexPage, ...relevantPages.slice(0, maxPages - 1)] : relevantPages.slice(0, maxPages);
|
| 334 |
}
|
| 335 |
|
| 336 |
-
// Score pages based on keyword matches from prompt
|
| 337 |
const keywords = prompt.toLowerCase().split(/\s+/).filter(word => word.length > 3);
|
| 338 |
const scoredPages = otherPages.map(page => {
|
| 339 |
const pageContent = (page.path + ' ' + page.html).toLowerCase();
|
|
@@ -343,7 +336,6 @@ export async function PUT(request: NextRequest) {
|
|
| 343 |
return { page, score };
|
| 344 |
});
|
| 345 |
|
| 346 |
-
// Sort by relevance and take top pages
|
| 347 |
const topPages = scoredPages
|
| 348 |
.sort((a, b) => b.score - a.score)
|
| 349 |
.slice(0, maxPages - (indexPage ? 1 : 0))
|
|
@@ -352,7 +344,6 @@ export async function PUT(request: NextRequest) {
|
|
| 352 |
return indexPage ? [indexPage, ...topPages] : topPages;
|
| 353 |
};
|
| 354 |
|
| 355 |
-
// Get only the most relevant pages - provide FULL HTML for accurate replacements
|
| 356 |
const relevantPages = getRelevantPages(pages || [], prompt);
|
| 357 |
const pagesContext = relevantPages
|
| 358 |
.map((p: Page) => `- ${p.path}\n${p.html}`)
|
|
|
|
| 292 |
|
| 293 |
const client = new InferenceClient(token);
|
| 294 |
|
|
|
|
| 295 |
const escapeRegExp = (string: string) => {
|
| 296 |
return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
| 297 |
};
|
| 298 |
|
|
|
|
| 299 |
const createFlexibleHtmlRegex = (searchBlock: string) => {
|
| 300 |
let searchRegex = escapeRegExp(searchBlock)
|
| 301 |
+
.replace(/\s+/g, '\\s*')
|
| 302 |
+
.replace(/>\s*</g, '>\\s*<')
|
| 303 |
+
.replace(/\s*>/g, '\\s*>');
|
| 304 |
|
| 305 |
return new RegExp(searchRegex, 'g');
|
| 306 |
};
|
|
|
|
| 308 |
const selectedProvider = await getBestProvider(selectedModel.value, provider)
|
| 309 |
|
| 310 |
try {
|
|
|
|
| 311 |
const systemPrompt = FOLLOW_UP_SYSTEM_PROMPT + (isNew ? PROMPT_FOR_PROJECT_NAME : "");
|
| 312 |
const userContext = "You are modifying the HTML file based on the user's request.";
|
| 313 |
|
|
|
|
| 314 |
const getRelevantPages = (pages: Page[], prompt: string, maxPages: number = 2): Page[] => {
|
| 315 |
if (pages.length <= maxPages) return pages;
|
| 316 |
|
|
|
|
| 317 |
const indexPage = pages.find(p => p.path === '/' || p.path === '/index' || p.path === 'index');
|
| 318 |
const otherPages = pages.filter(p => p !== indexPage);
|
| 319 |
|
|
|
|
| 320 |
if (selectedElementHtml) {
|
| 321 |
const elementKeywords = selectedElementHtml.toLowerCase().match(/class=["']([^"']*)["']|id=["']([^"']*)["']/g) || [];
|
| 322 |
const relevantPages = otherPages.filter(page => {
|
|
|
|
| 327 |
return indexPage ? [indexPage, ...relevantPages.slice(0, maxPages - 1)] : relevantPages.slice(0, maxPages);
|
| 328 |
}
|
| 329 |
|
|
|
|
| 330 |
const keywords = prompt.toLowerCase().split(/\s+/).filter(word => word.length > 3);
|
| 331 |
const scoredPages = otherPages.map(page => {
|
| 332 |
const pageContent = (page.path + ' ' + page.html).toLowerCase();
|
|
|
|
| 336 |
return { page, score };
|
| 337 |
});
|
| 338 |
|
|
|
|
| 339 |
const topPages = scoredPages
|
| 340 |
.sort((a, b) => b.score - a.score)
|
| 341 |
.slice(0, maxPages - (indexPage ? 1 : 0))
|
|
|
|
| 344 |
return indexPage ? [indexPage, ...topPages] : topPages;
|
| 345 |
};
|
| 346 |
|
|
|
|
| 347 |
const relevantPages = getRelevantPages(pages || [], prompt);
|
| 348 |
const pagesContext = relevantPages
|
| 349 |
.map((p: Page) => `- ${p.path}\n${p.html}`)
|
middleware.ts
CHANGED
|
@@ -5,23 +5,11 @@ export function middleware(request: NextRequest) {
|
|
| 5 |
const headers = new Headers(request.headers);
|
| 6 |
headers.set("x-current-host", request.nextUrl.host);
|
| 7 |
|
| 8 |
-
// Create response with headers
|
| 9 |
const response = NextResponse.next({ headers });
|
| 10 |
-
|
| 11 |
-
// Add SEO and security headers
|
| 12 |
-
// Only set X-Frame-Options for non-HF spaces domains
|
| 13 |
-
// if (!request.nextUrl.host.includes('hf.space') && !request.nextUrl.host.includes('huggingface.co') && !request.nextUrl.host.includes('hf.co')) {
|
| 14 |
-
// response.headers.set('X-Frame-Options', 'SAMEORIGIN');
|
| 15 |
-
// }
|
| 16 |
-
// response.headers.set('X-Content-Type-Options', 'nosniff');
|
| 17 |
-
// response.headers.set('Referrer-Policy', 'strict-origin-when-cross-origin');
|
| 18 |
-
|
| 19 |
-
// Add cache control for better performance
|
| 20 |
if (request.nextUrl.pathname.startsWith('/_next/static')) {
|
| 21 |
response.headers.set('Cache-Control', 'public, max-age=31536000, immutable');
|
| 22 |
}
|
| 23 |
-
|
| 24 |
-
// Add canonical URL headers for programmatic access
|
| 25 |
response.headers.set('X-Canonical-URL', `https://deepsite.hf.co${request.nextUrl.pathname}`);
|
| 26 |
|
| 27 |
return response;
|
|
|
|
| 5 |
const headers = new Headers(request.headers);
|
| 6 |
headers.set("x-current-host", request.nextUrl.host);
|
| 7 |
|
|
|
|
| 8 |
const response = NextResponse.next({ headers });
|
| 9 |
+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 10 |
if (request.nextUrl.pathname.startsWith('/_next/static')) {
|
| 11 |
response.headers.set('Cache-Control', 'public, max-age=31536000, immutable');
|
| 12 |
}
|
|
|
|
|
|
|
| 13 |
response.headers.set('X-Canonical-URL', `https://deepsite.hf.co${request.nextUrl.pathname}`);
|
| 14 |
|
| 15 |
return response;
|