Saltar a contenido

Cookbook: curriculum offline con MockProvider

Ejemplo mínimo, 100% offline (sin red ni API keys), de la Fase 20: descomponer un objetivo en sub-tareas, persistir el curriculum versionado y consultarlo desde el registry.

Con la API de Python

from ciel import CurriculumRegistry, MockProvider, decompose_goal
from ciel.runtime.state_backend import SqliteStateBackend

goal = "leer el CSV de ventas, limpiar los datos y luego generar el informe"

# 1) Descomponer el goal en sub-tareas.
#    Sin provider: heurística determinista offline (split por cláusulas).
plan = decompose_goal(goal)
print(plan)
# ['leer el CSV de ventas, limpiar los datos', 'generar el informe']

#    Opcional: con un provider (MockProvider es determinista y offline);
#    si su respuesta no sirve, hace fallback a la heurística.
plan = decompose_goal(goal, provider=MockProvider(mode="fixed", response=""))

# 2) Persistir el curriculum versionado (multitenant).
backend = SqliteStateBackend(":memory:")   # o una ruta de fichero
registry = CurriculumRegistry(backend)
cur = registry.create(goal, plan, tenant_id="acme")
print(cur.version, cur.sha256[:12])        # 0.0.0 <hash>

# 3) Consultar el registry.
vigente = registry.get(goal, tenant_id="acme")
historial = registry.history(goal, tenant_id="acme")
arbol = registry.evolution_tree(goal, tenant_id="acme")
print(arbol["lineage"])                    # ['0.0.0']

# Un segundo create del mismo goal bumpea la versión (patch) y encadena linaje:
registry.create(goal, plan + ["publicar el informe"], tenant_id="acme")
print([c.version for c in registry.history(goal, tenant_id="acme")])
# ['0.0.0', '0.0.1']

Con el Agent

install_curriculum_support(Agent) engancha el soporte de curriculum de forma aditiva e idempotente (kwargs curriculum= / curriculum_config= y método run_curriculum):

import asyncio
from ciel import Agent, install_curriculum_support

install_curriculum_support(Agent)  # idempotente

agent = Agent(model="mock", curriculum=True)
resultado = asyncio.run(agent.run_curriculum(
    "leer datos y luego generar informe", tenant_id="acme"
))
print(resultado["succeeded"], resultado["curriculum"]["version"])

Con la CLI

ciel curriculum run --goal "leer datos y luego generar informe" --provider mock
ciel curriculum show --goal "leer datos y luego generar informe"
ciel curriculum history --goal "leer datos y luego generar informe"

Todo el flujo es offline-safe: --provider mock usa ciel.providers.MockProvider (determinista, sin red) y la persistencia usa el StateBackend (SQLite por defecto), con aislamiento estricto por tenant_id.