‎
loginstudio
  • Overview
  • COMIENZA
    • Quickstart
  • Basicos
    • Modelos Disponibles
    • TEXT API (NEW)
    • TEXT API (ACTUAL)
    • Formas de pago
  • Mejores prácticas
    • RAG
    • Prompteo
  • Saptiva Agents
    • Introducción
    • Instalación
    • Quick Start
    • Tutorial
      • Modelos
      • Mensajes
      • Agentes
      • Equipos
      • Human-in-the-Loop
      • Terminación
      • Manejo De Estados
    • Avanzado
      • Agentes Personalizados
      • Selector Group Chat
      • Memoria
      • Logging
      • Serialización
    • Conceptos Del Núcleo
      • Quick Start
      • Aplicaciones De Agentes & Multi-Agentes
      • Entornos De Ejecución Para Agentes
      • Pila De Aplicación
      • Identidad & Ciclo De Vida Del Agente
      • Tema & Suscripción (Topic & Subscription)
    • Guía De Framework
      • Agente & Entorno De Ejecución De Agentes
      • Mensaje & Comunicación
      • Open Telemetry
    • Guía De Componentes
      • Cliente De Modelo
      • Contexto De Modelo
      • Herramientas (Tools)
    • Patrones De Diseño Multi-Agente
      • Agentes Concurrentes
      • Flujo de Trabajo Secuencial
      • Transferencia De Tareas (Handoffs)
      • Mezcla De Agentes (Mixture Of Agents)
      • Multi-Agent Debate
      • Reflexión (Reflection)
    • Ejemplos
      • Planificación De Viajes
      • Investigación De Empresas
      • Revisión De Literatura
    • PyPi
  • Manuales
  • Model cards
    • Quickstart
      • Model Card: DeepSeek R1 Lite
      • Model Card: LLAMA3.3 70B
      • Model Card: Saptiva Turbo
      • Model Card: Phi 4
      • Model Card: Qwen
      • Model Card: Gemma 3
  • DEFINICIONES
    • Temperature
Con tecnología de GitBook
En esta página
  • Assistant Agent
  • Obteniendo Respuestas
  • Entrada Multi-Modal
  • Transmisión de Mensajes
  • Usando Herramientas
  • Herramientas Integradas
  • Function Tool
  • Model Context Protocol Tools (MCP)
  • Langchain Tools
  • Llamadas de Herramientas en Paralelo (Parallel Tool Calls)
  • Ejecutar un Agente en un Bucle
  • Salida Estructurada
  • Transmisión de Tokens
  • Usando el Contexto del Modelo
  • Otros Agentes Preestablecidos
  1. Saptiva Agents
  2. Tutorial

Agentes

AnteriorMensajesSiguienteEquipos

Última actualización hace 1 mes

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.

  • on_messages(): Envía al agente una secuencia de ChatMessage para obtener una Response. **Es importante recordar que se espera que los agentes mantengan el estado y que este método se llame con nuevos mensajes, no con el historial completo.

  • on_messages_stream(): Lo mismo que on_messages(), pero devuelve un iterador de AgentEvent o ChatMessage seguido de una Response como último item.

  • on_reset(): Restablece el agente a su estado inicial.

  • run() and run_stream(): Métodos de conveniencia de Teams que llaman a on_messages() y on_messages_stream() respectivamente, pero ofrecen la misma interfaz que .


Assistant Agent

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

from saptiva_agents import LLAMA_MODEL
from saptiva_agents.agents import AssistantAgent
from saptiva_agents.messages import StructuredMessage, TextMessage
from saptiva_agents.ui import Console
from saptiva_agents.core import CancellationToken
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 Llama 3.3 70B
model_client = SaptivaAIChatCompletionClient(
    model=LLAMA_MODEL,
    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 on_messages() para obtener la respuesta del agente a un mensaje.

async def assistant_run() -> None:
    response = await agent.on_messages(
        [TextMessage(content="Encuentra información de Saptiva-Agents", source="user")],
        cancellation_token=CancellationToken(),
    )
    print(response.inner_messages)
    print(response.chat_message)


# Usa asyncio.run(assistant_run()) cuando corras un script.
await assistant_run()
[ToolCallRequestEvent(source='assistant', models_usage=RequestUsage(prompt_tokens=598, completion_tokens=16), content=[FunctionCall(id='call_9UWYM1CgE3ZbnJcSJavNDB79', arguments='{"query":"Saptiva-Agents"}', name='web_search')], type='ToolCallRequestEvent'), ToolCallExecutionEvent(source='assistant', models_usage=None, content=[FunctionExecutionResult(content='Saptiva-Agents es un marco de programación para construir aplicaciones multi-agente.', call_id='call_9UWYM1CgE3ZbnJcSJavNDB79', is_error=False)], type='ToolCallExecutionEvent')]
source='assistant' models_usage=None content='Saptiva-Agents es un marco de programación para construir aplicaciones multi-agente.' type='ToolCallSummaryMessage'

La llamada al método on_messages() devuelve una Response que contiene la respuesta final del agente en el atributo chat_message, así como una lista de mensajes internos en el atributo inner_messages, que almacena el “proceso de pensamiento” del agente que condujo a la respuesta final.

Nota

Es importante tener en cuenta que on_messages() actualizará el estado interno del agente, añadiendo los mensajes al historial del agente. Por lo tanto, debes llamar a este método con nuevos mensajes. **No debes llamar repetidamente a este método con los mismos mensajes o con el historial completo.

Nota

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

También puedes llamar al método run(), que es un método de conveniencia que llama a on_messages(). Sigue la misma interfaz que Teams y devuelve un objeto TaskResult .


Entrada Multi-Modal

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

from io import BytesIO
​
import requests
from saptiva_agents.messages import MultiModalMessage
from saptiva_agents.core import Image
from PIL import Image as PILImage
​
# Crea un mensaje multimodal con una imagen aleatoria y texto.
image_bytes = BytesIO(requests.get("https://picsum.photos/300/200").content)
img = Image.from_pil(PILImage.open(image_bytes))
multi_modal_message = MultiModalMessage(content=["Puedes describir el contenido de esta imágen?", img], source="User")
img
# Usa asyncio.run(...) cuando lo ejecutes en un script.
response = await agent.on_messages([multi_modal_message], CancellationToken())
print(response.chat_message.content)
La imagen muestra un coche antiguo, probablemente de los años 30 o 40, con un diseño clásico y elegante. El coche parece estar personalizado o bien mantenido, como se indica por su exterior brillante y su postura baja. Tiene una parrilla prominente y faros redondos. Hay una matrícula en el frente con el texto "FARMER BOY". El escenario parece ser una calle con edificios de estilo antiguo al fondo, sugiriendo un tema retro o histórico.

También puede usar MultiModalMessage como una entrada de task para el método run() .


Transmisión de Mensajes

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

async def assistant_run_stream() -> None:
    #Opción 1: leer cada mensaje del flujo (como se muestra en el siguiente ejemplo).
    # async for message in agent.on_messages_stream(
    #     [TextMessage(content="Encuentra información de Saptiva-Agents", source="user")],
    #     cancellation_token=CancellationToken(),
    # ):
    #     print(message)

   # Opción 2: usar Console para imprimir todos los mensajes a medida que aparecen.
    await Console(
        agent.on_messages_stream(
            [TextMessage(content="Encuentra información de Saptiva-Agents", source="user")],
            cancellation_token=CancellationToken(),
        ),
        output_stats=True,  # Habilita la impresión de estadísticas.
    )


# Usa asyncio.run(assistant_run_stream()) cuando lo ejecutes en un script.
await assistant_run_stream()
---------- assistant ----------
[FunctionCall(id='call_fSp5iTGVm2FKw5NIvfECSqNd', arguments='{"query":"Saptiva-Agents information"}', name='web_search')]
[Prompt tokens: 61, Completion tokens: 16]
---------- assistant ----------
[FunctionExecutionResult(content='Saptiva-Agents es un marco de programación para construir aplicaciones multi-agente.', call_id='call_fSp5iTGVm2FKw5NIvfECSqNd')]
---------- assistant ----------
Saptiva-Agents es un marco de programación para construir aplicaciones multi-agente. Si necesitas información más detallada o aspectos específicos sobre Saptiva-Agents, ¡no dudes en preguntar!
[Prompt tokens: 93, Completion tokens: 32]
---------- Summary ----------
Number of inner messages: 2
Total prompt tokens: 154
Total completion tokens: 48
Duration: 4.30 seconds

El método on_messages_stream() devuelve un generador asincrónico que produce cada mensaje interno generado por el agente, siendo el último elemento el mensaje de respuesta en el atributo chat_message.

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.

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.

from saptiva_agents.tools import FunctionTool

# Definir una herramienta usando una función en Python
async def web_search_func(query: str) -> str:
    """Find information on the web"""
    return "Saptiva-Agents es un marco de programación para construir aplicaciones multi-agente."

# Este paso se realiza automáticamente dentro del AssistantAgent si la herramienta es una función Python.
web_search_function_tool = FunctionTool(web_search_func, description="Find information on the web")
# El esquema se proporciona al modelo durante la llamada on_messages de AssistantAgent.
web_search_function_tool.schema
{'name': 'web_search_func',
 'description': 'Find information on the web',
 'parameters': {'type': 'object',
  'properties': {'query': {'description': 'query',
    'title': 'Query',
    'type': 'string'}},
  'required': ['query'],
  'additionalProperties': False},
 'strict': False}

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().

from saptiva_agents.agents import AssistantAgent
from saptiva_agents.base import SaptivaAIChatCompletionClient
from saptiva_agents.tools import StdioServerParams, mcp_server_tools

# Obtenga la herramienta de búsqueda de mcp-server-fetch
fetch_mcp_server = StdioServerParams(command="uvx", args=["mcp-server-fetch"])
tools = await mcp_server_tools(fetch_mcp_server)

# Cree un agente que pueda utilizar la herramienta de búsqueda
model_client = SaptivaAIChatCompletionClient(model="llama3.3:70b", api_key="TU_SAPTIVA_API_KEY")
agent = AssistantAgent(name="fetcher", model_client=model_client, tools=tools, reflect_on_tool_use=True)  # type: ignore

# Deje que el agente obtenga el contenido de un URL y lo resuma.
result = await agent.run(task="Summarize the content of https://en.wikipedia.org/wiki/Seattle")
assert isinstance(result.messages[-1], TextMessage)
print(result.messages[-1].content)

# Cierra la conexión con el cliente del modelo.
await model_client.close()
Seattle, located in Washington state, is the most populous city in the state and a major city in the Pacific Northwest region of the United States. It's known for its vibrant cultural scene, significant economic presence, and rich history. Here are some key points about Seattle from the Wikipedia page:

1. **History and Geography**: Seattle is situated between Puget Sound and Lake Washington, with the Cascade Range to the east and the Olympic Mountains to the west. Its history is deeply rooted in Native American heritage and its development was accelerated with the arrival of settlers in the 19th century. The city was officially incorporated in 1869.

2. **Economy**: Seattle is a major economic hub with a diverse economy anchored by sectors like aerospace, technology, and retail. It's home to influential companies such as Amazon and Starbucks, and has a significant impact on the tech industry due to companies like Microsoft and other technology enterprises in the surrounding area.

3. **Cultural Significance**: Known for its music scene, Seattle was the birthplace of grunge music in the early 1990s. It also boasts significant attractions like the Space Needle, Pike Place Market, and the Seattle Art Museum. 

4. **Education and Innovation**: The city hosts important educational institutions, with the University of Washington being a leading research university. Seattle is recognized for fostering innovation and is a leader in environmental sustainability efforts.

5. **Demographics and Diversity**: Seattle is noted for its diverse population, reflected in its rich cultural tapestry. It has seen a significant increase in population, leading to urban development and changes in its social landscape.

These points highlight Seattle as a dynamic city with a significant cultural, economic, and educational influence within the United States and beyond.

Langchain Tools

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

# pip install langchain-experimental

import pandas as pd

from saptiva_agents.agents import AssistantAgent
from saptiva_agents.base import SaptivaAIChatCompletionClient
from saptiva_agents.core import CancellationToken
from saptiva_agents.messages import TextMessage
from saptiva_agents.tools.langchain import LangChainToolAdapter
from saptiva_agents.ui import Console
from langchain_experimental.tools.python.tool import PythonAstREPLTool

df = pd.read_csv("https://raw.githubusercontent.com/pandas-dev/pandas/main/doc/data/titanic.csv")
tool = LangChainToolAdapter(PythonAstREPLTool(locals={"df": df}))
model_client = SaptivaAIChatCompletionClient(model="llama3.3:70b", api_key="TU_SAPTIVA_API_KEY")
agent = AssistantAgent(
    "assistant", tools=[tool], model_client=model_client, system_message="Use the `df` variable to access the dataset."
)
await Console(
    agent.on_messages_stream(
        [TextMessage(content="What's the average age of the passengers?", source="user")], CancellationToken()
    ),
    output_stats=True,
)

await model_client.close()
---------- assistant ----------
[FunctionCall(id='call_BEYRkf53nBS1G2uG60wHP0zf', arguments='{"query":"df[\'Age\'].mean()"}', name='python_repl_ast')]
[Prompt tokens: 111, Completion tokens: 22]
---------- assistant ----------
[FunctionExecutionResult(content='29.69911764705882', call_id='call_BEYRkf53nBS1G2uG60wHP0zf')]
---------- assistant ----------
29.69911764705882
---------- Summary ----------
Number of inner messages: 2
Total prompt tokens: 111
Total completion tokens: 22
Duration: 0.62 seconds
Response(chat_message=ToolCallSummaryMessage(source='assistant', models_usage=None, content='29.69911764705882', type='ToolCallSummaryMessage'), inner_messages=[ToolCallRequestEvent(source='assistant', models_usage=RequestUsage(prompt_tokens=111, completion_tokens=22), content=[FunctionCall(id='call_BEYRkf53nBS1G2uG60wHP0zf', arguments='{"query":"df[\'Age\'].mean()"}', name='python_repl_ast')], type='ToolCallRequestEvent'), ToolCallExecutionEvent(source='assistant', models_usage=None, content=[FunctionExecutionResult(content='29.69911764705882', call_id='call_BEYRkf53nBS1G2uG60wHP0zf')], type='ToolCallExecutionEvent')])

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.

model_client_no_parallel_tool_call = SaptivaAIChatCompletionClient(
    model=QWEN_MODEL,
    api_key="TU_SAPTIVA_API_KEY",
    parallel_tool_calls=False,  # type: ignore
)
agent_no_parallel_tool_call = AssistantAgent(
    name="assistant",
    model_client=model_client_no_parallel_tool_call,
    tools=[web_search],
    system_message="Usar tools para resolver tareas.",
)

Ejecutar un Agente en un Bucle

El AssistantAgent ejecuta un paso a la vez: una llamada de modelo, seguida de una llamada de herramienta (o llamadas de herramientas en paralelo), y luego una reflexión opcional.


Salida Estructurada

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.

from typing import Literal

from pydantic import BaseModel

# Formato de respuesta para el agente como un modelo base de Pydantic.
class AgentResponse(BaseModel):
    thoughts: str
    response: Literal["happy", "sad", "neutral"]

# Crear un agente que utilice el modelo "llama3.3:70b" con el formato de respuesta personalizado.
model_client = SaptivaAIChatCompletionClient(model="llama3.3:70b", api_key="TU_SAPTIVA_API_KEY")

agent = AssistantAgent(
    "assistant",
    model_client=model_client,
    system_message="Categorize the input as happy, sad, or neutral following the JSON format.",
    # Define el tipo de contenido de salida del agente.
    output_content_type=AgentResponse,
)

result = await Console(agent.run_stream(task="I am happy."))

# Verifica el último mensaje en el resultado, valida su tipo e imprime los pensamientos y la respuesta.
assert isinstance(result.messages[-1], StructuredMessage)
assert isinstance(result.messages[-1].content, AgentResponse)
print("Thought: ", result.messages[-1].content.thoughts)
print("Response: ", result.messages[-1].content.response)
await model_client.close()
---------- user ----------
I am happy.
---------- assistant ----------
{
  "thoughts": "The user explicitly states they are happy.",
  "response": "happy"
}
Thought:  The user explicitly states they are happy.
Response:  happy

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 on_messages_stream() y run_stream().

model_client = SaptivaAIChatCompletionClient(model="llama3.3:70b", api_key="TU_SAPTIVA_API_KEY")

streaming_assistant = AssistantAgent(
    name="assistant",
    model_client=model_client,
    system_message="You are a helpful assistant.",
    model_client_stream=True,  # Activar streaming tokens.
)

# Uso de una función async y asyncio.run() en un script.
async for message in streaming_assistant.on_messages_stream(  # type: ignore
    [TextMessage(content="Name two cities in South America", source="user")],
    cancellation_token=CancellationToken(),
):
    print(message)
source='assistant' models_usage=None content='Two' type='ModelClientStreamingChunkEvent'
source='assistant' models_usage=None content=' cities' type='ModelClientStreamingChunkEvent'
source='assistant' models_usage=None content=' in' type='ModelClientStreamingChunkEvent'
source='assistant' models_usage=None content=' South' type='ModelClientStreamingChunkEvent'
source='assistant' models_usage=None content=' America' type='ModelClientStreamingChunkEvent'
source='assistant' models_usage=None content=' are' type='ModelClientStreamingChunkEvent'
source='assistant' models_usage=None content=' Buenos' type='ModelClientStreamingChunkEvent'
source='assistant' models_usage=None content=' Aires' type='ModelClientStreamingChunkEvent'
source='assistant' models_usage=None content=' in' type='ModelClientStreamingChunkEvent'
source='assistant' models_usage=None content=' Argentina' type='ModelClientStreamingChunkEvent'
source='assistant' models_usage=None content=' and' type='ModelClientStreamingChunkEvent'
source='assistant' models_usage=None content=' São' type='ModelClientStreamingChunkEvent'
source='assistant' models_usage=None content=' Paulo' type='ModelClientStreamingChunkEvent'
source='assistant' models_usage=None content=' in' type='ModelClientStreamingChunkEvent'
source='assistant' models_usage=None content=' Brazil' type='ModelClientStreamingChunkEvent'
source='assistant' models_usage=None content='.' type='ModelClientStreamingChunkEvent'
Response(chat_message=TextMessage(source='assistant', models_usage=RequestUsage(prompt_tokens=0, completion_tokens=0), content='Two cities in South America are Buenos Aires in Argentina and São Paulo in Brazil.', type='TextMessage'), inner_messages=[])

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.

De manera similar, run_stream() también generará los mismos fragmentos de transmisión, seguidos de un mensaje de texto completo justo después del último fragmento.

async for message in streaming_assistant.run_stream(task="Name two cities in North America."):  # type: ignore
    print(message)
source='user' models_usage=None content='Name two cities in North America.' type='TextMessage'
source='assistant' models_usage=None content='Two' type='ModelClientStreamingChunkEvent'
source='assistant' models_usage=None content=' cities' type='ModelClientStreamingChunkEvent'
source='assistant' models_usage=None content=' in' type='ModelClientStreamingChunkEvent'
source='assistant' models_usage=None content=' North' type='ModelClientStreamingChunkEvent'
source='assistant' models_usage=None content=' America' type='ModelClientStreamingChunkEvent'
source='assistant' models_usage=None content=' are' type='ModelClientStreamingChunkEvent'
source='assistant' models_usage=None content=' New' type='ModelClientStreamingChunkEvent'
source='assistant' models_usage=None content=' York' type='ModelClientStreamingChunkEvent'
source='assistant' models_usage=None content=' City' type='ModelClientStreamingChunkEvent'
source='assistant' models_usage=None content=' in' type='ModelClientStreamingChunkEvent'
source='assistant' models_usage=None content=' the' type='ModelClientStreamingChunkEvent'
source='assistant' models_usage=None content=' United' type='ModelClientStreamingChunkEvent'
source='assistant' models_usage=None content=' States' type='ModelClientStreamingChunkEvent'
source='assistant' models_usage=None content=' and' type='ModelClientStreamingChunkEvent'
source='assistant' models_usage=None content=' Toronto' type='ModelClientStreamingChunkEvent'
source='assistant' models_usage=None content=' in' type='ModelClientStreamingChunkEvent'
source='assistant' models_usage=None content=' Canada' type='ModelClientStreamingChunkEvent'
source='assistant' models_usage=None content='.' type='ModelClientStreamingChunkEvent'
source='assistant' models_usage=RequestUsage(prompt_tokens=0, completion_tokens=0) content='Two cities in North America are New York City in the United States and Toronto in Canada.' type='TextMessage'
TaskResult(messages=[TextMessage(source='user', models_usage=None, content='Name two cities in North America.', type='TextMessage'), TextMessage(source='assistant', models_usage=RequestUsage(prompt_tokens=0, completion_tokens=0), content='Two cities in North America are New York City in the United States and Toronto in Canada.', type='TextMessage')], stop_reason=None)

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.

from saptiva_agents.core import BufferedChatCompletionContext

# Crear un agente que utilice solo los últimos 5 mensajes en el contexto para generar respuestas.
agent = AssistantAgent(
    name="assistant",
    model_client=model_client,
    tools=[web_search],
    system_message="Usa tools para resolver tareas.",
    model_context=BufferedChatCompletionContext(buffer_size=5),  # Sólo usa los últimos 5 mensages en el contexto.
)

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:

sudo apt update
sudo apt install ffmpeg

En Mac (con Homebrew):

brew install ffmpeg

En Windows:

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

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

ffmpeg -version

Puede usar run_stream() para obtener el mismo comportamiento de transmisión que on_messages_stream(). Sigue la misma interfaz que .

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 y para mas información acerca de tool calling en LLMs.

Para ejecutarlo en un bucle, por ejemplo, ejecutándolo hasta que deje de producir llamadas de herramientas, por favor consulte a .

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 , que también se puede utilizar para validar el resultado.

Descarga ffmpeg desde:

Equipos
Equipos
OpenAI
Anthropic
Pydantic BaseModel
https://ffmpeg.org/download.html
Equipo de Agente Único