3 | Haz brillar el copywritting de tu pagina
4 | web.
5 |
6 |
7 |
8 | Transforma el contenido de tu pagina web con análisis avanzado y recomendaciones personalizadas
9 | para lograr páginas web impactantes y de alta calidad.
10 |
11 |
12 |
13 |
15 |
--------------------------------------------------------------------------------
/src/lib/utils/readable-stream.svelte.ts:
--------------------------------------------------------------------------------
1 | /*
2 | Decodifica los datos de un stream y los agrega progresivamente a un estado para que se muestre reactivamente
3 | */
4 | export async function decodeStreamData(stream: ReadableStream, callback: (data: string) => void) {
5 | const reader = stream.getReader();
6 | const decoder = new TextDecoder();
7 |
8 | while (true) {
9 | const { done, value } = await reader.read();
10 | if (done) {
11 | break;
12 | }
13 |
14 | callback(decoder.decode(value, { stream: true }));
15 | }
16 |
17 | callback(decoder.decode());
18 |
19 | reader.releaseLock();
20 | }
21 |
--------------------------------------------------------------------------------
/src/routes/api/summarize/+server.ts:
--------------------------------------------------------------------------------
1 | import { prompts } from '$src/lib/utils/prompts';
2 | import { generateStreamResponse } from '$server/IA';
3 | import type { RequestHandler } from './$types';
4 | import type { summarizeRequest } from '$src/lib/types';
5 |
6 | export const POST: RequestHandler = async ({ request }) => {
7 | // Obtener los datos de la pagina
8 | const requestData: summarizeRequest = await request.json();
9 |
10 | // Generar prompt con respecto a los datos de la pagina
11 | const { sys, prompt } = prompts.RESUMIR(requestData);
12 |
13 | const result = await generateStreamResponse(sys, prompt);
14 |
15 | return result;
16 | };
17 |
--------------------------------------------------------------------------------
/src/lib/utils/util.ts:
--------------------------------------------------------------------------------
1 | import type { Encabezado } from '$lib/types';
2 |
3 | export function verificarEncabezados(encabezados: Encabezado[]): boolean {
4 | const inicial = parseInt(encabezados[0].tag.slice(1));
5 | let anterior = inicial;
6 | for (const encabezado of encabezados) {
7 | const currNivel = parseInt(encabezado.tag.slice(1));
8 |
9 | if (currNivel < inicial) {
10 | return false;
11 | }
12 |
13 | if (currNivel - anterior > 1) {
14 | return false;
15 | }
16 |
17 | anterior = currNivel;
18 | }
19 |
20 | return true;
21 | }
22 |
23 | export function getCodeAsMarkdown(tipo: string, contenido: string): string {
24 | return `\`\`\`${tipo}
25 | ${contenido}
26 | \`\`\``;
27 | }
28 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "./.svelte-kit/tsconfig.json",
3 | "compilerOptions": {
4 | "allowJs": true,
5 | "checkJs": true,
6 | "esModuleInterop": true,
7 | "forceConsistentCasingInFileNames": true,
8 | "resolveJsonModule": true,
9 | "skipLibCheck": true,
10 | "sourceMap": true,
11 | "strict": true,
12 | "moduleResolution": "bundler"
13 | }
14 | // Path aliases are handled by https://kit.svelte.dev/docs/configuration#alias
15 | // except $lib which is handled by https://kit.svelte.dev/docs/configuration#files
16 | //
17 | // If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes
18 | // from the referenced tsconfig.json - TypeScript does not merge them in
19 | }
20 |
--------------------------------------------------------------------------------
/src/lib/utils/markdown-service.ts:
--------------------------------------------------------------------------------
1 | import TurndownService from 'turndown';
2 | import { marked } from 'marked';
3 |
4 | const turndownService = new TurndownService({
5 | headingStyle: 'atx',
6 | hr: '---',
7 | bulletListMarker: '-',
8 | codeBlockStyle: 'indented',
9 | fence: '```',
10 | emDelimiter: '_',
11 | strongDelimiter: '**',
12 | linkStyle: 'inlined'
13 | });
14 |
15 | /*
16 | * Convertir el cuerpo de la pagina a markdown
17 | */
18 | export function convertToMarkdown(body: HTMLElement): string {
19 | return turndownService.turndown(body).trim();
20 | }
21 |
22 | /*
23 | Convertir el markdown a html para ser renderizado
24 | */
25 | export function convertToHtml(markdown: string): string {
26 | return marked.parse(markdown);
27 | }
28 |
--------------------------------------------------------------------------------
/src/lib/components/board/RowEncabezado.svelte:
--------------------------------------------------------------------------------
1 |
13 |
14 |
15 |
16 | {encabezado.content}
17 |
18 |
19 |
25 |
--------------------------------------------------------------------------------
/src/routes/api/improve/+server.ts:
--------------------------------------------------------------------------------
1 | import { prompts } from '$src/lib/utils/prompts';
2 | import { generateStreamResponse } from '$server/IA';
3 | import type { ImproveRequest } from '$src/lib/types';
4 | import type { RequestHandler } from './$types';
5 |
6 | export const POST: RequestHandler = async ({ request }) => {
7 | // Obtener los datos de la pagina
8 | const requestData: ImproveRequest = await request.json();
9 |
10 | const isTitulo = requestData.elemento.tag.toLowerCase().includes('h');
11 |
12 | // Generar prompt con respecto a los datos de la pagina
13 | const { sys, prompt } = isTitulo
14 | ? prompts.MEJORAR_TITULO(requestData)
15 | : prompts.MEJORAR_CONTENIDO(requestData);
16 |
17 | const result = await generateStreamResponse(sys, prompt);
18 |
19 | return result;
20 | };
21 |
--------------------------------------------------------------------------------
/eslint.config.js:
--------------------------------------------------------------------------------
1 | import js from '@eslint/js';
2 | import ts from 'typescript-eslint';
3 | import svelte from 'eslint-plugin-svelte';
4 | import prettier from 'eslint-config-prettier';
5 | import globals from 'globals';
6 |
7 | /** @type {import('eslint').Linter.FlatConfig[]} */
8 | export default [
9 | js.configs.recommended,
10 | ...ts.configs.recommended,
11 | ...svelte.configs['flat/recommended'],
12 | prettier,
13 | ...svelte.configs['flat/prettier'],
14 | {
15 | languageOptions: {
16 | globals: {
17 | ...globals.browser,
18 | ...globals.node
19 | }
20 | }
21 | },
22 | {
23 | files: ['**/*.svelte'],
24 | languageOptions: {
25 | parserOptions: {
26 | parser: ts.parser
27 | }
28 | }
29 | },
30 | {
31 | ignores: ['build/', '.svelte-kit/', 'dist/']
32 | }
33 | ];
34 |
--------------------------------------------------------------------------------
/src/routes/api/rate/+server.ts:
--------------------------------------------------------------------------------
1 | import { json } from '@sveltejs/kit';
2 | import type { RateRequest, Rate } from '$src/lib/types';
3 | import { prompts } from '$src/lib/utils/prompts';
4 | import { generateTextResponse } from '$server/IA';
5 | import type { RequestHandler } from './$types';
6 |
7 | export const POST: RequestHandler = async ({ request }) => {
8 | // Obtener los datos de la pagina
9 | const requestData: RateRequest = await request.json();
10 |
11 | // Generar prompt con respecto a los datos de la pagina
12 | const { sys, prompt } = prompts.CALIFICAR_CONTENIDO(requestData);
13 |
14 | const result = await generateTextResponse(sys, prompt);
15 |
16 | const response: Rate = JSON.parse(result.slice(result.indexOf('{'), result.lastIndexOf('}') + 1));
17 |
18 | return json(response);
19 | };
20 |
--------------------------------------------------------------------------------
/src/lib/components/board/Badge.svelte:
--------------------------------------------------------------------------------
1 |
10 |
11 |
15 |
16 |
17 |
18 |
35 |
--------------------------------------------------------------------------------
/src/lib/components/Home/Rol.svelte:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
{rol}
17 |
18 |
19 | {descripcion}
20 |
21 |
22 |
23 |
28 |
--------------------------------------------------------------------------------
/svelte.config.js:
--------------------------------------------------------------------------------
1 | import adapter from '@sveltejs/adapter-auto';
2 | import { vitePreprocess } from '@sveltejs/vite-plugin-svelte';
3 |
4 | /** @type {import('@sveltejs/kit').Config} */
5 | const config = {
6 | // Consult https://kit.svelte.dev/docs/integrations#preprocessors
7 | // for more information about preprocessors
8 | preprocess: vitePreprocess(),
9 |
10 | kit: {
11 | // adapter-auto only supports some environments, see https://kit.svelte.dev/docs/adapter-auto for a list.
12 | // If your environment is not supported, or you settled on a specific environment, switch out the adapter.
13 | // See https://kit.svelte.dev/docs/adapters for more information about adapters.
14 | adapter: adapter(),
15 | alias: {
16 | $src: 'src',
17 | $styles: 'src/styles',
18 | $assets: 'src/lib/assets',
19 | $components: 'src/lib/components',
20 | $db: 'src/lib/db',
21 | $server: 'src/lib/server',
22 | $stores: 'src/lib/stores',
23 | $utils: 'src/lib/utils'
24 | }
25 | }
26 | };
27 |
28 | export default config;
29 |
--------------------------------------------------------------------------------
/src/lib/stores/StorePage.svelte.ts:
--------------------------------------------------------------------------------
1 | import type { Encabezado, PageData, RateResponse } from '$lib/types';
2 | import { pageState } from '$utils/enums';
3 |
4 | class StorePage {
5 | data: PageData | null = $state(null);
6 | rate: RateResponse | null = $state(null);
7 | estado: number = $state(pageState.WAITING);
8 | encabezados: Encabezado[] = $state([]);
9 | resumen: string = $state('');
10 |
11 | /*
12 | inicializar la store con los datos base de la pagina
13 | */
14 | init(pageData: PageData) {
15 | this.estado = pageState.OK;
16 | this.data = pageData;
17 | }
18 |
19 | /*
20 | guardar la calificación de la página
21 | */
22 | setRate(rate: Rate) {
23 | this.estado = pageState.ANALIZADO;
24 | console.log(rate);
25 | this.rate = rate;
26 | }
27 |
28 | /*
29 | limpiar la store
30 | */
31 | reset() {
32 | this.data = null;
33 | this.rate = null;
34 | this.estado = pageState.WAITING;
35 | this.resumen = '';
36 | this.encabezados = [];
37 | }
38 | }
39 |
40 | export const storePage = new StorePage();
41 |
--------------------------------------------------------------------------------
/src/lib/components/board/LightRate.svelte:
--------------------------------------------------------------------------------
1 |
20 |
21 |
26 |
27 |
28 |
45 |
--------------------------------------------------------------------------------
/src/lib/components/Nav.svelte:
--------------------------------------------------------------------------------
1 |
38 |
39 |
41 |
--------------------------------------------------------------------------------
/src/lib/components/board/Head.svelte:
--------------------------------------------------------------------------------
1 |
8 |
9 |
10 |
28 |
29 |
30 |
31 |
40 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # CopyWhisper
2 |
3 | > Desarrollada para el hackatón de midudev en convenio con Vercel, aunque tengo pensado continuar con su desarrollo mas adelante :p.
4 |
5 | CopyWhisper es una aplicación web innovadora diseñada para analizar, calificar, optimizar y proporcionar recomendaciones personalizadas sobre el copywriting y el contenido de páginas web. CopyWhisper utiliza GeminiAi a través del Vercel SDK, facilitando el trabajo de revisión de contenido y ayudando a mejorar la calidad del copywriting en línea.
6 |
7 | #### Características
8 |
9 | - Análisis de Copywriting: CopyWhisper revisa automáticamente el contenido de tu página web, identificando áreas de mejora y fortalezas.
10 | - Calificaciones: Obtén una puntuación detallada de la calidad de tu copywriting, basada en varios criterios establecidos.
11 | - Optimización: Recibe sugerencias específicas para mejorar el contenido de tu página, ayudándote a maximizar su impacto y efectividad.
12 | - Recomendaciones Personalizadas: Disfruta de consejos hechos a medida para mejorar el copywriting, adaptados a las necesidades específicas de tu sitio web.
13 |
14 | #### Tecnologías Utilizadas
15 |
16 | - Svelte, Tailwind, CSS, SCSS, Typescript
17 | - Vercel AI SDK
18 |
--------------------------------------------------------------------------------
/src/lib/components/board/ListadoHeaders.svelte:
--------------------------------------------------------------------------------
1 |
10 |
11 |
47 | Descubre las potentes funcionalidades que hacen de CopyWhisper la herramienta definitiva para
48 | analizar y mejorar el copywriting de tu pagina.
49 |
50 |
51 |
52 |
56 |
57 |
61 |
62 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
Una Herramienta para Todos.
73 |
74 |
75 | CopyWhisper es perfecta para desarrolladores, redactores y profesionales del marketing,
76 | facilitando el análisis y mejora de tu copywriting.
77 |
78 |
79 |
80 |
81 |
86 |
87 |
88 |
94 |
95 |
96 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 | Experimenta la magia de CopyWhisper
112 |
113 |
114 | Ingresa el URL de tu sitio web y experimenta la magia de CopyWhisper. No esperes para hacer
115 | el copywriting de tu pagina web impactante y de alta calidad.
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
176 |
--------------------------------------------------------------------------------
/src/lib/utils/prompts.ts:
--------------------------------------------------------------------------------
1 | import type { RateRequest, ImproveRequest, Prompt, summarizeRequest } from '$src/lib/types';
2 | import { getCodeAsMarkdown } from '$utils/util';
3 |
4 | const ROL =
5 | 'Asume el rol de un copywriter profesional con muchos conocimientos en el área de la redacción de contenido web.';
6 |
7 | const CRITERIOS = `
8 | - Analisis de la estructura del contenido y redaccion
9 | - Descripcion del criterio: Evaluar la redaccion, estructura, organización y calidad del contenido para asegurar claridad, coherencia y efectividad.
10 | - Criterios:
11 | - Asegurar que el contenido tenga un propósito claro y que la información proporcionada sea relevante, que refleje la idea que se quiere transmitir, capte el interes, incentive a la interaccion, y que comunique efectivamente la propuesta de valor.
12 | - Claridad y Precisión: Escritura clara, sin redundancias ni ambigüedades. Lenguaje claro y directo y asegurarse de que las ideas se expresen con precisión y exactitud.
13 | - Organización y jerarquía del contenido, uso adecuado de encabezados para dividir el contenido en secciones claras y coherencia en la jerarquía de los encabezados.
14 | - Facilidad de lectura, legibilidad y comprensión del contenido.
15 | - Potencial del contenido para mantener la atención del lector e incentivar la interacción.
16 |
17 | - **Tono y estilo**
18 | - Descripcion del criterio: Evaluar el tono, uniformidad y cohesión del estilo de escritura a lo largo del contenido, asegurando que se mantenga un tono y estilo constante y adecuado para la audiencia específica dependiendo de el contexto de la pagina web.
19 | - Criterios:
20 | - Contexto del Contenido: Ajuste del tono y estilo según el tipo de página
21 | - Tono Adecuado: Adaptación del tono al público objetivo.
22 | - Uniformidad y consistencia del Tono: Mantener el mismo tono en todo el contenido.
23 | - Consistencia del estilo de escritura
24 | - Consistencia léxica.
25 |
26 | - **Persuasión y Conversión**
27 | - Descripcion del criterio: Evaluar la efectividad de los elementos persuasivos y llamados a la acción presentes en el contenido.
28 | - Criterios:
29 | - Uso efectivo de palabras clave relevantes
30 | - Persuacion y la capacidad del contenido para convencer al lector.
31 | - Call to action si existe
32 | - Evaluar efectividad de los encabezados y CTAs en términos de claridad, captar la atención y motivar a la acción.
33 |
34 |
35 | - **Errores de escritura**
36 | - Descripcion del criterio: Identificar y enumerar errores gramaticales, ortográficos, semánticos y sintácticos presentes en el contenido, proporcionando una evaluación profunda y detallada a nivel lingüístico.
37 | - Criterios:
38 | - Gramatica.
39 | - Ortografia.
40 | - Puntuacion.
41 | `;
42 |
43 | /*
44 | * Plantilas de prompts para generar respuestas de la IA
45 | */
46 | export const prompts = {
47 | RESUMIR(requestData: summarizeRequest): Prompt {
48 | // , no es necesario que desgloces cada item en tu respuesta, solo tenlos en cuenta para generar tu analisis.
49 | return {
50 | sys: `
51 | ${ROL}
52 | Tu tarea es redactar un parrafo que condense tus comentarios y análisis del contenido de la página proporcionada. Este analisis debe proporcionar una visión general clara y concisa de las fortalezas y tambien de las áreas de mejora. Ten en cuenta que se busca un análisis profundo y preciso que refleje los estándares de un copywriter profesional experimentado pero siendo breve. A continuacion te dare algunos items que puedes usar internamente para tu analisis:
53 |
54 | ${CRITERIOS}
55 | `,
56 | prompt: `
57 | **La información de la página es la siguiente, responde solamente con un parrafo legible y bien redactado con lenguaje natural que pueda ser entendido por una persona**
58 |
59 | - **Título de la página:** ${requestData.titulo}
60 | - **Meta descripción de la página:** ${requestData.descripcion || 'No hay descripción'}
61 | - **Contenido:**
62 |
63 | ${getCodeAsMarkdown('md', requestData.markdown)}
64 | `
65 | };
66 | },
67 |
68 | CALIFICAR_CONTENIDO(requestData: RateRequest): Prompt {
69 | const indicacionCuantitativa = 'Calificacion cuantitativa del 1 al 10, siendo 10 excelente';
70 | const indicacionCualitativa =
71 | "Calificacion cualitativa que puede ser 'bajo', 'medio', 'alto', 'excelente'.";
72 | return {
73 | sys: `
74 | ${ROL}
75 |
76 | Tu tarea es revisar y calificar el contenido de la página proporcionada. A continuación, se te proporcionan los items que se van a calificar y los criterios de calificación.
77 |
78 | Items a calificar y criterios de calificacion:
79 |
80 | ${CRITERIOS}
81 |
82 | Para cada uno de los ítems debes generar una calificacion cualitativa y cuantitativa (calificacion cuantitativa del 1 al 10, siendo 10 excelente) teniendo en cuenta los criterios y tambien el contexto de la pagina. Además, incluye un parrafo breve pero detallado para cada ítem con tus comentarios y otro con tus recomendaciones. Ten en cuenta que se busca un análisis profundo y preciso que refleje los estándares de un copywriter profesional experimentado. Devuelve la respuesta en formato JSON con la siguiente estructura:
83 |
84 | ${getCodeAsMarkdown(
85 | 'json',
86 | `{
87 | "contenido": {
88 | "cuantitativo": "${indicacionCuantitativa}",
89 | "cualitativo": "${indicacionCualitativa}",
90 | "comentarios": "...",
91 | "sugerencias": "..."
92 | },
93 | "tono": {
94 | "cuantitativo": "${indicacionCuantitativa}",
95 | "cualitativo": "${indicacionCualitativa}",
96 | "comentarios": "...",
97 | "sugerencias": "..."
98 | },
99 | "persuacion": {
100 | "cuantitativo": "${indicacionCuantitativa}",
101 | "cualitativo": "${indicacionCualitativa}",
102 | "comentarios": "...",
103 | "sugerencias": "..."
104 | },
105 | "errores": {
106 | "cuantitativo": "${indicacionCuantitativa}",
107 | "cualitativo": "${indicacionCualitativa}",
108 | "comentarios": "...",
109 | "sugerencias": "..."
110 | }
111 | }`
112 | )}
113 | `,
114 | prompt: `
115 | A continuación, se te proporciona el contenido de la página web:
116 |
117 | ${getCodeAsMarkdown('md', requestData.markdown)}
118 | `
119 | };
120 | },
121 |
122 | CALIFICAR_ENCABEZADOS(requestData: RateRequest): Prompt {
123 | const indicacionCuantitativa = 'Calificacion cuantitativa del 1 al 10, siendo 10 excelente';
124 | const indicacionCualitativa =
125 | "Calificacion cualitativa que puede ser 'bajo', 'medio', 'alto', 'excelente'.";
126 | return {
127 | sys: `
128 | ${ROL}
129 |
130 | Tu tarea es calificar cada encabezado de una pagina web.
131 |
132 | A continuación, se te proporcionan los los criterios de calificación.
133 |
134 | ${CRITERIOS}
135 |
136 | Para cada uno de los ítems debes generar una calificacion cualitativa y cuantitativa teniendo en cuenta los criterios. Además, incluye un parrafo breve pero detallado para cada ítem con tus comentarios. Ten en cuenta que se busca un análisis profundo y preciso que refleje los estándares de un copywriter profesional experimentado. Devuelve la respuesta en formato JSON con la siguiente estructura:
137 |
138 | ${getCodeAsMarkdown(
139 | 'json',
140 | `{
141 | "errores": {
142 | "cuantitativo": "${indicacionCuantitativa}",
143 | "cualitativo": "${indicacionCualitativa}",
144 | "comentarios": "...",
145 | "errores": [
146 | "Errores identificados y su explicacion/solucion.",
147 | ]
148 | },
149 | "tono": {
150 | "cuantitativo": "${indicacionCuantitativa}",
151 | "cualitativo": "${indicacionCualitativa}",
152 | "comentarios": "..."
153 | },
154 | "persuacion": {
155 | "cuantitativo": "${indicacionCuantitativa}",
156 | "cualitativo": "${indicacionCualitativa}",
157 | "comentarios": "..."
158 | },
159 | "contenido": {
160 | "cuantitativo": "${indicacionCuantitativa}",
161 | "cualitativo": "${indicacionCualitativa}",
162 | "comentarios": "..."
163 |
164 | }
165 | }`
166 | )}
167 | `,
168 | prompt: `
169 | A continuación, se te proporciona el contenido de la página web:
170 |
171 | ${getCodeAsMarkdown('md', requestData.markdown)}
172 | `
173 | };
174 | },
175 |
176 | MEJORAR_TITULO(requestData: ImproveRequest): Prompt {
177 | // Proporciona solo el texto plano del encabezado mejorado, hazlo creativo e interesante, no incluyas decoraciones ni markdown.
178 | return {
179 | sys: `
180 | ${ROL}
181 |
182 | Tu tarea es mejorar copywriting de el contenido de la página proporcionada. En este caso especifico estas especializado en mejorar encabezados.
183 |
184 | Se te proporcionara el contenido de toda la pagina para darte contexto de la pagina. Necesito que mejores el encabezado que te proporcionare, ten en cuenta la etiqueta del encabezado para que sepas cual es su importancia y el contexto de la pagina, ademas recuerda mantener la idea del encabezado, haz que se sienta organico, creativo e interesante, pero evita que se sienta artificial y demasiado forzado.
185 |
186 | Solo debes mejorar el encabezado, no incluyas decoraciones ni markdown. Responde solamente con un texto plano que tenga el texto del encabezado mejorado.
187 |
188 | Para dar tu respuesta al encabezado mejorado, usa tus amplios conocimientos y ten en cuenta los siguientes criterios y el contexto de la pagina web:
189 |
190 | ${CRITERIOS}
191 | `,
192 | prompt: `
193 | A continuacion el encabezado a mejorar y el contenido de la pagina para que lo analices y tengas contexto. Responde unicamente con el texto del encabezado mejorado. No uses decoraciones como negrita:
194 |
195 | - **Título de la página:** ${requestData.titulo}
196 | - **Encabezado a mejorar:**
197 |
198 | ${getCodeAsMarkdown('json', JSON.stringify(requestData.elemento))}
199 |
200 | - **Contenido de la página:**
201 |
202 | ${getCodeAsMarkdown('md', requestData.markdown)}
203 | `
204 | };
205 | },
206 | MEJORAR_CONTENIDO(requestData: ImproveRequest): Prompt {
207 | return {
208 | sys: `
209 | ${ROL}
210 |
211 | Tu tarea es mejorar copywriting de el contenido de la página proporcionada. En este caso especifico estas especializado en mejorar el contenido.
212 |
213 | Se te proporcionara el contenido de toda la pagina para darte contexto de la pagina. Necesito que mejores el texto en especifico que te proporcionare. Solo debes mejorar el texto, no incluyas decoraciones ni markdown. Responde solamente con un texto plano que tenga el texto mejorado, recuerda mantener la idea del texto, haz que se sienta organico, creativo e interesante, pero evita que se sienta artificial y demasiado forzado.
214 |
215 | Para dar tu respuesta al momento de mejorar la redaccion del contenido, usa tus amplios conocimientos y ten en cuenta el contexto de la pagina web. Ademas ten en cuenta los siguientes criterios importantes
216 |
217 | ${CRITERIOS}
218 | A continuacion se te proporcionara la informacion necesaria para que puedas realizar tu tarea, responde:
219 | `,
220 | prompt: `
221 | A continuacion el contenido de la pagina para que tengas contexto y el elemento a mejorar. Responde unicamente con texto plano.
222 |
223 | - **Título de la página:** ${requestData.titulo}
224 | - **Elemento a mejorar:**
225 |
226 | ${getCodeAsMarkdown('json', JSON.stringify(requestData.elemento))}
227 |
228 | - **Contenido de la página:**
229 |
230 | ${getCodeAsMarkdown('md', requestData.markdown)}
231 | `
232 | };
233 | }
234 | };
235 |
--------------------------------------------------------------------------------