<?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: Guillermo Baigorria</title>
    <description>The latest articles on DEV Community by Guillermo Baigorria (@gwerk).</description>
    <link>https://dev.to/gwerk</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4213623%2F95d56272-8c7f-490b-b303-f6b32c7d59b0.png</url>
      <title>DEV Community: Guillermo Baigorria</title>
      <link>https://dev.to/gwerk</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gwerk"/>
    <language>en</language>
    <item>
      <title>El modelo se alquila, el andamiaje es tuyo: cómo hacer un agente de IA que no dependa del modelo</title>
      <dc:creator>Guillermo Baigorria</dc:creator>
      <pubDate>Wed, 28 Oct 2026 18:15:24 +0000</pubDate>
      <link>https://dev.to/gwerk/el-modelo-se-alquila-el-andamiaje-es-tuyo-como-hacer-un-agente-de-ia-que-no-dependa-del-modelo-32cj</link>
      <guid>https://dev.to/gwerk/el-modelo-se-alquila-el-andamiaje-es-tuyo-como-hacer-un-agente-de-ia-que-no-dependa-del-modelo-32cj</guid>
      <description>&lt;p&gt;Quien programa tiene Claude Code o Codex. Quien trabaja en una oficina tiene Claude Cowork o ChatGPT Work. Cada uno es un harness: el andamiaje que rodea a un modelo de IA para que haga un trabajo real, con herramientas, contexto y reglas. Quien instala paneles en un techo no tiene uno pensado para su trabajo.&lt;/p&gt;

&lt;p&gt;En Werk lo construimos para equipos en movimiento, y la primera decisión fue separarlo del modelo: el modelo entiende y propone, y el harness decide qué lee, qué toca y qué queda registrado. Lo hacemos posible con cuatro prácticas: hablar con los modelos a través de una interfaz propia, que cada agente pida un nivel de trabajo y no un modelo, darles a todos los modelos el mismo formato y poner primero lo que no cambia. Con este post empieza una serie sobre cómo está hecho. Por qué existe Werk lo contamos en &lt;a href="https://blog.getwerk.ai/es/posts/por-que-construimos-werk" rel="noopener noreferrer"&gt;Por qué creamos Werk&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué hace el modelo y qué hace el harness
&lt;/h2&gt;

&lt;p&gt;Pensemos en una nota de voz de cuatro segundos, grabada arriba de un techo: "Listo lo de Novak". Para que esa frase quede bien registrada hacen falta dos trabajos distintos.&lt;/p&gt;

&lt;p&gt;El modelo entiende el pedido: se terminó un trabajo, y de las tarjetas que tiene delante, la de Novak es la que se nombra. El harness hace todo lo demás: elige qué tarjetas mostrarle, revisa que esa persona pueda modificarla, registra el cambio una sola vez aunque el mensaje se procese dos veces y avisa a quien tiene que enterarse.&lt;/p&gt;

&lt;p&gt;Un &lt;a href="https://arxiv.org/abs/2609.00006" rel="noopener noreferrer"&gt;estudio publicado en arXiv&lt;/a&gt; en 2026 leyó el código fuente de once harnesses de programación, entre ellos Claude Code, Codex, Gemini CLI, Hermes y Pi. Lo define como lo que conecta al modelo con las herramientas, el contexto, la seguridad, la orquestación y las extensiones. En simple: el modelo entiende y propone. El harness decide qué lee, qué toca y qué queda registrado.&lt;/p&gt;

&lt;p&gt;El mismo estudio encontró que ninguno de los once harnesses estudiados importa un framework general de agentes: todos usan loops escritos a mano. Anthropic llegó a lo mismo en &lt;a href="https://www.anthropic.com/engineering/building-effective-agents" rel="noopener noreferrer"&gt;Building effective agents&lt;/a&gt; (2024): las implementaciones más exitosas que vio no usaban frameworks complejos, y su consejo es empezar llamando directamente a las APIs de los modelos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo separar el harness del modelo
&lt;/h2&gt;

&lt;p&gt;Si el harness es el que decide, conviene que no dependa de un modelo en particular. Los modelos mejoran cada pocos meses, no todos rinden igual en todo, y ningún servicio en la nube está disponible el 100% del tiempo: los propios proveedores lo informan con transparencia en sus páginas de estado, como las de &lt;a href="https://status.claude.com/history" rel="noopener noreferrer"&gt;Anthropic&lt;/a&gt; y &lt;a href="https://status.openai.com/history" rel="noopener noreferrer"&gt;OpenAI&lt;/a&gt;. Estas son las cuatro prácticas que usamos para que la nota de Novak funcione igual, cambie el modelo que cambie.&lt;/p&gt;

&lt;p&gt;Para llegar a ellas leímos el código de más de quince proyectos con licencia abierta (MIT o Apache 2.0), como Codex, Gemini CLI, OpenHands, Aider y Pi, y la documentación de otros. Tomamos ideas, no código.&lt;/p&gt;

&lt;p&gt;La primera es hablar con los modelos a través de una interfaz propia. Ninguna parte del harness llama directamente a un proveedor: &lt;strong&gt;el proveedor es configuración&lt;/strong&gt;. Trabajamos con los principales de la industria, y pasar de uno a otro es un cambio de configuración que medimos antes de hacerlo.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqb3crcc2l6lz6k96mwkn.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqb3crcc2l6lz6k96mwkn.png" alt="Diagrama: el equipo manda notas de voz, fotos, mensajes y archivos; el harness (router, contexto, herramientas, código y verificación) los convierte en el registro del equipo y en avisos; debajo, una interfaz propia conecta con proveedores de modelos intercambiables." width="800" height="415"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;La segunda es que cada agente pida un nivel de trabajo, no un modelo. El agente que marca como hecha la tarjeta de Novak no sabe qué modelo lo atiende: declara el nivel que necesita, y qué modelo ocupa ese lugar lo decide nuestra batería de casos, agente por agente.&lt;/p&gt;

&lt;p&gt;La tercera es un formato que todos los modelos lean igual. Seguimos lo que recomienda la industria, por ejemplo las guías de &lt;a href="https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" rel="noopener noreferrer"&gt;Anthropic&lt;/a&gt; y de &lt;a href="https://developers.openai.com/api/docs/guides/prompt-engineering" rel="noopener noreferrer"&gt;OpenAI&lt;/a&gt;: cada tipo de dato dentro de su propia etiqueta, para que el modelo sepa dónde empieza y dónde termina cada cosa. Así, la conversación, las tarjetas y la nota de voz llegan con la misma forma a cualquier modelo.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Ninguno de los once harnesses estudiados importa un framework general de agentes.&lt;/p&gt;

&lt;p&gt;(Barbaste, Darrigol, Vu y Wiltberger, 2026)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;La cuarta es poner lo estable adelante y lo que cambia al final. Las instrucciones de cada agente son las mismas en cada mensaje; la nota de Novak, no. Si lo estable va primero, el proveedor reutiliza lo que ya procesó y la respuesta llega antes y cuesta menos: con &lt;a href="https://github.com/deepseek-ai/deepseek-harness" rel="noopener noreferrer"&gt;DeepSeek Harness&lt;/a&gt;, un usuario &lt;a href="https://github.com/deepseek-ai/deepseek-harness/discussions/2064" rel="noopener noreferrer"&gt;midió un 98% de aciertos de caché&lt;/a&gt; en 650 pedidos. La optimización del caché da para un artículo propio, que vamos a escribir más adelante.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lo que ningún SDK puede resolver por ti
&lt;/h2&gt;

&lt;p&gt;Los SDK de agentes, como el &lt;a href="https://openai.github.io/openai-agents-python/" rel="noopener noreferrer"&gt;Agents SDK de OpenAI&lt;/a&gt; o el &lt;a href="https://github.com/anthropics/claude-agent-sdk-python" rel="noopener noreferrer"&gt;Claude Agent SDK&lt;/a&gt;, son una muy buena forma de empezar: resuelven el ciclo de llamar al modelo, ejecutar herramientas y repetir. Los estudiamos a fondo, junto con LangGraph, Vercel AI SDK, Pydantic AI y Mastra. Pero lo más difícil de la nota de Novak no está en ese ciclo.&lt;/p&gt;

&lt;p&gt;Está en lo que es propio de un equipo. La tarjeta de Novak vive en un registro que comparten varias personas, cada una con sus permisos. Si Werk pregunta cuál de dos tarjetas es y la respuesta llega como "la segunda", esa respuesta tiene que quedar atada a lo que esa persona vio en pantalla. Eso depende de cada producto, y los buenos SDK lo dicen con claridad: la documentación de &lt;a href="https://mastra.ai/docs/agents/agent-approval" rel="noopener noreferrer"&gt;Mastra&lt;/a&gt; recomienda que una aprobación quede atada a los argumentos exactos que vio quien aprobó.&lt;/p&gt;

&lt;p&gt;Tampoco alcanza con un agente personal. &lt;a href="https://github.com/NousResearch/hermes-agent" rel="noopener noreferrer"&gt;Hermes Agent&lt;/a&gt; y &lt;a href="https://github.com/openclaw/openclaw" rel="noopener noreferrer"&gt;OpenClaw&lt;/a&gt;, dos de los proyectos abiertos que leímos, están pensados para una persona. Hermes lo explica en su &lt;a href="https://github.com/NousResearch/hermes-agent/blob/main/SECURITY.md" rel="noopener noreferrer"&gt;política de seguridad&lt;/a&gt;: es un agente personal de un solo usuario, y todos los que tienen acceso reciben la misma confianza. Para un agente personal es lo correcto. En un equipo, cada persona ve lo suyo y lo que comparte el proyecto, y el modelo nunca decide quién ve qué.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;El modelo entiende y propone. El harness decide qué lee, qué toca y qué queda registrado.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Por eso armamos un harness propio, y por eso la próxima parte de la serie cuenta su pieza central: el router, que recibe la nota de Novak y la reparte al agente que corresponde.&lt;/p&gt;

&lt;h2&gt;
  
  
  El modelo cambia, el harness queda
&lt;/h2&gt;

&lt;p&gt;Como las decisiones importantes viven en el harness, el modelo se puede elegir, comparar y cambiar cuando aparece uno mejor. El harness es lo propio: qué lee cada agente, qué verifica el código antes de tocar el registro, cómo se detecta un error y cómo se corrige sin romper otra cosa.&lt;/p&gt;

&lt;p&gt;Los modelos van a seguir mejorando. Con un harness bien separado, cada mejora llega sola al uso diario: una nota de voz mejor entendida, la tarjeta correcta, el aviso a quien tiene que enterarse.&lt;/p&gt;

&lt;p&gt;Los equipos que usan Werk no tienen que hacer nada para aprovecharla. Ese trabajo lo hace el harness.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Las ideas y las decisiones son mías; usé IA para ayudar a editar el texto.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>agents</category>
      <category>spanish</category>
    </item>
    <item>
      <title>Rent the model, own the harness: how to build a model-agnostic AI agent</title>
      <dc:creator>Guillermo Baigorria</dc:creator>
      <pubDate>Wed, 28 Oct 2026 17:57:21 +0000</pubDate>
      <link>https://dev.to/gwerk/rent-the-model-own-the-harness-how-to-build-a-model-agnostic-ai-agent-17l5</link>
      <guid>https://dev.to/gwerk/rent-the-model-own-the-harness-how-to-build-a-model-agnostic-ai-agent-17l5</guid>
      <description>&lt;p&gt;Developers have Claude Code or Codex. Office workers have Claude Cowork or ChatGPT Work. Each of these is a harness: the scaffolding around an AI model that lets it do real work, with tools, context and rules. The person installing solar panels on a roof has nothing built for their work.&lt;/p&gt;

&lt;p&gt;At Werk we built one for teams on the move, and our first decision was to keep it separate from the model: the model understands and proposes, and the harness decides what it reads, what it touches and what gets recorded. Four practices make that possible: talk to models through an interface of your own, have each agent ask for a level of work instead of a model, give every model the same format, and put what stays the same first. This post starts a series on how it is built. Why Werk exists is in &lt;a href="https://blog.getwerk.ai/posts/why-we-built-werk" rel="noopener noreferrer"&gt;Why we built Werk&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the model does and what the harness does
&lt;/h2&gt;

&lt;p&gt;Take a four-second voice note recorded on a roof: "Done with the Novak job." Getting that sentence recorded correctly takes two different kinds of work.&lt;/p&gt;

&lt;p&gt;The model understands the request: a job is finished, and of the cards in front of it, Novak's is the one being named. The harness does everything else. It chooses which cards to show the model, checks that this person may change the card, records the change once even if the message is processed twice, and tells whoever needs to know.&lt;/p&gt;

&lt;p&gt;A &lt;a href="https://arxiv.org/abs/2609.00006" rel="noopener noreferrer"&gt;study published on arXiv&lt;/a&gt; in 2026 read the source code of eleven coding harnesses, including Claude Code, Codex, Gemini CLI, Hermes and Pi. It defines a harness as what connects a model to tools, context, safety, orchestration and extensions. Put simply: the model understands and proposes. The harness decides what it reads, what it touches and what gets recorded.&lt;/p&gt;

&lt;p&gt;The same study found that none of the eleven harnesses studied imports a general-purpose agent framework; all of them run hand-written loops. Anthropic reached the same conclusion in &lt;a href="https://www.anthropic.com/engineering/building-effective-agents" rel="noopener noreferrer"&gt;Building effective agents&lt;/a&gt; (2024): the most successful implementations it saw did not use complex frameworks, and its advice is to start by calling model APIs directly.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to keep the harness separate from the model
&lt;/h2&gt;

&lt;p&gt;If the harness makes the decisions, it should not depend on any one model. Models improve every few months, no model is best at everything, and no cloud service is up 100% of the time, as providers report openly on their status pages, such as &lt;a href="https://status.claude.com/history" rel="noopener noreferrer"&gt;Anthropic's&lt;/a&gt; and &lt;a href="https://status.openai.com/history" rel="noopener noreferrer"&gt;OpenAI's&lt;/a&gt;. These are the four practices that keep the Novak note working whatever model is behind it.&lt;/p&gt;

&lt;p&gt;We arrived at them by reading the code of more than fifteen open-source projects (MIT or Apache 2.0), such as Codex, Gemini CLI, OpenHands, Aider and Pi, and the documentation of others. We took ideas, not code.&lt;/p&gt;

&lt;p&gt;The first is to talk to models through an interface of your own. No part of the harness calls a provider directly: &lt;strong&gt;the provider is configuration&lt;/strong&gt;. We work with the major providers in the industry, and moving from one to another is a configuration change we measure before we make it.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fktmxqx57am7cnv7mwqe3.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fktmxqx57am7cnv7mwqe3.png" alt="Diagram: the team sends voice notes, photos, messages and files; the harness (router, context, tools, code and verification) turns them into the team's record and notices; below, an interface of its own connects to swappable model providers." width="800" height="415"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The second is that each agent asks for a level of work, not a model. The agent that marks Novak's card as done does not know which model serves it. It declares the level it needs, and our battery of test cases decides, agent by agent, which model fills that slot.&lt;/p&gt;

&lt;p&gt;The third is a format every model reads the same way. We follow what the industry recommends, for example the guides from &lt;a href="https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" rel="noopener noreferrer"&gt;Anthropic&lt;/a&gt; and &lt;a href="https://developers.openai.com/api/docs/guides/prompt-engineering" rel="noopener noreferrer"&gt;OpenAI&lt;/a&gt;: each kind of data inside its own tag, so the model knows where each piece starts and ends. The conversation, the cards and the voice note reach any model in the same shape.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;None of the eleven harnesses studied imports a general-purpose agent framework.&lt;/p&gt;

&lt;p&gt;(Barbaste, Darrigol, Vu and Wiltberger, 2026)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The fourth is to put what stays the same first and what changes last. Each agent's instructions are identical on every message; the Novak note is not. With the stable part first, the provider reuses what it has already processed, so the answer arrives sooner and costs less: with &lt;a href="https://github.com/deepseek-ai/deepseek-harness" rel="noopener noreferrer"&gt;DeepSeek Harness&lt;/a&gt;, one user &lt;a href="https://github.com/deepseek-ai/deepseek-harness/discussions/2064" rel="noopener noreferrer"&gt;measured a 98% cache hit rate&lt;/a&gt; across 650 requests. Cache optimization deserves a post of its own, and we will write it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What no SDK can solve for you
&lt;/h2&gt;

&lt;p&gt;Agent SDKs such as the &lt;a href="https://openai.github.io/openai-agents-python/" rel="noopener noreferrer"&gt;OpenAI Agents SDK&lt;/a&gt; and the &lt;a href="https://github.com/anthropics/claude-agent-sdk-python" rel="noopener noreferrer"&gt;Claude Agent SDK&lt;/a&gt; are a great way to start: they handle the cycle of calling the model, running tools and repeating. We studied them closely, along with LangGraph, the Vercel AI SDK, Pydantic AI and Mastra. But the hardest part of the Novak note is not in that cycle.&lt;/p&gt;

&lt;p&gt;It is in what belongs to a team. Novak's card lives in a record that several people share, each with their own permissions. If Werk asks which of two cards was meant and the answer comes back as "the second one," that answer has to stay tied to what that person saw on screen. That depends on each product, and the good SDKs say so plainly: &lt;a href="https://mastra.ai/docs/agents/agent-approval" rel="noopener noreferrer"&gt;Mastra's documentation&lt;/a&gt; recommends binding an approval to the exact arguments the approver saw.&lt;/p&gt;

&lt;p&gt;A personal agent is not enough either. &lt;a href="https://github.com/NousResearch/hermes-agent" rel="noopener noreferrer"&gt;Hermes Agent&lt;/a&gt; and &lt;a href="https://github.com/openclaw/openclaw" rel="noopener noreferrer"&gt;OpenClaw&lt;/a&gt;, two of the open-source projects we read, are built for one person. Hermes says so in its &lt;a href="https://github.com/NousResearch/hermes-agent/blob/main/SECURITY.md" rel="noopener noreferrer"&gt;security policy&lt;/a&gt;: it is a single-tenant personal agent, and everyone with access is equally trusted. For a personal agent, that is the right call. On a team, each person sees their own work and what the project shares, and the model never decides who sees what.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The model understands and proposes. The harness decides what it reads, what it touches and what gets recorded.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is why we built our own harness, and why the next part of this series covers its central piece: the router, which receives the Novak note and hands it to the right agent.&lt;/p&gt;

&lt;h2&gt;
  
  
  The model changes, the harness stays
&lt;/h2&gt;

&lt;p&gt;Because the important decisions live in the harness, the model can be chosen, compared and replaced when a better one comes along. The harness is what is yours: what each agent reads, what the code checks before touching the record, how an error is caught and how it is fixed without breaking something else.&lt;/p&gt;

&lt;p&gt;Models will keep getting better. With a well-separated harness, each improvement reaches daily use on its own: a voice note understood better, the right card, the notice to whoever needs to know.&lt;/p&gt;

&lt;p&gt;Teams that use Werk do not have to do anything to benefit. The harness does that work.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The ideas and decisions are mine; I used AI to help edit the text.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>agents</category>
      <category>architecture</category>
    </item>
  </channel>
</rss>
