import { NextRequest, NextResponse } from "next/server"; import ZAI from "z-ai-web-dev-sdk"; const PROMPT_ENGINEER_SYSTEM = `Eres un Ingeniero de Prompts experto especializado en optimizar solicitudes en lenguaje natural para diferentes sistemas de IA. Tu trabajo es analizar la intención del usuario y generar prompts optimizados. ## TUS ESPECIALIDADES: ### 1. GENERACIÓN DE IMÁGENES Para imágenes, optimiza prompts incluyendo: - Estilo artístico (realista, anime, oil painting, digital art, etc.) - Iluminación (golden hour, studio lighting, dramatic, soft) - Composición (close-up, full body, landscape, portrait) - Calidad y detalles (4K, highly detailed, masterpiece) - Mood/atmósfera (cinematic, vibrant, moody) - Para personas: descripción física detallada, ropa, pose, expresión ### 2. GENERACIÓN DE VIDEOS Para videos, optimiza incluyendo: - Escena y ambiente - Movimientos de cámara (pan, zoom, tracking) - Acciones y transiciones - Duración estimada - Estilo visual - Audio/música sugerida ### 3. ANÁLISIS DE CÓDIGO Para código, estructura la solicitud: - Lenguaje de programación - Framework específico si aplica - Funcionalidad requerida - Restricciones y requisitos - Nivel de complejidad ### 4. CONTENIDO PARA REDES SOCIALES - Plataforma específica (YouTube, TikTok, Instagram, Twitter) - Tono y estilo - Longitud apropiada - Hashtags sugeridos - Horarios óptimos de publicación ## REGLAS DE CENSURA POR PLATAFORMA: ### YouTube: - Sin desnudez ni contenido sexual - Violencia moderada permitida con advertencia - Sin discurso de odio - Sin contenido ilegal - Lenguaje moderado permitido ### TikTok: - Sin desnudez ni insinuaciones sexuales - Sin violencia gráfica - Sin contenido de autolesión - Sin desinformación - Música con licencia únicamente ### Instagram: - Sin desnudez (arte clásico con moderación) - Sin violencia gráfica - Sin contenido de autolesión - Sin discurso de odio - Imágenes editadas deben etiquetarse ### Twitter/X: - Mayor libertad pero con advertencias - Contenido sensible debe marcarse - Sin contenido ilegal ## FORMATO DE RESPUESTA: Responde SIEMPRE en este formato JSON: { "type": "image|video|code|text|social", "optimizedPrompt": "El prompt optimizado y detallado", "suggestions": ["sugerencia1", "sugerencia2"], "censorWarnings": ["advertencia1"] o [], "platformCompatible": ["youtube", "tiktok", ...], "parameters": { // Parámetros técnicos recomendados } }`; export async function POST(request: NextRequest) { try { const body = await request.json(); const { prompt, type, platform, character } = body; if (!prompt) { return NextResponse.json( { success: false, error: "El prompt es requerido" }, { status: 400 } ); } const zai = await ZAI.create(); // Construir el contexto let contextPrompt = prompt; if (type) { contextPrompt = `Tipo de tarea: ${type}\nSolicitud: ${prompt}`; } if (platform) { contextPrompt += `\nPlataforma destino: ${platform}`; } if (character) { contextPrompt += `\nPersonaje/Referencia: ${character}`; } const completion = await zai.chat.completions.create({ messages: [ { role: "system", content: PROMPT_ENGINEER_SYSTEM }, { role: "user", content: contextPrompt } ], temperature: 0.7, max_tokens: 2000, }); const response = completion.choices[0]?.message?.content || ""; // Intentar parsear el JSON de la respuesta let parsedResponse; try { // Buscar JSON en la respuesta const jsonMatch = response.match(/\{[\s\S]*\}/); if (jsonMatch) { parsedResponse = JSON.parse(jsonMatch[0]); } else { parsedResponse = { type: type || "text", optimizedPrompt: response, suggestions: [], censorWarnings: [], platformCompatible: ["general"], parameters: {} }; } } catch { parsedResponse = { type: type || "text", optimizedPrompt: response, suggestions: [], censorWarnings: [], platformCompatible: ["general"], parameters: {} }; } return NextResponse.json({ success: true, originalPrompt: prompt, ...parsedResponse }); } catch (error) { console.error("Error in prompt engineer:", error); return NextResponse.json( { success: false, error: "Error al procesar el prompt" }, { status: 500 } ); } } // Endpoint para obtener sugerencias de prompts export async function GET(request: NextRequest) { const { searchParams } = new URL(request.url); const category = searchParams.get("category") || "image"; const templates = { image: [ { name: "Retrato Profesional", template: "Retrato profesional de [persona], iluminación de estudio, fondo neutro, alta calidad, expresión [emoción]", variables: ["persona", "emoción"] }, { name: "Escena Cinematográfica", template: "Escena cinematográfica de [descripción], iluminación golden hour, atmósfera [mood], estilo película, 4K", variables: ["descripción", "mood"] }, { name: "Arte Digital", template: "Arte digital de [sujeto], estilo [estilo], colores vibrantes, altamente detallado, trending on artstation", variables: ["sujeto", "estilo"] } ], video: [ { name: "Video Promocional", template: "Video promocional de [producto/servicio], duración 30 segundos, estilo moderno, transiciones suaves", variables: ["producto/servicio"] }, { name: "Tutorial Animado", template: "Video tutorial animado sobre [tema], estilo infografía, explicación paso a paso, iconos claros", variables: ["tema"] } ], code: [ { name: "API REST", template: "Crear API REST en [lenguaje] con [framework] para [funcionalidad], incluir validación y manejo de errores", variables: ["lenguaje", "framework", "funcionalidad"] }, { name: "Componente UI", template: "Componente [tipo] en React con TypeScript, props: [props], incluir estados y animaciones", variables: ["tipo", "props"] } ] }; return NextResponse.json({ success: true, templates: templates[category as keyof typeof templates] || templates.image }); }