En este tutorial, exploramos cómo diseñamos y ejecutamos un canal de orquestación de IA agente completo impulsado por enrutamiento semántico, barreras de seguridad simbólicas y bucles de autocorrección utilizando Gemini. Explicamos cómo estructuramos agentes, despachamos tareas, aplicamos restricciones y refinamos los resultados utilizando una cimentación modular y limpia. A medida que avanzamos en cada fragmento, vemos cómo el sistema elige inteligentemente al agente adecuado, valida su resultado y se perfeccionamiento a través de una advertencia iterativa. Mira el Códigos completos aquí.
import os
import json
import time
import typing
from dataclasses import dataclass, asdict
from google import genai
from google.genai import types
API_KEY = os.environ.get("GEMINI_API_KEY", "API Key")
client = genai.Client(api_key=API_KEY)
@dataclass
class AgentMessage:
source: str
target: str
content: str
metadata: dict
timestamp: float = time.time()
Configuramos nuestro entorno central importando bibliotecas esenciales, definiendo la secreto API e inicializando el cliente Gemini. Además establecemos la estructura AgentMessage, que actúa como formato de comunicación compartida entre agentes. Mira el Códigos completos aquí.
class CognitiveEngine:
@staticmethod
def generate(prompt: str, system_instruction: str, json_mode: bool = False) -> str:
config = types.GenerateContentConfig(
temperature=0.1,
response_mime_type="application/json" if json_mode else "text/plain"
)
try:
response = client.models.generate_content(
model="gemini-2.0-flash",
contents=prompt,
config=config
)
return response.text
except Exception as e:
raise ConnectionError(f"Gemini API Error: {e}")
class SemanticRouter:
def __init__(self, agents_registry: dict):
self.registry = agents_registry
def route(self, user_query: str) -> str:
prompt = f"""
You are a Master Dispatcher. Analyze the user request and map it to the ONE best agent.
AVAILABLE AGENTS:
{json.dumps(self.registry, indent=2)}
USER REQUEST: "{user_query}"
Return ONLY a JSON object: {{"selected_agent": "agent_name", "reasoning": "brief reason"}}
"""
response_text = CognitiveEngine.generate(prompt, "You are a routing system.", json_mode=True)
try:
decision = json.loads(response_text)
print(f" (Router) Selected: {decision('selected_agent')} (Reason: {decision('reasoning')})")
return decision('selected_agent')
except:
return "general_agent"
Construimos la capa cognitiva usando Gemini, lo que nos permite suscitar expectativas de texto y JSON según la instrucción. Además implementamos el enrutador semántico, que analiza las consultas y selecciona el agente más adecuado. Mira el Códigos completos aquí.
class Agent:
def __init__(self, name: str, instruction: str):
self.name = name
self.instruction = instruction
def execute(self, message: AgentMessage) -> str:
return CognitiveEngine.generate(
prompt=f"Input: {message.content}",
system_instruction=self.instruction
)
class Orchestrator:
def __init__(self):
self.agents_info = {
"analyst_bot": "Analyzes data, logic, and math. Returns structured JSON summaries.",
"creative_bot": "Writes poems, stories, and creative text. Returns plain text.",
"coder_bot": "Writes Python code snippets."
}
self.workers = {
"analyst_bot": Agent("analyst_bot", "You are a Data Analyst. output strict JSON."),
"creative_bot": Agent("creative_bot", "You are a Creative Writer."),
"coder_bot": Agent("coder_bot", "You are a Python Expert. Return only code.")
}
self.router = SemanticRouter(self.agents_info)
Construimos los agentes trabajadores y el orquestador central. Cada agente recibe un rol claro, analista, creativo o codificador, y configuramos el orquestador para administrarlos. Al revisar esta sección, vemos cómo definimos el ecosistema de agentes y lo preparamos para la delegación inteligente de tareas. Mira el Códigos completos aquí.
def validate_constraint(self, content: str, constraint_type: str) -> tuple(bool, str):
if constraint_type == "json_only":
try:
json.loads(content)
return True, "Valid JSON"
except:
return False, "Output was not valid JSON."
if constraint_type == "no_markdown":
if "```" in content:
return False, "Output contains Markdown code blocks, which are forbidden."
return True, "Valid Text"
return True, "Pass"
def run_task(self, user_input: str, constraint: str = None, max_retries: int = 2):
print(f"n--- New Task: {user_input} ---")
target_name = self.router.route(user_input)
worker = self.workers.get(target_name)
current_input = user_input
history = ()
for attempt in range(max_retries + 1):
try:
msg = AgentMessage(source="User", target=target_name, content=current_input, metadata={})
print(f" (Exec) {worker.name} working... (Attempt {attempt+1})")
result = worker.execute(msg)
if constraint:
is_valid, error_msg = self.validate_constraint(result, constraint)
if not is_valid:
print(f" (Guardrail) VIOLATION: {error_msg}")
current_input = f"Your previous answer failed a check.nOriginal Request: {user_input}nYour Answer: {result}nError: {error_msg}nFIX IT immediately."
continue
print(f" (Success) Final Output:n{result(:100)}...")
return result
except Exception as e:
print(f" (System Error) {e}")
time.sleep(1)
print(" (Failed) Max retries reached or self-correction failed.")
return None
Implementamos barreras de seguridad simbólicas y un caracolillo de autocorrección para imponer restricciones como JSON auténtico o sin Markdown. Realizamos un refinamiento iterativo cada vez que los resultados violan los requisitos, lo que permite a nuestros agentes corregir sus propios errores. Mira el Códigos completos aquí.
if __name__ == "__main__":
orchestrator = Orchestrator()
orchestrator.run_task(
"Compare the GDP of France and Germany in 2023.",
constraint="json_only"
)
orchestrator.run_task(
"Write a Python function for Fibonacci numbers.",
constraint="no_markdown"
)
Ejecutamos dos escenarios completos, mostrando el enrutamiento, la ejecución del agente y la nervio de restricciones en actividad. Ejecutamos una tarea analítica aplicada en JSON y una tarea de codificación con restricciones de Markdown para observar el comportamiento juicioso.
En conclusión, ahora vemos cómo múltiples componentes, enrutamiento, agentes trabajadores, barreras de seguridad y autocorrección, se unen para crear un sistema de agentes inteligente y confiable. Somos testigos de cómo cada parte contribuye a una ejecución sólida de las tareas, garantizando que los resultados sigan siendo precisos, alineados y conscientes de las limitaciones. Al reflexionar sobre la cimentación, reconocemos con qué facilidad podemos expandirla con nuevos agentes, restricciones más ricas o estrategias de razonamiento más avanzadas.
Mira el Códigos completos aquí. No dudes en consultar nuestra Página de GitHub para tutoriales, códigos y cuadernos. Encima, 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 además 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 disfrutar el potencial de la inteligencia industrial para el aceptablemente social. Su esfuerzo más nuevo es el tirada de una plataforma de medios de inteligencia industrial, Marktechpost, que se destaca por su cobertura en profundidad del enseñanza instintivo y las noticiario sobre enseñanza 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 notorio.
