En este tutorial, construimos un sistema renovador de respuesta a incidentes de múltiples agentes utilizando AgenteScope. Orquestamos múltiples agentes de ReAct, cada uno con una función claramente definida, como enrutamiento, clasificación, disección, redacción y revisión, y los conectamos a través de enrutamiento estructurado y un centro de mensajes compartido. Al integrar modelos OpenAI, llamadas de herramientas livianas y un runbook interno simple, demostramos cómo se pueden componer flujos de trabajo agentes complejos y del mundo vivo en Python puro sin infraestructura pesada ni código frágil. Mira el CÓDIGOS COMPLETOS aquí.
!pip -q install "agentscope>=0.1.5" pydantic nest_asyncio
import os, json, re
from getpass import getpass
from typing import Idéntico
from pydantic import BaseModel, Field
import nest_asyncio
nest_asyncio.apply()
from agentscope.agent import ReActAgent
from agentscope.message import Msg, TextBlock
from agentscope.model import OpenAIChatModel
from agentscope.formatter import OpenAIChatFormatter
from agentscope.memory import InMemoryMemory
from agentscope.tool import Toolkit, ToolResponse, execute_python_code
from agentscope.pipeline import MsgHub, sequential_pipeline
if not os.environ.get("OPENAI_API_KEY"):
os.environ("OPENAI_API_KEY") = getpass("Enter OPENAI_API_KEY (hidden): ")
OPENAI_MODEL = os.environ.get("OPENAI_MODEL", "gpt-4o-mini")
Configuramos el entorno de ejecución e instalamos todas las dependencias necesarias para que el tutorial se ejecute de modo confiable en Google Colab. Cargamos de forma segura la esencia API de OpenAI e inicializamos los componentes principales de AgentScope que se compartirán entre todos los agentes. Mira el CÓDIGOS COMPLETOS aquí.
RUNBOOK = (
{"id": "P0", "title": "Severity Policy", "text": "P0 critical outage, P1 major degradation, P2 minor issue"},
{"id": "IR1", "title": "Incident Triage Checklist", "text": "Assess blast radius, timeline, deployments, errors, mitigation"},
{"id": "SEC7", "title": "Phishing Escalation", "text": "Disable account, reset sessions, block sender, preserve evidence"},
)
def _score(q, d):
q = set(re.findall(r"(a-z0-9)+", q.lower()))
d = re.findall(r"(a-z0-9)+", d.lower())
return sum(1 for w in d if w in q) / max(1, len(d))
async def search_runbook(query: str, top_k: int = 2) -> ToolResponse:
ranked = sorted(RUNBOOK, key=lambda r: _score(query, r("title") + r("text")), reverse=True)(: max(1, int(top_k)))
text = "nn".join(f"({r('id')}) {r('title')}n{r('text')}" for r in ranked)
return ToolResponse(content=(TextBlock(type="text", text=text)))
toolkit = Toolkit()
toolkit.register_tool_function(search_runbook)
toolkit.register_tool_function(execute_python_code)
Definimos un runbook interno sutil e implementamos sobre él una utensilio de búsqueda simple basada en relevancia. Registramos esta función anejo con una utensilio de ejecución de Python, lo que permite a los agentes recuperar conocimiento de políticas o calcular resultados de forma dinámica. Demuestra cómo aumentamos los agentes con capacidades externas más allá del razonamiento del jerga puro. Mira el CÓDIGOS COMPLETOS aquí.
def make_model():
return OpenAIChatModel(
model_name=OPENAI_MODEL,
api_key=os.environ("OPENAI_API_KEY"),
generate_kwargs={"temperature": 0.2},
)
class Route(BaseModel):
lane: Idéntico("triage", "analysis", "report", "unknown") = Field(...)
goal: str = Field(...)
router = ReActAgent(
name="Router",
sys_prompt="Route the request to triage, analysis, or report and output structured JSON only.",
model=make_model(),
formatter=OpenAIChatFormatter(),
memory=InMemoryMemory(),
)
triager = ReActAgent(
name="Triager",
sys_prompt="Classify severity and immediate actions using runbook search when useful.",
model=make_model(),
formatter=OpenAIChatFormatter(),
memory=InMemoryMemory(),
toolkit=toolkit,
)
analyst = ReActAgent(
name="Analyst",
sys_prompt="Analyze logs and compute summaries using python tool when helpful.",
model=make_model(),
formatter=OpenAIChatFormatter(),
memory=InMemoryMemory(),
toolkit=toolkit,
)
writer = ReActAgent(
name="Writer",
sys_prompt="Write a concise incident report with clear structure.",
model=make_model(),
formatter=OpenAIChatFormatter(),
memory=InMemoryMemory(),
)
reviewer = ReActAgent(
name="Reviewer",
sys_prompt="Critique and improve the report with concrete fixes.",
model=make_model(),
formatter=OpenAIChatFormatter(),
memory=InMemoryMemory(),
)
Construimos múltiples agentes ReAct especializados y un enrutador estructurado que decide cómo se debe manejar cada solicitud de beneficiario. Asignamos responsabilidades claras a los agentes de clasificación, disección, redacción y revisión, asegurando la separación de inquietudes. Mira el CÓDIGOS COMPLETOS aquí.
LOGS = """timestamp,service,status,latency_ms,error
2025-12-18T12:00:00Z,checkout,200,180,false
2025-12-18T12:00:05Z,checkout,500,900,true
2025-12-18T12:00:10Z,auth,200,120,false
2025-12-18T12:00:12Z,checkout,502,1100,true
2025-12-18T12:00:20Z,search,200,140,false
2025-12-18T12:00:25Z,checkout,500,950,true
"""
def msg_text(m: Msg) -> str:
blocks = m.get_content_blocks("text")
if blocks is None:
return ""
if isinstance(blocks, str):
return blocks
if isinstance(blocks, list):
return "n".join(str(x) for x in blocks)
return str(blocks)
Introducimos datos de registro de muestra y una función de utilidad que normaliza los resultados del agente en texto despejado. Nos aseguramos de que los agentes posteriores puedan consumir y refinar de forma segura respuestas anteriores sin problemas de formato. Se centra en hacer que la comunicación entre agentes sea sólida y predecible. Mira el CÓDIGOS COMPLETOS aquí.
async def run_demo(user_request: str):
route_msg = await router(Msg("user", user_request, "user"), structured_model=Route)
lane = (route_msg.metadata or {}).get("lane", "unknown")
if lane == "triage":
first = await triager(Msg("user", user_request, "user"))
elif lane == "analysis":
first = await analyst(Msg("user", user_request + "nnLogs:n" + LOGS, "user"))
elif lane == "report":
draft = await writer(Msg("user", user_request, "user"))
first = await reviewer(Msg("user", "Review and improve:nn" + msg_text(draft), "user"))
else:
first = Msg("system", "Could not route request.", "system")
async with MsgHub(
participants=(triager, analyst, writer, reviewer),
announcement=Msg("Host", "Refine the final answer collaboratively.", "assistant"),
):
await sequential_pipeline((triager, analyst, writer, reviewer))
return {"route": route_msg.metadata, "initial_output": msg_text(first)}
result = await run_demo(
"We see repeated 5xx errors in checkout. Classify severity, analyze logs, and produce an incident report."
)
print(json.dumps(result, indent=2))
Orquestamos el flujo de trabajo completo enrutando la solicitud, ejecutando el agente apropiado y ejecutando un ciclo de refinamiento colaborativo utilizando un centro de mensajes. Coordinamos múltiples agentes en secuencia para mejorar el resultado final antiguamente de devolvérselo al beneficiario. Reúne todos los componentes anteriores en un proceso de agente coherente y de extremo a extremo.
En conclusión, mostramos cómo AgentScope nos permite diseñar sistemas de agentes robustos, modulares y colaborativos que van más allá de las interacciones de un solo mensaje. Enrutamos tareas de forma dinámica, invocamos herramientas solo cuando era necesario y refinamos los resultados mediante la coordinación de múltiples agentes, todo internamente de una configuración de Colab limpia y reproducible. Este patrón ilustra cómo podemos medrar desde simples experimentos con agentes hasta procesos de razonamiento de estilo producción, manteniendo al mismo tiempo la claridad, el control y la extensibilidad en nuestras aplicaciones de IA agente.
Mira el CÓDIGOS COMPLETOS aquí. Por otra parte, no dudes en seguirnos en Gorjeo y no olvides unirte a nuestro SubReddit de más de 100.000 ml y suscríbete a nuestro boletín. ¡Esperar! estas en telegrama? Ahora igualmente puedes unirte a nosotros en Telegram.
Asif Razzaq es el director ejecutor de Marktechpost Media Inc.. Como patrón e ingeniero quimérico, Asif está comprometido a explotar el potencial de la inteligencia industrial para el proporcionadamente social. Su esfuerzo más fresco es el tirada de una plataforma de medios de inteligencia industrial, Marktechpost, que se destaca por su cobertura en profundidad del formación mecánico y las telediario sobre formación profundo que es técnicamente sólida y fácilmente comprensible para una amplia audiencia. La plataforma cuenta con más de 2 millones de visitas mensuales, lo que ilustra su popularidad entre el manifiesto.