<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Miguel Lopez</title>
    <description>The latest articles on DEV Community by Miguel Lopez (@miguelbc7).</description>
    <link>https://dev.to/miguelbc7</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F618693%2F048d8e42-436a-4f97-bd8a-67ab6ab9f4e0.jpeg</url>
      <title>DEV Community: Miguel Lopez</title>
      <link>https://dev.to/miguelbc7</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/miguelbc7"/>
    <language>en</language>
    <item>
      <title>Spec-Driven Development con Superpowers: Como evoluciono mi vibecoding</title>
      <dc:creator>Miguel Lopez</dc:creator>
      <pubDate>Fri, 29 May 2026 20:29:24 +0000</pubDate>
      <link>https://dev.to/miguelbc7/spec-driven-development-con-superpowers-como-evoluciono-mi-vibecoding-2fjb</link>
      <guid>https://dev.to/miguelbc7/spec-driven-development-con-superpowers-como-evoluciono-mi-vibecoding-2fjb</guid>
      <description>&lt;p&gt;&lt;strong&gt;El problema con el vibecoding común&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Todos hemos estado ahí. Abres Claude Code, escribes "hazme una app de tareas con autenticación y base de datos", y la IA se lanza a escribir código durante 10 minutos. El resultado: una mezcla de archivos que a veces funciona, a veces no, y que nadie, ni tú ni la IA, entiende del todo bien.                                                                                                                                                                                                 &lt;/p&gt;

&lt;p&gt;Eso es vibecoding, darle un prompt vago a la IA y esperar que interprete correctamente lo que tienes en la cabeza. Funciona para prototipos de 20 minutos. No funciona para software real. &lt;/p&gt;

&lt;p&gt;El problema no es la IA. El problema es que le estás pidiendo que haga arquitectura, diseño, implementación y revisión al mismo tiempo, sin ningún proceso.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Qué es Superpowers&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/obra/superpowers" rel="noopener noreferrer"&gt;https://github.com/obra/superpowers&lt;/a&gt; es un plugin para Claude Code (y otros agentes de IA como Cursor, Gemini CLI, OpenAI Codex) que le inyecta skills (habilidades especializadas o comportamientos) al modelo. En lugar de que Claude improvise cómo abordar una tarea compleja, sigue un proceso probado.&lt;/p&gt;

&lt;p&gt;Se instala en segundos:&lt;/p&gt;

&lt;h1&gt;
  
  
  Claude Code
&lt;/h1&gt;

&lt;p&gt;/plugin install superpowers@claude-plugins-official&lt;/p&gt;

&lt;p&gt;Una vez instalado, Claude tiene acceso a skills como brainstorming, writing-plans, subagent-driven-development, requesting-code-review, y muchas más. Cada skill es una guía de comportamiento que el modelo sigue disciplinadamente.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mi flujo. Spec-Driven Development en 8 pasos&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Lo que aprendí trabajando con IA es que la calidad del software que produce es directamente proporcional a la claridad del proceso que le das. &lt;/p&gt;

&lt;p&gt;Este flujo de 8 pasos convierte el caos del vibecoding en algo reproducible y predecible.&lt;/p&gt;

&lt;p&gt;Paso 1: Brainstorming&lt;/p&gt;

&lt;p&gt;Antes de escribir una sola línea de código, exploro el problema con la skill superpowers:brainstorming.&lt;/p&gt;

&lt;p&gt;/skill superpowers:brainstorming&lt;br&gt;
  "Quiero construir un sistema de notificaciones para la app"&lt;/p&gt;

&lt;p&gt;La diferencia con simplemente preguntarle a Claude es que esta skill hace preguntas que yo no pensé hacer: ¿quién consume las notificaciones?, ¿qué pasa si el usuario está offline?, ¿necesitamos tiempo real o eventual consistency basta?, ¿cómo&lt;br&gt;
   afecta esto a la arquitectura existente?&lt;/p&gt;

&lt;p&gt;El brainstorming no es generar ideas al azar —es descubrir los requisitos ocultos antes de que se conviertan en bugs.&lt;/p&gt;

&lt;p&gt;Paso 2: Verificar el diseño&lt;/p&gt;

&lt;p&gt;El brainstorming produce ideas. La verificación las filtra. Aquí reviso con la IA si el diseño propuesto tiene sentido técnico:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;¿Hay decisiones de arquitectura que se contradicen?&lt;/li&gt;
&lt;li&gt;¿Hay over-engineering? (YAGNI)&lt;/li&gt;
&lt;li&gt;¿Hay suposiciones no validadas?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Este paso me ha salvado de construir cosas que no necesitaba. La IA es muy buena proponiendo soluciones elaboradas. Ser disciplinado aquí evita semanas de trabajo innecesario.&lt;/p&gt;

&lt;p&gt;Paso 3: Escribir el spec&lt;/p&gt;

&lt;p&gt;Con el diseño validado, la skill superpowers:writing-plans genera un documento de especificación estructurado. Un spec no es código —es la descripción precisa de lo que el software debe hacer.&lt;/p&gt;

&lt;p&gt;Un buen spec tiene:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Comportamiento esperado por caso de uso&lt;/li&gt;
&lt;li&gt;Casos borde explícitos&lt;/li&gt;
&lt;li&gt;Lo que está fuera de scope (tan importante como lo que está dentro)&lt;/li&gt;
&lt;li&gt;Criterios de aceptación verificables&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sin spec, cada desarrollador (o agente de IA) interpreta los requisitos a su manera. Con spec, todos trabajan hacia el mismo objetivo.&lt;/p&gt;

&lt;p&gt;Paso 4: Revisar el spec&lt;/p&gt;

&lt;p&gt;Aquí la IA actúa como revisor crítico del spec que acaba de escribir. La skill lanza un subagente específico para revisar documentos con esta lógica:&lt;/p&gt;

&lt;p&gt;| Categoría     | Qué buscar                                      |&lt;br&gt;
  |---------------|--------------------------------------------------|&lt;br&gt;
  | Completitud   | TODOs, secciones incompletas, "por definir"     |&lt;br&gt;
  | Consistencia  | Requisitos que se contradicen                    |&lt;br&gt;
  | Cobertura     | Casos de error no manejados, edge cases          |&lt;br&gt;
  | YAGNI         | Features no solicitadas, over-engineering        |&lt;/p&gt;

&lt;p&gt;Si el revisor encuentra problemas, volvemos al paso 3. Si aprueba, seguimos.&lt;/p&gt;

&lt;p&gt;Este ciclo de spec → revisión parece lento. En realidad es lo más rápido: un problema detectado en el spec tarda 5 minutos en corregirse. El mismo problema detectado en producción tarda días.&lt;/p&gt;

&lt;p&gt;Paso 5: Escribir el plan de implementación&lt;/p&gt;

&lt;p&gt;El spec dice qué. El plan dice cómo y en qué orden.&lt;/p&gt;

&lt;p&gt;La skill genera un plan con tareas atómicas e independientes. Cada tarea tiene esta estructura:&lt;/p&gt;

&lt;p&gt;### Tarea N: [Nombre del componente]&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Archivos:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Crear: &lt;code&gt;ruta/exacta/al/archivo.ts&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Modificar: &lt;code&gt;ruta/existente/archivo.ts:123-145&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Test: &lt;code&gt;tests/ruta/test.ts&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;[ ] &lt;strong&gt;Paso 1: Escribir el test que falla&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;[ ] &lt;strong&gt;Paso 2: Verificar que falla&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;[ ] &lt;strong&gt;Paso 3: Implementar el mínimo código&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;[ ] &lt;strong&gt;Paso 4: Verificar que pasa&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;[ ] &lt;strong&gt;Paso 5: Commit&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;git add tests/ruta/test.ts src/ruta/archivo.ts&lt;br&gt;
  git commit -m "feat: agregar feature específica"&lt;/p&gt;

&lt;p&gt;La granularidad importa: tareas demasiado grandes generan conflictos entre subagentes. Tareas demasiado pequeñas generan overhead. El punto justo es una tarea por componente o responsabilidad clara.&lt;/p&gt;

&lt;p&gt;Paso 6: Revisar el plan&lt;/p&gt;

&lt;p&gt;Igual que con el spec, el plan pasa por un revisor antes de ejecutarse. El revisor verifica:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;¿El plan refleja fielmente el spec?&lt;/li&gt;
&lt;li&gt;¿Las tareas son verdaderamente independientes entre sí?&lt;/li&gt;
&lt;li&gt;¿Las rutas de archivos son correctas?&lt;/li&gt;
&lt;li&gt;¿El orden de implementación tiene sentido?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si una tarea depende de otra, no pueden ejecutarse en paralelo. El revisor detecta estas dependencias ocultas antes de que rompan la ejecución.&lt;/p&gt;

&lt;p&gt;Paso 7: Lanzar el plan con subagentes&lt;/p&gt;

&lt;p&gt;Aquí está la magia del sistema. Con superpowers:subagent-driven-development, cada tarea del plan se ejecuta en un subagente independiente en paralelo o secuencialmente según las dependencias.&lt;/p&gt;

&lt;p&gt;El flujo real se ve así:&lt;/p&gt;

&lt;p&gt;[Extraer las 5 tareas del plan]&lt;br&gt;
  [Crear TodoWrite con todas las tareas]&lt;/p&gt;

&lt;p&gt;Tarea 1: Sistema de colas&lt;br&gt;
  [Despachar subagente implementador con contexto completo de la tarea]&lt;/p&gt;

&lt;p&gt;Implementador: "¿La cola debe ser persistente o en memoria?"&lt;br&gt;
  Tú: "Persistente con Redis"&lt;/p&gt;

&lt;p&gt;Implementador: "Implementando..."&lt;br&gt;
    - Cola implementada con BullMQ&lt;br&gt;
    - 8/8 tests pasando&lt;br&gt;
    - Self-review: agregué manejo de reintentos, estaba en el spec&lt;br&gt;
    - Commit realizado&lt;/p&gt;

&lt;p&gt;[Despachar revisor de spec]&lt;br&gt;
  Revisor: ✅ Cumple spec — todos los requisitos implementados&lt;/p&gt;

&lt;p&gt;[Despachar revisor de código]&lt;br&gt;
  Revisor: Fortalezas: buena cobertura, arquitectura limpia&lt;br&gt;
           Issues: ninguno&lt;br&gt;
           Resultado: ✅ Aprobado&lt;/p&gt;

&lt;p&gt;[Marcar Tarea 1 como completada]&lt;br&gt;
  [Continuar con Tarea 2...]&lt;/p&gt;

&lt;p&gt;Cada tarea pasa por tres capas de validación:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;El implementador hace self-review antes de entregar&lt;/li&gt;
&lt;li&gt;El revisor de spec verifica que se implementó lo que se especificó (ni más, ni menos)&lt;/li&gt;
&lt;li&gt;El revisor de código verifica calidad técnica&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Si el revisor de spec encuentra que se implementó algo no pedido o faltó algo del spec, el implementador lo corrige antes de seguir con la siguiente tarea.&lt;/p&gt;

&lt;p&gt;Paso 8: Commit de los cambios&lt;/p&gt;

&lt;p&gt;Cada tarea hace su propio commit atómico siguiendo el formato convencional:&lt;/p&gt;

&lt;p&gt;git add tests/ruta/test.ts src/ruta/archivo.ts&lt;br&gt;
  git commit -m "feat: agregar sistema de colas con reintentos"&lt;/p&gt;

&lt;p&gt;Al final del plan, cada feature está en su propio commit trazable, con tests pasando, alineado con el spec original.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Por qué esto es una evolución y no solo "más pasos"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;El vibecoding común trata a la IA como un oráculo: le haces una pregunta y recibes código. El problema es que un oráculo no tiene memoria del proceso, no tiene criterio de corrección, y no puede verificar su propio trabajo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Spec-Driven Development trata a la IA como un equipo de ingeniería.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  ┌──────────────────────────────────────┬───────────────────────────────────────────┐
  │              Vibecoding              │          Spec-Driven Development          │
  ├──────────────────────────────────────┼───────────────────────────────────────────┤
  │ Un prompt → todo el código           │ Proceso estructurado en fases             │
  ├──────────────────────────────────────┼───────────────────────────────────────────┤
  │ Errores descubiertos en ejecución    │ Errores detectados en spec/plan           │
  ├──────────────────────────────────────┼───────────────────────────────────────────┤
  │ La IA interpreta los requisitos      │ Los requisitos están escritos y validados │
  ├──────────────────────────────────────┼───────────────────────────────────────────┤
  │ Código monolítico difícil de revisar │ Commits atómicos por responsabilidad      │
  ├──────────────────────────────────────┼───────────────────────────────────────────┤
  │ Resultado impredecible               │ Resultado alineado con el diseño original │
  ├──────────────────────────────────────┼───────────────────────────────────────────┤
  │ No escala con complejidad            │ Escala con subagentes paralelos           │
  └──────────────────────────────────────┴───────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La clave no es que la IA sea más inteligente con este flujo. Es que el proceso elimina la ambigüedad que hace que la IA tome decisiones equivocadas.&lt;/p&gt;

&lt;p&gt;Cuando la IA tiene un spec claro, un plan preciso y un revisor que verifica cada paso, produce software de la misma calidad que un equipo de ingenieros disciplinado. Sin ese proceso, produce el mismo vibecoding que todos hemos sufrido.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;El resultado&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Con este flujo, dejé de pasar horas corrigiendo código que la IA generó mal porque yo no fui claro. Ahora los problemas se detectan en el paso 3 o el paso 6 —cuando corregirlos cuesta minutos, no días.&lt;/p&gt;

&lt;p&gt;El vibecoding es divertido para explorar ideas. El Spec-Driven Development es lo que uso cuando el código importa. Se puede decir que es ingeniería pura y dura.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>spanish</category>
      <category>vibecoding</category>
    </item>
    <item>
      <title>Angular 19: Reactividad Simple</title>
      <dc:creator>Miguel Lopez</dc:creator>
      <pubDate>Fri, 25 Apr 2025 18:43:05 +0000</pubDate>
      <link>https://dev.to/miguelbc7/angular-19-reactividad-simple-27ga</link>
      <guid>https://dev.to/miguelbc7/angular-19-reactividad-simple-27ga</guid>
      <description>&lt;p&gt;Hola de nuevo 👋. En artículos como &lt;a href="https://dev.to/miguelbc7/tu-chatbot-open-source-en-vs-code-6og"&gt;Tu Chatbot Open Source en VS Code&lt;/a&gt; o &lt;a href="https://dev.to/miguelbc7/mixins-en-sass-55i7"&gt;Mixins en SASS&lt;/a&gt;, siempre busco herramientas que hagan el código más limpio. ¡Hoy les traigo los nuevos Signals, Models y el control flow con @if, &lt;a class="mentioned-user" href="https://dev.to/for"&gt;@for&lt;/a&gt;, &lt;a class="mentioned-user" href="https://dev.to/else"&gt;@else&lt;/a&gt; y &lt;a class="mentioned-user" href="https://dev.to/empty"&gt;@empty&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Signals: Reactividad Sin Esfuerzo&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Los Signals son variables "inteligentes" que actualizan la UI automáticamente.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Ejemplo: Contador reactivo  
import { signal, computed } from '@angular/core';  

class ContadorComponent {  
  count = signal(0);  
  double = computed(() =&amp;gt; this.count() * 2);  

  incrementar() {  
    this.count.update(v =&amp;gt; v + 1);  
  }  
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;¿Por qué me gustan?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No más subscribe() o async pipe.&lt;/li&gt;
&lt;li&gt;Integración perfecta con los nuevos @if y &lt;a class="mentioned-user" href="https://dev.to/for"&gt;@for&lt;/a&gt; 😉.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. Control Flow: Olvida los ngIf y ngFor&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Angular 19 introduce una sintaxis más limpia para condicionales y bucles.&lt;/p&gt;

&lt;p&gt;@if y &lt;a class="mentioned-user" href="https://dev.to/else"&gt;@else&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!-- Ejemplo: Mensaje de usuario --&amp;gt;  
@if (usuario()) {  
  &amp;lt;p&amp;gt;Bienvenido, {{ usuario().nombre }}&amp;lt;/p&amp;gt;  
} @else {  
  &amp;lt;p&amp;gt;Inicia sesión 🔑&amp;lt;/p&amp;gt;  
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ventaja: Más intuitivo que *ngIf y else, sin .&lt;/p&gt;

&lt;p&gt;&lt;a class="mentioned-user" href="https://dev.to/for"&gt;@for&lt;/a&gt; y &lt;a class="mentioned-user" href="https://dev.to/empty"&gt;@empty&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!-- Ejemplo: Lista de tareas --&amp;gt;  
@for (tarea of tareas(); track tarea.id) {  
  &amp;lt;div&amp;gt;{{ tarea.titulo }}&amp;lt;/div&amp;gt;  
} @empty {  
  &amp;lt;p&amp;gt;¡No hay tareas! 🎉&amp;lt;/p&amp;gt;  
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;track: Mejora el rendimiento (¡adiós a trackBy!).&lt;br&gt;
&lt;a class="mentioned-user" href="https://dev.to/empty"&gt;@empty&lt;/a&gt;: Muestra contenido si la lista está vacía.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Models y Inputs: Validación Integrada&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Con Models, podras validar Inputs automaticamente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { model } from '@angular/core';  

class FormularioComponent {  
  // Modelo con validación automática  
  email = model&amp;lt;string&amp;gt;('', {  
    validate: (valor) =&amp;gt; valor.includes('@') ? null : 'Email inválido ❌'  
  });  
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;4. Inject y Effect: Código Más Limpio&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Inyectar servicios sin constructor&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { inject } from '@angular/core';  

class PerfilComponent {  
  servicioAuth = inject(AuthService); // ¡Magic!  
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Effect para sincronizar datos (ejemplo: guardar en localStorage):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;effect(() =&amp;gt; {  
  localStorage.setItem('tema', tema());  
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Ejemplo Completo: Lista de Tareas Reactiva&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;TS&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { signal, effect } from '@angular/core';  

class TareasComponent {  
  tareas = signal&amp;lt;Tarea[]&amp;gt;([]);  

  constructor() {  
    effect(() =&amp;gt; {  
      console.log('Tareas actualizadas:', this.tareas());  
    });  
  }  

  agregarTarea(titulo: string) {  
    this.tareas.update(t =&amp;gt; [...t, { id: Date.now(), titulo }]);  
  }  
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;HTML&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!-- Template con @for y @if --&amp;gt;  
@if (tareas().length &amp;gt; 0) {  
  &amp;lt;div class="lista"&amp;gt;  
    @for (tarea of tareas(); track tarea.id) {  
      &amp;lt;div&amp;gt;{{ tarea.titulo }}&amp;lt;/div&amp;gt;  
    }  
  &amp;lt;/div&amp;gt;  
} @else {  
  &amp;lt;p&amp;gt;¡Añade tu primera tarea! 📝&amp;lt;/p&amp;gt;  
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Angular 19 me encanta por su sencillez. Los Signals, el nuevo control flow (@if, &lt;a class="mentioned-user" href="https://dev.to/for"&gt;@for&lt;/a&gt;, &lt;a class="mentioned-user" href="https://dev.to/empty"&gt;@empty&lt;/a&gt;) y Models eliminan código repetitivo y hacen todo más intuitivo.&lt;/p&gt;

&lt;p&gt;Para los que vienen de versiones antiguas:&lt;/p&gt;

&lt;p&gt;El nuevo control flow es opcional, pero recomiendo usarlo (¡es el futuro!).&lt;/p&gt;

&lt;p&gt;Signals integran mejor con Reactividad que los Observables en componentes simples.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Tu Chatbot Open Source en VS Code</title>
      <dc:creator>Miguel Lopez</dc:creator>
      <pubDate>Wed, 13 Nov 2024 14:53:37 +0000</pubDate>
      <link>https://dev.to/miguelbc7/tu-chatbot-open-source-en-vs-code-6og</link>
      <guid>https://dev.to/miguelbc7/tu-chatbot-open-source-en-vs-code-6og</guid>
      <description>&lt;p&gt;El día de hoy vamos a hablar sobre un tema que a muchos les interesa, como configurar nuestro propio chatbot open source en VS Code y que funcione sin internet (Pd: para la instalación si requerimos internet).&lt;/p&gt;

&lt;p&gt;Para el día de hoy utilizaremos 2 herramientas.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;LM Studio, un software para uso de LLM open source como chatbots en nuestro sistema operativo. &lt;a href="https://lmstudio.ai/" rel="noopener noreferrer"&gt;&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Continue, una extensión para VS Code que nos permitirá consumir nuestro modelo desde LM Studio. &lt;a href="https://marketplace.visualstudio.com/items?itemName=Continue.continue" rel="noopener noreferrer"&gt;&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;El primer paso es descargar LM Studio e instalarlo en nuestro sistema operativo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh83kajmspasnjijvkl95.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh83kajmspasnjijvkl95.png" alt="Image description" width="684" height="474"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Al tener LM Studio instalado, lo abrimos y a nuestra izquierda tenemos 4 iconos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chat: Funciona muy parecido a Chatgpt, Gemini o Perplexity.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmjsy2uaevj0dcnw136qb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmjsy2uaevj0dcnw136qb.png" alt="Image description" width="800" height="430"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Developer: Una sección para lanzar el LM Studio como API de terceros en local.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F13sih1a3gvm4zzc2owdp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F13sih1a3gvm4zzc2owdp.png" alt="Image description" width="800" height="429"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;My models: Donde podrás ver todos los modelos disponibles en tu LM Studio.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0or3gwulvddsxj1zomlz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0or3gwulvddsxj1zomlz.png" alt="Image description" width="800" height="431"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Discover: La sección donde se pueden descargar los distintos modelos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2b3ai537dibm48ozxhmu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2b3ai537dibm48ozxhmu.png" alt="Image description" width="800" height="474"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ahora que ya entendemos un poco mejor la estructura del LM Studio, podemos comenzar por ir a la sección Discover y descargar los modelos que queramos, al tener esto listo ya podemos ir al chat y comenzar a usar el LM Studio como si de ChatGPT se tratara (Claro que no con tanta potencia, recordemos que esto es open source).&lt;/p&gt;

&lt;p&gt;Nos vamos a la pestaña de Chat y en medio de la pantalla hay una barra donde nos permite elegir entre todos los modelos que hemos descargado para iniciar el chat.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1a15zc4bfhbvdzh84yta.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1a15zc4bfhbvdzh84yta.png" alt="Image description" width="800" height="514"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ahora podemos comenzar a hablar con nuestro chatbot sin ningun problema, y segun el modelo que utilicemos podemos darle archivos como imagenes, docx, xlsx, pdf, entre otros.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcnf9jdspd47y38bcs0l9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcnf9jdspd47y38bcs0l9.png" alt="Image description" width="800" height="531"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bueno podemos decir que ya tenemos un chatbot pero eso no es todo lo que queremos, queremos usar este chatbot dentro de VS Code para trabajar con el sin tener que estar moviéndonos entre pestañas y poder contextualizar rápidamente al modelo con el que estamos trabajando.&lt;/p&gt;

&lt;p&gt;Nos dirigimos a la pestaña Developer del LM Studio y presionamos el boton Start Server.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1yhcbi4yj50y6u1qbsb8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1yhcbi4yj50y6u1qbsb8.png" alt="Image description" width="371" height="386"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esto lanzará el LM Studio como una API, luego vamos a descargar la extensión Continue (He dejado el link al principio).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk6yjgcsp3a0jk0kpuxz8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk6yjgcsp3a0jk0kpuxz8.png" alt="Image description" width="800" height="127"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Habiendo descargado la extensión en nuestro VS Code veremos algo muy parecido a esto:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F80l3uquki3v9z1z59yqk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F80l3uquki3v9z1z59yqk.png" alt="Image description" width="391" height="968"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Procedemos a configurarlo presionando en "Select Model" y luego "Add chat model"&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmvqgqy2xr9nvmumrvpeg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmvqgqy2xr9nvmumrvpeg.png" alt="Image description" width="340" height="199"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esto abrira un modal que nos solicitará algunos datos y lo configuraremos de la siguiente manera:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fql7up066emidhq73n5fi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fql7up066emidhq73n5fi.png" alt="Image description" width="346" height="801"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Y ahora nuestro VS Code tiene su propio chatbot con modelos LLM open source.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm64azfv6yw8pw8mj8ivm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm64azfv6yw8pw8mj8ivm.png" alt="Image description" width="800" height="368"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E incluso nos permitira contextualizar o hacer algunas acciones directamente desde el código sin usar el chatbot.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0abcub2z1buew0x14s9c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0abcub2z1buew0x14s9c.png" alt="Image description" width="800" height="560"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esto es todo por hoy, espero que les haya gustado este curso, pronto vendré con mas para ayudarlos con tips, cursos y herramientas para desarrolladores.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>vscode</category>
      <category>extensions</category>
    </item>
    <item>
      <title>Mixins en SASS</title>
      <dc:creator>Miguel Lopez</dc:creator>
      <pubDate>Wed, 13 Nov 2024 14:24:11 +0000</pubDate>
      <link>https://dev.to/miguelbc7/mixins-en-sass-11pn</link>
      <guid>https://dev.to/miguelbc7/mixins-en-sass-11pn</guid>
      <description>&lt;p&gt;Los mixins son herramientas que proveen los preprocesadores CSS, aunque no son funciones se pueden percibir como tal, y su principal utilidad es reutilizar código.&lt;/p&gt;

&lt;p&gt;En mas de una ocasión hemos tenido la necesidad de crear múltiples clases que hacen lo mismo pero cambian en un solo valor, ejemplo múltiples clases para el font-size.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.fs-10 {
  font-size: 10px;
}
.fs-20 {
  font-size: 20px;
}
.fs-30 {
  font-size: 30px;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si nos fijamos, lo único que cambia en este escenario es el numero tanto para nombrar la clase como para setear el valor del font-size, usado un mixin podemos crear una función que cree este código para nosotros de forma automatica.&lt;/p&gt;

&lt;p&gt;Ejemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Esto es un mapa, lo que conocemos como un objeto en javascript
$sizes: (
  "10": "10px",
  "20": "20px",
  "30": "30px"
) 

// El mixin que crea las clases
@mixin generate-font-sizes($sizes) {
  // Recorremos cada uno de los elementos del mapa
  @each $key, $value in $sizes{
    // Creamos la clase e interpolamos los valores
    .fs-#{$key} {
      font-size: #{$value};
    }
  }
}

// Invocamos al mixin para que se ejecute
@include generate-font-sizes($sizes);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Al compilar nuestro código tendremos el mismo resultado que la primera vez, pero ahora pueden estar pensando que nuestro código es mas largo que el resultado, y tal vez es cierto pero si quiero por ejemplo hacer un recorrido del 1 al 100 y crear clases del fs-1 al fs-100 tambien puedo hacerlo con un mixin&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@mixin generate-font-sizes() {
  @for $size from 1 through 100 {
    .fs-#{$size} {
      font-size: #{$size}px;
    }
  }
}
@include generate-font-sizes();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Con esto tendremos el resultado esperado, y esto no solo sirve para el font-size sino para cualquier cosa que se nos ocurra, podemos construir grandes cantidades de código con pequeños bloques de código en un mixin.&lt;/p&gt;

&lt;p&gt;Esto es todo por ahora, aprendimos a usar los mixing&lt;/p&gt;

</description>
      <category>scss</category>
      <category>css</category>
    </item>
    <item>
      <title>Mixins en SASS</title>
      <dc:creator>Miguel Lopez</dc:creator>
      <pubDate>Fri, 08 Nov 2024 16:57:57 +0000</pubDate>
      <link>https://dev.to/miguelbc7/mixins-en-sass-55i7</link>
      <guid>https://dev.to/miguelbc7/mixins-en-sass-55i7</guid>
      <description>&lt;p&gt;Los mixins son herramientas que proveen los preprocesadores CSS, aunque no son funciones se pueden percibir como tal, y su principal utilidad es reutilizar código.&lt;/p&gt;

&lt;p&gt;En mas de una ocasión hemos tenido la necesidad de crear múltiples clases que hacen lo mismo pero cambian en un solo valor, ejemplo múltiples clases para el font-size.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.fs-10 {
  font-size: 10px;
}
.fs-20 {
  font-size: 20px;
}
.fs-30 {
  font-size: 30px;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si nos fijamos, lo único que cambia en este escenario es el numero tanto para nombrar la clase como para setear el valor del font-size, usado un mixin podemos crear una función que cree este código para nosotros de forma automática.&lt;/p&gt;

&lt;p&gt;Ejemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Esto es un mapa, lo que conocemos como un objeto en JavaScript
$sizes: (
  "10": "10px",
  "20": "20px",
  "30": "30px"
) 

// El mixin que crea las clases
@mixin generate-font-sizes($sizes) {
  // Recorremos cada uno de los elementos del mapa
  @each $key, $value in $sizes{
    // Creamos la clase e interpolamos los valores
    .fs-#{$key} {
      font-size: #{$value};
    }
  }
}

// Invocamos al mixin para que se ejecute
@include generate-font-sizes($sizes);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Al compilar nuestro código tendremos el mismo resultado que la primera vez, pero ahora pueden estar pensando que nuestro código es mas largo que el resultado, y tal vez es cierto pero si quiero por ejemplo hacer un recorrido del 1 al 100 y crear clases del fs-1 al fs-100 también puedo hacerlo con un mixin&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// El mixin que crea las clases
@mixin generate-font-sizes() {
  // El loop que hace el recorrido de 1 a 100
  @for $size from 1 through 100 {
    // Creamos la clase e interpolamos los valores
    .fs-#{$size} {
      font-size: #{$size}px;
    }
  }
}

// Invocamos al mixin para que se ejecute
@include generate-font-sizes();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Con esto tendremos el resultado esperado, y esto no solo sirve para el font-size sino para cualquier cosa que se nos ocurra, podemos construir grandes cantidades de código con pequeños bloques de código en un mixin.&lt;/p&gt;

&lt;p&gt;Esto es todo por ahora, aprendimos a usar los mixin y a reutilizar código CSS en los preprocesadores.&lt;/p&gt;

</description>
      <category>scss</category>
      <category>css</category>
    </item>
    <item>
      <title>El uso de los modelos de IA open source en el desarrollo</title>
      <dc:creator>Miguel Lopez</dc:creator>
      <pubDate>Wed, 06 Nov 2024 14:08:11 +0000</pubDate>
      <link>https://dev.to/miguelbc7/el-uso-de-los-modelos-de-ia-open-source-en-el-desarrollo-3j9h</link>
      <guid>https://dev.to/miguelbc7/el-uso-de-los-modelos-de-ia-open-source-en-el-desarrollo-3j9h</guid>
      <description>&lt;p&gt;Durante el ultimo año han aparecido un gran numero de herramientas con inteligencia artificial para hacer mas sencilla la vida de los usuarios, ya sea generación de imágenes o chatbots, incluso escalando a herramientas que ejecutan procesos gigantescos y profesionales.&lt;/p&gt;

&lt;p&gt;He estado investigando, aprendiendo y probando muchas de estas herramientas desde chatgpt, gemini hasta dall-e o midjourney, todas funcionan muy bien pero cuando yo quiero escalar mis aplicaciones con estas herramientas me encuentro con que no tienen una alternativa gratuita u open source.&lt;/p&gt;

&lt;p&gt;Esto me ha hecho llevar mi investigación a un paso mas allá y me he encontrado con &lt;strong&gt;stable diffusion ui&lt;/strong&gt; (Generación de imágenes, &lt;a href="https://github.com/AUTOMATIC1111/stable-diffusion-webui" rel="noopener noreferrer"&gt;https://github.com/AUTOMATIC1111/stable-diffusion-webui&lt;/a&gt;) y con *&lt;em&gt;ollama *&lt;/em&gt;(Chatbot, &lt;a href="https://ollama.com/" rel="noopener noreferrer"&gt;https://ollama.com/&lt;/a&gt;), ambas son herramientas open source que te permiten ejecutar un servicio como API para consumirlo desde cualquiera de nuestras aplicaciones, con esto he llegado un paso mas allá con alternativas open source, pero para que esto funcione debo mantener estas herramientas ejecutándose para ser consumidas por nuestras aplicaciones.&lt;/p&gt;

&lt;p&gt;Para entender como llevar esto a nuestras aplicaciones es importante entender como funcionan estas herramientas, y básicamente lo que hacen es utilizar archivos con la extensión "safetensors" que son LLM o modelos de lenguaje de gran tamaño, siendo estos modelos entrenados para realizar diferentes funciones según las necesidades de quien lo entrene (Ejemplo: Generación de imágenes, traducción, desarrollo de código, chatbot, entre otros).&lt;/p&gt;

&lt;p&gt;Al entender un poco los modelos LLM y los archivos "safetensors" nos llega la siguiente pregunta como usar estos archivos en mis aplicaciones, y aquí es donde entra HugginFace, una web/base de datos de modelos de inteligencia artificial open source, y han creado su librería propia para python con 2 componentes extremadamente útiles para lo que queremos "&lt;strong&gt;Transformers&lt;/strong&gt;" y "&lt;strong&gt;Diffusers&lt;/strong&gt;".&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;Transformers *&lt;/em&gt;(&lt;a href="https://huggingface.co/docs/transformers/index" rel="noopener noreferrer"&gt;https://huggingface.co/docs/transformers/index&lt;/a&gt;) es el componente que nos permite consumir cualquier modelo especializado en texto, ejemplo convertir audio a texto o viceversa, modelos de chatbox como llama de Meta, entre otros.&lt;/p&gt;

&lt;p&gt;import transformers&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import torch

model_id = "meta-llama/Llama-3.1-8B"

pipeline = transformers.pipeline(
    "text-generation", model=model_id, model_kwargs={"torch_dtype": torch.bfloat16}, device_map="auto"
)

pipeline("Hey how are you doing today?")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Diffusers&lt;/strong&gt; (&lt;a href="https://huggingface.co/docs/diffusers/index" rel="noopener noreferrer"&gt;https://huggingface.co/docs/diffusers/index&lt;/a&gt;) es el componente que nos permite consumir cualquier modelo especializado en generación de imágenes, ejemplo stable diffusion.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from diffusers import AutoPipelineForText2Image
import torch

pipe = AutoPipelineForText2Image.from_pretrained("stabilityai/sdxl-turbo", torch_dtype=torch.float16, variant="fp16")
pipe.to("cuda")

prompt = "A cinematic shot of a baby racoon wearing an intricate italian priest robe."

image = pipe(prompt=prompt, num_inference_steps=1, guidance_scale=0.0).images[0]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A este proceso se le conoce como Inferencia de modelos LLM, y a partir de aquí basado en esta información puedes comenzar a aplicar inteligencia artificial en tus diferentes aplicaciones con Python.&lt;/p&gt;

&lt;p&gt;Cabe destacar que también he intentado usar la inferencia de modelos con otro lenguaje como nodejs y la verdad es que no funciona tan bien como con python, pero es importante mencionar que se necesita un hardware potente para la inferencia de modelos LLM por lo que lo que puedes ahorrar el uso de las API de ChatGPT o Gemini lo puedes gastar en comprar un hardware adecuado.&lt;/p&gt;

&lt;p&gt;Hasta aquí llega este mi primer articulo, espero que mi camino para el uso de modelos LLM en el desarrollo de software te ayude a saltar pasos en este camino.&lt;/p&gt;

</description>
      <category>python</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
