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.on_messages()
: Envía al agente una secuencia deChatMessage
para obtener unaResponse
. **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 queon_messages()
, pero devuelve un iterador deAgentEvent
oChatMessage
seguido de unaResponse
como último item.on_reset()
: Restablece el agente a su estado inicial.run()
andrun_stream()
: Métodos de conveniencia de Teams que llaman aon_messages()
yon_messages_stream()
respectivamente, pero ofrecen la misma interfaz que Equipos.
Assistant Agent
AssistantAgent
es 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.
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.
Puede usar run_stream()
para obtener el mismo comportamiento de transmisión que on_messages_stream()
. Sigue la misma interfaz que Equipos.
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.
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.
Para ejecutarlo en un bucle, por ejemplo, ejecutándolo hasta que deje de producir llamadas de herramientas, por favor consulte a Equipo de Agente Único.
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.
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íaffmpeg
Última actualización