Inicio Rápido
Construye y ejecuta tu primer agente de IA conversacional con chatflow-agent en menos de 5 minutos.
1. Crear un Agente Básico
En chatflow-agent, un Agent representa una entidad con instrucciones y capacidades especializadas, mientras que el Runner orquesta los turnos conversacionales y el ciclo de evaluación de herramientas.
Crea un archivo llamado quickstart.py:
# [min-version: 0.3.0]
# [no-exec: requires real openai api key for live response]
import os
from chatflow_agent import Agent, Runner
# 1. Definir la identidad del agente, instrucciones y modelo objetivo
# chatflow-agent enruta automáticamente "gpt-4o" al motor OpenAI usando OPENAI_API_KEY
agent = Agent(
name="Assistant",
instructions="You are a concise and helpful AI technical assistant.",
model="gpt-4o",
)
# 2. Inicializar el Runner con tu agente inicial
runner = Runner(starting_agent=agent)
# 3. Ejecutar un turno conversacional
response = runner.run(
session_id="quickstart_session",
user_message="Explain async Python in two concise sentences.",
)
# 4. Mostrar la respuesta
print("Agent Response:")
print(response.content)Ejecuta el script desde tu terminal:
python quickstart.pyProtección del Bucle de Eventos
runner.run() es un método síncrono de conveniencia diseñado para scripts y utilidades CLI. Si te encuentras dentro de un bucle de eventos asíncrono activo (por ejemplo, FastAPI, Jupyter Notebook o asyncio), utiliza await runner.run_async() en su lugar. Invocar runner.run() dentro de un bucle activo generará un error claro de tipo RuntimeError.
2. Agregar Herramientas con @tool
Los agentes se vuelven exponencialmente más capaces al otorgarles acceso a funciones deterministas. Utiliza el decorador @tool para convertir cualquier función de Python en una herramienta introspeccionable:
# [min-version: 0.3.0]
# [no-exec: requires real openai api key for live response]
import os
from chatflow_agent import Agent, Runner, tool
# 1. Definir una herramienta con parámetros tipados y docstrings
@tool(name="calculate_discount", description="Calculate discounted price from original amount and percentage.")
def calculate_discount(price: float, discount_percent: float) -> str:
"""Calculate the final price after applying a percentage discount.
Args:
price: The original price in dollars.
discount_percent: The percentage discount to apply (e.g. 15 for 15%).
"""
savings = price * (discount_percent / 100.0)
final_price = price - savings
return f"Original: ${price:.2f}, Savings: ${savings:.2f}, Final Price: ${final_price:.2f}"
# 2. Asociar la herramienta al Agent
agent = Agent(
name="SalesBot",
instructions="You help customers with purchase calculations. Always use calculate_discount for math.",
model="gpt-4o",
tools=[calculate_discount],
)
runner = Runner(starting_agent=agent)
# 3. Realizar una consulta que requiera ejecutar la herramienta
response = runner.run(
session_id="sales_session_1",
user_message="What is the final price for a jacket priced at $120 with a 25% discount?",
)
print(response.content)Inspeccionar la Ejecución de Herramientas
El objeto AgentResponse retornado conserva total transparencia sobre el turno conversacional:
# Inspeccionar nombres de herramientas ejecutadas
for tool_name in response.tool_calls_executed:
print(f"Tool executed: {tool_name}")3. Ejecución Asíncrona con Runner.run_async
Para servicios web de alta concurrencia, chatbots y arquitecturas basadas en eventos, utiliza la API asíncrona nativa:
import asyncio
import os
from chatflow_agent import Agent, Runner
async def main() -> None:
agent = Agent(
name="AsyncBot",
instructions="Provide concise answers.",
model="gpt-4o",
)
runner = Runner(starting_agent=agent)
# Turno asíncrono
response = await runner.run_async(
session_id="async_session_1",
user_message="List three key advantages of asynchronous Python.",
)
print(response.content)
if __name__ == "__main__":
asyncio.run(main())4. Flexibilidad Multiproveedor
Gracias a que chatflow-agent utiliza motores REST directos, cambiar de proveedor es instantáneo sin necesidad de alterar la lógica del agente:
import os
from chatflow_agent import Agent, OpenAIEngine
# Opción 1: Configuración directa por modelo (los motores se resuelven automáticamente)
openai_agent = Agent(
name="OpenAIBot",
instructions="You are powered by GPT-4o.",
model="gpt-4o",
)
claude_agent = Agent(
name="ClaudeBot",
instructions="You are powered by Claude 3.5 Sonnet.",
model="claude-3-5-sonnet-20241022",
)
gemini_agent = Agent(
name="GeminiBot",
instructions="You are powered by Google Gemini.",
model="gemini-2.5-flash",
)
# Opción 2: Endpoints personalizados mediante OpenAIEngine (Groq, Ollama, DeepSeek)
groq_engine = OpenAIEngine(
base_url="https://api.groq.com/openai/v1",
api_key=os.getenv("GROQ_API_KEY"),
provider="groq",
)
groq_agent = Agent(
name="GroqBot",
instructions="You are powered by LLaMA 3.3 on Groq.",
model="llama-3.3-70b-versatile",
engine=groq_engine,
)Diferencias de Proveedores en v0.3.4 vs v0.4.0rc1
En Stable (0.3.4), GeminiEngine depende del paquete google-genai. En Prerelease (0.4.0rc1), GeminiEngine fue rediseñado a REST HTTP puro mediante httpx, eliminando las dependencias externas del SDK de Google.
Próximos Pasos
Ahora que has ejecutado tus primeros agentes, profundiza en los conceptos fundamentales:
- Conceptos Fundamentales: Aprende sobre Gestión de Estado, Memoria, Handoffs y Concurrencia.