Agentes

Saptiva-Agents proporciona un conjunto de agentes predefinidos, cada uno con variaciones en la forma en que un agente puede responder a los mensajes. Todos los agentes comparten los siguientes atributos y métodos:

  • name: El nombre único del agente.

  • description: Descripción del agente.

  • run: Es el método que ejecuta al agente con una tarea dada, ya sea como una cadena de texto o una lista de mensajes, y devuelve un TaskResult. Se espera que los agentes mantengan estado, por lo que este método debería llamarse con mensajes nuevos y no con el historial completo.

  • run_stream: Igual que run(), pero devuelve un iterador de mensajes que heredan de BaseAgentEvent o BaseChatMessage, seguido finalmente por un TaskResult.


Assistant Agent

AssistantAgent es un agente incorporado que utiliza un modelo de lenguaje y tiene la capacidad de usar herramientas.

from saptiva_agents import SAPTIVA_LEGACY
from saptiva_agents.agents import AssistantAgent
from saptiva_agents.messages import StructuredMessage
from saptiva_agents.ui import Console
from saptiva_agents.base import SaptivaAIChatCompletionClient
# Definir una herramienta que busque información en la web.
async def web_search(query: str) -> str:
    """Find information on the web"""
    return "Saptiva-Agents es un marco de programación para construir aplicaciones multi-agente."

# Crea un agente que utilice el modelo SAPTIVA LEGACY
model_client = SaptivaAIChatCompletionClient(
    model=SAPTIVA_LEGACY,
    api_key="TU_SAPTIVA_API_KEY",
)

agent = AssistantAgent(
    name="assistant",
    model_client=model_client,
    tools=[web_search],
    system_message="Usa herramientas para resolver tareas.",
)

Obteniendo Respuestas

Podemos usar el método run() para obtener la respuesta del agente a un mensaje.

La llamada al método run() devuelve una TaskResult que contiene la lista de mensajes en el atributo messages, que almacena el “proceso de pensamiento” del agente que condujo a la respuesta final.

Nota

Es importante tener en cuenta que run() actualizará el estado interno del agente, añadiendo los mensajes al historial del agente. También puedes llamar a run() sin una tarea específica para que el agente genere respuestas en función de su estado actual.

Nota

Las herramientas son ejecutadas por el mismo agente directamente dentro de la misma llamada a run(). De forma predeterminada, el agente devolverá el resultado de la herramienta como la respuesta final.


Entrada Multi-Modal

El AssistantAgent puede manejar entradas multimodales proporcionando la entrada como un MultiModalMessage .

🖼️ Ejemplo avanzado de entrada multi-modal

Además del uso básico de MultiModalMessage, el siguiente ejemplo muestra cómo construir un flujo más completo para procesar imágenes desde distintas fuentes (URL, archivo local o cadena base64) y analizarlas mediante un agente configurado con el modelo Saptiva OCR.

Este ejemplo es útil cuando deseas automatizar la carga y análisis de imágenes dentro de un entorno de procesamiento o pipeline, conservando la flexibilidad de entrada y salida del agente.

El código incluye:

  • Funciones auxiliares para cargar imágenes desde diversas fuentes.

  • Configuración del modelo Saptiva OCR mediante SaptivaAIChatCompletionClient.

  • Creación de un AssistantAgent especializado en visión.

  • Ejecución asincrónica con o sin streaming para obtener la respuesta final.

A continuación, se muestra el ejemplo completo:


Transmisión de Mensajes

Podemos también transmitir cada mensaje a medida que es generado por el agente usando el método run_stream() y utilizar Console para imprimir los mensajes a medida que aparecen en la consola.

El método run_stream() devuelve un generador asincrónico que produce cada mensaje interno generado por el agente, seguido finalmente por un TaskResult como último elemento.

A partir de los mensajes, se puede observar que el asistente utilizó la herramienta web_search para recopilar información y respondió basándose en los resultados de búsqueda.

Usando Herramientas

Los Modelos de Lenguaje Grande (LLMs) suelen estar limitados a generar texto o respuestas de código. Sin embargo, muchas tareas complejas se benefician de la capacidad de usar herramientas externas que realizan acciones específicas, como obtener datos de APIs o bases de datos.

Para abordar esta limitación, los LLM modernos ahora pueden aceptar una lista de esquemas de herramientas disponibles (descripciones de herramientas y sus argumentos) y generar un mensaje de llamada a herramienta. Esta capacidad se conoce como Tool Calling o Function Calling y se está convirtiendo en un patrón popular en la construcción de aplicaciones basadas en agentes. Consulta la documentación de OpenAI y Anthropic para mas información acerca de tool calling en LLMs.

En Saptiva-Agents, el AssistantAgent puede utilizar herramientas para realizar acciones específicas. La herramienta web_search es una de estas herramientas que permite al agente asistente buscar información en la web. Una herramienta personalizada puede ser una función de Python o una subclase de BaseTool.

Por defecto, cuando AssistantAgent ejecuta una herramienta, devolverá la salida de la herramienta como una cadena en ToolCallSummaryMessage en su respuesta. Si tu herramienta no devuelve una cadena bien formada en lenguaje natural, puedes agregar un paso de reflexión para que el modelo resuma la salida de la herramienta, configurando el parámetro reflect_on_tool_use=True en el constructor de AssistantAgent .


Herramientas Integradas

Saptiva-Agents proporciona un conjunto de herramientas integradas que se puede utilizar con el Agente Asistente. Por ejemplo, puedes encontrar las siguientes herramientas:

  • http : Herramientas para hacer peticiones HTTP.

  • langchain: Adaptador para usar herramientas LangChain.

  • mcp: Herramientas para usar Model Chat Protocol (MCP) servers.


Function Tool

El AssistantAgent convierte automáticamente una función de Python en un FunctionTool que puede ser utilizado como herramienta por el agente y genera automáticamente el esquema de la herramienta a partir de la firma de la función y del docstring.

La herramienta web_search_func es un ejemplo de una function tool. El esquema se genera automáticamente.


Model Context Protocol Tools (MCP)

El AssistantAgent también puede usar herramientas que se sirven desde un servidor Protocolo de Contexto de Modelo (MCP) usando mcp_server_tools().


Langchain Tools

También puedes usar herramientas de la biblioteca Langchain envolviéndolas en LangChainToolAdapter.


Agente como una Herramienta

Cualquier BaseChatAgent puede usarse como una herramienta envolviéndolo en un AgentTool. Esto permite un flujo de trabajo multiagente dinámico y dirigido por modelos, donde un agente puede invocar a otros agentes como herramientas para resolver tareas.

Llamadas de Herramientas en Paralelo (Parallel Tool Calls)

Algunos modelos admiten llamadas de herramientas en paralelo, lo que puede ser útil para tareas que requieren llamar a múltiples herramientas simultáneamente. Por defecto, si el cliente del modelo produce múltiples llamadas de herramientas, AssistantAgent llamará a las herramientas en paralelo.

Es posible que desees desactivar las llamadas de herramientas paralelas cuando las herramientas tengan efectos secundarios que puedan interferir entre sí o cuando el comportamiento del agente deba ser coherente en diferentes modelos. Esto debe hacerse a nivel del cliente.

Para SaptivaAIChatCompletionClient, establezca parallel_tool_calls=False para desactivar las llamadas de herramientas en paralelo.


Iteraciones de Herramientas

Una llamada al modelo seguida de una llamada a una herramienta o de llamadas paralelas a herramientas constituye una sola iteración de herramienta. De forma predeterminada, el AssistantAgent ejecutará como máximo una iteración.

El agente se puede configurar para ejecutar múltiples iteraciones hasta que el modelo deje de generar llamadas a herramientas o se alcance el número máximo de iteraciones. Puedes controlar el número máximo de iteraciones estableciendo el parámetro max_tool_iterations en el constructor de AssistantAgent.


Salida Estructurada

La salida estructurada permite que los modelos devuelvan texto JSON estructurado con un esquema predefinido proporcionado por la aplicación. A diferencia del modo JSON, el esquema puede proporcionarse como una clase Pydantic BaseModel, que también se puede utilizar para validar el resultado.

Una vez que especificas la clase base del modelo en el parámetro output_content_type del constructor de AssistantAgent, el agente responderá con un StructuredMessage cuyo contenido será del tipo de la clase base del modelo.

De esta forma, puedes integrar directamente la respuesta del agente en tu aplicación y utilizar la salida del modelo como un objeto estructurado.

Nota

Cuando se establece output_content_type, por defecto se requiere que el agente reflexione sobre el uso de herramientas y devuelva un mensaje estructurado basado en el resultado de la llamada a la herramienta. Puedes desactivar este comportamiento configurando explícitamente reflect_on_tool_use=False.

La salida estructurada también es útil para incorporar razonamiento Chain-of-Thought (cadena de pensamiento) en las respuestas del agente. Consulta el ejemplo a continuación para saber cómo usar salida estructurada con el assistant agent.


Transmisión de Tokens

Puede transmitir los tokens generados por el cliente del modelo configurando model_client_stream=True. Esto hará que el agente genere mensajes ModelClientStreamingChunkEvent en run_stream().

Puede ver los fragmentos de transmisión en la salida anterior. Los fragmentos son generados por el cliente del modelo y son entregados por el agente a medida que se reciben. La respuesta final, la concatenación de todos los fragmentos, se suministra justo después del último fragmento.


Usando el Contexto del Modelo

El parámetro model_context de AssistantAgent se puede utilizar para pasar un objeto ChatCompletionContext. Esto permite que el agente use diferentes contextos de modelo, como BufferedChatCompletionContext para limitar el contexto enviado al modelo.

Por defecto, AssistantAgent utiliza el UnboundedChatCompletionContext, que envía todo el historial de conversación al modelo. Para limitar el contexto a los últimos n mensajes, puedes usar el BufferedChatCompletionContext. Para limitar el contexto por cantidad de tokens, puedes usar TokenLimitedChatCompletionContext.


Otros Agentes Preestablecidos

Los siguientes agentes predefinidos están disponibles:

  • UserProxyAgent: Un agente que toma la entrada del usuario y la devuelve como respuestas.

  • CodeExecutorAgent: Un agente que puede ejecutar código.

  • MultimodalWebSurfer: Un agente multimodal que puede buscar en la web y visitar páginas para obtener información.

  • FileSurfer: Un agente capaz de buscar y mirar archivos locales para obtener información.

  • VideoSurfer: Un agente que puede ver videos para obtener información. Para poder implementarlo necesitas tener instalado en tu sistema la librería ffmpeg

Nota

Para poder implementar FileSurfer y VideoSurfer necesitas tener instalado en tu sistema la librería ffmpeg .

En sistemas Debian/Ubuntu:

En Mac (con Homebrew):

En Windows:

  1. Descarga ffmpeg desde: https://ffmpeg.org/download.html

  2. Extrae y agrega la carpeta bin/ de ffmpeg al PATH del sistema.

  3. Verifica en la terminal (cmd o PowerShell):

Última actualización