DEV Community

Cover image for Cómo construí mi primer Agente de IA
Ramses Mata for AWS

Posted on

Cómo construí mi primer Agente de IA

Quiero organizar mejor mi día. Tengo tareas, juntas, deadlines y todo vive en mi cabeza hasta que se me olvida algo. Solo que hay un detalle, a mi me encanta estar en la terminal y usar herramientas cli.

Entonces pensé: ¿y si pudiera decirle a mi terminal "agenda una junta para mañana a las 10" y que simplemente lo haga? Te voy a mostrar cómo construí mi propio agente, qué decisiones tomé, y cómo funciona por dentro.


1. Lo que construí

Un organizador de día que vive en mi terminal. Tiene un chat donde le hablo en lenguaje natural, y paneles que me muestran mis tareas, mi calendario y mis próximos compromisos. Lo interesante es lo que hay detrás: un agente de IA que entiende lo que le pido, decide qué hacer, y actúa sobre mis datos.

Arquitectura general del sistema

El agente no toca la base de datos directamente. Cuando necesita crear una tarea o un evento, le pide a la TerminalUI que lo haga. Un solo proceso controla los datos, y el agente se enfoca en entender al usuario.

En este artículo me enfoco en el agente: cómo lo construí, qué piezas tiene, y cómo funciona cada una.


2. Creando el agente con Strands Agents

Un agente tiene tres componentes principales: modelo, herramientas e instrucciones. Strands Agents te da una forma directa de conectar esas piezas:

from strands import Agent
from strands_tools import current_time, file_read, file_write

agent = Agent(
    model=modelo,
    tools=[current_time, create_task, create_event, ...],
    system_prompt="Eres un asistente que organiza el día del usuario..."
)
Enter fullscreen mode Exit fullscreen mode

Con esas líneas ya tienes un agente funcional. Le pasas un modelo, le das herramientas, le defines instrucciones, y Strands se encarga del loop.


3. Eligiendo el modelo

Mi primer requisito era privacidad. Mis tareas son personales, no quiero enviarlas a un servidor externo. Así que empecé con un modelo local usando Ollama.

Opción 1: modelo local con Ollama

from strands.models.ollama import OllamaModel

modelo = OllamaModel(
    model_id="llama3.2:3b",
    host="http://localhost:11434",
    max_tokens=4096,
)
Enter fullscreen mode Exit fullscreen mode

El agente usa un modelo que corre en mi computadora, así que nada de mi información sale al internet. Sé que aún es difícil correr modelos fundacionales de manera local pero Can I Run AI te ayuda a saber qué modelos soporta tu hardware.

Opción 2: ¿quieres algo más capaz?

Si necesitas mejor razonamiento o mejor tool use y tienes una cuenta de AWS puedes cambiar a Amazon Bedrock con una sola línea:

from strands.models import BedrockModel

modelo = BedrockModel()
Enter fullscreen mode Exit fullscreen mode

Fíjate en algo interesante: el resto del código no cambia. Las herramientas, el system prompt, la lógica, todo sigue igual, solo cambias el modelo. Strands abstrae esa complejidad y una buena noticia es que soporta más model providers que los que te mencioné. Gemini, OpenAI, Anthropic son solo algunos de los que están soportados, puedes ver la lista completa aquí.

Yo uso Ollama para el día a día y Bedrock cuando necesito que el agente maneje tareas más complejas.


4. Las Tools

Sin herramientas, mi agente solo podría decirme "deberías crear una tarea", pero no podría crearla. Con herramientas, le digo "agenda una junta para mañana" y la junta aparece en mi calendario.

4.1 Built-in tools

Strands viene con herramientas listas en strands_tools. Yo estoy usando current_time, esta herramienta me da la fecha y hora actual del sistema. ¿Por qué current_time importa? Si le digo "agenda algo para mañana", el agente necesita saber qué día es hoy.

Cuando le digo "agenda X para mañana", el agente sabe qué día es hoy, calcula qué día es mañana y crea el evento con la fecha correcta.

4.2 Custom tools

Mi agente necesita hacer cosas específicas: crear tareas, eventos, listar pendientes, gestionar grupos. En Strands, crear una herramienta es decorar una función con @tool:

from strands import tool

@tool # <- 1.
def query_tasks(date: str) -> str: # <- 2.
    # 3.
    """
    Busca tareas en la base de datos con una fecha específica

    Usa esta herramienta cuando el usuario te pregunta por 
    tareas con una fecha en específico
    """
    #4.
    tasks = db.query(f"SELECT * FROM tasks WHERE date = '{date}'")
    return str(tasks)
Enter fullscreen mode Exit fullscreen mode

Fíjate en lo que está pasando:

  1. @tool le dice a Strands que esta función está disponible para el agente.
  2. Los type hints definen los parámetros que el modelo debe proporcionar.
  3. El docstring es crucial. Strands lo usa para decirle al modelo qué hace la herramienta y cuándo usarla.
  4. El cuerpo es código Python normal.

Lo poderoso: tú defines qué puede hacer el agente, y el modelo decide cuándo hacerlo. Yo nunca le digo "cuando el usuario diga X, llama a create_task". El modelo razona y decide por sí mismo.

Flujo de una tool call

En mi proyecto tengo 16 herramientas custom. Pero el principio es el mismo para todas: @tool, un docstring claro, y lógica en el cuerpo.


5. El System Prompt

El system prompt es el primer prompt que recibe el modelo y es lo que define cómo se va a comportar nuestro agente. Aquí viven las reglas de negocio y esa es la diferencia entre un agente que hace cosas random y uno que se comporta de forma predecible.

system_prompt = """
Eres mi asistente personal de productividad.
Ayudame a organizar mi día, revisar mis tareas
y planificar mi agenda. Se conciso y práctico.
"""
Enter fullscreen mode Exit fullscreen mode

6. El loop en acción

Veamos todo junto. Le digo a mi agente: "Agenda una junta con el equipo para mañana a las 10".

Secuencia end-to-end: de mensaje a dato en SQLite

  1. Recibo el mensaje. El agente lee la petición del usuario.

  2. Piensa. Ve qué día es hoy y razona: "mañana es 2026-05-08, quiere un evento a las 10:00".

  3. Actúa. Invoca create_event, la herramienta persiste el evento en SQLite y devuelve el resultado.

  4. Observa. El evento se creó con id 7.

  5. Responde. "Listo, agendé tu junta con el equipo para mañana 8 de mayo a las 10:00."


7. Construye el tuyo

Un agente en Strands se compone de tres piezas:

Pieza Qué es
Modelo El cerebro que razona
Tools Las acciones que puede ejecutar
System Prompt Las reglas y la personalidad

Un agente con 2-3 herramientas ya resuelve problemas reales:

  • Un agente que gestione tus notas en Markdown
  • Un agente que consulte el estado de tus servicios en AWS
  • Un agente que organice tus fotos por fecha y lugar

El patrón siempre es el mismo, eliges un modelo, defines herramientas con @tool y escribes un system prompt con reglas claras, y dejas que Strands maneje el loop.

Strands Agents es open source y tiene documentación para arrancar en minutos. El código de mi organizador está en GitHub.


Preguntas frecuentes

¿Cuánto cuesta correr un agente local?

Nada. Con Ollama y Llama 3.2, todo corre en tu máquina sin costo. Si usas Bedrock, pagas por token procesado, pero para uso personal es muy económico.

¿El agente puede equivocarse?

Sí. A veces interpreta mal una fecha o elige la herramienta incorrecta. Por eso el system prompt con reglas claras es importante, y por eso las herramientas validan sus inputs antes de actuar.

¿Puedo usar otro framework?

Sí. Los conceptos (modelo + tools + prompt + loop) son universales. Yo elegí Strands porque es simple, open source, y me deja controlar cada pieza.


Conclusión

Empecé con un problema simple: quiero organizar mi día sin salir de la terminal. Terminé construyendo un agente de IA que entiende lenguaje natural, resuelve fechas relativas, y gestiona mis tareas y eventos.

Las piezas clave:

  • Modelo: el cerebro. Ollama para local, Bedrock para la nube. Strands te deja cambiar sin reescribir.
  • Tools: las manos. Funciones Python con @tool que definen qué puede hacer el agente.
  • System Prompt: el criterio. Reglas específicas que hacen al agente predecible y útil.
  • El loop: Strands maneja el ciclo Pensar → Actuar → Observar automáticamente.

Empieza con un modelo, dos herramientas, y un prompt claro. Después iteras.

Nos vemos en el próximo artículo.

Top comments (0)