Creación de agentes de inteligencia artificial que evolucionan automáticamente con OpenSpace utilizando habilidades, MCP, linaje y reutilización de bajo costo

En este tutorial, creamos y examinamos un flujo de trabajo OpenSpace, avanzando desde la configuración del entorno y la clonación de repositorios dispersos hasta la ejecución de tareas en vivo, la evolución de habilidades y la integración de agentes basados ​​en MCP. Configuramos las credenciales del modelo y las variables del espacio de trabajo, instalamos el proyecto en modo editable, invocamos la API asincrónica de Python e inspeccionamos cómo OpenSpace almacena las capacidades evolucionadas en SQLite con control de versiones y metadatos de linaje. También creamos un SKILL.md personalizado, conectamos habilidades de agente host, probamos la reutilización de tareas activas, lanzamos el servidor HTTP MCP transmitible y analizamos la base de datos de evolución de exhibición para comprender cómo las habilidades FIX, DERIVED y CAPTURED respaldan un comportamiento de agente reutilizable y de menor costo.

import os, sys, subprocess, sqlite3, json, textwrap, Shuthil, time, pathlib ANTHROPIC_API_KEY = “” OPENAI_API_KEY = “” OPENSPACE_MODEL = “anthropic/claude-sonnet-4-5” OPENSPACE_CLOUD_KEY = “” afirmar sys.version_info >= (3, 12), ( f”OpenSpace necesita Python 3.12+, Colab tiene {sys.version}. ” “Tiempo de ejecución > Cambiar el tipo de tiempo de ejecución o usar un venv py312 alternativo.” ) print(“✅ Python:”, sys.version.split()[0]) REPO_DIR = “/content/OpenSpace” si no os.path.exists(REPO_DIR): subprocess.run(
[“git”, “clone”, “–filter=blob:none”, “–sparse”,
“https://github.com/HKUDS/OpenSpace.git”, REPO_DIR]comprobar = Verdadero, ) subproceso.ejecutar (
[“git”, “sparse-checkout”, “set”, “–no-cone”, “/*”, “!/assets/”]cwd=REPO_DIR, check=True, ) print(“✅ Clonado a”, REPO_DIR) print(“Nivel superior:”, ordenado(os.listdir(REPO_DIR))) subprocess.run([sys.executable, “-m”, “pip”, “install”, “-q”, “-e”, REPO_DIR]comprobar=Verdadero) subproceso.run([sys.executable, “-m”, “pip”, “install”, “-q”, “nest_asyncio”]marcar = Verdadero) para cli in [“openspace-mcp”, “openspace-dashboard”]: ruta =shutil.what(cli) print(f”{‘✅’ if ruta else ‘⚠️ ‘} {cli}: {ruta}”) subprocess.run([“openspace-mcp”, “–help”]check=False) WORKSPACE = “/content/openspace_workspace” SKILLS_DIR = “/content/my_agent_skills” os.makedirs(WORKSPACE, exist_ok=True) os.makedirs(SKILLS_DIR, exist_ok=True) env_lines = [
f”OPENSPACE_MODEL={OPENSPACE_MODEL}”,
f”OPENSPACE_WORKSPACE={WORKSPACE}”,
f”OPENSPACE_HOST_SKILL_DIRS={SKILLS_DIR}”,
]
si ANTHROPIC_API_KEY: env_lines.append(f”ANTHROPIC_API_KEY={ANTHROPIC_API_KEY}”) si OPENAI_API_KEY: env_lines.append(f”OPENAI_API_KEY={OPENAI_API_KEY}”) si OPENSPACE_CLOUD_KEY: env_lines.append(f”OPENSPACE_API_KEY={OPENSPACE_CLOUD_KEY}”) env_path = os.path.join(REPO_DIR, “openspace”, “.env”) pathlib.Path(env_path).write_text(“\n”.join(env_lines) + “\n”) pathlib.Path(“/content/.env”).write_text(“\n”.join(env_lines) + “\n”) para la línea en env_lines: k, _, v = line.partition(“=”) os.environ[k] = v print(“✅ .env escrito:\n” + “\n”.join(l.split(“=”)[0] + “=***” si “KEY” en l else l para l en env_lines)) HAS_LLM_KEY = bool(ANTHROPIC_API_KEY o OPENAI_API_KEY) si no HAS_LLM_KEY: print(“⚠️ No se ha establecido ninguna clave LLM: se omitirán los pasos 4/6 (ejecución en vivo).”)

Verificamos el tiempo de ejecución de Python, definimos las credenciales de API requeridas y configuramos el modelo OpenSpace y las configuraciones opcionales de acceso a la nube. Clonamos el repositorio con un proceso de pago escaso, instalamos el paquete en modo editable y confirmamos que las herramientas de línea de comandos de OpenSpace están disponibles. Luego creamos el espacio de trabajo y los directorios de habilidades, escribimos los archivos de configuración del entorno, exportamos las variables requeridas y detectamos si la ejecución LLM en vivo está habilitada.

importar asyncio, nest_asyncio nest_asyncio.apply() async def run_task(query: str): desde openspace importe OpenSpace async con OpenSpace() como cs: resultado = await cs.execute(query) print(“── RESPUESTA ” + “─” * 50) print(resultado[“response”][:3000]) para la habilidad en result.get(“evolved_skills”, []): print(f” 🧬 Evolucionado: {habilidad[‘name’]} (origen={habilidad[‘origin’]})”) devuelve el resultado si HAS_LLM_KEY: result_1 = asyncio.run(run_task( “Escribe una función de Python que analiza un CSV de las horas de los empleados y ” “calcula la nómina semanal con horas extras (1,5 veces más allá de 40 h). Pruébala ” “en un pequeño ejemplo sintético y muestra el resultado.” )) else: print(“⏭️ Tarea en vivo omitida (sin clave).”) def dump_db(db_path, max_rows=8): si no os.path.exists(db_path): print(“No hay base de datos en”, db_path return con = sqlite3.connect(db_path) cur = con.cursor() tablas =); [r[0] para r en cur.execute( “SELECCIONE el nombre DE sqlite_master DONDE tipo=”table””).fetchall()]print(f”📀 {db_path}\n tablas: {tables}”) para t en tablas: intente: cols = [c[1] para c en cur.execute(f”PRAGMA table_info({t})”).fetchall()]filas = cur.execute(f”SELECT * FROM {t} LIMIT {max_rows}”).fetchall() print(f”\n▶ {t} ({len(rows)} mostrado) cols={cols[:8]}{‘…’ si len(cols)>8 else ”}”) para r en filas: print(” “, str(r)[:160]) excepto excepción como e: print(f” (skip {t}: {e})”) con.close() runtime_db = os.path.join(WORKSPACE, “.openspace”, “openspace.db”) alt_db = os.path.join(REPO_DIR, “.openspace”, “openspace.db”) dump_db(runtime_db if os.path.exists(runtime_db) else alt_db) intente: desde openspace.skill_engine.registry importa SkillRegistry desde openspace.skill_engine importa tipos como sk_types print(“\n✅ Skill_engine importable:”,
[n for n in dir(sk_types) if n[0].isuper()][:6]) excepto excepción como e: print(“ℹ️ nota de importación de registro:”, e)

Inicializamos la ejecución asincrónica en Google Colab y definimos una función reutilizable para enviar tareas a través de la API de OpenSpace Python. Ejecutamos una tarea inicial de generación de nómina e inspeccionamos cualquier habilidad que OpenSpace desarrolle durante el análisis posterior a la ejecución. También examinamos la estructura de la base de datos SQLite, mostramos los registros almacenados y verificamos que el registro de habilidades y las definiciones de tipos sean accesibles mediante programación.

if HAS_LLM_KEY: result_2 = asyncio.run(run_task( “Extienda la lógica de nómina: agregue un segundo CSV de tasas de retención de impuestos ” “por empleado y produzca salario neto. Reutilice cualquier habilidad de nómina anterior.” )) dump_db(runtime_db if os.path.exists(runtime_db) else alt_db, max_rows=12) else: print(“⏭️ Se omitió la demostración de repetición en caliente (sin clave).”) custom = pathlib.Path(SKILLS_DIR) / “colab-csv-report” custom.mkdir(parents=True, exist_ok=True) (custom / “SKILL.md”).write_text(textwrap.dedent(“””\ — nombre: colab-csv-report descripción: convierta cualquier CSV en un breve informe de rebajas con estadísticas resumidas, recuentos nulos, tipos d y 3 observaciones clave. Utilice pandas; nunca trace. — # colab-csv-report 1. Cargue el CSV con pandas (`on_bad_lines=”skip”` fallback). print(“✅ Habilidad personalizada escrita:”, personalizado / “SKILL.md”) para host_skill en [“delegate-task”, “skill-discovery”]: src = os.path.join(REPO_DIR, “openspace”, “host_skills”, host_skill) dst = os.path.join(SKILLS_DIR, host_skill) si os.path.isdir(src) y no os.path.isdir(dst):shutil.copytree(src, dst) print(“✅ Habilidades de host instaladas en el directorio del agente:”, ordenado(os.listdir(SKILLS_DIR))) if HAS_LLM_KEY: df_csv = “/content/demo.csv” pathlib.Path(df_csv).write_text( “nombre,depto,horas,tasa\nAda,Eng,45,90\nGrace,Eng,38,95\nAlan,Math,50,80\n”) asyncio.run(run_task( f”Utilizando la habilidad colab-csv-report, genere un informe de rebajas para {df_csv}”))

Enviamos una tarea de nómina relacionada para observar cómo OpenSpace reutiliza o deriva capacidades de habilidades generadas previamente. Creamos un SKILL.md personalizado que indica al agente que analice archivos CSV y produzca informes Markdown estructurados. Luego instalamos las habilidades de host de OpenSpace, generamos un conjunto de datos de demostración y ejecutamos la capacidad personalizada a través del mismo flujo de trabajo del agente en evolución.

mcp_proc = subproceso.Popen(
[“openspace-mcp”, “–transport”, “streamable-http”,
“–host”, “127.0.0.1”, “–port”, “8081”]stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True, env={**os.environ}, ) time.sleep(8) intente: import urllib.request req = urllib.request.Request(“http://127.0.0.1:8081/mcp”, método=”GET”) intente: urllib.request.urlopen(req, timeout=5) print(“✅ MCP streamable-HTTP endpoint está activo en http://127.0.0.1:8081/mcp”) excepto urllib.error.HTTPError como e: print(f”✅ Servidor MCP activo (HTTP {e.code} en GET simple, esperado para MCP)”) excepto excepción como e: print(“⚠️ Falló la sonda MCP:”, e) print(json.dumps({ “mcpServers”: { “openspace”: { “command”: “openspace-mcp”, “toolTimeout”: 600, “env”: { “OPENSPACE_HOST_SKILL_DIRS”: SKILLS_DIR, “OPENSPACE_WORKSPACE”: WORKSPACE, “OPENSPACE_API_KEY”: “sk-xxx (opcional, para nube)”, }, } } }, sangría=2)) mcp_proc.terminar()

Iniciamos el servidor OpenSpace MCP utilizando el transporte HTTP transmitible y lo vinculamos a un punto final local de Colab. Sondeamos el punto final para confirmar que el proceso del servidor se está ejecutando, incluso cuando una solicitud HTTP básica devuelve un estado de respuesta específico de MCP. También generamos una configuración de host MCP de ejemplo que los agentes externos pueden usar para acceder al espacio de trabajo y a los directorios de habilidades de OpenSpace.

si OPENSPACE_CLOUD_KEY: subproceso.run([“openspace-upload-skill”, str(custom)]check=False) print(“✅ Demostración de Cloud CLI ejecutada (carga).”) else: print(“ℹ️ Cloud omitida: configure OPENSPACE_CLOUD_KEY para habilitar ” “openspace-upload-skill / openspace-download-skill.”) showcase_db = os.path.join(REPO_DIR, “showcase”, “.openspace”, “openspace.db”) dump_db(showcase_db, max_rows=10) si os.path.exists(showcase_db): con = sqlite3.connect(showcase_db) cur = con.cursor() para t en [r[0] para r en cur.execute( “SELECCIONE el nombre DE sqlite_master DONDE tipo=”table””)]: cols = [c[1].lower() para c en cur.execute(f”PRAGMA table_info({t})”)]si “origen” en columnas: print(f”\n📊 Desglose del modo de evolución en la tabla ‘{t}’:”) para origen, n en cur.execute( f”SELECT origen, COUNT

DESDE {t} GRUPO POR origen ORDENAR POR 2 DESC”): print(f” {origen:>10}: {n}”) con.close() print(“”” ═════════════════════════════════ ═════════════════════════════════ 🎓 TUTORIAL COMPLETO: lo que ahora tiene: • OpenSpace instalado + configurado en Colab • Ejecución de tareas en vivo a través de la API de Python (si está configurada la clave) • Un SKILL.md personalizado que su agente descubre automáticamente • Habilidades de host (delegar-tarea, descubrimiento de habilidades) preparadas para cualquier agente compatible con SKILL.md (Claude Code / Codex / OpenClaw / nanobot) • Un servidor MCP que arrancó a través de HTTP con transmisión por secuencias • Linaje completo inspección de una base de datos de evolución de más de 60 habilidades A continuación: ejecute más tareas relacionadas y observe cómo disminuye el uso de tokens a medida que las habilidades se REPARAN, DERIVAN o CAPTURAN por sí mismas. Panel de control (necesita Nodo ≥ 20): openspace-dashboard –port 7788 + cd frontend && npm i && npm run dev. ═════════════════════════════════ ═════════════════════════════════ “””)

Subimos condicionalmente la habilidad personalizada a la comunidad de nube OpenSpace cuando hay disponible una clave API de nube válida. Inspeccionamos la base de datos SQLite del repositorio para estudiar las habilidades almacenadas, los metadatos, la información de calidad y el linaje de evolución completo. Finalmente agregamos habilidades por tipo de origen y resumimos el entorno Colab, la capacidad personalizada, la integración de MCP y el flujo de trabajo autoevolutivo que establecemos a lo largo del tutorial.

En conclusión, establecimos un entorno OpenSpace práctico que demuestra cómo se ejecutan, persisten, reutilizan y mejoran progresivamente las capacidades de los agentes. Trabajamos directamente con la API de Python, directorios de habilidades locales, registros respaldados por SQLite, transportes MCP y comandos opcionales para compartir habilidades en la nube, lo que nos brinda visibilidad tanto del flujo de trabajo de cara al usuario como de la arquitectura subyacente del motor de habilidades. También verificamos cómo las tareas relacionadas pueden reutilizar el conocimiento previamente evolucionado, cómo las habilidades personalizadas se pueden descubrir en tiempo de ejecución y cómo los registros de linaje exponen el historial de desarrollo de cada capacidad, lo que nos deja con una base sólida para construir sistemas de agentes rentables y autoevolutivos en Colab.

Consulte el código completo aquí. Además, no dude en seguirnos en Twitter y no olvide unirse a nuestro SubReddit de más de 150.000 ml y suscribirse a nuestro boletín. ¡Esperar! estas en telegrama? Ahora también puedes unirte a nosotros en Telegram.

¿Necesita asociarse con nosotros para promocionar su repositorio de GitHub O su página principal de Hugging O su lanzamiento de producto O seminario web, etc.? Conéctate con nosotros

A Sana Hassan, pasante de consultoría en Marktechpost y estudiante de doble titulación en IIT Madras, le apasiona aplicar la tecnología y la inteligencia artificial para abordar los desafíos del mundo real. Con un gran interés en resolver problemas prácticos, aporta una nueva perspectiva a la intersección de la IA y las soluciones de la vida real.