24 de noviembre de 2024

AGENTS.md: Un formato base para agentes basados en LLM

Un formato simple y abierto para guiar a los agentes codificadores.

AGENTS.md: Un formato base para agentes basados en LLM

En los últimos meses, el desarrollo de agentes impulsados por modelos de lenguaje (LLM) ha acelerado la creación de sistemas capaces de razonar, ejecutar tareas complejas y coordinar múltiples herramientas de software. Sin embargo, esta expansión ha traído también fragmentación: cada framework describe sus agentes de manera distinta, lo que dificulta la interoperabilidad y la comprensión entre equipos.

Aquí es donde surge AGENTS.md, una propuesta que comienza a posicionarse —incluso dentro de tendencias como el Technology Radar de Thoughtworks— como una forma clara, legible y estandarizada para documentar y definir agentes LLM, sin depender del framework donde serán implementados.


¿Qué es AGENTS.md?

AGENTS.md es un formato inspirado en el estilo README.md, diseñado para describir un agente de IA de forma clara, portable y entendible tanto por humanos como por sistemas automáticos. Su objetivo es unificar cómo se define:

  • El propósito del agente
  • Sus capacidades
  • Sus restricciones
  • Las herramientas que puede usar
  • Su flujo de trabajo o políticas de acción
  • Ejemplos de interacción

Al final, AGENTS.md funciona como un contrato entre desarrolladores, stakeholders y el propio agente.


¿Por qué importa este enfoque?

El auge de los agentes comenzó con tareas simples —automatizar un flujo, llamar una API, procesar un documento—, pero ha escalado hacia:

  • Orquestación multipaso
  • Toma de decisiones condicionada
  • Integración con servicios externos
  • Acciones y validaciones basadas en herramientas

En este contexto, disponer de una documentación legible y estandarizada se vuelve indispensable. AGENTS.md elimina ambigüedades y permite:

1. Interoperabilidad entre frameworks

Ya sea que uses LangChain, Semantic Kernel, Autogen, ReAct o un framework propietario, AGENTS.md evita el bloqueo tecnológico: la definición vive fuera del código.

2. Claridad para equipos multidisciplinarios

Producto, ingeniería, diseño y negocio pueden entender el comportamiento del agente sin leer código.

3. Portabilidad entre plataformas

Un mismo archivo puede servir como blueprint en distintos entornos: web, backend, asistentes, automatizaciones, etc.

4. Mejora en el versionamiento y gobernanza de agentes

Permite comparar versiones, auditar cambios y mantener track del porqué de cada ajuste.

5. Facilita pruebas y simulaciones

Como el archivo puede incluir casos de uso y ejemplos, se convierte en una base perfecta para pruebas automatizadas.


Ejemplo de uso en un proyecto React

Supongamos que tienes un frontend en React donde puedes almacenar y versionar un archivo AGENTS.md como:

## Development Guidelines

### Component Development Standards

1. **Function Components First**: Use function components and Hooks
2. **TypeScript Types**: Define interfaces for all props
3. **Component Naming**: Use PascalCase, file name matches component name
4. **Single Responsibility**: Each component handles only one functionality

```tsx
// Example: Button Component
interface ButtonProps {
  variant: 'primary' | 'secondary' | 'danger';
  size?: 'small' | 'medium' | 'large';
  disabled?: boolean;
  onClick?: () => void;
  children: React.ReactNode;
}

export const Button: React.FC<ButtonProps> = ({
  variant,
  size = 'medium',
  disabled = false,
  onClick,
  children
}) => {
  return (
    <button
      className={`btn btn-${variant} btn-${size}`}
      disabled={disabled}
      onClick={onClick}
    >
      {children}
    </button>
  );
};
```
### State Management Standards

Using Zustand for state management:

```tsx
// store/userStore.ts
import { create } from 'zustand';

interface User {
  id: string;
  name: string;
  email: string;
}

interface UserState {
  user: User | null;
  isLoading: boolean;
  setUser: (user: User) => void;
  clearUser: () => void;
  setLoading: (loading: boolean) => void;
}

export const useUserStore = create<UserState>((set) => ({
  user: null,
  isLoading: false,
  setUser: (user) => set({ user }),
  clearUser: () => set({ user: null }),
  setLoading: (isLoading) => set({ isLoading }),
}));
```
### API Service Standards

```tsx
// services/api.ts
import axios from 'axios';

const api = axios.create({
  baseURL: import.meta.env.VITE_API_URL,
  timeout: 10000,
});

// Request interceptor
api.interceptors.request.use((config) => {
  const token = localStorage.getItem('token');
  if (token) {
    config.headers.Authorization = `Bearer ${token}`;
  }
  return config;
});

// Response interceptor
api.interceptors.response.use(
  (response) => response.data,
  (error) => {
    console.error('API Error:', error);
    return Promise.reject(error);
  }
);

export default api;
```
## Environment Setup

### Development Requirements
- Node.js >= 18.0.0
- npm >= 8.0.0 or yarn >= 1.22.0

### Installation Steps
```bash
# 1. Create project
npm create vite@latest my-react-app -- --template react-ts

# 2. Navigate to project directory
cd my-react-app

# 3. Install dependencies
npm install

# 4. Install additional dependencies
npm install zustand react-router-dom axios
npm install -D @types/node

# 5. Start development server
npm run dev
```

### Environment Variables Configuration
```env
# .env.local
VITE_API_URL=http://localhost:3001/api
VITE_APP_TITLE=My React App
VITE_ENABLE_MOCK=false
```

Hacia un futuro con agentes auditables y estandarizados

AGENTS.md es un paso natural hacia un ecosistema donde los agentes son:

  • Declarativos
  • Auditables
  • Portables
  • Versionables

En un mundo donde los LLM evolucionan semana a semana, adoptar un estándar abierto para describir agentes es una ventaja estratégica.


Para saber más

Consulta el sitio AGENTS.md y descarga algunos ejemplos.